web-dev-qa-db-ja.com

プラグインをテストして、.vimrcに存在する場合にのみプラグインを含めるにはどうすればよいですか?

私の.vimrcではftpluginを使おうとしていますが、正常に読み込まれたことを前提として、それに関連するいくつかのコマンドを使用しています。ただし、プラグインがインストールされていない古いマシンがいくつか見つかりました。どういうわけか、このプラグインのロードを条件付きにして、filetype onと同様のディレクティブを同じ条件付きブロックに追加できますか?

配色とVimバージョンには条件があるのを見てきましたが、プラグインをチェックする(または認識しなかった)例を見たことがありません。

注意:私はVimScriptの初心者です。

14
0xC0000022L

そのブロックを、プラグインによって定義された変数、コマンド、または関数がvimに認識されているかどうかを確認するために、exists()関数を使用する条件でラップできます。

〜/ .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ディレクトリ内のファイルの後に評価されるファイルにあることに注意してください。

もう1つのオプションは、try/catchブロックを使用することですが、これには少なくともvim7.0が必要です。

if v:version >= 700
    try
        runtime bundle/pathogen/autoload/pathogen.vim
        call pathogen#infect()
    catch
    endtry
endif

そのブロックのtryセクションで何かが失敗すると、それはcatchセクションにスキップします。 catchセクションは空であるため、endtryステートメントの後の初期化ファイルの残りの部分に進みます。

これは、すでにロードされているプラ​​グインに依存するのではなく、手動でコードをロードするため、.vimrcファイル自体で実行できます。

20
qqx

私の好みの方法は、プラグインファイルの存在を確認することです。これはもっと簡単だと思います。

if !empty(glob("path/to/plugin.vim"))
   echo "File exists."
endif
8
user3751385

_.vimrc_ディレクトリの束ではなく、_after/_内でVim構成をまとめながらこれを実現したかったのです。これは私が思いついた解決策です:

  1. exists()で提供される単一のコマンドをチェックすることによって各プラグインの存在をチェックし、存在する場合はそのオプションを設定します。 (これは、受け入れられた回答と同じです。)

  2. 上記の方法で設定されたすべてのオプションを関数内に配置します(コードではSetPluginOptionsNow()と呼ばれます)。

  3. 新しいVimセッションに入るときにトリガーされるVimEnterイベントでこの関数を呼び出しますが、重要なのはafterプラグインがすべて読み込まれたことです。このため、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
_

さらに別の方法は、:silent! {cmd}を使用することです。これは、{cmd}が存在しない場合のエラーを抑制します。主な利点は、それが短い単一のコマンドであることです。これはVim 6でも機能し、オプションのものに最適です。

たとえば、Tim Popeの repeat.vim を使用してマッピングを繰り返し可能にするプラグインで使用されます。

3
Ingo Karkat

最初に別の質問で投稿されました: https://stackoverflow.com/a/48178537/284358

別の方法として、正規表現を使用して、手元のプラグインがruntimepathにあるかどうかを判断することもできます。

if &rtp =~ 'plugin-name'
    ...
endif

これには、autoloadディレクトリにvimscriptコードのみがあるプラグインで機能するという利点があります。これは、関数の実行時にオートロードスニペットがロードされるため、.vimrcが最初に解析されるときに検出されません。コール。

2
bergercookie