Vim
新人教育
Vimmer

新人達を1ヶ月でガチvimmerにした方法

vim以外のエディタでコード書くと私の手は産まれたての子鹿みたいになります。

効率よくコーディングをしてもらうために、新人やvimを学びたい人にvimの研修を実施しています。今回は研修で非常に有効だった内容についてまとめておきます。

※ なんだか誤解を生んでしまっているようなので追記しておきます。vimの研修は新人研修の一環として行ったわけではなく、vimを使って開発をしたがっていた新人へテスト駆動開発の研修を実施した際に並行して盛り込んだだけです。会社がvim強制とかではないのでご安心ください。言葉足らずで申し訳ありません。

2つの繰り返しキーの存在を認識させる

vimは一度実行したコマンドの組み合わせを記憶する.(ドット)fを使った移動の際のキーストロークを記憶しておく;(セミコロン)があります。これらを駆使することで他のエディタよりも高速な編集作業を行えます。
セミコロンはus配列とjis配列のキーボードを両方使っている人は:(コロン)に置き換えているかもしれません。個人的にはfの繰り返しが使えなくなってしまうのは勿体無いので、やめるか別のキーに割り当てることをお勧めしています。

vimは行に強く、列に弱いことを認識させる

これはvimを使う上でかなり重要なファクターです。vimは行、つまりは横のラインについては非常に強力な編集能力や移動能力を持っていますが、列、つまり縦のラインが絡むとあまり効果的な機能はありません(強力なのは矩形選択ぐらい)。前述したドットも横のラインの動作に限定した繰り返しを想定してコマンドを組む必要があります。

方向キーとdeleteキーの使用は禁止させる

vimを使っているのにこれらのキーを使うのは言語道断です。これらのキーを使わずとも効率よく移動と削除をする方法がいくつも用意されていますので、それを利用してもらいます。

ある程度vim使いこなせるまでプラグインの利用を禁止する

vimは非常に高機能なエディタとなっており、プラグインなしの標準の状態でも十分すぎるほど効率よくコードが書けます。まずは生の機能を使いこなしてもらい、そのうえで足りない機能を補完するためにプラグインをインストールしてもらいました。

ctagsと連携させる

ctagsというツールがあるのですが、vimは標準でこのツールと連携する機能が備わっています。ctagsを使えば特定の識別子の宣言元へジャンプすることができるなど非常に便利です。そのため、研修前にあらかじめctagsをインストールしてもらいました。

インサートモードに滞在する時間を短くさせる

vimになれていないと、通常のエディタのように使えるインサートモードに長居してしまいます。しかしvimの基本的なコマンドはノーマルモードで提供されます。ある程度編集したら即エスケープ、または、ドットで繰り返し実行可能な単位で編集するを徹底してもらいました。寿司屋とインサートモードのながっちりは粋じゃないと認識してもらいましょう。

インサートモードにおける削除は現在挿入中の文字の削除、または、ドットに記憶させる予定の削除動作に限定させる

インサートモードでもctrl + hctrl + wを使うことで文字の削除は行えます。しかし、削除はノーマルモードからdcを利用する方が、ドットを利用して繰り返しができる可能性が増える上に、大体の場合はより少ないキーストロークで削除作業が行えます。

横の移動は基本は単語単位、またはf, ^, $に限定させる

hlを使えば横移動はできますが、1文字ずつ移動していては日が暮れてしまいます。ソースコードは大概の場合は英語で書かれており、英語は単語の区切りがはっきりしていますので、単語移動(wまたはb)で移動する方が高速で動けます。また、単語移動では効率が悪い行頭(^)や行末($)への移動、特定の文字への移動(f)も用意されているのでそれを使いましょう。これらがかえって効率が悪くなるときはhlを使ってもらいましょう。

置換よりもcを駆使したドットの繰り返しをさせる

特定の文字列を置換するとなると:%s/hoge/fuga/gといったやり方が高機能エディタでは一般的です。しかし、置換はキーストロークの数が非常に多く、さらにタイポによるミスが起こりやすいです。置換よりも、ciwのような単語を消しつつ新しい文字を挿入するコマンドを使い対象を、1つ変換してからドットを使ってどんどん変換する方が高速に編集を行える場合が多いです。この方法の一番良いところは、置換の対象を特定の文字列だけでなく、単語(ciwなど)、文字(s)、ある文字までの全ての文字(cf何か1文字など)といったように、柔軟かつ簡単にコントロールできるところにあります。

一度タイピングしたトークンは補完させる

文字の入力は面倒ですが、1度入力してしまえばあとはインサートモード中にctrl + pまたはctrl + nで補完することができます。また、行の補完などもありますが、行の補完よりもヤンクしてペーストする方が個人的には思考のスピードで作業できるので、行の補完は使っていません。

補完の仕組みを理解させる

補完は作業を効率化するのに非常に便利ですが、補完の対象になるトークンがどれになるのかは理解してもらわないと、補完を効率よくコントロールできません。ちなみに対象になるのは現在開いているバッファに存在するトークン、ctagsで生成したtagsファイルに存在するトークンなどです(まっさらなvimの場合)。

