2016-04-09 17 views
3

vimdiffの仕組みを理解しようとしています。vimdiffの類似性検索メカニズムを改善する方法

ここでは、2つの単純なファイルを比較しようとしました。第1回:

abcdefghijklmnopqrstuvwxyz 

foo 

abcdefghijklmnopqrstuvwxyz iii 

bar 

第二:

ここ
abcdefghijklmnopqrstuvwxyz 

abcdefghijklmnopqrstuvwxyz 

はdiffmergeユーティリティからの結果である:

enter image description here

そして、ここvimのからの結果である:

enter image description here

vimはabc...xyzabc...xyz iiiの間の類似性を認識せず、1行に視覚的に配置しないことに注意してください。

このような場合、vimdiffを改善するための設定はありますか?

+0

'vimdiff'は外部の' diff'ユーティリティを呼び出し、それを解析します(このような変更は見られません)。 'diffmerge'は明らかにより高度なアルゴリズムを使用しています。 – Carpetsmoker

+0

私はそれが受け入れられた答えかもしれないと信じています...) – jsv

+0

Vimがどのようにデータを解析するのか分かりませんし、おそらく 'diffexpr'設定を使ってVimでこれを達成することができます(':h diff-diffexpr ')...だから、Vimでこれをするのは完全に不可能ではないかもしれませんが、設定をするだけではありません。 – Carpetsmoker

答えて

0

コメントで指摘されているように、vimは単語diffを実行しない外部ユーティリティdiffを使用していませんし、移動および修正された行も見つかりません。

diffexprに頼っていても、外部ユーティリティのデータが "ed"形式のdiffであることが予想されるため、不満足です。これは、diffmergeのような単語または文字ベースのdiffを作成する代替diffユーティリティを使用することを排除します。

辛抱強くやっているプラ​​グイン作者のいくつかは、これらのより洗練された差分の結果をラップし、その出力をVimが消費する「ed」形式のdiffに変換します。私はこのアプローチをとる2つのプラグインを知っている:chardiffvim-diff-enhanced。両方ともあなたに言葉の違いを与える。さらに、Vim-diff-enhancedでは、さまざまなdiffアルゴリズム(マイヤー、ヒストグラム、忍耐)を切り替えることができるため、どのdiffが最良の結果を得られるかをケースバイケースで決めることができます。

私はvim-diff-enhancedを使用していますが、これはデフォルトのdiffよりも優れていますが、それでも優れていません。 (注意:それはgitに依存します)たとえば、質問に記述されているようにテストを試みましたが、行5と行3が同じであることを認識しませんでした(set diffopt + = iwhiteでさえ)。しかし、最初のサンプルファイルの2行目に何かを削除したり追加したりした場合、vimdiffはdiffmergeから得た結果と一致します。

関連する問題