These are autodefs, meaning they should be defined whether or not the containing module is enabled, but they should no-op when it's disabled, by defining a no-op macro with the same name. However, lsp! and tree-sitter! are meant to be used as hooks, and you can't use macros as hooks, so you get void-function errors when they are used as such. This ensures they are properly defined as no-op functions in those cases. I.e. ;;;###autodef FORM FORM is used instead of a no-op macro if the parent module is disabled. |
||
---|---|---|
.. | ||
autoload.el | ||
config.el | ||
doctor.el | ||
packages.el | ||
README.org |
tools/tree-sitter
Description
This module adds tree-sitter support to doom:
Tree sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. This allows for features of the editor to become syntax aware.
It includes:
- Better syntax highlighting of supported languages
- Structural text objects to manipulate functions statements and other code structures like any other text object
Maintainers
- @jeetelongname
Module Flags
This module provides no flags.
Plugins
- tree-sitter
- tree-sitter-langs
- evil-textobj-tree-sitter* (
:editor evil +everywhere
)
Prerequisites
This module has no prerequisites.
Features
Language support
Currently Emacs tree sitter has got parsers for these languages with syntax
highlighting support for these languages as well as typescript-tsx-mode
To enable tree sitter for individual languages add the +tree-sitter
flag.
Check the module readme of your language for support.
Text Objects
Not all language support all text objects (yet). Here is a table of the text objects languages support Note: only languages with parsers in emacs have text object support currently. Currently text objects are bound to:
key | text object |
---|---|
A |
parameter list |
f |
function definition |
F |
function call |
C |
class |
c |
comment |
v |
conditional |
l |
loop |
They are used in a container context (not vf
but vaf
or vif
)
Goto certain nodes
you can also jump to the next / previous node type in a buffer by using [g
or ]g
respectfully, the following key will correspond to the text object you
want to jump to
Currently keys are bound to:
key | text object |
---|---|
a |
parameter list |
f |
function |
F |
function call |
c |
comment |
C |
class |
v |
conditional |
l |
loop |
Configuration
Disable text objects for certain modes
If you wish to disable tree sitter text objects then you can just remove
+tree-sitter-keys-mode
from the language mode hook, for example if we did not
want it for ruby we would use this snippet
(remove-hook 'ruby-mode-hook #'+tree-sitter-keys-mode)
Rebinding text objects
Rebinding keys is the same as any other key but do notes they need to be bound
to the keymaps +tree-sitter-inner-text-object-map
or
+tree-sitter-outer-text-object-map
(map! (:map +tree-sitter-outer-text-objects-map
"f" nil
"f" (evil-textobj-tree-sitter-get-textobj "call.inner")
"F" nil
"F" (evil-textobj-tree-sitter-get-textobj "function.inner"))
(:map +tree-sitter-inner-text-objects-map
"f" nil
"f" (evil-textobj-tree-sitter-get-textobj "call.inner")
"F" nil
"F" (evil-textobj-tree-sitter-get-textobj "function.inner")))
Adding your own text objects
If you wish to add your own custom text objects then you need to bind them and
add them to the +tree-sitter-{inner, outer}-text-objects-map
for example:
(map! (:map +tree-sitter-outer-text-objects-map
"m" (evil-textobj-tree-sitter-get-textobj "import"
'((python-mode . [(import_statement) @import])
(rust-mode . [(use_declaration) @import])))))
Disabling highlighting for certain modes
If you want to disable highlighting by default you can add a
(after! MODE-PACKAGE
(tree-sitter-hl-mode -1))
If you only want it for certain modes then
(remove-hook 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)
(add-hook 'MAJOR-MODE-HOOK #'tree-sitter-hl-mode)
Troubleshooting
(error "Bad bounding indices: 0, 1")
This means that the text object does not have the underlying query needed, this can be fixed by either adding in a custom query (which would override the current key bound.) or contributing upstream!