Сокращения обычно расширяются с помощью определенных интерактивных команд,
включая self-insert-command. В этом разделе описываются
подпрограммы, используемые при написании таких команд, а также переменные,
которые они используют для связи.
Эта функция возвращает символ, представляющий сокращение с именем
abbrev. Она возвращает nil, если это сокращение
не определено. Необязательный второй аргумент table — это
таблица сокращений, в которой нужно выполнить поиск. Если table
равен nil, эта функция сначала пытается найти его в локальной
таблице сокращений текущего буфера, а затем в глобальной таблице сокращений.
Эта функция возвращает строку, в которую abbrev будет
расширена (как определено в таблицах сокращений, используемых для текущего
буфера). Она возвращает nil, если abbrev
не является допустимым сокращением. Необязательный аргумент table
указывает таблицу сокращений для использования, как и в abbrev-symbol.
Эта команда расширяет сокращение перед точкой, если оно есть. Если
точка не следует за сокращением, эта команда ничего не делает. Для выполнения
расширения она вызывает функцию, являющуюся значением переменной
abbrev-expand-function, без аргументов, и возвращает то,
что делает эта функция.
Функция расширения по умолчанию возвращает символ сокращения, если она
была расширена, и nil в противном случае. Если у символа
сокращения есть функция хука, которая является символом, свойство которого
no-self-insert не равно nil, и если функция
хука возвращает nil в качестве своего значения, то функция
расширения по умолчанию возвращает nil, даже если
расширение произошло.
Эта функция вставляет расширение сокращения abbrev,
заменяя текст между start и end. Если
start опущен, по умолчанию используется точка. name,
если не nil, должен быть именем, по которому было найдено
это сокращение (строка); он используется для определения, следует ли
изменять регистр расширения. Функция возвращает abbrev, если
сокращение было успешно вставлено, в противном случае возвращает nil.
Эта команда отмечает текущее положение точки как начало сокращения. Следующий
вызов expand-abbrev будет использовать текст отсюда до
точки (где она находится в данный момент) в качестве сокращения для расширения,
вместо того чтобы использовать предыдущее слово, как обычно.
Сначала эта команда расширяет любое сокращение перед точкой, если arg
не равен nil. (В интерактивном режиме arg — это
аргумент префикса.) Затем она вставляет дефис перед точкой, чтобы указать начало
следующего сокращения для расширения. Фактическое расширение удаляет дефис.
Когда это установлено не nil, сокращение, введенное полностью
заглавными буквами, расширяется с использованием полностью заглавных букв. В
противоположном случае сокращение, введенное полностью заглавными буквами,
расширяется путем капитализации каждого слова расширения.
Значение этой переменной — это позиция буфера (целое число или маркер),
которую expand-abbrev использует в качестве начала следующего
сокращения для расширения. Значение также может быть nil, что
означает использование слова перед точкой. abbrev-start-location
сбрасывается в nil каждый раз, когда вызывается expand-abbrev.
Эта переменная также устанавливается abbrev-prefix-mark.
Значение этой переменной — это буфер, для которого было установлено
abbrev-start-location. Попытка расширить сокращение в любом
другом буфере очищает abbrev-start-location. Эта переменная
устанавливается abbrev-prefix-mark.
Это abbrev-symbol последнего расширенного сокращения.
Эта информация сохраняется expand-abbrev для команды
unexpand-abbrev (см. Расширение
сокращений в Руководство GNU Emacs).
Это местоположение последнего расширенного сокращения. Эта информация
сохраняется expand-abbrev для команды
unexpand-abbrev.
Это точный текст расширения последнего расширенного сокращения, после
преобразования регистра (если таковое имело место). Его значение равно nil, если сокращение уже было отменено расширения. Эта
информация сохраняется expand-abbrev для команды
unexpand-abbrev.
Значение этой переменной — это функция, которую expand-abbrev
вызовет без аргументов для выполнения расширения. Функция может делать все, что
захочет, до и после выполнения расширения.
Она должна вернуть символ сокращения, если расширение произошло.
Приведенный ниже пример кода демонстрирует простое использование
abbrev-expand-function. Предполагается, что foo-mode
— это режим для редактирования определенных файлов, в которых строки, начинающиеся
с символа '#', являются комментариями. Вы хотите использовать сокращения
в режиме Text для этих строк. Регулярная локальная таблица сокращений,
foo-mode-abbrev-table, подходит для всех остальных строк. См.
Стандартные таблицы сокращений,
для определений local-abbrev-table и text-mode-abbrev-table.
См. Функции консультирования Emacs Lisp,
для подробностей о add-function.
(defun foo-mode-abbrev-expand-function (expand)
(if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
;; Выполняет обычное расширение.
(funcall expand)
;; Мы внутри комментария: используем сокращения режима Text.
(let ((local-abbrev-table text-mode-abbrev-table))
(funcall expand))))
(add-hook 'foo-mode-hook
(lambda ()
(add-function :around (local 'abbrev-expand-function)
#'foo-mode-abbrev-expand-function)))