2009-08-12 40 views
54

私はvim -d file1 file2の違いを見るために使用しています。これは正常に動作しますが、空白の変更を無視したい - ソースコードファイルとは無関係です。すべての空白を無視するようにvimdiffを設定する方法はありますか?

Vimのヘルプは、次のコマンドは魔法を行いますと述べている:

set diffopt+=iwhite 

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

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

答えて

23

はいvim docsの関連セクションから、あなたがやったとしてiwhiteオプションを設定しますが、さらに、diffexprを空にし

:。。

iwhite

空白の量の変更を無視します。 'diffexpr'が空の場合、 "diff"コマンドに "-b"フラグを追加します。 "diff"コマンドの ドキュメントで、これが何のために を正確にチェックしてください。末尾に白い空白がなく、末尾に の空白を追加することは無視する必要があります。

diffexprを設定してカスタムの差分コマンドラインを指定することもできます。特に、vimdiff man page上の議論を参照してください。

「diffexpr」オプションは、2つのファイルを比較し、違いを見つけるために、標準 「差分」プログラム以外の何かを使用するように設定することができます。 'diffexpr' が空ならば、Vimは違い file1とfile2の間を見つけるために、このコマンドを使用しています

diff file1 file2 > outfile 
+7

これはすべての空白(diffでは-w)を無視しませんが、空白(diffでは-b)に対する変更を無視して実装します。 –

31

これはあなたが望むものを実装して(-wに変更-bdiffexpr 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ヘルパーを探していますは、-bの代わりに-wであっても、余分な空白とコメント行のようなマイナーな編集を組み合わせることでかなり困惑します。たぶんdiffchar

+7

これは現時点で唯一の正しい回答であるため、これは受け入れられた回答である必要があります。 vimにはほとんど使われない "diff -b"と "diff -w"を切り替える簡単なオプションがありません。 – farnsy

+0

何とか 'vim'(バージョン8、Debian Stretch)が点滅し、':diffupdate'の後に空白の画面が表示され、 'PageUp'または' PagDown'の後で正しい画面が再描画されます。非常に奇妙な... –

+0

@DrBeco:これは問題を解決するのに適切な場所ではありませんが、gvimで問題があるかどうかを確認することから始めます(GUIを使用していると仮定します)。そうでない場合は、別の端末エミュレータや異なる '$ TERM'定義(" xterm-color "や" xterm-256color "や" xterm "など)を試してみてください。それ以外の場合は、ウェブを検索し、それが助けにならない場合は、[vi.SE](https://vi.stackexchange.com/)で検索して質問してください。回避策として、Ctrl + Lキーが機能するかもしれません。構文の強調表示を変更してみてください。 –

15

ありがとう、それは私を助けた。私は今だけ私の〜/ .vimrcとで、この(アダムKによって提案されているものよりも単純な)を持っている必要があります:

set diffopt+=iwhite 

set diffexpr="" 

そして、それはそれをしません...それは私が知っている最も強力な差分ツールで、他のどのツールよりもはるかに優れています。アダム・カッツのソリューションのコメントで育っ問題の対処

+4

いいえ、これは、質問要求としてdiff -wではなくdiff -bを実装しています。アダムKだけが正解です。 – farnsy

+0

ありがとう!単に "diffopt + = iwhiteを設定する"は、vimdiff自体からインタラクティブに発行されるので、すでに便利です。 –

0

ユーザーのvimのバージョンや設定によっては、silentコマンドは、それが発行された後、画面を再描画するために無視することができます。私はまた、この問題を遭遇しました。提案されたdiffexprを使用した後に:diffoを実行するたびに発生しました。私のソリューションは、次のコマンドを実行しサイレントを変更することでした:

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

コマンドが発行された後にこれが再描画を強制します。

関連する問題