高度なターミナル
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
コマンドは、文字コード(\x00
ではない)を使用して文字を扱うための\u0000
形式でのみ機能します。これらの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 - 終了コードがゼロでない場合に「ターミナルプロセスが終了コードで終了しました」というアラートを表示するかどうかを制御します。
自動返信
ターミナルは、正確な出力シーケンスを受信した場合に、シェルに対して設定可能な入力応答を自動的に提供できます。最も一般的な使用例は、ユーザーがバッチジョブを終了するかどうかを尋ねるバッチスクリプトで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 を常に最も一般的に望ましい値に設定します。選択される値は、UTF-8 エンコーディングを使用するオペレーティングシステムのロケール (en-US にフォールバック) に基づいています。 |
auto (既定) |
$LANG が適切に設定されていない場合 (UTF または EUC エンコーディングに設定されていない場合)、on の動作と同様に $LANG を設定します。 |
off |
$LANG を変更しません。 |
拡張機能による環境への貢献
拡張機能はターミナル環境に貢献でき、ターミナルとの統合を提供できます。たとえば、組み込みの Git 拡張機能は、VS Code が Git リモートへの認証を処理できるように、GIT_ASKPASS
環境変数を挿入します。
拡張機能がターミナル環境を変更した場合、既存のターミナルは安全であれば再起動され、そうでない場合はターミナルステータスに警告が表示されます。変更に関する詳細はホバーで表示でき、再起動ボタンも含まれています。
Windows と ConPTY
VS Code のターミナルは、すべてのデータを文字列にシリアル化して「擬似ターミナル」を介してパイプする Unix スタイルのターミナルを実装するために、xterm.js プロジェクトを基盤として構築されています。歴史的に、これは 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 ms を超えると検出されたときに機能が実行され始め、タイミングはterminal.integrated.localEchoLatencyThreshold で構成できます。未確認の文字の色はterminal.integrated.localEchoStyle で定義されます。
ローカルエコーは、ターミナルでアクティブなプログラムに応じて動的に無効化されます。これはterminal.integrated.localEchoExcludePrograms で制御され、既定値は ['vim', 'vi', 'nano', 'tmux']
です。非常に動的で、入力時に画面の再描画を頻繁に行うアプリケーションやシェルについては、この機能を無効にすることをお勧めします。
この機能を完全に無効にするには、次を使用します。
{
"terminal.integrated.localEchoEnabled": false
}