Home

Awesome

nvim-treesitter-pairs

Create your own pair objects using tree-sitter queries!

Installation

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

Using a package manager

If you are using vim-plug, put this in your init.vim file:

Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'}
Plug 'theHamsta/nvim-treesitter-pairs'

Configuration

Pairs are configured via queries/<language>/pairs.scm query files.

lua <<EOF
require'nvim-treesitter.configs'.setup {
  pairs = {
    enable = true,
    disable = {},
    highlight_pair_events = {}, -- e.g. {"CursorMoved"}, -- when to highlight the pairs, use {} to deactivate highlighting
    highlight_self = false, -- whether to highlight also the part of the pair under cursor (or only the partner)
    goto_right_end = false, -- whether to go to the end of the right partner or the beginning
    fallback_cmd_normal = "call matchit#Match_wrapper('',1,'n')", -- What command to issue when we can't find a pair (e.g. "normal! %")
    keymaps = {
      goto_partner = "<leader>%",
      delete_balanced = "X",
    },
    delete_balanced = {
      only_on_first_char = false, -- whether to trigger balanced delete when on first character of a pair
      fallback_cmd_normal = nil, -- fallback command when no pair found, can be nil
      longest_partner = false, -- whether to delete the longest or the shortest pair when multiple found.
                               -- E.g. whether to delete the angle bracket or whole tag in  <pair> </pair>
    }
  }
},
EOF

Known Limitations

We hope we can fix them soon!

Alternatives: https://github.com/andymass/vim-matchup added tree-sitter support for some languages. Thy can be configured via matchup.scm.

Supported languages

