Я хочу настроить cc-mode
выполнение функции перед сохранением. Одним из решений было бы модифицировать cc-mode
раскладку клавиш для привязки C-x C-s
к функции, которая выполняет нужную мне работу, а затем сохраняет ее.
У меня вопрос, есть ли крючок, который я мог бы настроить для этого? Документы CC Hooks не упоминают before-save-hook
специально для cc-mode
. Как это сделать через крючок?
В качестве альтернативы, как мне это сделать defadvice
? Из прочтения руководства я мог только увидеть, как включить совет перед сохранением, а затем отключить после завершения работы. Это звучит громоздко. Каков был бы идиоматический способ использования advice
s?
before-save-hook
может проверять текущий основной режим (например(eq major-mode ...)
) и ничего не делать, если он не соответствует настраиваемому вами режиму.haskell-mode
есть по крайней мере один изafter/before-save
хуков, и я предположил, что это стандартная практика для прог-режимов.after-save-hook
; Вы можете использовать ту же процедуру, но заменитьbefore-save-hook
.Ответы:
Одним из довольно распространенных способов ограничения действия ловушки для конкретного основного режима является проверка значения
major-mode
.Например, эта ловушка печатает сообщение перед сохранением буферов, используя
c++-mode
:В качестве примечания: иногда бывает полезно проверить, является ли основной режим производным от режима CC; мы можем сделать это, проверив, если
c-buffer-is-cc-mode
нетnil
:источник
В качестве альтернативы используйте локальный хук:
Это добавляет
MY-HOOK-FUNC
к локальномуbefore-save-hook
буферу каждого буфера режима C ++ или любого буфера в режиме, производном от режима C ++.Я нахожу это более элегантным, чем явная проверка
major-mode
, и у него есть то преимущество, что вы можете отключитьbefore-save-hook
локально для каждого буфера,M-: (remove-hook 'before-save-hook MY-HOOK-FUNC 'local)
не затрагивая другие буферы.источник
Когда-то мне нужно было что-то подобное для автоматической компиляции моих файлов elisp при сохранении, я использовал такой подход (преобразовал подход в cc-mode):
источник
c-mode-common-hook
? Во-вторых, похоже, что она добавит функциюbefore-save-hook
в первый раз, когда вы вводитеC
связанный язык, но затем эта функция будет вызываться непосредственно перед каждым сохранением в каждом буфере. OP должен выполнить условную функцию для буфера, находящегося в определенном режиме (см. Комментарий @ Constantine).