vi, vim Linuxの標準テキストエディタ

viはテキストエディタ(テキストを編集するプログラム)です。viエディタを使って、ファイルの作成、編集及び保存を行うことができます。Linuxでは、viがあらかじめインストールされていてます。Microsoft Windowsでは、viから派生したVimをインストールすることで使うことができます。

vimの起動方法

vimの起動方法を次に示します。

vim [options] [filename]
vi [options] [filename]

viを起動するときにファイル名を引数に指定することができます。既存ファイルのファイル名を指定したときは編集、存在しないファイル名を指定したときは新規作成になります。

ファイル名を省力した場合は、ファイル名を決めずにファイルの編集を行います。このときは、ファイルを保存する際にファイル名を指定します。

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

viには、コマンドモードと挿入モードという2種類の状態があります。viを起動した時点ではコマンドモードになっています。

コマンドモードのときにキーボードから何らかのキーを押すと、それはviのコマンドと解釈されます。たとえば、i のキーを押すと、現在のモードをコマンドモードから挿入モードに切り替えるコマンドと解釈されます。

挿入モードのときにキーボードから何らかのキーを押すと、その文字が画面に表示されます。つまり、テキストの入力と解釈されます。ただし、Esc キーを押した場合は、現在のモードを挿入モードからコマンドモードへ切り替えるコマンドと解釈されます。

現在のモードがコマンドモードと挿入モードのどちらであるかは、デフォルト(初期状態)では画面に表示されません。

viのコマンドはコマンドモードのコマンドとexモードのコマンドの2種類があります。

コマンドモードへの切替え

現在の状態が挿入モードの場合、Escキーを押すと、コマンドモードに切り替わる。

コマンドモードのコマンド一覧

viのコマンド一覧
コマンド 説明
% カーソルが括弧にあるとき、対応する括弧へ移動します。
+ カーソルを次の行の先頭へ移動します。
- カーソルを前の行の先頭へ移動します。
. テキストの変更を繰り返します。
: exモードに移ります。exモードに移ると、カーソルは最下行に移動します。exモードのコマンドはこの行に入力します。
? テキストの上へ向かって文字列を検索します。
_ カーソルを行の最初の空白やタブでない文字へ移動します。
~ カーソルがある文字の大文字/小文字を変換します。
0 カーソルを行の先頭へ移動します。
a カーソルの後ろにテキストを追加します。
A 行の末尾にテキストを追加します。
b カーソルを単語の先頭へ移動します。既にカーソルが単語の先頭にある場合は、前の単語の先頭へ移動します。
cc 1行を別のテキストに置き換えます。Sコマンドと同じです。
cw 単語を削除し、挿入モードになる。
d + 移動コマンド カーソルから移動先までを削除して、バッファに記憶します。
e カーソルを単語の末尾へ移動します。既にカーソルが単語の末尾にある場合は、次の単語の末尾へ移動します。
^g 現在編集しているファイルのファイル名、現在カーソルがある行番号、全体の行数、表示しているファイルの割合などを表示します。
i カーソルの位置にテキストを挿入します。
I 行の先頭にテキストを挿入します。
n 直前に行った検索を繰り返します。
N 直前に行った検索を反対方向に繰り返します。
o カーソルの下に新しい行を追加し、コマンドモードから挿入モードへ切り替わります。
O カーソルの上に新しい行を追加し、コマンドモードから挿入モードへ切り替わります。
r + 1文字 カーソルの文字を置き換えます。挿入モードにならずに文字を変更することができます。
R カーソルの位置にテキスト上書きします。コマンドモードから挿入モードへ切り替わります。
u 直前に行ったコマンドを取り消します。取り消せるのはテキストの変更に関するコマンドで、カーソルの移動などのコマンドは取り消せません。
s カーソルの1文字を削除し、コマンドモードからテキスト挿入モードへ切り替わります。
S 1行を別のテキストに置き換えます。ccコマンドと同じです。
U カーソルがある行に対する変更を全て取り消し、元の状態に戻します。
w カーソルを次の単語の先頭へ移動します。
x カーソル位置の1文字を削除します。また、削除した文字をバッファに記憶します。
X カーソルの1つ前の文字を削除します。また、削除した文字をバッファに記憶します。
y + 移動コマンド カーソルから移動先までをバッファに記憶します。
yy カーソルがある行をバッファに記憶させる。

