Edited at

Vim モーション譜

More than 5 years have passed since last update.


Sublime いいよね

昨今の Vim いいよね的な風潮には全く納得がいかない。こんな前近代的な変態エディタがなぜに今更もてはやされているのか。

仕事がら vi/vim 歴十年以上経っているが、いまだ使いこなせず、初心者の域を脱していない。苦手意識を差し引いても、Vim は経験による学習効率が低いツールだと感じている。

技術者のたしなみ程度から、一通りの技を使いこなせるレベルまでの間に、いくつもの越えなければならない壁があるのは確かだ。

その一つはモーションをマスターすることであろう。


Vim モーション譜

以下の図は、ある状況であるモーションコマンドがどのように作用するのか、その動きを洗い出して《見える化》したものである。

黒く反転したカーソル位置から移動できる位置をモーションコマンドと矢印で示した。同じ場所に移動するのにもいくつものやり方があるが、もっとも単純で基本的と思われるものを太字表示しておく。

cd などとノーマルモードで組み合わせて使ったときに対象となる選択範囲をグレー背景で示した。 ビジュアルモードでは、境界文字の取り方が微妙に異なるので注意してほしい。

基本的に1手(1モーション)による動きのみを集めた。1手でできることは限られているが、オペレーションコマンドと組み合わせたあとでドット(.)コマンドによるリピートに使えるのでこだわっておきたい。しかし一部、2手以上かかるものも参考までに追加し、それは青いフォントで区別した。

行の折り返しによる挙動の違いや、sentence, paragraph を扱うモーションもあるのだが、本稿では英文ではなくコーディングを想定しているのでそれらには触れない。

個々のモーションコマンドの解説は省略するが、マニュアルや、すでに良いまとめが(Qiita内を含め)あるので分からないことはそちらに立ち戻って確認して欲しい。

本稿は Cheat sheet や逆引き的に使えないこともないが、暇なときに眺めて「あー、そこに行くかー」とかつっこみながら楽しんでいただければ幸いである。

一応動作確認しているが、間違いや抜けがあったら指摘してほしい。


【基本】


左右移動

g_ はあまりみない。行末の空白文字は忌避されるので、コーディング上は $ だけで十分だろう。

モーションではないが挿入コマンドの挿入位置も参考まで。


word と WORD の違い


アンダースコア区切り

サブ単語の先頭文字(アンダースコアの次の文字)に1手で移動したいところだが、t_f_ では微妙に届かない歯がゆさに悶える。もちろん目標の文字が許せば、f{char} で行けるのだが使いまわしがきかない。

サブ単語だけの範囲選択も1手でとれる方法がない。


カンマ区切り

word 系モーションではカンマ( , )でいちいち止まるので、count の数え方に気を使う。

一方 WORD 系なら一見楽そうだが、もし要素間のスペースが詰められていたら行けるところはほとんどない。


上下移動

ノーマルモードでは行単位、ビジュアルモード( v )では文字単位の選択範囲となる。


ブロック移動

{} は空行を区切りとして複数行(ブロック)をスキップする。空行の連続は1区切りとみなされる。

() は空行とブロックの先頭を移動する。 ( の1手でブロックの先頭行に移動できるが、逆に最下行へ行く手はない。


【応用】


マークアップ


代入文


関数呼び出し


JSON


メソッド


参考