記事の目的
「Vimを覚えたい、でもコマンド多すぎて一気に覚えられないし、手が出せない」みたいな人がいるような気がします。
そこで、独断と偏見で3段階くらいに分けてみました。
もちろん、これで全部ではないので、いろいろ調べてみてください。
あと、覚える前に少しこっちも意識してほしいです。
Vimを丸暗記する前に
目標
ちょっと便利なテキストエディタとして、簡単なファイル編集や、サーバー上の設定変更などをスムーズにできる程度
レベル1
作業効率はおいておいて、カーソルキーを使わずに、最低限編集できる程度を目指します。
基本移動と基本的なモードに慣れましょう。
レベル1一覧
- 移動
- h, j, k, l
- (数字)g, gg, G
- CTRL + f, CTRL + b
- 入力
- i
- ESC
- ビジュアルモード
- v
- V
- 削除
- x
- v + d
- dd
- コピー
- y
- yy
- ペースト
- p
- undo, redo
- u
- CTRL + r
- 検索
- /
- n, N
- コマンドラインモード
- :w
- :q
- :q!
移動
カーソルキーは使わないことを目標にしましょう。
h, j, k, l
基本となる移動です。そのうち慣れます。
(数字)g, gg, G
指定の行まで移動するコマンドです。
ggは先頭行、Gは最終行に移動します。
ちなみに、サーバー上などでvi実行し、行番号が表示されていなかったら、:set number
(nuまででも可)で出せます。
CTRL + f, CTRL + b
ページ単位の移動です。
検索しようとしてCTRL + f
を押して、画面が進んでも驚かないように。
f
はforward
で進む、b
はback
で戻る、です。
大まかにファイルを移動するときは大体これで移動してます。
入力
インサートモードに慣れましょう。
なるべく、インサートモード中の移動や削除は行わないことを心がけ、ノーマルモードで移動しましょう。
i
現在のカーソル位置の手前でインサートモードに切り替えます。
ESC
ノーマルモードに戻ります。
よくわからなくなったら、押してノーマルに戻りましょう。
ビジュアルモード
文字を選択できるモードです。
選択後いろいろなコマンドと組み合わせられますが、最初は、コピー・削除と組み合わせるところからでいいと思います。
v
vキーを押してから、移動をすると選択できるのがわかると思います。
もう一度押すと選択解除されます。
V
1行丸ごと選択します。
そのままj
などで複数行選択です。
削除
文字の削除はノーマルモードから、コマンドで行う癖をつけましょう。
削除というより、切り取りといった方が正しいかもしれません。
x
カーソル下の文字を1文字消します。
他のエディタのDelete
に近い動きです。
v + d
1文字以上消したいときは、v
で複数の文字を選択してから、d
で消してみましょう。
後述のp
で貼り付けられます。
dd
1行丸ごと削除です。
もちろん貼り付けられます。
コピー
削除と同様ノーマルモードから、コマンドで出来ます。
y
v
で選択後、y
でコピーできます。後述のp
で貼り付けられます。
yy
1行丸ごとコピーです。
もちろん貼り付けられます。
ペースト
直前のx
,d
,y
を実行した結果を貼り付けることができます。
※「レジスタ」と組み合わせると、直前の結果だけでなく貼り付けたり保存しておけるので、興味のある方は調べてください。
p
x
やd
などで削除したものを貼り付けます。
貼り付ける位置は、カーソルの後ろです。
undo, redo
やり直し所謂(CTRL + z
)や再実行(CTRL + SHIFT + z
?)に当たる操作を覚えておくと、おぼつかない操作で間違えても安心です。
u
やり直しです。
インサートモードで1行入力してからu
を押すと、1行入力一気に戻れるのが普通と違うかもしれません。
CTRL + r
やり直した結果を再実行します。
検索
CTRL + f
は使えません。/
で検索します。
正規表現は覚えたほうがいいでしょう。
※正規表現のエスケープが少し独特なので、戸惑う場合はvery magicでググってください
/
/
で後方に検索
ちなみに/
の後、カーソル上下(CTRL + n
,CTRL + p
)を押すと、過去に検索した履歴を呼び出せます。
(bashで↑押したときのような感じ)
n, N
検索後、次の候補に行くにはn
,前の候補に行くにはN
です。
コマンドラインモード
:
の後に様々なコマンドを実行できます。
最初は保存だけかもしれませんが、便利なものもあるので探してみるといいと思います。
:w
:
のあとにw
で保存ができます。
:q
:
のあとにq
でファイルを閉じます。
w
と合わせて、:wq
で保存して終了です。
ZZ
も:wq
と同様です。
:q!
最初は操作がおぼつかないので、間違えて編集してしまうこともあるでしょう。
慌てずに保存せずに閉じる、がq!
です。
レベル2
組み合わせの移動や、複数のインサートモードへの切り替えを覚えて、もう少し効率的に編集できる状態を目指します。
レベル1で覚えたコマンドの派生形も覚えましょう。
レベル2一覧
- 移動
- f, F
- t, T
- ; ,
- w, b, e
- 0, ^, $
- 入力
- a, I, A
- 削除
- d + 移動コマンド
- D
- コピー
- y + 移動コマンド
- ペースト
- P
- 検索
- ?
移動
単語やテキストオブジェクトの概念は最初はなじみがないかもしれませんが、覚えると移動や編集が楽になります。
それらに限った話ではありませんが、d
やy
などと組み合わせることもできます。
f, F
f
のあとに文字を入力すると、行内のその文字(1文字)の場所まで移動します。
F
は行内の前方方向に検索します。
Hello World
という一文で、f``W
とかd``f``W
などをやってみると動きがわかると思います。
t, T
f
と同様に後に入力した文字を基準に移動します。
f
との違いは、t
はその手前の文字まで移動します。
T
は前方検索です。
Hello World
という一文で、t``W
とかd``t``W
などをやってみるとf
との違いがわかるでしょうか。
; ,
f
,t
,F
,T
で検索した後、再度同じ検索を繰り返したいとき、;
,,
で、それぞれ後方、前方に繰り返します。
w, b, e
単語を基準に移動します。
w
を押すと、次の単語の先頭に移動します。
b
は前方の単語の先頭、e
は現在の単語の末尾です。
abc def ghi
などの文章で、様々な位置で押してみたり、d
と組み合わせると動きがわかると思います。
0, ^, $
行頭や行末に移動します。
0は
行頭、^
は空白を含まない行頭です。
$
は行末です。
入力
i
と同様にインサートモードに入るコマンドですが、移動してからインサートモードに入るコマンドを覚えるとタイプ数が少なくなります。
最初は無くても十分に思えるかもしれませんが、慣れると違いが実感できると思います。
a, I, A
i
だけでは、現在のカーソル位置の手前からしか編集を開始できません。
a
でカーソルの後ろから編集を開始できます。l``i
(もしくは、i``→
とか)と入力しているところがa
でできるようになります。
I
を使うと、現在の行の頭にカーソルが移動したうえで、編集を開始します。^``i
と同じ動きです。
A
を使うと、現在の行の末尾に移動したうえで、編集を開始します。$``a
と同じ動きです。
削除
よりスムーズに削除しましょう。
d + 移動コマンド
上でも述べましたが、d``w
とか、d``t``=
とか、d0
とか、移動コマンドと合わせると、v
で指定しなくても一気に消せます。
/
なんかも使えます。
つまり、移動をいろいろ覚えれば削除が自在になり、結果編集速度があがります。
もちろん、削除した内容はp
でペーストできます。
D
現在位置から、末尾までを削除します。
d``$
と同様です。
コピー
y + 移動コマンド
d
と同様にコピーも移動と組み合わせで可能です。
例えば、y$
で行末までコピーです。
ペースト
P
p
と異なりカーソル位置の手前にペーストです。
検索
?
/
は後方検索でしたが、?
で前方に検索します。
当然、n
, N
も/
とは逆向きに検索が進みます。
レベル3
その他、個人的に使いそうなコマンドを列挙します。
普通のエディタよりVim使うほうが編集早いじゃん!ってなったらいいなぁ。
レベル3だからあまり使わないということはなく、むしろよく使うけど、他の操作で代替効くから泣く泣く3に書いたものもあります。
この内容のほかに今までのコマンドの前に、数字を付けて、回数を指定することも試してみてください。
(例えば、100p
で100行ペーストとか。)
レベル3一覧
- 移動系
- g;
- %
- {, }
- g + j, g + k, g + 0, g + $
- CTRL + u, CTRL + d
- H, M, L
- m + [a-zA-Z], ` + [a-zA-Z]
- 入力、編集系
- c, C
- r, R
- o, O
- J
- テキストオブジェクト
- オペレータ + i + 記号
- オペレータ + a + 記号
- 繰り返し
- .
- マクロ
- q + [a-zA-Z]で開始、qで終了、@ + [a-zA-Z]で実行
- ビジュアルモード
- CTRL + v
- コマンドラインモード
- :%s/正規表現/置換後文字列/g
移動系
g;
直前に編集していた部分に移動します。
コードを編集中、上の方を見に行って、もとの編集してたところに戻りたいときとか重宝します。
%
対のかっこへ移動します。
インデントが崩れた長いメソッドとか、長いjsonとかに出くわして、対応した閉じかっこの場所がわからなくなっても安心です。
{, }
段落の先頭、末尾まで移動します。
段落は、改行のみの行が区切りです。
g + j, g + k, g + 0, g + $
長い1行が折り返されているとき、j
では次の行に行ってしまいます。
見た目上の上下や先頭に移動するには、g
と組み合わせます。
CTRL + u, CTRL + d
半画面上下に移動します。CTRL + f
よりもう少し細かく移動したいときに。
H, M, L
画面の上部、中央、下部に移動します。
m + [a-zA-Z], ` + [a-zA-Z]
マーカーという機能です。
例えば、m``a
で、現在の位置をa
というところに保存します。
`a と押すと、そこへジャンプします。
入力、編集系
c, C
d
とi
が組み合わさったようなコマンドです。
c
で削除しながら、インサートモードに入ります。
削除してから入力するよりもタイプ数も少なくなるし、アンドゥや繰り返しもその単位で出来るので、慣れてきたらよく使います。
w
とかテキストオブジェクトなどと組み合わせることが多い気がします。
r, R
1文字だけ修正したいときは、r
の後に文字を入力すると、カーソル下の文字をノーマルモードのままでその文字で置換します。
o, O
前後に行を追加してインサートモードに入ります。
同様のコマンドを再現するのであれば、$``a``Enter
や、0``i``Enter
ようになるので、面倒です。
自然と使うようになると思います。
J
現在の行と、次の行を半角スペース区切りで連結します。
テキストオブジェクト
私が最初に vimすげー って思った操作の一つだった気がします。
現在いる部分を囲んでいるものを範囲に取ることができます。
例えば、(aaa bb|b ccc)
(|
はカーソル)の位置にいるときに、()
の中だけをすべて削除したりできます。
オペレータ + i + 記号
オペレータとは、d
とかc
とかy
のような、入力後に範囲を待ち受けるコマンドです。
i
をその後に入力すると、指定した記号の内部を選択することができます。
(aaa bb|b ccc)
のとき、、v``i``)
などと入力するとイメージできるかと。
オペレータ + a + 記号
i
の代わりにa
だと、囲んでいる記号を含めた状態で選択します。
"aaa bb|b ccc"
で、d``a``"
とかでイメージできるでしょうか。
マクロ
q + [a-zA-Z]で開始、qで終了、@ + [a-zA-Z]で実行
例えば、q``a
で、a
というマクロの記録を開始します。
好きなだけ操作を行ったあと、q
を押すと停止します。
その後、任意のタイミングで@a
と実行すると、a
が実行されます。
100回繰り返したければ、100@a
です。
繰り返し
.
.
で直前の動作を繰り返します。
例えば、直前に30文字入力してインサートモードを抜けた場合、同じ30文字を入力します。
移動は「直前の動作」に含まれないため、お好きなところに移動して実行してください。
削除やペーストも同様に繰り返します。
数字での繰り返しも対応してます。
ビジュアルモード
CTRL + v
矩形選択モードです。
矩形選択を利用したテクニックとしては、矩形選択で複数行を選択した状態で、I
を押して何か入力し、ノーマルモードに戻ると、選択した複数行の矩形の先頭に同じ入力を行うことができます。
矩形の後方に入力したい場合には、A
です。
コマンドラインモード
置換コマンドはよく使うので覚えておきましょう。
今回は割愛しますが、ファイルを開いたり、画面を分割したり、コマンドを実行したりいろいろとできることは多いので、ぜひ調べてください。
:%s/正規表現/置換後文字列/g
とりあえず、一番使うであろう、ファイル内全文の全文字を置換するコマンドです。
詳しい説明はググったりヘルプを見ていただきたいですが、少しだけ解説します。
sの前
s
の前には置換対象範囲が入力できます。
上のコマンドの%
は現在のファイル全文を指しています。
%
なしだと、現在行についての置換になります。
他にも、1,10s
であれば1行目から10行目を選択できますし、ビジュアルモードで選択している状態で:
を押すと、:'<,'>
という状態になりますが、そのあとにs
と続けると、選択している範囲に対してのみ置換実行できます。
最後のスラッシュの後
g
は、同じ行に複数の置換対象文字がある場合に、すべてを置換するオプションです。
g
なしだと、最初にマッチした文字のみ置換されます。
他にも、置換するかどうか確認を求めるc
とか、置換は行わずに件数を教えてくれるn
とかあります。
その他Tips
- コマンドラインモードになる前に
/
などで検索中であれば、正規表現部分を空白にすることで、現在検索中の正規表現を対象にすることができます。 - URLなどを置換するとき、URLの
/
と置換コマンドの/
が競合するため、URLをエスケープしなくてはなりません。実は、置換の/
は;
とか@
とか適当な記号でも代用できるので、:%s;http://before;https://after;g
とか出来たりします。
最後に
結局詰め込みすぎたし、でもやっぱり詰め込みきれてないし、レベル順も適正かどうかわからないしって感じですが、頑張ってください。
記事書いてみましたが、チートシートの方が見やすいと思います。