脱LSPの軽快さへ:Neovim + Tree-sitterで実現する「爆速」開発環境の構築術
こんにちは。エディタの深淵へようこそ。
多くの開発者が「IDE並みの機能」を求めてLSP(Language Server Protocol)をフル活用していますが、大規模プロジェクトになると、エディタが重くなったり、メモリを食いつぶしたりすることにストレスを感じたことはありませんか?
実は、「完璧な静的解析」を諦めることで、コーディング体験は劇的に軽快になります。 今回は、LSPのオーバーヘッドを避けつつ、Tree-sitterを活用して「脳の拡張」のような軽快な編集環境を作るための、一段階上の設定術を伝授します。
—
1. なぜ「Tree-sitter」なのか?
LSPは、外部プロセスを立ち上げ、コードをコンパイルに近いレベルで解析して返答を待ちます。これは正確ですが、重い。
一方、Tree-sitterは「増分解析(Incremental Parsing)」技術です。ファイル全体を再解析するのではなく、君が入力した「たった1文字」の変更差分だけを解析して、抽象構文木(AST)を更新します。これを利用すれば、LSPを動かさずとも、超高速かつ高精度なシンタックスハイライトやコード構造の把握が可能になるのです。
—
2. 実装:Tree-sitterを「脳の代わり」にする
まずは、Neovimの `nvim-treesitter` を導入します。設定は `init.lua` に記述します。
— nvim-treesitterの設定
require’nvim-treesitter.configs’.setup {
— 主要言語のパーサーを自動インストール
ensure_installed = { “lua”, “python”, “typescript”, “rust”, “go” },
highlight = {
enable = true, — 高速なハイライトを有効化
additional_vim_regex_highlighting = false, — Vim標準の遅いハイライトを無効化
},
— 現在の関数のスコープを追跡する機能
incremental_selection = {
enable = true, — 選択範囲をASTに基づいて拡張
keymaps = {
init_selection = “gnn”,
node_incremental = “grn”,
scope_incremental = “grc”,
node_decremental = “grm”,
},
},
}
なぜこの設定が「震えるほど」役立つのか
`incremental_selection` を使ってみてください。`grn` を押すたびに、単語→式→行→関数ブロックと、論理的な単位で選択範囲が広がります。これは、「コードの意味を理解しながら選択する」という、LSPなしでは考えられないような操作感を軽量かつ瞬時に提供してくれます。
—
3. 現場で生きる:Treesitter-contextでの現在位置把握
大規模なコードベースで「今、自分はどの関数の、どのループの中にいるんだっけ?」と迷子になることはありませんか? `nvim-treesitter-context` を導入しましょう。
— インストール後、以下を呼び出すだけでOK
require’treesitter-context’.setup{
enable = true, — 有効化
max_lines = 3, — 画面上部に表示するコンテキストの最大行数
trim_scope = ‘outer’, — 適切なスコープを自動抽出
}
これがもたらす利益:
画面上部に、現在のスコープ(クラス名や関数名)が常に固定表示されます。LSPの定義ジャンプに頼らずとも、コードの構造が一目でわかる。これだけで、画面を行き来する回数が減り、思考のコンテキストスイッチが激減します。
—
4. 応用:Tree-sitterクエリ言語で「自分専用」のハイライトを
Tree-sitterの真骨頂は、クエリ言語(Schemeに似たDSL)を使って、コードの特定のパターンを抽出できる点です。例えば、「TODOコメントを目立たせたい」という場合、わざわざプラグインを入れずとも、数行のクエリで定義可能です。
`after/queries/lua/highlights.scm` というファイルを作成します。
; Luaのコメント内のTODOを特別色にするクエリ
(comment) @comment
(#match? @comment “TODO”) ; コメント内にTODOという文字列が含まれるか
このように、「自分の開発スタイルに合わせたコードの強調」が、LSPの辞書を待たずとも、ローカルで数ミリ秒の精度で動作します。
—
5. HelloWorld的動作確認:その軽さを体感する
設定が終わったら、以下の手順で確認してください。
1. 巨大なファイルをオープンする: 数千行あるコードを開いてみてください。`nvim-treesitter` があれば、一瞬でハイライトが完了します。LSPが立ち上がるのを待つ「あの時間」はありません。
2. `grn` で選択: 関数の中にカーソルを置き、`grn` を連打してみてください。ASTが正確にツリー構造を捉えていることがわかるはずです。
3. `treesitter-context` を確認: 関数をスクロールアウトした瞬間、画面上部にその関数の名前が張り付くのを見てください。
—
先輩エンジニアからのアドバイス
LSPは確かに強力ですが、すべてをLSPに頼ると、エディタは「重いブラウザ」のようになります。「構造の把握はTree-sitterに、詳細な定義ジャンプはLSPに」というように、責務を分担させるのが、最も賢いDevOps環境の構築法です。
この軽快さを一度手に入れると、もう重いIDEには戻れません。さあ、次はあなたのプロジェクトの特定の言語で、どんなクエリを書いてコードを「可視化」するか、ぜひ考えてみてください。
あなたの開発ライフが、より速く、より直感的になることを願っています!