41

同じファイルで2つの非常に類似したサブルーチンが発生する可能性はありますdiffか?vimdiffもしそうなら、どのように?

2つのサブルーチンを2つの別々のファイルにコピーしてからそれらをコピーすることを考えることができますがdiff、元のファイル内でそれを行う方法はありますか?

4

6 に答える 6

50

プラグインlinediff.vim:2つのテキストブロックでインタラクティブな差分を実行します。これは、Vincentが指摘したものと似ていますが、いくつかの追加機能があります。

  • 開いているバッファを閉じるコマンドがあります
  • GUIなしで動作するようです
  • 差分をとっている元のファイルに視覚的な表示を挿入します。

これを使用するには、最初のブロックで視覚的な選択を実行して差分を取り、コマンドを入力:Linediffして、2番目のブロックまで繰り返します。やめるために、:LineDiffReset

次のマップが役に立ちました。

noremap \ldt :Linediff<CR>
noremap \ldo :LinediffReset<CR>
于 2012-01-09T13:14:37.210 に答える
24

元のファイル内でこれを行うことはできませんが、個別のファイルを使用せずに、個別のバッファーのみを使用してこれを行うことができます。これは、レジスターに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>

hiddenVimが変更されたファイルを放棄することを拒否した場合は、オプションを設定することをお勧めします(を参照:h abandon)。

于 2010-09-01T20:15:15.463 に答える
6

これらの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つです。

于 2016-04-22T08:53:07.410 に答える
3

私はZyXの答えが本当に好きですが、シームレスに機能するために2つの変更を加える必要がありました。

  1. 実装されているように、<F7>はアクティブなバッファを垂直方向に分割された差分表示に置き換えます。次に、<F8>が差分を閉じている間、元のバッファをリロードしません。これを修正するためenewに、3行目をに変更しましたexecute 'tab split | enew'

  2. 副作用を最小限に抑えるためにcall remove(a:diffed_buffers, 0, -1)、WipeOutDiffs()の終わりの直前に追加しました。

HTH、-Stu

于 2011-09-09T01:10:14.130 に答える
3

私はこのコマンドを使用しています:

vimdiff <(cat file.foo | sed -n 10,15p) <(cat file.foo | sed -n 20,25p)

供給される番号sedは、ファイル内で比較したい行番号です。<(*)入力として評価およびリダイレクトすることを意味します。

于 2016-09-19T15:12:01.360 に答える
1

Block diff vimプラグインを試すことができます。違いを示すために、新しいタブに2つの新しいバッファーが作成されます。

于 2010-09-01T23:04:35.083 に答える