A    vi 入門

この付録では,vi の機能の概要を説明します。 さらに詳しく知りたい場合は, vi(1) リファレンス・ページを参照してください。 また,vi についての書籍は多数出版されています。

この付録は,3 つのセクションに分かれています。 最初のセクションでは vi の基本的な機能について説明しています。 2 つ目のセクションでは,作業の効率を上げるためのより高度なテクニックについて説明しています。 3 つ目のセクションでは,ex コマンドの利用について説明しています。

どのようなコンピュータ・システムでも,メモ書きから C プログラムの修正まで,テキスト・ファイルの編集が最も基礎的な作業となります。 vi は,たいていのコンピュータ・ユーザにとって,毎日の作業に特に役に立ちます。 vi を使用すると,すばやく簡単にファイルをオープンして編集し,結果を保存することができます。

vi テキスト・エディタは,次のような主要な機能はすべて備えています。

この付録では,vi の基本的な機能の使い方について説明します。 これを読み終えると,次のことができるようになります。

A.1    入門

この節では,vi を使用して次のことを行う方法について説明します。

A.1.1    ファイルの作成

この付録の例では,my.file というファイルを使用しています。 このファイルを作成するには,次に示すように vi コマンドを入力します。

$ vi my.file[Return]
 

すると,画面は次のようになります。

~
~
~
~
~
~
~
~
~
"my.file" [New file]
 

行頭にチルダ (~) が表示されている行は,ファイル内の空白行を示しています。 my.file は空のファイルであるため,ファイル内の全行の先頭にチルダ (~) が表示されます。

vi エディタには,コマンド・モード入力モードの 2 つのモードがあります。 vi を開始したときには,コマンド・モードになっています。 コマンド・モードでは,入力する文字はテキスト操作のためのコマンドとして解釈されます。 入力モードでは,入力する文字はテキストとして解釈されます。

vi コマンドで新しいファイルを作成するとき,vi エディタはコマンド・モードになっています。 つまり,vi はコマンドが入力されるのを待っています。 ここでは,my.file が空であるため,vi を入力モードにしてファイルにテキストを入力できるようにします。

vi を入力モードにするには,次のようにタイプします。

i

i コマンドは画面上には表示されません。 vi エディタは入力モードになり,これからタイプする文字はすべてテキストとして解釈されます。

次に示すサンプルのテキストでは,最後に入力した行で Escape キーを使用し,:wq コマンドで,ファイルを保存して vi エディタを終了していることに注意してください。 サンプルのテキストどおりにタイプしてください。 間違えたときには,バックスペース・キーを使用して修正してください。 Return の指示があるところでは,Return キーを押して次のテキスト行に移動してください。

You can use this text file[Return]
to experiment with vi.[Return]
The examples shown here[Return]
will teach you the basics of vi.[Escape]
~
~
~
~
~
:wq
 
"my.file" 4 lines, 108 characters
$

注意

使用している端末またはワークステーションのセットアップ方法によっては,Escape キーが異なる機能を実行するようにプログラムされていることがあります。 その場合には,キーボードのファンクション・キーのいずれか (おそらくF11) が,エスケープ機能を実行するようにセットアップされている可能性があります。 Escape キーが正しく動作しない場合には,システム管理者に問い合わせてください。

vi が入力モードのときに Escape キーを押すと,vi はコマンド・モードに戻ります。 コマンド・モードに戻ると,タイプする文字はすべてコマンドとして解釈されます。 :wq コマンドは,my.file という名前でファイルを現在のディレクトリに書き込んで (保存する),vi エディタを終了します。

:wq コマンドは,他の vi コマンドと大きく異なっています。 これは,:wq コマンドが vi コマンドではなく,ex コマンドであるためです。 vi がコマンド・モードであるときにコロン ( : ) をタイプすると,コロンが画面の下に表示されるのがわかるでしょう。 コロン ( : ) は,vi 内から ex コマンドを開始します。 どの ex コマンドも,vi がコマンド・モードのときに実行されます。 コマンドの後には Return キーを押して,コマンドの入力が終了したことを ex に知らせなければなりません。 ex コマンドについての詳細は,A.3 節を参照してください。

vi がどちらのモードかわからなくなった場合には,Escape キーを数回押してコマンド・モードにいることを確認してください。 システムによっては,vi がコマンド・モードのときに Escape キーを押すと,ベルが鳴るように構成されていることがあります。

vi での Escape キーの使用や別の終了方法については,この付録の後の節で詳しく説明します。

my.file に入力したテキストは,この付録の残りの例で使用します。

A.1.2    既存のファイルのオープン

vi では,新規にファイルを作成するにも,既存のファイルをオープンするにも,次に示す同じ構文を使用します。

vi filename

my.file ファイルをオープンするには,次のように vi コマンドを入力します。

