Chcę dostosować, cc-mode
aby wykonać funkcję przed zapisaniem. Jednym z rozwiązań byłoby zmodyfikowanie cc-mode
mapy klawiszy w celu powiązania C-x C-s
z funkcją, która wykonuje pracę, której potrzebuję, a następnie zapisuje ją.
Moje pytanie brzmi, czy istnieje hak, który mogę dostosować do tego? Dokumenty CC Hooks nie wspominają o before-save-hook
konkretnym cc-mode
. Jak to zrobić przez hak?
Alternatywnie, jak to zrobić defadvice
? Z lektury instrukcji mogłem zobaczyć tylko włączenie porady przed zapisaniem, a następnie wyłączenie po zakończeniu pracy. Brzmi nieporęcznie. Jaki byłby idiomatyczny sposób używania advice
s?
before-save-hook
może sprawdzić bieżący tryb główny (np.(eq major-mode ...)
) I nic nie robić, jeśli nie pasuje do dostosowywanego trybu.haskell-mode
ma co najmniej jedenafter/before-save
haczyk i założyłem, że była to standardowa praktyka dla trybów progresywnych.after-save-hook
; możesz użyć tego samego rodzaju procedury, ale zastąpićbefore-save-hook
.Odpowiedzi:
Jednym z dość powszechnych sposobów ograniczania działania haka do określonego trybu głównego jest sprawdzenie wartości
major-mode
.Na przykład ten hak drukuje komunikat przed zapisaniem buforów przy użyciu
c++-mode
:Na marginesie: czasami przydatne może być sprawdzenie, czy tryb główny pochodzi z trybu CC; możemy to zrobić, sprawdzając, czy
c-buffer-is-cc-mode
nienil
:źródło
Alternatywnie użyj lokalnego haka:
To dodaje
MY-HOOK-FUNC
do lokalnegobefore-save-hook
bufora każdego bufora trybu C ++ lub dowolnego bufora w trybie pochodzącym z trybu C ++.Uważam to za bardziej eleganckie niż jawne sprawdzanie
major-mode
i ma tę zaletę, że możesz wyłączyćbefore-save-hook
lokalnie dla każdego buforaM-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)
bez wpływu na inne bufory.źródło
Kiedyś potrzebowałem czegoś takiego do autokompilacji moich plików elisp po zapisaniu, użyłem takiego podejścia (przekonwertowałem podejście do trybu CC):
źródło
c-mode-common-hook
? Po drugie, wygląda na to, że doda funkcję dobefore-save-hook
pierwszego wpisaniaC
języka związanego z, ale wtedy ta funkcja będzie wywoływana tuż przed każdym zapisaniem w każdym buforze. To, co OP musi zrobić, to uruchomić funkcję pod warunkiem, że bufor będzie w określonym trybie (zobacz komentarz @ Constantine, jak to zrobić).