0-2-3-1:viの操作(1)


・ vi は UNIXの上で最も使用頻度が高いテキストエディタです。 Sun Microsystems社の創設者の1人であるビル・ジョイ氏に よって設計されたアプリケーションです。 プログラムのエディットやUNIXのシステムの設定ファイルのエディットなどに用 いられます。 viは UNIXのシステム管理などの作業を行う場合には必須の存在でしょう。 viはそうしたプロフェッショナル向けの仕様であるため、 最初は多少とっつきにくいかもしれません。 しかし、いったん慣れるときわめて効率良く作業を進めることができます。
viを起動するにはコマンドラインから単に vi もしくは vi の後に編集したい ファイル名を指定します。ファイル名は複数指定することも可能ですが、 通常は単独の場合が多いでしょう。


vi  abc

・ vi の特徴は「編集モード」と「入力モード」という2つの状態を取るということです。 どちらのモードになっているかで、キーから入力された文字の意味の解釈が異なります。「編集モード」ではそれぞれの文字に割り振られた「コマンド」として解釈され、 「入力モード」の場合には、文字のデータそのものと解釈されます。
この点が通常のテキストエディタやワープロと大きく異なります。 一番まごつく点かもしれません。 しかし、この仕組みのおかげで、viではカーソル移動キーなどの 助けがいっさいいりません。 DELキーや BSキーすら利用しません。 その一方で、「行のコピー」、「文書内の検索」など しばしば利用される機能をほんのわずかなキー入力で実行することが可能です。
viが起動された時点では「編集モード」です。したがって、 すぐには文字が入力できません。"a","i" などのコマンドをいったん呼びだして、 「入力モード」に移ります。 たとえば "abc" とデータを打ち込みたいとしたら、 "aabc" もしくは "iabc" の順にキーを押すことになります。 逆に「入力モード」から「編集モード」に移りたい時は、ESCキーを押します。
文書を保存して終了するためには、必ず「編集モード」に戻ります。 そこで ZZ と大文字の Zを2つ続けると保存終了となります。

入力モードに入るためのキー
キー意味
aカーソルの後に入力開始
iカーソルの前に入力開始
A行の末尾に入力開始
I行の先頭に入力開始
o次に新しい行を作り入力開始
O前に新しい行を作り入力開始
ファイルを保存・終了するためのキー操作
キー意味
ESCコマンドモードに戻る
ZZテキストの保存終了
:wqテキストの保存終了
:q!テキストの強制終了(保存しない)

・ 編集モードの状態では、テキスト内のカーソルの移動を キーの操作で行うことができます。この移動コマンドは実に豊富なのですが、 ここではとりあえず最初に覚えるべき基本的なもののみ示しておきます。

基本的な移動コマンド
キー意味
h左に1文字移動
l右に1文字移動
j下に1行移動
k上に1行移動
スペース右に1文字移動
Enter下に1行移動
w次の単語の先頭に移動
b前の単語の先頭に移動
0行の先頭に移動
$行の末尾に移動

・ もう1つ理解しておくべき概念が「バッファ」です。 バッファはテキスト本文とは別に一時的にデータを格納しておく場所です。 vi のバッファは目には見えませんが非常に重要な活躍をします。 viは複数のバッファを持つことができますが、 最も頻繁に利用されるのはコピー&ペーストもしくはカット&ペーストに 用いられるバッファです。 viの削除(x もしくは d 関連のコマンド)でカットされた内容は、 自動的にこのバッファに記憶されます。 コピー(y 関連のコマンド)によってテキストから削除せずにバッファに 記憶させることもできます。
バッファの内容は p もしくは P コマンドによってテキスト内に挿入されます。 pはカーソルの後もしくは行単位の場合は次の行に内容を追加します。 Pはカーソルの前もしくは行単位の場合は前の行に内容を追加します。

削除、コピーに関連するコマンド
キー意味
xカーソルの位置の1文字削除(DELの操作)
Xカーソルの前の1文字削除(BSの操作)
dd行の削除
yy行のコピー
d + 移動コマンド移動先まで削除
y + 移動コマンド移動先までコピー
pバッファの内容を挿入(カーソルの後)
Pバッファの内容を挿入(カーソルの前)
u変更内容を元に戻す
U行の内容を最初の状態に戻す

・ d および y は移動コマンドと組み合わせて対象となる範囲を指定することも 可能です。 また、x,dd,yy の前に数字を付けると、削除の対象の文字数もしくは行数を 指定したことになります。 5x はカーソルの位置から5文字を一度に削除します。 6yy はカーソルのある行を含め6行の内容をバッファにコピーします。