$ vi my.file
 

画面は次のようになります。

You can use this text file
to experiment with vi.
The examples shown here
will teach you the basics of vi.
 
~
~
~
~
~
~
"my.file" 4 lines, 108 characters
 

ファイルに入力したテキストが画面の上に表示されます。 チルダではじまる行はファイル内の空行を表しています。 画面の最下行には,ファイルの名前,ファイルの行数および文字数が表示されます。

A.1.3    ファイルの保存と vi の終了

前述の例では,:wq コマンドでファイルを保存して,vi エディタを終了することを学びました。 ファイルを保存して終了する方法には,次に示す方法もあります。

大きなテキスト・ファイルに対して,多量の情報を追加したり,削除したり,大規模な変更を行っている場合には,頻繁に (たとえば 10 分ごと) 保存して重要なデータが失われないようにします。 write コマンドを使用すると,ファイル全体が現在のディレクトリに書き込まれます。 write コマンドの形式は次のとおりです。

:w filename

filename はオプションであり,別のファイル名で保存する場合にのみ指定します。 filename を省略した場合には,自動的に現在のファイル名で保存されます。 :w コマンドを入力すると,現在のファイル名,行数,および文字数が画面の下に表示されます。 新しいファイル名を入力した場合には,その新しいファイル名が表示されます。

注意

:w コマンドに新しいファイル名を指定すると,新しいファイル名と元のファイル名の 2 つファイルが現在のディレクトリに保存されます。

ファイルの変更が終了すると,ファイルの保存と vi の終了を同時に行うことができます。 write および quit コマンドの形式は次のとおりです。

:wq
 

:wq コマンドは,同じ名前でファイルを保存して vi を終了し,シェル・プロンプトに戻ります。

ファイルに対して行った変更を保存しないで vi を終了する方法もあります。 これは,間違って多数の行を削除してしまい,初めからやり直したい場合などに役立ちます。 この場合には,vi を終了すると,ファイルは元の状態に戻ります。 ただし,ファイルが元の状態に戻るのは,現在の編集セッションでファイルを保存していない場合に限ります。 変更を保存しないで vi を終了するには,次のように入力します。

:q!
 

:q! コマンドでファイルを終了しても,ディレクトリから削除されることはありません。 ファイルはディレクトリに残っていますが,ファイルに対して行った変更は含まれていません。

表 A-1 に,ファイルの保存や vi エディタの終了に使用するコマンドをまとめています。

表 A-1:  write および quit コマドのまとめ

コマンド 説明
:w ファイル全体を現在のファイル名で保存する。vi エディタは終了しない。
:w filename ファイル全体を新しいファイル名で保存する。vi エディタは終了しない。 新しいファイル名と元のファイル名がディレクトリに存在する。
:wq ファイル全体を現在のファイル名で保存して,同時に vi エディタを終了する。
:q! ファイルを終了し,vi エディタも終了する。 ファイルを最後に保存した以降の変更は保存しない。

A.1.4    ファイル内での移動

my.file をクローズしている場合には,次のコマンドを使用して,再オープンします。

$ vi my.file
 

カーソルはファイルの最初の文字のところ,つまり,YouY のところにあるはずです。

この付録で前述したように,vi を起動したときにはコマンド・モードになっています。 コマンド・モードでは,入力した文字はファイルへのテキスト入力ではなく,コマンドとして扱われます。

A.1.4.1    カーソルの移動 (上,下,左,右)

vi がコマンド・モードのときには,キーボード上のいくつかのキーが移動キーとして使用されます。 次の英字キーでカーソル移動を制御します。

移動キーを使用して,カーソルを experiment という語の最初の文字のところへ移動させてみてください。 次のようにタイプします。

lllj
 

キーボードに矢印キーがある場合には,矢印キーを使用してカーソルを上下左右に移動させることができます。 ただし,hjkl の各キーを使用すれば,指をキーボードの定位置から離さずに入力できるので,入力スピードを上げることができます。 キーボードによっては,hjkl の各キーは繰り返し型のキーなっており,キーを押したままにしておくと,キーを離すまでそのキーの動作を繰り返します。 たとえば,j を押したままで,ファイルの行を迅速にスクロールすることができます。

コマンド・モードでは,Return キーはカーソル移動キーと同様に動作します。 Return キーを押すと,カーソルは次の行の先頭に移動します。 この動作は,カーソルを次行の同じ文字位置に移動させる j キーとは異なり,Return キーはカーソルを次行の先頭に移動させます。

コマンド・モードでは,ハイフン ( - ) はカーソルを前行の先頭に移動させます。 この機能はファイル内で逆にスクロールする場合に役立ちます。 この動作は,前行の同じ文字位置に移動させる k キーとは異なり,( - ) はカーソルを前行の先頭に移動させます。

