我如何测试插件并仅当它们存在于 .vimrc 中时才包含它们?

我如何测试插件并仅当它们存在于 .vimrc 中时才包含它们?

在我的系统中,.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/目录中。这是我想到的解决方案:

  1. 通过检查每个插件提供的任何单个命令来检查其是否exists()存在,如果存在则设置其选项。(这就像在接受的答案中一样。)

  2. 将以上述方式设置的所有选项放入一个函数中(SetPluginOptionsNow()在我的代码中调用)。

  3. 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 时无法检测到。

相关内容