web-dev-qa-db-ja.com

すべての空白を無視するようにvimdiffを構成する方法はありますか?

それらの違いを確認するためにvim -d file1 file2を使用しています。これは問題なく機能しますが、空白の変更は無視したいのですが、それらはソースコードファイルには無関係です。

Vimのヘルプでは、次のコマンドが魔法のようになると述べています。

set diffopt+=iwhite

しかし、残念ながら、このコマンドは-bをdiffツールのコマンドラインに追加するだけで、末尾の空白のみを無視します。空白の変更をすべて無視するには、diffの正しいコマンドラインキーを-wにする必要があります。しかし、Vimから直接diffコマンドラインを変更する方法を見つけることができません。もちろん、カスタムのdiffをコンパイルしたり、diffをdiff.shに置き換えたりすることもできますが、見た目は醜い:(。

ファイルの違いを表示するためにVimがdiffツールと対話する方法を変更するより良い方法はありますか?

63
grigoryvp

はい。 iwhiteオプションを設定したように設定しますが、さらにdiffexprを空にします。

vim docs の関連セクションから:

iwhite

空白の量の変化を無視します。 「diffexpr」が空の場合、「-b」フラグを「diff」コマンドに追加します。これが正確に行うことについては、「diff」コマンドのドキュメントを確認してください。後続の空白の追加は無視しますが、先頭の空白は無視しません。

diffexprを設定することにより、カスタムのdiffコマンドラインを提供できることにも注意してください。特に vimdiffのmanページ に関する説明を参照してください。

'diffexpr'オプションを設定して、標準の「diff」プログラム以外のものを使用して2つのファイルを比較し、違いを見つけることができます。

'diffexpr'が空の場合、Vimは次のコマンドを使用してfile1とfile2の違いを見つけます。

diff file1 file2 > outfile
28
ire_and_curses

これはあなたが望むものを実装します(-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

37
Adam Katz

ありがとうire、それは私を助けました。これで、〜/ .vimrcにこれ(Adam Kによって提案されたものよりも簡単)のみが必要になります。

set diffopt+=iwhite

set diffexpr=""

そして、それはそれを行います...それは私が知っている最も強力なdiffツールであり、他のどのツールよりもはるかに優れています。

17
greg

Adam Katzのソリューションのコメントで持ち上がった問題への対処:

Vimのバージョンとユーザーの設定に応じて、silentコマンドは、画面が発行された後に画面を再描画することを無視できます。また、この問題が発生しました。この問題は、推奨されるdiffexprを使用した後に:diffoを実行するたびに発生しました。私の解決策は、サイレント実行コマンドを次のように変更することでした。

silent execute "!diff -a --binary " . opt .
 \ v:fname_in . " " . v:fname_new .  " > " . v:fname_out | redraw!

これにより、コマンドの発行後に強制的に再描画されます。

0
Brian Pollack