現在のプロセスのタブでgitdiffのvimdiffを開始できますか?

Jan 20 2021

ファイルバッファを開いて、:terminal1つのタブページで分割を開いているとしましょう。実行する新しいタブを作成したいのですvimdiffが、gitdiffが表示されます。git difftool HEAD~1現在のvimプロセスの別のタブページに表示しようとしています。

これはプラグインなしのVim8で可能ですか?

:tab terminal実行してから実行すると、このような錯覚を覚えますgit difftool HEAD~1。ただし、これによりvimサブプロセスが開始されるため、これは避けたいと思います。

この質問のようなもの:2つのスプリットがすでに開いている場合、どうすればvimdiffモードに入ることができますか?ただし、gitdiffの場合。

回答

2 NikolasTapia Jan 20 2021 at 17:03

これは確かにバニラvimで実行可能ですが、tpopeの優れたvim-fugitiveプラグインを確認することをお勧めします。次に、あなたは単に:tab Gdiffあなたが望むものを手に入れるために行う必要があります。

プラグインを本当にインストールしたくない場合は、現在のファイルがバッファ番号にあると仮定すると、次のように機能する可能性があります。1:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. 新しく開いたタブで、 :vert sb 1 | windo diffthis

説明

  1. 最初に新しいタブを開き、バッファ1のファイルtabnewHEAD^バージョンの内容をそのタブにロードします。
  2. でバッファ1を含む垂直分割を開き、タブ内のすべてのバッファにvert sb 1発行:diffthisして差分モードに入ります。

編集

OPはステップの上にいくつかのより詳細な説明のために1尋ねgit showニーズフォームの入力作業ツリーのルートからの相対パスにする必要があります。たとえば、バッファ1内のファイルの絶対パスがフォルダを含むパスである場合(つまり、リポジトリのルートである場合)、正しく機能するためには、を使用してファイルを呼び出す必要があります。どちらかを使用するか、機能しません。そのため、この例では、gitルート()を基準にした現在のフォルダーのパスを取得していました。<rev>:<path><path>/a/b/foo.extb.gitbgit showHEAD^:b/foo.e/a/b/foo.extfoo.extgit rev-parse --show-prefixb/

次に、vimパス展開を使用してファイルの名前(つまりfoo.ext)を追加しました。バッファ1にロードされているファイルのパスをフェッチする#1ように指示vim:t、「テール」を抽出します。これは、/によって返されるパスの最後以降のすべて#1です。#1#1:tが等しい場合もありますが、常にそうであるとは限りません。たとえば、実行した場合はvim b/foo.ext、。だけではなく#1戻ります。詳細についてはチェックしてください。b/foo.extfoo.ext:help expand

もちろん、のように手動でパスを入力するだけ:tabnew | r! git show HEAD^:b/foo.extでも機能します。ただし、上記のバージョンはスクリプト可能であるか、マップに割り当てることができます。