Bagaimana cara menghubungkan ke buffer state yang dimodifikasi?

8

Seperti dalam variabel mode-line-modifiedbawaan yang menampilkan tanda bintang di baris mode jika buffer diubah.

Secara khusus, saya ingin hl-line-modemematikan ketika buffer dimodifikasi dan hidup ketika tidak.

Saya telah membaca dokumentasi tentang "Ubah Hooks", tetapi saya ingin hl-line-modeberalih ketika saya membatalkan perubahan seperti tanda garis mode.

pengasuh
sumber
3
Tampaknya kait yang relevanafter-change-functions dan first-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 menyarankan undountuk melakukan sakelar.
Dan
Lihat juga fungsi buffer-modified-puntuk menguji apakah suatu modifikasi telah terjadi. Saya menggunakan after-save-hookdan first-change-hookuntuk mengaktifkan indikator yang dimodifikasi di tabbar saya.
hukum
3
jika kait perubahan tidak berfungsi dengan sempurna saat kehancuran, cara paling pasti adalah post-command-hookmemeriksa buffer-modified-p.
Malabarba

Jawaban:

5

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".

Dan
sumber
Ahh, ya, terima kasih sudah memberikan jawaban. Saya akhirnya menggunakan opsi kedua agar tidak menggunakan a post-command-hook.
pengasuh
revert-bufferSepertinya kasus umum lain yang akan menempatkan buffer ke keadaan yang tidak dimodifikasi. Anda dapat menggunakan after-revert-hookuntuk menangani yang ini.
glucas
Anda juga perlu beberapa cara untuk mengaktifkan sorotan untuk buffer yang baru dibuka - mungkin itu after-change-major-mode-hook?
glucas
1
Catatan yang add-hookmemiliki localparameter, jadi jika Anda hanya ingin mengganti perilaku dalam mode atau buffer utama tertentu, Anda bisa.
Wilfred Hughes