Основы 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