Visual Studio Code のキーボードショートカットで発火してるコマンドを探す方法
- Visual Studio Code
- カスタマイズ
- キーバインド
Visual Studio Code(以下VSCode)では他の一般的なエディタと同様、特定の操作をキーボードショートカットで実行できます。
デフォルトで設定されているもの以外、拡張機能で追加されるものもありますし、キーマップセット専用の拡張もあります。これらは基本的に便利なんですが、中には自分の好みと合わないものもあります。そして場合によっては意図せず発火してしまい、何が発火してるかわからないと変更も難しいという逆に使いづらい現象にハマります。
今回はそれを特定し、不使用にしたという話。
概要
- 意図せず発火し、何が発火しているかわからないので調べて潰しようがないものがあった
- VSCodeで発火しているショートカットを調べる方法
- 調べて判明したらそのショートカットを潰す方法
動機
様々なケースがあると思いますが、今回、僕の状況としてはEmacsキーバインドを実現するための拡張、Awesome Emacs Keymapを使っています。
おおむね良好で素晴らしい拡張ですが、 エディタ内で
しかし、VSCodeのショートカット一覧の画面かCtrl + f
などで調べてみても、該当するものが多すぎてどれかわかりません(そして基本的には必要なので手を加えたくない)。
方法としては自分
実際やったこと
まずキーボードショートカットについてはここ(Visual Studio Code Key Bindings)に書いてあります。
そして何が発火するか調べる方法はここ(Visual Studio Code Key Bindings#troubleshooting-keybindings)にあります。
実際にやってみましょう。
コマンドパレットを開いて
Developer: Toggle Keyboard Shortcuts Troubleshooting
と入力します。全て入力しなくても途中でサジェストされると思います。
実行すると、ログが流れるパネルが表示されます。これを表示したまま、今回、何のコマンドが発火しているかわからないコマンドを実際に発火させます。
前述の自分の例でいえば
そうすると沢山でるログを丁寧に見ていくと、
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: / Received keydown event - modifiers: <key>Ctrl</key>], <key>c</key>ode: KeyB, keyCode: 66, key: b
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: | Converted keydown event - modifiers: <key>Ctrl</key>], <key>c</key>ode: KeyB, keyCode: 32 ('B')
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: | Resolving<key>Ctrl</key>+[K<key>e</key>yB]
[2021-01-11 16:59:30.988] [renderer7] [info] [KeybindingService]: \ From 4 keybinding entries, matched emacs-mcx.executeCommands, when: editorFocus && findWidgetVisible && !isComposing && !replaceInputFocussed, source: user extension tuttieee.emacs-mcx.
というような記述を見つけました。
つまりemacs-mcx.executeCommands
がwhen: editorFocus && findWidgetVisible && !isComposing && !replaceInputFocussed
の状況のとき発火していて、これはsource: user extension tuttieee.emacs-mcx.
で設定されたもの、ということです。
見つかりましたね。
あとはコマンドパレットでOpen: keyboard shortcut
を実行し、ショートカット一覧を開きます。
ここで、上記問題のコマンド、もしくは状況のeditorFocus && findWidgetVisible && !isComposing && !replaceInputFocussed
で調べても良いでしょう。
対象のものを見つけだしたら、右クリック(or Ctrl+クリック)でキーバインドの削除
を実行します。
そうすると一覧から削除され、このコマンドは無効化されます。
ここで、このコマンドはいったん削除し、戻す方法がなさそうに見えます、Open: keyboard shortcut(JSON)
のほうで、GUIではなく設定のJSONファイルを見にいくと、
{
"key": "Ctrl + b",
"command": "-emacs-mcx.executeCommands",
"when": "editorFocus && findWidgetVisible && !isComposing && !replaceInputFocussed"
},
という記述が最後に追加されているはずです。この"command": "-emacs-mcx.executeCommands"
がポイントです。最初に-
が付与されているため、これは無効化されたコマンドになっています。
もし元のように動作させたくなった場合、このJSONからこの記述を削除すればまた元のように動作しますし、一覧にも表示されるようになります。
やってみた結果
これで無事発火しなくなりました。あとは
簡易的にはここ(Visual Studio Code Tips and Tricks#keyboard-reference-sheets)に一覧も用意されています。便利ですね。
Open: keyboard shortcut
から開くGUIによるエディタの「ソース」が規定になっていても拡張で入るものもあるのでVSCode本来のデフォルトショートカットは上記のリンクで確認するのが正しそうです。
感想
実はこういう発想に至ったのも以前僕はAtomをメインで使っていた時期があり、Atomでは何が発火したか表示する機能があったんですね。なのでそれと同じことができれば、という発想になりました。
キーバインドのカスタマイズは上手く自分の手になじむものでないとツライですし、なにより意図せず発火するのはもっとツライですね。
これでようやくEmacキーバインドのVSCodeがストレスなく使えるようになりました、万歳!