Vim:在vimrc中有条件地使用逃犯#statusline函数

时间:2011-05-12 20:14:11

标签: git vim

我在许多机器上使用相同的vimrc,其中一些机器安装了fugitive.vim,而其中一些机器没有。我喜欢在我的状态行中包含fugitive#statusline(),但是在没有安装插件的计算机上,这会引发错误。

在调用set statusline之前,有没有办法检查此函数是否存在?我已尝试使用exists y,但由于某种原因它不起作用(加载顺序?)

if exists("*fugitive#statusline")
  set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff)
endif

我也尝试通过在命令前添加silent!来解决错误,但这似乎也不起作用。

4 个答案:

答案 0 :(得分:10)

这是一条捷径:

set statusline+=%{exists('g:loaded_fugitive')?fugitive#statusline():''}

答案 1 :(得分:8)

由于逃犯没有在fugitive#statusline目录中定义autoload,因此使用silent! call / exists技术(谢谢@Christopher)可能无法嗅探。但是有一些替代方案:

  • 'statusline'选项中添加三元分支,如@tungd建议。
  • 在@Christopher建议的'statusline'文件中设置after/plugin。这解决了问题,但意味着您的状态行定义在一个相当不太可能的地方,因此最好在~/.vimrc文件中添加一个好的评论。
  • 只需在~/.vimrc文件中定义该功能。

示例:

if !exists('*fugitive#statusline')
  function! fugitive#statusline()
      return ''
  endfunction
endif
  • 另一种选择是使用Fugitive定义的Fugitive autocmd事件。请注意,这只会在Fugitive检测到git目录时触发。

~/.vimrc文件中添加以下内容:

augroup fugitive_status
  autocmd!
  autocmd user Fugitive set statusline=%<\ %f\ %{fugitive#statusline()} ...
augroup END

我个人认为@tungd解决方案是最简单的。然而,定义一个虚拟函数将是我的下一个选择。如果安装了Fugitive,则Fugitive将覆盖它。最好的部分是保持您的'statusline'选项整洁干净。

答案 2 :(得分:4)

我想我已经弄清楚如何实现这一目标。在加载插件之后,需要检查是否存在fugitive#statusline() 。在此之前,不会加载任何与逃犯相关的变量或函数。

$VIMRUNTIME/after/plugin路径中添加此代码文件:

" $VIMRUNTIME/after/plugin/fugitive-statusline.vim
if has("statusline") && exists('*fugitive#statusline')
    " git fugitive statusline
    set statusline=%<%f\ %h%m%r%{fugitive#statusline()}%=%-14.(%l,%c%V%)\ %P

    " show statusline always
    set laststatus=2

    " turn off ruler
    set noruler
endif

答案 3 :(得分:1)

你可以尝试检查逃犯插件的加载变量吗?

if exists('g:loaded_fugitive')
   set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff)
endif

虽然如果逃犯#stileline的存在不起作用,这可能不会那么有效!