Visual Studio Code のキーボードショートカットで発火してるコマンドを探す方法

Visual Studio Code(以下VSCode)では他の一般的なエディタと同様、特定の操作をキーボードショートカットで実行できます。

デフォルトで設定されているもの以外、拡張機能で追加されるものもありますし、キーマップセット専用の拡張もあります。これらは基本的に便利なんですが、中には自分の好みと合わないものもあります。そして場合によっては意図せず発火してしまい、何が発火してるかわからないと変更も難しいという逆に使いづらい現象にハマります。

今回はそれを特定し、不使用にしたという話。

概要

  • 意図せず発火し、何が発火しているかわからないので調べて潰しようがないものがあった
  • VSCodeで発火しているショートカットを調べる方法
  • 調べて判明したらそのショートカットを潰す方法

動機

様々なケースがあると思いますが、今回、僕の状況としてはEmacsキーバインドを実現するための拡張、Awesome Emacs Keymapを使っています。

おおむね良好で素晴らしい拡張ですが、 エディタ内でCmd+fで検索窓を開いたとき、検索窓内でCtrl+f,Ctrl+bでキャレットを移動しようとすると検索窓が閉じてしまいます。個人的にはこの挙動は望んでいません。

しかし、VSCodeのショートカット一覧の画面かCtrl + fなどで調べてみても、該当するものが多すぎてどれかわかりません(そして基本的には必要なので手を加えたくない)。

方法としては自分Ctrl+fにキャレット移動するように指定する方法も考えましたが、優先度の問題もあり可能であれば、やはり指定して無効化するのが正攻法です。

実際やったこと

まずキーボードショートカットについてはここ(Visual Studio Code Key Bindings)に書いてあります。

そして何が発火するか調べる方法はここ(Visual Studio Code Key Bindings#troubleshooting-keybindings)にあります。

実際にやってみましょう。

コマンドパレットを開いて

Developer: Toggle Keyboard Shortcuts Troubleshootingと入力します。全て入力しなくても途中でサジェストされると思います。

実行すると、ログが流れるパネルが表示されます。これを表示したまま、今回、何のコマンドが発火しているかわからないコマンドを実際に発火させます。

前述の自分の例でいえば Cmd+f`で検索窓を開き、何文字か入力したあとCtrl + bを入力してみます。

そうすると沢山でるログを丁寧に見ていくと、

[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.executeCommandswhen: 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からこの記述を削除すればまた元のように動作しますし、一覧にも表示されるようになります。

やってみた結果

これで無事発火しなくなりました。あとはCtrl+fのほうも潰してやれば良さそうです。ちなみにVSCodeの拡張ではなく、VSCodeそのものが持つデフォルトショートカットはここ(Visual Studio Code Key Bindings#default-keyboard-shortcuts)を見ると良いですね。

簡易的にはここ(Visual Studio Code Tips and Tricks#keyboard-reference-sheets)に一覧も用意されています。便利ですね。

Open: keyboard shortcutから開くGUIによるエディタの「ソース」が規定になっていても拡張で入るものもあるのでVSCode本来のデフォルトショートカットは上記のリンクで確認するのが正しそうです。

感想

実はこういう発想に至ったのも以前僕はAtomをメインで使っていた時期があり、Atomでは何が発火したか表示する機能があったんですね。なのでそれと同じことができれば、という発想になりました。

キーバインドのカスタマイズは上手く自分の手になじむものでないとツライですし、なにより意図せず発火するのはもっとツライですね。

これでようやくEmacキーバインドのVSCodeがストレスなく使えるようになりました、万歳!

JavaScriptで正確に文字数をカウントするRSpecをちょっと楽に書くためにaggregate_failuresとRequestDescriberを設定する