見出し画像

Neovim の始め方

こんにちは!こんばんは!ちゃろです。
STORES でエンジニアをしています。
これは STORES Advent Calendar 2023 の23日目の記事です。
エンジニア歴は10年ほどでこれまでに Sublime Text、Atom、VSCode、Neovim などのエディターを利用してきました。
今回は試行錯誤してようやく馴染んできた Neovim について紹介します。


Neovim を使用してみたい

世の中では VSCode が多いらしい

どんなプロダクトやプログラミング言語でも、エディターはコードを書くために必要なツールです。
その中でも VSCode は世界で断トツに使われているようです。

Stack Overflow の Developer Survey

社内では 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.

Neovim Vison より

新規ユーザーにも優しいことを目指していることも初心者の自分にとっては嬉しい指針です。
また、ここ数年で使う人が増え、情報を取得しやすくなったのもハードルを下げている要因の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 に導入されている大まかなプラグインです。

他にも toggleterm.nvim や nvim-autopairs など、後から自分で追加して使用しています。

⚠️ Neovimのプラグインは更新頻度が高い

これらのプラグインは開発が活発で、 breaking change がありますが、大きく壊れることはあまりない印象です。
それでも1週間毎のアップデートでも更新量はそれなりにありますので、できる限り最新を保つのを推奨します。

lazy.nvim は個人的にお気に入りのパッケージマネージャーです。
通常、インストールしたプラグインは、 Neovim 起動時にロードされます。
プラグインによってはテキスト編集時からなど、使い始めたいタイミングが異なります。
lazy.nvim はロードするタイミングを指定できるので、起動時に無駄に遅くなることを防ぐことも可能です。

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 の設定がうまくできると、このような形で補完がされるようになります。

Sampleクラスが補完され、クラスの説明も表示される

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 を使用してみるのもいかがでしょうか。

今回は一部の紹介になりましたが、全体の設定はこちらを参照してください。

この記事が気に入ったらサポートをしてみませんか?