現在のプロセスのタブでgitdiffのvimdiffを開始できますか?
ファイルバッファを開いて、:terminal
1つのタブページで分割を開いているとしましょう。実行する新しいタブを作成したいのですvimdiff
が、gitdiffが表示されます。git difftool HEAD~1
現在のvimプロセスの別のタブページに表示しようとしています。
これはプラグインなしのVim8で可能ですか?
:tab terminal
実行してから実行すると、このような錯覚を覚えますgit difftool HEAD~1
。ただし、これによりvimサブプロセスが開始されるため、これは避けたいと思います。
この質問のようなもの:2つのスプリットがすでに開いている場合、どうすればvimdiffモードに入ることができますか?ただし、gitdiffの場合。
回答
これは確かにバニラvim
で実行可能ですが、tpopeの優れたvim-fugitiveプラグインを確認することをお勧めします。次に、あなたは単に:tab Gdiff
あなたが望むものを手に入れるために行う必要があります。
プラグインを本当にインストールしたくない場合は、現在のファイルがバッファ番号にあると仮定すると、次のように機能する可能性があります。1:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- 新しく開いたタブで、
:vert sb 1 | windo diffthis
説明
- 最初に新しいタブを開き、バッファ1のファイル
tabnew
のHEAD^
バージョンの内容をそのタブにロードします。 - でバッファ1を含む垂直分割を開き、タブ内のすべてのバッファに
vert sb 1
発行:diffthis
して差分モードに入ります。
編集
OPはステップの上にいくつかのより詳細な説明のために1尋ねgit show
ニーズフォームの入力作業ツリーのルートからの相対パスにする必要があります。たとえば、バッファ1内のファイルの絶対パスがフォルダを含むパスである場合(つまり、リポジトリのルートである場合)、正しく機能するためには、を使用してファイルを呼び出す必要があります。どちらかを使用するか、機能しません。そのため、この例では、gitルート()を基準にした現在のフォルダーのパスを取得していました。<rev>:<path>
<path>
/a/b/foo.ext
b
.git
b
git show
HEAD^:b/foo.e
/a/b/foo.ext
foo.ext
git rev-parse --show-prefix
b/
次に、vim
パス展開を使用してファイルの名前(つまりfoo.ext
)を追加しました。バッファ1にロードされているファイルのパスをフェッチする#1
ように指示vim
し:t
、「テール」を抽出します。これは、/
によって返されるパスの最後以降のすべて#1
です。#1
と#1:t
が等しい場合もありますが、常にそうであるとは限りません。たとえば、実行した場合はvim b/foo.ext
、。だけではなく#1
戻ります。詳細についてはチェックしてください。b/foo.ext
foo.ext
:help expand
もちろん、のように手動でパスを入力するだけ:tabnew | r! git show HEAD^:b/foo.ext
でも機能します。ただし、上記のバージョンはスクリプト可能であるか、マップに割り当てることができます。