2011-05-12 284 views
6

我在许多机器上使用相同的vimrc,其中一些机器安装了fugitive.vim,其中一些机器没有。我喜欢在我的状态栏中包含fugitive#statusline(),但在没有安装插件的机器上会产生错误。Vim:有条件地在vimrc中使用fugitive#statusline函数

在调用set statusline之前有没有办法检查这个函数的存在?我已经使用existsŸ试过了,但它并没有出于某种原因(加载顺序?)

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

我也试过的前缀来silent!命令沉默的错误,但不是似乎不工作。

回答

1

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

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

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

+0

这是行不通的。我尝试过了,但是执行'vimrc'时变量'g:loaded_fugitive'不是空的就是不存在。 – Christopher 2013-12-05 04:24:26

9

这一次将是一条捷径:

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

这不起作用。我尝试过了,但是执行'vimrc'时变量'g:loaded_fugitive'不是空的就是不存在。 – Christopher 2013-12-05 04:24:58

+0

@Christopher:请检查您的'VIM-fugitive'安装,因为'G:loaded_fugitive'在'fugitive.vim'定义,这种插值完成时状态行评估,而不仅仅是时间'vimrc'是执行。 – tungd 2013-12-05 09:52:23

+0

@tungd没有理由'G:loaded_fugitive'加载* *前的vimrc除非你使用一些手段手动触发加载。 – ZyX 2013-12-05 19:12:39

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 
+0

做解释。自动加载/自动加载的文件只有一种情况:有人尝试使用未定义的函数或变量。当我们强制加载时,可能触发自动加载的函数和变量被定义,从而有效地清除了第二次自动加载文件的原因。它不是在vimrc之后找到的插件目录,无论它的文件是否已经被找到或者其他目录如何。 – ZyX 2013-12-05 19:24:02

+0

F * cking fugitive插件在'plugin/fugitive.vim'中定义了这个函数,而不是在'autoload/fugitive.vim'中它应该被定位的位置(基于函数名),这意味着我的解决方案不工作* *(它仍然不会触发无序运行:它根本不会触发任何运行),Peter Rincker也不会。如果函数是在'autoload /'中定义的,那么以前的评论适用,并且@Peter Rincker答案变好。加载'autoload/fugitive.vim'仍然没有办法引起任何麻烦,但它根本不存在。 – ZyX 2013-12-05 19:24:56

+0

^^^复制我的两个意见,我的回答(它已被删除),因为我不知道你是否能看到评论被删除的答案。要跟随对话:“我们是否真的应该颠覆处理顺序,但运行autoload/fugitive.vim失序。这可能会产生意想不到的后果。 - 克里斯托弗“是我评论第一个回复的评论。我的答案是用':runtime'加载'autoload/fugitive.vim',然后检查函数是否存在。 – ZyX 2013-12-05 19:25:49

6

作为逃犯在autoload目录没有定义fugitive#statusline这黯然不能嗅使用silent! call/exists技术(谢谢@Christopher)。然而有一些替代方案:

  • 将三元分公司在'statusline'选项,@tungd建议。
  • 设置'statusline'after/plugin文件像@Christopher建议。这解决了这个问题,但意味着你的状态行是在一个不太可能的地方定义的,所以最好在你的~/.vimrc文件中写一个好评。
  • 只需在~/.vimrc文件中定义该功能即可。

实施例:

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

把下面的内容你~/.vimrc文件:

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

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

+0

虚拟函数应该包含'return'''我相信。否则,它返回将显示的数字“0”。 – ZyX 2013-12-09 15:45:10

+0

@ZyX谢谢你,赶上。我添加了'return''。 – 2013-12-09 16:21:27