🌳
nvim-treesitterのmainブランチに対応します
はじめに
2025-05-24にnvim-treesitterがmainブランチに移行し、大幅な変更を加えた。対応を面倒くさがっていたが、重い腰を上げて対応を完了した。
前提知識
自分はこれまで以下のような設定を行っていた。
どうしたか
nix側の設定
nixpkgsのを直接mainブランチにする簡潔な方法がわからなかったので自力で対応することにした。自分はnvfetcherを使用しているので、
[nvim-treesitter-main]
src.git = "https://github.com/nvim-treesitter/nvim-treesitter.git"
src.branch = "main"
fetch.github = "nvim-treesitter/nvim-treesitter"
と記述した。そしたらこれをNeovimプラグインとしてビルドし追加する。前回との差分をとると、
plugin.nix
-{ pkgs }:
+{ pkgs, sources }:
{
nvim-treesitter =
let
- ts = pkgs.vimPlugins.nvim-treesitter;
+ nvim-treesitter-main = pkgs.vimUtils.buildVimPlugin {
+ inherit (sources.nvim-treesitter-main) pname version src;
+ nvimSkipModules = [ "nvim-treesitter._meta.parsers" ];
+ };
in
pkgs.symlinkJoin {
name = "ts-all";
paths = [
- ts
+ nvim-treesitter-main
]
- ++ ts.withAllGrammars.dependencies;
+ ++ pkgs.vimPlugins.nvim-treesitter.withAllGrammars.dependencies;
+ postBuild = ''
+ cd $out
+ mkdir -p ./queries
+ mv ./runtime/queries/* ./queries
+ '';
};
}
という感じだろうか(sourcesはnvfetcherで追加したものだ)。ここで3点ほど追加説明が必要になる。
-
nvimSkipModulesはテストをしないluaモジュールを指定する。nvim-treesitter._meta.parsersはrequireしない(するとエラーになる)モジュールなのでここで指定している。 - パーサーを追加するところで
pkgs.vimPlugins.nvim-treesitterを指定しているのはパーサーの情報はnixpkgsで追加されたものだからだ(つまりnvim-treesitter-mainから参照することはできない)。 -
postBuildについて。後述するが、クエリファイルはnvim-treesitter/queries/{filetype}/以下に置いてほしいのでこう記述する。
Neovim側の設定
Neovim側の設定については以下の記事が詳しい。
ここでは自分が特別に設定した項目について述べる。上で配置したファイルにあるパーサー・クエリファイルを読んでほしいので、install_dirを設定する必要がある。前回の記事の設定ですでにdpp.vimで読めるようにしたので以下の設定でよい。
require"nvim-treesitter".setup {
install_dir = vim.fn["dpp#get"]("nvim-treesitter").path,
}
nvim-treesitterはinstall_dir以下にparserディレクトリとqueriesディレクトリが存在することを期待するので上のpostBuildスクリプトが必要だった。
おわりに
大幅に変わっていると聞いて対応を渋っていたのだが、やってみると意外とすんなりできてよかった。
Discussion