Поиск и расширение сокращений
Сокращения обычно расширяются определенными интерактивными командами, включая 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 — это режим редактирования определённых файлов, в которых строки, начинающиеся с «#», являются комментариями. Вы хотите использовать сокращения режима «Текст» для этих строк. Обычная локальная таблица сокращений foo-mode-abbrev-table подходит для всех остальных строк. См. Стандартные таблицы сокращений для определений local-abbrev-table и text-mode-abbrev-table. См. Функции консультирования для подробностей о add-function.
(defun foo-mode-abbrev-expand-function (expand)
(if (not (save-excursion (forward-line 0) (eq (char-after) ?#)))
;; Performs normal expansion.
(funcall expand)
;; We're inside a comment: use the text-mode abbrevs.
(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)))
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Abbrev-Expansion.html