ターミナルの高度な機能
Visual Studio Code の統合ターミナルには、Unicode や絵文字のサポート、カスタムキーボードショートカット、自動応答など、多くの高度な機能や設定があります。このトピックでは、これらの高度な機能について詳しく説明します。VS Code や統合ターミナルを初めて使用する場合は、まずターミナルの基本のトピックを確認することをお勧めします。
永続的なセッション
ターミナルは、2 種類の永続的なセッションをサポートしています。
- プロセスの再接続: ウィンドウをリロードした際 (たとえば、拡張機能をインストールした後)、前のプロセスに再接続し、その内容を復元します。
- プロセスの復元: VS Code を再起動した際、ターミナルの内容が復元され、プロセスが元の環境を使用して再起動されます。
これらの永続的なセッションはどちらも、terminal.integrated.enablePersistentSessions を false
に設定することで無効にできます。また、復元されるスクロールバックの量は terminal.integrated.persistentSessionScrollback 設定で制御されます。プロセスの復元は、terminal.integrated.persistentSessionReviveProcess で個別に設定できます。
ウィンドウ間でのターミナルの移動
ターミナルタブは、VS Code のウィンドウ間でドラッグアンドドロップできます。これは、コマンドパレットと Terminal: Detach Session (ターミナル: セッションのデタッチ) および Terminal: Attach to Session (ターミナル: セッションにアタッチ) コマンドを使用して手動で行うこともできます。
ターミナルの表示設定
ウィンドウを開くときにターミナルビューが表示されている場合、永続的なセッションを使用してターミナルに再接続するか、新しいシェルを作成します。この動作は、terminal.integrated.hideOnStartup 設定で微調整できます。
never
(デフォルト): 起動時にターミナルビューを非表示にしません。whenEmpty
: 復元された永続的なセッションがない場合にのみターミナルを非表示にします。always
: 復元された永続的なセッションがある場合でも、常にターミナルを非表示にします。
terminal.integrated.hideOnLastClosed 設定も利用でき、最後のターミナルが閉じられたときにターミナルビューを閉じるというデフォルトの動作を上書きできます。
キーボードショートカットとシェル
埋め込みアプリケーションとして、統合ターミナルは VS Code 内でディスパッチされる一部のキーボードショートカットをインターセプトしますが、すべてではありません。
設定可能な terminal.integrated.commandsToSkipShell 設定は、どのコマンドのキーボードショートカットが常に「シェルをスキップ」し、代わりに VS Code のキーボードショートカットシステムによって処理されるべきかを決定します。デフォルトでは、VS Code のエクスペリエンスに不可欠なコマンドのハードコードされたリストが含まれていますが、特定のコマンドを追加または削除できます。
{
"terminal.integrated.commandsToSkipShell": [
// Ensure the toggle sidebar visibility keyboard shortcut skips the shell
"workbench.action.toggleSidebarVisibility",
// Send quick open's keyboard shortcut to the shell
"-workbench.action.quickOpen",
]
}
デフォルトのコマンドの完全なリストについては、terminal.integrated.commandsToSkipShell 設定の詳細をご覧ください。
ヒント: terminal.integrated.sendKeybindingsToShell を設定して terminal.integrated.commandsToSkipShell を上書きし、ほとんどのキーボードショートカットをシェルにディスパッチすることができます。ただし、これにより 検索を開くための Ctrl+F のようなキーボードショートカットが無効になることに注意してください。
コード
コードのキーボードショートカットは、2 つのキーボードショートカットで構成されます。たとえば、Ctrl+K の後に Ctrl+C を押して行をコメントに変更するなどです。コードはデフォルトで常にシェルをスキップしますが、terminal.integrated.allowChords で無効にできます。
macOS の画面クリア
macOS では、Cmd+K はターミナルで画面をクリアするための一般的なキーボードショートカットであるため、VS Code もそれを尊重します。これは Cmd+K のコードが機能しないことを意味します。Cmd+K のコードは、クリアのキーボードショートカットを削除することで有効にできます。
{
"key": "cmd+k",
"command": "-workbench.action.terminal.clear"
}
さらに、このキーボードショートカットは、キーボードショートカットの優先順位の仕組みにより、拡張機能が Cmd+K キーボードショートカットを提供した場合に自動的に上書きされます。この場合に Cmd+K のクリアキーボードショートカットを再度有効にするには、拡張機能のキーボードショートカットよりも優先度が高いユーザーのキーボードショートカットで再定義できます。
{
"key": "cmd+k",
"command": "workbench.action.terminal.clear",
"when": "terminalFocus && terminalHasBeenCreated || terminalFocus && terminalProcessSupported"
}
ニーモニック
VS Code のメニューにアクセスするためのニーモニックの使用 (例: ファイルメニューの Alt+F) は、これらのキーイベントがシェルで重要なホットキーであることが多いため、ターミナルではデフォルトで無効になっています。terminal.integrated.allowMnemonics を設定するとニーモニックが有効になりますが、これによりシェルへの Alt キーイベントがすべて無効になることに注意してください。この設定は macOS では何の効果もありません。
カスタムシーケンスのキーボードショートカット
workbench.action.terminal.sendSequence
コマンドを使用して、シェルによって特別に解釈されるエスケープシーケンスを含む特定のテキストシーケンスをターミナルに送信できます。このコマンドを使用すると、矢印キー、Enter、カーソルの移動などを送信できます。このコマンドはコマンドパレットから実行でき、手動での入力が可能ですが、引数を指定してカスタムキーボードショートカットを割り当てると最も便利です。
たとえば、以下のシーケンスはカーソルの左側の単語を飛び越え (Ctrl+Left)、その後 Backspace を押します。
{
"key": "ctrl+u",
"command": "workbench.action.terminal.sendSequence",
"args": {
"text": "\u001b[1;5D\u007f"
}
}
この機能は変数の置換をサポートしています。
sendSequence
コマンドは、文字コードによる文字の使用には \u0000
形式のみをサポートします (\x00
ではありません)。これらの 16 進コードとターミナルシーケンスの詳細については、以下のリソースを参照してください。
カスタムシグナルの送信
workbench.action.terminal.sendSignal
コマンドを使用して、アクティブなターミナルのフォアグラウンドプロセスに任意のシグナルを送信できます。
たとえば、以下のキーバインディングは SIGTERM
を送信し、プロセスを正常に終了させます。
{
"key": "ctrl+shift+/",
"command": "workbench.action.terminal.sendSignal",
"args": {
"signal": "SIGTERM"
}
}
確認ダイアログ
不要な出力やユーザープロンプトを避けるため、ターミナルはプロセス終了時に警告ダイアログを表示しません。警告が必要な場合は、以下の設定で構成できます。
- terminal.integrated.confirmOnExit - アクティブなデバッグセッションがある場合にウィンドウを閉じるときに確認するかどうかを制御します。
- terminal.integrated.confirmOnKill - 子プロセスを持つターミナルを強制終了するときに確認するかどうかを制御します。
- terminal.integrated.showExitAlert - 終了コードが 0 以外の場合に「ターミナルプロセスは終了コード...で終了しました」というアラートを表示するかどうかを制御します。
自動応答
ターミナルは、正確な出力シーケンスを受信した場合に、設定可能な入力応答を自動的にシェルに提供できます。最も一般的な使用例は、バッチジョブを終了するかどうかを尋ねるバッチスクリプトで Ctrl+C を押したときのプロンプトに自動的に応答することです。このメッセージを自動的に無視するには、次の設定を追加します。
{
"terminal.integrated.autoReplies": {
"Terminate batch job (Y/N)": "Y\r"
}
}
ここで使用されている \r
文字は Enter を意味し、カスタムシーケンスのキーボードショートカットと同様に、この機能はエスケープシーケンスをシェルに送信することをサポートしています。
シェルへの入力はユーザーによる明示的なアクションまたは設定であるべきなので、デフォルトでは自動応答は設定されていません。
タブストップ幅の変更
terminal.integrated.tabStopWidth 設定を使用すると、ターミナルで実行されているプログラムが \t
を出力するときのタブストップ幅を設定できます。プログラムは Tab 文字を使用する代わりにカーソルを移動させることが多いため、通常はこれは必要ありませんが、一部の状況では役立つ場合があります。
Unicode と絵文字のサポート
ターミナルは Unicode と絵文字の両方をサポートしています。これらの文字をターミナルで使用する場合、そのサポートにはいくつかの注意点があります。
- 一部の Unicode 記号には、Unicode のバージョンによって幅が変わる可能性のある曖昧な幅があります。現在、Unicode バージョン 6 と 11 の幅をサポートしており、terminal.integrated.unicodeVersion 設定で構成できます。指定するバージョンは、シェル/オペレーティングシステムで使用されている Unicode バージョンと一致させる必要があります。そうしないと、レンダリングの問題が発生する可能性があります。シェル/OS の Unicode バージョンは、フォントの実際の幅と一致しない場合があることに注意してください。
- 肌の色の修飾子など、複数の文字で構成される一部の絵文字は正しくレンダリングされない場合があります。
- Windows での絵文字のサポートは限定的です。
画像サポート
ターミナル内の画像は、Sixel または iTerm インライン画像プロトコルのいずれかを使用している場合に機能します。この機能はデフォルトで無効になっており、terminal.integrated.enableImages 設定で有効にできます。
現在の制限事項
- シリアライズは機能しないため、ターミナルをリロードしても画像は保持されません (jerch/xterm-addon-image#47)。
- 選択範囲を HTML としてコピーしても、選択された画像は含まれません (jerch/xterm-addon-image#50)。
- アニメーション GIF は機能しません (jerch/xterm-addon-image#51)。
- セルよりも短い画像は正しく機能しません。これはシーケンスの設計上の欠陥であり、XTerm でも発生します。
プロセス環境
ターミナル内で実行されているアプリケーションのプロセス環境は、さまざまな設定や拡張機能の影響を受け、VS Code ターミナルでの出力が他のターミナルと異なるように見えることがあります。
環境の継承
VS Code が開かれると、シェル環境を読み込むためにログインシェル環境を起動します。これは、開発者ツールが ~/.bash_profile
のようなシェル起動スクリプトで $PATH
に追加されることが多いためです。デフォルトでは、ターミナルはプロファイルのシェル引数に応じてこの環境を継承します。これは、複数のプロファイルスクリプトが実行された可能性があり、予期しない動作を引き起こす可能性があることを意味します。
この環境の継承は、macOS と Linux では terminal.integrated.inheritEnv 設定で無効にできます。
$LANG
との相互作用
ターミナルでの文字の表示方法を決定する $LANG
環境変数との特別な相互作用があります。この機能は terminal.integrated.detectLocale 設定で構成されます。
値 | 動作 |
---|---|
on |
常に $LANG を最も一般的に望まれる値に設定します。選択される値は、オペレーティングシステムのロケール (en-US にフォールバック) と UTF-8 エンコーディングに基づきます。 |
auto (デフォルト) |
$LANG が適切に設定されていない場合 (UTF または EUC エンコーディングに設定されていない場合)、on の動作と同様に $LANG を設定します。 |
off |
$LANG を変更しません。 |
拡張機能による環境への貢献
拡張機能はターミナル環境に貢献することができ、ターミナルとの統合を提供できます。たとえば、組み込みの Git 拡張機能は GIT_ASKPASS
環境変数を注入し、VS Code が Git リモートへの認証を処理できるようにします。
拡張機能がターミナル環境を変更した場合、安全であれば既存のターミナルは再起動されます。そうでない場合は、ターミナルのステータスに警告が表示されます。変更に関する詳細はホバーで表示でき、そこには再起動ボタンも含まれています。
Windows と ConPTY
VS Code のターミナルは、xterm.js プロジェクトに基づいて構築されており、すべてのデータを文字列にシリアライズし、「疑似ターミナル」を介してパイプする Unix スタイルのターミナルを実装しています。歴史的に、これは Windows でのターミナルの動作方法ではありませんでした。Windows はコンソール API を使用して、「conhost」と呼ばれるコンソールを実装していました。
winpty と呼ばれるオープンソースプロジェクトが、Unix スタイルのターミナルと Windows コンソールの間にエミュレーション/変換レイヤーを提供することで、この問題を解決しようとして作成されました。VS Code のターミナルは、当初 winpty のみを使用して実装されていました。これは当時としては素晴らしいものでしたが、2018 年に Windows 10 は ConPTY API を受け取りました。これは winpty が先駆けたアイデアを取り入れ、Windows に組み込むことで、Windows 上で Unix スタイルのターミナルやアプリを活用するためのより信頼性が高くサポートされたシステムを提供しました。
VS Code は Windows 10+ (ビルド番号 18309 から) で ConPTY をデフォルトで使用し、古いバージョンの Windows のレガシーオプションとして winpty にフォールバックします。ConPTY は terminal.integrated.windowsEnableConpty 設定で明示的に無効にできますが、通常は避けるべきです。
ConPTY はエミュレーションレイヤーであるため、いくつかの癖があります。最も一般的なのは、ConPTY が自身をビューポートの所有者と見なし、そのために時々画面を再描画することです。この再描画により、Terminal: Clear (ターミナル: クリア) コマンドを実行した後に古いコンテンツが表示されるなど、予期しない動作が発生する可能性があります。
リモート開発
このセクションでは、VS Code が VS Code リモート開発拡張機能を使用してリモートマシンに接続している場合に特有のトピックについて概説します。
リモートウィンドウでのローカルターミナル
デフォルトのローカルターミナルプロファイルは、コマンドパレットから Terminal: Create New Integrated Terminal (Local) (ターミナル: 新しい統合ターミナルを作成 (ローカル)) コマンドを使用してリモートウィンドウで起動できます。現在、デフォルト以外のプロファイルはリモートウィンドウから起動できません。
リモート入力の遅延を削減 (プレビュー)
ローカルエコーは、リモートウィンドウでの入力遅延を軽減するのに役立つ機能です。リモートからの結果が確認される前に、キーストロークを薄い色でターミナルに書き込みます。デフォルトでは、遅延が 30 ミリ秒を超えると検出されたときに機能が実行を開始し、タイミングは terminal.integrated.localEchoLatencyThreshold で設定できます。未確認の文字の色は terminal.integrated.localEchoStyle で定義されます。
ローカルエコーは、ターミナルでアクティブなプログラムに応じて動的に自身を無効にします。これは terminal.integrated.localEchoExcludePrograms によって制御され、デフォルトは ['vim', 'vi', 'nano', 'tmux']
です。非常に動的で、入力時に画面を頻繁に再描画するアプリケーションやシェルに対しては、この機能を無効にすることをお勧めします。
この機能を完全に無効にするには、次を使用します。
{
"terminal.integrated.localEchoEnabled": false
}