VIMに関する駄文

VIMでの作業効率を上げるにはどうするのが良いか、というのをよく考える。

私は、何年か前から

nno m 3j3<C-e>
nno , 3k3<C-y>

というマップを作って、コードを眺めるときは大体これを使っている。カーソル移動とスクロールを兼ねるコマンドである。一時期zzを使ったマップ

nno m 3jzz
nno , 3kzz

を使っていた。こちらはカーソルが常に画面中央にあるのでなんとなく気持ち良い。 コードを閲覧していて編集を開始しようと思ったときは、大抵画面に映っている範囲を編集しようと思っている時なので、その時に最初から画面の中央にカーソルがあれば、カーソル移動を使うコマンドのタイプ数が少なくなる。

上のようなマップは普通にプログラミングするうえでは問題ないのだが、データを閲覧する際など、set wrapしている際には、挙動が気持ち悪くなる。 そういう場合のために、jの代わりにgjを使用していたことがあったが、やはり気持ち悪さはある。

VIMにはカーソル移動関連のコマンドがたくさんあるが、実際にはそれらを知識として持っていることよりも、「こういう時にはこういう風にするのが一番効率が良い」というのを体に染み込ませることが重要なのだと思う。そう考えると、やはりモードという思想はよくできているように思う。

知識として持っていても、タイプ数の最小化問題を解くことに脳のリソースを使ってしまうと、プログラミングやその他の作業の効率が下がってしまう。例えば、縦方向に3~5行程度移動したい場合、4jのようなコマンドで移動するよりjjjjと打った方が快適であるように思う。実際にvimmerの動画を見つけてきて見てみても、jjjjのような冗長性のあるタイプは頻繁に見受けられる。

私は、「組み合わせて効率化する」ではなく、単体で効率よくあるべきだと思う。カーソル移動に関して言えば、「まずは大雑把に移動して、そのあとで細かい調整をする」という手順を踏むのが良いと思うのだが、VIMのhjklの4文字は「細かい移動」に特化していて、w, e, b, 0, $, H, M, L, {, }, +, -あたりは便利だが、まだ最適化の余地があるように思える。例えば画面が30行くらいだったら、まず8行ずつくらい移動して、そのあとで3行ずつくらい微調整してから1行単位で移動するのが良いかもしれない。そして、実際には横方向にも同時に(つまり斜めに)動くべきなのではないか。

(これは、編集の深さという観点でとらえられるかもしれない。インサートモードを深いモード、ノーマルモードを浅いモードとすると、VIMのカーソル移動コマンドは、比較的深い部分に最適化されているように思う。しかし、浅いところから深いところへ移っていく過程では、必ずしもこれは効率的ではないのではないか、といった書き方になるだろうか。)

しかし、先に述べた通り、最適なVIMストローク構成というのは、ターゲットの性質に依存すると考えられる。Pythonを書くならPythonに対して最適化するべきなのだろう。効率化の道は長い。