2020-05-02 11:23:18 +02:00
# Contributing to `nvim-treesitter`
First of all, thank you very much for contributing to `nvim-treesitter` .
If you haven't already, you should really come and reach out to us on our [gitter ](https://gitter.im/nvim-treesitter/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link )
2020-05-07 09:26:02 +02:00
room, so we can help you with any question you might have!
2020-05-02 11:23:18 +02:00
As you know, `nvim-treesitter` is roughly splitted in two parts :
2020-07-27 09:23:42 -05:00
- Parser configurations : for various things like `locals` , `highlights`
- What we like to call *modules* : tiny lua modules that provide a given feature, based on parser configurations
2020-05-02 11:23:18 +02:00
Depending on which part of the plugin you want to contribute to, please read the appropriate section.
2020-07-05 20:45:46 +02:00
## Style Checks and Tests
2020-07-08 09:46:54 +02:00
We haven't implemented any functional tests yet. Feel free to contribute.
2020-07-05 20:45:46 +02:00
However, we check code style with `luacheck` !
Please install luacheck and activate our `pre-push` hook to automatically check style before
every push:
```bash
luarocks install luacheck
ln -s ../../scripts/pre-push .git/hooks/pre-push
```
2020-07-08 09:46:54 +02:00
## Adding new modules
If you want to see a new functionality added to `nvim-treesitter` feel free to first open an issue
2020-07-27 09:23:42 -05:00
to that we can track our solution!
2020-07-08 09:46:54 +02:00
Thus far, there is basically two types of modules:
2020-07-27 09:23:42 -05:00
- Little modules (like `incremental selection` ) that are built in `nvim-treesitter` , we call them
`builtin modules` .
- Bigger modules (like `completion-treesitter` , or `nvim-tree-docs` ), or modules that integrate
with other plugins, that we call `remote modules` .
2020-07-08 09:46:54 +02:00
In any case, you can build your own module ! To help you started in the process, we have a template
repository designed to build new modules [here ](https://github.com/nvim-treesitter/module-template ).
Feel free to use it, and contact us over on our
[gitter ](https://gitter.im/nvim-treesitter/community?utm_source=share-link&utm_medium=link&utm_campaign=share-link ).
2020-05-02 11:23:18 +02:00
## Parser configurations
Contributing to parser configurations is basically modifying one of the `queries/*/*.scm` .
Each of these `scheme` files contains a *tree-sitter query* for a given purpose.
Before going any further, we highly suggest that you [read more about tree-sitter queries ](https://tree-sitter.github.io/tree-sitter/using-parsers#pattern-matching-with-queries ).
Each query has an appropriate name, which is then used by modules to extract data from the syntax tree.
For now two types of queries are used by `nvim-treesitter` :
2020-07-27 09:23:42 -05:00
- `highlights.scm` : used for syntax highlighting, using the `highlight` module.
- `locals.scm` : used to extract keyword definitions, scopes, references, etc, using the `locals` module.
2020-05-02 11:23:18 +02:00
2020-05-07 09:26:02 +02:00
For both of these types there is a *norm* you will have to follow so that features work fine.
2020-05-02 11:23:18 +02:00
Here are some global advices :
2020-07-27 09:23:42 -05:00
- If your language is listed [here ](https://tree-sitter.github.io/tree-sitter/using-parsers#pattern-matching-with-queries ),
you can debug and experiment with your queries there.
- If not, you should consider installing the [tree-sitter cli ](https://github.com/tree-sitter/tree-sitter/tree/master/cli ),
you should then be able to open a local playground using `tree-sitter build-wasm && tree-sitter web-ui` within the
parsers repo.
- An Example of somewhat complex highlight queries can be found in queries/ruby/highlights.scm (Maintained by @TravonteD )
2020-05-02 11:23:18 +02:00
### Highlights
As languages differ quite a lot, here is a set of captures available to you when building a `highlights.scm` query.
2020-05-07 09:26:02 +02:00
One important thing to note is that many of these capture groups are not supported by `neovim` for now, and will not have any
2020-05-02 11:23:18 +02:00
effect on highlighting. We will work on improving highlighting in the near future though.
#### Misc
2020-07-27 09:23:42 -05:00
2020-06-23 14:30:01 +02:00
```
@comment
@error for error (ERROR` nodes.
@punctuation .delimiter for `;` `.` `,`
@punctuation .bracket for `()` or `{}`
```
2020-05-02 11:23:18 +02:00
Some captures are related to language injection (like markdown code blocks). As this is not supported by neovim yet, these
2020-05-08 18:03:06 +02:00
are optional and will not have any effect for now.
2020-07-27 09:23:42 -05:00
2020-06-23 14:30:01 +02:00
```
@embedded
@injection
language
content
```
2020-07-27 09:23:42 -05:00
2020-05-02 11:23:18 +02:00
#### Constants
2020-07-27 09:23:42 -05:00
2020-06-23 14:30:01 +02:00
```
@constant
builtin
macro
@string
regex
escape
@character
@number
@boolean
@float
```
2020-05-02 11:23:18 +02:00
#### Functions
2020-07-27 09:23:42 -05:00
2020-06-23 14:30:01 +02:00
```
@function
builtin
macro
@parameter
2020-05-02 11:23:18 +02:00
2020-06-23 14:30:01 +02:00
@method
@field or @property
2020-05-02 11:23:18 +02:00
2020-06-23 14:30:01 +02:00
@constructor
```
2020-05-02 11:23:18 +02:00
#### Keywords
2020-07-27 09:23:42 -05:00
2020-06-23 14:30:01 +02:00
```
@conditional
@repeat
@label for C/Lua-like labels
@operator
@keyword
2020-08-03 21:40:23 -05:00
function
2020-06-23 14:30:01 +02:00
@exception
@include keywords for including modules (e.g. import/from in Python)
@type
builtin
@structure
```
2020-07-26 09:38:53 -05:00
#### Text
Mainly for markup languages.
```
@text
@text .strong
@text .emphasis
@text .underline
@text .title
@text .literal
@text .uri
```
2020-05-02 11:23:18 +02:00
### Locals
2020-06-23 14:30:01 +02:00
```
@definition for various definitions
function
method
var
macro
type
field
2020-07-11 00:10:17 +02:00
namespace for modules or C++ namespaces
2020-07-08 15:18:28 +02:00
import for imported names
doc for documentation adjacent to a definition. E.g.
2020-06-23 14:30:01 +02:00
```
2020-06-07 12:38:57 +02:00
```scheme
(comment)* @definition .doc
(method_declaration
name: (field_identifier) @definition .method)
```
2020-05-02 11:23:18 +02:00
2020-06-23 14:30:01 +02:00
```
@scope
@reference
```