mise lspでmise.tomlの書き間違いをエディタで見つける:Neovimで診断・補完・quick fixを試す

mise lspでmise.tomlの書き間違いをエディタで見つける:Neovimで診断・補完・quick fixを試す

mise 2026.10.18で追加されたmise lspをNeovimにつなぎ、わざと誤りを入れたmise.tomlで試しました。綴り間違い、非推奨キー、存在しないタスク、循環依存の診断と、quick fix、補完、hoverの動きを確かめています。
2026.10.29

どうも!オペ部の西村祐二です!

miseの設定ファイル mise.toml は、ツールのバージョン、環境変数、タスクまで1つのファイルに書けて便利です。一方で、設定キーの綴りを間違えたり、タスクの depends に存在しない名前を書いたりしても、エディタ上では気づきにくいと感じていました。

mise 2026.10.18で、mise.toml 向けの言語サーバーmise lspが追加されました。この記事では、Neovimに mise lsp をつなぎ、わざと誤りを入れた mise.toml を開いて、診断、quick fix、補完、hoverの動きを試します。あわせて、エディタを使わずにLSPのリクエストを直接送り、各機能の応答も確かめます。

mise lspでできること

mise lsp は、エディタから起動され、標準入出力でやり取りするLanguage Server Protocolのサーバーです。リリースノートと公式ドキュメントによると、次の機能があります。

  • 診断: TOMLの構文エラー、未知のキー(候補の提示付き)、型の違い、非推奨キー、存在しないタスク名、タスクの循環依存
  • quick fix: 未知のキーやタスク名を候補に置き換える、非推奨キーを後継のキーに書き換える
  • 補完とhover: 設定キー、[tools] のツール名、depends などのタスク名
  • タスクの定義への移動、参照の検索、rename
  • mise fmtと同じ整形
  • semantic tokens: タスク名やツール名などの色分け(2026.10.19で追加)

全体の関係を自作の概念図にまとめると、次のようになります。

自作の概念図。エディタのLSPクライアントが標準入出力でmise lspを起動し、mise lspは入っているmiseのスキーマと組み込みのregistryを使ってmise.tomlなどの設定ファイルを解析する。Cargo.tomlやpyproject.tomlは対象外

mise lsp は、設定キーの一覧や型をインストール済みのmiseのスキーマから読みます。そのため、使っているmiseのバージョンに合った診断になります。また、公式ドキュメントによると、mise lsp は mise.toml などmiseの設定ファイル以外を無視します。そのため、エディタ側でTOMLファイル全体につないでも、Cargo.toml や pyproject.toml には影響しないとされています(Cargo.toml では後で確かめます)。

Neovimにつなぐ

公式ドキュメントにあるNeovimの設定を使いました。Neovim 0.11以降で使える vim.lsp.config の設定です。最後の1行は、診断を行末に表示するために足したものです。Neovim 0.11以降は行末の表示(virtual text)が既定でオフになっています。

init.lua
vim.lsp.config("mise", {
  cmd = { "mise", "lsp" },
  filetypes = { "toml" },
  root_markers = { "mise.toml", ".mise.toml" },
})
vim.lsp.enable("mise")
vim.diagnostic.config({ virtual_text = true })

mise 2026.10.18より古いmiseでは、mise lsp はプロジェクトの lsp という名前のタスクとして扱われます。手元のmiseが対応しているかは、mise help lsp の出力に Usage: mise lsp が含まれるかで確かめられます。

以下の操作は、補完プラグインを入れていない素のNeovimで行いました。hoverは K、コードアクションは :lua vim.lsp.buf.code_action()(0.11以降は既定のキー gra でも呼べます)、補完は挿入モードの <C-x><C-o> です。

書き間違いを入れたmise.tomlで試す

次の mise.toml に、わざと5種類の誤りを入れました。

mise.toml
env_path = ["./bin"]

[tools]
node = "24"

[settings]
experimantal = true
jobs = "four"

[tasks.build]
description = "Build the app"
run = "echo build"
depends = ["lnt"]

[tasks.lint]
description = "Lint the sources"
run = "echo lint"
depends = ["test"]

[tasks.test]
run = "echo test"
depends = ["lint"]
  • 1行目: 非推奨のキー env_path
  • 7行目: experimental の綴り間違い
  • 8行目: 整数を取る jobs に文字列
  • 13行目: 存在しないタスク lnt
  • 18行目と22行目: lint と test の循環依存

5種類の誤りに6件の診断が出る

ファイルを開くと、循環依存が2行に出るので、6件の診断が行末に表示されました。

Neovimでmise.tomlを開いた画面。1行目にenv_pathの非推奨、7行目にexperimantalの未知キー、8行目にfourの型違い、13行目にlntの未知タスク、18行目と22行目に循環依存の診断が出ている

