From 5f06bc2f1b426d3a8f008945f13977f1a102ec8c Mon Sep 17 00:00:00 2001 From: Christian Clason Date: Sat, 21 Nov 2020 22:07:17 +0100 Subject: [PATCH] restructure readme --- README.md | 296 ++++++++++++++++++++++++++---------------------------- 1 file changed, 142 insertions(+), 154 deletions(-) diff --git a/README.md b/README.md index 97875503f..f78b5f9a4 100644 --- a/README.md +++ b/README.md @@ -29,13 +29,19 @@

+The goal of `nvim-treesitter` is both to provide a simple and easy way to use the interface for [tree-sitter](https://github.com/tree-sitter/tree-sitter) in Neovim and to provide some basic functionality such as highlighting based on on it: + ![cpp example](assets/example-cpp.png) Traditional highlighting (left) vs Treesitter-based highlighting (right). -See more examples in [our gallery](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Gallery). +More examples can be found in [our gallery](https://github.com/nvim-treesitter/nvim-treesitter/wiki/Gallery). -**Warning: Treesitter and Treesitter highlighting are an experimental feature of nightly versions of Neovim. -Please consider the experience with this plug-in as experimental until Neovim 0.5 is released!** +**Warning: Treesitter and nvim-treesitter highlighting are an experimental feature of nightly versions of Neovim. +Please consider the experience with this plug-in as experimental until Neovim 0.5 is released! +You can find the current roadmap [here](https://github.com/nvim-treesitter/nvim-treesitter/projects/1). +The roadmap and all features of this plugin are open to change, and any suggestion will be highly appreciated!** + +Nvim-treesitter is based on three interlocking features: [**language parsers**](#parsers), [**queries**](#queries), and [**modules**](#modules), where *modules* provide features -- such as highlighting -- based on *queries* for syntax objects specified by language *parsers*. Users will generally only need to interact with parsers and modules as explained in the next section. For more detailed information on setting these up, see ["Advanced setup"](#advanced). # Quickstart @@ -47,27 +53,15 @@ Please consider the experience with this plug-in as experimental until Neovim 0. ## Installation -You can install `nvim-treesitter` with your favorite package manager, or using the default `pack` feature of Neovim! +You can install `nvim-treesitter` with your favorite package manager (or using the native `package` feature of vim, see `:h packages`). -### Using a package manager - -If you are using [vim-plug](https://github.com/junegunn/vim-plug), put this in your `init.vim` file: +E.g., if you are using [vim-plug](https://github.com/junegunn/vim-plug), put this in your `init.vim` file: ```vim Plug 'nvim-treesitter/nvim-treesitter' ``` -### Using Neovim `pack` feature - -We highly recommend reading `:h packages` to learn more about this feature, but you can still follow these steps: - -```sh -$ mkdir -p ~/.local/share/nvim/site/pack/nvim-treesitter/start -$ cd ~/.local/share/nvim/site/pack/nvim-treesitter/start -$ git clone https://github.com/nvim-treesitter/nvim-treesitter.git -``` - -## Adding parsers +## Language parsers Treesitter uses a different _parser_ for every language, which needs to be generated via `tree-sitter-cli` from a `grammar.js` file, then compiled to a `.so` library that needs to be placed in neovim's `runtimepath` (typically under `parser/{lang}.so`). To simplify this, `nvim-treesitter` provides commands to automate this process. If the language is already [supported by `nvim-treesitter`](#supported), you can install it with @@ -78,10 +72,11 @@ This command supports tab expansion. You can also get a list of all available la If you update `nvim-treesitter` and want to make sure the parser is at the latest compatible version (as specified in `nvim-treesitter`'s `lockfile.json`), use `:TSUpdate {language}`. To update all parsers unconditionally, use `:TSUpdate all` or just `:TSUpdate`. -## Setup +## Modules -All modules are disabled by default, -so you'll need to activate them by putting this in your `init.vim` file: +Each modules provide a distinct feature based on treesitter such as [highlighting](#highlighting), [indentation](#indentation), or [folding](#folding); see [`:h nvim-treesitter-modules`](doc/nvim-treesitter.txt) or see ["Modules"](#modules) below for a list of available modules and their options. + +All modules are disabled by default and need to be activated explicitly in your `init.vim`: ```vim lua <expression_statement->call->identifier -``` - -# Commands - -Each feature can be enabled or disabled by different means: +Each module can also be enabled or disabled interactively through the following commands: ```vim :TSBufEnable {module} " enable module on current buffer @@ -191,16 +100,15 @@ Each feature can be enabled or disabled by different means: :TSModuleInfo [{module}] " list information about modules state for each filetype ``` -Check [`:h nvim-treesitter-commands`](doc/nvim-treesitter.txt) for a list of all available commands. +Check [`:h nvim-treesitter-commands`](doc/nvim-treesitter.txt) for a list of all available commands. It may be necessary to reload the buffer (e.g., via `:e`) after enabling a module. -# Supported Languages +# Supported languages -For `nvim-treesitter` to work, we need to use query files such as those you can find in -`queries/{lang}/{locals,highlights,textobjects}.scm` +For `nvim-treesitter` to support a specific feature for a specific language requires both a parser for this language and an appropriate query file for that language and that feature. -We are looking for maintainers to write query files for their languages. +The following is a list of languages for which a parser can be installed through `:TSInstall`; a checked box means that `nvim-treesitter` also contains queries at least for the `highlight` module. -List of currently supported languages: +We are looking for maintainers to add more parsers and to write query files for their languages. @@ -245,7 +153,89 @@ List of currently supported languages: - [ ] [yaml](https://github.com/ikatyang/tree-sitter-yaml) -## Parsers for other languages + +# Available modules + +Modules provide the top-level features of `nvim-treesitter`. These can be implemented either as part of `nvim-treesitter` or as an external plugin. + +## Included modules + +The following is a list of modules included in `nvim-treesitter`. Note that not all modules work for all languages (depending on the queries available for them). + +#### Highlight + +Consistent syntax highlighting. + +```vim +lua < Indentation + +Treesitter based indentation (`=` vim behavior) + +```vim +lua < Folding + +```vim +set foldmethod=expr +set foldexpr=nvim_treesitter#foldexpr() +``` + +This will respect your `foldnestmax` setting. + +## External modules + +Other modules can be installed as plugins, such as + +- [refactor](https://github.com/nvim-treesitter/nvim-treesitter-refactor) - Refactoring and definition modules +- [textobjects](https://github.com/nvim-treesitter/nvim-treesitter-textobjects) - Textobjects defined by tree-sitter queries +- [playground](https://github.com/nvim-treesitter/playground) - Treesitter integrated playground +- [context](https://github.com/romgrk/nvim-treesitter-context) - Show parent code context in a popover + + +# Advanced setup + +## Adding parsers If you have a parser that is not on this list (either from a repository on Github or a local directory), you can add it manually for use by `nvim-treesitter` as follows: @@ -271,25 +261,33 @@ EOF You can also skip step 2 and use `:TSInstallFromGrammar zimbu` to install straight from `grammar.js`. Once the parser is installed, you can update it (from the latest revision of the `main` branch if `url` is a Github repository) with `:TSUpdate zimbu`. -Note that this only installs the parser itself; using it for, e.g., highlighting also requires corresponding queries that need to be written and placed in the appropriate directory (e.g., as `queries/zimbu/highlights.scm`). +## Adding queries -# Roadmap +Queries are what `nvim-treesitter` uses to extract informations from the syntax tree; they are +located in the `queries/{language}/*` runtime directories (like the `queries` folder of this plugin), e.g., `queries/{language}/{locals,highlights,textobjects}.scm`. Other modules may require additional queries such as `folding.scm`. -The goal of `nvim-treesitter` is both to provide a simple and easy way to use the interface for Treesitter in Neovim, -but also to add some functionalities to it. +`nvim-treesitter` considers queries as any runtime file (see `:h rtp`), that is : -You can find the roadmap [here](https://github.com/nvim-treesitter/nvim-treesitter/projects/1). -The roadmap and all features of this plugin are open to change, and any suggestion will be highly appreciated! +- if the file is in any `after/queries/` folder, then it will be used to extend the already defined + queries. +- Otherwise, it will be used as a base to define the query, the first query found (with the highest + priority) will be the only one to be used. -# Defining Modules +This hybrid approach is the most standard way; in this case -Users and plugin authors can take advantage of modules by creating their own. Modules provide: +- if you want to rewrite (or write) a query, don't use `after/queries`; +- if you want to override a part of a query (only one match for example), use the `after/queries` + directory. -- Treesitter language detection support -- Attach and detach to buffers -- Works with all nvim-treesitter commands +## Adding modules -You can use the `define_modules` function to define one or more modules or module groups. +If you wish you write your own module, you need to support + +- tree-sitter language detection support; +- attaching and detaching to buffers; +- all nvim-treesitter commands. + +At the top level, you can use the `define_modules` function to define one or more modules or module groups: ```vim lua <expression_statement->call->identifier +``` + +### Utilities You can get some utility functions with @@ -328,31 +335,12 @@ local ts_utils = require 'nvim-treesitter.ts_utils' Check [`:h nvim-treesitter-utils`](doc/nvim-treesitter.txt) for more information. -# User Query Extensions - -Queries are what `nvim-treesitter` uses to extract informations from the syntax tree, and they are -located in the `queries/{lang}/*` runtime directories (like the `queries` folder of this plugin). - -`nvim-treesitter` considers queries as any runtime file (see `:h rtp`), that is : - -- if the file is in any `after/queries/` folder, then it will be used to extend the already defined - queries. -- Otherwise, it will be used as a base to define the query, the first query found (with the highest - priority) will be the only one to be used. - -This hybrid approach is the most standard way, and according to that, here is some ideas on how to -use is : - -- If you want to rewrite (or write) a query, don't use `after/queries`. -- If you want to override a part of a query (only one match for example), use the `after/queries` - directory. - # Troubleshooting -Before doing anything make sure you have the latest version of this plugin and run `:checkhealth nvim_treesitter`. +Before doing anything make sure you have the latest version of this plugin and run `:checkhealth nvim_treesitter`. It can also help to update the parsers via `:TSUpdate`. This will help you find where the bug might come from. -## Feature `X` does not work for `{language}`... +* **Feature `X` does not work for `{language}`...** First, check the `## {language} parser healthcheck` section of `:checkhealth` if you have any warning. If you do, it's highly possible that this is the cause of the problem. @@ -360,18 +348,18 @@ If everything is okay, then it might be an actual error. In both cases, feel free to [open an issue here](https://github.com/nvim-treesitter/nvim-treesitter/issues/new/choose). -## I get `module 'vim.treesitter.query' not found` +* **I get `module 'vim.treesitter.query' not found`** Make sure you have the latest nightly version of Neovim. -## I get `Error detected while processing .../plugin/nvim-treesitter.vim` every time I open Neovim +* **I get `Error detected while processing .../plugin/nvim-treesitter.vim` every time I open Neovim** This is probably due to a change in a parser's grammar or its queries. Try updating the parser that you suspect has changed (`:TSUpdate {language}`) or all of them (`:TSUpdate`). If the error persists after updating all parsers, please [open an issue](https://github.com/nvim-treesitter/nvim-treesitter/issues/new/choose). -## I experience weird highlighting issues similar to [#78](https://github.com/nvim-treesitter/nvim-treesitter/issues/78) +* **I experience weird highlighting issues similar to [#78](https://github.com/nvim-treesitter/nvim-treesitter/issues/78)** This is a well known issue, which arise when the tree and the buffer are getting out of sync. As this issue comes from upstream, we don't have any finite fix. To get around this, you can force reparsing the buffer with this command: @@ -382,7 +370,7 @@ As this issue comes from upstream, we don't have any finite fix. To get around t This will save, restore and enable highlighting for the current buffer, fixing the issue. -## I experience bugs when using `nvim-treesitter`'s `foldexpr` similar to [#194](https://github.com/nvim-treesitter/nvim-treesitter/issues/194) +* **I experience bugs when using `nvim-treesitter`'s `foldexpr` similar to [#194](https://github.com/nvim-treesitter/nvim-treesitter/issues/194)** This might happen, and is known to happen with `vim-clap`, to avoid those kind of errors, please use `setlocal` instead of `set` for the appropriate filetypes.