差分ツールとしてvimを使用するにはどうすればよいですか?


102

私は主なエディターとしてvimを使用しています。

また、vimを使用してファイルを比較し、簡単な変更を修正するためにdiffを実行しながらファイルを変更します(diff / fix / diff / fixのサイクルであるほとんどのdiffテクニックではなく)。

さらに、vimをソース管理ツール/サイトで使用されるdiffツールに簡単に統合する方法があります(特にgitについて考えていますが、他の人々は他のソース管理ツール/サイトとの統合に興味があると確信しています)。


1
現在のバッファーがgitによって管理されている場合、コマンド:Gdiffを追加するvim-fugitiveを試してみてください。:Gvdiff両方のコマンドを使用すると、現在のバッファーの並列diffを確認できます。また、一部のファイルでマージ競合がある場合、3ウィンドウレイアウトで競合を解決するのに
役立ち

bashrcにこの単純な関数があり、でvd () { diff $@ > /dev/null ; if [[ $? -eq 1 ]] ; then ; vimdiff -c 'windo set syntax=off' $@ ; fi ; }呼び出しvd file1 file2ます。diffファイルが異なるかどうかを判断するために使用し、vimdiffそうである場合にのみ開きます。そうでなければ、私はシェルに留まります。また、Vimで構文の強調表示を無効にします。これは、差分をとると気が散るからです。2つのファイルでのみ機能します。
ロルフ

回答:


122

vimにはこの機能が組み込まれています(正しいコマンドラインフラグを使用)。

vim -d <file1> <file2>

これにより、各ファイルがビューで開き、違いが強調表示されます。
同一のコードはすべてfolded離れているため、同一のコードを見たり、同一のコードの巨大な塊をスクロールしたりする必要はありません。

しかしvimdiff、正しいフラグでvimを正しく呼び出すラッパーアプリケーションもあります。

vimdiff source1.cpp source2.cpp

gitを使用している場合、外部diffツールをセットアップできます。したがって、vimdiffをgitのdiffツールとして設定するのは簡単です。

git config --global diff.tool vimdiff

vimdiffを使用する場合、どちらの側でも編集でき、差分の強調表示はペースを維持して差異を表示します。

注:git diffから編集する場合。リポジトリに保存されたバージョンのファイルを編集しようとすると、終了時に変更が破棄されます(gitは元のファイルを信頼していないため、tmpコピーとの違いがあります)現在のバージョンで保存します。

で役立ついくつかの基本的なコマンド vimdiff

dp             diffput: puts changes under the cursor into the other file
                        making them identical (thus removing the diff).
do             diffget: (o => obtain). The change under the cursor is replaced
                        by the content of the other file making them identical.


]c             Jump to the next diff
[c             Jump to the previous diff

vimdiffでハイライトを操作するために使用する他のvim設定

if &diff
    highlight! link DiffText MatchParen
endif

これにより、変更されたコードのビットの強調表示がオフになります。そのため、変更された行が強調表示されるので、変更箇所を見つけることができますが、変更された実際のテキストは(強調表示されていないため)行上で目立ちます。


また、コンフィギュレーションファイルを比較するためのそれは素晴らしい作り、4つのバッファまでのハンドル
Izkata

34
この:diffthisコマンドを使用して、Vimが既に実行されているときにdiffを開始することもできます。
リッチ

11
そして:diffoffでオフにします。vimのドキュメントへのリンクは有益だと思います:vimdoc.sourceforge.net/htmldoc/diff.html
Cody Poll

1
私にとってもgit config --global diff.tool vimdiffgit diff何も変更しない場合のように、すべてが表示されます。
ハイエンジェル

2
試してくださいgit difftool
マーティンヨーク

13

開いているファイルを編集していて、現在のファイルを閉じずに別のファイルと比較したい場合:

分割画面で新しいファイルを開きます。

垂直分割の場合:

:vs otherFile

または水平分割:

:split otherFile

カーソルを別の分割画面に切り替えます。

ctrl+w ctrl+w

ファイルで「差分モード」を呼び出します。

:diffthis

他のファイルに切り替えて、「diffモード」を呼び出します。

:diffthis

「差分モード」をオフにするには:

:diffoff

5
バッファ間の切り替えを避けるためにも使用:windo diffthisできます
statox

4

現在ログインしているユーザーの(または)ディレクトリにある.gitconfigファイルに、以下の設定を配置できます。%homepath%%userprofile%

[diff]
    tool = vimdiff

これにより、git bashツールはvimdiffを外部diffツールとしても使用できるようになります。



2

vimをdifftoolとして使用する状況は3つしかありません。以下に簡単に説明します。

  • git difftoolの場合、次の行をに入れます~/.gitconfig

    [core]
    editor = vim
    [diff]
    tool = vimdiff
    [merge]
    tool = vimdiff
    conflictstyle = diff3
    
  • vimを2つのファイルのdiff-toolとして開くには、次を実行できます。

    vimdiff file1.ext file2.ext      # for vim
    nvim -d file1.ext file2.ext      # for neovim
    
  • 現在アクティブなバッファ、つまり現在アクティブなタブページでウィンドウが割り当てられているすべてのバッファの差分ビューを取得するには、次の操作を実行できます。

    :windo diffthis                " to get diff view
    :windo diffoff                 " to remove diff view
    

詳細については、 :h diff


1

ここに私がやることがあります:

  • 最初のファイルでウィンドウを開きます(データを貼り付ける場合はテキストコンテンツ)
  • :vnew(両方のウィンドウを並べて表示する)または:new(ウィンドウを上下に表示する)を使用して次のファイル/ウィンドウを開きます。2番目のウィンドウで開く特定のファイルがある場合、次のようなパスを含めることができます。:vnew /path/to/secondfile.txt
  • F8キーを使用して、差分モードのオンとオフを切り替えるカスタム関数を切り替えます

ここにあるカスタム関数は次の~/.vimrcとおりです:

nmap <silent> <F8> :call ToggleDiff()<CR>
imap <silent> <F8> <C-O>:call ToggleDiff()<CR>
function ToggleDiff ()
    if (&diff)
        set nodiff noscrollbind
    else
        " enable diff options in both windows; balance the sizes, too
        wincmd =
        set diff scrollbind nowrap number
        wincmd w
        set diff scrollbind nowrap number
        wincmd w
    endif
endfunction

コマンド:diffthisを使用できるため、diffoff!すべてのdiffオプションを自分で設定する必要はありません(たとえば、cursorbindはdiffmodeでも設定されます)
Christian Brabandt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.