vi エディタ: VIsual editor の操作方法

vi は通常の編集作業に耐える十分な機能を持ち非常に軽量なソフトウェアであるため、標準的にインストールされている。 UNIX 系のデータベースサーバーに影響がもっとも少ない DBA 向けのスクリーンエディタといえるだろう。
vi エディタでの開発作業は効率が良いとは思えない。デバッグ環境のある IDE をクライアントマシンで使用する方が効率がよい。
無償の開発環境 (SQL Developer、JDeveloper) やサードベンダにも該当する製品は多い

一般的な起動方法
vi には互換性のある多機能のクローンソフトが多数あり、そのシンボリックリンクの場合もある。

# vi [filename [filename2...]]

モードの切り替え

起動時はコマンドモード

コマンドモードからエディットモード

操作分類内容
iカーソル位置の前からの挿入でエディットモードへ(insert)カーソル位置の直前に文字列を挿入
Iカレント行の行頭に文字列を挿入
aカーソル位置の後ろから追記でエディットモードへ(append)カーソル位置の直後に文字列を挿入
Aカレント行の行末に文字列を追加
Rカーソル位置から上書きでエディットモードへ(replace)カーソル位置からの文字列置換
o新規行を作成してエディットモードへカレント行の直後に新規行を追加
Oカレント行の直前に新規行を挿入

エディットモードからコマンドモード

操作分類内容
<ESC>カーソル位置の直前からエディットモードへ-

カーソル、ページの移動

文字単位の移動

操作分類内容
h1文字移動
(文字に意味無し、ホームポジション位置)
左に1文字
j下に1文字
k上に1文字
l右に1文字
繰り返し対象コマンド:
先頭に繰り返し実行したい回数を入力すれば同じ操作を繰り返す。
(例) 10j では 10 行分下へ移動する。

指定行への移動

操作分類内容
[Num]G行移動(go)指定行へ移動
Num 省略時は最終行

行頭、行末への移動

操作分類内容
$^ と $ は 正規表現 で先頭と最後の意味文末へ移動
^文頭へ移動(先行する空白とタブを考慮)
0行頭へ移動

ページ単位の移動

操作分類内容
<CTRL>+f1ページ移動
下に1ページ(forward)
<CTRL>+b上に1ページ(backward)
繰り返し対象コマンド

テキスト、改行の削除、

文字単位、行単位のテキスト削除

操作分類内容
ddカーソル位置の行削除(delete)カーソル行の1行を削除してバッファへコピー。
同じ文字が2つ続く場合は行単位の処理をあらわす。
xカーソル位置および前後の文字削除(eXclude?)カーソル位置の文字を削除してバッファへ
Xカーソル位置の前の文字を削除してバッファへ
J行の連結(join)カレント行の文末の改行コードを削除して次の行を現在行に繰り上げ
繰り返し対象コマンド

コピー

バッファへのコピー

操作分類内容
yyカーソル行からのコピー(yank)カレント行から行単位にバッファへコピー
繰り返し対象コマンド

ペースト

バッファからペースト

操作分類内容
pカーソル位置の前後のペースト(paste)カレント行の直後に新規行を追加(行単位のコピーの場合)
文字単位のコピーの場合にはカーソルの直後
Pカレント行の直前にコピーしたバッファ行を挿入(行単位のコピーの場合)
文字単位のコピーの場合にはカーソルの直前
繰り返し対象コマンド

取り消しと再実行

直前の作業の取り消しと繰り返し

操作分類内容
u(undo)直前に行ったコマンドや編集操作を取り消す
ドット(.)(redo)直前に行ったコマンドや編集操作を再度実行する

ファイル書き込みと終了

ファイルへの書き込みと破棄

操作分類内容
:w[q][!] [filename](write)指定したファイル(省略時は上書き)に書き込む。
q は書き込み後終了、 ! は強制上書きオプション
:q[!](quit)vi の終了
! は編集を破棄して終了するオプション

これだけおさえておけば十分に使える

コマンド操作の組み合わせ

組み合わせ操作の代表例

文字単位、行単位のテキスト削除

操作分類内容
dカーソル位置からの削除
[Num]dhh の併用カーソル位置の1つ前からの Num 文字を削除してバッファへ
Num 省略時は1
[Num]dll の併用カーソル位置から Num 文字を削除してバッファへ
dl は x コマンドと同じ
[Num]djj の併用カーソル行と直後の Num 行(計 Num+1)を削除してバッファへ
[Num]dkk の併用カーソル行と前 Num 行(計 Num+1)を削除してバッファへ
d$$ の併用カーソル位置から行末を削除してバッファへ
D と同じ
d^^ の併用カーソル位置の直前から行頭(先行インデント除く)を削除してバッファへ
d[Num]GG の併用カーソル位置の行から指定行(省略時:最終行)までを削除してバッファへ

文字単位、行単位のテキストコピー

操作分類内容
yカーソル位置からのコピー(ヤンク)
[Num]yhh の併用カーソル位置の1つ前から Num 文字をコピーしてバッファへ
Num 省略時は1
[Num]yll の併用カーソル位置から Num 文字をコピーしてバッファへ
[Num]yjj の併用カーソル行と直後の Num 行(計 Num+1)をコピーしてバッファへ
[Num]ykk の併用カーソル行と前 Num 行(計 Num+1)をコピーしてバッファへ
y$$ の併用カーソル位置から行末をコピーしてバッファへ
y^^ の併用カーソル位置の直前から行頭(先行インデント除く)をコピーしてバッファへ

vi には、これだけでなくコマンドモードのプロンプトから入力するコマンドなどがある。

:/hoge              hoge を検索 (n / <SHFIT> + n) next / prev で次と前
:s/hoge/hogehoge/   (sed?) カレント行の置換
:s/hoge/hogehoge/c  (confirm) 置換の確認
:s/hoge/hogehoge/g  (global) 全体/指定無しは1回
:%s/hoge/moge/g     % はすべての行全体が対象
:N,Ms/hoge/moge/g   N,M は行をあらわす数値または $


関連事項

vi の使い方の関連トピックス

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)