freeeの開発情報ポータルサイト

Ultralight な Neovim の config を求めて

こんにちは、@mitubaEXです。この記事は、freee Developers Advent Calendar2022 の 13 日目の記事です。

最近キャンプにハマってしまい色々動画やサイトを巡っている際に UL(Ultralight) hiker などの言葉を知りました。この UL という概念はなんなんでしょう?ただ軽量化すれば良いのでしょうか?この言葉を調べていく内にこの言葉の深さを自分は思い知ることになりました。

さて キャンプの話に熱が入ってしまいましたが、この記事はあくまでエディターである Neovim についての記事です。しかしキャンプの教訓は日常的に利用するエディターにも活かせるものだと考え、Ultralight Vimmer になるために何をすれば良いかを考えてみました。この記事がキャンプ、もしくは Neovim を始めてみるきっかけになれば幸いです。

UL とは

まず UL の概念について理解をしましょう。自分が読んだ「ウルトラライトハイキング」という書籍には以下のように書かれていました。

www.yamakei.co.jp

ウルトラライトハイキングにおいて「軽さ」は重要です。しかし「軽さ」にとらわれてはいけません。その向こう側にある「シンプル&スマート」なあり方こそが重要です。ウルトラライトハイキングはシンプルハイキングでもあり、スマートハイキングでもあるのです。

ここでいうシンプル、スマートというのはその言葉通りです。利用しやすい道具を利用し、一つの道具を複数の役割で活用する。これが結果的に軽量化に繋がっていきます。

UL になるには何をすれば良いのか

まず自分が必ず必要と思うものの重量を測りましょう。そして重たいものを発見したらより軽量なものに変えていきましょう。また道具は自分で直せるシンプルなものを選びます。そして使わないものは置いていきましょう。

これらを実践することができれば、UL に近付いていくことができるでしょう。

キャンプにおける UL とは

ここで少し脇道にそれて、キャンプの話をしましょう。 キャンプをするためにはテント、スリーピングバッグ、マット、クッカー、ウェアそしてこれらを持ち運ぶためのバックパックが必要になります。この道具の一つ一つが軽量化できれば UL 化が格段に進みます。

テントは 500 g、スリーピングバッグも 500 g などに抑える。そうすることで、バックパックの総重量は 5 kg ほどになります。5 kg ならどんな人でも背負いキャンプできるでしょう。そして UL 化したことによりキャンプだけでなくハイキングなどにも挑戦できるようになるでしょう。UL 化は、ただ軽量化することだけでなく自身の限界を引き上げ、新しい発想を与えてくれるものでもあります。凄くワクワクしてきませんか?この発想を日常的に利用しているエディターにも適用していきましょう!

ちなみに自分が最近行ったキャンプでは、総重量 7 kg ほどのバックパックを背負いました。スリーピングバッグ、ダウンパンツ、ダウンジャケット、ダウンシューズで防寒対策をしつつ、テントは 900 g ほどのものを利用しました。

スリーピングバッグ、防寒着、テント、クッカーなどが写った画像
バックパックに詰めたキャンプ道具たち

Neovim における UL とは

ここからは Neovim の 必要になるであろう plugin をいくつか挙げ、 UL 化するためにはどうすれば良いのかを考えてみます。

まず plugin manager を導入してみましょう。これがキャンプ道具を詰めるためのバックパックとしての役割を果たすでしょう。自分が利用したことのある plugin manager には packer、 vim-plug、 dein があります。これらの重量を見てみましょう。

ここで重量について少し考えてみます。ソースコードでの重量とは何でしょうか?行数?それともパフォーマンス?、この記事では自分がメンテナンスしやすいものかどうかを考慮して行数で重量を測ってみたいと思います。なお行数が多いものでもメンテナビリティが高いものもあるため、ここでは一つの指標として見ているということをご留意ください。また全て自分が使ってきた凄く良い plugin なので、ぜひ入れて試してみてください。

以上を踏まえて、それぞれの行数を出してみました。なお行数の出し方は割愛しますが、test コードを除いた .vim、 .lua ファイルの行数を算出しています。

行数
packer.nvim 5899
vim-plug 2812
dein 6300

vim-plug が行数の観点で軽量なことが分かりました。

続いて、plugin manager に登録する plugin を入れていきましょう。これがテントやスリーピングバッグなどに当たります。ではまず何が必要でしょうか?キャンプを始めるに当たって靴や衣類は重要な位置を占めています。防寒や雨対策などができていないと困る場面は多いでしょう。Neovim で靴や衣類は、おそらく File Tree や ファイル検索などファイル移動にまつわるものだと考えます。ではファイルを移動するために必要な plugin を入れてみましょう。ここでは、fzf.vim、fzf-lua、telescope.nvim を見てみます。fzf.vim は fzf-review.vim という plugin を利用し preview を表示することができるため合わせて測ってみます。

行数
fzf.vim 1773
fzf.vim + fzf_preview.vim 13592
fzf-lua 11890
telescope.nvim 17731

fzf.vimは非常に軽量です。軽量化を目指すなら fzf.vim を選ぶのが良さそうですね。

バックパックと移動に必要なものが揃ったので、キャンプ場へ移動できるようになりました。テント、スリーピングバッグを入れて寝泊まりの準備をしましょう。ファイルを編集するために必要なものには autocomplete、diagnostics などがあります。これらは、テントやスリーピングバッグが人が就寝することを手助けしてくれるように、人がファイルの編集をする際に手助けをしてくれます。この機能を利用するためには language server の助けも必要になってくるでしょう。なので plugin 自体のサイズも大きく、よりカスタマイズ性が高いものが多いです。ここでは ale、 coc.nvim、 nvim-lspconfig、 nvim-lspconfig + nvim-cmp の重量を見てみようと思います。

行数
ale 35501
coc.nvim 77471
nvim-lspconfig 9342
lsp-config + nvim-cmp 17444

やはり Neovim の lsp client を利用している nvim-lspconfig が軽量ですね。しかし coc.nvim は自動で その他の plugin もインストールしてくれる統合開発環境のような側面もあり比較は難しそうです。なので、ここは皆さんのセンスにお任せしたいと思います。より軽量なものを選ぶのか多機能でスマートなものを選ぶのかはあなた次第です。自分に合った plugin を選んでみましょう!

上記で出した plugin 達を Neovim に入れてみましょう。おそらく行数という観点では、UL 化が進んだのでは無いでしょうか?他の plugin も重量を測っていくことで UL 化できそうですね。さぁ後は好きなクッカー、食料 (colorscheme、 status lineなど) をバックパックに入れキャンプ (開発) を楽しみましょう!

UL Vimmer を目指して

いくつかの plugin を行数という観点で見てきましたが、結局の所は自分に合ったものを選ぶに限るという結論に至りそうな気がします。しかし自身が入れている plugin の重量を把握していないといざという時、対応できなかったりしますよね?。自分もポンポン plugin を入れてしまい知らない間にバックパックを圧迫して、動作が把握できなくなったりします。なので定期的に plugin を見直し重量を測ることは大事だと思いました。

最後に自分の設定ファイルを置いて、この記事を締めようと思います。Ultralight な Neovim の config を共に目指しましょう!

github.com

そして良いキャンプライフを送りましょう!

海の見えるロケーションにテントが立っている
南房総のキャンプ場でのキャンプ