viにモードなんてない

2008/04/9 (水)

viの初心者向け解説で、「入力モードとコマンドモードの二つがあり」
なんてのをよく見かける。でも、この説明が混乱の元だと個人的には思っている。

viはすべてがコマンドである。

hはカーソルを左に動かすコマンド、kは上に動かすコマンド、xは文字を削除するコマンド、iは文字を入力するコマンド、てな具合。だから、2kは2行上に移動するし、3xは3文字消えるし、4iは文字が4回入力される。試しに、

5oqwerty[ESC]

とやると

qwerty
qwerty
qwerty
qwerty
qwerty

となる。実に一貫性の取れた操作体系になっている。

「二つのモード」で混乱してたあなた、これでスッキリしたでしょ?

viはすべてコマンドだというのは、祖先がラインエディタだということを考えれば当たり前のこと。

ついでにいうと、viのコマンドの基本系は、

繰返し回数 動作
動作 範囲指定(カーソル移動)

で行なう。前者は上の例にも書いた3xといった記法。後者は、英語の動詞と目的語みたいなものか。例えば、

qwerty1asdfgh1zxcvbn

という行があり、カーソルがeにあったとしたとき、d3lとやれば、

qwy1asdfgh1zxcvbn

となる。念のため解説すると、

文字を消す。
その範囲は、カーソルの現在位置から3文字右まで。

ということである。同様に、d2f1とやれば、

qwzxcvbn

となる。こちらは、

文字を消す。
その範囲は、カーソルの現在位置から右側の2番目の1という文字まで。

という意味である。
どんどん応用できる。

d/b     現在位置から次の(行をまたぐ)bという文字まで消去。
y1G     現在位置から文頭までをyankバッファに入れる。
c^      現在位置から行頭までを変更する(入力の終りはESC)。

てな具合。

viはすべてコマンドだということと、動作と範囲の組合せという概念さえ掴んでしまえは、こっちのもの。

FreeBSD, Linux

Posted by k1