⌨️

VSCodeでワークスペースごとに独自のキーバインドを使う裏技

2024/03/09に公開
2

はじめに

皆さんはVSCodeに独自のキーボードショートカット追加していますか?
よく使う小技的なものや、VSCodeのタスク機能を割り当ててコマンド実行をさせている方も多いんじゃないでしょうか。

VSCodeのキーボードショートカット作成はkeybindings.jsonを編集することで可能で、キーボードショートカットごとに発動条件を"When"で指定することができます。
例えば

keybindings.json
	{
	"key": "ctrl+shift+j",
	"command": "workbench.action.terminal.focus",
	"when": "editorTextFocus"
	},{
	"key": "ctrl+shift+j",
	"command": "workbench.action.focusFirstEditorGroup",
	"when": "terminalFocus"
	},

とすることで同じctrl+shift+jのショートカットを

  • エディター選択時はターミナルに移動
  • ターミナル選択時はエディターに移動

として使うことができます。
(話は逸れますが、このショートカットは個人的によく使うもので、ctrl+jのパネル表示/非表示との親和性が高いのでおすすめです)

whenの詳しい使い方については 公式の解説を参照してください

ですがwhenでは対応できないこんなシチュエーションに遭遇したことはありませんか?

  • 同じキーボードショートカットをワークスペースごとに意味を変えたい
  • 押しやすいキーの組み合わせをワークスペースごとに意味を変えて使いたい
  • 特定のワークスペースだけでしか使わないキーボードショートカットがある

これらはVSCodeではワークスペースごとにkeybindings.jsonを置くことができず、whenの機能ではワークスペースを識別できないために生じます。
そのため公式にはワークスペースごとに違ったキーボードショートカットを使うことはサポートされていないのですが、今回はこれを(あまりスマートではないが便利な)裏技で回避していきます。

やることの概要

やることとしては至ってシンプルです。
ワークスペースごとに定義できないのならばワークスペースごとにフラグを作成し、それを見てキーボードショートカットの有効無効を変えてやろうという作戦になります。

具体的には

  1. ワークスペースの.vscode/settings.jsonのファイルでワークスペースに固有の設定値にTrueを入れる
  2. keybindings.jsonの使いたいキーボードショートカットの"when"で1. で指定した設定値がTrueかどうかの確認をいれる

となります。
一つづつ見ていきましょう。

ワークスペースでの設定

ワークスペースの識別のために固有のフラグを作ります。

まず使いたいワークスペースを開き、VSCodeのワークスペースごとの設定情報を入れる.vscode/settings.jsonフォルダに移動します。(なければ作成してください)

次に中に次の1行を追加します。

settings.json
{
	"workspaceKeybindings.hogehoge_ws.enabled": true,
}

ここの"workspaceKeybindings.hogehoge_ws.enabled"は今適当に考えた名前で、VSCodeさんはこんな項目知らないので「不明な構成設定」とか言われてグレーアウトされますが、気にしなくて良いです。
名前もワークスペースごとにお好きなものに変えてください。

以上でワークスペース側での設定は終わりです。

keybindings.jsonでの設定

keybindings.jsonを編集して、ショートカットがワークスペース側で作ったフラグを判定できるようにします。

具体的には下記のようにします。フラグの名前はそれぞれのワークスペースでつけたものと合わせてください。

keybindings.json
	{
	"key": "ctrl+shift+q",
	"command": "command_1",
	"when": "config.workspaceKeybindings.hogehoge_ws.enabled",
	},
	{
	"key": "ctrl+shift+q",
	"command": "command_2",
	"when": "config.workspaceKeybindings.hugahuga_ws.enabled",
	},

↑のようにすると、同じctrl+shift+qのショートカットでconfig.workspaceKeybindings.hogehoge_ws.enabledがTrueにしているワークスペースではcommand_1が、config.workspaceKeybindings.hugahuga_ws.enabledがTrueにしているワークスペースではcommand_2が実行されます。

おわり

以上のようにすることでワークスペースごとに独自のキーボードショートカットを使うことができます。
ワークスペースだけで完結できないのが玉に瑕ですが、かゆいところに手が届くようになる場合もあると思いますので、参考にしてご活用ください

参考

https://stackoverflow.com/questions/48945319/a-keybindings-json-per-workspace-in-visual-studio-code

加筆訂正の情報

2024.10.01 : 誤記を修正

Discussion

piyopiyopiyopiyo

有益な記事ありがとうございます。
記事内で誤記が見えたため、他の読者のためにも記録しておきます。(stackoverflowの元記事では問題ないようです。)
setting.json
-> settings.json
keybinding.json
-> keybindings.json
"when": "workspaceKeybindings.hogehoge_ws.enabled",
-> "when": "config.workspaceKeybindings.hogehoge_ws.enabled",

KauaiKauai

修正いたしました。ご指摘ありがとうございます!