2021-08-21 21:19:27 +01:00
#+TITLE : tools/tree-sitter
#+DATE : August 17, 2021
#+SINCE : 3.0.0
#+STARTUP : inlineimages nofold
* Table of Contents :TOC_3:noexport:
- [[#description ][Description ]]
- [[#maintainers ][Maintainers ]]
- [[#module-flags ][Module Flags ]]
- [[#plugins ][Plugins ]]
- [[#prerequisites ][Prerequisites ]]
- [[#features ][Features ]]
2021-08-20 23:05:34 +01:00
- [[#language-support ][Language support ]]
- [[#text-objects ][Text Objects ]]
2021-08-21 21:19:27 +01:00
- [[#configuration ][Configuration ]]
2021-12-19 23:05:15 +00:00
- [[#disable-text-objects-for-certain-modes ][Disable text objects for certain modes ]]
2021-12-24 14:13:34 +00:00
- [[#adding-your-own-text-objects ][Adding your own text objects ]]
- [[#disabling-highlighting-for-certain-modes ][Disabling highlighting for certain modes ]]
2021-08-21 21:19:27 +01:00
- [[#troubleshooting ][Troubleshooting ]]
2021-12-24 14:13:34 +00:00
- [[#error-bad-bounding-indices-0-1 ][=(error "Bad bounding indices: 0, 1")= ]]
2021-08-21 21:19:27 +01:00
* Description
2021-08-22 23:13:54 +01:00
This module adds [[https://tree-sitter.github.io/tree-sitter/ ][tree-sitter ]] support to doom:
2021-08-21 21:19:27 +01:00
#+begin_quote
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
2021-12-24 14:13:34 +00:00
syntax tree as the source file is edited. This allows for features of the editor
to become syntax aware.
2021-08-21 21:19:27 +01:00
#+end_quote
2021-08-22 23:13:54 +01:00
It includes:
+ Better syntax highlighting of supported languages
+ Structural text objects to manipulate functions statements and other code
2021-08-19 22:05:00 +01:00
structures like any other text object
2021-08-21 21:19:27 +01:00
2021-12-26 16:12:20 +00:00
*Currently this module does not support M1 macbooks due to grammars being built for x86*
2021-08-21 21:19:27 +01:00
** Maintainers
- @jeetelongname
** Module Flags
This module provides no flags.
** Plugins
+ [[https://github.com/emacs-tree-sitter/elisp-tree-sitter ][tree-sitter ]]
+ [[https://github.com/emacs-tree-sitter/tree-sitter-langs ][tree-sitter-langs ]]
+ [[https://github.com/meain/evil-textobj-tree-sitter ][evil-textobj-tree-sitter ]]* (=:editor evil +everywhere= )
* Prerequisites
2021-12-26 16:12:20 +00:00
This module has no prerequisites. but if you are using an M1 mac (or a system
that's is not using an X86 instruction set) then you will not be able to use this
module for the moment, functions are being put in place for this use case but
they are still being worked on.
2021-08-21 21:19:27 +01:00
2021-08-20 23:05:34 +01:00
* Features
** Language support
Currently Emacs tree sitter has got [[https://github.com/emacs-tree-sitter/tree-sitter-langs/tree/master/repos ][parsers for these languages ]] with syntax
highlighting support for [[https://emacs-tree-sitter.github.io/syntax-highlighting/ ][these languages ]].
** Text Objects
Not all language support all text objects (yet). [[https://github.com/nvim-treesitter/nvim-treesitter-textobjects#built-in-textobjects][Here is a table of the text
objects languages support]]
2021-12-26 16:12:20 +00:00
Note: only languages with parser's in emacs have text object support currently.
2021-08-22 23:13:54 +01:00
Currently text objects are bound to:
2021-09-21 19:40:00 +01:00
| key | text object |
|-----+---------------------|
2022-01-05 18:58:52 +00:00
| =a= | parameter list |
2021-09-21 19:40:00 +01:00
| =f= | function definition |
| =F= | function call |
| =C= | class |
| =c= | comment |
| =i= | conditional |
| =l= | loop |
2021-08-20 23:26:12 +01:00
They are used in a container context (not =vf= but =vaf= or =vif= )
2021-12-19 23:05:15 +00:00
* 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
#+begin_src emacs-lisp
(remove-hook! 'ruby-mode-hook #'+tree-sitter-keys-mode)
#+end_src
2021-08-21 21:19:27 +01:00
2021-12-24 14:13:34 +00:00
** Adding your own text objects
If you wish to [[https://github.com/meain/evil-textobj-tree-sitter#custom-textobjects ][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:
#+begin_src emacs-lisp
(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])))))
#+end_src
** Disabling highlighting for certain modes
If you want to disable highlighting by default you can add a
#+begin_src emacs-lisp
(after! MODE-PACKAGE
(tree-sitter-hl-mode -1))
#+end_src
If you only want it for certain modes then
#+begin_src emacs-lisp
(remove-hook! 'tree-sitter-after-on-hook #'tree-sitter-hl-mode)
(add-hook! 'MAJOR-MODE-HOOK #'tree-sitter-hl-mode)
#+end_src
* 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 [[https://github.com/nvim-treesitter/nvim-treesitter-textobjects/ ][contributing upstream! ]]