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


14

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

カラースキームとVimバージョンの条件があるのを見ましたが、プラグインをチェックする(または認識しなかった)例は見ていません。

NB:優しくしてください、私はVimScriptの初心者です。


1
プラグインはの後にロードされる~/.vimrcので~/.vimrc、プラグインファイルの存在をテストするか、次のようなオートコマンドでプラグインがロードされるまでテストを延期しない限り、プラグインの効果をテストすることはできません。VimEnter。
ゲイリージョン

@garyjohn:ああ、それは面白い。これは、既存の答えと矛盾するためです。答えとして書いていただけますか?
0xC0000022L

答えを編集して、その問題にいくらか対処しました。
qqx

私のコメントはqqxの答えと矛盾しませんでした。それは、qqxの答えを注意深く読んでいないか、そこから誤った推論をしなかった場合に見逃された可能性のあるポイントに注意を引くことを意味しました。答えはそもそも良いものでしたが、今ではさらに明確になっています。
ゲイリージョン

回答:


19

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ファイル自体で実行できます。


tryコンストラクトのバージョン要件を追加できますか?古いVimはこれを理解しますか?すなわち、いつ導入されたか。おかげで、今のところ+1。
0xC0000022L

1
必要なバージョンに関する情報を追加しました。
qqx

バージョンチェックラッピングを使用した最後のソリューションtryは機能するはずです。どうもありがとう。別の答えがまだ届くかどうか見てみましょう。それ以外の場合はもちろんあなたを受け入れます。
0xC0000022L

ああ、もちろんこれは6.xバージョンでプラグインを無効にします。うーん...より良いものを見つける必要がありますが、これは当面動作します。ありがとう。
0xC0000022L

さらに別の選択肢は:silent! {cmd}、を使用{cmd}することです。これは、存在しない場合にエラーを抑制します。Vimの6のこれさえ作品
インゴKarkat

7

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

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

4

Vimの設定.vimrcafter/ディレクトリの束ではなく内にまとめながら、これを達成したかったのです。これは私が思いついた解決策です:

  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

この答えは、vim-airlineではうまくいきません。特に、VimEnterイベントが次のようなことを指定するのを待つと、大量airline_themeのエラーが発生するようです...理由はよくわかりません。
-StevieP

3

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

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


!silent runtime ftplugin/man.vim | filetype on | filetype plugin on | filetype indent on次のコマンドに続くすべてのコマンドをシャットダウンするための作業のようなものですか、!silentそれは常に次のコマンドに固有のものですか?
0xC0000022L

これは:silent!でなく!silent:unsilent内部のどこかで使用される場合を除き、含まれるすべてのコマンドに適用されます。(しかしそれはまれです。)
インゴカルカット

おっと、コメントで今修正するのは難しい。しかし、わかった。ありがとう。
0xC0000022L

1

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.