T: Bagaimana cara saya menyisipkan / memodifikasi teks dalam buffer tanpa undo
memperhatikan?
Ini kasus penggunaannya. Saya memiliki blok komentar di awal setiap file yang, antara lain, memperbarui stempel waktu untuk perubahan terbaru ke file. Saya ingin dapat memodifikasi stempel waktu tanpa undo
fasilitas menyadarinya.
Alasan saya ingin melakukan hubungan arus pendek di undo
sini adalah karena kasus tepi berikut, yang muncul saat mengedit / mengkompilasi dokumen LaTeX (dan mungkin yang lain, tetapi ini adalah yang paling sering membuat saya gila):
- Buat perubahan kecil pada file untuk melihat bagaimana itu akan mempengaruhi dokumen yang dikompilasi
- Simpan file (yang memperbarui cap waktu)
- Jalankan
latex
pada file - Putuskan bahwa perubahan itu buruk
undo
perubahan
Masalah pada langkah (5) ( undo
) adalah bahwa hal itu tidak membatalkan perubahan yang dibuat pada langkah (1), melainkan membatalkan pembaruan timestamp pada langkah (2). Itu tidak akan mengganggu saya (saya bisa saja undo
lagi) kecuali bahwa itu juga bergerak menunjuk ke stempel waktu di bagian atas file, yang hampir selalu banyak, banyak baris dari perubahan substantif yang sebenarnya. Ini sangat menggelegar dan benar-benar merusak konsentrasi saya.
Saya mengajukan pertanyaan sehubungan dengan file yang saya kunjungi, tetapi lebih umum tentang memodifikasi buffer.
Jadi: bagaimana saya bisa mencegah undo
dari melihat modifikasi spesifik ke buffer?
undo
akan membatalkan keduanya.atomic-change-group
.with-undo-collapse
makro yang sangat berguna: emacs.stackexchange.com/a/7560/2418Jawaban:
@ stsquad menjawab saya di jalan yang benar. Pada dasarnya, langkah-langkahnya adalah:
buffer-undo-list
undo
undo
kembali dan mengembalikanbuffer-undo-list
Jadi inilah sketsa dari fungsi seperti itu:
Sunting: sebenarnya, ternyata solusi yang lebih sederhana adalah hanya
let
-bindbuffer-undo-list
sehingga perubahan ke daftar di badanlet
get clobbered ketika daftar asli dipulihkan:Keterbatasan utama dengan ini adalah bahwa hal itu tampaknya berfungsi untuk modifikasi yang tidak mengubah jumlah karakter dalam buffer (misalnya, mengubah "anak kucing" menjadi "anak anjing", tetapi bukan "kucing"), karena jika tidak maka sisa undo daftar sekarang mengacu pada poin yang salah. Karenanya, ini hanya solusi parsial .
sumber
Operasi undo menggabungkan beberapa elemen dari daftar undo . Sebuah
nil
entri dalam daftar tanda batas antara dua kelompok perubahan. Dengan menghapusnil
di awal daftar yang secara otomatis disisipkan oleh loop tingkat atas¹, Anda dapat mengelompokkan pembaruan stempel waktu dengan perubahan buffer terakhir, yang secara teknis tidak cocok dengan permintaan Anda, tetapi secara praktis akan menyelesaikan masalah dalam skenario Anda.(Peringatan: belum diuji, daftar undo mungkin memerlukan lebih banyak pemijatan.)
Anda juga dapat bermain dengan daftar undo dengan cara yang berbeda, dengan memodifikasi entri posisi (bilangan bulat) untuk pembaruan cap waktu.
¹ melakukan penghapusan serupa dengan sisipan grup.
self-insert-command
sumber
Masalah dengan apa yang Anda sarankan adalah bahwa undo-tree adalah daftar delta yang bisa Anda dapatkan di tempat yang Anda inginkan. Meskipun sangat mungkin untuk menonaktifkan membatalkan pelacakan pada buffer, saya tidak yakin apa efek dari tidak secara aktif merekam perubahan. Saat ini saya memiliki sakelar untuk mengaktifkan / menonaktifkan pembatalan pada buffer tertentu karena tidak masuk akal untuk membatalkan informasi pada log yang tumbuh atau halaman yang menyegarkan. Namun itu mengubah perubahan pada toggle:
buffer-disable-undo sebenarnya hanya menetapkan buffer-undo-list menjadi nil . Mungkin jika Anda menyimpan status buffer-undo-list pada Anda beralih Anda dapat mengembalikannya setelah itu?
sumber