
Neovim の始め方
こんにちは!こんばんは!ちゃろです。
STORES でエンジニアをしています。
これは STORES Advent Calendar 2023 の23日目の記事です。
エンジニア歴は10年ほどでこれまでに Sublime Text、Atom、VSCode、Neovim などのエディターを利用してきました。
今回は試行錯誤してようやく馴染んできた Neovim について紹介します。
Neovim を使用してみたい
世の中では VSCode が多いらしい
どんなプロダクトやプログラミング言語でも、エディターはコードを書くために必要なツールです。
その中でも VSCode は世界で断トツに使われているようです。

社内では VSCode 以外にも IntelliJ IDEA や Vim を使用しているエンジニアがいますが、多くは VSCode を使用している印象です。
ちなみに STORES ではエディター指定のルールはないので、自由に使いたいエディターを使える環境です。
⌨️ Vim さばきに感動した
うろ覚えですが、私も2016年くらいから VSCode を使用していました。
そんなあるとき、同僚と一緒にバグ調査をしていると、その同僚は Vim を使用していて、マウスやトラックパッドは使わず高速に画面移動して、怪しそうな箇所を行ったり来たりしていました。
おそらく grep 検索からファイル移動をして、バッファを切り替えていたんだろうと思いますが、当時は何してるのか全く分からないそんな感想でした。
同僚のVimさばきに感化され、オレオレ vimrc を作り、いざ Vim を使ってみるものの、キーバインドになかなか慣れず結局 VSCode の方が便利に感じて戻ってしまう。
そんな時期が数年続きました。
Neovim に出会う
何度も諦め VSCode で落ち着いていた頃に Neovim と出会いました。
Neovim は Vim から派生したエディターです。
既存の vimrc をそのまま使うことも出来ますし Lua で設定を書くことも可能です。
最近は Lua で書かれたプラグインも豊富ですし、昨今の VSCode のようなエディターに慣れている身からすると Neovim の方がやりたいことに近いと感じました。
また、彼らの目標としてこのようなものが書かれています。
Optimize "out of the box", for new users but especially regular users.
新規ユーザーにも優しいことを目指していることも初心者の自分にとっては嬉しい指針です。
また、ここ数年で使う人が増え、情報を取得しやすくなったのもハードルを下げている要因の1つでした。
kickstart.nvim
そろそろ再挑戦してみようと思っていたとき、 Neovim の core developer である TJ DeVries さんが Twitch で配信しているのを見つけました。
彼の配信を見たり X をフォローしたりして dig っていると、彼が contributor としても参加している、 kickstart.nvim というリポジトリを発見しました。
kickstart.nvim は Neovim 初心者向けに一通り Neovim の config が書かれているものです。
基本的にはよく使われるプラグインが最小限に定義されており、後から自分の気に入ったプラグインを入れやすい状態になっています。
よく AstroNvim や NvChad のような IDE に近づけたようなものも見かけます。
しかし、キーバインド等もかなり作り込まれているので、逆に自由度が下がったように感じてしまい、自分には合いませんでした。
導入されているプラグイン
Neovim のエコシステムでは Lua で書かれたプラグインが豊富に存在しています。
LSP から completion、fuzzy finder まで開発で便利なものは kickstart.nvim を入れるだけで動きます。
下記が kickstart.nvim に導入されている大まかなプラグインです。
パッケージマネージャー
LSP
completion
git
ステータス
fuzzy finder
syntax hilight
他にも toggleterm.nvim や nvim-autopairs など、後から自分で追加して使用しています。
⚠️ Neovimのプラグインは更新頻度が高い
これらのプラグインは開発が活発で、 breaking change がありますが、大きく壊れることはあまりない印象です。
それでも1週間毎のアップデートでも更新量はそれなりにありますので、できる限り最新を保つのを推奨します。
lazy.nvim は個人的にお気に入りのパッケージマネージャーです。
通常、インストールしたプラグインは、 Neovim 起動時にロードされます。
プラグインによってはテキスト編集時からなど、使い始めたいタイミングが異なります。
lazy.nvim はロードするタイミングを指定できるので、起動時に無駄に遅くなることを防ぐことも可能です。

💎 Ruby on Railsの開発環境
私は携わっている STORES ネットショップ では Ruby on Rails を採用しています。
昨今 LSP(Language Server Protocol) はさまざまなエディターで対応されており、 Neovim も LSP に対応したプラグインがあります。
Ruby on Rails の開発環境では solargraph や ruby-lsp などが対応しています。
LSP
まずは nvim-lspconfig と mason.nvim 、そして mason-lspconfig.nvim が必要です。
return {
'neovim/nvim-lspconfig',
dependencies = {
{ 'williamboman/mason.nvim', config = true },
'williamboman/mason-lspconfig.nvim',
},
config = function()
end
}
次に基本的な設定を書いていきます。
今回は solargraph の例で記述しています。
completion の設定も必要なので nvim-cmp の記述もありますが、おまじないだと思ってください。
config = function()
local on_attach = function(_, bufnr)
vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
vim.lsp.buf.format()
end, { desc = 'Format current buffer with LSP' })
end
local servers = {
solargraph = {
filetypes = { 'ruby' },
},
}
local capabilities = vim.lsp.protocol.make_client_capabilities()
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities)
local mason_lspconfig = require 'mason-lspconfig'
mason_lspconfig.setup {
ensure_installed = vim.tbl_keys(servers),
}
mason_lspconfig.setup_handlers {
function(server_name)
require('lspconfig')[server_name].setup {
capabilities = capabilities,
on_attach = on_attach,
settings = servers[server_name],
filetypes = (servers[server_name] or {}).filetypes,
}
end
}
end
servers に使用したい LSP を設定していくだけです。
どの言語、ライブラリに対応しているかはこちらを参照してください。
LSP と nvim-cmp の設定がうまくできると、このような形で補完がされるようになります。

RuboCop
RuboCop も LSP に対応しています。
公式ドキュメントを参考に設定するだけです。
config = function()
// LSP
...
// RuboCop
vim.opt.signcolumn = "yes"
vim.api.nvim_create_autocmd("FileType", {
pattern = "ruby",
callback = function()
vim.lsp.start {
name = "rubocop",
cmd = { "bundle", "exec", "rubocop", "--lsp" },
}
end,
})
end
まとめ
kickstart.nvim に出会う前の私は、どのようなディレクトリ構成が運用しやすいのか分からず、 init.lua にすべて書いていました。
kickstart.nvim のおかげで使いたいプラグインの設定だけに注力でき、運用しやすくなりました。
VSCode の設定はフォーマットなどが決まっているので、設定を一から書くことは少ないです。
もちろん自由度の高さがメリットですが、こういったサンプルになるものがあるとより参入しやすいかと思います。
現在、メインで使用している設定では kickstart.nvim を使用していません。
だんだんと設定の勘所がつかめるようになり、自分で管理しやすいようにファイル分割したくなったからです。
Neovim を使ってみたいという方は一度、 kickstart.nvim を使用してみるのもいかがでしょうか。
今回は一部の紹介になりましたが、全体の設定はこちらを参照してください。