Next: Tree-sitter C API Correspondence, Previous: Parsing Text in Multiple Languages, Up: Parsing Program Source [Contents][Index]
This section covers some general guidelines on developing tree-sitter integration for a major mode.
A major mode supporting tree-sitter features should roughly follow this pattern:
(define-derived-mode woomy-mode prog-mode "Woomy"
"A mode for Woomy programming language."
;; Shared setup.
...
(cond
;; Tree-sitter setup.
((treesit-ready-p 'woomy)
(setq-local treesit-variables ...)
(treesit-major-mode-setup))
;; Non-tree-sitter setup.
(t
...)))
First, the major mode should use treesit-ready-p to determine
whether tree-sitter can be activated in this mode.
This function checks for conditions for activating tree-sitter. It checks whether Emacs was built with tree-sitter, whether the buffer’s size is not too large for tree-sitter to handle it, and whether the language grammar for language is available on the system (see Tree-sitter Language Grammar).
This function emits a warning if tree-sitter cannot be activated. If
quiet is message, the warning is turned into a message;
if quiet is nil, no warning or message is displayed.
If all the necessary conditions are met, this function returns
non-nil; otherwise it returns nil.
Next, the major mode should set up tree-sitter variables and call
treesit-major-mode-setup.
This function activates some tree-sitter features for a major mode.
Currently, it sets up the following features:
treesit-font-lock-settings (see Parser-based Font Lock)
is non-nil, it sets up fontification.
treesit-simple-indent-rules (see Parser-based Indentation)
is non-nil, it sets up indentation.
treesit-defun-type-regexp is non-nil, it sets up
navigation functions for beginning-of-defun and
end-of-defun.
treesit-defun-name-function is non-nil, it sets up
add-log functions used by add-log-current-defun.
treesit-simple-imenu-settings (see Imenu) is
non-nil, it sets up Imenu.
For more information of these built-in tree-sitter features, see Parser-based Font Lock, see Parser-based Indentation, and see Moving over Balanced Expressions.
For supporting mixing of multiple languages in a major mode, see Parsing Text in Multiple Languages.
Besides beginning-of-defun and end-of-defun, Emacs
provides some additional functions for working with defuns:
treesit-defun-at-point returns the defun node at point, and
treesit-defun-name returns the name of a defun node.
This function returns the defun node at point, or nil if none
is found. It respects treesit-defun-tactic: if its value is
top-level, this function returns the top-level defun, and if
its value is nested, it returns the immediate enclosing defun.
This function requires treesit-defun-type-regexp to work. If
it is nil, this function simply returns nil.
This function returns the defun name of node. It returns
nil if there is no defun name for node, or if node
is not a defun node, or if node is nil.
Depending on the language and major mode, the defun names are names like function name, class name, struct name, etc.
If treesit-defun-name-function is nil, this function
always returns nil.
If non-nil, this variable’s value should be a function that is
called with a node as its argument, and returns the defun name of the
node. The function should have the same semantic as
treesit-defun-name: if the node is not a defun node, or the
node is a defun node but doesn’t have a name, or the node is
nil, it should return nil.
This variable determines which nodes are considered defuns by Emacs. It can be a regexp that matches the type of defun nodes.
Sometimes not all nodes matched by the regexp are valid defuns.
Therefore, this variable can also be a cons cell of the form
(regexp . pred), where pred should be a function
that takes a node as its argument, and returns t if the node is
valid defun, or nil if it is not valid.
Next: Tree-sitter C API Correspondence, Previous: Parsing Text in Multiple Languages, Up: Parsing Program Source [Contents][Index]