Vimのモード駆動型アーキテクチャ
Vimは伝統的なviエディタを継承・拡張した高機能なターミナルベースのテキスト編集ツールです。プログラミング支援機能に優れ、キーボードのみで完結する高速な操作体系が特徴的です。その核心は「モード」の概念にあり、入力状態に応じてキーボードの解釈を動的に切り替えます。
操作モードの分類と遷移
Vimは主に3つの状態から構成されます。
- ノーマルモード:起動直後のデフォルト状態。押下されたキーはテキスト入力ではなく、編集コマンドやカーソル移動として解釈されます。
- インサートモード:通常のテキストエディタと同様に文字を入力できる状態。改行や削除機能も利用可能です。
- コマンドラインモード:画面最下行にプロンプトが表示され、ファイル保存・検索置換・環境設定などのマクロ操作を実行します。
モード切替の手順
任意のモードからノーマルモードへはEscキーで即時戻ります。インサートモードへの遷移には以下のキーが利用されます(カーソル位置の挙動が異なります)。
| キー | インサート時のカーソル配置 |
|---|---|
i | カーソル直前の位置 |
a | カーソル直後の位置 |
I | 行頭(先頭空白除く) |
A | 行末 |
o | カーソル行の直下に新規行を追加 |
O | カーソル行の直上に新規行を追加 |
R | 上書きモードへ移行(Escまで継続) |
コマンドラインモードへはノーマルモードから:または/を押下します。モード間はEscを介してのみ安全に遷移できる点に注意が必要です。
ノーマルモード:カーソル制御とページング
右手をホームポジションに置いた状態で操作できるよう設計されています。
hjkl:左・下・上・右へ1文字ずつ移動。連打や前方に数字を付ける(例:5j)ことで倍数移動が可能です。w/b:単語単位で右へ / 左へジャンプ。0/$:行頭 / 行末へ移動。gg/G:ファイル先頭 / 最終行へ移動。15Gの形式で特定行へも指定可能。Ctrl+f/Ctrl+b:1ページ下へ / 上へスクロール。H/M/L:画面表示範囲の最上行 / 中央行 / 最下行の先頭へ移動。
テキスト操作:演算子とモーションの組み合わせ
Vimの編集は「何をするか(演算子)」と「どこを対象とするか(モーション)」を合成するパラダイムに従います。
| 操作 | コマンド例 | 解説 |
|---|---|---|
| 削除 | dd, 3dd, d$, d0 | 全行 / 指定行数 / 行末まで / 行頭までを消去 |
| コピー | yy, y$, y0 | ddと同様の範囲で内部バッファへ格納 |
| 貼り付け | p, P | カーソル後 / 前に展開。行単位では1行下 / 1行上に挿入 |
| 修正 | c, cc, cw | 対象範囲を削除した直後にインサートモードへ移行 |
| 履歴管理 | u, Ctrl+r, . | 前操作取り消し / 取り消しを元に戻す / 直近の操作を反復実行 |
ビジュアルモードでの範囲選択
ノーマルモードからvを押すと文字単位の選択状態になります。カーソル移動で範囲を拡張し、y(コピー), d(削除), c(修正), gu(小文字化), gU(大文字化), > (字下げ追加)などのコマンドを実行できます。行単位選択はV、ブロック選択はCtrl+vで切り替えます。
コマンドラインモード(:プロンプト)
ファイルの永続化や正規表現検索置換には最下行の入力モードを活用します。
:w // 現在のバッファをディスクへ保存
:w! // 読み取り専用属性を無視して強制的に上書き
:w [ファイル名] // 別名として保存
:q // 変更がない場合にのみ終了
:q! // 未保存の変更を破棄して強制的に終了
:wq // 保存後終了
:help [コマンド] // 内蔵ヘルプマニュアルの表示
環境設定と検索置換
:set number // 行番号の常時表示を有効化
:set nonumber // 行番号表示を無効化
:%s/検索語/置換語/gc // ファイル全体をスキャンし、ヒットごとに確認プロンプトを表示
:10,30s/^/#/g // 10〜30行目に先頭から#を追加(コメントアウト例)
:10,30s/^#//g // 10〜30行目の先頭#を削除(コメント解除例)
前方検索は/パターン、後方検索は?パターンで実行します。一致箇所にカーソルが移動した直後、nで次の一致箇所に、Nで逆方向の一致箇所に連続ジャンプできます。
インサートモードの操作特性とターミナルの挙動
インサートモードでは一般的なテキスト入力キーが有効ですが、Linuxターミナル環境特有の制御シーケンスに注意が必要です。
Ctrl+z:エディタをサスペンド(バックグラウンド化)します。復帰にはfgコマンドが必要です。テキストの取り消しには利用できません。Ctrl+c:GUIアプリでのコピーではなく、プロセスの強制終了シグナル(SIGINT)を送ります。Vim実行中に押すとエディタ自体が閉じるため誤操作に注意。- クリップボード連携:ターミナル上では
Ctrl+Shift+CとCtrl+Shift+Vが標準の選択コピー/貼り付けとして機能します。これらはノーマルモードのy/pとは独立したシステムクリップボードを経由するため、カーソル位置にペーストされます。
モードの文脈を正しく把握し、キーバインドを目的に合わせて選択することで、画面切り替えなしで高速なコード編集が実現可能です。