如何使变量对于不同的选项卡具有不同的值

时间:2018-05-10 19:06:00

标签: vim

我试图在状态行中显示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这样的好插件可以做到这一点。我只想以我的方式做到这一点。

1 个答案:

答案 0 :(得分:2)

您设置status_git一次的值,之后永远不会更改。您需要为某个自动命令中的每个新选项卡重新计算它;我认为BufReadPre

为缓冲区设置变量local使用前缀b:

autocmd! BufReadPre let b:status_git = GitBranch()