UNIX研究会

vi - 基本操作

前置き

viとは、UNIXのスクリーンエディタです。 最初は非常にとっつきにくいですが、慣れれば非常に効率的なテキスト編集が可能になります。 viはあらゆるUNIXマシンに入っているため、これの使いかたさえ覚えておけば、UNIXでのテキスト編集ができます。

起動

shell上で、viと入力し、実行します。 他のファイルを編集したい時は、vi filenameとします。filenameが存在しない場合は、新規に作成します。

コマンドモードと入力モード

viには、2つのモードがあります。 それぞれコマンドモード入力モードで、コマンドモードではカーソルの移動、コマンド入力を行い、入力モードでは文字列の入力を行えます。

それぞれのモードの切替え方は、コマンドモードにするときはESCキーで、入力モードにするときは後に説明する入力コマンドで行います。

コマンド入力について

コマンドは基本的にコマンドモードで入力します。 それと基本的に、大文字小文字を区別するので、Capslockが入ったままだったりすると意図しない結果になることがあります。 そういうときはアンドゥコマンドを利用しましょう。

カーソル移動コマンド

コマンド 意味
h 一文字左へ移動
j 一文字下へ移動
k 一文字上へ移動
l 一文字右へ移動
H 画面の最上行へ移動
M 画面の中央行へ移動
L 画面の最下行へ移動
G ファイルの最終行へ移動
nG ファイルのn行目へ移動
Ctrl+F 1 page 下へ移動
Ctrl+B 1 page 上へ移動
Ctrl+D 0.5 page 下へ移動
Ctrl+U 0.5 page 上へ移動

入力コマンド

このコマンドを入力すると、viのモードが入力モードになります。

コマンド 意味
a カーソルの右から入力を開始
A カーソルのある行の行末から入力を開始
i カーソルの左から入力を開始
I カーソルのある行の行頭から入力を開始
o カーソルのある行の下に一行挿入し、その行から入力を開始
O カーソルのある行の上に一行挿入し、その行から入力を開始

削除コマンド

削除した文字列、行などは、バッファ(Windowsでいうクリップボードのようなもの)に移動します。

コマンド 意味
x カーソル上の文字を削除
X カーソルの左の文字を削除
dd 現在の行を削除
ndd n行分を削除
dw カーソル上の文字列を一単語分削除
df char カーソル位置から、指定したcharまで削除
:line1,line2 d line1行からline2行までを削除

検索コマンド

検索でヒットした文字列は、色が反転して表示されます。

コマンド 意味
/string 文字列stringを検索する
n 下方向へ検索
N 上方向へ検索

置換コマンド

コマンド 意味
r カーソル上の文字を、次に入力した文字に置換
R カーソル上の文字から、ESCが押されるまでの文字列を置換
s カーソルの上の文字を、他の文字列で置換
S カーソルのある行を、他の文字列で置換
cw カーソル位置にある単語を置換
cf char カーソル位置から指定した字charまで置換
C カーソル位置から行末まで置換
:%s/before/after カーソル位置から一番近い文字列beforeを文字列afterに置換
:%s/before/after/g ファイル中のすべての文字列beforeを文字列afterに置換

切り取り、貼り付けコマンド

コマンド 意味
yy カーソルのある行をバッファにコピー
nyy カーソル位置からn行分バッファにコピー
yw カーソル位置にある単語をバッファにコピー
p バッファ内のテキストを挿入(文字列はカーソルの右に、行はカーソルのある行の下)
P バッファ内のテキストを挿入(文字列はカーソルの左に、行はカーソルのある行の上)

アンドゥ、リドゥコマンド

本当に直前の操作しかやり直せないのではなく、何度でも可能です。

コマンド 意味
u 直前の操作を取り消す
U 行全体の操作を取り消す
. 直前の操作を繰り返す

ファイル操作コマンド

ファイル名は、最初に編集したファイルを起点とした相対パス、または絶対パスで記述します。

コマンド 意味
:w [filename] filenameとして保存(filenameが指定されていなければ現在開いているファイルに保存)
:w! [filename] filenameとして強制的に保存(filenameが指定されていなければ現在開いているファイルに保存、readonly属性を無視)
:r [filename] カーソルのある行の次の行にファイルfilenameを読み込み、挿入する(filenameが指定されていなければ現在開いているファイルを挿入)
:e filename ファイルfilenameを編集対象とする

終了コマンド

ファイル名は、最初に編集したファイルを起点とした相対パス、または絶対パスで記述します。

コマンド 意味
ZZ
:wq
viを終了する(ファイル内容が変更されている場合は上書き保存)
:wq! ZZとほぼ同じだが、readonly属性を無視して上書き保存
:q viを終了する(ファイル内容が変更されている場合は警告を出す)
:q! viを強制終了する(ファイル内容が変更されていたとしても保存されない)

UNIXコマンドの実行

コマンドを実行したあとは、ENTERキーを押すとviの画面に戻ります。

コマンド 意味
:!command commandコマンドを実行する
:!! 直前のコマンドを再実行する
:sh 一時的にshellに戻る(shell上でexitと入力するとviの画面に戻る)
:.!command
!!command
commandコマンドの出力結果をカーソル位置に挿入する

その他のコマンド

set系のコマンドには、set allで出たオプション名を使います。 指定したオプションを有効にしたい場合は、set option、無効にしたい場合はset nooptionというように、オプション名にnoを追加します。値を設定したいときは、set option=value のようにします。

コマンド 意味
:set number
:set nu
行番号を表示する
:set all すべてのオプションを表示する
J 現在の行の末尾と次の行を結合する
nJ n行結合する

設定の保存

setコマンドを毎回行うのは面倒(常に行番号を表示したいなど)な時は、viの設定ファイル(.vimrc等)を探して開き、set nuなり設定を書き込んで保存すると、次回のvi起動時からそれが反映されます。