Membangun komentar, berikut adalah dua cara untuk mencapai apa yang Anda coba lakukan. (Tidak diuji secara luas, jadi YMMV.)
Pilihan 1: post-command-hook
Buat fungsi yang menguji apakah buffer diubah atau tidak, lalu kaitkan ke post-command-hook
:
(defun hl-line-mode-toggle-maybe ()
"Turn on `hl-line-mode' when buffer is unmodified, turn it off
when it is modified."
(hl-line-mode (if (buffer-modified-p) -1 1)))
(add-hook 'post-command-hook #'hl-line-mode-toggle-maybe)
Keuntungannya adalah sangat sederhana. Kerugiannya adalah bahwa Emacs akan menjalankan tes ini setelah setiap perintah tunggal , yang sepertinya berlebihan.
Opsi 2: first-change-hook
, after-save-hook
, danundo
Buat fungsi untuk hl-line-mode
mematikan dan menghubungkannya first-change-hook
. Buat fungsi untuk menghidupkan hl-line-mode
dan menghubungkannya after-save-hook
. Berikan after
saran tentang undo
hal itu yang dihidupkan hl-line-mode
ketika membatalkan mengembalikan buffer ke keadaan yang tidak dimodifikasi:
(defun hl-line-mode-off ()
"Turn off `hl-line-mode'."
(hl-line-mode -1))
(defun hl-line-mode-on ()
"Turn off `hl-line-mode'."
(hl-line-mode 1))
(add-hook 'first-change-hook #'hl-line-mode-off)
(add-hook 'after-save-hook #'hl-line-mode-on)
(defadvice undo (after hl-line-when-unmodified activate)
(unless (buffer-modified-p)
(hl-line-mode 1)))
Keuntungannya adalah ia jarang memanggil fungsi-fungsi ini daripada setiap perintah. Kerugiannya adalah Anda harus mempelajari saran, dan mungkin ada cara lain yang tidak diantisipasi untuk mendapatkan penyangga ke kondisi yang tidak dimodifikasi yang tidak memicu langkah " hl-line-mode
kembali".
after-change-functions
danfirst-change-hook
. Jika, karena alasan tertentu, membatalkan dari buffer yang dimodifikasi ke buffer yang tidak dimodifikasi tidak dihitung sebagai "perubahan" untuk kait ini, Anda dapat menyarankanundo
untuk melakukan sakelar.