順番に読み進めながら学べます

テキストエディタ vi の基本

viの起動、ノーマルモードと挿入モードの切り替え、Escでのモード復帰、:wqでの保存と :q! での破棄を、ブラウザ端末で実際に操作しながら学べます。

vi の起動とモード

viは Linux サーバーにほぼ必ず入っているテキストエディタです。

本講座では、どのサーバーでも使えるviの最小限の操作を学びます。

viには 2 つのモードがあります。

起動直後はノーマルモードで、ここではキーが移動や命令として働き、文字は入力できません。

iを押すと挿入モードに切り替わり、文字を打ち込めます。

Escを押すとノーマルモードへ戻ります。

vi の 2 つのモード
ノーマルモード移動・命令(:wq など)挿入モード文字を入力できるi で切替Esc で戻る
起動直後はノーマルモード。iで挿入モード、Escでノーマルモードへ戻ります。
vi memo.txt   # memo.txt を開く(ノーマルモードで起動)
# i を押す      → 挿入モード(文字入力できる)
# 文字を入力
# Esc を押す    → ノーマルモードへ戻る

迷ったら Esc → :q! で抜けられます

操作を間違えて画面が動かなくなったら、Escを数回押してから:q!で抜け、最初からやり直してください。

これでいつでも安全に元の状態へ戻れます。

vi note.txtnote.txtを開いてください(ノーマルモードで起動します)。

iを押して挿入モードに切り替え、hello viと入力してください。

Escを押してノーマルモードへ戻り、続けて:wqと入力して Enter を押し、保存して終了してください。

④ ターミナルに戻ったらcat note.txtを実行し、入力した内容が保存されていることを確認してください。(正しく実行できれば解説が表示されます)

Linux console
0 / 2 実行済み
Loading Linux Terminal...

保存と破棄 — :wq と :q!

ノーマルモードで:を打つとコマンドラインが開き、終了に関する命令を入力できます。

:wqは書き込み(write)して終了(quit)、つまり保存して閉じます。

:wは保存するだけで終了せず、:qは変更が無いときに終了します。

:q!は変更を破棄して強制終了し、編集前の状態に戻します。

キー / コマンドモード動作
vi fileファイルを開く(ノーマルで起動)
iノーマル挿入モードに入る
Esc挿入ノーマルへ戻る
:wノーマル保存(終了しない)
:qノーマル終了(変更が無いとき)
:wqノーマル保存して終了
:q!ノーマル変更を破棄して終了
:wq は保存、:q! は破棄
:wq保存して終了(内容が残る):q!破棄して終了(編集前に戻る)
:wqは変更を保存して終了、:q!は変更を捨てて終了します。

:q! は変更が残らない

:q!その編集セッションでの変更をすべて捨てて終了します。

書き間違えてやり直したいときには便利ですが、保存したい内容があるときは:wqを使ってください。

vi draft.txt   # 開く
# i で挿入 → 文字入力 → Esc
# :q! と入力  → 変更を破棄して終了(draft.txt は空のまま)
cat draft.txt  # 何も書かれていない

vi scratch.txtscratch.txtを開いてください。

iで挿入モードに切り替え、temporaryと入力してからEscを押してください。

:q!と入力して Enter を押し、変更を破棄して終了してください。

④ ターミナルに戻ったらcat scratch.txtを実行し、破棄したため中身が保存されていないことを確認してください。

Linux console
0 / 2 実行済み
Loading Linux Terminal...

もっと vi を使う — a / o と :w

挿入モードに入る方法はiだけではありません。

aはカーソルの右側から、oはカーソルの下に新しい行を作って入力を始めます。

大文字のAは行末から、Oはカーソルの上に新しい行を作って入力します。

どれもEscでノーマルモードへ戻る点は同じです。

保存の命令も使い分けられます。

:wは終了せずに保存だけを行い、そのまま編集を続けられます。

長い編集では:wでこまめに保存し、最後に:wqで保存して閉じると安全です。

キー入力の始まる位置
iカーソルの左(手前)から
aカーソルの右(後ろ)から
o下に新しい行を作って
A行末から
O上に新しい行を作って
挿入モードへの入り方いろいろ
iカーソルの左から入力aカーソルの右から入力o下に新しい行を作って入力
iは左、aは右、oは下の新しい行から入力を始めます。いずれもEscで戻ります。

vi practice.txtpractice.txtを開いてください。

oを押して下に新しい行を作りながら挿入モードに入り、first lineと入力してください。

Escを押し、もう一度oで新しい行を作ってsecond lineと入力し、Escを押してください。

:wと入力して Enter で保存し(まだ終了しません)、続けて:qで終了してください。

