Ketika menjalankan perintah secara undo-tree-undo/redo
berurutan, semuanya dibatalkan / diperbaiki berdasarkan cabang aktif saat ini. Meskipun pengguna menerima pesan titik cabang di sepanjang jalan, cabang sebelumnya diabaikan kecuali pengguna secara manual memilih cabang yang berbeda.
Saya mengerti bahwa saya dapat membuka visualizer dan memilih cabang yang berbeda, namun, akan sangat berguna untuk hanya menahan tombol undo / redo dan melihat semuanya terjadi dalam urutan sebaliknya. Idealnya, ini harus bekerja terlepas dari apakah visualizer
buffer terbuka - yaitu, secara terprogram menghitung urutan dari awal hingga awal, dan dari awal hingga akhir.
T : Ini pada dasarnya adalah permintaan fitur untuk memperpanjang undo-tree
untuk memungkinkan undo / redo linear berturut-turut, terlepas dari apakah buffer visualizer terbuka. [Fungsi baru dan pintasan keyboard alternatif untuk fitur baru ini tentu dapat diterima.]
sumber
undo-tree
penampilan seperti itu adalah bagian dari konsep yang dapat Anda beralih secara bebas antarabuffer-undo-tree
danbuffer-undo-list
dengan beralihundo-tree-mode
. Saat saya memahami pertanyaan Anda, penanganan awalbuffer-undo-list
melakukan apa yang Anda inginkan. Jadi itu menyarankan dirinya untuk sementara mematikanundo-tree-mode
untuk tujuan Anda. Kasihan beralih antarabuffer-undo-tree
danbuffer-undo-list
tampaknya menjadi buggy (setidaknya untuk saya). Jadi mungkin, cara untuk pergi hanyalah laporan bug kepada pengelolaundo-tree
. Tapi, mungkin dugaan saya tentang konsep aslinya salah.undo-tree-mode
sehingga beralih di antarabuffer-undo-tree
danbuffer-undo-list
bekerja tanpa cacat. Sudahkah Anda mempertimbangkan untuk menerbitkan laporan bug di `toby-undo-tree @ dr-qubit.org`?undo-tree
saat menggunakanlinear
fitur baru ; dan, saya inginlinear
fitur baru berfungsi tanpa buffer visualizer yang terlihat. Secara umum, saya menerapkan perbaikan / modifikasi saya sendiri untuk Emacs, baik perpustakaan pihak ketiga bawaan maupun opsional. Ketika saya macet atau saya melihat sesuatu yang sangat rumit sepertiundo
fitur itu, saya meminta bantuan. Permintaan fitur kepada pengelola tidak ada salahnya, tapi saya lebih suka menanganinya di sini.undo-tree.el
kode hari ini, saya melihat bahwa ada fitur cap waktu node. Saya tidak yakin apakah setiap node memiliki cap waktu yang valid dan apakah mereka bertahan untuk sesi Emacs berikutnya (ketika memulihkan sejarah), tapi itu terdengar seperti jalan pintas untuk menyelesaikan permintaan fitur baru ini - yaitu, menyortir dan memilih sebelumnya atau berikutnya dalam waktu. Saya belum melihat bagaimana tata letak tanah di titik cabang, tapi ... itu adalah pikiran awal saya. . . .undo-list-rebuild-from-tree
. Seseorang haruslet
-mengikat variabelbuffer-undo-list
dan biarkanundo-list-rebuild-from-tree
melakukan tugasnya. Setelah itu salin nilai itu ke variabel lokal lain, katakanmy-undo-list
, dan biarkanlet
-form untuk mengikatbuffer-undo-list
. Variabelmy-undo-list
menentukan jalur linear melaluiundo-tree
. Melihatundo-list-rebuild-from-tree
Anda melihat bahwa fungsi ini juga menggunakan perangko waktu. Saya sebelumnya mempertimbangkan menggunakan cap waktu. Tapi, saya mendapat kesan bahwa perubahan itu terlalu sering.Jawaban:
Berikut ini adalah implementasi prototipe dari perkiraan apa yang Anda inginkan. Ini mengeksploitasi fakta bahwa cabang-cabang baru di undo-tree ditambahkan di sisi kiri node saat ini.
Urutan kunci C-M-_terikat ke
undo-tree-walk
mana berjalan di bagian kanan atas dari pohon undo dimulai pada simpul saat ini.Perilaku berbeda dari yang Anda inginkan jika cabang aktif dari beberapa sub-pohon di sisi kanan node saat ini bukan cabang paling kiri di sub-pohon itu.
Anda bisa mendapatkan dalam kondisi seperti itu dengan undo / redo-sequence non-trival.
Coba saja sendiri untuk melihat apakah itu cukup untuk aplikasi Anda.
Perhatikan, bahwa saya menambahkan
undo-tree-visualize
pada akhirundo-tree-walk
untuk menampilkan konsekuensi dari berjalan undo-tree withundo-tree-walk
. Jangan ragu untuk memodifikasi kode sesuai keinginan Anda.Perhatikan juga, bahwa saya harus memilih perkiraan solusi paling sederhana untuk masalah Anda karena batasan waktu.
sumber
undo-tree-walk
untuk melewati beberapa kesalahan awal, mungkin karena saya tidak memiliki mode ini aktif secara global.(when (eq buffer-undo-list t) (user-error "No undo information.")) (undo-list-transfer-to-tree)
Itu membungkam kesalahan awal saya di buffer baru saat mencoba jawaban ini. Pengamatan saya berikutnya adalah yangundo-tree-walk
mencapai titik cabang dan kemudian beralih ke cabang di sebelah kanan, tetapi hanya turun cabang satu takik / bintil sebelum naik kembali cabang ke batang. Setup pilihan saya menciptakan takik / nodul untuk setiap stroke key.undo-list-transfer-to-tree
saat Anda melamar. Sebelum itu saya menguji apakahundo-tree-mode
aktif atau tidakundo-list-transfer-to-tree
bisa berakibat fatal.Terima kasih khusus kepada @Tobias karena telah menulis fungsi untuk menemukan cap waktu berikutnya / sebelumnya dalam sejarah undo / redo: https://emacs.stackexchange.com/a/32415/2287 ; dan, untuk juga menulis serangkaian fungsi untuk menyalin undo-tree: https://emacs.stackexchange.com/a/32230/2287 .
Karena beberapa pembaca mungkin sudah sadar, garpu diterima oleh MELPA hanya dalam keadaan ekstrem. Membuat add-on mungkin bisa dilakukan, tetapi tampaknya tidak praktis mengingat jumlah perubahan yang telah dibuat oleh @lawlist - termasuk, tetapi tidak terbatas pada, menambahkan elemen ke vektor struktur data yang mendasarinya, dan mengubah nama beberapa fungsi / variabel yang tidak sesuai dengan
undo-tree-...
konvensi penamaan awalan, dll. @lawlist telah menjangkau penulis asli (Dr. Cubitt) untuk menawarkan fitur baru ini, serta berbagai perbaikan bug dan penyempurnaan.Jika ada yang tertarik, silakan berikan fitur baru ini. Komentari berisi contoh formulir pengiriman laporan bug mulai dari
emacs -q
jika ada yang mengalami masalah.Kode Sumber: https://github.com/lawlist/undo_tree
Komentar:
sumber