首页 > 解决方案 > 如何使变量对于不同的选项卡具有不同的值

问题描述

我正在尝试在状态行中显示 git 分支,并且我有以下代码:

function! GitBranch()
    let current_path = expand('%:p:h')
    let cd = "cd " . current_path
    let branch = system(cd . "&& git rev-parse --abbrev-ref HEAD 2>/dev/null | tr -d '\n'")
    return strlen(branch) > 0 ? '  '. branch . ' ' : ''
endfunction

" Customize status line
set statusline=
set statusline+=%#Normal#
set statusline+=%=
set statusline+=%#CursorColumn#
set statusline+=%{GitBranch()}
set statusline+=%#Normal#
set statusline+=\ 
set statusline+=\%y
set statusline+=\ %p%%
set statusline+=\ %l:%c
set statusline+=\

现在,每次我输入内容时它都会调用函数 GitBranch(),这使得它非常滞后。所以我决定将分支名称放在一个变量中,而不是每次都调用该函数。

let status_git = GitBranch()
...
...
set statusline+=%{status_git}

现在的问题是,如果我打开一个新选项卡,变量不会改变。所以所有选项卡都有相同的分支名称。有什么办法可以解决这个问题吗?

我知道有一些像 Vim-airline 这样的好插件可以完美地做到这一点。我只是想以我的方式做到这一点。

标签: vim

解决方案


您设置了status_git一次值,之后它就再也没有改变过。您需要为某些自动命令中的每个新选项卡重新计算它;BufReadPre, 我认为。

要为缓冲区设置局部变量,请使用 prefix b:

autocmd! BufReadPre let b:status_git = GitBranch()

推荐阅读