Spec-Zone.ru › Elisp

Основы Font Lock

Функциональность Font Lock основана на нескольких базовых функциях. Каждая из них вызывает функцию, указанную соответствующей переменной. Такое косвенное обращение позволяет основным и второстепенным режимам изменять способ раскраски текста в буферах этого режима и даже использовать механизмы Font Lock для функций, не связанных с раскраской текста. (Именно поэтому в описаниях ниже при описании действий функций используется слово «должна»: режим может настроить значения соответствующих переменных так, чтобы они выполняли совершенно другие действия.) Переменные, упомянутые ниже, описаны в разделе Другие переменные Font Lock.

font-lock-fontify-buffer

Эта функция должна раскрасить доступную часть текущего буфера, вызвав функцию, указанную в font-lock-fontify-buffer-function.

font-lock-unfontify-buffer

Используется для удаления раскраски при отключении Font Lock. Вызывает функцию, указанную в font-lock-unfontify-buffer-function.

font-lock-fontify-region beg end &optional loudly

Должна раскрасить область между beg и end. Если loudly не равно nil, во время раскраски должны отображаться сообщения о состоянии. Вызывает функцию, указанную в font-lock-fontify-region-function.

font-lock-unfontify-region beg end

Должна удалить раскраску из области между beg и end. Вызывает функцию, указанную в font-lock-unfontify-region-function.

font-lock-flush &optional beg end

Эта функция должна пометить раскраску области между beg и end как устаревшую. Если аргументы не указаны или равны nil, beg и end по умолчанию принимают значения начала и конца доступной части буфера. Вызывает функцию, указанную в font-lock-flush-function.

font-lock-ensure &optional beg end

Эта функция должна удостовериться, что область между beg и end раскрашена. Необязательные аргументы beg и end по умолчанию принимают значения начала и конца доступной части буфера. Вызывает функцию, указанную в font-lock-ensure-function.

font-lock-debug-fontify

Эта вспомогательная команда предназначена для разработки подсветки синтаксиса в режиме и не должна вызываться из кода Lisp. Она заново вычисляет все соответствующие переменные, а затем вызывает font-lock-fontify-region для всего буфера.

Существует несколько переменных, управляющих тем, как режим Font Lock выделяет текст. Однако основные режимы не должны задавать значения этих переменных напрямую. Вместо этого им следует устанавливать font-lock-defaults как локальную переменную буфера. Присвоенное этой переменной значение используется для установки всех остальных переменных при включении режима Font Lock.

Переменная: font-lock-defaults

Режимы задают этой переменной способ раскраски текста в данном режиме. При установке она автоматически становится локальной для буфера. Если её значение равно nil, режим Font Lock ничего не выделяет.

Если значение не равно nil, оно должно иметь следующий вид:

(keywords [keywords-only [case-fold
 [syntax-alist other-vars...]]])

Первый элемент, keywords, косвенно задаёт значение font-lock-keywords, определяющей раскраску на основе поиска. Это может быть символ, переменная или функция, значением которой является список, используемый для font-lock-keywords. Также это может быть список из нескольких таких символов — по одному для каждого возможного уровня раскраски. Первый символ задаёт уровень раскраски «mode default», следующий — уровень 1, затем уровень 2 и так далее. Уровень «mode default» обычно совпадает с уровнем 1. Он используется, когда font-lock-maximum-decoration имеет значение nil. См. раздел Уровни Font Lock.

Второй элемент, keywords-only, задаёт значение переменной font-lock-keywords-only. Если этот элемент опущен или равен nil, также выполняется синтаксическая раскраска (строк и комментариев). Если он не равен nil, синтаксическая раскраска не выполняется. См. раздел Синтаксическая раскраска Font Lock.

Третий элемент, case-fold, задаёт значение font-lock-keywords-case-fold-search. Если он не равен nil, при раскраске на основе поиска режим Font Lock не учитывает регистр.

Если четвёртый элемент, syntax-alist, не равен nil, он должен быть списком конс-ячеек вида (char-or-string . string). Они используются для настройки синтаксической таблицы во время раскраски; полученная синтаксическая таблица сохраняется в font-lock-syntax-table. Если syntax-alist опущен или равен nil, при раскраске используется синтаксическая таблица, возвращаемая функцией syntax-table. См. раздел Функции синтаксических таблиц.

Чаще всего syntax-alist используется для изменения синтаксиса нескольких символов: они становятся символами слова вместо символов, составляющих символ, чтобы правила раскраски могли использовать операторы регулярных выражений, основанные на границах слов. Если syntax-alist задаёт более существенные изменения, влияющие на распознавание строк или комментариев, это препятствует важной оптимизации синтаксической раскраски. Поэтому лучше либо не использовать такие настройки, либо дополнительно задавать syntax-ppss-table значение, не равное nil: оно имеет приоритет при синтаксической раскраске.

Все оставшиеся элементы (если они есть) вместе называются other-vars. Каждый из них должен иметь вид (variable . value) — это означает, что переменную variable следует сделать локальной для буфера и присвоить ей значение value. С помощью этих элементов other-vars можно задавать другие переменные, влияющие на раскраску, помимо тех, которыми можно управлять с помощью первых пяти элементов. См. раздел Другие переменные Font Lock.

Если ваш режим раскрашивает текст явно, добавляя свойства font-lock-face, он может указать (nil t) для font-lock-defaults, чтобы отключить всю автоматическую раскраску. Однако это необязательно: можно раскрашивать некоторые части текста с помощью свойств font-lock-face и настроить автоматическую раскраску для остальных частей.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Font-Lock-Basics.html

Spec-Zone.ru

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