39.4 Поиск и расширение сокращений

Сокращения обычно расширяются с помощью определенных интерактивных команд, включая self-insert-command. В этом разделе описываются подпрограммы, используемые при написании таких команд, а также переменные, которые они используют для связи.

Функция: abbrev-symbol abbrev &optional table

Эта функция возвращает символ, представляющий сокращение с именем abbrev. Она возвращает nil, если это сокращение не определено. Необязательный второй аргумент table — это таблица сокращений, в которой нужно выполнить поиск. Если table равен nil, эта функция сначала пытается найти его в локальной таблице сокращений текущего буфера, а затем в глобальной таблице сокращений.

Функция: abbrev-expansion abbrev &optional table

Эта функция возвращает строку, в которую abbrev будет расширена (как определено в таблицах сокращений, используемых для текущего буфера). Она возвращает nil, если abbrev не является допустимым сокращением. Необязательный аргумент table указывает таблицу сокращений для использования, как и в abbrev-symbol.

Команда: expand-abbrev

Эта команда расширяет сокращение перед точкой, если оно есть. Если точка не следует за сокращением, эта команда ничего не делает. Для выполнения расширения она вызывает функцию, являющуюся значением переменной abbrev-expand-function, без аргументов, и возвращает то, что делает эта функция.

Функция расширения по умолчанию возвращает символ сокращения, если она была расширена, и nil в противном случае. Если у символа сокращения есть функция хука, которая является символом, свойство которого no-self-insert не равно nil, и если функция хука возвращает nil в качестве своего значения, то функция расширения по умолчанию возвращает nil, даже если расширение произошло.

Функция: abbrev-insert abbrev &optional name start end

Эта функция вставляет расширение сокращения abbrev, заменяя текст между start и end. Если start опущен, по умолчанию используется точка. name, если не nil, должен быть именем, по которому было найдено это сокращение (строка); он используется для определения, следует ли изменять регистр расширения. Функция возвращает abbrev, если сокращение было успешно вставлено, в противном случае возвращает nil.

Команда: abbrev-prefix-mark &optional arg

Эта команда отмечает текущее положение точки как начало сокращения. Следующий вызов expand-abbrev будет использовать текст отсюда до точки (где она находится в данный момент) в качестве сокращения для расширения, вместо того чтобы использовать предыдущее слово, как обычно.

Сначала эта команда расширяет любое сокращение перед точкой, если arg не равен nil. (В интерактивном режиме arg — это аргумент префикса.) Затем она вставляет дефис перед точкой, чтобы указать начало следующего сокращения для расширения. Фактическое расширение удаляет дефис.

Пользовательский вариант: abbrev-all-caps

Когда это установлено не nil, сокращение, введенное полностью заглавными буквами, расширяется с использованием полностью заглавных букв. В противоположном случае сокращение, введенное полностью заглавными буквами, расширяется путем капитализации каждого слова расширения.

Переменная: abbrev-start-location

Значение этой переменной — это позиция буфера (целое число или маркер), которую expand-abbrev использует в качестве начала следующего сокращения для расширения. Значение также может быть nil, что означает использование слова перед точкой. abbrev-start-location сбрасывается в nil каждый раз, когда вызывается expand-abbrev. Эта переменная также устанавливается abbrev-prefix-mark.

Переменная: abbrev-start-location-buffer

Значение этой переменной — это буфер, для которого было установлено abbrev-start-location. Попытка расширить сокращение в любом другом буфере очищает abbrev-start-location. Эта переменная устанавливается abbrev-prefix-mark.

Переменная: last-abbrev

Это abbrev-symbol последнего расширенного сокращения. Эта информация сохраняется expand-abbrev для команды unexpand-abbrev (см. Расширение сокращений в Руководство GNU Emacs).

Переменная: last-abbrev-location

Это местоположение последнего расширенного сокращения. Эта информация сохраняется expand-abbrev для команды unexpand-abbrev.

Переменная: last-abbrev-text

Это точный текст расширения последнего расширенного сокращения, после преобразования регистра (если таковое имело место). Его значение равно nil, если сокращение уже было отменено расширения. Эта информация сохраняется expand-abbrev для команды unexpand-abbrev.

Переменная: abbrev-expand-function

Значение этой переменной — это функция, которую 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)))