rafcamlet / nvim-treesitter

Nvim Treesitter configurations and abstraction layer

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Linting and style checking Check loading of syntax files

Join us on Zulip !

nvim-treesitter

Treesitter configurations and abstraction layer for Neovim.

Nvim-treesitter

Traditional highlighting (left) vs Treesitter-based highlighting (right).

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!

Quickstart

Requirements

  • Neovim nightly
  • git in your path.
  • A C compiler in your path.

Installation

You can install nvim-treesitter with your favorite package manager, or using the default pack feature of Neovim!

Using a package manager

Simply add these lines to your init.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:

$ 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

Treesitter uses a different parser for every language. It can be quite a pain to install, but fortunately nvim-treesitter provides two command to tackle this issue:

  • TSInstall {language} to install one or more parsers. TSInstall <tab> will give you a list of supported languages, or select all to install them all.
  • TSInstallInfo to know which parser is installed.

Let's say you need parsers for lua, this is how you do with these commands:

:TSInstall lua
Downloading...
Compiling...
Treesitter parser for lua has been installed

Cool, lets see which parsers are installed:

:TSInstallInfo
lua        [✓] installed
c          [✗] installed
html       [✗] not installed
typescript [✗] not installed
...

And now you should be ready to use every functionality nvim-treesitter provides!

Setup

All modules are disabled by default, so you'll need to activate them by putting this in your init.vim:

lua <<EOF
require'nvim-treesitter.configs'.setup {
    highlight = {
      enable = true,                    -- false will disable the whole extension
      disable = { "c", "rust" },        -- list of language that will be disabled
      custom_captures = {               -- mapping of user defined captures to highlight groups
        -- ["foo.bar"] = "Identifier"   -- highlight own capture @foo.bar with highlight group "Identifier", see :h nvim-treesitter-query-extensions
      },
    },
    incremental_selection = {
      enable = true,
      disable = { "cpp", "lua" },
      keymaps = {                       -- mappings for incremental selection (visual mappings)
        init_selection = "gnn",         -- maps in normal mode to init the node/scope selection
        node_incremental = "grn",       -- increment to the upper named parent
        scope_incremental = "grc",      -- increment to the upper scope (as defined in locals.scm)
        node_decremental = "grm",       -- decrement to the previous node
      }
    },
    refactor = {
      highlight_definitions = {
        enable = true
      },
      highlight_current_scope = {
        enable = true
      },
      smart_rename = {
        enable = true,
        keymaps = {
          smart_rename = "grr"          -- mapping to rename reference under cursor
        }
      },
      navigation = {
        enable = true,
        keymaps = {
          goto_definition = "gnd",      -- mapping to go to definition of symbol under cursor
          list_definitions = "gnD"      -- mapping to list all definitions in current file
        }
      }
    },
    textobjects = { -- syntax-aware textobjects
    enable = true,
    disable = {},
    keymaps = {
        ["iL"] = { -- you can define your own textobjects directly here
          python = "(function_definition) @function",
          cpp = "(function_definition) @function",
          c = "(function_definition) @function",
          java = "(method_declaration) @function"
        },
        -- or you use the queries from supported languages with textobjects.scm
        ["af"] = "@function.outer",
        ["if"] = "@function.inner",
        ["aC"] = "@class.outer",
        ["iC"] = "@class.inner",
        ["ac"] = "@conditional.outer",
        ["ic"] = "@conditional.inner",
        ["ae"] = "@block.outer",
        ["ie"] = "@block.inner",
        ["al"] = "@loop.outer",
        ["il"] = "@loop.inner",
        ["is"] = "@statement.inner",
        ["as"] = "@statement.outer",
        ["ad"] = "@comment.outer",
        ["am"] = "@call.outer",
        ["im"] = "@call.inner"
      }
    },
    ensure_installed = "all" -- one of "all", "language", or a list of languages
}
EOF

Commands

Each feature can be enabled or disabled by different means:

