Neovim の言語サービス、補完、整形
このページの目次
色付け、補完、定義への移動、テスト実行は別の機能から来る。機能が失敗したら、再導入の前に担当を特定する。
ファイルを開くと動く層
| 層 | 担当 | 限界 |
|---|---|---|
| filetype | 言語の判定 | ツールは導入しない |
| Treesitter | 構文構造と選択・強調 | プロジェクト型検査ではない |
| LSP | 定義、参照、診断、名前変更 | 全テストは実行しない |
| 補完 UI | 候補の集約と表示 | 全意味情報を生成しない |
| formatter | 規則に基づく整形 | 振る舞いの正しさは証明しない |
| DAP | ブレークポイントと実行制御 | SDK、対象、シンボルが別途必要 |
extra はこの一部を接続する。optional は対象プラグインが導入されている場合に設定され、SDK や依存関係は別に用意する。LazyVim extras
一つの言語から確認する
Rust なら先に端末で cargo check を通し、:LazyExtras で Rust を有効化する。ツールチェーンや依存取得の失敗をエディタだけの問題にしない。
Cargo プロジェクト内の Rust ファイルで確認する。
:set filetype?
:pwd
:lua print(vim.inspect(vim.lsp.get_clients({ bufnr = 0 })))
rust と関連クライアントが期待値。:pwd はエディタの場所であり、LSP のルートとは限らないためクライアント設定も見る。Neovim LSP
外へコピーした単独ファイルにはモジュールや依存の文脈がない場合がある。workspace は外側をルートにすることもある。
機能ごとに検証する
既知のローカル関数で定義、参照、hover、名前変更を試す。キーと API を切り分ける直接呼び出し:
:lua vim.lsp.buf.definition()
:lua vim.lsp.buf.references()
:lua vim.lsp.buf.hover()
結果なしでも、未解決の依存や索引途中の可能性がある。まず確実なローカル対象で基準を作る。名前変更後は対象 buffer を確認して保存し、Git diff を読む。
誰が整形するか
LazyVim では Conform がよく使われる。:ConformInfo で対象 formatter、実行可能性、ログを調べる。学習時は options.lua で自動整形を止められる。
vim.g.autoformat = false
必要時に手動整形し、プロジェクトの .editorconfig、.clang-format、rustfmt.toml を尊重する。
lua/plugins/formatting.lua の例:
return {
{
"stevearc/conform.nvim",
opts = function(_, opts)
opts.formatters_by_ft = opts.formatters_by_ft or {}
opts.formatters_by_ft.lua = { "stylua" }
end,
},
}
これは StyLua の選択であり、導入ではない。保存イベントで別途 LSP 整形を重ねると、重複処理や規則競合を起こし得る。
診断、テスト、デバッグ
構文や型が正しくても要件の境界を誤ることがある。修正課題で違いを確認する。
デバッグには起動対象、場所、引数、adapter が必要となる。同じ対象がコマンドラインで動くことを先に確認する。nvim-dap だけで全言語のバックエンドが揃うわけではない。
調べる順序
- filetype を確認する。
- プロジェクトの範囲、設定、依存を確認する。
:lua print(vim.fn.exepath("rust-analyzer"))などで実行パスを見る。独自パスを持つプラグインも確認する。- クライアント附着と起動ログを見る。
- 対象機能への対応とファイル固有の条件を調べる。
- 整形とデバッグは各自のツール・ログで切り分ける。
一度に一条件を変更し、小さなプロジェクトとログで説明してから通常設定へ戻す。