それらの違いを確認するためにvim -d file1 file2
を使用しています。これは問題なく機能しますが、空白の変更は無視したいのですが、それらはソースコードファイルには無関係です。
Vimのヘルプでは、次のコマンドが魔法のようになると述べています。
set diffopt+=iwhite
しかし、残念ながら、このコマンドは-b
をdiffツールのコマンドラインに追加するだけで、末尾の空白のみを無視します。空白の変更をすべて無視するには、diffの正しいコマンドラインキーを-w
にする必要があります。しかし、Vimから直接diffコマンドラインを変更する方法を見つけることができません。もちろん、カスタムのdiffをコンパイルしたり、diffをdiff.shに置き換えたりすることもできますが、見た目は醜い:(。
ファイルの違いを表示するためにVimがdiffツールと対話する方法を変更するより良い方法はありますか?
はい。 iwhite
オプションを設定したように設定しますが、さらにdiffexpr
を空にします。
vim docs の関連セクションから:
iwhite
空白の量の変化を無視します。 「diffexpr」が空の場合、「-b」フラグを「diff」コマンドに追加します。これが正確に行うことについては、「diff」コマンドのドキュメントを確認してください。後続の空白の追加は無視しますが、先頭の空白は無視しません。
diffexpr
を設定することにより、カスタムのdiffコマンドラインを提供できることにも注意してください。特に vimdiffのmanページ に関する説明を参照してください。
'diffexpr'オプションを設定して、標準の「diff」プログラム以外のものを使用して2つのファイルを比較し、違いを見つけることができます。
'diffexpr'が空の場合、Vimは次のコマンドを使用してfile1とfile2の違いを見つけます。
diff file1 file2 > outfile
これはあなたが望むものを実装します(-b
を-w
に変更して diffexpr
docs から取得):
set diffopt+=iwhite
set diffexpr=DiffW()
function DiffW()
let opt = ""
if &diffopt =~ "icase"
let opt = opt . "-i "
endif
if &diffopt =~ "iwhite"
let opt = opt . "-w " " swapped vim's -b with -w
endif
silent execute "!diff -a --binary " . opt .
\ v:fname_in . " " . v:fname_new . " > " . v:fname_out
endfunction
...私はまだ、どの行がどのマップにマップされるかについて、より良いdiffexprヘルパーを探しています( GNU diff は、-w
の代わりに-b
を使用しても、余分な空白と小さな編集を組み合わせることによってかなり困惑していますコメント行のように)。多分 diffchar ?
ありがとうire、それは私を助けました。これで、〜/ .vimrcにこれ(Adam Kによって提案されたものよりも簡単)のみが必要になります。
set diffopt+=iwhite
set diffexpr=""
そして、それはそれを行います...それは私が知っている最も強力なdiffツールであり、他のどのツールよりもはるかに優れています。
Adam Katzのソリューションのコメントで持ち上がった問題への対処:
Vimのバージョンとユーザーの設定に応じて、silent
コマンドは、画面が発行された後に画面を再描画することを無視できます。また、この問題が発生しました。この問題は、推奨されるdiffexpr
を使用した後に:diffo
を実行するたびに発生しました。私の解決策は、サイレント実行コマンドを次のように変更することでした。
silent execute "!diff -a --binary " . opt .
\ v:fname_in . " " . v:fname_new . " > " . v:fname_out | redraw!
これにより、コマンドの発行後に強制的に再描画されます。