Разработка основных режимов с tree-sitter
В этом разделе приведены общие рекомендации по разработке интеграции tree-sitter для основного режима.
Основной режим с поддержкой функций tree-sitter должен примерно соответствовать следующему шаблону:
(define-derived-mode woomy-mode prog-mode "Woomy"
"A mode for Woomy programming language."
(when (treesit-ready-p 'woomy)
(setq-local treesit-variables ...)
...
(treesit-major-mode-setup)))
treesit-ready-p автоматически выводит предупреждение, если условия для включения tree-sitter не выполнены.
Если основной режим tree-sitter использует общую настройку со своим «обычным» аналогом, можно создать «базовый режим», содержащий общую настройку, например:
(define-derived-mode woomy--base-mode prog-mode "Woomy" "An internal mode for Woomy programming language." (common-setup) ...)
(define-derived-mode woomy-mode woomy--base-mode "Woomy" "A mode for Woomy programming language." (native-setup) ...)
(define-derived-mode woomy-ts-mode woomy--base-mode "Woomy"
"A mode for Woomy programming language."
(when (treesit-ready-p 'woomy)
(setq-local treesit-variables ...)
...
(treesit-major-mode-setup)))
- Функция: treesit-ready-p language &optional quiet
-
Эта функция проверяет выполнение условий для активации tree-sitter. Она проверяет, была ли Emacs собрана с поддержкой tree-sitter, не слишком ли велик размер буфера для обработки tree-sitter и доступна ли в системе грамматика для language (см. Грамматика языка Tree-sitter).
Эта функция выводит предупреждение, если tree-sitter не удаётся активировать. Если quiet равно
message, предупреждение преобразуется в сообщение; если quiet равноt, предупреждение или сообщение не выводится.Если выполнены все необходимые условия, функция возвращает не-
nil; в противном случае она возвращаетnil.
- Функция: treesit-major-mode-setup
-
Эта функция активирует некоторые функции tree-sitter для основного режима.
В настоящее время она настраивает следующие функции:
- Если
treesit-font-lock-settings(см. Раскраска шрифта на основе синтаксического анализатора) не равноnil, функция настраивает раскраску текста. - Если
treesit-simple-indent-rulesилиtreesit-indent-function(см. Отступы на основе синтаксического анализатора) не равноnil, функция настраивает отступы. - Если
treesit-defun-type-regexpне равноnil, функция настраивает функции навигации дляbeginning-of-defunиend-of-defun. См. Перемещение по сбалансированным выражениям. - Если
treesit-defun-name-functionне равноnil, функция настраивает функции add-log, используемыеadd-log-current-defun. - Если
treesit-simple-imenu-settings(см. Imenu) не равноnil, функция настраивает Imenu. - Если
treesit-outline-predicate(см. Вспомогательный режим Outline) не равноnil, функция настраивает вспомогательный режим Outline. - Если
sexpи/илиsentenceопределены вtreesit-thing-settings(см. Определяемые пользователем «вещи» и навигация), функция включает команды навигации для перемещения соответственно по sexp и предложениям, определяя такие переменные, какforward-sexp-functionиforward-sentence-function.
- Если
Подробнее о встроенных функциях tree-sitter см. в разделах Раскраска шрифта на основе синтаксического анализатора, Отступы на основе синтаксического анализатора и Перемещение по сбалансированным выражениям.
О поддержке смешивания нескольких языков в основном режиме см. в разделе Синтаксический разбор текста на нескольких языках.
Помимо beginning-of-defun и end-of-defun, Emacs предоставляет несколько дополнительных функций для работы с defun: treesit-defun-at-point возвращает узел defun в точке, а treesit-defun-name возвращает имя узла defun.
- Функция: treesit-defun-at-point
-
Эта функция возвращает узел defun в точке или
nil, если такой узел не найден. Она учитываетtreesit-defun-tactic: если его значение равноtop-level, функция возвращает defun верхнего уровня, а если его значение равноnested, возвращает непосредственно охватывающий defun.Для работы этой функции требуется
treesit-defun-type-regexp. Если оно равноnil, функция просто возвращаетnil.
- Функция: treesit-defun-name node
-
Эта функция возвращает имя defun узла node. Она возвращает
nil, если у node нет имени defun, если node не является узлом defun или если node равенnil.В зависимости от языка и основного режима именами defun могут быть имена функций, классов, структур и т. д.
Если
treesit-defun-name-functionравноnil, эта функция всегда возвращаетnil.
- Переменная: treesit-defun-name-function
Если значение не равно
nil, оно должно быть функцией, которая вызывается с узлом в качестве аргумента и возвращает имя defun этого узла. Функция должна иметь ту же семантику, что иtreesit-defun-name: если узел не является узлом defun, если узел является узлом defun, но не имеет имени, или если узел равенnil, функция должна возвращатьnil.
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/Tree_002dsitter-Major-Modes.html