web-dev-qa-db-ja.com

Vimは除くすべてのファイルタイプでautocmdを実行します

書き込み前にファイルの末尾の空白を削除するVim autocmdがあります。これをほぼ100%の時間で使用したいのですが、無効にしたいファイルタイプがいくつかあります。従来の知識では、autocmdを実行するファイルタイプをコンマ区切りのリストにリストします。例:

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

しかし、この場合は面倒です。

Autocmdパターンを、パターンに一致するファイル以外のすべてのファイルに一致させる方法はありますか?ドキュメントでNOTマッチャーに相当するものを見つけることができません。

73
jerodsanto

*.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
57
jamessan

1行の方法の別の選択肢:

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

次に、ブラックリストにあるものを除いて、すべてのファイルタイプに対して好きなことを実行できます。

51
wedgwood

最も簡単な方法は、1つのファイルタイプのローカル変数をtrueに設定することです。次に、その変数がfalse(他のすべてに設定されている場合)または変数が存在する場合(事前設定する必要がない場合)、automcommandを設定します。

autocmd BufWritePre *.foo let b:foo=true

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

コメントに基づいて変数の接頭辞を変更

12
evan

これはSyntax自動コマンドで機能し、パターン(<match>)は単なるファイルタイプです。 rstファイルは除外されます。

au Syntax *\(^rst\)\@<! …
0
blueyed