2011-06-27 10 views
59

私はVimのautocmdを使用して、書き込む前にファイル内の末尾の空白を削除しています。私はこれをほぼ100%の時間にしたいのですが、無効にしたいファイルタイプがいくつかあります。従来の知恵は、あなたがautocmdは、カンマで区切ったリストでに対して実行したいファイルタイプ、例えばを一覧表示することです: Vimはすべてのファイルタイプに対してautocmdを実行します。EXCEPT

autocmd BufWritePre *.rb, *.js, *.pl 

しかし、面倒になり、この場合

パターンに一致するものを除いて、すべてのファイルに対してautocmdパターンを一致させる方法はありますか?私はドキュメントでNOT matcherと同等のものを見つけることができません。

答えて

44

*.rbはファイルタイプではありません。それはファイルパターンです。 rubyはファイルタイプで、.rb拡張子のないファイルでも設定できます。だから、あなたが最も必要とするのは、あなたのautocmdが呼び出す関数があります。この関数は、実行すべきでないファイルタイプをチェックし、空白を取り除きます。エヴァンの答えに

fun! StripTrailingWhitespace() 
    " Don't strip on these filetypes 
    if &ft =~ 'ruby\|javascript\|perl' 
     return 
    endif 
    %s/\s\+$//e 
endfun 

autocmd BufWritePre * call StripTrailingWhitespace() 

ビル、あなたはバッファローカル変数をチェックし、それを使用してストリップを行うかどうかを決定することができます。また、通常は削除するファイルタイプのバッファを削除したくないと判断した場合は、これを使用して一度無効にすることもできます。

fun! StripTrailingWhitespace() 
    " Only strip if the b:noStripeWhitespace variable isn't set 
    if exists('b:noStripWhitespace') 
     return 
    endif 
    %s/\s\+$//e 
endfun 

autocmd BufWritePre * call StripTrailingWhitespace() 
autocmd FileType ruby,javascript,perl let b:noStripWhitespace=1 
+1

私は、特定のファイル拡張子を除外し、私の記述の中で間違いなく誤ったパターンを期待していました。私が1ライナーを望んでいる間、ロジックを関数にラップし、それを呼び出すことはあまりにも控え目ではありません。ありがとう! – jerodsanto

10

最も簡単な方法は、1つのファイルタイプのローカル変数をtrueに設定することです。次に、その変数が偽(それ以外に設定されている場合)か、まったく存在する場合(その変数を事前に設定する必要はありません)、automcommandを設定します。そして、あなたはブラックリストにあるものを除くすべてのファイルタイプのためにあなたが好きな何かを行うことができます

let blacklist = ['rb', 'js', 'pl'] 
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like 

autocmd BufWritePre *.foo let b:foo=true 

if !exists("b:foo") 
    autocmd ... 
endif 

コメント

40

に基づいて1つのラインの方法のもう一つの選択肢を変数の接頭辞を変更しました。

関連する問題