Dapatkah vimdiff untuk git diff dimulai di tab proses saat ini?

Jan 20 2021

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

2 NikolasTapia Jan 20 2021 at 17:03

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:

  1. :tabnew | r! git show HEAD^:$(git rev-parse --show-prefix)#1:t
  2. Di tab yang baru dibuka, :vert sb 1 | windo diffthis

Penjelasan

  1. pertama-tama buka tab baru dengan tabnewdan memuat konten HEAD^versi file dalam buffer 1 ke dalamnya.
  2. 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.