<!--pairsinfo--> <table> <tr> <td>astro</td><td> </td> </tr> <tr> <td>bash</td><td>👍</td> </tr> <tr> <td>beancount</td><td> </td> </tr> <tr> <td>bibtex</td><td> </td> </tr> <tr> <td>c</td><td>👍</td> </tr> <tr> <td>c_sharp</td><td>👍</td> </tr> <tr> <td>clojure</td><td>👍</td> </tr> <tr> <td>cmake</td><td> </td> </tr> <tr> <td>comment</td><td> </td> </tr> <tr> <td>commonlisp</td><td>👍</td> </tr> <tr> <td>cooklang</td><td> </td> </tr> <tr> <td>cpp</td><td>👍</td> </tr> <tr> <td>css</td><td>👍</td> </tr> <tr> <td>cuda</td><td> </td> </tr> <tr> <td>d</td><td> </td> </tr> <tr> <td>dart</td><td>👍</td> </tr> <tr> <td>devicetree</td><td> </td> </tr> <tr> <td>dockerfile</td><td> </td> </tr> <tr> <td>dot</td><td> </td> </tr> <tr> <td>eex</td><td> </td> </tr> <tr> <td>elixir</td><td> </td> </tr> <tr> <td>elm</td><td>👍</td> </tr> <tr> <td>elvish</td><td> </td> </tr> <tr> <td>erlang</td><td> </td> </tr> <tr> <td>fennel</td><td>👍</td> </tr> <tr> <td>fish</td><td> </td> </tr> <tr> <td>foam</td><td> </td> </tr> <tr> <td>fortran</td><td> </td> </tr> <tr> <td>fusion</td><td> </td> </tr> <tr> <td>Godot (gdscript)</td><td> </td> </tr> <tr> <td>gleam</td><td> </td> </tr> <tr> <td>Glimmer and Ember</td><td> </td> </tr> <tr> <td>glsl</td><td> </td> </tr> <tr> <td>go</td><td>👍</td> </tr> <tr> <td>Godot Resources (gdresource)</td><td> </td> </tr> <tr> <td>gomod</td><td> </td> </tr> <tr> <td>gowork</td><td> </td> </tr> <tr> <td>graphql</td><td>👍</td> </tr> <tr> <td>hack</td><td> </td> </tr> <tr> <td>haskell</td><td>👍</td> </tr> <tr> <td>hcl</td><td> </td> </tr> <tr> <td>heex</td><td> </td> </tr> <tr> <td>help</td><td> </td> </tr> <tr> <td>hjson</td><td> </td> </tr> <tr> <td>hocon</td><td> </td> </tr> <tr> <td>html</td><td>👍</td> </tr> <tr> <td>http</td><td> </td> </tr> <tr> <td>java</td><td>👍</td> </tr> <tr> <td>javascript</td><td>👍</td> </tr> <tr> <td>jsdoc</td><td> </td> </tr> <tr> <td>json</td><td>👍</td> </tr> <tr> <td>json5</td><td> </td> </tr> <tr> <td>JSON with comments</td><td> </td> </tr> <tr> <td>julia</td><td>👍</td> </tr> <tr> <td>kotlin</td><td> </td> </tr> <tr> <td>lalrpop</td><td> </td> </tr> <tr> <td>latex</td><td>👍</td> </tr> <tr> <td>ledger</td><td> </td> </tr> <tr> <td>llvm</td><td> </td> </tr> <tr> <td>lua</td><td>👍</td> </tr> <tr> <td>make</td><td> </td> </tr> <tr> <td>markdown</td><td> </td> </tr> <tr> <td>ninja</td><td> </td> </tr> <tr> <td>nix</td><td>👍</td> </tr> <tr> <td>norg</td><td> </td> </tr> <tr> <td>ocaml</td><td> </td> </tr> <tr> <td>ocaml_interface</td><td> </td> </tr> <tr> <td>ocamllex</td><td>👍</td> </tr> <tr> <td>pascal</td><td> </td> </tr> <tr> <td>perl</td><td> </td> </tr> <tr> <td>php</td><td>👍</td> </tr> <tr> <td>phpdoc</td><td> </td> </tr> <tr> <td>pioasm</td><td> </td> </tr> <tr> <td>prisma</td><td> </td> </tr> <tr> <td>pug</td><td> </td> </tr> <tr> <td>python</td><td>👍</td> </tr> <tr> <td>ql</td><td> </td> </tr> <tr> <td>Tree-sitter query language</td><td> </td> </tr> <tr> <td>r</td><td> </td> </tr> <tr> <td>rasi</td><td> </td> </tr> <tr> <td>regex</td><td> </td> </tr> <tr> <td>rego</td><td> </td> </tr> <tr> <td>rst</td><td> </td> </tr> <tr> <td>ruby</td><td> </td> </tr> <tr> <td>rust</td><td>👍</td> </tr> <tr> <td>scala</td><td> </td> </tr> <tr> <td>scheme</td><td> </td> </tr> <tr> <td>scss</td><td>👍</td> </tr> <tr> <td>slint</td><td> </td> </tr> <tr> <td>solidity</td><td> </td> </tr> <tr> <td>sparql</td><td> </td> </tr> <tr> <td>supercollider</td><td> </td> </tr> <tr> <td>surface</td><td> </td> </tr> <tr> <td>svelte</td><td>👍</td> </tr> <tr> <td>swift</td><td> </td> </tr> <tr> <td>teal</td><td> </td> </tr> <tr> <td>tlaplus</td><td> </td> </tr> <tr> <td>todotxt</td><td> </td> </tr> <tr> <td>toml</td><td>👍</td> </tr> <tr> <td>tsx</td><td> </td> </tr> <tr> <td>turtle</td><td> </td> </tr> <tr> <td>typescript</td><td>👍</td> </tr> <tr> <td>vala</td><td> </td> </tr> <tr> <td>verilog</td><td> </td> </tr> <tr> <td>vim</td><td> </td> </tr> <tr> <td>vue</td><td>👍</td> </tr> <tr> <td>wgsl</td><td> </td> </tr> <tr> <td>yaml</td><td> </td> </tr> <tr> <td>yang</td><td> </td> </tr> <tr> <td>zig</td><td> </td> </tr> </table> <!--pairsinfo-->