【问题标题】:Vim: Show current git branch in lightline status line without fugitiveVim:在lightline状态行中显示当前git分支而没有逃犯
【发布时间】:2014-07-24 18:22:34
【问题描述】:

我正在使用lightline.vim,我想显示当前的 git 分支。目前,我正在使用vim-fugitive 这样做,但是,我根本不使用这个插件,除了在状态行中显示 git 分支。

我的问题是:

有没有办法在状态行显示git分支而不使用fugitive?

我尝试创建一个连接到 lightline 的自定义函数。该函数使用system vimscript 函数获取当前的 git 分支。它(没有)工作得很好,除了状态行在每次击键时都会刷新,这会破坏其他所有内容并使 vim 无法使用。从本质上讲,每次击键时都会使用 system 函数获取 git 分支...

所以这不是一个可行的解决方案。我“可以”做的是创建一个全局变量,说明是否获取了 git 分支,并防止自定义函数在已获取分支名称时再次获取它。然后,每次 MacVim 失去焦点时,我都可以再次获取分支名称(不知道如何使用终端 vim 来做到这一点)。但这并不理想……

请问有什么办法可以解决这个问题吗?

【问题讨论】:

  • 电力线还是灯光线?

标签: git vim vim-fugitive


【解决方案1】:

我创建了一个插件,专注于你想要的功能。

https://github.com/itchyny/vim-gitbranch

可以通过gitbranch#name()函数获取分支名称。

代码很小,一分钟就能看完。

【讨论】:

  • 哇哦!看起来棒极了!我要去看看!谢谢!
  • 刚刚用过这个!与 vim-airline 一起工作得很好!
  • @aashah7,你能说明一下你是如何使用 vim-airline 的吗?
【解决方案2】:

是的,使用全局变量是可行的方法。

不明显的部分是如何/何时更新该变量的值。 autocmd 似乎是最明显的选择,但与什么事件有关? BufEnter 似乎是一个好的开始。

现在,既然你不用逃犯,那你怎么切换分支呢?在 Vim 之外?在 Vim 的命令行上?

如果您在 Vim 的命令行 :!git checkout foo 上执行此操作,您可以编写一个以分支名称作为参数的命令来执行正确的 shell 命令更改 g:git_branch 的值一口气,甚至不用autocmd

如果你是在 Vim 之外进行的(<C-z>:sh、另一个终端窗口或 tmux 窗格、GUI 应用程序……)你需要找到一种可靠的方法来通知 Vim 这个变化或 将您的 system() 呼叫与 autocmd 一起使用。

【讨论】:

  • 我只在 vim 之外使用 git(从命令行)。正如我的问题中所述,我已经考虑了 autocmd + system() 解决方案。但我想知道是否有更“自动化”的解决方案。如,当我更改 git 分支时,它会自动更新 lightline。使用逃犯,这就是正在发生的事情。我查看了逃犯的源代码,但我很难理解这个功能是如何实现的......
  • Fugitive 不更新 lightline:fugitive 公开了一个检索和缓存分支名称的函数,然后该函数在 lightline 中使用。你可以看到它是如何完成的in lightline's doc。解析system('git branch') 的输出以更新全局(或更好的缓冲区局部)变量 最实用的解决方案。在这里找到更新该变量的正确方法很重要。一个简单的 autocmd 听起来不错。
  • 很公平,你说服了我。我将实施这个解决方案并随着时间的推移对其进行改进。谢谢你的回答。
【解决方案3】:

将后面的代码写入.vimrc。

    let gitBranch=system("git rev-parse --abbrev-ref HEAD")
    set laststatus=2
    set statusline=%F%m%r%h%w\ [POS=%04l,%04v]\ [%p%%]\ [LEN=%L]
    execute "set statusline +=" . gitBranch

【讨论】:

    猜你喜欢
    • 2016-08-25
    • 1970-01-01
    • 2016-12-31
    • 2010-11-27
    • 2012-10-29
    • 2023-02-08
    • 2014-06-09
    • 2021-11-04
    相关资源
    最近更新 更多