ターミナルの詳細設定
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 などのキーボードショートカットによる 検索 が無効になることに注意してください。
コード(Chords)
コードキーボードショートカットは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"
}
ニーモニック(Mnemonics)
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 設定で無効にできます。
VS Codeインスタンス間の環境変数
複数のVS Codeインスタンスを起動すると、環境変数はそれらの間で共有されます。
- 最初のVS Codeインスタンスは、親プロセス(VS Codeを起動したシェルやアプリケーション)から環境変数を継承します。
- 後続のVS Codeインスタンスは、親プロセスからではなく、実行中の最初のVS Codeインスタンスから環境変数を継承します。
VS Codeインスタンス間で環境変数を分離するには、--user-data-dir コマンドラインオプションを使用して、各インスタンスを個別のユーザーデータディレクトリで実行します。これにより、各インスタンスが独自の環境、設定、拡張機能を維持できるようになります。
$LANG との相互作用
ターミナルでの文字の表示方法を決定する $LANG 環境変数との特殊な相互作用があります。この機能は terminal.integrated.detectLocale 設定で構成されます。
| 値 | の動作 |
|---|---|
on |
$LANG を常に最も望ましい値に設定します。選択される値は、UTF-8エンコーディングを使用したオペレーティングシステムのロケール(フォールバックとして en-US)に基づきます。 |
auto(デフォルト) |
$LANG が適切に構成されていない(UTFまたはEUCエンコーディングに設定されていない)場合、on と同様の動作で $LANG を設定します。 |
オフ |
$LANG を変更しません。 |
拡張機能による環境への寄与
拡張機能はターミナル環境に貢献でき、これによりターミナルとのある程度の統合を提供できます。例えば、組み込みのGit拡張機能は GIT_ASKPASS 環境変数を注入し、VS CodeがGitリモートへの認証を処理できるようにします。
拡張機能がターミナル環境を変更した場合、安全であれば既存のターミナルが再起動され、そうでない場合はターミナルのステータスに警告が表示されます。変更に関する詳細はホバーで確認でき、そこには再起動ボタンも含まれています。

WindowsとConPTY
VS Codeのターミナルは、Unixスタイルのターミナルを実装するために xterm.js プロジェクトに基づいて構築されており、すべてのデータを文字列にシリアル化して「擬似ターミナル(pseudoterminal)」を通じてパイプします。歴史的に、これはWindowsでのターミナルの仕組みではなく、'conhost' と呼ばれるコンソールを実装するために コンソールAPI を使用していました。
UnixスタイルのターミナルとWindowsコンソールの間にエミュレーション/変換レイヤーを提供することでこの問題を解決するために、winpty と呼ばれるオープンソースプロジェクトが作成されました。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 リモート開発 拡張機能を使用してリモートマシンに接続している場合に特有のトピックを概説します。
リモートウィンドウでのローカルターミナル
既定の ローカル ターミナルプロファイルは、コマンドパレットから Terminal: Create New Integrated Terminal (Local)(ターミナル: 新しい統合ターミナルの作成(ローカル))コマンドを使用してリモートウィンドウで起動できます。現在、既定以外のプロファイルをリモートウィンドウから起動することはできません。
リモート入力の遅延を低減(プレビュー)
ローカルエコーは、リモートウィンドウでの入力遅延を緩和する機能です。リモートによって結果が確認される前に、ターミナル内のキーストロークを薄い色で書き込みます。デフォルトでは、遅延が30msを超えるとこの機能が開始されます。タイミングは terminal.integrated.localEchoLatencyThreshold で構成できます。未確認の文字の色は terminal.integrated.localEchoStyle で定義されます。
ローカルエコーは、ターミナルでアクティブなプログラムに応じて動的に無効になります。これは terminal.integrated.localEchoExcludePrograms で制御され、デフォルトは ['vim', 'vi', 'nano', 'tmux'] です。非常に動的である、または入力時に画面の再描画を頻繁に行うアプリケーションやシェルに対しては、この機能を無効にすることをお勧めします。
この機能を完全に無効にするには、以下を使用します。
{
"terminal.integrated.localEchoEnabled": false
}