Gemini CLIで「現在のファイルパス」をターミナルに即入力&フォーカスする設定

最近仕事で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 に以下を追記する。 WindowsCtrl + Alt + KMacCmd + 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+KEnter」だけで、特定のコードブロックをAIに投げられるようになった。

  • Command Variable 拡張機能は必須。
  • 複雑な条件分岐は、コマンド内で頑張るより keybindings.jsonwhen 句でエントリを分けたほうがバグらない。
  • runCommands は複数の操作をマクロ的にまとめるのに便利。

地味な改善やけど、1日100回くらいやる操作なのでQOLが爆上がりした気がする。