こんにちは、統合ターミナルのショートカットが微妙に噛み合わないと気になってしまうアーキテクトのやまぱん!です 😅
補足コメントや質問、いいね、拡散、ぜひお願いします 🥺!
間違っていたら 優しく 教えてください!
TL;DR
- Windows の VS Code 統合ターミナルでは、
Ctrl + Lが PowerShell 単体と同じ感覚では効かないことがありました - 私の環境では、シェルに制御文字を送るより VS Code 側のコマンドに寄せる方が素直に動きました
-
sendSequenceで\u000cを送る案は試せますが、今回は^L表示になってハマりました - 切り分けは
PSReadLineの割り当て確認 →keybindings.json確認 → Keyboard Shortcuts Troubleshooting の順で見ると進めやすいです
先に結論
今回の小ネタ、結論はかなりシンプルです。
VS Code の統合ターミナルで Ctrl + L を効かせたいなら、PowerShell 単体と同じ前提で考えるより、VS Code 側のショートカットとして設定した方が早かった です。
少なくとも私の Windows 環境では、この形がいちばんすっきり動きました。
設定はこれだけです。
{
"key": "ctrl+l",
"command": "workbench.action.terminal.clear",
"when": "terminalFocus"
}
症状
やりたかったこと自体は単純で、PowerShell みたいに VS Code の統合ターミナルでも Ctrl + L を普通に使いたかっただけです。
でも実際には、期待通りに動きませんでした。
- PowerShell 単体では
Ctrl + Lで画面クリアできる - VS Code の統合ターミナルでは同じ感覚で使えない
- 最初は
Ctrl + Lを送れていないのか、PowerShell 側の設定なのか切り分けがつきにくい
こういう時、つい「PowerShell の設定が違うのかな」と思いたくなります。でも今回は、そこが本丸ではありませんでした。
まず見たこと
最初に確認したのは、PowerShell 側で Ctrl + L がどう見えているかです。
Get-PSReadLineKeyHandler -Chord Ctrl+l | Format-List *
これで、PowerShell 単体では Ctrl + L が PSReadLine の ClearScreen に割り当たっていることを確認できました。
つまり、PowerShell 側の「本来の意味」はちゃんとあります。
次に見たのが VS Code 側です。
- User の
keybindings.jsonにCtrl + Lの上書きがあるか - 設定や拡張機能で露骨に奪っているものがないか
- VS Code が実際にどのキーイベントを受けて、どのコマンドに解決しているか
最後の確認で便利なのが、VS Code 公式ドキュメントにもある Keyboard Shortcuts Troubleshooting です。これを使うと、「押したキーがどう解釈され、どのコマンドに解決されたか」をログで追えます。
ここまで見ると、今回のポイントはかなりはっきりしました。
原因の見立て
私の環境では、Ctrl + L は PowerShell にそのまま渡るというより、VS Code 側で先にキー処理されている と見るのが自然でした。
なので、PowerShell に「クリア文字を送りたい」と考えるより、VS Code の統合ターミナルでこのショートカットをどう効かせたいか に寄せた方が筋が良かったです。
ここを PowerShell のショートカット問題として扱うと、少し遠回りになります。
最初に試した sendSequence
VS Code のターミナルには、キーに対して制御文字を送る workbench.action.terminal.sendSequence があります。公式ドキュメントでも、たとえば Cmd + . を Ctrl + C 相当にする例が紹介されています。
なので最初は、Ctrl + L でも同じ発想でいけるかなと思いました。
{
"key": "ctrl+l",
"command": "workbench.action.terminal.sendSequence",
"when": "terminalFocus",
"args": { "text": "\u000c" }
}
ただ、私の環境ではこれが期待通りに効きませんでした。
- 画面が消えるのではなく
^Lがそのまま見える - 少なくとも「PowerShell の
ClearScreenを再現できた」とは言いにくい
ここは「sendSequence が悪い」というより、sendSequence はあくまで文字列や制御コードを送る仕組みで、統合ターミナルの見た目を消す目的とは少しレイヤーが違う と捉える方が納得しやすかったです。
最終的にこれで落ち着いた
そこで、Ctrl + L に VS Code の画面クリアコマンドを直接割り当てました。
{
"key": "ctrl+l",
"command": "workbench.action.terminal.clear",
"when": "terminalFocus"
}
これに変えると、統合ターミナルの画面クリアとしては期待通りに動きました。
今回の話は、「PowerShell で Ctrl + L を再現する」よりも、VS Code の統合ターミナルで Ctrl + L をちゃんと効かせる のが目的でした。なので、この着地の方が実用上はかなり良かったです。
小ネタとして何が便利か
この手のハマりどころ、地味ですが結構ありますよね。
- PowerShell 単体では効く
- VS Code の統合ターミナルだと同じにならない
- でも原因はシェルではなく VS Code 側のキー解決かもしれない
このパターンを一度整理しておくと、Ctrl + L 以外のショートカットでも切り分けしやすくなります。
特に便利だったのは、次の順で見ることです。
- PowerShell /
PSReadLine側の割り当てを確認する -
keybindings.jsonの上書きを確認する - Keyboard Shortcuts Troubleshooting で、VS Code が何を解決したかを見る
- シェルに寄せるべきか、VS Code コマンドに寄せるべきかを決める
「制御文字を送る」より「UI コマンドに寄せる」が正解なケース、思ったよりあります。
前提環境
今回の観測は、次の前提で確認しました。
- Windows
- VS Code の統合ターミナル
- PowerShell
-
PSReadLine利用あり
なので、macOS や Linux、あるいは Bash / zsh では同じ結論にならないかもしれません。そこは 私の環境ではこうだった として読んでもらうのが安全です。
参考
- VS Code docs: Keyboard shortcuts for Visual Studio Code
- VS Code docs: Terminal Basics
まとめ
Ctrl + L が VS Code の統合ターミナルで効かない時、最初は PowerShell 側を疑いたくなります。でも今回いちばん効いたのは、PowerShell の再現より、VS Code 側のショートカット設定として整理する ことでした。
こういう小さいハマりどころ、調べ終わると一行設定で終わるんですが、切り分けに入る前は意外と時間を持っていかれますよね 😅
同じように「PowerShell では効くのに、VS Code の統合ターミナルだと微妙に違う」という場面があれば、まずは Keyboard Shortcuts Troubleshooting を見てみるのがおすすめです。