Emacs: есть ли перед собой-save-hook локальная переменная?
как бы я понял это?
Я добавил delete-trailing-whitespace
в before-save-hook
в my c-mode-common-hook
, но похоже, что delete-trailing-whitespace
получает вызов для каждого файла, а не только для буферов с использованием c-mode и производных.
Можно ли создать локальный буфер before-save-hook
?
Ответы
Ответ 1
Добавьте вместо этого write-contents-functions
:
(add-hook 'c-mode-common-hook
(lambda()
(add-hook 'write-contents-functions
(lambda()
(save-excursion
(delete-trailing-whitespace)))
nil t)))
В Справочном руководстве Emacs Lisp объясняется:
Это работает так же, как write-file-functions, но оно предназначено для перехватов, относящихся к содержимое буфера, а не конкретный посещенный файл или его местоположение. Такие крючки обычно устанавливаемых основными режимами, в качестве буферных локальных привязок для этой переменной. Эта переменная автоматически становится буфер-локальным всякий раз, когда он установлен; переход в новый основной режим всегда сбрасывает эту переменную, но вызов set-visited-file-name не выполняется.
Это правильно работает для меня в Emacs 24.2.1 (т.е. удаляет все конечные пробелы из файлов C, но сохраняет конечные пробелы во всех других типах файлов).
Ответ 2
Нет, переменная before-save-hook
не является естественным буфером локального. Документация переменных не говорит о том, что он является локальным буфером или говорит, что он автоматически станет локальным буфером при установке.
Если вы хотите добавить к нему локальный буфер-буфер, правильный способ сделать это - просто использовать необязательный параметр LOCAL стандартной функции add-hook
:
(add-hook 'before-save-hook 'foo nil t)
В документации по дополнительным крючкам говорится:
Необязательный четвертый аргумент, LOCAL, если не ноль, говорит, чтобы изменить локальное значение буфера-буфера, а не его глобальное значение. Это делает буфер крюка локальным и делает его членом буфер-локальное значение. Это действует как флаг для запуска крюка функции как глобального значения, так и локального значения.
Выбранный ответ, чтобы добавить его в local-write-file-hooks
, я считаю неверным. Если вы посмотрите на документацию для этой функции, то на emacs 24.3 указано, что переменная устарела с 22.1, и вы должны использовать write-file-functions
. И если вы просматриваете документацию write-file-functions
, она описывает более сложное поведение и в конце говорит: "Чтобы выполнять различные проверки или обновления до сохранения буфера, используйте" before-save-hook "".
Ответ 3
Никогда не хотел этого делать раньше, но это должно работать:
(set (make-local-variable 'before-save-hook) '((lambda() (rg-msg "foobie"))))
В общем случае C-h v запрашивает имя переменной и отображает описание, указывающее, является ли var локальным буфером.
before-save-hook - это переменная, определенная в `files.el '. Его значение равно nil
Эта переменная потенциально опасна при использовании в качестве локальной переменной файла.
Документация: выполняется обычный крючок прежде чем буфер будет сохранен в его файле.
Вы можете настроить эту переменную.
против.
next-error-function - переменная определенный в `simple.el '. Его значение ноль
Автоматически становится буферно-локальным когда они установлены любым способом. Эта переменная потенциально опасна, когда используется как локальная переменная файла.
Документация: функция, используемая для поиска следующая ошибка в текущем буфере. Функция вызывается с помощью 2 Параметры:
[...]
Ответ 4
Вместо этого используйте write-contents-function
:
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 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
из оболочки, чтобы иметь место дальнейшая обработка (и возможное сохранение).