🪑

私はTreeSitterに座れていなかった

2024/04/09に公開

はじめに

私はVimからNeoVimに乗り換えた時に噂のTreeSitterを使いたいと思い設定しました。
しばらくTreeSitter を使っていたと思っていたのですが、とあるときに使えていないことに気づきました。
そうです、題名にある通り私はTreeSitterに座れていなかったのです。
本稿では私がTreeSitterに座れていなかった理由とその解決方法を紹介します。

環境

NeoVim 0.10.0-dev
Pluginマネージャー: Packer → lazy.nvim

どうして座れていなかったのか

特に経緯が必要ない人はこの結論だけで十分かと思います。

  • lazy.nvimnvim-treesitterを読み込みするときにoptsを指定する場合は、メインモジュールの指定が必要だった
    • nvim-treesitter.configsをメインモジュールに指定する
  • ハイライトが動いているイコールTreeSitterがハイライトしているではなかった
    • nvim-treesitterがインストールされていてもハイライドが有効になっていない場合がある
    • NeoVimに標準でついているハイライト機能が動いているだけかもしれない

いつからTreeSitterを使えていると錯覚していた

ことの発端はSvelteで簡単なコードを書いてみようと思った時でした。
SveltehtmlTypeScript(javascript)を一つのファイルに記載します。
はじめてSvelteのファイルを開いたときに、TypeScriptのシンタックスハイライトが効いていないことに気づきました。

このとき、ちょうど数週間前にPackerからlazy.nvimに移行したばっかだったため、移行ミスが原因かと思いました。
移行ミスを疑いつつ、Chat-GPTやTreeSitterのIssue、Web上の記事なんかを参考にしながら調査しはじめました。

確認したこと

上に述べた通りlazy.nvimに移行したばかりだったため、移行ミスの疑いから調査をはじめました。

  • lazy.nvimへのマイグレーションガイドを確認
  • lazy.nvimのアップデート
  • TSInstall allですべての言語のTreeSitterをインストール
  • TSUpdateでTreeSitterをアップデート
  • checkhealth nvim-treesitterでTreeSitterの状態を確認
  • TSInstallInfoでインストールされているTreeSitterの情報を確認

ここまでで、nvim-treesitterは動作していることが確認できました。
しかし、Svelteのファイルを開いてもTypeScriptのシンタックスハイライトが効いていませんでした。

Svelte自体が1ファイル内にhtmlTypeScriptを記載するため、何か特殊な設定が必要なのかと思いました。
調べるとGrammarあたりの設定が必要だという記事も見つけたため、TSInstallFromGrammarSvelteに関連するGrammarをインストールしました。 しかし、状況は変わりませんでした。

追加で以下を調べたところ、そもそもTreeSitterがハイライトしていないことに気づきました。

  • TSConfigInfoでTreeSitterに何が設定されているか確認
    • ここでhighlightfalseになっていることに気づく
  • TSBufEnableでTreeSitterを有効にする
    • ここでSvelteハイライトが効くようになった

つまり、lazy.nvimのoptsを記載していますが、nvim-treesitterはそれを適用できていなかったのです。
普段からハイライトが効いていたのでTreeSitterに座れていると思っていましたが、実はnvimのハイライトの機能でハイライトされているだけでした。
NeoVimに移行したタイミングに同時にTreeSitterを導入しているため、素のハイライトとTreeSitterのハイライトを見分けることができなかったのです。

設定したこと

冒頭で述べた通り、lazy.nvimoptsを指定する方法自体はあっていました。
じゃあ何か特殊な設定が必要なのかと調べたところ、nvim-treesitter.configsをメインモジュールに指定する必要があることがわかりました。
最終的に以下のように設定したところ、TreeSitterがハイライトするようになりました。

return {
  -- Treesitter
  { 
    "nvim-treesitter/nvim-treesitter", 
    build = ":TSUpdate", 
    dependencies = {
      "nvim-treesitter/nvim-treesitter-textobjects",
    },
    main = 'nvim-treesitter.configs', 
    opts = {
      highlight = { enable = true },
    }, 
  }, 
  {
    "nvim-treesitter/nvim-treesitter-textobjects",
    event = "CursorMoved",
  },
}

ハイライトが有効になっているかは、TSConfigInfoで確認しました。また、Svelteのファイルを開いてhtmlTypeScriptのシンタックスハイライトが効いているか確認しました。

さいごに

今回は私がTreeSitterに座れていなかった理由とその解決方法を紹介しました。
ハイライトは素のNeoVimでも機能としてあるため、NeoVimに移行したタイミングでTreeSitterを導入していると、TreeSitterが有効になっているかどうか見分けることが難しいかもしれません。
もし私と同じようにNeoVimに移行したタイミングでTreeSitterを導入している方がいれば、一度TreeSitterが有効になっているか確認してみてください。

GitHubで編集を提案

Discussion