2023/01/30

Neovimの見た目を削ぎ落とした

Lua化が一段落ついたら今度は細部の外見が気になってきた。どんなに些末な内容でも一旦そっちに気を取られると直すまでなにも手がつかないってよくありがちだ。僕はもう手遅れだが、せめて他の誰かの時間を節約せしむることによって名誉の回復を図りたい。

Neovimの角ぜんぶ四角くする

近年のOSはどれもウインドウの角が丸くなっている。おそらく最初にやりはじめたmacOSはもちろん、Windowsもどさくさに紛れてちゃっかりまた丸まってる始末だ。きっとソフトウェア工学にもなんらかの安全基準が設けられたのだろう。角を丸くしておかないと怪我をするかもしれないからな。指とか。iOSやAndroidに至ってはそもそもスマートフォンのディスプレイ自体が角丸で作られているから、おのずと丸くならざるをえない。

だからなのか、Neovimのプラグインも角が丸いものが多い。いま言ったようにmacOSはもともと丸いし、Windowsは11からまた丸くなったし、Linuxでも主要なデスクトップ環境の角は大抵丸い。然るにウインドウの中に展開されるウインドウも予め丸くしておくのは実に理にかなった話で、誠に遺憾ながらこれらのデフォルト設定を咎める道理はない。

だが、僕はデスクトップ環境ではなくウインドウマネージャのi3wmを使っている。i3wmが作るウインドウは令和最新バージョンでもばっちりカクカクだ。僕はカクカクしている方が好きだからそれで全然いい。いいのだけれど、そうするとNeovimの内側と見た目が合わなくなってしまう。これまではなんとなく受け入れてきたがやはり全部四角くなるべきだ。さもなければ全体の一貫性が保てない。指を怪我するとかぶっちゃけ嘘だしな。

■nvim-cmp

 1local cmp = require('cmp')
 2
 3 cmp.setup({
 4   window = {
 5      completion = cmp.config.window.bordered({
 6        border = 'single'
 7    }),
 8      documentation = cmp.config.window.bordered({
 9        border = 'single'
10   }),
11  },
12})

nvim-cmpには便利なオプション(window.{completion,documentation}.border)が生えており、ここにsingleを指定することで角を四角くできる。なお、doubleだと二重の角に変えられる。

■dressing

1require('dressing').setup({
2  input = {
3    border = 'single',
4  },
5  builtin = {
6    border = 'single',
7  },
8})

Neovimの内蔵UIをリッチな様式に置き換えてくれるこの有名なプラグインにも同様の設定値が存在する。

■Telescope

1 require('telescope').setup({
2  defaults = {
3    borderchars = { "─", "│", "─", "│", "┌", "┐", "┘", "└" },
4  },
5})

対して、Telescopeは少々厄介だ。プリセット的なオプションが用意されていないため、自分でウインドウのパーツを一つずつ指定しなければいけない。僕は上記の設定でちゃんと四角くなったがフォント環境によって崩れる可能性がある。実際、ググって簡単に見つけられる設定例ではズレまくりだったので、うまくいくまでにそこそこのトライアンドエラーを要した。なんか図工の時間みたいだな。

モード表示いらない説

lualineやlightlineでstatuslineを装飾している人ほどモード表示への気配りも手厚いと思われる。お気に入りのカラースキームに適合するスキンが見つからない時は自作したりもしていたはずだ。僕も多分に漏れずそうだった。単にデザインとして見てもモード表示の地位は高い。

しかし、modes.nvimというプラグインを知ってからはすっかり事情が変わってしまった。モード表示が切り替わるとカーソルラインが任意の色に光るだけのプラグインだが、実のところめちゃくちゃ助けられている。現在のモードが即時に把握できるおかげでつまらない操作ミスもしなくなった。……ということは、あんなに気を遣っていたstatuslineのモード表示なんて、もともとろくに見ていなかったのだ。 ならば、不要な情報は削られるべきである。

1require('modes').setup({
2    colors = {
3		copy = '#FFEE55',
4		delete = '#DC669B',
5		insert = '#55AAEE',
6		visual = '#DD5522',
7 },
8})

まずmodes.nvimの色を指定する。カラースキームとの色合いを意識するとカッコよくなるが別に何色でも構わない。僕はこういうサイトをだらだらと眺めながら決めた。

いい感じ。

 1require('lualine').setup {
 2options = {
 3 component_separators = { left = '', right = ''},
 4 section_separators = { left = '', right = ''},
 5 disabled_filetypes = {'TelescopePrompt'},
 6 always_divide_middle = true,
 7 colored = false,
 8 globalstatus = true,
 9 },
10 sections = {
11  lualine_a = {''},
12  lualine_b = {'branch', 'diff'},
13  lualine_c = {
14   {
15    'filename',
16    path = 1,
17    file_status = true,
18    shorting_target = 40,
19    symbols = {
20    modified = '[+]',
21    readonly = '[RO]',
22    unnamed = 'Untitled',
23    }
24   }
25  },
26  lualine_x = {'filetype'},
27  lualine_y = {
28   {
29    'diagnostics',
30    source = {'nvim-lsp'},
31     },
32   {'progress'},
33   {'location'}
34    },
35  lualine_z = {''}
36 },
37 inactive_sections = {
38  lualine_a = {},
39  lualine_b = {},
40  lualine_c = {'filename'},
41  lualine_x = {'location'},
42  lualine_y = {},
43  lualine_z = {}
44 },
45 tabline = {},
46 extensions = {}
47}

次にlualineの設定を行う。モード表示を削るべくlualine_a = {}の中身を空に指定する。component_separatorssection_separatorsもグレーの濃淡だけで区分可能なため特に必要ない。通常はlocationが置かれるlualine_z = {}もすべてlualine_yの方に寄せることで不要となった。反映させた結果は下記画像の通りだ。

若干の寂しさは否めないが自分にとって無用な情報が鎮座しているよりはずっと望ましい。

おわりに

こんな偏屈なこだわりに3時間も溶かした僕をどうか嗤わないでほしい。

©2011 Rikuoh Tsujitani | Fediverse | Bluesky | Keyoxide | RSS | 小説