Dapatkah vimdiff untuk git diff dimulai di tab proses saat ini?
Katakanlah saya memiliki file buffer terbuka dan :terminal
terbelah dalam 1 tab halaman. Saya ingin membuat tab baru tempat saya menjalankan vimdiff
tetapi git diff saya ditampilkan. Saya mencoba untuk git difftool HEAD~1
muncul dalam proses vim saya saat ini, hanya di halaman tab lain.
Apakah ini mungkin di Vim 8 tanpa plugin?
Saya mendapatkan ilusi ini ketika saya melakukannya :tab terminal
dan kemudian berlari git difftool HEAD~1
. Namun, ini memulai subproses vim dan saya ingin menghindarinya.
Seperti pertanyaan ini: Bagaimana cara masuk ke mode vimdiff mengingat dua perpecahan sudah terbuka? tetapi untuk git diffs.
Jawaban
Meskipun ini pasti bisa dilakukan di vanilla vim
, saya sarankan Anda melihat plugin tpope yang sangat baikvim-fugitive . Kemudian, Anda hanya perlu melakukan :tab Gdiff
untuk mendapatkan apa yang Anda inginkan.
Jika Anda benar-benar tidak ingin menginstal plug-in apa pun, berikut ini mungkin berfungsi dengan asumsi file saat ini ada dalam buffer no. 1:
:tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
- Di tab yang baru dibuka,
:vert sb 1 | windo diffthis
Penjelasan
- pertama-tama buka tab baru dengan
tabnew
dan memuat kontenHEAD^
versi file dalam buffer 1 ke dalamnya. - membuka pemisahan vertikal yang berisi buffer 1 dengan
vert sb 1
, lalu menerbitkan:diffthis
semua buffer di tab untuk masuk ke mode diff.
Sunting
OP meminta penjelasan lebih lanjut tentang langkah 1. git show
kebutuhan input dari bentuk <rev>:<path>
mana <path>
harus relatif terhadap akar pohon kerja. Misalnya, jika path absolut dari file di buffer 1 adalah /a/b/foo.ext
yang b
berisi .git
folder Anda (yaitu b
root repo Anda), agar git show
berfungsi dengan baik Anda harus memanggilnya HEAD^:b/foo.e
. Menggunakan salah satu /a/b/foo.ext
atau foo.ext
tidak akan berhasil. Jadi saya biasa git rev-parse --show-prefix
mendapatkan jalur folder saat ini relatif terhadap git root (yang akan b/
) dalam contoh ini.
Kemudian, saya menggunakan vim
perluasan jalur untuk menambahkan nama file (yaitu foo.ext
). #1
memberitahu vim
untuk mengambil jalur dari file apa pun yang dimuat di buffer 1, dan :t
mengekstrak "tail", yang semuanya setelah yang terakhir /
di jalur yang dikembalikan oleh #1
. Dalam beberapa kasus #1
dan #1:t
sama, tetapi ini tidak selalu terjadi. Misalnya, jika Anda berlari vim b/foo.ext
maka #1
akan kembali, b/foo.ext
bukan hanya foo.ext
. Lihat :help expand
info lebih lanjut.
Tentu saja, Anda bisa memasukkan jalur secara manual, seperti di :tabnew | r! git show HEAD^:b/foo.ext
, dan itu akan berhasil. Tetapi versi di atas dapat dituliskan atau Anda dapat menetapkannya ke peta.