viもテキストエディタなので、カーソルのある位置に文字を入力する、という当たり前の動作を行う。 ゆえにカーソルの移動方法を知っておかねばなにもできない。
viは、他のエディタのように上下左右の矢印キーを押してカーソルを動かすのではない。 昨今のviクローンはそういう操作も可能だが、真のvi使いはそのようなまどろっこしい操作はしない。
カーソル移動は、編集モードで以下のキーを入力することで行う。
キー | 移動方向 |
---|---|
k |
上 |
j |
下 |
h |
左 |
l |
右 |
見た感じではわけがわからないが、 キーボードと照らしあわせるとこれらがホームポジション右手部分に固まっていることがわかる。 これがviの最高にすばらしい部分である。 カーソル移動において手がホームポジションから外れることは無く、スムーズに入力に入れる。 慣れるととんでもなく快適になるので、是非練習して使いこなして欲しい。
指定位置へのカーソルジャンプである。 これもまたviの場合かなり短いストロークで操作でき、お手軽である。
行番号を指定して、その場所にカーソルを移動する方法である。 編集モードで次のように入力する。
コマンド | 動作 |
---|---|
「行番号」g |
指定した行に移動 |
G |
最終行に移動 |
例えば10g
と打つとカーソルは10行目に移動する。
残念ながら先頭行への移動コマンドは無いので、1g
と打つしかない
(行番号が表示されていない場合は:set number
と入力することで表示させることができる。
詳細は環境設定の項で)。
viではたったこれだけの動作で好きな行にジャンプできるのである。 世でまかりとおっている「Ctrl+j」と入力してダイアログ表示、 行番号入力してようやくジャンプなんていう操作がいかに面倒かわかろうというものだ。
行内の特定列にカーソルをジャンプさせる操作である。 次のようなものがある。
コマンド | 動作 |
---|---|
0 |
行頭に移動 |
$ |
行末に移動 |
w |
1単語先に移動 |
W |
空白文字の次の文字に移動 |
f「char」 |
「char」が最初に現れる列へ移動(前方移動) |
F「char」 |
「char」が最初に現れる列へ移動(後方移動) |
t「char」 |
「char」が最初に現れる列の一つ手前へ移動(前方移動) |
T「char」 |
「char」が最初に現れる列の一つ手前へ移動(後方移動) |
; |
直前のジャンプコマンドを繰り返す |
, |
直前のジャンプコマンドを逆方向に繰り返す |
viに慣れてくると重宝するコマンド群である。 それでは、例などを示してみる。次のような文があるとしよう。
Cast in the name of god, ye not guilty.
nameのaの位置にカーソルがある。 ここで、次のようにコマンド入力する。
0
$
w
W
fe
Ft;
te
Te
すると、次のように移動する。
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
Cast in the name of god, ye not guilty.
先に示したコマンド一覧と照らし合わせて動作を確認してほしい。
6.は最後に;
、つまり繰り返しを指示しているので、theのさらに向こうにあるCastのtまで移動する。
3.と4.、つまりwとWは同じ動作をしているように見えるが、
実際何が違うのか私もよくわからない(おい)。
単語の区切りは半角スペースで判断するので、
結果的にどちらも同じ動作になるが・・・はて。
さて、ここで一つ困ったことがある。例えば、こんな文。
Eh-ya-ya-ya-yahaah - e'yayayayaaaa ... ngh'aaa ... ngh'aaa ... h'yuh ... h'yuh ... HELP! HELP! ... ff-ff-ff-FATHER! FATHER! YOG-SOTHOTH!
ここで、先頭位置から赤いカーソルの部分までジャンプしたいとする。
そこでaまでだからとfa
と入力しても、
5文字目のaに引っかかってしまい、4文字ジャンプして終わってしまう。
この場合、方法は2つある。一つはfa
を入力したあと、;
を2回入力することである。
そうすればfa
を計3回実行することになり、目的地に到達する。
もう一つは、3fa
のように回数指定をすることである。
削除コマンドで3dd
のようにすると3行消せることを説明したが、
あれ同様にコマンドの頭に回数を表す数値をつけることで、実行回数を指定できる。
この回数指定はジャンプコマンドに限らず大抵のコマンドで有効である。
ただ移動するだけならば前者の「fa;;」でも良いが、後述するカットorコピーと併用するような場合は後者の回数指定を利用する必要がある。
ちなみに、最後のカーソル位置までジャンプする場合は?
hがたくさん現れるのでその数を数えてfh
で跳ぶ、というのもいいが、
数えるのも面倒なので素直にtH
でHELPまで移動して数歩戻ろう。
たぶん、そっちのほうが楽。
特定の位置に「マーク」を施し、どこからでもそのマーク位置にジャンプできるよう設定できる。 Emacs等でもお馴染みの機能である。
コマンド | 動作 |
---|---|
m「label」 |
ラベル名「label」 のマークをカーソル位置にセットする |
`「label」 |
ラベル名「label」 のマーク位置にカーソルをジャンプさせる |
「label」
には任意のアルファベット1文字(小文字のみ)を入力する。
例えば、mx
で、xというラベルのマークをセットするのである。
ゆえに、最大26個のマークを設置できる。
そんなに大量に置いても覚えきれないが・・・。
実際に扱ってみよう。
A STRANGE GLOW SEEMS TO EMANATE FROM THIS ROOM.
IN THE CENTER, A SMALLISH MAN IN A LONG ROBE TURNS TOWARDS THE PARTY AND SHOUTS
"BEGONE, STRANGERS!" HE SLOWLY WAVES HIS HANDS, AND CHANTS
"MAPIRO MAHAMA DIROMAT!!"
今のカーソル位置でmx
と入力する。
次に、
A STRANGE GLOW SEEMS TO EMANATE FROM THIS ROOM.
IN THE CENTER, A SMALLISH MAN IN A LONG ROBE TURNS TOWARDS THE PARTY AND SHOUTS
"BEGONE, STRANGERS!" HE SLOWLY WAVES HIS HANDS, AND CHANTS
"MAPIRO MAHAMA DIROMAT!!"
この位置でmy
と入力する。
これで、x
とy
の二つのマークが設置された。
ファイルのどこにカーソルを置いていようと、`x
と入力するだけで、
A STRANGE GLOW SEEMS TO EMANATE FROM THIS ROOM.
IN THE CENTER, A SMALLISH MAN IN A LONG ROBE TURNS TOWARDS THE PARTY AND SHOUTS
"BEGONE, STRANGERS!" HE SLOWLY WAVES HIS HANDS, AND CHANTS
"MAPIRO MAHAMA DIROMAT!!"
と、マークした位置に戻れるわけである。
もちろん、`y
と打てば「STRAINGERS!」の先頭にカーソルがジャンプする。
このような短文ではありがたみは薄いが、実際には何千行にもなるテキストファイルを編集することも多い。
そういうときは実に重宝する。
残りのジャンプコマンド一覧である。
コマンド | 動作 |
---|---|
H |
画面の最上行に移動 |
L |
画面の最下行に移動 |
M |
画面の中央行に移動 |
% |
カーソルがある括弧(){}から、それに対応する括弧まで移動 |
上3つについては「画面の」とあるとおり、ファイル全体から見たものではなく、
画面表示されている部分の最上、最下、中央である。
この中で重宝するのは%
である。
特にプログラマは知っているかどうかで作業効率が大きく変わる。
個人的にはこいつ以外はあまり使い手がないような気もするが・・・。