emacs: действительно ли before-save-hook является локальной переменной?

как я понял бы это?

Я добавил delete-trailing-whitespace к before-save-hook в моем c-mode-common-hook, но это похоже delete-trailing-whitespace становится требовавшимся каждый файл, не только буферизует c-режим использования и производные.

Я могу сделать before-save-hook локальный буфер?

11
задан Kevin Panko 19 December 2009 в 02:57
поделиться

3 ответа

Вместо этого добавьте его в 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, но сохраняет конечные пробелы во всех других типах файлов ).

20
ответ дан 3 December 2019 в 01:24
поделиться

Никогда не хотел делать это раньше, но это должно работать:

(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 параметры:

[...]

3
ответ дан 3 December 2019 в 01:24
поделиться

Вместо этого используйте функцию записи контента-функции:

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

.
0
ответ дан 3 December 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: