書き込み前にファイルの末尾の空白を削除するVim autocmdがあります。これをほぼ100%の時間で使用したいのですが、無効にしたいファイルタイプがいくつかあります。従来の知識では、autocmdを実行するファイルタイプをコンマ区切りのリストにリストします。例:
autocmd BufWritePre *.rb, *.js, *.pl
しかし、この場合は面倒です。
Autocmdパターンを、パターンに一致するファイル以外のすべてのファイルに一致させる方法はありますか?ドキュメントでNOTマッチャーに相当するものを見つけることができません。
*.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()
Evanの答えに基づいて、バッファーローカル変数を確認し、それを使用してストリップを実行するかどうかを決定できます。これにより、通常は削除するファイルタイプであるバッファを削除したくない場合は、1回限りの無効化を実行できます。
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行の方法の別の選択肢:
let blacklist = ['rb', 'js', 'pl']
autocmd BufWritePre * if index(blacklist, &ft) < 0 | do somthing you like
次に、ブラックリストにあるものを除いて、すべてのファイルタイプに対して好きなことを実行できます。
最も簡単な方法は、1つのファイルタイプのローカル変数をtrueに設定することです。次に、その変数がfalse(他のすべてに設定されている場合)または変数が存在する場合(事前設定する必要がない場合)、automcommandを設定します。
autocmd BufWritePre *.foo let b:foo=true
if !exists("b:foo")
autocmd ...
endif
コメントに基づいて変数の接頭辞を変更
これはSyntax
自動コマンドで機能し、パターン(<match>
)は単なるファイルタイプです。 rst
ファイルは除外されます。
au Syntax *\(^rst\)\@<! …