同じファイルで2つの非常に類似したサブルーチンが発生する可能性はありますdiff
か?vimdiff
もしそうなら、どのように?
2つのサブルーチンを2つの別々のファイルにコピーしてからそれらをコピーすることを考えることができますがdiff
、元のファイル内でそれを行う方法はありますか?
プラグインlinediff.vim:2つのテキストブロックでインタラクティブな差分を実行します。これは、Vincentが指摘したものと似ていますが、いくつかの追加機能があります。
これを使用するには、最初のブロックで視覚的な選択を実行して差分を取り、コマンドを入力:Linediff
して、2番目のブロックまで繰り返します。やめるために、:LineDiffReset
次のマップが役に立ちました。
noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>
元のファイル内でこれを行うことはできませんが、個別のファイルを使用せずに、個別のバッファーのみを使用してこれを行うことができます。これは、レジスターに1つのサブルーチンをコピーし a
(たとえば、"ay
ビジュアルモードで入力した場合)、レジスターに他のサブルーチン をコピーした場合に機能するはずb
です。
enew | call setline(1, split(@a, "\n")) | diffthis | vnew | call setline(1, split(@b, "\n")) | diffthis
自動化するには:
let g:diffed_buffers = []
function DiffText(a, b, diffed_buffers)
enew
setlocal buftype=nowrite
call add(a:diffed_buffers, bufnr('%'))
call setline(1, split(a:a, "\n"))
diffthis
vnew
setlocal buftype=nowrite
call add(a:diffed_buffers, bufnr('%'))
call setline(1, split(a:b, "\n"))
diffthis
endfunction
function WipeOutDiffs(diffed_buffers)
for buffer in a:diffed_buffers
execute 'bwipeout! ' . buffer
endfor
endfunction
nnoremap <special> <F7> :call DiffText(@a, @b, g:diffed_buffers)<CR>
nnoremap <special> <F8> :call WipeOutDiffs(g:diffed_buffers) | let g:diffed_buffers=[]<CR>
hidden
Vimが変更されたファイルを放棄することを拒否した場合は、オプションを設定することをお勧めします(を参照:h abandon
)。
これらの2つの部分/サブルーチン/セクションを2つのファイルに書き込んでから、vimdiffを使用して違いを確認できます。
:1, 39 write part1 //any line range or marks can be used
:40, 79 write part2
:!vimdiff part1 part2
行番号の使用に慣れていない場合は、セクションの先頭にカーソルを置き、vを押してセクションの終わりまで選択してから、:を押すことができます。:'<、'>が表示されます。次に、コマンドライン自体に「write」と入力してから「filename」と入力します。Enterキーを押します。同様に、2番目のものについても行います。次に、上記のようにvimdiffコマンドを実行できます。
(書き込みコマンドは、パーツを新しいファイルに保存します。)新しいファイルを書き込むことは良い考えではないかもしれませんが、それは私を助けます。特に、比較を数回行わなければならなかったとき。
これは、プラグインを使用しない場合、またはメモリを気にしない場合の最も簡単な方法の1つです。
私はZyXの答えが本当に好きですが、シームレスに機能するために2つの変更を加える必要がありました。
実装されているように、<F7>はアクティブなバッファを垂直方向に分割された差分表示に置き換えます。次に、<F8>が差分を閉じている間、元のバッファをリロードしません。これを修正するためenew
に、3行目をに変更しましたexecute 'tab split | enew'
。
副作用を最小限に抑えるためにcall remove(a:diffed_buffers, 0, -1)
、WipeOutDiffs()の終わりの直前に追加しました。
HTH、-Stu
私はこのコマンドを使用しています:
vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)
供給される番号sed
は、ファイル内で比較したい行番号です。<(*)
入力として評価およびリダイレクトすることを意味します。
Block diff vimプラグインを試すことができます。違いを示すために、新しいタブに2つの新しいバッファーが作成されます。