NeovimのLSPで誰にどうして怒られたのかを確認するための設定

Neovimのdiagnosticsのformatを変えてみました
2022.11.25

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも。CX事業本部Delivery部のえーたん(@eetann092)です。

NeovimのLSPのDiagnosticsで、誰に怒られているのか知りたくなったので、表示形式を変更してみました。

本記事では、Neovimnull-ls.nvimでDiagnosticsの表示形式を変更する設定を紹介します。せっかくなので調査の流れも書いておきます。

NeovimのDiagnosticsの表示形式を変更する

まずはNeovimでの設定するために、:h diagnosticでドキュメントを漁りました(diagnostic-apiに飛びました)。

vim.diagnostic.config()のパラメータvirtual_textのオプションformatを発見しました。このformatでDiagnosticsの表示を変えることができるようです。

以下のように設定を追加しました。

 vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
 	update_in_insert = false,
+	virtual_text = {
+		format = function(diagnostic)
+			return string.format("%s (%s: %s)", diagnostic.message, diagnostic.source, diagnostic.code)
+		end,
+	},
 })

formatの引数diagnosticの構造については、同じようにドキュメントを漁り、:h diagnostic-structureに書かれていることを見つけました。

パラメータvirtual_textには、diagnostic.sourceを挿入するオプションsourceもあります。せっかくなのでオプションsourceの実装を見たところ、メッセージの先頭にdiagnostic.sourceを追加してくれるようです。今回はdiagnostic.sourceをメッセージの後ろの方に表示したかったため、オプションsourceは使いませんでした。

null-ls.nvimのDiagnosticsの表示形式を変更する

次にnull-ls.nvimでの設定です。こちらはドキュメントに書かれていました。デフォルトのフォーマットは#{m}(メッセージのみ)です。

以下のように設定を追加しました。

 local null_ls = require("null-ls")
 null_ls.setup({
+	diagnostics_format = "#{m} (#{s}: #{c})",
 	-- 省略
 })

先程設定したNeovim本体の表示形式と同じようにするため、「メッセージ、ソース、コード」の順にしました。

最後に

textlintでルールを無視したい時に便利だと思って設定してみました。

本記事で出てきたパラメータvirtual_textやnull-ls.nvimには他にもオプションがあるので、ぜひヘルプやドキュメントを読んでみてください。