⑤ ターミナルでcat practice.txtを実行し、2 行が保存されていることを確認してください。

Linux console
0 / 2 実行済み
Loading Linux Terminal...

行を削除・コピーする — dd / yy / p

ノーマルモードでは、文字を入力せずに行単位の編集ができます。

ddはカーソルのある行を 1 行まるごと削除(切り取り)します。

xはカーソル上の 1 文字を削除し、uは直前の操作を取り消します(アンドゥ)。

yyはカーソルのある行をコピー(ヤンク)し、pはコピーまたはddで切り取った内容をカーソルの下の行に貼り付けます。

ddで切り取った行もpで貼り付けられるので、行の移動にも使えます。

キー動作
xカーソル上の 1 文字を削除
dd行を 1 行削除(切り取り)
3dd / d3d数を付けて複数行を削除(例: 3 行)
yy行をコピー(ヤンク)
10yy / y10y数を付けて複数行をコピー(例: 10 行)
pコピー / 切り取った行を下に貼り付け
u直前の操作を取り消す(アンドゥ)
dd / yy / p で行を編集する
dd今の行を切り取るyy今の行をコピーするp下の行に貼り付ける
ddで切り取り、yyでコピーし、pで下の行に貼り付けます。いずれもノーマルモードで打ちます。

vi edit.txtedit.txtを開いてください。

iで挿入モードに入り、oneと入力して Enter、続けてtwoと入力してからEscを押し、2 行を用意してください。

yyで今いる行をコピーし、pでその下に貼り付けて、同じ行が増えることを確認してください。

④ 続けてddでカーソルのある行を 1 行削除してください。

:wqで保存して終了し、cat edit.txtで編集結果を確認してください。

Linux console
0 / 2 実行済み
Loading Linux Terminal...

行数を前に付けると、複数行をまとめて操作できます。

3dd(またはd3d)は 3 行を削除し、10yy(またはy10y)は 10 行をコピーします。

削除やコピーのあとにpで貼り付ければ、複数行の移動や複製も 1 回の操作でできます。

数を付けて複数行を操作する
3dd / d3d3 行をまとめて削除10yy / y10y10 行をまとめてコピーpコピーした行をまとめて貼り付け
行数を前に付けると、3ddは 3 行削除、10yyは 10 行コピー。pでまとめて貼り付けられます。

vi block.txtblock.txtを開いてください。

iで挿入モードに入り、oneと入力して Enter、同様にtwofiveまで 1 行ずつ入力して計 5 行にし、Escを押してください。

:1と打って Enter で 1 行目へ移動し、3dd(またはd3d)で上から 3 行を切り取り、続けてpでその 3 行を今のカーソルの下に貼り付けて、行を移動できることを確認してください。

2yy(またはy2y)で 2 行をコピーし、pでその下に貼り付けてください。

:wqで保存して終了し、cat block.txtで結果を確認してください。

Linux console
0 / 2 実行済み
Loading Linux Terminal...

カーソル移動と検索 — gg / G と / ?

長いファイルでは、1 行ずつ動くより一気にジャンプすると速く目的地へ着けます。

ggはファイルの先頭行へ、Gは最終行へカーソルを移動します。

ggが効かない環境でも1Gで先頭行へ移動できます。

文字列を探すときは検索を使います。

/wordと打って Enter で、カーソルより下(前方)へwordを検索します。

?wordは上(後方)へ検索し、nは同じ向きの次の一致、Nは逆向きの一致へ移動します。

どれもノーマルモードで打ち、Escは不要です。

キー動作
gg / 1G先頭行へ移動
G最終行へ移動
/word下(前方)へ word を検索
?word上(後方)へ word を検索
n / N次の一致 / 前の一致へ
gg / G の移動と / ? の検索
gg / 1G先頭行へ移動G最終行へ移動/word n下方向へ検索・次へ?word N上方向へ検索・逆へ
gg/Gで先頭・末尾へ、/wordは下方向・?wordは上方向に検索し、n/Nで次・前の一致へ動きます。

ls -l /bin > nav.txtで行数の多いファイルを用意してください。

vi nav.txtで開き、Gで最終行へ、gg(または1G)で先頭行へ移動してみてください。

/shと入力して Enter でshを含む行を下方向に検索し、nで次の一致、Nで前の一致へ移動してください。

?lsと入力して Enter で、今度は上方向にlsを検索してください。

⑤ 変更していないので:qで終了し、ターミナルに戻ってください。

Linux console
0 / 2 実行済み
Loading Linux Terminal...
QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1viで文字を入力できるようにするには、ノーマルモードで何を押しますか?

Q2挿入モードからノーマルモードへ戻るには何を押しますか?

Q3:q!を実行すると何が起こりますか?