Spec-Zone.ru › Elisp

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

Сокращения обычно расширяются определенными интерактивными командами, включая 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API