見出し画像

社内勉強会をきっかけにVimを習得するまでに試したこと

こんにちは、茶田です。
ナビタイムジャパンでトラックカーナビのAndroid/iOSアプリの開発・運用を担当しています。

本記事では、先日に公開された「Vimの思想を取り入れて開発速度を2倍に」の元となった社内勉強会に参加し、実際にVimを習得するまでに試したことをまとめました。

上記記事と重複する内容も含みますが、ご容赦いただければと思います。

私のVim歴は、1年3ヶ月です。

読んでほしい方

下記に該当する方を対象として、参考になれば幸いです。

・Vimに興味がある。
・Vimを勉強しようとしている。
・Vim操作が身につかず困っている。

また、ここでの「Vimの習得」の定義は下記とします。

・Vimのキーバインドでの基本的なテキスト操作をほぼ無意識で行える。
・Vim操作を活用した方がアウトプットを出せるという自意識が芽生える。
・任意のエディタでVim環境を導入しないと落ち着かなくなる


Vim勉強を始めたきっかけ

本記事の冒頭でもご紹介した「Vimの思想を取り入れて開発速度を2倍に」の内容の元となった社内勉強会が2019年の7月頃に実施されました。
そちらに参加して、開発速度の向上に興味を持ったことがきっかけです。
なお、勉強会参加前の時点でのVim操作の知識は、

・iでテキストの入力ができる。
・ESCでカーソル移動ができるようになる。

のみでした。


効率の損益分岐点のジレンマ

さて、実際にVimの勉強を始めようとして、特にハードルを感じたことがあります。
それは、勉強開始時点では普通にテキストを操作したほうが効率が良いということです。

Vimは手段です。

こう言ってはなんですが、より良いプロダクトを作るという目的に対して、mustな技術ではまったくないと思っています。
しかし、習得できればコーディングの効率はあがり、より早いサイクルでプロダクトの開発を行えます(と、今となっては断言できます)。

そういう訳で、まだ見ぬ効率の損益分岐点を目指して勉強することになったのですが、これが中々にストレスでした…。
なぜかと言うと、理想とするVimを習得した状態にいつ達するのかがわからないまま、慣れない操作をし続けることになるからです。
加えて、現実として案件の期限は切られています。拙いVim操作によってスケジュールが逼迫するのは避けたいと思いました。

そこで、できるだけ効率を落とさないように試したことがあります。順番に紹介します!

Vim環境の構築

私の場合は当時はAndroidアプリ開発がメインだったため、開発環境のAndroid StudioへIdeaVimのプラグインを入れました。


カーソル移動の習得

多少でもVimやviコマンドを触ったことがある方はご存知だと思いますが、Vimのカーソル移動は少々特殊です。
具体的に言うと、基本的な上下左右の移動がキーボードの「 h, j, k, l」へそれぞれ割り当たっています。
とても直感的には見えないこのキーバインドに慣れる難易度はとても高く、今まで縦横無尽に駆け回っていたカーソルキーが、まったく思ったとおりに動かなくなりました。

この時期が特に「本来ならもっと早くコーディングできるのに!」というもどかしさを強く感じました。
これは、Vimの習得を諦めてしまうに足るストレスです。最初にして最大の関門と言っても過言ではないと思っています。

そんな上手くカーソル移動ができない悩みを社内の有識者へ相談したところ、下記のチートシートを壁紙にすることをオススメされました。

この壁紙のとても良いところは、上下左右の移動コマンドがその移動できる量に応じてx軸とy軸線上にプロットされているため、厳密な挙動がわからなくても直感的に当たりをつけて試せることです。

また、デスクトップやターミナルなどの壁紙にすれば、いつでもすぐに参照できます。そのため、移動コマンドがわからなくて都度調べるといった時間は大幅に削減できました。


役立ちそうな操作から覚える