コマンドモードから挿入モードへの切り替え

vi でコマンドモードから挿入モードへ切り替えるコマンドには次のものがある。

vi でコマンドモードから挿入モードへ切り替えるコマンド
コマンド 説明
A 行の末尾にテキストを追加します。
cc 1行を別のテキストに置き換えます。Sコマンドと同じです。
cw 単語を削除し、挿入モードになる。
I 行の先頭にテキストを挿入します。
R カーソルの位置にテキスト上書きします。コマンドモードから挿入モードへ切り替わります。
o カーソルの下に新しい行を追加し、コマンドモードから挿入モードへ切り替わります。
O カーソルの上に新しい行を追加し、コマンドモードから挿入モードへ切り替わります。
s カーソルの1文字を削除し、コマンドモードからテキスト挿入モードへ切り替わります。
S 1行を別のテキストに置き換えます。ccコマンドと同じです。

カーソルを左に移動する

カーソルを左に1文字移動する。

h

コマンドの前に数字を入力することで、移動する文字数を指定することができる。

10h

カーソルを下に移動する

カーソルを下に1行移動する

j

コマンドの前に数字を入力することで、移動する行数を指定することができる。

10j

カーソルを上に移動する

カーソルを上に1行移動する

k

コマンドの前に数字を入力することで、移動する行数を指定することができる。

10k

カーソルを右に移動する

カーソルを右に1文字移動する

l

コマンドの前に数字を入力することで、移動する文字数を指定することができる。

10l

カーソルを次の単語の先頭へ移動する

w

コマンドの前に数字を入力することで、移動する単語数を指定することができる。

10w

カーソルを行の末尾へ移動する

$

画面を次のページにスクロールする

^f

画面を前のページに逆スクロールする

^b

テキストの挿入

カーソルの位置にテキストを挿入する。

i

テキストの追加

カーソルの後ろにテキストを追加する。

a

行の削除

カーソルがある行を削除する。削除した行はバッファに記憶される。

dd

コマンドの前に数字を入力することで、削除する行数を指定することができる。

10dd

カーソルの下にバッファの内容を書き出す

コピーまたはカットによりバッファに記憶させた内容を、カーソルの下に書き出す。

p

カーソルの上にバッファの内容を書き出す

コピーまたはカットによりバッファに記憶させた内容を、カーソルの上に書き出す。

P

ファイルを保存してvimを終了する

ファイルを保存して、viまたはvimエディタを終了する。

ZZ

カーソルの移動

vi でカーソルを移動するコマンドには次のものがある。

vi でカーソルを移動するコマンド
コマンド 説明
$ カーソルを行の末尾へ移動します。
% カーソルが括弧にあるとき、対応する括弧へ移動します。
+ カーソルを次の行の先頭へ移動します。
- カーソルを前の行の先頭へ移動します。
_ カーソルを行の最初の空白やタブでない文字へ移動します。
0 カーソルを行の先頭へ移動します。
b カーソルを単語の先頭へ移動します。既にカーソルが単語の先頭にある場合は、前の単語の先頭へ移動します。
e カーソルを単語の末尾へ移動します。既にカーソルが単語の末尾にある場合は、次の単語の末尾へ移動します。
G 行数を入力してGを押すと、指定した行にカーソルを移動します。たとえば、120Gと入力すると、カーソルを120行目へ移動します。

数字に続けてコマンドを入力すると、その数だけコマンドを繰り返し実行します。例えば、4jと入力したら、カーソルを下に4行移動します。3wと入力したら、カーソルを3つ後の単語の先頭に移動します。

テキストの下方向へ向かって、指定した文字列を検索する。

/string

テキストの上方向へ向かって、指定した文字列を検索する。

?string

直前に行った検索を繰り返す。

n

直前に行った検索を反対方向に繰り返す。

N

/? を押すと、カーソルが画面の最下行に移動します。この行は編集しているテキストの中身とは別で、コマンドの続きを入力するための行です。ここで検索する文字列を入力してからEnterキーを押すと、指定した文字列を検索します。検索した文字列が見つかると、その位置にカーソルが移動します。

画面の最下行で検索する文字列を入力せずにEnterキーを押すと、前回検索した文字列を再度検索します。これは n コマンドと同じ動作です。

