はじめてのvi/Vim入門
はじめてのvi/Vim入門――基本操作と便利なTIPS集
この記事では、viとVimの違い、モードの考え方、基本コマンドを順に紹介します。後半では、編集に慣れてきたときに役立つ便利な使い方も取り上げます。
1. viエディター・Vimエディターとは?
なぜUNIXでviを使うのか?
viは、多くのUNIX系OSやLinuxディストリビューションで標準的に利用できるテキストエディターです。インストール済みの環境なら、追加の準備をせずに使えます。
SSHで接続したサーバーなど、ターミナルを中心に作業する場面でも、設定ファイルやプログラムを編集できます。環境が変わっても共通の操作を使えることが、viを覚える利点です。
viとVimの違い
vi(ブイアイ)は、Unix系の環境で長く使われてきたテキストエディターです。キーボードでカーソル移動や編集を行い、ターミナル上で利用できます。
Vim(ヴィム)は「Vi IMproved」に由来する名前で、viの操作体系を受け継いで機能を拡張したエディターです。構文の色分け、複数段階の取り消し、範囲を選択するビジュアルモードなどを備えています。
環境によっては、vi コマンドで起動する実体がVimになっていることもあります。
この記事では、基本操作をvi/Vim共通のものを中心に説明し、Vimの拡張機能には 【Vim】 と記載します。
vi/Vimを起動する
ターミナルで、次のように実行します。
vi
Vimを使う場合は、次のコマンドです。
vim
引数を付けずに起動すると、編集対象のファイル名が決まっていない状態で開きます。文字を入力して保存する際には、Esc を押してから次のようにファイル名を指定し、最後に Enter を押します。
:w practice.txt
最初から編集するファイル名を指定して起動することもできます。
vi practice.txt
vim practice.txt
指定したファイルの有無によって、動作が変わります。
| ファイルの状態 | 起動時の動作 |
|---|---|
| 存在する | ファイルの内容を読み込んで編集する |
| 存在しない | 指定した名前で新しいファイルを作るための編集画面が開く |
存在しないファイルを指定しても、起動しただけではファイルは作成されません。 保存した時点で作成されます。
2. 「モード」という仕組み
vi/Vimでは、同じキーでも現在のモードによって働きが変わります。
| モード | 主な用途 | 入り方 |
|---|---|---|
| ノーマルモード | カーソル移動、削除、コピーなど | 起動直後の状態。挿入モードからは Esc |
| 挿入モード | 文字の入力 | ノーマルモードで i など |
| コマンドラインモード | 保存、終了、検索、置換など | ノーマルモードで : や / など |
「ノーマルモード」を「コマンドモード」、「挿入モード」を「入力モード」と呼ぶ解説もあります。この記事では、コマンドラインモードと区別するため、「ノーマルモード」で統一します。
この記事のキー・操作の表記について
iのような表記は、そのキーを押すことを表します。働きはモードによって異なり、ノーマルモードのiは「文字入力を始める操作」、挿入モードのiは「文字のiを入力する操作」です。大文字と小文字も区別します。ddは、dを続けて2回押すという意味です。
基本の流れは次のとおりです。
ノーマルモード
│
├─ i → 挿入モード ─ Esc → ノーマルモード
│
└─ : → コマンドラインモード ─ コマンド入力・Enter → 実行
操作がわからなくなったら、まず Esc を押しましょう。通常、挿入モードからは1回でノーマルモードに戻ります。
Escで入力途中の操作を取り消す場合
ノーマルモードでdだけを押すと、削除する範囲の指定を待つ状態になります。この場合、Escを押すと操作を取り消せます。:wなどを入力して実行する前に取り消したい場合にも使えます。日本語入力を使う場合
操作コマンドを入力する前にIMEをオフにしましょう。全角の「i」や「:」では、意図した操作になりません。
3. よく使う基本コマンド
以下の操作は、ノーマルモードから始めます。
i や dd は、キーを押すだけで動作します。:w や /error は、先頭の : や / を含めて表記どおりに入力し、最後に Enter を押します。 先頭の記号を追加でもう1回入力する必要はありません。
カーソルを移動する
| キー | 動作 |
|---|---|
h (←) |
左へ移動 |
j (↓) |
下へ移動 |
k (↑) |
上へ移動 |
l (→) |
右へ移動 |
w |
次の単語の先頭へ移動 |
b |
単語の先頭へ後ろ向きに移動 |
0 |
行の先頭へ移動 |
^ |
行の最初の空白以外の文字へ移動 |
$ |
行の末尾へ移動 |
1G |
ファイルの先頭行へ移動 |
G |
ファイルの最終行へ移動 |
20G |
20行目へ移動 |
0 と ^ の違いは、字下げのある行で試すとわかりやすくなります。0 は行頭の空白へ、^ は文字が始まる位置へ移動します。
【Vim】 gg でもファイルの先頭行へ移動できます。
文字の入力を始める
次のコマンドを押すと、それぞれの位置から挿入モードに入ります。
| キー | 入力を始める位置 |
|---|---|
i |
カーソルの手前 |
a |
カーソルの直後 |
I |
行の最初の空白以外の文字の手前 |
A |
行の末尾 |
o |
現在行の下に新しい行を作る |
O |
現在行の上に新しい行を作る |
たとえば、行末に追記したいときは A が便利です。行末まで移動してから入力を始める操作を、1キーで実行できます。
保存と終了
| コマンド | 動作 |
|---|---|
:w |
保存する |
:w practice.txt |
現在の内容を指定したファイルに書き出す |
:q |
終了する。未保存の変更があると通常は終了できない |
:wq |
保存して終了する |
:q! |
未保存の変更を破棄して終了する |
:q! は、最後の保存以降の変更を破棄する操作です。途中で一度保存している場合、その保存済みの内容まで元に戻るわけではありません。
削除・コピー・貼り付け――delete・yank・put
vi/Vimでは、コピーを yank、削除を delete、取り込んだ内容の貼り付けを put と呼びます。
| 用語 | 意味 | 対応するキー |
|---|---|---|
| yank | 内容をコピーして内部の保存領域に取り込む | y |
| delete | 内容を削除し、通常は内部の保存領域にも取り込む | d |
| put | 取り込んだ内容を貼り付ける | p、P |
y や d は、操作する範囲と組み合わせて使います。同じキーを2回押す yy と dd は、行全体を対象にする操作です。
| キー | 動作 |
|---|---|
x |
カーソル位置の1文字を削除 |
dd |
現在行を削除 |
3dd |
現在行から3行を削除 |
D |
カーソル位置から行末まで削除 |
yy |
現在行をコピー |
3yy |
現在行から3行をコピー |
p |
カーソルの後ろ側へ貼り付け |
P |
カーソルの前側へ貼り付け |
行をコピーする場合は、次のように操作します。
- コピーしたい行で
yyを押す。 - 貼り付けたい場所へ移動する。
pを押すと現在行の下、Pを押すと上に貼り付けられる。
行を移動したい場合は、最初の yy を dd に変えます。削除した行を移動先で貼り付けることで、カット&ペーストになります。
貼り付け位置について
行単位で取り込んだ内容は、現在行の下または上に貼り付けられます。文字単位の場合は、カーソルの直後または手前です。
間違えた操作を取り消す
u を押すと、直前の変更を取り消せます。
【Vim】 u を繰り返すと変更をさかのぼれます。Ctrl+r では、取り消した変更をやり直せます。
文字列を検索する
※ error という文字列を検索する場合
/ に続けて検索したい文字列を入力します。
/error
Enter を押すと、カーソル位置からファイル末尾の方向へ検索します。
逆方向に検索する場合は、? を使います。
?error
検索結果の間を移動する
検索を実行した後は、次のキーで一致した場所へ移動できます。これらはノーマルモードで操作します。
| キー | 動作 |
|---|---|
n |
同じ検索方向で次の一致へ移動 |
N |
検索方向を逆にして次の一致へ移動 |
? で検索した場合、n もファイル先頭の方向へ検索を繰り返します。
文字列を置換する
ファイル全体の apple を orange に置き換える場合は、次のコマンドを使います。
:%s/apple/orange/g
構成を分けると、次の意味になります。
| 部分 | 意味 |
|---|---|
% |
ファイル全体を対象にする |
s |
置換する |
apple |
検索するパターン |
orange |
置換後の文字列 |
g |
各行で一致するすべての箇所を置換する |
末尾に c を加えると、1件ずつ確認しながら置換できます。
:%s/apple/orange/gc
また、% を省略すると現在行だけが対象になります。
:s/apple/orange/g
検索パターンについて
検索や置換では正規表現を使えます。.などの記号は特別な意味を持つため、最初は単純な英単語で試すと動作を把握しやすくなります。
4. 便利なTIPS
TIPS 1:ZZ・ZQ で終了する――:wq との違い
vi/Vimの終了方法には、:wq や :q! のほかに、ZZ や ZQ もあります。
ZZ は、大文字の Z を2回押すコマンドです。変更があれば保存して終了し、変更がなければ書き込まずに終了します。
【Vim】 ZQ は、大文字の Z、Q の順に押すコマンドです。未保存の変更を破棄して終了します。従来のviでは使えない場合があります。
次の表は、1つのファイルを1つのウィンドウで編集している場合の比較です。
| 操作 | 保存の動作 | Enter |
|---|---|---|
:wq |
変更の有無にかかわらず書き込み、成功すれば終了 | 必要 |
ZZ |
変更がある場合だけ書き込み、成功すれば終了 | 不要 |
:q! |
未保存の変更を破棄して終了 | 必要 |
ZQ【Vim】 |
未保存の変更を破棄して終了 | 不要 |
いずれもノーマルモードから入力を始めます。
:wq と ZZ の違いが現れるのは、ファイルを変更していない場合です。:wq は書き込みを行うため、通常はファイルの更新時刻も更新されます。ZZ は書き込みを行いません。NorthPage:viのZZのこと
閲覧だけで終わったときは :q、変更内容を保存して終わるときは ZZ または :wq、変更を破棄するときは :q! またはVimの ZQ と使い分けられます。
TIPS 2:数字を付けて、同じ操作をまとめる
多くの操作は、前に数字を付けると回数を指定できます。
| 操作 | 動作 |
|---|---|
5j |
5行下へ移動 |
3w |
単語の先頭へ進む操作を3回実行 |
2dd |
現在行から2行を削除 |
4yy |
現在行から4行をコピー |
キーを何度も押す代わりに、「何回分か」を指定できる仕組みです。
TIPS 3:. で直前の変更を繰り返す
. は、直前の変更を繰り返すコマンドです。
たとえば、複数の行の末尾にセミコロンを追加したい場合は、次のように操作します。
Aを押す。;を入力する。Escを押す。- 別の行へ移動する。
.を押す。
移動先の行でも、行末にセミコロンが追加されます。
繰り返されるのは直前の「変更」で、移動操作そのものではありません。同じ修正を何か所かに適用したいときに役立ちます。
TIPS 4:% で対応する括弧へ移動する
ノーマルモードで括弧の上にカーソルを置いて % を押すと、対応するもう一方の括弧へ移動できます。
対象となる基本的な括弧は、次の3種類です。
| 括弧 | 移動先 |
|---|---|
( と ) |
対応する丸括弧 |
[ と ] |
対応する角括弧 |
{ と } |
対応する波括弧 |
たとえば、次のコードの { にカーソルを置いて % を押すと、対応する } に移動します。
if (ready) {
run();
}
移動先でもう一度 % を押すと、元の { に戻れます。括弧が何重にも入れ子になっているコードで、処理の範囲を確認するときに便利です。
【Vim】TIPS 5:「操作」と「対象」を組み合わせる
コマンドを組み合わせで覚えると、編集の幅が広がります。
たとえば、d は削除、c は変更、y はコピーです。これらに対象を組み合わせます。
| 操作 | 動作 |
|---|---|
diw |
カーソル位置の単語を削除 |
ciw |
カーソル位置の単語を削除し、挿入モードへ |
yiw |
カーソル位置の単語をコピー |
ci" |
ダブルクォートの内側を変更 |
次の行で、hello の文字上にカーソルを置いてみましょう。
message = "hello"
ci" → good morning → Esc と操作すると、引用符を残したまま中身を変更できます。
message = "good morning"
iw は「単語の内側」、i" は「ダブルクォートの内側」という対象指定です。こうした指定を「テキストオブジェクト」と呼びます。
【Vim】TIPS 6:範囲を選んでから操作する
範囲を目で確認して編集したいときは、ビジュアルモードを使ってみましょう。
| キー | 動作 |
|---|---|
v |
文字単位で選択を始める |
V |
行単位で選択を始める |
選択を始めてから移動キーを押すと、選択範囲が広がります。その状態で y を押せばコピー、d を押せば削除できます。
たとえば V → j → y で、現在行とその下の行をコピーできます。
【Vim】TIPS 7:マクロで一連の操作を繰り返す
複数の操作をまとめて繰り返したい場合は、マクロが便利です。キー操作を記録し、後から再生できます。
例として、次の3行を箇条書きにしてみましょう。
apple
orange
banana
目標は、各行の先頭に - を追加することです。
- apple
- orange
- banana
操作を記録する
まず、1行目にカーソルを置き、ノーマルモードで次の操作を行います。
qa:レジスターaに記録を開始する。0:行頭へ移動する。i:挿入モードに入る。-:ハイフンと半角スペースを入力する。Esc:ノーマルモードに戻る。j:次の行へ移動する。q:記録を終了する。
記録中も実際に編集が行われるため、この時点で1行目の加工が終わり、カーソルは2行目にあります。
レジスターとは?
文字列やマクロを保存する領域です。ここでは保存先としてaを使っていますが、bなど別の英字も指定できます。qaは「qで記録を開始し、保存先にaを指定する」という操作です。
記録した操作を再生する
ノーマルモードで次のように入力します。
@a
レジスター a に記録した操作が実行され、2行目にも - が追加されます。
もう一度 @a を実行すれば、3行目も加工できます。また、記録直後の2行目にいる状態で、次のように回数を指定することもできます。
2@a
一度実行したマクロは、@@ で再実行できます。
| 操作 | 動作 |
|---|---|
qa |
レジスター a に記録を開始 |
q |
記録を終了 |
@a |
レジスター a のマクロを実行 |
2@a |
マクロを2回実行 |
@@ |
直前に実行したマクロを再実行 |
マクロを作るときのコツ
マクロでは、毎回同じ条件から操作を始められるようにすることが大切です。
今回の例では、最初に 0 で行頭へ移動しています。そのため、記録開始時と再生時でカーソルの列が違っていても、行頭に文字を追加できます。
さらに、最後に j で次の行へ移動する操作を記録したことで、続けて再生すると次の行を加工できます。
まずは1回再生して結果を確認し、意図した動作になってから回数を指定すると使いやすくなります。
【Vim】TIPS 8:矩形選択で複数行をまとめて編集する
矩形選択は、文字を長方形の範囲で選択する機能です。行の一部分だけを複数行にわたってコピーしたり、削除したりできます。
ノーマルモードで Ctrl+v を押すと、矩形選択を始められます。その後、h・j・k・l などで選択範囲を広げます。
| 操作 | 動作 |
|---|---|
Ctrl+v |
矩形選択を始める |
選択後に y |
選択した範囲をコピー |
選択後に d |
選択した範囲を削除 |
選択後に I |
選択範囲の左端に文字をまとめて挿入 |
たとえば、次の3行の先頭に # を付けてみましょう。
apple
orange
banana
- 1行目の先頭にカーソルを置く。
Ctrl+vを押して矩形選択を始める。2jを押して、3行目までの先頭の1列を選択する。- 大文字の
Iを押す。 #を入力する。Escを押す。
入力中は先頭の行だけが変わって見えますが、Esc を押すと、選択したほかの行にも反映されます。
# apple
# orange
# banana
Ctrl+vが貼り付けになる場合
環境のキー設定によっては、Ctrl+vが貼り付けに割り当てられています。その場合、VimではCtrl+qでも矩形選択を始められます。ただし、ターミナル側でキーが処理される環境もあります。
5. 最後に
上記で紹介したコマンド/機能はあくまで一部で、vi/Vimには他にもたくさんの便利な機能があります。
知れば知るほど業務の効率化にも役立つこと間違いなしなので、興味があれば以下のマニュアルなどからさらに知識を深めていってください。