バッファを活用させる

vim初心者はよく勘違いしていますが:qはバッファを閉じているわけではなく、ウィンドウを閉じているだけです。ウィンドウで開いたバッファは明示的に閉じるコマンドを入力するまでは生きています。勘違いのせいでtmux等で複数vimを立ち上げてファイルを編集する人もいますが、これはヤンクしたテキストや補完の候補となるトークンをファイル間で共有できないので作業効率が落ちてしまいます。一度開いたバッファは:lsで確認し:b バッファの番号で再度開くことが可能です。毎度ファイルパスを選択するよりもはるかに高速に再び編集が可能になるのでぜひバッファを活用してもらいましょう。
また、標準のvimはemacsなどと比べると、バッファの取り扱いが少々貧弱です。私の場合はBuffer Explorerというプラグインを利用して、もう少し簡単にバッファの操作が行えるようにしています。vimの操作にある程度慣れたらインストールしておくと非常に便利です。

画面は分割しすぎないようにさせる

画面分割は同時に複数のファイルを開きながら作業できるので非常に便利なのですが、1つの画面で表示できるファイルの中身が少なくなってしまうデメリットもあります。ファイルの中身を俯瞰できないと、効率のよいキーストロークを導き出すのが困難になってしまうので、ファイルの参照はバッファの切り替えを駆使して行い、画面分割は最小限にとどめさせましょう。
個人的には画面分割は2つまでというルールでやっています。理由は単純に3つもあると画面が大きくても結構見辛いと感じてしまうからです。また、分割も上下分割(:spでできる)に限定しています。これは前述した通りvimは縦よりも横のラインに強いエディタなので、横のラインの視認性は常に最大限にしておきたいからです。

連打させない

vimはシンプルなキーストロークで複雑な編集作業ができるエディタです。文字を消すためにxを連打していては効率的な編集は行えません。最小限のキーストロークで、かつ、ドットで繰り返せる単位を考える癖をつけるためには連打を禁止しましょう。私がペアプロでvimを教える時には、非効率な作業をした場合はuで編集前の状態に強制的に戻させています。効率よくコードを書かないと先に進めない状態を作っています。「uで戻す、uで戻す」と言うたびに、新人が悲しい顔をしてきますが心を鬼にして戻させましょう。

数えさせない

vimのコマンドは数字を入力することで、削除する単語の数も指定することができます。しかし、数えるという行為は意外と時間がかかります。数えないと確定できないようなキーストロークは最小のキーストロークだったとしても非効率になる場合があります。最小のキーストロークでといった矢先に矛盾したことを言いますが、数えるくらいなら連打させてください。といっても連打とはドットやセミコロンの連打に限ります。
例えばfack you you fackin fack ranという文の先頭にカーソルがあったとします。この文を編集してranまでの全ての単語を削除するとします。そのような場合に、5df␣などとスペースの数を数えてはいけません。ここの場合はdf␣とした後、ranだけになるまでドットを連打した方が早いです。一般的に人間の脳が意識せずに認識できるまとまりの数は4個までらしいです。それを越えると認識が難しくなり、数える必要がでたりします。また、特定の1文字が長い文字列の中に何個も現れるような場合は数が少なくてもまとまりを捉えるのが難しくなったりします。そのような場合は何も考えずにドットやセミコロンを連打する方が早いです。

キーストロークを口に出させる

最初のうちはコマンドを覚えること自体が大変です。効率よく覚えるにはキーストロークを言いながら編集することをお勧めします。cawならば「しー、えー、だぶりゅー」などと言いながら編集すると良いでしょう。ある程度覚えてきたら、キーボードを触らずに編集時のキーストロークを唱える練習もしてもらいましょう。エアvimです。これをやっていると、そのうち思考とキーストロークが一致します。

ペアプロの指示をキーストロークで指示させる

vim使い同士でペアプロをするなら、オペレータになった時にドライバーへの指示をキーストロークにしてもらうと良いでしょう。すごく訓練になります。そして何より面白いです。

ファイルの探索は:Eとバッファとctagsを駆使させる

:Eで現在開いているファイルが存在しているディレクトリをファイルエクスプローラで開くことができます。ctagsやバッファとこのコマンドを組み合わせると、開きたいファイルを:etabによる補完を使って探索するよりもはるかに高速に開くことができます。

vimでやる方が効率が良いことはvimでさせる

普段コマンドラインでやる作業もvimからやった方が効率がいい場合があります。:!を使うと外部コマンドをvimから使うことができます。mkdirコマンドくらいならいちいちコマンドラインに戻るより、vimでやってしまった方が早い場合もあります。またvimの標準のファイルエクスプローラを使うとmvコマンドでリネームするより効率よくリネームができたりもします。

最後に

コーディングに限らず、PCを使った仕事術はいかにしてキーボードやマウスを触らないかが重要になってきます。開発のお仕事のお給料が勤務時間に打ったキーの数で決まる訳ではないのであれば、是非ともvimで効率よく作業して余った時間をもっとクリエイティブなことに費やしてみてください。