Neovimのdiagnosticの設定を見直す

· 5 min read

Neovim docsのDeprecated:h deprecated)を見ていたらvim.diagnostic.configを使っていろいろ設定できることを把握。
せっかくの機会なのでNeovimのDiagnosticの設定を見直すことにしました。

virtual_textのformat

筆者は、お怒りになっている方・理由を知るためにdiagnosticのformatを変更しています。

virtual_textのformatの比較

このルールだけはオフにしておきたいな、というときに怒られ元が分かると便利なんです。textlintとか。

このformatの変更について、LSP・none-ls.nvimの2つに分けて紹介します。

LSPの怒られ

以前書いた記事の時点ではハンドラを書き換えていましたが、vim.diagnostic.configで書けるようです。

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

formatの関数の中身はそのままです。

これから
vim.diagnostic.config({
virtual_text = {
format = function(diagnostic)
return string.format("%s (%s: %s)", diagnostic.message, diagnostic.source, diagnostic.code)
end,
},
})

これについては当時の調査不足なのか、普通に後から書けるようになったのか、当時は何らかの理由でvim.lsp.handlerを使う必要があったのか、正直分かりません。

none-ls.nvimの怒られ

none-lsについても触れます。

none-lsで扱うものはLSPではないため、vim.lsp.handlersを使っていたころはdiagnostics_formatの設定が別途必要でした。

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

しかし、vim.diagnostic.configを使うことでformatの指定がLSPではないnone-lsにも設定できるようになりました。
diagnostics_formatを使うと二重に表示されてしまうことになるため、消します。

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

update_in_insert

挿入モードのときにdiagnosticを更新させないupdate_in_insertfalseに設定していました。

今まで
vim.lsp.handlers["textDocument/publishDiagnostics"] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
update_in_insert = false,
})

こちらもvim.diagnostic.configで設定できるようになった!と思い設定しましたが……。

途中経過
vim.diagnostic.config({
update_in_insert = false,
-- その他の設定
})

ドキュメントをよく読んだところ、デフォルトがfalseだったので設定しなくて良かったようです。

途中経過
vim.diagnostic.config({
update_in_insert = false,
-- その他の設定
})

sign_defineからvim.diagnostic.configへ

バージョン0.10から、:sign-definesign_define()がDeprecated(非推奨)になるようです。

今まで
vim.fn.sign_define("DiagnosticSignError", { text = "", texthl = "DiagnosticSignError" })
vim.fn.sign_define("DiagnosticSignWarn", { text = "", texthl = "DiagnosticSignWarn" })
vim.fn.sign_define("DiagnosticSignInfo", { text = "", texthl = "DiagnosticSignInfo" })
vim.fn.sign_define("DiagnosticSignHint", { text = "", texthl = "DiagnosticSignHint" })
これから
vim.diagnostic.config({
signs = {
text = {
[vim.diagnostic.severity.ERROR] = "",
[vim.diagnostic.severity.WARN] = "",
[vim.diagnostic.severity.INFO] = "",
[vim.diagnostic.severity.HINT] = "",
},
},
})

ちなみに筆者はNeovimの更新をサボってv0.9.4であるため、まだ試しておらずコメントアウトにしています。

Code Actionのプラグインを見直す

ついでにLSP関連のプラグインも見直しました。nvim-code-action-menuがアーカイブされていたようです。

Code Actionのアクションを適用したらどうなるのかプレビューで表示してくれて便利だったのでした。

代わりとして、actions-preview.nvimを使うことにしました。

actions-preview.nvimの例

Nerd Fonts

LSPもろもろの設定をしているとたまにNerd Fontsのアイコンを検索したくなるのでNerd Fontsのチートシートを張っておきます。

Nerd Fontsのチートシート

ついでによく使いそうな検索ワードも載せておきます。

内容検索ワード
バツ印removex
警告warn
iマークinfo
電球lightbulbbulb
虫眼鏡マークmagnify
虫マークbug
バッテリーbattery

以上、NeovimのDiagnosticとCode Actionの見直しでした。