Neovim 0.11 -> 0.12へアップデートする際の勘所とnvim-treesitterの扱い
TL;DR
Neovim 0.12系ではnvim-treesitter周辺の事情が大きく変わったので気をつけましょう。
なんとなくでtreesitterを使ってる人(私)は改めてプラグインへの理解を深めるチャンスです。
Neovim 0.12.2にアップデートするとnvim-treesitterの周辺でエラーが多発
事の発端は自端末のNeovimを0.11系から0.12系にアップデートしたことでした。
0.12.2にアップデートして、とあるリポジトリをnvimで開きREADME.mdを編集しようとすると、nvim-treesitterプラグインのロジック実行時にエラーが多発するようになり、エラーが多すぎてまともに編集できる状況ではなくなりました。(Enterでエラーを閉じても次から次へとエラーが発生し続ける状態)
落ち着いて、一旦エラーメッセージを読み、よくわからないところはLLMに投げます。
どうやらnvim-treesitterのmainブランチではNeovim 0.12系を前提とした構成に変わっており、私の環境はこの変化に追随できていなかったことがわかりました。
nvim-treesitterの役割
そもそもnvim-treesitterとはどういう機能を提供するプラグインなのかを整理します。
私がNeovimを使い始めた時の理解では、各種プログラミング言語のソースコードにおけるシンタックスハイライトを効かせるためにnvim-treesitterというプラグインが必要になるという認識でインストールしました。
改めて、nvim-treesitterリポジトリのREADMEを引用すると以下の通りです。
- functions for installing, updating, and removing tree-sitter parsers;
- a collection of queries for enabling tree-sitter features built into Neovim for these languages;
- a staging ground for treesitter-based features considered for upstreaming to Neovim.
tree-sitter向けのparserのインストール・アップデート・削除およびtree-sitter向けのqueryのコレクション提供し、Neovimでtre-sitterの機能を利用するための土台となるプラグインです。
・・・。
私の浅い理解では、先ほどのシンタックスハイライトとどう関係するのかがピンと来ません。
もう少し深掘って調べます。
treesitter
まずtreesitterとは、ソースコードをただの文字列から意味のある構造へと解析するための仕組みです。
以下のluaのソースコードを例にとります。
local message = "hello"
messageというローカル変数の宣言です。このソースコードを以下のような木構造として解析します。
chunk
local_variable_declaration
variable_list
identifier: message
expression_list
string: "hello"
文字列として与えられたソースコードを構造的に解釈することで、Neovimはシンタックスハイライトや関数単位での折り畳みなどの機能を実行することが可能になりま。
ParserとQuery
parserは木構造を構築する役割を持ちます。
先ほどはluaの例を挙げましたが、Javascript, Go, Rustなどプログラミング言語によって文法は大きく異なるため木構造の構築ロジックも当然言語によって変化します。よってparserも言語ごとに実装が必要となり、treesitterでは言語ごとにparserが存在します。
queryはparserが構築した木の解析を行います。
関数名をオレンジ色で表示する、などといった具体的な挙動を指示します。
なるほどなるほど。
つまり、私のNeovim環境におけるnvim-treesitterの役割は、
- シンタックスハイライトや折り畳みなどの機能のために、ソースコードを意味ある構造として解析するプラグイン
といった具合でしょうか。
Neovim 0.12系における設定内容
話を戻します。
なぜNeovim 0.12.2にアップデートするとnvim-treesitterがエラーを吐くようになったのでしょうか。それは、Neovim本体だけが原因というよりnvim-treesitterのmainブランチが大きくリライトされ、従来のrequire("nvim-treesitter.configs").setupを中心とした設定方法と合わなくなったことが原因でした。
具体的には、0.11系では以下のようにnvim-treesitter側で設定を実施していました。
require("nvim-treesitter.configs").setup({
highlight = {
enable = true,
},
})
0.12系かつnvim-treesitterのmainブランチではNeovim本体のTreesitter機能を開始する形に寄せます。
vim.treesitter.start()
vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()"
vim.wo.foldmethod = "expr"
これまでnvim-treesitter側の設定で有効化していたシンタックスハイライトなどの機能は、Neovim本体のTreesitter APIを直接使う形に寄っています。nvim-treesitterの主な役割はparser/queryのインストール管理へと縮小します。
| Neovim 0.11 | Neovim 0.12 | |
|---|---|---|
| Highlight | 主に nvim-treesitter.configs の highlight.enable = true
|
vim.treesitter.start() |
| Fold | nvim-treesitter 設定や手動設定 | vim.wo.foldexpr ="v:lua.vim.treesitter.foldexpr()" |
| Parser管理 | nvim-treesitterが中心 | nvim-treesitterが中心 |
| Pluginの役割 | highlight/indent/incremental selection なども含む大きな統合plugin | parser/query 管理が中心 |
| Neovim本体の役割 | Treesitter API はあるが、実運用は plugin 依存が多い | highlight/fold などを本体 API で直接使う |
また、0.12系ではparser/queryのビルドにtree-sitter CLIというツールが必要となりました。私はcargo installでインストールしました。
cargo install tree-sitter-cli
ref: https://github.com/tree-sitter/tree-sitter/blob/master/crates/cli/README.md
以上を踏まえて私の環境で行った変更はこちらのPRの通りです。
nvim-treesitterがGitHubでアーカイブされているが大丈夫?
A. 概ね大丈夫です
2026年4月3日にGitHub上でnvim-treesitterリポジトリがアーカイブされました。
Neovimプラグインの中でもかなりの数のユーザーが利用するリポジトリなので界隈ではそれなりに混乱を呼びましたが、アーカイブされたからといって直ちに使い物にならなくなるというわけではありません。
これまでの章で述べた通り、treesitterの機能はNeovim本体に移行しているため基本的には問題ありません。(Neovim0.12系では)
リポジトリのアーカイブについては他の記事でも多く言及されています。この辺り自分は詳しく調査できていないので、記事へのリンクを貼るだけに留めておきます。
Discussion
とても詳細な解説ありがとうございました