移動コマンドを覚えようしている時に実際にアドバイスいただいたことの一つとして、「移動のキーバインドのすべてを使うわけではないので、まずは1組覚える」というものがあります。

当たり前ですが、一度に複数のコマンドを身につけるのは現実的に難しいです。
また、短期的にでもいいのでVimのメリットを感じられないと、モチベーションを維持する観点でも厳しいなと思いました。

そこで、様々な便利なコマンド郡を頭から叩き出して、今の自分に役に立ちそうな操作を、反射的に使えるようになるまで一つずつ使い続けました。
私の場合だと、ci"(ダブルクォート内側の文字を変更)から取り組み始めました。
Android開発ではxmlファイルをよく触りますし、主に扱っているjava及びkotlinでもよく書き換えが発生する記述なため、この狙いは当たったと思います。

また、特に環境に恵まれていたなと思うのは、Vim社内勉強会のフォローアップの取り組みとしてVim操作を覚えるための社内向け演習が1ヶ月毎日社内のBitbucket上で出題されており、これに解答をするとVim有識者からもっと良いコマンドや知見を教えてもらえたことです。
1ヶ月という時間でしたが、

・毎日自力でVimの課題を解く。
・他の人の解答を真似する。
・有識者からのアドバイスを試してみる。

というサイクルをほぼ毎日やっていたおかげで、社内向けのVim演習が終わる頃にはぎこちなくてもVim操作に慣れることができました。

~/.vimrcで自分にあった環境へカスタマイズ

ちょっとだけVimの操作に慣れてくると、今度は段々とデフォルトの設定について不便さを感じるようになりました。

一例を出すならば、ESCキーが遠いです。
Vimではテキストを入力できる挿入モードから、カーソルを移動できるノーマルモードへの切り替えにESCキーを利用します。
つまり、

1. ノーマルモードで目的の箇所へ移動
2. 挿入モード(iやa)へ切り替え
4. 文字を入力
3. ノーマルモードへ切り替え(ESC)

の一連のサイクルで、都度ESCを押すことになります。
この場合、挿入モードへの切り替えるiやaキーと比べると、ESCキーの位置は遠いです。どうしても一度手元を見ながら、左手をホームポジションから離して押していました。
普段のVim操作が早くなれば早くなるほど、この小さな手間が気になりだしました。

これについても、社内のVim有識者が集う#info_vimというslackチャンネルがあるので、相談してみました。

すると、いっそ別のキーに割り当てるというアドバイスが。
ここで、~/.vimrcを編集することで、自分のvim環境をカスタマイズできることを知りました。

※正確には私はideaVimプラグインを利用していたので、主に~/.ideavimrcを編集しました。

そこで色々と検討した結果、jjを連続で入力した場合に挿入モードを抜けるように、下記の設定を追加しました。

inoremap <silent> jj <ESC>

この設定は非常に効果的で、モード切り替え時に手元を見ながら左手を離すことはなくなり、より早い編集ができるようになったと感じています。

あくまでもこれは一例ですが、少しVimに慣れてきた時に何か不便を感じたら自分の操作を最適化できる設定はないかを考えてみると良いです。
もしかすると、作業効率がグンと上がる設定があるかもしれないですよ?

まとめ

以上、Vimを習得するまでに取り組んだことをご紹介しました。

・移動コマンドのチートシートを壁紙にしてカーソル移動に慣れる。
・役立ちそうなコマンドを1つずつ、反射的に使えるようになるまで使う。
・~/.vimrcで自分に適した環境へカスタマイズする。

勿論、まだまだ私も継続してVimを勉強中であり、あくまでこれらはまったくVimがわからないところから、これまでに試したことにしか過ぎません。
まだまだこれからも効率化は図れる部分は沢山あると思っています。

それでも、今の状態で色々なエディタでVim環境を導入したくなるくらいには効率化の成功を肌で感じているので、Vimを習得したいと思ったならご参考まで。

ぜひお試しいただければと思います。