avant de sauvegarder le crochet pour le mode cc

13

Je souhaite personnaliser cc-modepour exécuter une fonction avant d'enregistrer. Une solution serait de modifier le cc-modekeymap pour le lier C-x C-sà une fonction qui effectue le travail dont j'ai besoin puis l'enregistre.

Ma question est de savoir s'il existe un crochet que je pourrais personnaliser pour cela? Les documents CC Hooks ne mentionnent pas before-save-hookspécifiquement pour cc-mode. Comment cela devrait-il être fait à l'aide d'un crochet?

Sinon, comment dois-je procéder defadvice? En lisant le manuel, la seule façon que j'ai pu voir était d'activer les conseils avant d'enregistrer puis de les désactiver une fois le travail terminé. Cela semble lourd. Quelle serait la façon idiomatique d'utiliser advices?

Pradhan
la source
3
La fonction à laquelle vous ajoutez before-save-hookpeut vérifier le mode principal actuel (par exemple (eq major-mode ...)) et ne rien faire si elle ne correspond pas au mode que vous personnalisez.
Constantine
@Constantine a accepté. Je voulais vérifier s'il y avait quelque chose de plus «intégré» pour ce genre de chose. IIRC haskell-modea au moins un des after/before-savecrochets et j'ai supposé que c'était la pratique standard pour les modes prog.
Pradhan
@Constantine: pourriez-vous convertir votre commentaire en réponse (en développant un peu, bien sûr)?
Dan
1
Voir ce fil pour un exemple d'utilisation de after-save-hook; vous pouvez utiliser le même type de procédure mais le remplacer before-save-hook.
Dan

Réponses:

12

Une façon assez courante de restreindre l'action d'un hook à un mode majeur particulier consiste à vérifier la valeur de major-mode.

Par exemple, ce hook imprime un message avant d'enregistrer les tampons en utilisant c++-mode:

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

En remarque: il peut parfois être utile de vérifier si un mode majeur est dérivé du mode CC; nous pouvons le faire en vérifiant si ce c-buffer-is-cc-moden'est pas le cas 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.")))
Constantine
la source
19

Vous pouvez également utiliser un hook local:

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

Cela ajoute MY-HOOK-FUNCà la mémoire tampon locale before-save-hook de chaque tampon en mode C ++, ou à tout tampon dans un mode dérivé du mode C ++.

Je trouve cela plus élégant que la vérification explicite major-mode, et cela a l'avantage que vous pouvez désactiver before-save-hook localement pour chaque tampon M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)sans affecter les autres tampons.

lunaryorn
la source
-1

Une fois, j'avais besoin de quelque chose comme ça pour compiler automatiquement mes fichiers elisp lors de l'enregistrement, j'ai utilisé une approche comme celle-ci (converti l'approche en mode cc):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))
user3672638
la source
1
D'abord, tu voulais dire c-mode-common-hook? Deuxièmement, il semble que la fonction sera ajoutée la before-save-hookpremière fois que vous entrerez dans une Clangue liée, mais cette fonction sera appelée juste avant chaque sauvegarde sur chaque tampon. Ce que l'OP doit faire est d'exécuter la fonction à condition que le tampon soit dans un mode spécifique (voir le commentaire de @ Constantine pour savoir comment).
Dan