Wie kann ich mich in den gepufferten Zustand einhaken?

8

Zum Beispiel in der eingebauten Variablen, mode-line-modifieddie ein Sternchen in der Moduszeile anzeigt, wenn der Puffer geändert wird.

Insbesondere möchte ich hl-line-modeausschalten, wenn der Puffer geändert wird, und einschalten , wenn dies nicht der Fall ist.

Ich habe die Dokumentation zu "Change Hooks" gelesen, möchte hl-line-modeaber umschalten, wenn ich eine Änderung wie das Sternchen "Moduszeile" rückgängig mache.

Kindermädchen
quelle
3
Relevante Haken zu sein scheinen , after-change-functionsund first-change-hook. Wenn das Rückgängigmachen von einem geänderten Puffer zu einem nicht geänderten Puffer aus irgendeinem Grund nicht als "Änderung" für diese Hooks gilt, können Sie empfehlen undo, das Umschalten durchzuführen.
Dan
Siehe auch die Funktion buffer-modified-pzum Testen, ob eine Änderung aufgetreten ist. Ich verwende das after-save-hookund, first-change-hookum einen geänderten Indikator in meiner Registerkartenleiste umzuschalten.
Lawlist
3
Wenn die Wechselhaken beim Rückgängigmachen nicht perfekt funktionieren, ist der sicherste Weg ein post-command-hookPrüfen buffer-modified-p.
Malabarba

Antworten:

5

Aufbauend auf den Kommentaren gibt es zwei Möglichkeiten, um das zu erreichen, was Sie versuchen. (Nicht ausgiebig getestet, also YMMV.)

Option 1: post-command-hook

Erstellen Sie eine Funktion, die testet, ob der Puffer geändert wurde, und hängen Sie ihn dann an 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)

Der Vorteil ist, dass es ziemlich einfach ist. Der Nachteil ist, dass Emacs diesen Test nach jedem einzelnen Befehl ausführt, was wie ein Overkill erscheint.

Option 2: first-change-hook, after-save-hook, undundo

Erstellen Sie eine Funktion zum hl-line-modeAusschalten und Einhängen first-change-hook. Erstellen Sie eine Funktion zum Einschalten hl-line-modeund haken Sie sie ein after-save-hook. Geben Sie afterHinweise undo, damit es aktiviert wird, hl-line-modewenn ein Rückgängigmachen den Puffer in einen unveränderten Zustand zurückversetzt hat:

(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)))

Der Vorteil ist, dass diese Funktionen selten und nicht nach jedem Befehl aufgerufen werden. Der Nachteil ist, dass Sie sich mit Ratschlägen befassen mussten und es möglicherweise andere, unerwartete Möglichkeiten gibt, einen Puffer in einen unveränderten Zustand zu versetzen, die den hl-line-modeSchritt "Wieder einschalten " nicht auslösen .

Dan
quelle
Ahh, ja, danke, dass du das in eine Antwort gegeben hast. Am Ende habe ich die zweite Option verwendet, um a nicht zu verwenden post-command-hook.
Kindermädchen
revert-bufferscheint ein weiterer häufiger Fall zu sein, der den Puffer in einen unveränderten Zustand versetzt. Sie könnten das verwenden after-revert-hook, um damit umzugehen.
Glucas
Sie benötigen auch eine Möglichkeit, die Hervorhebung für neu geöffnete Puffer zu aktivieren - vielleicht die after-change-major-mode-hook?
Glucas
1
Beachten Sie, dass dies add-hookeinen localParameter hat. Wenn Sie also nur das Verhalten in bestimmten Hauptmodi oder Puffern überschreiben möchten, können Sie dies tun.
Wilfred Hughes