ここで説明したとおりにカーソルが動くことを確認したら,次の項に進む前に,カーソルを experiment の最初の文字に戻してください。

A.1.4.2    カーソルの移動 (語,行,文,パラグラフ)

w コマンドを使用して,カーソルを単語単位で移動させることもできます。 w コマンドは,カーソルを次の文字の先頭に移動します。 たとえば,with という単語の先頭にカーソルを移動させるには,次のようにタイプします。

w
 

また,b コマンドを使用すると,カーソルを 1 つ前の単語の先頭まで戻すことができます。 たとえば,experiment という単語の先頭にカーソルを移動させるには,次のようにタイプします。

b
 

b コマンドを使用しないで,単語の先頭から次のようにタイプするとどうなるでしょうか。

llllb
 

カーソルは,experiment の先頭に戻ります。

この単語移動コマンドは,必要な場合には,次テキスト行,または前テキスト行にラップします。 次のようにタイプして,カーソルを text という単語の先頭に移動させてください。

bbb
 

カーソルが逆方向に移動して,前行にラップすることに注意してください。

ここで,他の移動コマンドも紹介しておきましょう。 ゼロ (0) はカーソルを現在のテキスト行の最初にカーソルを移動させ,ドル記号 ($) はカーソルを現在のテキスト行の最後に移動させます。

