在我.vimrc
本人中,我尝试使用ftplugin
并且显然使用一些与此命令有关的命令,并假设它已成功加载。但是,我现在遇到了几台未安装插件的旧机器。我可以以某种方式使此插件的加载成为条件,并将add filetype on
和类似的指令加载到同一条件块中吗?
我已经看到了配色方案和Vim版本的条件,但是我还没有看到可以检查插件(或无法识别插件)的示例。
注意:请保持温柔,我是VimScript的初学者。
在我.vimrc
本人中,我尝试使用ftplugin
并且显然使用一些与此命令有关的命令,并假设它已成功加载。但是,我现在遇到了几台未安装插件的旧机器。我可以以某种方式使此插件的加载成为条件,并将add filetype on
和类似的指令加载到同一条件块中吗?
我已经看到了配色方案和Vim版本的条件,但是我还没有看到可以检查插件(或无法识别插件)的示例。
注意:请保持温柔,我是VimScript的初学者。
Answers:
您可以将该块包装在一个条件中,该条件使用该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文件本身中完成。
我的首选方法是检查插件文件是否存在。我觉得这更简单。
if !empty(glob("path/to/plugin.vim"))
echo "File exists."
endif
~/.vim
)回家?
if filereadable($HOME."/.vim/plugins.vim") source ${HOME}/.vim/plugins.vim endif
我想做到这一点,同时将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
airline_theme
似乎会引发很多错误……我不确定为什么。
还有一种替代方法是使用:silent! {cmd}
,当{cmd}
不存在该错误时可以抑制该错误。主要优点是它是一个简短的命令。这甚至可以在Vim 6中使用,非常适合可选的东西。
例如,使用Tim Pope的repeat.vim的插件会使用它来使映射可重复。
:silent!
,不是!silent
,它适用于所有包含的命令,除了何时:unsilent
在内部某处使用。(但这很少见。)
最初发布在另一个问题中:https : //stackoverflow.com/a/48178537/2843583
作为替代方案,您也可以使用regexp来确定当前的插件是否在您的插件中runtimepath
:
if &rtp =~ 'plugin-name'
...
endif
这样做的好处是,它可以与autoload
目录中仅包含vimscript代码的插件一起使用,而在最初解析.vimrc时,由于在函数调用时会加载自动加载片段,因此无法检测到插件。
~/.vimrc
,因此~/.vimrc
除非您测试插件文件的存在或将测试推迟到使用自动命令(例如, VimEnter。