VS Codeのキーバインドカスタムは3つでいい

VS Codeのキーバインドカスタムは3つでいい

標準のショートカットを一通り覚えて、実際に毎日使い始めると、別のモヤモヤが出てくるはず。補完の確定とかマルチカーソルとか、1日に何十回も押すキーに限って、指が届きにくい位置にある。「押せるけど、毎回ちょっとストレス」というやつだ。

VS Codeにはkeybindings.jsonという仕組みがあって、キー割り当てを自分用に書き換えられる。変えるのは最小限だけ、壊さずに変えれば足りる。

目次 / INDEX

まず結論:全部いじらない。「頻度×距離」で3つだけ選ぶ

先に結論。キーバインドは全部いじっちゃダメだ。

変えるのは「押す回数が多くて、かつ指が遠い」ものだけ。僕の基準では3つまで。

理由はシンプルで、デフォルトから離れるほど覚え直しのコストがかかるから。キーを1個変えると、そのキーの新しい位置を体に入れ直す期間が必ず発生する。しかも他人のマシンや解説記事のキーが自分の環境と食い違っていく。

だから、変える対象は「毎日何十回も押すのに、ホームポジションから指が遠い」キーに絞る。週に数回しか押さないキーは、遠くても放置でいい。デフォルトの9割はそのままが正解だと思う。

ちなみに、そもそもどのショートカットを覚えるべきかの話は、VS Codeの拡張と設定の記事の後半にまとめてある。

あと身も蓋もない話だけど、押しやすさはキー配置だけの問題でもない。キーボード自体が打ちにくいと、どこに割り当てても遠い。打ち心地で選ぶならキーボードの選び方に3,000円台からまとめている。

keybindings.json の開き方と最小の書き方

開き方は2つある。GUIで変えるなら、コマンドパレット(Ctrl+Shift+P)から「基本設定: キーボードショートカットを開く」。JSONを直接書くなら、同じパレットで「基本設定: キーボードショートカットを開く (JSON)」だ。

僕はJSON直編集をすすめる。GUIは1個ずつポチポチ変える分には楽なんだけど、JSONなら「自分が何をどう変えたか」がファイル1枚で全部見える。変更が3つしかないなら、3行読めば全容が分かる。

1エントリの形はこれだけ。keyに押すキー、commandに実行するコマンドID、whenに発動条件を書く。

{
  "key": "ctrl+enter",
  "command": "editor.action.inlineSuggest.commit",
  "when": "inlineSuggestionVisible"
}

この例だと「インライン補完(ゴーストテキスト)が出ている時にCtrl+Enterを押したら確定」という意味になる。whenの話は後でちゃんとやる。

keybindings.jsonはユーザー単位で、OSごとに保存される。プロジェクトごとに書き分ける必要はない。

変える価値が高い候補(AI補完を使う人向け)

じゃあ具体的にどのコマンドが候補になるか。AI補完を毎日使う人向けに、動かす価値がありそうなものを表にした。

コマンドIDデフォルトのキー(Win)何に効くか
editor.action.inlineSuggest.commitTabインライン補完(ゴーストテキスト)を確定
editor.action.inlineSuggest.showNextAlt+]インライン補完の次の候補
editor.action.inlineSuggest.showPreviousAlt+[インライン補完の前の候補
acceptSelectedSuggestionTab または Enter補完候補ウィンドウの選択を確定
editor.action.addSelectionToNextFindMatchCtrl+D同じ単語の次を選択(マルチカーソル)
editor.action.selectHighlightsCtrl+Shift+L同じ単語を全部選択
cursorColumnSelectDownCtrl+Shift+Alt+↓縦の列選択(ボックス選択)を下へ
editor.action.renameF2シンボル名の一括リネーム

AI補完が中心の人なら、最優先は「補完の確定」と「候補めくり」だ。押す頻度が桁違いに多いから。特に候補めくりのAlt+]は、日本語キーボードだと「]」の位置の関係で押しにくく感じる人が多いはず。

逆にF2のリネームみたいに、頻度がそこまで高くないものは、遠くても後回しでいい。頻度×距離、この掛け算で並べると優先順位は勝手に決まる。