:TSBufEnable {module} " enable module on current buffer
:TSBufDisable {module} " disable module on current buffer
:TSEnableAll {module} [{ft}] " enable module on every buffer. If filetype is specified, enable only for this filetype.
:TSDisableAll {module} [{ft}] " disable module on every buffer. If filetype is specified, disable only for this filetype.
:TSModuleInfo [{module}] " list information about modules state for each filetype

Features and Roadmap

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:

Some of these features are:

  • Incremental selection
  • Syntax based code folding (set foldmethod=expr foldexpr=nvim_treesitter#foldexpr())
  • Consistent syntax highlighting (the api is not quite stable yet)
  • Statusline indicator (require'nvim-treesitter'.statusline(size))

You can find the roadmap here. The roadmap and all features of this plugin are open to change, and any suggestion will be highly appreciated!

Available Modules

  • highlight: Consistent syntax highlighting.
  • incremental_selection: Syntax based selection.
  • refactor.highlight_definitions: Syntax based definition and usage highlighting.
  • refactor.smart_rename: Syntax based definition and usage renaming.
  • refactor.navigation: Syntax based definition listing and navigation.
    • List all definitions
    • Go to definition
  • textobjects: Vim textobjects defined by treesitter queries

Defining Modules

Users and plugin authors can take advantage of modules by creating their own. Modules provide:

  • Treesitter language detection support
  • Attach and detach to buffers
  • Works with all nvim-treesitter commands

You can use the define_modules function to define one or more modules or module groups.

require 'nvim-treesitter'.define_modules {
  my_cool_plugin = {
    attach = function(bufnr, lang)
      -- Do cool stuff here
    end,
    detach = function(bufnr)
      -- Undo cool stuff here
    end,
    is_supported = function(lang)
      -- Check if the language is supported
    end
  }
}

Modules can consist of the following properties:

  • module_path: A require path (string) that exports a module with an attach and detach function. This is not required if the functions are on this definition.
  • enable: Determines if the module is enabled by default. This is usually overridden by the user.
  • disable: A list of languages that this module is disabled for. This is usually overridden by the user.
  • is_supported: A function that takes a language and determines if this module supports that language.
  • attach: A function that attaches to a buffer. This is required if module_path is not provided.
  • detach: A function that detaches from a buffer. This is required if module_path is not provided.

Utils

You can get some utility functions with

local ts_utils = require 'nvim-treesitter.ts_utils'

More information is available in the help file (:help nvim-treesitter-utils).

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

We are looking for maintainers to write query files for their languages.

List of currently supported languages:

  • bash (maintained by @TravonteD)
  • c (maintained by @vigoux)
  • cpp (maintained by @theHamsta, extends C queries)
  • csharp (maintained by @svermeulen)
  • css (maintained by @TravonteD)
  • dart (maintained by @Akin909)
  • elm
  • go (maintained by @theHamsta, @WinWisely268)
  • haskell
  • html (maintained by @TravonteD)
  • java
  • javascript (maintained by @steelsojka)
  • jsdoc
  • json (maintained by @steelsojka)
  • julia
  • lua (maintained by @vigoux)
  • markdown
  • nix
  • ocaml
  • php (maintained by @tk-shirasaka)
  • python (maintained by @theHamsta)
  • regex (maintained by @theHamsta)
  • rst (maintained by @stsewd)
  • ruby (maintained by @TravonteD)
  • rust (partial support, maintained by @vigoux)
  • scala
  • swift
  • toml (maintained by @tk-shirasaka)
  • tree-sitter query language (maintained by @steelsojka)
  • tsx
  • typescript (maintained by @steelsojka)
  • vue
  • yaml

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. This will help you find where the bug might come from.

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. If everything is okay, then it might be an actual error.

In both cases, feel free to open an issue here.

I get Error detected while processing .../plugin/nvim-treesitter.vim everytime 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.

I experience weird highlighting issues similar to #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:

:write | edit | TSBufEnable highlight

This will save, restore and enable highlighting for the current buffer, fixing the issue.

About

Nvim Treesitter configurations and abstraction layer

License:Apache License 2.0


Languages

Language:Lua 54.3%Language:Scheme 43.3%Language:Vim Script 2.2%Language:Shell 0.2%