我在许多机器上使用相同的vimrc,其中一些机器安装了fugitive.vim,而其中一些机器没有。我喜欢在我的状态行中包含fugitive#statusline()
,但是在没有安装插件的计算机上,这会引发错误。
在调用set statusline
之前,有没有办法检查此函数是否存在?我已尝试使用exists
y,但由于某种原因它不起作用(加载顺序?)
if exists("*fugitive#statusline")
set statusline=%<\ %f\ %{fugitive#statusline()} ... (other stuff)
endif
我也尝试通过在命令前添加silent!
来解决错误,但这似乎也不起作用。
答案 0 :(得分:10)
这是一条捷径:
set statusline+=%{exists('g:loaded_fugitive')?fugitive#statusline():''}
答案 1 :(得分:8)
由于逃犯没有在fugitive#statusline
目录中定义autoload
,因此使用silent! call
/ exists
技术(谢谢@Christopher)可能无法嗅探。但是有一些替代方案:
'statusline'
选项中添加三元分支,如@tungd建议。'statusline'
文件中设置after/plugin
。这解决了问题,但意味着您的状态行定义在一个相当不太可能的地方,因此最好在~/.vimrc
文件中添加一个好的评论。~/.vimrc
文件中定义该功能。示例:
if !exists('*fugitive#statusline')
function! fugitive#statusline()
return ''
endfunction
endif
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的存在不起作用,这可能不会那么有效!