壊さないための when 句とキー衝突チェック

ここが一番大事なところ。キーバインドのカスタムで事故る原因はほぼ2つで、「発動条件を絞ってない」か「既存の割り当てと衝突してる」だ。

まずwhen句。さっきの例に付いていた "when": "inlineSuggestionVisible" は「インライン補完が表示されている時だけ」という条件だ。これを付けないと、そのキーはエディタのどんな場面でも新しいコマンドに取られてしまう。

whenに書ける条件(文脈キー)は他にもある。editorTextFocus(エディタにフォーカスがある時)、suggestWidgetVisible(補完候補ウィンドウが出ている時)あたりを使い分ける。「補完が出ている時だけ確定キーとして働き、それ以外の時は元の動きのまま」に絞れるのがwhenの価値だ。

次に、既存の割り当てをどうしても外したい時。commandの頭に「-」を付けたエントリを書くと、その割り当てを無効化できる。

{
  "key": "ctrl+d",
  "command": "-editor.action.addSelectionToNextFindMatch"
}

これでCtrl+Dから「同じ単語の次を選択」が外れる。元のデフォルト定義を書き換えるんじゃなくて、自分のファイルに「打ち消しの1行」を足す方式だから、消したくなったらこの行を消せば元に戻る。安全だ。

衝突チェックの手順も決まっている。GUIのキーボードショートカット画面を開いて、検索窓に割り当てたいキーをそのまま打つ。

するとそのキーに今何が割り当たっているかが一覧で出る。新しいキーを決める前にここを見る、を習慣にすれば「知らないうちに別の機能を潰してた」は防げる。

Mac と Windows でキーが違う点

MacとWindowsの両方でVS Codeを使う人は1つ注意。keybindings.jsonは端末ごとに別々に保存される。つまりWindowsで書いたkeybindings.jsonが、Macに勝手に反映されるわけじゃない。

読み替えも必要になる。Windowsのctrlは、Macだと多くの場面でcmdに相当する。altはoptionだ。

だから片方の環境で作ったkeybindings.jsonをそのままもう片方に持っていくと、修飾キーの意味がずれて合わないことがある。両方使うなら、それぞれの環境で同じ「意図」のエントリを書き直すつもりでいた方がいい。

これも、変えるキーを3つに絞っておく理由の1つだ。3つなら両環境のメンテも3行で済む。20個変えていたら、たぶん管理しきれない。

まとめ

やることは4つだけ。

  • 頻度×距離で変えるキーを3つまでに絞る
  • keybindings.jsonに1エントリずつ書く
  • whenで発動条件を絞る
  • 割り当てる前にGUIの検索窓でそのキーの衝突を確認する

デフォルトの9割はそのままでいい。

まずは今日、自分が一番「遠いな」と感じているキーを1個だけ書き換えてみてほしい。1個変えて数日使えば、2個目を変えるべきかどうかは指が教えてくれる。

同じ「打鍵を減らす」発想の続きとして、毎回同じコード片を打ってるならスニペット自作の話、毎回同じコマンドを打ってるならtasks.jsonの話もどうぞ。

よくある質問

VS Codeのキーバインドはどこで変更する?

コマンドパレットから「基本設定: キーボードショートカットを開く (JSON)」でkeybindings.jsonを開き、key・command・whenの3つを書いた1エントリを足す。GUIで1個ずつ変えたいなら (JSON) なしの方を選ぶ。

VS Codeで既存のショートカットを無効化するには?

keybindings.jsonに、commandの頭に - を付けたエントリを書く。ctrl+dに -editor.action.addSelectionToNextFindMatch を書けば「同じ単語の次を選択」が外れる。その行を消せば元に戻る。

キーバインドのwhen句は何のためにある?

そのキーが新しいコマンドとして働く場面を絞る条件。inlineSuggestionVisible を付ければインライン補完が出ている時だけ確定キーになり、それ以外の場面では元の動きのまま残せる。

次に読むなら

VS Codeのtasks.jsonの書き方|Ctrl+Shift+Bでコマンドを一発実行キーを決めたら、実行コマンドもボタン1つに読む →