91

書き込み前にファイルの末尾の空白を削除する Vim autocmd があります。ほぼ 100% の確率でこれが必要ですが、無効にしたいファイルタイプがいくつかあります。従来の知恵は、autocmd を実行するファイルタイプをカンマ区切りのリストにリストすることです。たとえば、次のようになります。

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

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

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

4

6 に答える 6

70

*.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
于 2011-06-27T18:04:30.240 に答える
64

1行の方法の別の選択:

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

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

于 2012-05-02T08:58:30.037 に答える
17

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

autocmd BufWritePre *.foo let b:foo=true

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

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

于 2011-06-27T18:13:14.593 に答える
1

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

au Syntax *\(^rst\)\@<! …
于 2020-03-07T12:28:06.217 に答える