この記事は三浦半島.rb #2 好きなものLT大会!RubyKaigi土産話もぜひ - connpassの発表資料になる予定です。 俺はちょっとVimが好きだぜという自己紹介をしつつ、今どきVimでRubyを書きはじめたいという奇特な方がいたら参考になればと思っています。
なお、自分もそれほどVimに詳しいわけではないため、内容に誤りがあるかもしれません。 また、使っているのはNeovimではなくVimなので、その点も注意してください。
なぜVimを使っているのか
コードが脳に収まるからです。具体的には、以下の点が気に入っています。
- タブの分割と移動が簡単で、関心ごとにタブを分けて管理しやすい
- テキスト表示領域が広いため、一度に多くのコードを表示できる
VSCodeでの挫折
5年くらい前に「さすがにVSCodeを使うか」と思ってVimっぽい拡張なども色々と入れて、今年の頭くらいまで細々とチャレンジしていたんですが、どうしても馴染めずに挫折してしまいました。
それからはVimに回帰する試みをしています。キーボードショートカットは意外と手が覚えているもんですね。
Vimでは例えば「ドメインロジックの実装」「テストの実装と実行」「使用ライブラリのコードリーディング」用のタブをそれぞれつくって、キーボードショートカットのみで頻繁に行き来するような感じでコーディングできるんですが1、VSCodeで似たような感じに操作する方法が分かりませんでした2。ご存知の方がいたらマジで教えて下さい。
たぶん、そもそもVimでのやり方をアンラーニングせよということだとは思うんですが、馴染めなかった……。
利用しているプラグイン
全部紹介してると大変なので、Rubyでのコーディングにあたって主要なプラグインを紹介します。
coc.nvim + ale + vim-endwise
コード補完や構文チェックなどをLSPを使って現代的な感じでやってくれます3。 coc.nvimという名前ですが、NeovimではないVimでも使えました。
他のプラグインも選択肢としてはありましたが、Ruby以外のプログラミング言語も書くときにいちいちプラグインを増やしたくなかったので、色んなプログラミング言語に使えそうなこれらのプラグインを採用してみました。
VimでモダンなRuby開発環境を構築する – 株式会社ルーターがプラグインの内容や導入の仕方などを把握するのによくまとまっていて助かりました。
ただ、記事中では触れられていませんがGitHub - neoclide/coc-solargraph: Solargraph extension for coc.nvimのインストール(gem install solargraph)も自分の環境では必要でした。
また、記事内の設定だと動かない部分もあったので、以下の公式READMEも参考に設定しました。
- GitHub - neoclide/coc.nvim: Nodejs extension host for vim & neovim, load extensions like VSCode and host language servers.
- GitHub - dense-analysis/ale: Check syntax in Vim/Neovim asynchronously and fix files, with Language Server Protocol (LSP) support
Open your coc.nvim configuration file with :CocConfig and add "diagnostic.displayByAle": true to your settings.
- 自分の場合はグローバルに設定したかったので、solargraph/README.md at master · castwide/solargraph · GitHubを参考に
solargraph configしてできたファイルをmv .solargraph.yml config.ymlして使いました - ちなみにCopilotと組み合わせたときの補完体験がやや微妙だったので、自分は
"suggest.noselect": true,も設定してデフォルトでは補完候補を選択しないようにしています
vim-test + vim-dispatch + vim-ruby
テストの実行をVimから行うことができるようになります。 カーソル位置に一番近いテストの実行などもできるようになるので大変便利です。
RubyではなくPythonに関する記事ですが、結構マジメにVimのテスト環境を整えてみる(Python用) #Python - Qiitaをベースにセットアップしました。
Dispatch.vimのヘルプを見てみると、どうやらerrorformatは実行するコンパイラのプラグインがないとデフォルトが適用されるらしい。
自分もテストが失敗した行へのコードジャンプができなかったので、vim-compiler-pythonの代わりにvim-rubyを導入しました。
が、それだけではコードジャンプはできないままでした。
調査しているうちにGitHub - vim-test/vim-test: Run your tests at the speed of thoughtという記述を見つけて、:TestNearestではどうやらbundle exec rspecコマンドが実行されているようだったので、以下の設定を追加したところ、無事にコードジャンプできるようになりました。
let g:dispatch_compilers = {}
let g:dispatch_compilers['bundle exec '] = ''
なお、RSpecのフォーマットを変えるために以下の設定もしています。
let test#ruby#rspec#options = '--format documentation'
その他便利なプラグインたち
- github/copilot.vim: Neovim plugin for GitHub Copilot Copilotも使えます。セットアップもかんたんでした
- junegunn/fzf.vim: fzf vim ファイル移動はほぼこれでしてます
- tpope/vim-surround: surround.vim: Delete/change/add parentheses/quotes/XML-tags/much more with ease 地味に便利で使用機会が多い
などなど。
諦めていること
コード補完以外のAI活用に関してはVimでがんばるのは大変そうだったので、そのときだけVSCodeを使っています。 今のところ不便を感じていませんが、今後のAIの進歩の方向性によってはもしかしたら厳しくなるかも知れません。
- なお、Vimのタブの概念はVSCodeとは異なっています [Vim問題] バッファとウインドウとタブの違いは? | Vim入門↩
- VSCodeではウィンドウをいくつかつくって移動するやり方を試してみたんですが、キーボードショートカットが馴染まなかったのと、ウィンドウの位置やサイズも揃わなくて、自分には使いづらかったです↩
- 昔はただのテキスト補完やctagsなどを利用していましたが、時代の進歩を感じます↩