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 из оболочки, чтобы иметь место дальнейшая обработка (и возможное сохранение).