最近仕事でClaude Codeを使っていて感動したのが、コンテキストの扱いやすさ。 「このファイルについて教えて」という時に、開いてるパスや選択している箇所の範囲指定が簡単に指定できる(Ctrl + Alt + K)。
普段個人開発でつかっているGemini CLI環境に戻ると、これが地味にストレスでした。「Claude Codeならサクッとできるのに、こっちだとわざわざパスをコピペして整形して…」という手間がどうしても許せなくなってきた。
そこで、VS CodeでもClaude Code並みの爆速コンテキスト指定を実現するために、ショートカット一発で「ファイルパス(選択時は行番号付き)を入力」→「ターミナルにフォーカス」までやってくれる設定を作った。
TL;DR
拡張機能の力を借りつつ、VS Code標準のwhen句で挙動を分岐させる。
1. 前提条件
以下の拡張機能をインストールしておく必要がある(これがないとパス変換ができない)。
- Command Variable (
rioj7.command-variable)
2. 設定コード
keybindings.json に以下を追記する。
Windowsは Ctrl + Alt + K、Macは Cmd + Opt + K で発動する設定にしている(Claude Code準拠)。
[
// -------------------------------------------------------
// Windows用 (Ctrl + Alt + K)
// -------------------------------------------------------
{
"key": "ctrl+alt+k",
"command": "runCommands",
"args": {
"commands": [
{
"command": "extension.commandvariable.inTerminal",
"args": {
"command": "extension.commandvariable.transform",
"args": {
"text": "@${command:extension.commandvariable.file.relativeFilePosix}:L${command:extension.commandvariable.selectionStartLineNumber}-${command:extension.commandvariable.selectionEndLineNumber}"
}
}
},
"workbench.action.terminal.focus"
]
},
"when": "editorTextFocus && editorHasSelection && !isMac"
},
{
"key": "ctrl+alt+k",
"command": "runCommands",
"args": {
"commands": [
{
"command": "extension.commandvariable.inTerminal",
"args": {
"command": "extension.commandvariable.transform",
"args": {
"text": "@${command:extension.commandvariable.file.relativeFilePosix}"
}
}
},
"workbench.action.terminal.focus"
]
},
"when": "editorTextFocus && !editorHasSelection && !isMac"
},
// -------------------------------------------------------
// Mac用 (Command + Option + K)
// -------------------------------------------------------
{
"key": "cmd+alt+k",
"command": "runCommands",
"args": {
"commands": [
{
"command": "extension.commandvariable.inTerminal",
"args": {
"command": "extension.commandvariable.transform",
"args": {
"text": "@${command:extension.commandvariable.file.relativeFilePosix}:L${command:extension.commandvariable.selectionStartLineNumber}-${command:extension.commandvariable.selectionEndLineNumber}"
}
}
},
"workbench.action.terminal.focus"
]
},
"when": "editorTextFocus && editorHasSelection && isMac"
},
{
"key": "cmd+alt+k",
"command": "runCommands",
"args": {
"commands": [
{
"command": "extension.commandvariable.inTerminal",
"args": {
"command": "extension.commandvariable.transform",
"args": {
"text": "@${command:extension.commandvariable.file.relativeFilePosix}"
}
}
},
"workbench.action.terminal.focus"
]
},
"when": "editorTextFocus && !editorHasSelection && isMac"
}
]
ショートカットの詳細解説
設定の中身を少し詳しく見ていく。
まずkeyの部分。
"key": "ctrl+alt+k",
同じキー(Ctrl + Alt + K)を2つの設定ブロックに割り当てているが後述するwhen条件のおかげで、状況に応じてどちらか片方だけが発動する仕組みになっている。
次に実行コマンドのrunCommands。
"command": "runCommands", "args": { "commands": [ ... ] },
VS Code標準のrunCommandsを使って、「テキストの入力」と「フォーカス移動」という2つのアクションを配列内で順番に実行させている。
これをやらないと、入力した後に手動でターミナルをクリックする無駄な時間が発生してしまう。
肝心のテキスト生成ルールは2パターン。
1. 選択範囲がある場合
"text": "@${...relativeFilePosix}:L${...selectionStartLineNumber}-${...selectionEndLineNumber}"
ファイルパスの後ろに:L開始行-終了行をくっつける設定。
ここで${...relativeFilePosix}を使っているのが重要で、これのおかげでWindows環境でもパス区切り文字がスラッシュ(/)に統一される。
2. 選択範囲がない場合
"text": "@${...relativeFilePosix}"
こっちはシンプルにファイルパスだけ。ファイル全体を読んでほしいので行番号を含めない。
そして、仕上げのフォーカス移動。
"workbench.action.terminal.focus"
配列の2つ目にこれを仕込んである。文字入力が終わった瞬間にカーソルをエディタからターミナルへ飛ばすので、ショートカット実行後はEnterを叩くだけでいい。
最後に、すべてを制御するwhen句。
"when": "editorTextFocus && editorHasSelection && !isMac" // または "when": "editorTextFocus && !editorHasSelection && !isMac"
ここが設定の心臓部。
editorHasSelection: 何か文字を選択している時だけ有効!editorHasSelection: 何も選択していない(カーソルのみ)時だけ有効!isMac: Mac以外(Windows)で有効
この判定により、同じキーを押してもカーソルの状態に合わせて「行番号あり」か「なし」かが勝手に切り替わる。我ながらスマートな解決策になったと思う。
まとめ
これで「コードを選択して Ctrl+Alt+K → Enter」だけで、特定のコードブロックをAIに投げられるようになった。
- Command Variable 拡張機能は必須。
- 複雑な条件分岐は、コマンド内で頑張るより
keybindings.jsonのwhen句でエントリを分けたほうがバグらない。 runCommandsは複数の操作をマクロ的にまとめるのに便利。
地味な改善やけど、1日100回くらいやる操作なのでQOLが爆上がりした気がする。