VSCodeで "ctrl+s" を押してしまいターミナルが反応しなくなったが、"ctrl+q" のシグナルが送信できず解除できない


経緯

VSCodeのターミナルからLinuxマシンにSSHしている場合において、ターミナルにフォーカスしたまま ctrl+sを押すと、ターミナルの出力がロックされる(詳細)。

通常 ctrl+q を入力することで この出力ロックの状態を解除することができるが、ctrl+q はVSCodeのデフォルトショートカットとして割り当てられているため、解除ができない。

解決方法

keybindings.json に以下のように追記することで、ctrl+q のデフォルトショートカットを無効化することができる。

 // Place your key bindings in this file to override the defaults
 [
+    { "key": "ctrl+q", "command": "-workbench.action.quickOpenView" }
 ]

Command Paletteに以下のように打ち込んで、JSONを開き、上記を追記する。

ショートカットを無効化した状態で ctrl+q を押すと、ターミナル出力のロックを解除することができる。

詳細

デフォルトで割り当てられているキーボードショットカットは、同様にJSONファイルを開いて確認できる。

今回の設定であれば、以下のように記載されていることを確認できる(一部略)

{
  { "key": "ctrl+q", "command": "workbench.action.quickOpenView" },
}

デフォルト設定は書き換えられない。
そのため、ショートカットキー設定において頭に - をつけ、今回はこのショートカットを無効化している。

 // Place your key bindings in this file to override the defaults
 [
+    { "key": "ctrl+q", "command": "-workbench.action.quickOpenView" }
 ]

余談

この ctrl+sですが、以下のような経緯で実装されているようです。

この「Ctrl+S」による画面出力の停止ですが、起源は「テレプリンター」にあります。かつて、コンピューターからの文字出力は「ディスプレイへ表示」ではなく「プリンターへ印字」されていました。プリントを一時的にストップしたい場合に「Ctrl+S」で停止し、「Ctrl+Q」で再開していたわけです。その後、ディスプレイへと置き換わった後も、今の端末ほどスクロール機能は充実していなかったことから、「Ctrl+S」で出力を止めて内容を確認し、「Ctrl+Q」を押して出力を再開するという形で使われました。

https://linuxfan.info/disable-ctrl-s

引用元の記事ではこれを停止する方法について解説されているので、そもそも ctrl+sを押しても出力が停止しないよう、設定を変更するという解決方法のほうが望ましいかもしれません。

参考