右カッコ [ ) ] はカーソルを次の文の先頭に移動させ,左カッコ [ ( ] はカーソルを前の文の先頭に移動させることができます。

右中カッコ ( } ) でカーソルは次のパラグラフの先頭に移動し,左中カッコ ( { ) で前のパラグラフの先頭に移動します。

A.1.4.3    ファイル内でのカーソルの移動とスクロール

大きなファイルでは,制御キーを押すことによって,画面単位でカーソルを移動させることができます。

次に示す英大文字のコマンドは,カーソルを広範囲に移動させます。

A.1.4.4    移動コマンドのまとめ

vi エディタには他にも多くの移動コマンドがあります。 この付録で基本を習得した後,詳しくは vi(1) リファレンス・ページを参照してください。

表 A-2 にカーソル移動コマンドの一覧を示します。 カーソル移動キーは vi がコマンド・モードのときのみ有効です。

表 A-2:  カーソル移動コマンド一覧

コマンド 説明
h カーソルを 1 文字左に移動させる。
j カーソルを同じ文字位置で 1 行下に移動させる。
k カーソルを同じ文字位置で 1 行上に移動させる。
l カーソルを 1 文字右に移動させる。
[Return] キー カーソルを次行の先頭に移動させる。
- カーソルを前の行の先頭に移動させる。
w カーソルを次の単語の先頭に移動させる。
b カーソルを前の単語の先頭に移動させる。
0 カーソルを現在の行の先頭に移動させる。
$ カーソルを現在の行の終わりに移動させる。
) カーソルを次の文の先頭に移動させる。
( カーソルを前の文の先頭に移動させる。
} カーソルを次のパラグラフの先頭に移動させる。
{ カーソルを前のパラグラフの先頭に移動させる。
Ctrl/D 画面を半分下方へスクロールさせる。
Ctrl/F カーソルを 1 画面先へ移動させる。
Ctrl/B カーソルを 1 画面後ろへ移動させる。
Ctrl/U 画面を半分上方へスクロールさせる。
H カーソルをホーム位置 (ファイルの先頭文字) に移動させる。
G カーソルをファイルの最終行へ移動させる。

A.1.5    新しいテキストの入力

ファイルに新しいテキストを入力するには,vi は入力モードでなければなりません。 入力モードでは,タイプした文字は直接ファイルのテキストとして挿入されます。 入力モードからコマンド・モードに戻るには,Escape キーを 1 回押します。

テキストの挿入に使用するコマンドはいくつかありますが,どのテキスト挿入のコマンドが入力されても,vi は自動的に入力モードになります。

この項の練習を始める前に,まず my.file をオープンし,カーソルを最初の行にある単語 text に移動させてください。

初めて my.file にテキストを入力したときのように,挿入コマンドを使用して,text の直前に new を挿入します。 カーソルを text の最初の t の上に置き,次の挿入コマンドをタイプして,vi を入力モードにします。

i
 

次に,new という単語を入力して,スペース・バーを 1 回押します。

new[Space]
 

入力モードを出るには,Escape キーを押します。

[Escape]
 

カーソルは,newtext の間のスペースにあるはずです。

i コマンドを入力すると,カーソルのある文字の直前からテキストの挿入を開始します。 このため,カーソルが単語の最初の文字にあるときにテキストを挿入する場合は,スペース・バーを押して単語と単語の間にスペースを入れるようにしなければなりません。

テキスト挿入に使用するもう 1 つのコマンドは,追加 (a) コマンドです。 挿入コマンドとは異なり,a コマンドは入力した文字をカーソル位置の直後に追加します。 a コマンドがどのように動作するかをみるため,カーソル移動キーを使用してカーソルを youu に移動させた後,次のようにタイプしてください。

a
, too,[Escape]
 

vi テキスト・エディタは入力されたテキストを You の後ろに追加します。 カーソルは 2 つ目のコンマの上にあるはずです。

o コマンドは,カーソルのある行の下に新しい行を作成し,その行の先頭からテキストを挿入できるようにします。 このファイルの終わりに文を追加するため,次のように Return キーを 3 回押して,カーソルをファイルの最終行に移動させます。

[Return]
[Return]
[Return]
 

カーソルは,will に移動します。 ここで,次のようにタイプすると,カーソルのある行の下に新しい行が作成され,vi は自動的に入力モードになります。

o
 

次のテキスト例を入力してください。 [Return] のところでは,必ず Return キーを押してください。 入力が終了したら,Escape キーを押してコマンド・モードに戻ります。

New text can be easily entered[Return]
while in input mode.[Escape]
 

画面は次のようになっているはずです。

You, too, can use this new text file
to experiment with vi.
The examples shown here
will teach you the basics of vi.
New text can be easily entered
while in input mode.
~
~
~
~
~
~
 

O コマンドを使用すると,現在の行の上に新しい行を作成して,その行の先頭からテキストを挿入することができます。 このコマンドは,ファイルの先頭に新しいテキストを追加するときにたいへん便利ですが,ファイルの中のどこで使用してもかまいません。 練習としてこのコマンドを使用し,新しい行を作成してテキストを入力するには,まず,カーソルをファイルの 1 行目に移動させます。 カーソル移動コマンド H を使用できることを思い出してください。 その後,次のようにタイプします。

O
Opening a new line is easy.[Escape]
 

vi テキスト・エディタは Escape キーが押されると,コマンド・モードに戻ります。

vi エディタには,入力モードに入るコマンドがもう 2 つあります。 I コマンドと A コマンドです。 I コマンドは,現在の行の最初の文字の前にテキストを挿入し, A コマンドは,現在の行の最後の文字の後にテキストを挿入します。

次のようにタイプして,行の先頭にテキストを挿入する練習をしてください。

I
Inserting text is easy.[Space][Escape]
 

行の終わりにテキストを追加するには,次のようにタイプします。

A
Really![Escape]
 

画面は次のようになっているはずです。

Inserting a line is easy. Opening a new line is easy. Really!
You, too, can use this new text file
to experiment with vi.
The examples shown here
will teach you the basics of vi.
New text can be easily entered
while in input mode.
~
~
~
~
~
~
 

表 A-3 に,ファイルにテキストを挿入したり追加するために使用するコマンドの一覧を示します。 これらのコマンドはコマンド・モードで実行しますが,これらのコマンドを入力すると, vi は自動的に入力モードになります。

表 A-3:  テキスト挿入コマンド一覧

コマンド 説明
i カーソル位置の直前にテキストを挿入する。
a カーソル位置の直後にテキストを追加する。
I カーソルのある行の先頭にテキストを挿入する。
A カーソルのある行の終わりにテキストを追加する。
o カーソルのある行の下に新しい行を作成する。
O カーソルのある行の上に新しい行を作成する。

A.1.6    テキストの編集

ここまでは,新しいテキストをファイルに追加する方法を学習しました。 ところで,テキストに変更を加える必要がある場合にはどうするのでしょうか。 vi エディタには,テキストの削除や変更のためのコマンドが用意されています。 たとえば,my.file の 6 行目にある easily という単語を削除するには,カーソルをこの単語の先頭文字に移動させて,次のようにタイプします。

dw
 

これは,削除コマンド d と,移動コマンド w を組み合わせたものです。 実際,vi のコマンドの多くは,移動コマンドと組み合わせて,動作の持続期間を指定することができます。 vi コマンドの一般形式は,次のとおりです。

[number][command]motion

command は動作コマンドを表し,motion は移動コマンドを表します。 number はオプションであり,コマンドを繰り返す回数を表します。 この一般形式を使用して,カーソルをすばやく移動させることもできます。

これを説明する前に,まず,H をタイプして,カーソルを my.file の先頭に移動させてください。 ここで,カーソルを4単語先に移動させてみましょう。 次のように入力します。

4w
 

カーソルが 4 単語先に移動して,5 番目の単語 easy の最初の文字の上に来ます。

A.1.6.1    単語の削除

コマンドの一般形式を使用して,このテキスト・ファイルの最後の 5 文字を削除することができます。 Return キーを数回押してカーソルを最後の行の先頭に移動させてから,次のように入力します。

5dw
:w
 

1 行全体を削除するには,4 単語ではなく,5 単語の削除が必要です。 これは,行の最後についているピリオドも 1 文字として数えるためです。 単語削除コマンドを使用するときには,句読点もそれぞれ 1 単語として数えます。 時々ファイルの保存を行うことを思い出してもらうため,この例では :w コマンドを使用してファイルを write (保存) しています。

単語の一部だけを削除する場合は,x コマンドを使用します。 x コマンドは一度に 1 文字を削除します。 カーソルを exampless まで移動して,このコマンドを使用してみましょう。 x キーを 1 回押すと,s が削除されます。

A.1.6.2    行の削除

dd コマンドは一度に 1 行全体を削除するためのコマンドです。 dd コマンドに数字を指定して,複数行を削除することもできます。 たとえば,カーソルを 6 行目 (New で始まる行) に移動させて,次のようにタイプしてください。

2dd
 

ファイルの 6 行目と 7 行目 (7 行目は空) が同時に削除されます。 dd コマンドは,数字を指定しなくても使用できます。 その場合には,一度に 1 行ずつ削除されます。

D コマンドは,現在カーソルがある行のカーソル位置からその行の終わりまでをクリアしますが,行そのものは削除しません。 カーソルが行の先頭にある場合には,行全体がクリアされます。 このコマンドを使用すると,dw コマンドなどのように語数を指定する必要がないため,作業をスピードアップすることができます。 このコマンドは,行全体を書き換える場合に便利です。 カーソルを行の先頭に置き,D コマンドに続けてテキスト挿入コマンド (iIaA のいずれか) を入力すると, 少ないキー入力で,現在の行のテキストをクリアして,新しいテキストを再入力することができます。

A.1.6.3    テキストの変更

テキストの変更コマンド c を使用すると,削除と入力モードへの移行が組み合わされた動作を行うことができます。 このコマンドは d コマンドと同じ一般形式を取ります。 new text というテキストを almost new demo に変更するには,まず,new の先頭の文字にカーソルを移動してから,次のコマンドを入力します。

2cw
 

テキストはすぐには消えません。 ドル記号 ($) が変更範囲の最後 (text の最後の t) に表示され,vi は自動的に入力モードになります。 ここで入力したテキストがドル記号までの既存のテキストを重ね書きし,必要に応じて変更範囲は広がります。 次の新しいテキストを入力してください。

almost new demo[Escape]
 

A.1.6.4    テキスト編集コマンドのまとめ

これまでの項で説明したように,テキスト編集コマンドは移動コマンドと一緒に使用することにより,編集力をアップすることができます。 テキスト編集コマンドは数字と組み合わせて使用すると,複数の単語や行を同時に変更したり削除することができます。 表 A-4 に,テキスト編集に使用するコマンドの一覧を示します。

表 A-4:  テキスト編集コマンドのまとめ

コマンド 説明
cw カーソルのある単語を新しく入力するテキストに変更する。 必要な長さのテキストを新しく入力することができる。 Escape キーを押して,変更の終了を知らせる。
ncw n 個の単語を新しく入力するテキストに変更する。 新しく入力するテキストは n 個の単語である必要はない。 必要な単語数のテキストに変更できる。 Escape キーを押して,変更の終了を知らせる。
D カーソル位置からその行の終わりまでのテキストをクリアする。 行そのものは削除しないため,テキストを追加できる。
dd カーソルのある行を削除する。
ndd カーソルのある行から n 行を削除する。
dw カーソルのある単語を削除する。
ndw カーソルのある単語から n 語を削除する。
x カーソルのある文字を削除する。

A.1.7    コマンドの取り消し

変更を行った後で,それが間違っていることに気づいた場合,次のコマンドを実行していなければ,間違いを正すことができます。 u コマンドは,最後に入力したコマンドを取り消します。 次のようにタイプして,最後のコマンド 2cw を取り消してみてください。

u
 

2cw コマンドを実行した後,別のコマンドを実行していない場合には,文字列 almost new demonew text に戻ります。

大文字の U コマンドは,カーソルのある行に対して行われたすべての変更を取り消して,その行を元の状態に戻します。 U コマンドは,カーソルを別の行に移動させていない場合にだけ有効です。

A.1.8    編集の終了

この付録の練習を終えたら,ファイルを保存して vi を終了します。 変更内容を保存してから vi を終了させるには,次のように入力します。

:wq[Return]
 

変更内容を保存しないで vi を終了させるには,次のように入力します。

:q![Return]
 

これで,vi を使用してファイルの編集ができるようになりました。 次の各節で,生産性を上げるための高度なテクニックや環境をカスタマイズする方法を説明します。

A.2    高度なテクニックの使用

この節では,文字列を検索したり,テキストを移動させたり,コピーやペーストを行う方法について説明します。 文書が大きくなるにつれ,こうしたテクニックを駆使すると,効率的に作業することができます。

A.2.1    文字列の検索

大きな文書では,特定の文字列をテキストの中で探すのは,たいへん時間のかかる作業です。 スラッシュ ( / ) コマンドを使用して,ファイル内で文字列を検索することができます。 スラッシュ ( / ) を入力すると,検索するテキスト文字列を入力するように求められます。 Return キーを押すと,vi は入力した文字列が最初に現れる位置を検索します。

my.file をまだオープンしていない場合には,そのファイルを再オープンします。 この付録で説明したカーソル移動キーを使用して,文書の先頭に移動します。 文字列 th を検索するには,次のように入力します。

/th[Return]
 

スラッシュ ( / ) を入力するとすぐに,/ が画面の最下行に表示されます。 これはコロン ( : ) を入力する場合と同様です。 文字列 th を入力すると,画面の最下行にエコー (表示) されます。 検索する文字列を入力し間違えた場合には,バックスペース・キーを使用して訂正できます。

Return キーを押すと,入力した文字列が最初に現れる位置にカーソルが移動します。 この例の場合は,this という単語の th に移動します。

n コマンドは,前回検索した文字列が次に現れる位置を検索します。 次のように入力してみてください。

n
 

カーソルは文字列が次に現れるところ,つまり,withth の位置に移動します。

同様に,N コマンドも検索文字列が次に現れる位置を検索しますが,n コマンドと逆方向に検索します。

疑問符 (?) コマンドも,文字列の検索を開始するために使用されますが,? コマンドはファイルを逆方向に検索します。 逆方向に検索する場合,n コマンドで,カーソルは逆方向に移動して前にある文字列を検索し,N で順方向に検索します。 / で検索する場合の全く逆になります。

A.2.2    テキストの削除と移動

テキスト・ブロックを移動するには,まず,移動するテキストを選択します。 選択する方法はすでに説明済みです。 削除 (d) コマンドは,テキスト行を削除するだけでなく,ペースト・バッファへのコピーも行います。 一度ペースト・バッファに入れると,カーソルの位置を決めた後,小文字の p コマンドを使用して,カーソル位置の後にテキストを移動 (ペースト) させることができます。

カーソルをファイルの 1 行目に移動させて,次のようにタイプします。

dd
 

するとその行は削除され,ペースト・バッファにコピーされます。 カーソルは,ファイルの次の行に移動します。 バッファにコピーされた行を,カーソルがある行の次の行に戻すには,次のようにタイプします。

p
 

大文字の P (Paste) コマンドは,テキストをカーソルのある行の下ではなくに上にペーストします。

文字や単語のブロックを削除すると,削除されたテキストは現在の行の新しい位置にペーストされます。 たとえば,can という単語を,with という単語の直前に移動させるには,次のコマンドを使用します。 ここでは,大文字の P コマンドを使用することに注意してください。

/
can[Return]
dw
/
with[Return]
P
 

A.2.3    テキストのコピー

テキストのコピーは,移動の場合と同様の方法で行います。 ただし,テキスト削除コマンド d の代わりに,ヤンク (yank) コマンド y を使用します。 y コマンドは,指定したテキストをファイルから削除することなくペースト・バッファにコピーします。 構文は d コマンドの場合と同じです。 また,yy コマンドを使用すると,dd と同じように,テキスト行全体をペースト・バッファにコピーすることもできます。

たとえば,ファイルの最初の 2 行を,そのすぐ下にコピーするには,ファイルの 1 行目にカーソルを移動させてから,次のコマンドを入力します。

2yy
j
p
 

j を使用して,カーソルを 1 行下に移動しておかなければ,コピーした 2 行は,2 行目の後ではなく,1 行目の後にペーストされます。

A.2.4    その他の vi の機能

他の vi の機能も紹介します。 vi(1) リファレンス・ページには,利用できるコマンドの一覧が示されています。 特に次のコマンドが便利です。

J

カーソルのある行と次の行を結合して 1 行にする。

.

直前のコマンドを繰り返す。

s

カーソル位置の文字を,次に入力する文字テキストに置き換える。

x

カーソル位置の文字を削除する。

~

カーソル位置の文字が小文字ならば大文字に,大文字ならば小文字に変換する。

!

オペレーティング・システムのコマンドを,カーソルがある行で実行し,テキストを出力されたものと置き換える。

Ctrl/L

画面表示に何か問題が発生した場合に,画面をクリアする。 画面上の出力に混乱が生じた場合には,Ctrl/L を押す。

A.3    ex コマンドの利用

vi スクリーン・エディタは,ex ライン・エディタをベースに設計されています。 ベースになっている ex ライン・エディタを利用することにより,テキスト・ファイル全体や,ファイル内の広範囲にわたる部分で一括変換を行うことができます。 ex コマンドには,vi コマンド内からコロン ( : ) コマンドを使用してアクセスできます。 :wq:q! といった編集内容を書き込むコマンドやエディタの終了に用いる ex コマンドについては,この付録の前の節ですでに紹介しています。

コロン ( : ) コマンドを使用すると,ex によってエディタ画面の最下行にコロン ( : ) ではじまるコマンド行が表示されます。 各 ex コマンドの最後には Return キーを押します。 また,vi コマンド Q を使用すると,ex を半永久的に入力することができます。 このコマンドは,ユーザが明示的に vi に戻るまで,処理を ex に引き渡します。 偶然にこのような状態になることがよくあります。 そのような場合に vi に戻るには,次のように,コロン ( : ) プロンプトに対して vi とタイプしてから,Return キーを押します。

:vi[Return]
 

ex コマンドは,テキスト・ファイル中の行ブロックに対し,次の一般構文に従って動作します。

: [ address [,address] ] command

command とその引数は,1 番目と 2 番目の address とその間の行に対して処理を行います。 1 つのアドレスだけを指定する場合,コマンドは指定行についてのみ有効です。 アドレスを指定しない場合には,コマンドは現在の行についてのみ有効です。 アドレスを指定するには,いくつかの方法があります。 次に,一般的なアドレス指定の方法を示します。

line number

アドレスを絶対行番号で指定する。

/pattern/

パターンを含む次の行を指定する。

.

カーソルのある行を指定する。

$

ファイルの最後の行を指定する。

address±lines

アドレス行からの相対オフセットを指定する。

%

ファイルの全行を指定し,両方のアドレスの代わりに使用する。

以降の各項で,便利な ex コマンドと,ex のカスタム機能をいくつか紹介します。 コマンドの詳細な一覧については, ex(1) リファレンス・ページを参照してください。

A.3.1    置換

最も一般的な置換作業,おそらく ex の作業の中でも最も一般的な作業は,ある単語またはフレーズのグローバル置換です。 これは,s コマンドを使用して行います。 前出の my.file ファイルをクローズしている場合には,再オープンしてください。 すべての "is" を "was" に置き換えるには,次のコマンドを使用します。

:%s/is/was/g[Return]
 

この置換コマンドは,% アドレスにより,ファイル内の全行に適用されます。 スラッシュ ( / ) はセパレータとして使用されます。 コマンドの終わりに g 引数が指定されている場合は,各行でパターンが見つかるたびにすべて (グローバルに) 置き換えられます。 g 引数が指定されていない場合には,各行で 1 回しか置き換えられません。

置換を行うときは,目的どおりに実行されたかどうかを確認する必要があります。 上記のコマンド行では,is がすべて was に変換されたため,thisthwas に変換されたことに注意してください。

c 引数を g 引数と一緒に指定すると,置換のたびに確認することができます。 確認の形式は少し複雑ですが,グローバル置換をすると問題がありそうな場合には,この方法をお勧めします。

置換時の確認の例として,次のコマンドを入力して thwasthis に戻します。

:%s/thwas/this/gc[Return]
 

画面の下には,次のプロンプトが表示されます。

You, too, use thwas new text file
              ^^^^^
 

次の例で示すように,y とタイプして Return キーを押します。 すると,次の置換に関して確認が求められます。

You, too, use thwas new text file
              ^^^^^y [Return]
You, too, use thwas new text file
              ^^^^^

y をタイプして Return キーを押します。 Hit return to continue というプロンプトに対しては,次のようにもう一度 Return キーを押します。

You, too, use thwas new text file
              ^^^^^y
You, too, use thwas new text file
              ^^^^^y [Return]
[Hit return to continue] [Return]

これで,2 箇所で見つかった thwas という単語が this に戻りました。 vi はコマンド・モードに戻り,カーソルは最後に置換が行われた行の先頭に来ます。

次に,サンプルのファイルで,別の置換をしてみましょう。 まず,$ (最後の行の先頭へ移動する),o (新しい行を作成する),yy (コピー),p (ペースト) の各コマンドを使用して,次のように,新しいテキスト行を 3 行ファイルに追加します。

:$[Return]
o
Some new text with a mispelling.[Escape]
yy
p
p
p
 

これで,新しいテキストが 4 行増えたことになり,どの行にもスペルミスのある単語 mispelling が含まれています。

このスペルミスを訂正するには,次のコマンドのいずれかを入力します。

:1,$s/mispelling/misspelling/[Return]
 

または,

:5,8s/mispelling/misspelling/[Return]
 

最初の例では,アドレス 1,$ は,1 行目 (1) からファイルの最終行 ($) まで置換を行うことを示しています。 2 番目の例では,5,8 は 5 行目から 8 行目までの行に対して置換を行うことを指定しています。 変更は各行で 1 回ずつなので,g 演算子を使用する必要はありません。

A.3.2    ファイル全体または一部の書き込み

:wq コマンドは特殊な ex コマンドで,ファイル全体を書き込みます。 このコマンドは,書き込みコマンド w と終了コマンド q の機能を組み合わせたものです。 終了コマンドが取ることのできる引数は感嘆符 (!) だけです。 このコマンドは,変更内容を保存しないで強制終了します。

w コマンドは,アドレスやファイル名の引数を取ることができるため,テキストの一部を別のファイルに保存することができます。 たとえば,テキストの最初の 3 行を新しいファイル,my.new.file に保存するには,次のコマンドを使用します。

:1,3w my.new.file[Return]
"my.new.file" [New file] 3 lines, 130 characters
 

A.3.3    テキスト・ブロックの削除

ex の削除コマンドは,vi と同様,d です。 現在の行からファイルの終わりまでを削除するには,次のコマンドを使用します。

:.,$d[Return]
 

A.3.4    ユーザ環境のカスタマイズ

ex エディタには,ユーザの vi 環境をカスタマイズするメカニズムが 2 種類用意されています。 1 つは,:set コマンドを使用して環境変数を設定する方法であり,もう 1 つは,:map コマンドを使用して,キー・シーケンスを vi コマンド・キーにマップする方法です。

環境変数を設定する場合,ブール変数は option または no option として割り当てるか,あるいは,option=value として割り当てます。 環境変数の完全な一覧は, ex(1) リファレンス・ページに記載されています。 表 A-5 に,一般的な変数をいくつか示します。

表 A-5:  vi の一般的な環境変数

変数 説明
errorbells エラー発生時に,ベルを鳴らすことを指定する。 これが省略時の設定。
ignorecase 検索時には大文字,小文字の区別を無視することを指定する。 省略時の設定は noignorecase
number 行番号を左端に表示することを指定する。 省略時の設定は nonumber
showmatch 対になった小カッコや中カッコを入力するときに,カーソルが対の一方の文字に移動してから改行することを指定する。 省略時の設定は noshowmatch
tabstop タブ間のスペース数を指定する。 省略時の値は tabstop=8
wrapscan 検索時に,ファイルの先頭または最後でラップすることを指定する。 省略時の設定値は wrapscan
wrapmargin

画面の端から指定文字数分だけ自動的に右マージンを作成する。 カーソルが指定された右マージンに達すると,新しい行が自動的に作成され,入力中の単語は次の行に送られる。 省略時の値は wrapmargin=0

wrapmargin 変数は,ユーザの好みの値に設定する方がよい。 設定しない場合,vi は省略時の値である 0 を使用する。 省略時の値を使用すると,カーソルは画面の行末に来ると次の行に移る。 この場合,入力中の単語は 2 行にまたがって表示される。

次のコマンドを使用して,サンプル・ファイルに行番号を表示させてください。

:set number[Return]
 

行番号を削除するには,次のコマンドを入力します。

:set nonumber[Return]
 

:map コマンドは,vi コマンド・キーに vi コマンドのシーケンスを割り当てます。 :map コマンドの構文は次のとおりです。

:map key sequence [Return]

このコマンド・シーケンスが,該当するキーに割り当てられているコマンドの代わりにキーに割り当てられます。 コマンド・シーケンスは,マップしたいキー・ストロークと同じでなければなりません。 ただし,Return キー,Escape キーなどの特殊キーや,Ctrl キーと同時に押すキーの前には,Ctrl/V をタイプします。 q キーや v キーには関連するコマンドがないので,マップにはこれらのキーを使用することをお勧めします。

たとえば,テキストに "This space held for new text" という行を挿入するキー・シーケンスをマップするには,次のようなコマンドを使用します。

:map q oThis space held for new text[Ctrl/V][Escape][Return]
 

上記の例では,エスケープ文字の前に Ctrl/V をつけていることに注意してください。

A.3.5    カスタマイズした内容の保存

カスタマイズした環境を永久保存するには,該当する ex コマンドを,ホーム・ディレクトリにある .exrc という名前のファイルに入れます。 このファイルに入れたコマンドは,viex を入力するたびに有効になります。 このファイルの中では,vi コマンドの (:) を使用する必要はありません。 なぜなら,これらのコマンドは基礎となる ex エディタから直接読み取られるからです。

たとえば,ファイルの行番号が常に表示され,前の項で示したシーケンスをマップし,5 文字分の自動右マージン設定を行うように環境をカスタマイズするには,vi を使用して,ホーム・ディレクトリの .exrc ファイルをオープンし,次の行を追加します。

set number
map q oThis space held for new text [Ctrl/V] [Escape]
set wrapmargin=5
 

このファイルに書き込んだ後,サンプル・ファイルをオープンして,望みどおりの環境設定が行われたことを確認してください。