viとは、なぜ今も学ぶ必要があるのか
viは、Unix系OSで古くから使われている標準的なテキストエディタです。GUIが使えないサーバー環境や、最小構成のシステムでも標準で用意されていることが多く、緊急時の設定ファイル編集などで頼りになるため、LPIC/LinuCの両方で基本操作が出題範囲となっています。多くのLinuxディストリビューションでは、viコマンドはviの後継であるvim(Vi IMproved)を指すシンボリックリンクや代替機構として提供されています。
viの3つのモード
viを理解する上で最も重要なのは、モードという概念です。viには主に3つのモードがあり、同じキーを押しても現在のモードによって意味が変わります。
| モード | 役割 | 主な移行方法 |
|---|---|---|
| コマンドモード(ノーマルモード) | カーソル移動、削除・コピー等の編集操作を行う。viを起動した直後はこのモード | Escキーでいつでもこのモードに戻れる |
| 挿入モード | 実際に文字を入力するモード | コマンドモードでi・o・a等を押すと移行する |
| コマンドラインモード | :で始まるExコマンドを入力・実行するモード(保存・終了・置換等) | コマンドモードで:を押すと移行する |
「今どのモードにいるか」を常に意識することが、viを使う上で最初につまずきやすいポイントです。
コマンドモードでの移動
コマンドモードでは、矢印キーの代わりに次のキーでカーソルを移動できます(矢印キーが使えない環境でも操作できるようにするための伝統的な操作方法です)。
| キー | 移動方向 |
|---|---|
h | 左 |
j | 下 |
k | 上 |
l | 右 |
挿入モードに入る:i、o、a
コマンドモードから挿入モードに入る方法は複数あり、カーソルに対する挿入位置がそれぞれ異なります。
| コマンド | 効果 |
|---|---|
i | カーソルの位置の直前から挿入を開始する |
a | カーソルの位置の直後から挿入を開始する(append) |
o | カーソルのある行の下に新しい行を作成して挿入を開始する |
挿入モードでの入力を終えたら、Escキーでコマンドモードに戻ります。
テキストの編集・削除・コピー・貼り付け
コマンドモードでは、次のようなコマンドでテキストを操作できます。
| コマンド | 効果 |
|---|---|
dd | カーソルのある行を1行削除する(同時にコピーもされる) |
yy | カーソルのある行を1行コピーする(yank) |
p | 直前に削除・コピーした内容を、カーソルの下(または後ろ)に貼り付ける |
d(例:dw) | 削除操作の基本コマンド。dの後ろに移動コマンドを組み合わせて範囲を指定する(dw=通常、カーソル位置から次の単語の先頭まで削除する) |
y(例:yw) | コピー操作の基本コマンド。dと同様に移動コマンドと組み合わせる |
数字を前置すると、繰り返し回数を指定できます(例:3ddでカーソル行から3行削除)。
テキストを検索する:/、?
| コマンド | 効果 |
|---|---|
/検索文字列 | カーソル位置から下方向へ検索する |
?検索文字列 | カーソル位置から上方向へ検索する |
n | 直前の検索と同じ方向へ、次の一致箇所に移動する |
/ERROR
?ERROR
nファイルを保存・終了する
| コマンド | 効果 |
|---|---|
ZZ(コマンドモードで直接) | 変更がある場合に保存して終了する(:xと同等) |
:w! | 読み取り専用として開かれているファイルなどへの書込みを強制的に試みる。ただし、OSのアクセス権や読み取り専用ファイルシステムは無視できない |
:q! | 変更を保存せずに強制的に終了する |
:wq(参考) | 保存して終了する |
:q(参考) | 変更が無い場合に終了する(変更がある場合は警告が出て終了できない) |
:q!は「変更を破棄する」ことを意味するため、誤って未保存の編集内容を失わないよう注意が必要です。
代替エディタと標準エディタの設定
viの他にも、Emacs(多機能・拡張性の高いエディタ)、nano(初心者にも分かりやすい、モードの無いシンプルなエディタ)、vim(viの高機能な後継)など、さまざまなテキストエディタが存在することも出題範囲に含まれます。
多くのUnix系コマンド(crontab -e、visudo等)は、テキストを編集する際に環境変数EDITOR(場合によってはVISUAL)に指定されたエディタを呼び出します。この環境変数を設定することで、コマンドから呼び出されるエディタを、viから別の好みのエディタに変更できます。VISUALが設定されている場合はそちらが優先されることがあり、設定は現在のシェルとその子プロセスに有効です。
export EDITOR=nano # 現在のシェルでは、VISUAL等が優先されない場合にcrontab -e等がnanoを呼び出すようになる