Vimの思想を取り入れて開発速度を2倍に
こんにちは、みみぞうです。
ナビタイムジャパンで『システムや開発環境、チームの改善』を担当しています。
本記事は社内勉強会で発表した内容に沿っています。
この勉強会は、社内全エンジニアの1/4ほどが参加して好評だったため、記事を書かせていただくことになりました。
なお、Vim歴は2年半です。
読んで欲しい方
以下のように感じる方を対象にしています。
❶ VimよりVS CodeやJetBrainsのIDEを使った方が速いので使う必要がない
❷ Vimは学習コストが高いのにメリットがない
❸ Vimの勉強/スキルアップの仕方が分からない
この業界に入って7年以上もの間..私も❶~❸の考えをもつ人間でした。
もし昔の自分に会えるなら..『今すぐVimの思想を取り入れよ』と言いたいですね😅
Vimは使わなくていい、されどVimの思想を取り入れよ
『すべての開発をVimでせよ』なんて言うつもりはありません。
Vimが誕生した30年前とは違い、現代には優れたエディタやIDEがあります。
一方、Vimの思想はあらゆるツールで採用されています。
先ほど例に挙げたVS CodeやJetBrains IDEの場合は以下のプラグイン/拡張でVimの思想を取り込めます。
これで現代的なエディタ/IDEとVimのメリット双方を取り込めます。
Vimの思想とは.. そしてメリットは?
ここまでVimの思想というキーワードを使ってきました。
これはVim特有のキーバインドや操作方法を意味しています。
たとえば以下のようなYAMLファイルがあったとします。
other:
name: Other
host: https://navitime/other
one:
name: One // 👈カーソル
host: https://navitime/one
notifiers:
test:
type: slack
channel: "#times_navitime"
icon_emoji: "innocent"
カーソルが『👈』の部分にあるとして、oneとotherのブロックを入れ替えたい場合にどう操作をしますでしょうか?
Vimでは『上下左右』『BS』『DEL』を一切使わずに操作が可能です。
※ このGIFはIntelliJ IDEA (IdeaVim)
入力はわずか6key『dapggP』だけです。CtrlやShiftなどの同時押しが不要な点もポイントです。
この操作を身体に染みこませれば、移動/編集速度アップするイメージが沸くのではないでしょうか。
覚えられないキーバインド
『慣れれば速そう』という感想は多くの方が既に持たれていると思います。問題はどうやって身体に染みこませるかです。
先ほどの『dap』は段落を削除するコマンドですが、挙動の異なる似たコマンドが沢山あります。
・dip: 前後の空白行を含めず段落を削除する
・cap: 前後の空白行を含めて段落を削除し、そのまま文字を入力する
・yap: 前後の空白行を含めて段落をヤンク(コピー)する
・diw: 前後の空白を含めず現在の単語を削除をする
これらを全て覚えるのは現実的ではありません。
多くの方はこのハードルを超えることができず、Vimの思想取り込みに断念してしまっているように思えます。
それではどのようにしてこのハードルを越えればいいのでしょうか。
Vimの操作は『何の操作』を『どこに』するか である
Vimにおけるほぼ全てのキーバインドは『何の操作』を『どこに』するかで表現されています。
先ほどの『dap』を例に挙げてみましょう。
dapは前後の空白行を含めず段落を削除するというコマンドです。
ここでは簡略化のため段落を削除するとさせてください。
これを先ほどの図に当てはめてみましょう。
これが『dap』というキーバインドのベースになります。
『dap』というコマンドはこの表現をキーに置き換えただけなのです。
つまり、Delete a paragraph の略です。
先ほど例に挙げた4つのキーバインドも同じように説明できます。
・dip: Delete inner paragraph
・cap: Change a paragraph
・yap: Yank a paragraph
・diw: Delete inner word
オペレータ と モーション/テキストオブジェクト
『何の操作を』の部分をオペレータ、『どこに』の部分をモーション または テキストオブジェクトと言います。
この概念をベースにして、オペレータとモーション/テキストオブジェクトの引き出しを増やしていけば、短期間で多くのコマンドを身体に染みこませることができるでしょう。
オペレータを1つ覚えれば、できることは『知っているモーション/テキストオブジェクト』の数だけ増えます。
モーションを1つ覚えれば、できることは『知っているオペレータ』の数だけ増えます。
最低限3つのオペレータを知っていれば、ほとんどの操作はできます。
・d (delete): 削除
・c (change): 変更
・y (yank): ヤンク(コピー)
Vimの懐刀ドットコマンド
Vimを使わない方に知られていない便利な機能としてドットコマンドというものがあります。ドットコマンドは直前の操作を繰り返すことができます。
※ ここでの『操作』は『オペレータ』+『モーション/テキストオブジェクト』を指すものとします
先ほどの『dap』コマンドを実行したあと『.』を押してみましょう。
これがドットコマンドです。
直前に入力した『dap』コマンドを1キーで繰り返せます。便利ですね!
もう1つ別の例を紹介します。
『ci"』は『Change inner "』の略です。ダブルクォート内側の文字を変更します。『+』は次の行頭へ移動するコマンドです。
上記のドットコマンドは『ダブルクォート内側をoneに変更する』という操作を繰り返しています。
やりたいことに対して、再利用性の高い『オペレータ』『モーション/テキストオブジェクト』を考え、ドットコマンドで高速化する..。
まるで、開発におけるDRYの考え方そのものではないでしょうか。
オマケ
Vimのマクロ機能を使うとより高度な繰り返し処理を実行できます。
『複数の操作や移動を伴う処理』を繰り返したいときに使います。
興味ありましたら、是非Vim日本語ドキュメントをご覧になってください。
まとめ
Vimについて、『Vimの思想』と一部の具体例を紹介しました。
『Vimの思想』はVim以外の近代エディタ/IDEで利用できます。
実際私はIntelliJ IDEAやVS Codeで開発を行い、素のVimはほぼ使いません。
オペレータ+モーション/テキストオブジェクトという概念を理解してから学ぶことで、キーバインドの習得コストはかなり落ちます。また、繰り返しを意識してドットコマンドを使いこなすことで編集スピードは格段に上がります。
1週間に1つ..オペレータやモーション/テキストオブジェクトを覚えるだけで、1年後には立派なVimmerになれます。
是非、今日から『Vimの思想』を取り入れてみて下さい💪
■追記 (2020/10/29)
本記事の発端となった社内勉強会をきっかけにVimを始めた弊社開発者の記事が投稿されました。これからVimをはじめようと思われている方はあわせてご覧いただければと思います。