HOME > 電算 > vi コマンド・メモ
vi コマンド・メモ
最終更新:2006/12/20
「なんとなく」使っているとイライラしてくるので、vi の移動・編集コマンドについて勝手に整理してみた。用語はテキトーにデッチ上げたものなので一般性がない。使用した vi は、nvi 1.79。
バッファ上での位置表現
位置表現は文字と文字の間をあらわすのではなく、ちょうど文字のある場所をあらわす。
位置表現がテキストの範囲指定に使われるとき、それが始点であるなら、当該文字を含み、終点であるなら、当該文字を含まない。ここで、始点というのはバッファ先頭に近い端を指す。二つの位置表現
abcdefghijpkm
が示す範囲にある文字は、efgh である。
位置表現は、現在位置、ジャンプ先の位置、レジスタに登録する/された位置、の三種類に用いられる。
命令の基本 1
「ジャンプ命令=くり返し回数+ジャンプコマンド」
たとえば、
3w | 三回 w コマンドを実行 |
j | 1wに同じ |
ジャンプコマンドには以下のようなものがある。前方とはバッファ頭に近い方向のこと。また、b は「前方の『単語先頭』へ」であり、「『前方の単語』先頭へ」ではない点に注意。
l | (エル)一文字右へ | ||
h | 一文字左へ | ||
k | 一行字上へ | ||
j | 一行字下へ | ||
w | 後方の「単語先頭」へ | W | 句読点を無視 |
b | 前方の「単語先頭」へ | B | 句読点を無視 |
e | 後方の「単語末尾」へ | E | 句読点を無視 |
) | 後方の「文先頭」へ | 文とは ? . ! のいずれかで終わりそのあとに 2 個以上の空白が続いたもの | |
( | 前方の「文先頭」へ | ||
} | 後方の「段落先頭」へ | 段落は設定よりさまざまに定義される | |
{ | 前方の「段落先頭」へ | ||
] | 前方の「セクション先頭」へ | セクションは設定よりさまざまに定義される | |
[ | 前方の「セクション先頭」へ |
たとえば、d3b を、「前方の 3 単語削除」と考えると頭がこんがらかる。「バッファ先頭に向けて単語先頭をなす文字を探すこと 3 回、その文字から現在位置の前の文字までを削除せよ」と考える。
命令の基本 2
「編集命令=くり返し回数+コマンド+ジャンプ命令」
つまり、
「編集命令=くり返し回数+コマンド+(くり返し回数+ジャンプコマンド)」。
たとえば、
2d3w | 3 回 w コマンドで移動した場所までの削除を 2 回くり返す |
6dw | 1 回 w コマンドで移動した場所までの削除を 6 回くり返す |
d6w | 6 回 w コマンドで移動した場所までの削除を 1 回くり返す |
編集コマンドには以下のようなものがある。
d | 削除 |
y | コピー |
c | 変更 |
次のコマンドはバッファの編集をするが、ジャンプ命令を後置できない。
~(チルダ) | 大文字←→小文字 |
x | 一文字削除 |
X | 現在位置の前の文字をひとつ削除 |
r | 一文字書き換え |
p | 現在位置の後へテキストを貼り込む |
.(ピリオド) | コマンドのくり返し |
u | コマンドの取り消し |
例外 (1) $ と e, E
$ コマンドを打つと、行末文字の上にカーソルが移動する。しかし、d$ を行うと、現在位置から行末文字までが削除される。
e コマンドや E コマンドを打つと、単語末尾へカーソルが移動する。しかし、de を行うと、この末尾の文字も含んで削除される。
これらのコマンドでは、カーソルを移動させるために単独で使われあ場合と、コマンドに後置されてコマンドの適用範囲を示す場合でジャンプ先の位置が異なるわけである。
例外 (2) c コマンド
The quick brown fox jumps over the lazy dog.
において——
(i) 2w すると、カーソルは j のところに移動する。
(ii) d2w すると、x のあとのスペースまで消去される。
(iii) y2w すると、"brown fox" のあとに一つだけスペースのついたものがコピーされる。
これらは、原則通りである。
しかしながら、
(iv) c2w すると、挿入モードに変わる前に消去されるのは x のところまでだけである。 (x のあとについているスペースは消去されない)。
レジスタ
mx | レジスタ x に現在位置を登録 |
`x | レジスタ x に登録された位置へジャンプ |