exモードのコマンド一覧

exモードのコマンド
コマンド 説明
e ファイル名 新しいファイルの編集に移ります。
r ファイル名 指定したファイルをカーソルの下に読み込みます。
r! コマンド名 UNIXコマンドを実行して、その結果をカーソルのある行の下に付け加えます。
q viエディタを終了します。
set viの環境を設定する。
w writeの省略形
write テキストの内容をファイルに保存する。

文字列の置換

カーソルがある行の 文字列1文字列2 に置き換える。

s/文字列1/文字列2/

ファイル中の全ての 文字列1文字列2 に置き換える。

%s/文字列1/文字列2/g

Linuxコマンドを実行する

指定したLinuxコマンドを実行する。

!ls -l

指定行番号へジャンプする

行数を入力してGを押すと、指定した行にカーソルを移動する。たとえば、120Gと入力すると、カーソルを120行目へ移動する。

120G

コロンに続いて行番号を入力してEnterキーを押すと、指定した行番号へカーソルを移動する。

:100

viを終了する

viまたはvimを終了する。

:q

ファイルを編集した場合、ファイルが保存されていない旨のメッセージが表示され、viまたはvimを終了できない。

編集済みのファイルを保存せずにviまたはvimを終了するには、q! コマンドを使う。

ファイルを保存せずにviを終了する

編集したファイルを保存せずにviまたはvimを終了する。

:q!

自動インデントする

viで改行したときに自動的にインデントを行うよう設定する例を示す。

:set autoindent

挿入モードで次の行に移動したとき、カーソルの位置を前の行の空白に揃えます。

setコマンドで設定した内容は、viの起動中のみ有効です。いったんviを終了して再度viを起動した際には、あらためて設定しなおさなければなりません。viを起動するたびに設定を有効にするには、環境設定ファイルにsetコマンドを記述します。

自動インデントしない

自動的にインデント(字下げ)を行わないようにします。(デフォルト)

:set noautoindent

検索で大文字と小文字を区別しない

文字列を検索する際、大文字と小文字を区別しません。例えば文字列 "vi" を検索すると、"vi" だけでなく "VI""Vi" も検索対象になります。

:set ignorecase

検索で大文字と小文字を区別する

文字列を検索する際、大文字と小文字を区別します。(デフォルト)

:set noignorecase

行番号を表示する

行番号を表示する。

:set number

行番号を表示しない

行番号を表示しない。(デフォルト)

:set nonumber

括弧の対応をチェックする

括弧の対応を自動的にチェックします。挿入モードで閉じた括弧を入力すると、それに対応する開いた括弧に瞬間的にカーソルがジャンプします。

:set showmatch

括弧の対応をチェックしない

括弧の対応をチェックしません。(デフォルト)

:set noshowmatch

現在のモードを表示する

挿入モードのときに、現在のモードが挿入モードである旨を画面下部に表示するようにします。

:set showmode

現在のモードを表示しない

挿入モードのときに、現在のモードが挿入モードである旨を画面下部に表示しないようにします。(デフォルト)

:set noshowmode

タブの設定

タブを何文字分にするか指定します。

:set tabstop=4
:set tabstop=8

ファイルを保存する

viまたはvimを起動するときにファイル名を指定した場合は、ファイル名を指定せずにファイルを保存できる。

:write

ファイルの保存は頻繁に行う操作なので、コマンドの省略形も用意されている。

:w

ファイル名を指定してファイルを保存する

viまたはvimを起動するときにファイル名の指定を省略した場合は、ファイルを保存するときにファイル名を指定する必要がある。

viまたはvimを起動するときにファイル名を指定した場合は、ファイル名の指定を省略することもできるし、別のファイル名を指定することもできる。

:write example.txt

ファイルの保存は頻繁に行う操作なので、コマンドの省略形も用意されている。

:w /home/tsuka/example.txt

ファイルを保存してviを終了する

:wq

ファイル名を指定してファイルを保存してviを終了する

:wq example.txt

viの環境設定ファイル

viのsetコマンドで行う環境設定を .exrc というファイル名で作成して、ホームディレクトリに配置しておくと、viを起動するたびにその設定が有効になります。次に.exrcの内容例を示します。

set number
set autoindent
set ignorecase

Linuxコマンド