1. ホーム
  2. vim

[解決済み] Vimはexceptを除くすべてのファイルタイプでautocmdを実行します。

2023-03-09 16:11:55

質問

Vim の autocmd で、書き込みの前にファイルの末尾の空白を削除するものがあります。私はこれをほぼ 100% 使用したいのですが、無効にしてほしいファイル タイプがいくつかあります。従来の常識では、自動実行させたいファイルの種類をカンマ区切りでリストアップします。

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

しかし、この場合、それは負担になります。

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

どのように解決するのですか?

*.rb はファイルタイプではありません。 ファイルパターンです。 ruby はファイルタイプであり、また .rb 拡張子を持たないファイルに設定することもできます。 したがって、最も必要なのは、autocmd が呼び出す関数で、処理されるべきではない filetypes をチェックし、空白を除去することです。

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

autocmd BufWritePre * call StripTrailingWhitespace()


evan の回答を基に、buffer-local 変数をチェックし、それを使用してストリップを行うかどうかを決定することができます。 これは、通常ストリップするファイル タイプのバッファをストリップしたくないと判断した場合に、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