Unixコマンド/vi

vi

dokuwiki.fl8.jp転載済み

機能

viには入力モードとコマンドモードの二つがあり、それぞれのモードを行き来してテキストを編集します。
viを使い始めの当初は、このモード概念が理解しにくく、viはとっつきにくいと言われています。

コマンドモード

viの各種編集コマンドを実行するモードです。
カーソルの移動や画面のスクロール、カット&ペーストなどお編集コマンドの実行、編集内容の保存、
入力モードに移行するコマンドなどは、コマンドモードから実行します。
viを起動した直後は、このコマンドモードになっています。

入力モード

文字の入力を行うモードです。
コマンドモードではキー入力はテキストとして入力されず、編集コマンドとして解釈されますが、
入力モードではキー入力した内容はそのままテキストとして画面上に入力されます。

入力モードとコマンドモードの切り替え

コマンドモードから入力モードへは、入力モードに移るいくつかのコマンド(i,aなど)を入力して、移行します。
入力モードからコマンドモードに移行するには、「ESC」キーを押します。
すでにコマンドモードになっているときに「ESC」キーを押すと、ビープ音が鳴って
コマンドモードのままモードは替わりません。
どちらのモードになっているかわからず混乱してしまった場合、とにかく「ESC」キーを押せばコマンドモードに戻れます

起動

vi [オプション] [ファイル名]

オプション

+ コマンド        ファイルを開くと共に、指定したviコマンドを実行する。
-c コマンド       +コマンドと同じ
-R                ファイルを読み込み専用モードで開く
-r                編集途中で保存されずに破棄された内容を復旧する

コマンドモードから入力モードに移る

a            入力移行し、タイプした内容をカーソル位置の直後に入力
i            入力移行し、タイプした内容をカーソル位置の直前に入力
A            入力移行し、タイプした内容をカーソル行の行末に入力
I            入力移行し、タイプした内容をカーソル行の行頭に入力
o            入力移行し、タイプした内容をカーソル行の次の行に入力
O            入力移行し、タイプした内容をカーソル行の前の行に入力

入力モードからコマンドモードに移る

ESC          入力モードを終了し、コマンドモードに戻る

コマンドモードでの操作

viエディタの終了

:q           ファイルへの書き込みを行わずにviを終了
:q!          編集中の内容を破棄してviを終了
:wq          編集中の内容をファイルに書き込んでviを終了
ZZ           編集中の内容をファイルに書き込んでviを終了

viエディタでのファイル操作

:w           編集中の内容をファイルに書き込む
:e!          編集中の内容を破棄し、直前に保存した内容に戻す。
:n           複数のファイルを開いている場合、現在編集中のファイルを閉じ、次のファイルを編集する。
:n ファイル名 現在編集中のファイルを閉じ、ファイル名で指定さえれたファイルの内容を編集する。
:r ファイル名 ファイル名で指定されたファイルの内容を、カーソルの行の次の行以降に読み込む
:r! コマンド  指定されたコマンドを実行し、その実行結果をカーソルの次の行以降に読み込む。

viでのカーソル移動

▼文字単位の移動
l            1文字右に移動する
h            1文字左に移動する
k            1文字上に移動する
j            1文字下に移動する
▼単語単位の移動
w            次の単語の先頭に移動する
b            前の単語の先頭に移動する
e            現在カーソルがある単語の終わりに移動する
W            空白で区切られた次の単語の先頭に移動する
B            空白で区切られた前の単語の先頭に移動する
▼その他カーソル移動
O            行頭に移動する
$            行末に移動する
H            画面に表示されているページの1行目に移動する
L            画面に表示されているページの最下行に移動する
M            画面に表示されているページの中央の行に移動する
[Ctrl]+y     1行前にスクロールする
[Ctrl]+e     1行後にスクロールする
[Ctrl]+u     半ページ前にスクロールする
[Ctrl]+d     半ページ後にスクロールする
[Ctrl]+b     1ページ前にスクロールする
[Ctrl]+f     1ページ後にスクロールする
1G           ファイルの行目に移動する
G            ファイルの最後の行に移動する

viでの文字編集

▼文字・行削除
x            カーソル位置の1文字を削除する
X            カーソル位置の前の1文字を削除する
dw           カーソル位置から次の単語までを削除する
d$           カーソル位置からその行の最後までを削除する
d0           カーソル位置からその行の先頭までを削除する
dd           カーソルのある行を削除する
▼コピー
yy           カーソルのある行をコピーする
yw           カーソル位置から次の単語までをコピーする
y$           カーソル位置からその行の最後までをコピーする
y0           カーソル位置からその行の先頭までをコピーする
▼ペースト
p            カーソル位置の後ろにコピーバッファの内容をペーストする
P            カーソル位置の前にコピーバッファの内容をペーストする

undoと繰り返し

u            直前の操作を取り消すことができる
.            直前の操作を繰り返し

コマンドの履歴

コロン(:)を押して上を押すと、前回までのコマンド履歴が出る。
同じコマンドを実行したい、前回のコマンドをちょっと変更して実行したいなどの時に便利です。

viでの文字編集

viでは多くのコマンドで数の指定ができ、コマンドを実行するのにタイプ量を大幅に減らすことができます。

▼例
10L          10文字分カーソルを右に移動
3d           3単語前に移動
9dd          9行削除する
8yy          8行コピーする
5H           画面上から5行目に移動
2G           ファイルの先頭から2行目に移動

検索と置換

検索(同一行)操作結果
f 文字文字 を検索(右方向へ)
F 文字文字 を検索(左方向へ)
;次の検索
検索(ファイル全体)/キーワードキーワードを検索(下方向へ)
?キーワードキーワードを検索(上方向へ)
n次の検索
N前の検索
置換:s/文字列A/文字列B/文字列Aを文字列Bに置換
(カーソルのある行で、最初に合致するパターンのみ置換)
:s/文字列A/文字列B/g文字列Aを文字列Bに置換
(カーソルのある行で、合致するパターン全てを置換)
:s/文字列A/文字列B/c文字列Aを文字列Bに置換
(カーソルのある行で、最初に合致するパターンのみ置換
(置換前に確認:yで置換、nで置換なし)
:%s/文字列A/文字列B/g文字列Aを文字列Bに置換
(全ての行で、合致するパターン全てを置換)
:10,50s/文字列A/文字列B/g文字列Aを文字列Bに置換
(10行目から50行目までの間で、合致するパターン全てを置換)
:10,$s/文字列A/文字列B/g文字列Aを文字列Bに置換
(10行目から最終行までの間で、合致するパターン全てを置換)

viを操作中に一時的にシェル操作をしたい

:sh[ENTER]で一時的にシェルに戻れます。再度viに戻るときはexitコマンドを使います。

直前操作の繰返しをしたい

.(ピリオド)を押す。同じ文字列を何回も挿入するような場合に便利です。