Neovimのコマンドラインや通知がリッチになるnoice.nvim使ってみた

noice.nvimを使ってみました。カスタマイズ豊富です。
2022.10.28

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

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

noice.nvimを使ってみました。以下の画像のように、コマンドラインが中央に表示されたり、右上や右下に通知が出ます。

本記事では、noice.nvimの機能の一部を紹介します。2022年10月28日時点での情報です。インストール方法についてはREADMEをご覧ください。

コマンドラインが中央に表示される

noice.nvimを入れると、Neovimのコマンドラインが中央に表示されます。

※コマンドラインの補完にはnvim-cmpcmp-cmdlineを使っています。

中央に表示されるだけではなく、色も付きます。補完候補を表示している場合は一度に表示される候補の数が少なくなりますが、支障はありません。

:!dateのような外部のコマンドの実行では、:!を入力したら表示が切り替わります。間違えた、という場合はBSキーなどを入力すれば元の表示に戻ります。

右上に実行結果が表示されていますね。この通知欄については後で紹介します。

Luaの実行:luaは、:luaの後に半角スペースを入力すると表示がLua向けに切り替わります。

ヘルプの実行:hも表示が切り替わります。

/?による検索では、現在のカーソルより下に検索するのか上にするのかがアイコンで区別されています。

ちなみに表示されている枠よりも長いコマンドを入力すると、ウィンドウが横に広がります。

通知がリッチになる

noice.nvimはnotifyvsplitminipopup……のように数種類の"View"があります。このViewを使って通知をリッチに表示します。前述のコマンドラインもcmdline_popupというViewです。 Viewは独自の実装のほか、nvim-notifynui.nvim、virtual text機能も使っているようです。

以下はnotifyViewによる通知です。画面の右上にひょっこり現れます。

小さめに表示したい場合はminiを使うのが良さそうです。画面の右下にそっとやってきます。

ErrorやWarningの表示は以下のようにminiでもアイコンや色つきで表示されます。

通知は数秒立つと消えます。

履歴は:Noice:Noice historyを実行して見ることができます。以下は:Noiceを実行したときの画面です。これはsplitViewのようです。

メッセージ内容のほか、時刻も表示されます。上記の画像でうっすら表示されているmsg_showwmsgは、通知のフィルタリングの設定時に使える情報です。 すぐヤンクもできて便利です。

最後の通知のみ見たい場合は:NoiceLastNoice lastを実行します。

LSPに関する情報も表示されます。

通知のフィルタリングをカスタマイズしてみた

通知のViewを変えたい場合、filterで該当するメッセージのフィルタリングし、view=...でViewを指定します。

筆者の2022-10-28現在のnoice.nvimの設定を紹介します。シンタックスハイライト付きで見たい方は筆者のdotfilesをどうぞ。

local noice = require("noice")

local function myMiniView(pattern, kind)
	kind = kind or ""
	return {
		view = "mini",
		filter = {
			event = "msg_show",
			kind = kind,
			find = pattern,
		},
	}
end

noice.setup({
	messages = {
		view_search = "mini",
	},
	routes = {
		{
			view = "notify",
			filter = { event = "msg_showmode" },
		},
		{
			filter = {
				event = "notify",
				warning = true,
				find = "failed to run generator.*is not executable",
			},
			opts = { skip = true },
		},
		myMiniView("Already at .* change"),
		myMiniView("written"),
		myMiniView("yanked"),
		myMiniView("more lines?"),
		myMiniView("fewer lines?"),
		myMiniView("fewer lines?", "lua_error"),
		myMiniView("change; before"),
		myMiniView("change; after"),
		myMiniView("line less"),
		myMiniView("lines indented"),
		myMiniView("No lines in buffer"),
		myMiniView("search hit .*, continuing at", "wmsg"),
		myMiniView("E486: Pattern not found", "emsg"),
	},
})

重要ではないけど表示しておきたい通知はmyMiniViewminiのviewに変更しています(もう少し賢く書けそうな気がしています)。

画面がいきなり赤文字で埋め尽くされることもあるので、まだまだカスタマイズの試行錯誤中です。

最後に

今回紹介しきれていない部分もたくさんあります。

細かいカスタマイズについては、:h noice.nvim.txtREADMEに書かれている他、wikiにも例が載っています。

noice.nvimはまだかなり変更の激しいプラグインではありますが、通知の表示がリッチになったり履歴が見やすくなる(個人差あり)ため、しばらく使い続けてみようと思います。筆者はBreaking Changes Issue #78をsubscribeしたり、プラグインマネージャーでコミットメッセージを確認しています。