モードを持つ理由(哲学)
普通のテキストエディタは「常に入力モード」です。キーボードを押すと文字が入力され、 特殊な操作(コピーや移動)は Ctrl や Alt との組み合わせで行います。 しかし Vi は全く異なるアプローチを取りました。
Vi の設計者 Bill Joy が直面した問題は、カーソルキーのないテキスト端末 でした。 1976年当時、多くの端末は文字を受け付けるだけの単純なデバイスです。 そこで生まれたのが「モード」という概念—— 文字を入力するための状態と、コマンドを実行するための状態を明確に分けることです。
この設計は現代においても有効です。テキスト編集には2種類の操作があります。
- テキストを書く(文字を入力する)
- テキストを操作する(移動・削除・コピー・変更・検索)
普通のエディタでは「テキストを操作する」ために修飾キーが必要ですが、 Vi では専用のモードに切り替えることで、修飾キーなしにホームポジションのまま高速な操作が可能になります。 これが「Vim のキーバインドは最初難しいが、習得後は最速」と言われる理由です。
Normal モード
NORMAL
Neovim を起動したときのデフォルトのモードです。 「Normal」という名前が示す通り、これが「普通」の状態です。 多くの初心者は「テキストを入力する状態が普通」と思いがちですが、 Vim では操作・移動のための Normal モードが「基本」です。
Normal モードでは、キーボードのほぼすべてのキーがコマンドとして機能します。
hjkl でカーソル移動、d で削除、
y でコピー(yank)、p でペーストといった具合です。
Normal モードの主要キー
| キー | 動作 |
|---|---|
| h j k l | 左・下・上・右 に移動 |
| w / b | 次の単語の先頭 / 前の単語の先頭 へ移動 |
| 0 / $ | 行頭 / 行末 へ移動 |
| gg / G | ファイルの先頭 / 末尾 へ移動 |
| dd | 現在行を削除(カット) |
| yy | 現在行をコピー(yank) |
| p / P | カーソルの後ろ / 前 にペースト |
| u | アンドゥ(元に戻す) |
| Ctrl+r | リドゥ(やり直し) |
| / | 検索を開始(前方検索) |
| n / N | 次の検索結果 / 前の検索結果 へ移動 |
Insert モード
INSERT
テキストを入力するためのモードです。他のエディタと同様の感覚で文字を入力できます。
画面下部に -- INSERT -- と表示されます。
Insert モードへの入り方(Normal モードから)
| キー | 動作 |
|---|---|
| i | カーソルの前から Insert モードを開始 |
| a | カーソルの後ろから Insert モードを開始(append) |
| I | 行頭(最初の非空白文字)から Insert モードを開始 |
| A | 行末から Insert モードを開始 |
| o | 現在行の下に新しい行を開いて Insert モードを開始 |
| O | 現在行の上に新しい行を開いて Insert モードを開始 |
| s | カーソル下の文字を削除して Insert モードを開始 |
| S | 現在行を削除して Insert モードを開始 |
| c + 動作 | 指定範囲を削除して Insert モードを開始(change) |
Visual モード
VISUAL
テキストを選択するためのモードです。他のエディタでマウスドラッグで選択するのと同じことを、 キーボードだけで行えます。選択後は削除・コピー・置換などのコマンドを適用できます。
Visual モードの種類
| キー | モード | 動作 |
|---|---|---|
| v | Visual(文字単位) | 文字単位で選択。hjkl で範囲を広げる |
| V | Visual Line(行単位) | 行全体を選択。上下移動で複数行を選択 |
| Ctrl+v | Visual Block(矩形) | 矩形(長方形)範囲で選択。複数行の同じ列を一括編集できる |
Visual モードで使える主要コマンド
| キー | 動作 |
|---|---|
| d / x | 選択範囲を削除 |
| y | 選択範囲をコピー(yank) |
| c | 選択範囲を削除して Insert モードへ |
| > / < | 選択範囲をインデント / アンインデント |
| ~ | 大文字・小文字を切り替え |
| u / U | 小文字に変換 / 大文字に変換 |
Command-line モード
COMMAND
画面下部にコマンドラインが表示されるモードです。保存・終了・検索・置換・設定変更 など、 強力なコマンドをテキストで入力して実行します。
Command-line モードへの入り方
| キー | 動作 |
|---|---|
| : | Ex コマンドを入力(:w, :q, :s など) |
| / | 前方検索を開始 |
| ? | 後方検索を開始 |
| ! | 外部シェルコマンドを実行(例::!ls) |
よく使う Ex コマンド
| コマンド | 説明 |
|---|---|
| :w | ファイルを保存(write) |
| :q | 終了(変更があれば警告) |
| :wq / :x | 保存して終了 |
| :q! | 強制終了(変更を破棄) |
| :e ファイル名 | 指定ファイルを開く(edit) |
| :set number | 行番号を表示 |
| :%s/old/new/g | ファイル全体で old を new に置換 |
| :split / :vsplit | 水平 / 垂直 にウィンドウを分割 |
Replace モード
REPLACE
既存のテキストを上書きするモードです。他のエディタの Insert キーを押した状態に相当します。 入力した文字が既存の文字を置き換えていきます。
Replace モードへの入り方
| キー | 動作 |
|---|---|
| R | Replace モードに入る(複数文字を連続置換) |
| r | 1文字だけ置換して Normal モードに戻る(Replace モードではない) |
モード遷移図
各モード間の遷移関係を確認しましょう。どこからでも Esc で Normal モードに戻れます。
┌─────────────────────────────────┐
│ │
i, a, o, s │ │ Esc
I, A, O, S │ ┌──────────────────┐ │
c{motion} │ │ │ │
▼ │ INSERT MODE │◄───────┤
┌──────────►│ -- INSERT -- │ │
│ └──────────────────┘ │
│ │
┌──────────────┴────────────────────────────────┐ │
│ │ │
│ NORMAL MODE │ │
│ (default / home) │ │
│ │ │
└────────────┬──────────┬──────────┬────────────┘ │
│ │ │ │
v, V, :, /, ? R Esc
Ctrl+v │ │ │
│ │ ▼ │
▼ │ ┌──────────────────┐ │
┌──────────────────┐ │ │ │ │
│ │ │ │ REPLACE MODE │───────┘
│ VISUAL MODE │ │ │ -- REPLACE -- │
│ -- VISUAL -- │ │ └──────────────────┘
└─────────┬────────┘ │
│ ▼
Esc ┌──────────────────┐
│ │ │
└───►│ COMMAND MODE │
│ : / ? ! │
└──────────────────┘
よくある間違い
間違い1: Insert モードに入りっぱなしになる
最もよくある問題です。コマンドを打とうとして文字が入力されてしまう——これは Insert モードのままだからです。 何かおかしいと思ったら、まず Esc を押すのが鉄則です。
間違い2: hjkl の代わりに矢印キーを使ってしまう
矢印キーでも移動はできますが、それでは Vim の恩恵が半減します。 hjkl に慣れるために、 最初の1週間は意識的に矢印キーを封印してみましょう。 苦しいですが、その先に速度があります。
間違い3: モードを確認しないまま操作する
現在のモードは画面左下に表示されています。
-- INSERT --、-- VISUAL -- など、常に現在のモードを確認する習慣をつけましょう。
何も表示されていなければ Normal モードです。
間違い4: :q! でパニック終了してしまう
混乱して :q! を実行し、せっかく書いた内容を失ってしまう人がいます。
まず Esc で Normal モードに戻り、:u でアンドゥ、:w で保存という順番を意識しましょう。
:q! で強制終了できます。
最悪の場合でもこれでターミナルに戻れます。パニックにならないでください。
保存する場合は Esc → :wq です。この2つを体に刻んでください。
間違い5: モードを「切り替えるもの」と捉えすぎる
上級者は無意識にモードを切り替えています。 「今 Normal モードで何かコマンドを実行する」という意識ではなく、 「移動する → (自動的に Normal)」「書く → (自動的に Insert)」という感覚になってきます。 焦らず、繰り返し練習することで自然に身につきます。