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-modemematikan dan menghubungkannya first-change-hook. Buat fungsi untuk menghidupkan hl-line-modedan menghubungkannya after-save-hook. Berikan aftersaran tentang undohal itu yang dihidupkan hl-line-modeketika 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-modekembali".
after-change-functionsdanfirst-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 menyarankanundountuk melakukan sakelar.