に参加して、VS Code の AI 支援開発について学びましょう。

ターミナルの高度な機能

Visual Studio Code の統合ターミナルには、Unicode と絵文字のサポート、カスタムキーボードショートカット、自動応答など、多くの高度な機能と設定があります。このトピックでは、これらの高度な機能について詳しく説明します。VS Code または統合ターミナルを初めて使用する場合は、まずターミナルの基本のトピックを確認することをお勧めします。

永続的なセッション

ターミナルは、2 種類の永続的なセッションをサポートしています。

  • プロセスの再接続: ウィンドウをリロードすると (たとえば、拡張機能をインストールした後)、以前のプロセスに再接続し、その内容を復元します。
  • プロセスの復活: VS Code を再起動すると、ターミナルの内容が復元され、元の環境を使用してプロセスが再起動されます。

これらの永続的なセッションはどちらも、terminal.integrated.enablePersistentSessionsfalse に設定することで無効にでき、復元されるスクロールバックの量は 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 コマンドは、文字コードを介して文字を使用する場合、\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 - 終了コードがゼロ以外の場合に「ターミナルプロセスが終了コードで終了しました」という警告を表示するかどうかを制御します。

自動応答

ターミナルは、特定の出力シーケンスが受信された場合、シェルに設定可能な入力応答を自動的に提供できます。最も一般的な使用例は、バッチジョブを終了するかどうかをユーザーに尋ねるバッチスクリプトで 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 設定で有効にできます。

現在の制限

プロセス環境

ターミナル内で実行されるアプリケーションのプロセス環境は、さまざまな設定や拡張機能の影響を受け、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 リモートへの認証を処理できるようにします。

拡張機能がターミナル環境を変更すると、安全であれば既存のターミナルは再起動されます。そうでない場合は、ターミナルステータスに警告が表示されます。変更に関する詳細情報はホバーで確認でき、再起動ボタンも含まれています。

A warning icon appears next to the terminal tab when a relaunch is required, information on the changes can be viewed by hovering it

Windows と ConPTY

VS Code のターミナルは、すべてのデータを文字列にシリアル化して「疑似ターミナル」を介してパイプする Unix スタイルのターミナルを実装するために、xterm.js プロジェクトに基づいて構築されています。歴史的に、これは 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
}
© . This site is unofficial and not affiliated with Microsoft.