Claude Code Vimモードの使い方とキー操作一覧
Claude CodeのVimモードはNORMAL/INSERT/VISUALの3モードとテキストオブジェクトを備えます。有効化の手順とキー操作、よくあるつまずきをまとめます。
Claude Codeの入力欄には、標準的なVimのモーション・編集コマンド・テキストオブジェクトをほぼそのまま備えたVimモードがあります。/configのEditor modeから切り替えると、NORMAL・INSERT・VISUALの3モードで文字入力を操作できるようになります。この記事では有効化の手順から、NORMAL modeでの移動・編集、VISUALモードでの選択、INSERTモードの2キー脱出シーケンス設定までを順に扱います。
この記事で学ぶこと・前提条件
対象はClaude Codeの入力ボックス内の編集操作です。OSのターミナルやエディタが持つVimエミュレーションとは別物で、Claude Codeのプロンプト入力欄だけに効く独立した実装です。前提はClaude Codeのインストール済み環境のみで、実際のVimを使ったことがなくても本文のキー対応表だけで操作を覚えられます。
真価が出やすいのは、複数行にまたがる長いプロンプトを書き直すときです。矢印キーとBackspaceだけで移動・削除する場合と比べ、dwやciwのようなオペレータ+モーションの組み合わせは移動と削除を1操作にまとめられます。指示文を数行書いてから途中の1単語だけ直す、といった編集が多い人ほど効果を感じやすい機能です。
ステップ1: Vimモードを有効にする
/configを開き、Editor modeをvimに切り替えます。
/configsettings.jsonに直接書いて恒久化することもできます。
{
"editorMode": "vim"
}有効化した直後は常にINSERTモードから始まります。EscでNORMALモードに切り替わり、そこから移動・編集コマンドが使えるようになります。
| コマンド | 動作 | 遷移元 |
|---|---|---|
Esc | 動作NORMALモードへ | 遷移元INSERT、VISUAL |
i | 動作カーソルの前にInsert | 遷移元NORMAL |
I | 動作行頭にInsert | 遷移元NORMAL |
a | 動作カーソルの後にInsert | 遷移元NORMAL |
A | 動作行末にInsert | 遷移元NORMAL |
o | 動作下に行を開いてInsert | 遷移元NORMAL |
O | 動作上に行を開いてInsert | 遷移元NORMAL |
v | 動作文字単位のVISUAL選択を開始 | 遷移元NORMAL |
V | 動作行単位のVISUAL選択を開始 | 遷移元NORMAL |
ステップ2: NORMALモードで移動する
NORMALモードの移動コマンドは本家Vimとほぼ一致します。
| コマンド | 動作 |
|---|---|
h/j/k/l | 動作左/下/上/右へ移動 |
w/e/b | 動作次の単語/単語末尾/前の単語 |
0/$/^ | 動作行頭/行末/最初の非空白文字 |
gg/G | 動作入力全体の先頭/末尾 |
f{char}/F{char} | 動作次/前の指定文字へジャンプ |
t{char}/T{char} | 動作次/前の指定文字の直前/直後へ |
;/, | 動作直前のf/F/t/Tモーションを繰り返す/逆方向で繰り返す |
/ | 動作逆順履歴検索を開く(Ctrl+Rと同じ) |
カーソルが入力の先頭または末尾にあってそれ以上動けないとき、j/kと↑/↓はコマンド履歴のナビゲーションに切り替わります。入力が空の状態で←を押すとagent viewを開く動作もNORMALモードから使え、v2.1.219以降はINSERTモードだけでなくNORMALモードでも機能します。
ステップ3: 編集コマンドとテキストオブジェクト
編集はオペレータ(d/c/y)とモーション・テキストオブジェクトの組み合わせで成立します。
| コマンド | 動作 |
|---|---|
x | 動作1文字削除 |
dd | 動作行削除 |
D | 動作カーソルから行末まで削除 |
dw/de/db | 動作単語/単語末尾まで/単語頭まで削除 |
cc/C | 動作行を変更/行末まで変更 |
cw/ce/cb | 動作単語/単語末尾/単語頭を変更 |
s/S | 動作1文字を削除してInsert/行を消してInsert(v2.1.211以降) |
yy/Y | 動作行をヤンク(コピー) |
yw/ye/yb | 動作単語/単語末尾まで/単語頭までヤンク |
p/P | 動作カーソルの後/前に貼り付け |
>>/<< | 動作インデント/デデント |
J | 動作行を連結 |
u | 動作取り消し |
. | 動作直前の変更を繰り返す |
d・c・yはテキストオブジェクトとも組み合わせられます。iw/aw(単語の内側/周囲)、i"/a"、i'/a'、i(/a(、i[/a[、i{/a{が使え、ciw(単語を丸ごと変更)やdi((括弧の中身を削除)のような操作がそのまま通ります。
実際の場面では、ファイルパスやコマンド名を書き直すときにci"(ダブルクオートの中身を変更)が特に便利です。カーソルがクオート内のどこにあっても、対象を正確に選び直す手間なく中身だけを丸ごと差し替えられます。単語単位の移動よりも「意味のある単位」で編集できる点が、矢印キー操作との一番の違いです。
ステップ4: VISUALモードで範囲選択する
v(文字単位)またはV(行単位)でVISUALモードに入ると、モーションで選択範囲を広げてからオペレータを当てられます。vjjdなら「下2行を含めて選択し削除」、Vyなら「現在行をヤンク」という要領です。VISUALモードでの選択と可視フィードバックはv2.1.118で追加された機能で、それ以前のClaude Codeにはありませんでした。
VISUALモードで選択した範囲には、以下のコマンドを当てられます。
| コマンド | 動作 |
|---|---|
d/x | 動作選択範囲を削除 |
y | 動作選択範囲をヤンク(コピー) |
c/s | 動作選択範囲を削除してInsert |
p | 動作選択範囲をレジスタの内容で置換 |
r{char} | 動作選択範囲の各文字を指定文字に置換 |
~/u/U | 動作大文字小文字を反転/すべて小文字化/すべて大文字化 |
>/< | 動作選択範囲をインデント/デデント |
J | 動作選択範囲の行を連結 |
o | 動作カーソルと選択の起点(アンカー)を入れ替え |
v/V | 動作文字単位選択/行単位選択に切り替え |
VISUALモードが便利なのは、削除や変更の範囲を先に目で確認してから実行できる点です。dwのようなオペレータ+モーションは一発で確定しますが、範囲が複雑なときや初めて使うモーションを試すときは、まずvで選択して見た目を確認し、それからdやcを当てるほうが事故を防げます。慣れてきたらオペレータ+モーションに戻す、という使い分けが現実的です。
なお、Ctrl+Vによるブロック選択(矩形選択)には対応していません。選択は文字単位(v)と行単位(V)の2種類のみです。
ステップ5: INSERTモードの2キー脱出シーケンスを設定する
ホームポジションを離れずにNORMALモードへ戻りたい場合、vimInsertModeRemaps設定でjjのような2キーシーケンスをEscに割り当てられます。v2.1.208以降で使えます。
{
"editorMode": "vim",
"vimInsertModeRemaps": { "jj": "<Esc>" }
}1文字目を入力した時点ではそのまま文字が挿入され、1秒以内に2文字目が来ると両方の文字が取り消されてNORMALモードに切り替わります。1秒を過ぎてから2文字目を打つ、または別のキーを挟むと、2文字とも通常の文字として残ります。この設定は自分のユーザー設定ファイル・--settingsフラグ・管理者設定からのみ読み込まれ、チェックアウトしたリポジトリの.claude/settings.jsonは読まれません。
keybindings.jsonとの関係
Vimモードとキーバインドシステムは独立して動きます。VimのEscapeキーはINSERTからNORMALへの切り替え専用で、応答を中断するchat:cancelは発火しません。ほとんどのCtrl系ショートカットはVimモードを素通りしてキーバインドシステムに届きます。NORMALモードで?を押すとヘルプメニューが開き、/を押すとCtrl+Rと同じ履歴検索が開くのは、いずれもVim由来の挙動です。
Vimのモーションキー自体はkeybindings.jsonでリマップできません。 h/j/k/lのような基本移動キーを変更する手段は用意されておらず、変更できるのは前述のvimInsertModeRemapsによるINSERTモード脱出シーケンスだけです。
この線引きを覚えておくと設定ファイルをいじる前に迷わずに済みます。「入力欄の中でどう動くか」はVimモード側の管轄、「入力欄の外でどう動くか」(権限モードの切り替えやトランスクリプトビューアーの開閉など)はキーバインドシステム側の管轄という分担です。keybindings.jsonを開いてVimのモーションを探しても見つからないのは仕様どおりで、設定漏れではありません。
よくあるつまずき
/vimコマンドが見つからない: v2.1.92で廃止されており、切り替えは/configのEditor modeからのみ行います。- Escapeを押しても応答が止まらない: VimモードのEscapeはINSERT→NORMALの切り替え専用で、実行中のターンを中断する
chat:cancelは発火しません。応答を止めたいときはEscを続けて押すか、Vimモードを離れて通常の中断操作を使います。 - 入力欄の先頭で
j/kを押しても動かない: カーソルが入力の境界にあるとき、これらのキーはコマンド履歴の移動に切り替わる仕様です。バグではなく、意図した挙動です。 - ヤンクした内容が消える: ダイアログや履歴検索、トランスクリプト表示を経由するとヤンクレジスタが空になる不具合がv2.1.220以前にありました。v2.1.221で修正済みです。
- Ctrl+Vでブロック選択できない: Vimモードの選択は文字単位(
v)と行単位(V)のみで、矩形選択(ブロック選択)には対応していません。 vimInsertModeRemapsが効かない: v2.1.208より前のバージョンでは存在しない設定です。.claude/settings.json(プロジェクト側)に書いても読み込まれない点にも注意します。ユーザー設定ファイルか--settingsフラグで指定します。Claude Codeのバージョンはclaude --versionで確認できます。
Vimモードの機能はこれまでどう拡張されてきたか
| バージョン | 追加・変更内容 |
|---|---|
| v2.1.0 | 追加・変更内容;/,のモーション繰り返し、y/p/P、テキストオブジェクト一式、>>/<<、Jを追加 |
| v2.1.92 | 追加・変更内容/vimコマンドを廃止、/configのEditor modeに一本化 |
| v2.1.98 | 追加・変更内容j/kを入力境界でのコマンド履歴移動に対応 |
| v2.1.118 | 追加・変更内容VISUALモード(v/V)を選択・オペレータ・可視フィードバック付きで追加 |
| v2.1.208 | 追加・変更内容vimInsertModeRemaps設定を追加(2キーのINSERT脱出シーケンス) |
| v2.1.211 | 追加・変更内容s/S(文字/行の置換)をNORMALモードの標準Vim挙動に変更 |
| v2.1.219 | 追加・変更内容空の入力で←を押したときNORMALモードからもagent viewに戻れるように変更 |
初期のVimモードは移動と挿入だけの簡易な実装でしたが、v2.1.0でテキストオブジェクトとヤンク/ペーストがそろい、v2.1.118のVISUALモード追加で選択操作が本格的になりました。直近のv2.1.208〜v2.1.221は、キーボードから手を離さずに使い続けるための細部の詰めが中心で、いまも継続的に手が入っています。
よくある質問
VimモードとClaude Codeのキーバインド(keybindings.json)は同時に使えますか
使えます。両者は独立した仕組みで、Vimのモーションキーはキーバインドシステムを素通りしません。ただしCtrl系ショートカットの大半はVimモードを通過してキーバインドシステムに届くため、キーバインド側のカスタマイズは引き続き有効です。
VimモードのINSERTモードからEscを押すと会話が中断されますか
されません。VimモードのEscapeキーはNORMALモードへの切り替え専用で、chat:cancel(応答の中断)アクションは発火しません。
標準のVimと完全に同じ操作感ですか
移動・編集・テキストオブジェクト・VISUALモードの主要な部分は標準Vimと一致するよう作られています。ただし入力欄という限られたスコープでの実装のため、ファイル編集を前提にした機能まで含めてVimを丸ごと再現しているわけではありません。たとえばCtrl+Vのブロック選択(矩形選択)は非対応で、選択は文字単位(v)と行単位(V)のみです。基本の移動・編集操作を覚えるだけでも、矢印キー中心の操作から十分に速くなります。
Vimモードのキーをkeybindings.jsonでリマップできますか
できません。Vimのモーションキー(h/j/k/lなど)はkeybindings.jsonの対象外です。2キーのINSERT脱出シーケンスだけはvimInsertModeRemaps設定で個別に変更できます。
まとめ
Claude CodeのVimモードは/configのEditor modeから即座に有効化でき、NORMAL・INSERT・VISUALの3モードと一通りのテキストオブジェクトを備えています。移動・編集コマンドは標準Vimとほぼ一致するため、Vimに慣れていればすぐに持ち込めます。vimInsertModeRemapsでINSERTモードの脱出シーケンスを設定すれば、ホームポジションを離れずに操作を完結できます。Vimモード以外のキー操作全般はClaude Codeショートカット一覧、settings.jsonの全体像はClaude Code設定ガイド、Claude Codeの基本機能はClaude Code(クロードコード)とはで確認できます。