はじめに
この記事はVim Advent Calendar 2022 カレンダー2 15日目の記事です。
カラースキームをいじるとなると、highlightがずらっと並んだファイルを見たことがあると思います。
それだけ見ると数が多く嫌になりますが、普段見る画面に色を付けるだけなら意外と少なくすみます。
今回は、できるだけ楽をしてカラースキームを作ってみます。
やることは単純、テーブルを書いたらnvim_set_hl()を呼ぶだけです。
色定義
使う色をテーブルに書いていきます。
色はカラーコードか色名を指定できます。今回はctermは他のカラースキームに譲りGUI一本でいきます。
:set termguicolorsしましょう。
パイロットの色彩雫が好きなので公式の一覧表から拾ってきた色を使います。
実際に書いた色はもっと綺麗なので気になる人は万年筆を使いましょう。
local c = {
	asagao = "#2663a4",
	ajisai = "#5373ae",
	tsuyukusa = "#3b91c2",
	konpeki = "#219dd0",
	amairo = "#4dbde3",
	tsukiyo = "#407587",
	kujaku = "#1d9ea3",
	shinkai = "#6c88af",
	syoro = "#388679",
	shinryoku = "#13815e",
	chikurin = "#a4b974",
	fuyusyogun = "#6f8696",
	kirisame = "#828083",
	takessumi = "#4e4e4e",
	tsutsuji = "#d6336c",
	kosumosu = "#ef829f",
	momiji = "#de5743",
	muraskishikibu = "#6c509a",
	yamabudo = "#8d387c",
	yuyake = "#f9983a",
	fuyugaki = "#f06e3a",
	inaho = "#9b7939",
	tsukushi = "#8c6663",
	yamaguri = "#56514e",
}
関連付け
実際に定義するハイライトグループですが、ベースの色を指定すればそれを参照しているものもあるため、それっぽくするだけなら自分で定義する色はそこまで多くありません。
デフォルトで用意されているNeovimのハイライトグループは45個1、そのうち今回定義したのは24個です。
これだけでVimの見た目がそれっぽくなります。
(指定できる物は:h nvim_set_hlを参照してください。)
local highlight = {
	ColorColumn = { fg = c.yamaguri, bg = c.momiji },
	Cursor = { fg = c.takessumi },
	Directory = { fg = c.tsuyukusa },
	ErrorMsg = { fg = "white", bg = c.kosumosu },
	WinSeparator = { fg = c.shinryoku, bg = c.chikurin },
	Folded = { fg = c.yamabudo, bg = "LightGrey" },
	FoldColumn = { fg = c.yamabudo, bg = "LightGrey" },
	SignColumn = { fg = c.tsukiyo, bg = "white" },
	LineNr = { fg = c.amairo, bold = true },
	CursorLineNr = { fg = c.tsutsuji, bold = true },
	MatchParen = { fg = "white", bg = c.muraskishikibu },
	MoreMsg = { fg = c.shinryoku },
	NonText = { fg = c.muraskishikibu, bold = true },
	Normal = { fg = c.tsukiyo, bg = "white" },
	Pmenu = { fg = "white", bg = c.ajisai },
	PmenuSel = { fg = "white", bg = c.konpeki },
	Question = { fg = c.shinryoku },
	Search = { fg = c.tsukiyo, bg = c.kosumosu },
	StatusLine = { fg = "white", bg = c.shinkai },
	StatusLineNC = { fg = "black", bg = c.fuyusyogun },
	TabLine = { fg = c.shinkai },
	Title = { fg = c.yamabudo, bold = true },
	Visual = { fg = c.yuyake, bg = c.fuyusyogun },
	WarningMsg = { fg = c.tsutsuji },
}
シンタックスハイライトをするにはまだ足りないので、更に10個追加します2。
もっと細かく指定することはできますが、グループごとの色分けなら10個で済みます。
Comment = { fg = c.syoro },
Constant = { fg = c.kujaku },
Identifier = { fg = c.asagao },
Statement = { fg = c.takessumi },
PreProc = { fg = c.kosumosu },
Type = { fg = c.fuyugaki },
Special = { fg = c.inaho },
Underlined = { fg = c.ajisai, underline = true },
Error = { fg = c.yamabudo },
Todo = { fg = c.yuyake },
最後に色付けを実行して完成です。
local set_hl = function(tbl)
	for group, conf in pairs(tbl) do
		vim.api.nvim_set_hl(0, group, conf)
	end
end
vim.g.colors_name = "colorshizuku"
vim.cmd.highlight("clear")
vim.o.background = "light"
set_hl(syntax)
おわりに
この記事は、zephyr-nvimのシンプルさに惹かれて書きました。
Luaで書かれたカラースキームはヘルパ関数が書きやすく、Vim scriptの:hiが並んだものと比べると視認性が良く感じます。
ちゃんとしたものを作ろうとすれば各プラグインのグループや各言語のグループ等まだまだ設定する必要がありますが、まずは最低限のものから始めでみてはいかでしょうか。
今回作ったものはこちらです。
https://github.com/willelz/colorshizuku.nvim

