emacsキーバインドに慣れ親しんだせいで長らくVim幼稚園のままだった私が来ましたよ。キーバインドを一度に覚えようとすると挫折しやすいので、以下のように少しずつボキャブラリーを増やすのがたぶん吉。
特記しない限りノーマルモードが前提。後、.vimrcでの設定については最小限にしか触れない (emacsでつい設定ファイルをいじってしまいがちだった反省から) ので各自好きにしてください。
Level 1
最小限の使い方だけ覚えて、ぶっつけでサーバーの設定ファイルを更新したりしていた。10年以上この状態。
i
でその場でインサートモードa
で直後の文字にインサートモード:wq
で保存終了:q!
で保存せずに終了- 移動はひたすらカーソルキー
x
でカーソル下の文字を削除- 困ったら
Esc
キーを連打
逆に言えば、最小限これだけ覚えれば初めてのサーバーでも作業できる。
Vimはめちゃくちゃ巨大なファイルでもあっさり開けるという隠れたメリットがあることを知る (たいていのエディタは巨大ファイルを食わせると数十分押し黙るかコケる)。
Level 2
/
で検索できることがわかった。h
左、j
下、k
上、l
右のvim移動をおそるおそる覚えるgg
で最初の行、G
で最終行にジャンプできるctrl-f
で1ページ後、ctrl-b
で1ページ前に移動- 大文字の
H
、M
、L
はそれぞれ画面の最上部・真ん中、最下部の行にカーソルを移動する =
でその行のインデント位置を自動修正できるu
でアンドゥ、ctrl+r
でリドゥdd
で行全体を削除yyp
(コピペ) とddp
(カットしてペースト) を覚えた
見てのとおり、まだVimのいいところを全然使っていない。スクロールもカーソルキーでもたもたやってたりする。
Level 3
Vim魔神と出会う。教えのレベルが高すぎてなかなかついていけないので、じわじわと体に染み込ませている。
vimのモード
vimのモードを整理しよう:
- ビジュアルモード (v
キー) がたぶん初心者に一番わかりやすいとのこと
- インサートモード (i
やa
キーなど)
- ノーマルモードは基本となるモード
- コマンドモード (:
) で各種コマンドを実行
オペレータとモーション
vimのキー(主にノーマルモードについて)は、大きく分けて「オペレータ」と「モーション」の2種類がある。これを把握することが大事。
- オペレータ: 動詞として動作を指定する。主要なものは4つなのでここから覚えよう
- モーション: 対象範囲を指定する
オペレータは意味のあるキーバインドになっているので、以下のような感じで覚えよう:
c
: change (変更)d
: delete (削除)y
: yank (ヤンク: コピーと同義)g
: go (移動全般)
ノーマルモードでは基本的に最初にオペレータを入力し、その後に範囲指定を行う(CUI的発想)が、ビジュアルモードでは範囲を最初に選んでそれからオペレータを入力する (GUI的発想)という違いがある。
なお、Vim魔神に言わせると、Vimは日本語文書の編集にはあまり向いてないそうだ。多分スペース分かち書きされる英語でないといろいろつらいかも。
Level 4
だんだんVimらしい技を覚え始めた。
^
または0
で行頭へジャンプ、$
で行末へジャンプ。正規表現と同じにしたということだけど、自分はemacsのctrl-a
とctrl-e
操作に慣れきっていたのと、キー配列で^
が右で$
が左というふうにジャンプ方向と逆になっているのが直感に反していて、これは今でも個人的にいただけない感じ。あまり使わないようにしてる。o
を打つと次の行を空けてインサートモードになる。O
を打つと前の行を空けてインサートモードになる。これは現在のカーソルがその行のどこにあっても関係なく実行できる。これを知って、初めてVimがうらやましくなった。- 単語の上で
*
を押すといきなりその単語を検索して全部ハイライトしてくれる。n
で次の検索結果、N
で前の検索結果にジャンプ。ハイライトを消すには:noh
(no highlightのことだろう)と打つ。 - 一文字だけ置き換えたいときはその文字の上で
r
(replace)キーを打ち、差し替えたい語を打つだけでいい。差し替え後自動的にノーマルモードに戻るので、いちいちi
でインサートモードに入ってdelete
で削除してEsc
でノーマルモードに抜けるより早い。 w
を打つと次の単語の頭に、b
を押すと前の単語の頭にジャンプする。大文字のW
とB
は記号を単語の一部とみなすのでジャンプ距離が伸びる。これは単なるショートカットではなく、w
はこの後いろいろと応用が効く。行内での左右移動は基本これにするのが吉。e
を打つと次の単語の末尾にジャンプ。ところで前の単語の末尾にジャンプってあるんだろうか(追記:ge
だそうです)。
Level 5
- ""で囲まれている中にカーソルを置いて、
ci"
(change inner quoteと覚えよう)と打つと、""の中身を消してインサートモードに変わってくれる。""の末尾までカーソルを移動してi
を押して""の中身をdelete
で1つずつ消して、とやるより早い。これを覚えて、俄然Vimがよさげに見えてきた。このciなんちゃら
は応用が効く。たとえばciw
とすれば、カーソルがある単語だけが消えてインサートモードに変わるし、ci'
とすれば''で囲まれたところで同じことができる。 - 魔神いわく、インサートモードの
jj
をEsc
にバインドしておくとめちゃ便利だそうだ。.vimrcにinoremap <silent> jj <ESC>
と書けばよい。jjという文字の並びはまず出てこないので実用上支障はない。 .
は直前に行った「一連」の操作を繰り返す。単なるRedoと違い、上で説明したci"
のような塊を繰り返してくれる。カーソル移動などのモーションは繰り返されない。- レコーディング機能を使うと一種のスニペットのように使える (もっと強力な使い方もあるらしい)。
q
に続けて打った文字に登録される(登録できるのは1文字なのでアルファベット26文字と数字といくつかの記号ぐらいしか使えない)。以後の操作は記録され、再度q
を押すとレコーディング終了。再生するには、@
に続けてそのキーを押す。とりあえず自分はRubyのshebangとGolangのテンプレートを登録してみた。
Level 6
以下続く。
なお、魔神作のマークダウン編集用Vimプラグイン https://github.com/yaasita/ore_markdownが一部で異様に評判がいい。自分はまだインストールしてないけど。