Dapatkah vimdiff untuk git diff dimulai di tab proses saat ini?
Katakanlah saya memiliki file buffer terbuka dan :terminalterbelah dalam 1 tab halaman. Saya ingin membuat tab baru tempat saya menjalankan vimdifftetapi git diff saya ditampilkan. Saya mencoba untuk git difftool HEAD~1muncul 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 terminaldan 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 Gdiffuntuk 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
tabnewdan memuat kontenHEAD^versi file dalam buffer 1 ke dalamnya. - membuka pemisahan vertikal yang berisi buffer 1 dengan
vert sb 1, lalu menerbitkan:diffthissemua buffer di tab untuk masuk ke mode diff.
Sunting
OP meminta penjelasan lebih lanjut tentang langkah 1. git showkebutuhan 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.extyang bberisi .gitfolder Anda (yaitu broot repo Anda), agar git showberfungsi dengan baik Anda harus memanggilnya HEAD^:b/foo.e. Menggunakan salah satu /a/b/foo.extatau foo.exttidak akan berhasil. Jadi saya biasa git rev-parse --show-prefixmendapatkan jalur folder saat ini relatif terhadap git root (yang akan b/) dalam contoh ini.
Kemudian, saya menggunakan vimperluasan jalur untuk menambahkan nama file (yaitu foo.ext). #1memberitahu vimuntuk mengambil jalur dari file apa pun yang dimuat di buffer 1, dan :tmengekstrak "tail", yang semuanya setelah yang terakhir /di jalur yang dikembalikan oleh #1. Dalam beberapa kasus #1dan #1:tsama, tetapi ini tidak selalu terjadi. Misalnya, jika Anda berlari vim b/foo.extmaka #1akan kembali, b/foo.extbukan hanya foo.ext. Lihat :help expandinfo 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.