行 種類 重要度 メッセージ
1 deprecated-key 警告 env_path is deprecated ... use env._.path instead. This will be removed in mise 2027.4.0.
7 unknown-key 警告 unknown key experimantal; did you mean experimental?
8 invalid-value エラー "four" is not of type "integer"
13 unknown-task 警告 unknown task lnt; did you mean lint?
18 task-cycle エラー dependency cycle: lint -> test -> lint
22 task-cycle エラー dependency cycle: test -> lint -> test

非推奨キーには削除予定のバージョン(mise 2027.4.0)まで出るので、移行の期限も分かります。タスクの循環依存は mise run で実行して初めて気づくことが多く、編集中に見つけられるのは助かりそうです。

quick fixは3種類の誤りに付く

7行目でコードアクションを呼ぶと、候補の experimental に置き換える修正が出ました。

7行目でvim.lsp.buf.code_action()を実行し、Replace with experimentalが候補に出ている画面

後述のスクリプトでLSPのリクエストを直接送って確かめると、quick fixは次の3つの診断に付いていました。

  • experimantal → experimental に置き換え
  • env_path → env._.path に置き換え(キー名だけを書き換え、値の ["./bin"] はそのまま)
  • lnt → lint に置き換え

env._.path = ["./bin"] はTOMLのドットつきキーなので、[env] テーブルに _.path を書いたのと同じ意味になります。ファイルに別の [env] テーブルがある場合は、同じテーブルを2回定義することになるので、[env] の中へ移す必要がありそうです(この組み合わせは試していません)。型の違い(jobs = "four")と循環依存にはquick fixが付かず、自分で直す必要があります。

hoverでツールのbackendやタスクのコマンドを見る

[tools] の node にカーソルを置いてhoverすると、ツールの説明とbackendが表示されました。

nodeの上でhoverし、Node.jsの説明とBackends: core:nodeが浮動ウィンドウに表示された画面

設定キーの上では、型と説明が表示されました(例: settings.jobs は integer で、同時に動かすジョブ数)。depends に書いたタスク名の上では、タスクの説明と run のコマンドが出ます。

dependsの中で定義済みのタスクを補完する

次の画面は、1行目と7行目のquick fixを適用したあとのものです。13行目の depends = ["lnt"] の中身を消して補完を呼ぶと、lint(説明付き)と test が候補に出ました。

depends の中で補完を呼び、lint(Lint the sources)とtestが候補に出ている画面。1行目はenv._.path、7行目はexperimentalに修正済み

LSPに直接送った補完では、[tasks.lint] の depends の中で build と test が返り、自分自身の lint は候補に含まれませんでした。[settings] の直下の行頭で補完を呼ぶと、設定キーが147件返りました(mise 2026.10.19の場合。件数はバージョンと位置で変わります)。

エディタを使わずにLSPの応答を確かめる

画面だけでは分かりにくい部分は、小さなPythonスクリプトを書き、mise lsp を子プロセスで起動してLSPのメッセージを直接送って確かめました。結果は次の通りです。

試したこと 結果
initializeで返る機能 codeAction、completion、definition、documentFormatting、hover、references、rename、semanticTokens
depends = ["lint"] から定義へ移動 [tasks.lint] の位置
lint の参照を検索 [tasks.lint] と depends = ["lint"] の2か所
lint を check にrename 上の2か所を書き換える編集。綴り間違いの lnt は対象外
スペースを抜いた別の mise.toml(node="24")を整形 node = "24" に直す編集。mise fmt の出力と同じ
綴り間違いを入れた Cargo.toml 診断、hover、整形のどれも返さない

trustしていないディレクトリでも動く

検証用のディレクトリは mise trust していないので、mise tasks ls は「not trusted」で失敗しました。それでも mise lsp は診断とhoverを返しました。公式ドキュメントでは、mise lsp は設定を解析するだけで、テンプレートの展開もコマンドの実行もしないとされています。クローンしたばかりのリポジトリの mise.toml を、trustする前にエディタで確認できます。

他のエディタ

Zedについては、公式ドキュメントでmise-zed拡張が mise lsp を起動すると説明されています。今回は試していません。

まとめ

  • mise 2026.10.18で追加された mise lsp で、mise.toml の書き間違いを編集中に確認できました。対象は綴り間違い、型の違い、非推奨キー、存在しないタスク名、タスクの循環依存です
  • 綴り間違い、非推奨キー、存在しないタスク名にはquick fixが付きます。型の違いと循環依存は自分で直す必要があります
  • 補完では depends に定義済みのタスク(自分自身は除く)が、hoverではツールのbackendやタスクの run のコマンドが出ました
  • Neovimでは、公式ドキュメントの vim.lsp.config の設定でつながりました
  • trustしていないディレクトリの mise.toml でも診断とhoverが返りました。Cargo.toml には何も返さなかったので、TOMLファイル全体につないでも他のファイルの邪魔になりません

参考リンク

この記事をシェアする

関連記事