2011-09-08 15 views
10

可能性の重複:
(Vim)diff two subroutines in same filevimに2つのレジスタを比較する方法はありますか?

時々私は私が同じファイル内の別のブロックと同一であることが疑われるコードのブロックを参照してください、それは視覚的な検査のために少し長すぎると、私は何かを逃しているかもしれません。私は視覚的にブロックを選択し、デフォルトのレジスタにヤンクし、そのレジスタを/(find)に入れようとしましたが、元のブロックさえも一致しませんでした。

セクションを選択して、レジスタでヤンクし、別のセクションを選択してから、2つのセクションを選択し、新しいファイルを1つ作成しないでください。私は、タブまたは分割内の新しいバッファに開くdiffの結果を想像します。

EDIT:私の質問は基本的にThis oneの複製です。私はthis answerが最も役に立ち、&が私が探していたものに最も近いことがわかりました。私が変更する唯一のことは、Unified formatに出力させることです。これは、私が慣れていたdiff出力のように見えます(さらに多くの情報があります)。これは、別の差分ユーティリティを使用することを意味します。

echo matchstr(@a.'@@'[email protected], '^\zs\(.*\)\ze.\{-}@@\1.*$') 

は、レジスタ@a@bの間で共通であるかを示すだろう:私のlh#path#strip_common()機能からインスピレーションを受け

+0

oをwがCTRLを使用する:あなたが持つそれらのいずれかを終了することができますバック単一のウィンドウに戻りその後

(その後:diffoff差分モードを終了します)これは組み込みです...たぶん ':tabnew"のような何かをする小さなスクリプトです:ap:vsplit l "bp"? –

答えて

5

あなたはとのより多くの情報を表示することができます

と一緒に使用し
function ShowDiff(a,b) 
    " I expect neither string to contain '@@' 
    let start = matchstr(a:a.'@@'.a:b, '^\zs\(.*\)\ze.\{-}@@\1.*$') 
    let end= matchstr(a:a.'@@'.a:b, '^.\{-}\zs\(.*\)\[email protected]@.\{-}\1$') 
    let a = a:a[len(start): -len(end)-1] 
    let b = a:b[len(start): -len(end)-1] 
    echo "identical beginning: ".strlen(start)." chars -> ".start 
    echo "identical ending : ".strlen(end)." chars -> ".end 
    echo "typical to a  : ".strlen(a)." chars -> ".a 
    echo "typical to b  : ".strlen(b)." chars -> ".b 
endfunction 

:call ShowDiff(@a, @b) 
3

次の2つのセグメントは、レジスタ、'a'bにすでに存在すると仮定して、次のシーケンスを使用することができます。おそらくマクロや関数に入れることができます。

new 
only 
put a 
diffthis 
vnew 
put b 
diffthis 

これは新しいバッファを作成するには、それだけ表示バッファになり、それに'aを置くdiff'dするためにそれを設定し、その後、縦割りで新しいバッファを開き、空のこのスプリットに'bを置きますバッファに格納し、diffに設定します。すぐにvim(またはgvim)の違いが表示されます。

行われ、タイプ:ls、バッファのリストを取得し、元のファイルに戻すために:buffer *N*を使用して作成したバッファを削除する:bdel! *N*を使用するために(という名前を「[いいえ名]」)。

+0

AKAIはそれを理解しています。OPは「新しいファイルをたくさん作成する」ことに興味がありませんでした。 (私は認めなければならない、私はしばしばあなたの答えを詳述してほしい) –

+1

これは新しいファイルを作成せず、既存のvimセッション内に新しいバッファのみを作成する。バッファは、バッファが書き込まれるまでファイルになりません。 – Arcege

+0

そして、 'setlocal buftype = nofile'を使うことができますので、書き込まれたり保存を依頼されることはありません。 – idbrii

3

ここには、2つの新しいウィンドウを並べて表示する機能があります。それぞれのウィンドウには、指定されたレジスタの内容(たとえば、DiffRegs(@a, @1)と呼ばれます)が含まれています。新しいバッファが書かれたり、変更されません。

" A list for bookkeeping.. 
let g:diffreg_buffers = [] 

function! DiffRegs(reg1, reg2) 
    " Preserve the unnamed register 
    let s:nonamereg = @@ 
    let @@ = a:reg1 
    " new window 
    :new 
    normal P 
    setlocal nomodifiable 
    setlocal buftype=nofile 
    diffthis 
    call add(g:diffreg_buffers, bufnr('%')) 

    let @@ = a:reg2 
    :vsp +enew 
    normal P 
    setlocal nomodifiable 
    setlocal buftype=nofile 
    diffthis 
    call add(g:diffreg_buffers, bufnr('%')) 

    let @@ = s:nonamereg 
endfunction " DiffRegs(reg1, reg2) 

" Function to wipe all buffers we're diffing with the function above 
function! EndDiffs() 
    for buffer in g:diffreg_buffers 
     exe ':buffer ' . buffer 
     diffoff 
     quit 
    endfor 
    let g:diffreg_buffers = [] 
endfunction " EndDiffs() 

あなたがお好みのキーの組み合わせにこれらをバインドすることができますが、DiffRegs()への各呼び出しの後EndDiffs()を呼び出さない場合は、あなたが問題に実行されます。

+0

うわー、それはかなり良いです!ただし、1つのバッファに2-100のラインを、もう1つに1-99をヤンクすると、98のラインが異なっている、つまりそれが考慮されていないことが分かります余分な行のために。 2.約二倍、それを実行した後、動作しないようです:関数DiffRegsの処理中に検出された エラー: 行9: 10行以上 行16: E96:diffをすることができない以上4つのバッファ 10行以上 この私はtho(2つの新しいバッファなど)を探しているものに近いスーパーです! –

+0

私は本当に(1)を解決することはできませんが、それはdiff(vimでも)の仕組みではありません。 (2)の解決方法については、更新された回答を参照してください。 –

1

素早くファイルの2つの異なる部分を比較するには、あなたが使用して、2つのビューを分割することができます。

  • :sp水平分割

または

  • :vsp縦割りを

画面を分割したら、各ウィンドウで:diffthisを使用して相違点を強調表示する必要があります。 qまたは私は1つの知らない

関連する問題