Помимо простой синтаксической подсветки и подсветки на основе регулярных выражений, Emacs также предоставляет полную синтаксическую подсветку с помощью синтаксического анализатора. В настоящее время Emacs использует для этой цели библиотеку tree-sitter (см. Разбор исходного кода программ).
Подсветка на основе синтаксического анализатора и другие механизмы подсветки не являются взаимоисключающими. По умолчанию, если она включена, подсветка на основе синтаксического анализатора выполняется первой, заменяя синтаксическую подсветку, за ней следует подсветка на основе регулярных выражений.
Хотя подсветка на основе синтаксического анализатора не использует те же переменные настройки, что и подсветка на основе регулярных выражений, она использует аналогичные схемы настройки. Аналогом font-lock-keywords в tree-sitter является treesit-font-lock-settings.
В общем случае подсветка с помощью tree-sitter работает следующим образом:
font-lock-keyword, будет подсвечен шрифтом font-lock-keyword.
Дополнительную информацию о запросах, шаблонах и именах захвата см. в Сопоставление с шаблоном узлов Tree-sitter.
Для настройки подсветки с помощью tree-sitter основной режим должен сначала установить treesit-font-lock-settings в значение, возвращаемое treesit-font-lock-rules, а затем вызвать treesit-major-mode-setup.
Эта функция используется для установки treesit-font-lock-settings. Она занимается компиляцией запросов и другой постобработкой и выводит значение, которое принимает treesit-font-lock-settings. Вот пример:
(treesit-font-lock-rules :language 'javascript :feature 'constant :override t '((true) @font-lock-constant-face (false) @font-lock-constant-face) :language 'html :feature 'script "(script_element) @font-lock-builtin-face")
Эта функция принимает серию query-spec, где каждый query-spec представляет собой query, перед которым стоит одна или несколько пар keyword/value. Каждый query представляет собой запрос tree-sitter в строковой, s-выраженческой или скомпилированной форме.
Для каждого query пары keyword/value, предшествующие ему, добавляют к нему метаинформацию. Ключевое слово :language объявляет язык query. Ключевое слово :feature задает имя возможности query. Пользователи могут управлять тем, какие возможности включены, с помощью treesit-font-lock-level и treesit-font-lock-feature-list (описаны ниже). Эти два ключевых слова обязательны (с исключениями).
Другие ключевые слова необязательны:
| Ключевое слово | Значение | Описание |
|---|---|---|
:override | nil | Если область уже имеет шрифт, отбросить новый шрифт |
t | Всегда применять новый шрифт | |
append | Добавить новый шрифт к существующим | |
prepend | Вставить новый шрифт перед существующими | |
keep | Заполнить области без существующего шрифта | |
:default-language | language | Каждый query после этого ключевого слова будет использовать language по умолчанию. |
Программы на Lisp помечают шаблоны в query именами захвата (именами, начинающимися с @), и tree-sitter вернет сопоставленные узлы, помеченные теми же именами захвата. Для целей подсветки имена захвата в query должны быть именами шрифтов, такими как font-lock-keyword-face. Захваченный узел будет подсвечен этим шрифтом.
Имя захвата также может быть именем функции, в этом случае функция вызывается с 4 аргументами: node и override, start и end, где node — это сам узел, override — это свойство :override правила, которое захватило этот узел, а start и end ограничивают область, которую эта функция должна подсвечивать. (Если эта функция хочет учитывать аргумент override, она может использовать treesit-fontify-with-override.)
Помимо представленных 4 аргументов, эта функция должна принимать больше аргументов в качестве необязательных для будущей расширяемости.
Если имя захвата является одновременно и шрифтом, и функцией, приоритет имеет шрифт. Если имя захвата не является ни шрифтом, ни функцией, оно игнорируется.
Это список списков символов возможностей. Каждый элемент списка представляет собой список, соответствующий уровню оформления. treesit-font-lock-level управляет тем, какие уровни активированы.
Каждый элемент списка имеет вид (feature …), где каждый feature соответствует значению :feature запроса, определенного в treesit-font-lock-rules. Удаление символа возможности из этого списка отключает соответствующий запрос во время подсветки.
Общие имена возможностей для многих языков программирования включают definition, type, assignment, builtin, constant, keyword, string-interpolation, comment, doc, string, operator, preprocessor, escape-sequence и key. Основные режимы могут свободно подразделять или расширять эти общие возможности.
Некоторые из этих возможностей заслуживают пояснения: definition подсвечивает то, что определяется, например, имя функции в определении функции, имя структуры в определении структуры, имя переменной в определении переменной; assignment подсвечивает то, чему присваивается значение, например, переменную или поле в операторе присваивания; key подсвечивает ключи в парах ключ-значение, например, ключи в объекте JSON или словаре Python; doc подсвечивает строки документации или комментарии-документацию.
Например, значение этой переменной может быть таким:
((comment string doc) ; уровень 1 (function-name keyword type builtin constant) ; уровень 2 (variable-name string-interpolation key)) ; уровень 3
Основные режимы должны устанавливать эту переменную перед вызовом treesit-major-mode-setup.
Для того чтобы эта переменная вступила в силу, программа на Lisp должна вызвать treesit-font-lock-recompute-features (которая соответствующим образом сбрасывает treesit-font-lock-settings) или treesit-major-mode-setup (которая вызывает treesit-font-lock-recompute-features).
Список настроек для подсветки на основе tree-sitter. Точный формат каждой настройки считается внутренним. Для установки этой переменной всегда следует использовать treesit-font-lock-rules.
Многоязыковые основные режимы должны предоставлять функции диапазонов в treesit-range-functions, и Emacs соответствующим образом установит диапазоны перед подсветкой области (см. Разбор текста на нескольких языках).