Menggabungkan magit dengan undo-tree untuk navigasi riwayat yang mudah

16

Saya suka undo-tree(tangkapan layar di bawah). Ini memberikan cara mudah untuk menavigasi melalui berbagai versi file (jendela atas) dengan membiarkan pengguna bergerak di sekitar pohon sejarah file di jendela terpisah (jendela bawah) dengan kunci sederhana seperti n, pdan C-bdan C-funtuk beralih melintasi keturunan yang sama. induk.

Terutama, undo-treememperbarui buffer yang menahan file dengan versi yang sesuai berdasarkan pilihan dalam tampilan hierarki, secara otomatis.

Tentu saja, magitini fenomenal untuk git, dan akan luar biasa jika memiliki kemampuan yang sama, yaitu membiarkan pengguna menavigasi riwayat git file secara interaktif sambil secara bersamaan memperbarui buffer yang memegang file secara otomatis.

Apakah ini mungkin dengan magithari ini?

masukkan deskripsi gambar di sini

Amelio Vazquez-Reina
sumber
Tidak tahu apakah itu mungkin dengan magit tetapi lihat di github.com/pidu/git-timemachine
clemera
Saya tidak yakin, tapi saya pikir undo-treemenggunakan pohon (itu dalam nama :-p), sedangkan sejarah Git adalah grafik asiklik diarahkan . Mungkin tidak sepele.
suvayu
2
Magit memang mendukung sesuatu seperti ini, tetapi saya saat ini mengubah cara fitur dihidupkan. Saya akan mengirim jawaban ketika saya selesai dengan itu.
tarsius

Jawaban:

7

Magit baru-baru ini mendapatkan dukungan untuk sesuatu seperti ini, tetapi fitur ini masih agak kasar di sekitar tepi dan harus diaktifkan secara eksplisit.


Fitur serupa telah ada untuk waktu yang lama - ketika Anda berpindah dari satu komit ke komit lain dalam buffer log, dan jendela lain di frame yang sama adalah buffer revisi repositori, maka buffer itu di-refresh untuk menunjukkan komit daripada komit apa pun yang melakukannya. sebelumnya ditampilkan.

Sampai baru-baru ini buffer revisi dibuat ketika Anda pertama kali berpindah dari satu komit ke yang lain. Saya telah mengubah perilaku itu dan sekarang buffer revisi hanya diperbarui . Jika tidak ada jendela dalam bingkai yang sama sudah menampilkan buffer itu, maka bergerak di sekitar log tidak akan lagi menyebabkan buffer ditampilkan di beberapa jendela baru atau jendela yang sudah ada yang sebelumnya menampilkan beberapa buffer lain.

Jadi sekarang Anda harus menekan SPCsekali untuk menampilkan buffer revisi. Hanya kemudian akan mulai diperbarui ketika Anda bergerak di sekitar buffer log.

Jika Anda tidak ingin buffer revisi diperbarui, maka lakukan ini:

(remove-hook 'magit-section-movement-hook
             'magit-log-maybe-update-revision-buffer)

Jika di sisi lain Anda juga ingin buffer revisi diperbarui ketika bergerak di buffer status, maka gunakan ini:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-revision-buffer)

Sekarang mungkin untuk buffer gumpalan diperbarui secara otomatis dengan cara yang sama. Pertama tambahkan ini:

(add-hook 'magit-section-movement-hook
          'magit-log-maybe-update-blob-buffer)

Dan mungkin juga:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-blob-buffer)

Kemudian, di dalam buffer log (atau status) tekan RETuntuk menampilkan atau memperbarui buffer revisi, dan juga untuk beralih ke buffer itu. Pindah ke file yang Anda minati dan tekan RETlagi. Anda sekarang berada di buffer "blob-visiting", yang mirip dengan buffer kunjungan-file, kecuali bahwa itu tidak mengunjungi file di pohon kerja tetapi file seperti di beberapa komit.

Beralih kembali ke buffer log (atau status) dan pindah ke komit lain. Buffer gumpalan sedang diperbarui.


Perhatikan bahwa menampilkan gumpalan lain, sebenarnya tidak menggunakan kembali gumpalan buffer yang ada. Alih-alih itu menciptakan buffer baru yang mengunjungi gumpalan itu dan kemudian menampilkan buffer itu di jendela yang sebelumnya menampilkan buffer gumpalan lainnya. Buffer lain itu tidak sedang dihapus, yang sayangnya berarti bahwa beberapa buffer dapat terakumulasi dalam waktu singkat. Yang akan menjadi salah satu ujung yang kasar, saya sebutkan sebelumnya. Menekan qdalam buffer gumpalan tidak menghapusnya, sehingga Anda dapat membersihkan dengan pergi ke jendela yang digunakan untuk menampilkan berbagai buffer gumpalan dan terus menekan qsampai semua buffer telah dihapus.

Selain itu dimungkinkan untuk menavigasi ke gumpalan berikutnya atau sebelumnya dari dalam buffer gumpalan menggunakan pdan n. Saya berasumsi bahwa dalam kebanyakan kasus Anda mulai dengan gumpalan baru dan kemudian pindah kembali ke gumpalan yang lebih tua menggunakan p. Jika Anda melakukan itu dan kemudian ingin bergerak ke arah lain, saya sarankan Anda gunakan quntuk membunuh buffer saat ini dan dengan demikian pindah ke buffer sebelumnya yaitu gumpalan berikutnya .

Perhatikan juga bahwa Anda tidak harus terlebih dahulu mengunjungi revisi untuk dapat mengunjungi gumpalan. Anda juga bisa menggunakan M-x magit-find-file RET <revision> RET <file> RETsecara langsung, tetapi saya merasa kurang nyaman.

tarsius
sumber
Terima kasih tarsius. Saya bekerja dengan magit 20151014.231(terbaru sejauh yang saya tahu). Saya mencoba mengikuti langkah-langkah yang Anda jelaskan di atas. Aku pergi ke magit-log-buffer-fileyang memungkinkan saya untuk menavigasi komit ke atas dan ke bawah dengan ndan ptetapi ketika saya menekan SPCatau RETpada salah satu dari mereka saya dapatkan:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina
Anda mungkin ditambahkan magit-blame-maybe-update-revision-bufferke magit-section-movement-hookoleh kesalahan.
tarsius