24.7.1 Основы Font Lock

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

font-lock-fontify-buffer

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

font-lock-unfontify-buffer

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

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

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

font-lock-unfontify-region beg end

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

font-lock-flush &optional beg end

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

font-lock-ensure &optional beg end

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

font-lock-debug-fontify

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

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

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

Эта переменная устанавливается режимами для указания, как выполнять fontification текста в этом режиме. Она автоматически становится буферо-локальной при установке. Если ее значение равно nil, режим Font Lock не выполняет выделения.

Если она не равна nil, ее значение должно выглядеть так:

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

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

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

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

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

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

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