Ich möchte anpassen cc-mode
, um eine Funktion vor dem Speichern auszuführen. Eine Lösung wäre, die cc-mode
Keymap so zu ändern , dass sie C-x C-s
an 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-hook
spezielles 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, advice
s zu verwenden?
before-save-hook
kann den aktuellen Hauptmodus (z. B.(eq major-mode ...)
) überprüfen und nichts tun, wenn er nicht mit dem von Ihnen angepassten Modus übereinstimmt.haskell-mode
hat mindestens einenafter/before-save
Haken und ich nahm an, dass dies Standardpraxis für Prog-Modi war.after-save-hook
; Sie können das gleiche Verfahren anwenden, aber ersetzenbefore-save-hook
.Antworten:
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++-mode
folgenden Elementen gespeichert werden :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-mode
nicht der Fall istnil
:quelle
Alternativ können Sie einen lokalen Hook verwenden:
Dies erhöht
MY-HOOK-FUNC
den Pufferlokalbefore-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 dasbefore-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.quelle
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):
quelle
c-mode-common-hook
? Zweitens sieht es so aus, als würde die Funktionbefore-save-hook
beim ersten Eingeben einerC
verwandten 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).