before-save-hook per cc-mode


13

Voglio personalizzare cc-modeper eseguire una funzione prima di salvare. Una soluzione sarebbe quella di modificare la cc-modemappa dei tasti per associarla C-x C-sa una funzione che esegue il lavoro di cui ho bisogno e quindi lo salva.

La mia domanda è se esiste un gancio che potrei personalizzare per questo? I documenti di CC Hooks non ne menzionano uno before-save-hookspecifico cc-mode. Come dovrebbe essere fatto attraverso un gancio?

In alternativa, come posso farlo defadvice? Dalla lettura del manuale, l'unico modo che ho potuto vedere è stato quello di abilitare i consigli prima di salvare e poi disabilitarli al termine del lavoro. Sembra ingombrante. Quale sarebbe il modo idiomatico di usare advices?


3
La funzione che aggiungi before-save-hookpuò controllare la modalità principale corrente (ad es. (eq major-mode ...)) E non fare nulla se non corrisponde alla modalità che stai personalizzando.
Costantino,

@Constantine Concordato. Volevo verificare se esiste qualcosa di più "integrato" per questo tipo di cose. IIRC haskell-modeha almeno uno di after/before-savehook e ho pensato che fosse una pratica standard per prog-mode.
Pradhan,

@Constantine: potresti convertire il tuo commento in una risposta (espandendo un po ', ovviamente)?
Dan

1
Vedi questa discussione per un esempio di utilizzo di after-save-hook; è possibile utilizzare lo stesso tipo di procedura ma sostituirlo before-save-hook.
Dan

Risposte:


12

Un modo abbastanza comune di limitare l'azione di un hook a una particolare modalità principale è verificare il valore di major-mode.

Ad esempio, questo hook stampa un messaggio prima di salvare i buffer usando 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)

Come nota a margine: a volte può essere utile verificare se una modalità principale deriva dalla modalità CC; possiamo farlo controllando se c-buffer-is-cc-modenon lo è 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.")))

19

In alternativa, utilizzare un hook locale:

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

Ciò si aggiunge MY-HOOK-FUNCal buffer locale before-save-hook di ciascun buffer della modalità C ++ o a qualsiasi buffer in una modalità derivata dalla modalità C ++.

Trovo questo più elegante che il controllo esplicito major-mode, e ha il vantaggio di poter disabilitare before-save-hook localmente per ogni buffer M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)senza influenzare altri buffer.


-1

Una volta avevo bisogno di qualcosa del genere per compilare automaticamente i miei file elisp quando sono stato salvato, ho usato un approccio come questo (convertito l'approccio in cc-mode):

(add-hook 'c-common-hook #'(lambda ()
                              (add-hook 'before-save-hook #'(lambda ()
                                                               (funcall #'YOUR-FUNC-HOOK)))))

1
Innanzitutto, volevi dire c-mode-common-hook? In secondo luogo, sembra che aggiungerà la funzione alla before-save-hookprima immissione di una Clingua correlata, ma tale funzione verrà chiamata appena prima di ogni salvataggio su ogni buffer. Ciò che OP deve fare è eseguire la funzione in base alla condizione del buffer in una modalità specifica (vedere il commento di @ Constantine per come).
Dan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.