在我的系统中,.vimrc
我尝试使用ftplugin
一些与此相关的命令,并且显然是在假设它已成功加载的情况下使用。但是,我现在遇到了一些没有安装该插件的旧机器。我能否以某种方式使此插件的加载有条件,并将filetype on
类似的指令添加到同一个条件块中?
我已经看到过针对配色方案和 Vim 版本的条件,但我还没有看到检查插件的示例(或者没有识别它)。
注意:请温柔一点,我是 VimScript 初学者。
答案1
您可以将该块包装在条件中,该条件使用exists()
函数来检查 vim 是否知道插件定义的变量、命令或函数。
以下是 ~/.vim 下的文件中的几个部分:
" after/plugin/speeddating.vim
if exists(':SpeedDatingFormat')
SpeedDatingFormat %-d %B %Y
endif
" ftplugin/ruby.vim
if exists('g:loaded_surround') && !exists('b:surround_'.char2nr(':'))
let b:surround_{char2nr(':')} = ":\r"
endif
请注意,上述位位于在正常插件之后评估的文件中,这里是 ftplugin 和目录中的文件after/plugin
。
另一个选择是使用 try/catch 块,尽管这至少需要 vim 7.0:
if v:version >= 700
try
runtime bundle/pathogen/autoload/pathogen.vim
call pathogen#infect()
catch
endtry
endif
一旦try
该块的某个部分出现故障,它将跳转到该
catch
部分。由于该catch
部分为空,它将继续执行endtry
语句之后的初始化文件的其余部分。
由于这是手动加载代码而不是依赖于已经加载的插件,因此可以在 .vimrc 文件本身中完成。
答案2
我更喜欢的方法是检查插件文件是否存在。我觉得这个更简单。
if !empty(glob("path/to/plugin.vim"))
echo "File exists."
endif
答案3
我希望实现这一点,同时将我的 Vim 配置放在一起.vimrc
,而不是放在一堆after/
目录中。这是我想到的解决方案:
通过检查每个插件提供的任何单个命令来检查其是否
exists()
存在,如果存在则设置其选项。(这就像在接受的答案中一样。)将以上述方式设置的所有选项放入一个函数中(
SetPluginOptionsNow()
在我的代码中调用)。VimEnter
在进入新的 Vim 会话时触发的事件上调用此函数- 但至关重要的是,后插件已全部加载。因此,我们的exists()
检查可以毫无问题地检查插件功能。
这是我的那部分的一个样本.vimrc
。
""" PLUGIN-SPECIFIC OPTIONS
" These are "supposed to be" set in after/plugin directory, but then
" cross-platform synchronization would get even messier. So, au VimEnter it is.
function! SetPluginOptionsNow()
" NERDTree Options
if exists(":NERDTree")
map <F10> :NERDTreeToggle<CR>
endif
" Syntastic Options
if exists(":SyntasticCheck")
let g:syntastic_stl_format = '[Syntax: line:%F (%e+%w)]'
set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*
" and so on...
endfunction
au VimEnter * call SetPluginOptionsNow()
""" END OF PLUGIN-SPECIFIC OPTIONS
答案4
最初在另一个问题中发布:https://stackoverflow.com/a/48178537/2843583
作为替代方案,您也可以使用正则表达式来决定手头的插件是否在您的runtimepath
:
if &rtp =~ 'plugin-name'
...
endif
这样做的好处是,它可以与目录中仅有 vimscript 代码的插件一起使用autoload
,而由于自动加载片段是在函数调用时加载的,因此在最初解析 .vimrc 时无法检测到。