nvim-treesitterのmain移行 configs not foundの直し方
Neovimの設定を久しぶりに更新したら、起動した瞬間にmodule 'nvim-treesitter.configs' not foundと出て、ハイライトが消えた。原因は自分の設定ではなく、nvim-treesitterの既定ブランチがmasterからmainに切り替わったことです。mainは書き直された別物で、何年も使われてきたrequire('nvim-treesitter.configs').setup{...}という書き方がそもそも存在しません。
この記事では、masterの設定に書いていた項目がmainではどこへ行ったのかを、1行ずつ手元で動かして確かめました。エラーが出ないまま何も効いていない、という分かりにくい壊れ方もあるので、そちらも合わせて載せます。
検証環境:NVIM v0.12.4(macOS、Homebrew)。nvim-treesitterはmainのe289100f(2026-10-03)と、masterのcf12346a(2026-03-23)。lazy.nvimは306a055。tree-sitter-cliは0.27.0。どれも空の作業ディレクトリにHOMEとXDG_*を向けた使い捨ての環境で起動し、ハイライトが付いたかどうかはvim.treesitter.highlighter.activeで判定しました。掲載したエラーと出力は実行結果で、パスだけ~に縮めています。
目次(9項目)
| masterの設定 | mainでの書き方 | 提供元 |
|---|---|---|
| ensure_installed | require('nvim-treesitter').install{...} | プラグイン |
| highlight | vim.treesitter.start() | Neovim本体 |
| fold | v:lua.vim.treesitter.foldexpr() | Neovim本体 |
| indent | v:lua.require'nvim-treesitter'.indentexpr() | プラグイン(実験的) |
| incremental_selection | ビジュアルモードのan in ]n [n | Neovim本体 |
何が起きたか
GitHubのnvim-treesitterを開くと、既定ブランチがmainになっています。READMEの冒頭には次の一文があります。
This is a full, incompatible, rewrite: Treat this as a different plugin you need to set up from scratch following the instructions below.
互換性の無い全面書き直しなので、別のプラグインとして最初から設定し直してほしい、という宣言です。同じ段落で、masterは凍結されたうえでNeovim 0.11との後方互換のために残す、と書かれています。手元で取ったmasterの最新コミットは2026-03-23で、それ以降は動いていません。
mainの動作条件は、Neovim 0.12.0以降と、tree-sitter-cli 0.26.1以降の2つです。CLIについてはREADMEに「npmではなくパッケージマネージャで入れる」と注記があります。masterはパーサのビルドにcc(Cコンパイラ)を直接使っていましたが、mainはビルドをtree-sitter buildに任せるので、CLIが無いとパーサが1つも入りません。
lazy.nvimやvim.packはブランチを指定しなければ既定ブランチを取ってくるので、プラグインを更新した時点で、何もしていないのにmainへ乗り換わります。
configs not foundが出る理由
masterの定番だった設定を、mainを入れた環境でそのまま読ませました。
require('nvim-treesitter.configs').setup {
ensure_installed = { 'python' },
highlight = { enable = true },
}
起動すると次のエラーで止まります(続きはpackage.pathの候補が10行以上並ぶだけなので省きました)。
Error in ~/.config/nvim/init.lua:
E5113: Lua chunk: ~/.config/nvim/init.lua:2: module 'nvim-treesitter.configs' not found:
no field package.preload['nvim-treesitter.configs']
no file './nvim-treesitter/configs.lua'
mainのlua/nvim-treesitter/を見ると、入っているのはconfig.lua install.lua indent.luaなどで、configs.luaはありません。モジュールごと消えているので、requireの段階で失敗します。lazy.nvimでmain = 'nvim-treesitter.configs'を指定していた場合は、同じ原因でFailed to run `config` for nvim-treesitterのあとに同じnot foundが続きます。
エラーが出るのはまだ親切なほうです。lazy.nvimのoptsだけで書いていた設定、たとえば次の1行は、mainではエラーも警告も出ません。
{ 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate',
opts = { ensure_installed = { 'python', 'lua', 'vim' }, highlight = { enable = true } } },
mainを書かないと、lazy.nvimはrequire('nvim-treesitter').setup(opts)を呼びます。mainにもsetup()はあるので呼び出しは成功しますが、受け付けるのはinstall_dirだけで、残りのキーは黙って捨てられます。実際にこの設定でLazy! syncしてからPythonのファイルを開くと、ハイライトは付かず(syntax=pythonの昔ながらの色のまま)、get_installed()は空の{}を返しました。パーサが1つも入っていないのに、画面には何も出ない状態です。「エラーは無いのに色が地味になった」と感じたら、これを疑ってください。
Neovim 0.12だけで動く範囲
書き直す前に、プラグイン無しでどこまで動くかを見ておくと、設定を最小限にできます。Neovim 0.12.4の本体には、次の7言語のパーサが同梱されていました。
:lua print(vim.inspect(vim.api.nvim_get_runtime_file('parser/*', true)))
{ ".../lib/nvim/parser/c.so", ".../lib/nvim/parser/lua.so",
".../lib/nvim/parser/markdown.so", ".../lib/nvim/parser/markdown_inline.so",
".../lib/nvim/parser/query.so", ".../lib/nvim/parser/vim.so",
".../lib/nvim/parser/vimdoc.so" }
ただし、パーサがあることと、開いた瞬間にtreesitterのハイライトが付くことは別でした。nvim --cleanで各言語のファイルを開いて確かめた結果がこれです。
| ファイル | 開いただけ | vim.treesitter.start()後 |
|---|---|---|
| Lua | 付く | 付く |
| Markdown | 付く | 付く |
| ヘルプ(:help) | 付く | 付く |
| C | 付かない | 付く |
| Vim script | 付かない | 付く |
| Python | 付かない | エラー |
違いを分けているのは本体のftpluginです。$VIMRUNTIME/ftplugin/の中でvim.treesitter.start()を呼んでいるのはlua.lua markdown.lua help.lua query.luaの4つだけで、CとVim scriptはパーサがあるのに従来のsyntaxで色が付きます。この2つは自分でstart()を呼べば切り替わります。
パーサの無いPythonでstart()を呼ぶと、こう言われます。
Parser could not be created for buffer 1 and language "python"
つまり、書くのがLuaとMarkdownとVim scriptくらいなら、nvim-treesitterを入れなくても困りません。プラグインが要るのは、同梱されていない言語のパーサとクエリを入れたいときです。
main版の導入
先にtree-sitter-cliを入れます。macOSなら次の1行です。
brew install tree-sitter-cli
Homebrewにはtree-sitterという似た名前のformulaもありますが、こちらはライブラリだけでtree-sitterコマンドは入りません。手元はちょうどこの状態で、brew listにtree-sitter 0.26.11があるのにwhich tree-sitterは空でした。
CLIが無いままパーサを入れようとすると、ダウンロードまでは進んでからビルドで落ちます。
[nvim-treesitter/install/python]: Downloading tree-sitter-python...
[nvim-treesitter/install/python]: Compiling parser
[nvim-treesitter/install/python] error: Error during "tree-sitter build": vim/_core/system:324: ENOENT: no such file or directory (cmd): 'tree-sitter'
:checkhealth nvim-treesitterでも、Requirementsの欄にERROR tree-sitter-cli not foundが赤い印付きで出ます。CLIを入れたあとは同じ行がOK tree-sitter-cli 0.27.0 (/opt/homebrew/bin/tree-sitter)に変わりました(どちらも行頭の記号は省いています)。
プラグイン本体の指定は、READMEの例どおりlazy = falseにします(mainは遅延読み込みに対応していないと明記されています)。
{
'nvim-treesitter/nvim-treesitter',
lazy = false,
build = ':TSUpdate',
}
masterのensure_installedに当たるのがinstall()です。非同期で動くので、起動時に入れ終わるまで待たせたいときはwait()を付けます。引数はミリ秒の上限です。
require('nvim-treesitter').install({ 'python' }):wait(300000)
手元ではDownloading Compiling parser Installing parser Language installedの4行が出て、wait()はtrueを返しました。CLIが無い状態では同じ呼び出しがfalseを返したので、スクリプトで導入を自動化するなら戻り値を見ると失敗に気づけます。入れたものはstdpath('data')のsite/parser/python.soとsite/queries/python/に置かれます。すでに入っている言語を渡しても何もしません。
対話的に入れるなら:TSInstallも残っています。:TSInstall javascriptを実行すると、JavaScriptのクエリが参照するecmaとjsxのクエリまで一緒に入り(パーサとして増えたのはjavascript.soだけです)、最後にInstalled 3/3 languagesと出ました。入れ直したいときは:TSInstall!です。mainのコマンドは:TSInstall :TSInstallFromGrammar :TSUpdate :TSUninstall :TSLogの5つだけで、masterにあった:TSEnable :TSBufEnable :TSModuleInfoのような有効化と状態確認のコマンドはありません。有効にするかどうかは、次の節のとおり自分の設定で決めます。
ハイライト・fold・indentを書き直す
パーサを入れても、それだけではハイライトは付きません。Pythonのパーサを入れた直後に.pyを開くと、highlighter.activeはfalseのままでした。mainのREADMEにも、クエリは用意するが自動では有効にしない、とあります。ハイライトとfoldはNeovim本体の機能になったので、FileTypeで自分で呼びます。
vim.api.nvim_create_autocmd('FileType', {
pattern = { 'python', 'javascript' },
callback = function()
vim.treesitter.start()
vim.wo[0][0].foldexpr = 'v:lua.vim.treesitter.foldexpr()'
vim.wo[0][0].foldmethod = 'expr'
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
end,
})
この設定でPythonのファイルを開き直すと、highlighter.activeがtrue、syntaxが空になり、treesitterの色に切り替わりました。patternに書いた言語のパーサが入っていないとstart()が前の節のエラーを出すので、パーサを入れた言語だけを並べます。
foldは1行目が関数定義、2〜3行目がif、という8行のPythonでfoldlevel()を順に見ると、1 2 2 1 0 1 2 2でした。関数とクラスとその中のブロックが、そのまま折りたたみの段になっています。ここで1つ注意があります。foldlevelの既定値は0なので、開いた瞬間に全部の折りたたみが閉じた状態になります。開いたまま始めたいなら、vim.o.foldlevelstart = 99のような値を設定に足してください。折りたたみの開け閉めは折りたたみを開閉するコマンド一覧のキーがそのまま使えます。
インデントだけはNeovim本体ではなく、プラグイン側の関数です。READMEでは実験的(experimental)という扱いになっていて、引用符の組み合わせまで指定どおりに書く必要があります。インデントの崩れたJavaScriptにgg=Gをかけると、きれいに整いました。ただ、同じファイルを--cleanで開き、本体のGetJavascriptIndent()で同じことをした結果とdiffを取ると、まったく同じでした。この程度のコードでは差が出ないので、従来のインデントに不満が無ければindentexprの行は無くても構いません。
incremental selectionは本体のan/inへ
masterのincremental_selection(gnnから選択をノード単位で広げていく機能)は、mainには移っていません。代わりにNeovim 0.12の本体に、ビジュアルモードの既定のキーとして入りました。news.txtのTREESITTERの節にはv_an v_in v_]n v_[nが「incremental selection of treesitter nodes」として載っています。
同梱パーサのあるLuaで試しました。return a + bのaにカーソルを置き、vのあとにanを重ねたときの選択範囲です。
| 押したキー | 選択された範囲 |
|---|---|
| van | a + b |
| vanan | return a + b |
| vananan | if a > 0 thenからendまでの3行 |
| vananin | a + bに戻る |
| v2an | return a + b |
anが親のノードへ広げ、inが子へ縮めます。カウントも効きます。]nと[nは同じ階層の隣へ移るキーで、local function add(a, b)の引数aの上でv]nを押すと選択がbに移り、[nでaに戻りました。0.12.4には]N [Nもあり、こちらは移るのではなく隣まで広げます。v]Nでa, bが選ばれました。
パーサの無いバッファでは、ヘルプに書かれているとおりLSPのselectionRangeに頼ろうとします。LSPも無いPythonのファイルでvanを押すと、vim.lsp: method "textDocument/selectionRange" is not supported by any server activated for this bufferと出て、選択は1文字のままでした。パーサを入れてstart()したあとの同じファイルでは、return 1の1からvanでreturn 1、もう一度でifのブロックへと広がりました。
Pythonでvanを試した最初の1回は、ただのvの時点で選択が1行目から4行目まで広がっていて、選択の機能が壊れていると思い込みました。実際はfoldexprを入れた直後で、カーソルのある関数が丸ごと閉じた折りたたみの中にいただけでした。foldlevelを上げたら、1の1文字から順に広がる本来の動きに戻りました。設定を3つ同時に書き換えると、どれのせいかを見誤ります。
移行せずmasterに固定する選択肢
すぐに書き直す時間が無いなら、ブランチを固定すれば元の設定のまま動かせます。lazy.nvimならbranchを1行足します。
{
'nvim-treesitter/nvim-treesitter',
branch = 'master',
lazy = false,
build = ':TSUpdate',
main = 'nvim-treesitter.configs',
opts = {
ensure_installed = { 'python' },
highlight = { enable = true },
indent = { enable = true },
},
}
Neovim 0.12.4でLazy! syncすると、masterのcf12346aが入り、ensure_installedのPythonパーサもビルドされました。masterはccでビルドするので、tree-sitter-cliは要りません。Pythonのファイルではハイライトが付き、indentexprはnvim_treesitter#indent()になっていました。標準プラグイン管理のvim.packで入れている場合は、{ src = 'https://github.com/nvim-treesitter/nvim-treesitter', version = 'master' }と書けば同じコミットに固定されることも確かめました。
ただし、0.12で完全に動くわけではありません。コードブロックを含むMarkdownを開いたところ、画面の下に次のエラーが出てPress ENTERで止まりました。
Decoration provider "start" (ns=nvim.treesitter.highlighter):
Lua: .../lua/vim/treesitter/languagetree.lua:215: .../lua/vim/treesitter.lua:197: attempt to call method 'range' (a nil value)
コードブロックの無いMarkdownや、Lua・C・Vim script・ヘルプのバッファでは出ませんでした。同じファイルをmainの環境で開いたときも出ません。masterは0.11向けに凍結されたもので、0.12との組み合わせはREADMEのサポート対象の外です。固定は書き直すまでのつなぎと考えたほうが安全です。
まとめ
module 'nvim-treesitter.configs' not foundは、設定の誤りではなく、プラグインが別物に入れ替わった合図です。mainで設定し直すなら、tree-sitter-cliを入れ、install()でパーサを入れ、FileTypeでvim.treesitter.start()を呼ぶ、の3段で元のハイライトに戻ります。foldは本体のfoldexpr()、選択の拡大は本体のan/inに移り、プラグインに残ったのはパーサの導入とインデントだけです。冒頭の表がそのまま書き換えの対応になっています。
エラーの出ないoptsだけの設定は、mainでは何もしていないので、色が地味になっていないか一度確かめてください。0.12で入った他の変更はNeovim 0.12の新機能にまとめています。