как я понял бы это?
Я добавил delete-trailing-whitespace
к before-save-hook
в моем c-mode-common-hook
, но это похоже delete-trailing-whitespace
становится требовавшимся каждый файл, не только буферизует c-режим использования и производные.
Я могу сделать before-save-hook
локальный буфер?
Вместо этого добавьте его в write-contents-functions
:
(add-hook 'c-mode-common-hook
(lambda()
(add-hook 'write-contents-functions
(lambda()
(save-excursion
(delete-trailing-whitespace)))
nil t)))
As Справочное руководство Emacs Lisp объясняет:
Это работает так же, как и функции записи файла, но предназначено для ловушек, которые относятся к содержимое буфера, а не конкретный посещенный файл или его расположение. Такие крючки бывают обычно устанавливаются основными режимами как привязки этой переменной к локальному буферу. Эта переменная автоматически становится локальным в буфере всякий раз, когда он установлен; переход в новый основной режим всегда сбрасывает эту переменную, но вызов set-visit-file-name - нет.
Это правильно работает для меня в Emacs 24.2.1 (т. е. удаляет все конечные пробелы из файлов C, но сохраняет конечные пробелы во всех других типах файлов ).
Никогда не хотел делать это раньше, но это должно работать:
(set (make-local-variable 'before-save-hook) '((lambda() (rg-msg "foobie"))))
Обычно Ch v запрашивает имя переменной и отображает описание, сообщающее, является ли переменная локальной для буфера.
before-save-hook - переменная, определенная в `files.el '. Его значение равно nil
Эта переменная потенциально опасна. при использовании в качестве локальной переменной файла.
Документация: Обычный запускаемый обработчик перед сохранением буфера в свой файл.
Вы можете настроить эту переменную.
vs.
next-error-function - это переменная определено в `simple.el '. Его ценность nil
Автоматически становится локальным в буфере при установке любым способом. Эта переменная потенциально опасна, когда используется как локальная переменная файла.
Документация: Функция для поиска следующая ошибка в текущем буфере. Функция вызывается с 2 параметры:
[...]
Вместо этого используйте функцию записи контента-функции
:
write-contents-functions is a variable defined in `files.el'.
Its value is nil
Automatically becomes buffer-local when set in any fashion.
Documentation:
List of functions to be called before writing out a buffer to a file.
If one of them returns non-nil, the file is considered already written
and the rest are not called and neither are the functions in
`write-file-functions'.
This variable is meant to be used for hooks that pertain to the
buffer's contents, not to the particular visited file; thus,
`set-visited-file-name' does not clear this variable; but changing the
major mode does clear it.
For hooks that _do_ pertain to the particular visited file, use
`write-file-functions'. Both this variable and
`write-file-functions' relate to how a buffer is saved to file.
To perform various checks or updates before the buffer is saved,
use `before-save-hook'.
Вы должны создать обёртку для вызова delete-trailing-whitespace
, так как вы хотите убедиться, что вы вернёте nil
из обёртки, так что дальнейшая обработка (и возможное сохранение) произойдёт.