ターミナル高度な機能
Visual Studio Code の統合ターミナルには、Unicode と絵文字のサポート、カスタムキーボードショートカット、自動応答など、多くの高度な機能と設定があります。このトピックでは、これらの高度な機能について詳しく説明します。VS Code または統合ターミナルを初めて使用する場合は、最初にターミナルの基本トピックを確認することをお勧めします。
永続的なセッション
ターミナルは、2 つの異なるタイプの永続的なセッションをサポートしています。
- プロセス再接続: ウィンドウをリロードすると (たとえば、拡張機能をインストールした後)、以前のプロセスに再接続し、その内容を復元します。
- プロセス復元: VS Code を再起動すると、ターミナルの内容が復元され、プロセスは元の環境を使用して再起動されます。
これらの永続的なセッションはどちらも、terminal.integrated.enablePersistentSessions を false
に設定すると無効にできます。復元されるスクロールバックの量は、terminal.integrated.persistentSessionScrollback 設定によって制御されます。プロセス復元は、terminal.integrated.persistentSessionReviveProcess を使用して個別に構成できます。
ウィンドウ間でのターミナルの移動
ターミナルタブは、VS Code ウィンドウ間でドラッグアンドドロップできます。これは、コマンドパレットと [ターミナル: セッションのデタッチ] および [ターミナル: セッションへのアタッチ] コマンドを使用して手動で行うこともできます。
ターミナルの表示設定
ウィンドウを開くときに、ターミナルビューが表示されている場合、永続的なセッションを使用してターミナルに再接続するか、新しいシェルを作成します。この動作は、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
コマンドは、文字コードを介して文字を使用する場合 (\x00
ではなく) \u0000
形式でのみ機能します。これらの 16 進コードとターミナルシーケンスの詳細については、次のリソースを参照してください。
確認ダイアログ
不要な出力とユーザープロンプトを回避するために、ターミナルはプロセスが終了しても警告ダイアログを表示しません。警告が必要な場合は、次の設定で構成できます。
- terminal.integrated.confirmOnExit - アクティブなデバッグセッションがある場合にウィンドウを閉じるときに確認するかどうかを制御します。
- terminal.integrated.confirmOnKill - 子プロセスがある場合にターミナルを強制終了するときに確認するかどうかを制御します。
- terminal.integrated.showExitAlert - 終了コードがゼロ以外の場合に "ターミナルプロセスが終了コードで終了しました" というアラートを表示するかどうかを制御します。
自動応答
ターミナルは、構成可能な入力応答をシェルに自動的に提供できます (正確な出力シーケンスが受信された場合)。最も一般的なユースケースは、バッチジョブを終了するかどうかをユーザーに尋ねるバッチスクリプトで 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 バージョンと一致する必要があります。そうしないと、レンダリングの問題が発生する可能性があります。シェルの Unicode バージョン/OS がフォントの実際の幅と一致しない場合があることに注意してください。
- 複数の文字で構成される一部の絵文字は、正しくレンダリングされない場合があります (たとえば、肌の色の修飾子)。
- 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 設定で構成されます。
値 | 動作 |
---|---|
オン |
$LANG を最も一般的な目的の値に常に設定します。選択された値は、オペレーティングシステムのロケール (en-US にフォールバック) に基づいており、UTF-8 エンコーディングを使用します。 |
auto (デフォルト) |
$LANG が適切に構成されていない場合 (UTF または EUC エンコーディングに設定されていない場合)、on の動作と同様に $LANG を設定します。 |
オフ |
$LANG を変更しません。 |
拡張機能環境のコントリビューション
拡張機能は、ターミナル環境に貢献することができ、ターミナルとの統合を提供できます。たとえば、組み込みの Git 拡張機能は、VS Code が Git リモートへの認証を処理できるように、GIT_ASKPASS
環境変数を挿入します。
拡張機能がターミナル環境を変更すると、既存のターミナルは安全な場合に再起動されます。安全でない場合は、ターミナルステータスに警告が表示されます。変更に関する詳細情報はホバーで表示でき、再起動ボタンも含まれています。
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 が自身をビューポートの所有者と見なしているため、画面を再印刷することがあることです。この再印刷により、[ターミナル: クリア] コマンドを実行した後で古いコンテンツが表示されるなど、予期しない動作が発生する可能性があります。
リモート開発
このセクションでは、VS Code リモート開発拡張機能を使用して VS Code がリモートマシンに接続されている場合に固有のトピックについて概説します。
リモートウィンドウのローカルターミナル
デフォルトのローカルターミナルプロファイルは、コマンドパレットから [ターミナル: 新しい統合ターミナルの作成 (ローカル)] コマンドを使用してリモートウィンドウで起動できます。現在、デフォルト以外のプロファイルはリモートウィンドウから起動できません。
リモート入力遅延の削減 (プレビュー)
ローカルエコーは、リモートウィンドウでの入力遅延を軽減するのに役立つ機能です。リモートによって結果が確認される前に、ターミナルにキーストロークを薄暗い色で書き込みます。デフォルトでは、遅延が 30 ミリ秒を超えていることが検出されると機能が開始され、タイミングは terminal.integrated.localEchoLatencyThreshold で構成できます。未確認の文字の色は、terminal.integrated.localEchoStyle によって定義されます。
ローカルエコーは、ターミナルでアクティブなプログラムに応じて動的に無効になります。これは、terminal.integrated.localEchoExcludePrograms によって制御され、デフォルトは ['vim', 'vi', 'nano', 'tmux']
です。高度に動的で、入力時に画面の再印刷を多く行うアプリケーションまたはシェルでは、この機能を無効にすることをお勧めします。
機能を完全に無効にするには、次を使用します。
{
"terminal.integrated.localEchoEnabled": false
}