Before-Save-Hook für den CC-Modus

13

Ich möchte anpassen cc-mode, um eine Funktion vor dem Speichern auszuführen. Eine Lösung wäre, die cc-modeKeymap so zu ändern , dass sie C-x C-san eine Funktion gebunden wird, die die von mir benötigte Arbeit ausführt und sie dann speichert.

Meine Frage ist, ob es einen Haken gibt, den ich dafür anpassen könnte? In den CC Hooks-Dokumenten wird kein before-save-hookspezielles für erwähnt cc-mode. Wie soll das durch einen Haken gemacht werden?

Alternativ, wie mache ich das durch defadvice? Nach dem Lesen des Handbuchs konnte ich nur den Rat vor dem Speichern aktivieren und nach Abschluss der Arbeit deaktivieren. Das klingt umständlich. Was wäre die idiomatische Art, advices zu verwenden?

Pradhan
quelle
3
Die Funktion, die Sie hinzufügen, before-save-hookkann den aktuellen Hauptmodus (z. B. (eq major-mode ...)) überprüfen und nichts tun, wenn er nicht mit dem von Ihnen angepassten Modus übereinstimmt.
Konstantin
@ Konstantin Einverstanden. Ich wollte überprüfen, ob es für diese Art von Dingen etwas "Eingebauteres" gibt. IIRC haskell-modehat mindestens einen after/before-saveHaken und ich nahm an, dass dies Standardpraxis für Prog-Modi war.
Pradhan
@Constantine: Könnten Sie Ihren Kommentar in eine Antwort umwandeln (natürlich ein wenig erweitern)?
Dan
1
In diesem Thread finden Sie ein Beispiel für die Verwendung von after-save-hook; Sie können das gleiche Verfahren anwenden, aber ersetzen before-save-hook.
Dan

Antworten:

12

Eine ziemlich übliche Methode, die Aktion eines Hooks auf einen bestimmten Hauptmodus zu beschränken, besteht darin, den Wert von zu überprüfen major-mode.

Dieser Hook druckt beispielsweise eine Nachricht, bevor Puffer mit c++-modefolgenden Elementen gespeichert werden :

(defun my-c++-mode-before-save-hook ()
  (when (eq major-mode 'c++-mode)
    (message "It's never too early to start saving (C++ code)!")))

(add-hook 'before-save-hook #'my-c++-mode-before-save-hook)

Als Randnotiz: Manchmal kann es nützlich sein zu überprüfen, ob ein Hauptmodus vom CC-Modus abgeleitet ist. Wir können dies tun, indem wir prüfen, ob dies c-buffer-is-cc-modenicht der Fall ist nil:

(defun my-cc-mode-before-save-hook ()
  (when c-buffer-is-cc-mode
    (message "Saving a buffer with a major-mode derived from CC Mode.")))
Konstantin
quelle
18

Alternativ können Sie einen lokalen Hook verwenden:

(add-hook 'c++-mode-hook
          (lambda () (add-hook 'before-save-hook MY-HOOK-FUNC nil 'local)))

Dies erhöht MY-HOOK-FUNCden Pufferlokal before-save-hook jedes C ++ - Moduspuffers oder eines beliebigen Puffers in einem vom C ++ - Modus abgeleiteten Modus.

Ich finde das eleganter als das explizite Überprüfen major-mode, und es hat den Vorteil, dass Sie das before-save-hook lokal für jeden Puffer deaktivieren können, M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)ohne andere Puffer zu beeinflussen.

Mondhorn
quelle
-1

Ich brauchte einmal so etwas, um meine Elisp-Dateien beim Speichern automatisch zu kompilieren. Ich habe einen Ansatz wie diesen verwendet (den Ansatz in den CC-Modus konvertiert):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))
user3672638
quelle
1
Meinten Sie zuerst c-mode-common-hook? Zweitens sieht es so aus, als würde die Funktion before-save-hookbeim ersten Eingeben einer Cverwandten Sprache hinzugefügt, aber diese Funktion wird dann kurz vor jedem Speichern in jedem Puffer aufgerufen. Was OP tun muss, ist die Funktion auszuführen, die davon abhängig ist, dass sich der Puffer in einem bestimmten Modus befindet (siehe @ Constantines Kommentar, wie).
Dan