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

ターミナルシェル統合

Visual Studio Code には、一般的なシェルと統合する機能があり、ターミナルがシェル内で実際に何が起こっているかをより理解できるようになります。この追加情報により、作業ディレクトリの検出やコマンド検出、装飾ナビゲーションなど、いくつかの便利な機能が利用可能になります。

サポートされているシェル

  • Linux/macOS: bash, fish, pwsh, zsh
  • Windows: Git Bash, pwsh

インストール

スクリプトの自動注入

デフォルトでは、シェル統合スクリプトは VS Code から起動されたサポート対象のシェルで自動的にアクティブ化されます。これは、シェルセッションの起動時に引数や環境変数を注入することによって行われます。この自動注入は、terminal.integrated.shellIntegration.enabledfalse に設定することで無効にできます。

この標準的で簡単な方法は、サブシェル、通常の ssh セッション(Remote - SSH 拡張機能を使用していない場合)、または一部の複雑なシェル設定などの高度なユースケースでは機能しません。これらの場合にシェル統合を有効にする推奨される方法は、手動インストールです。

: 自動注入は、古いバージョンのシェルでは機能しない場合があります。たとえば、古いバージョンの fish は、注入の仕組みである $XDG_DATA_DIRS 環境変数をサポートしていません。手動でインストールして動作させることはまだ可能です。

手動インストール

シェル統合を手動でインストールするには、VS Code シェル統合スクリプトをシェルの初期化時に実行する必要があります。これを行う場所と方法は、使用しているシェルと OS によって異なります。手動インストールを使用する場合は、terminal.integrated.shellIntegration.enabledfalse に設定することをお勧めしますが、必須ではありません。

ヒント: Insiders ビルドを使用している場合は、以下の codecode-insiders に置き換えてください。

bash

次の行を ~/.bashrc ファイルに追加します。bash で code ~/.bashrc を実行して、VS Code でファイルを開きます。

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

fish

次の行を config.fish に追加します。fish で code $__fish_config_dir/config.fish を実行して、VS Code でファイルを開きます。

string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish)

pwsh

次の行を PowerShell プロファイルに追加します。pwsh で code $Profile を実行して、VS Code でファイルを開きます。

if ($env:TERM_PROGRAM -eq "vscode") { . "$(code --locate-shell-integration-path pwsh)" }

zsh

次の行を ~/.zshrc ファイルに追加します。zsh で code ~/.zshrc を実行して、VS Code でファイルを開きます。

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"

Git Bash

次の行を ~/.bashrc ファイルに追加します。Git Bash で code ~/.bashrc を実行して、VS Code でファイルを開きます。

[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"

ポータビリティとパフォーマンス

上記のシェル統合のインストールはクロスプラットフォームであり、code$PATH に含まれていれば、あらゆるインストールタイプと互換性があります。ただし、この推奨される方法は、スクリプトパスを取得するために Node.js を起動するため、シェル起動にわずかな遅延が発生します。この遅延を軽減するには、事前にパスを解決し、初期化スクリプトに直接追加して、上記のスクリプトをインライン化します。

# Output the executable's path first:
code --locate-shell-integration-path bash

# Add the result of the above to the source statement:
[[ "$TERM_PROGRAM" == "vscode" ]] && . "/path/to/shell/integration/script.sh"

シェル統合の品質

シェル統合を使用する場合、その機能を示す「品質」が関連付けられます。これらの品質は、シェル統合スクリプトの動作によって決定されます。

  • なし: シェル統合はアクティブではありません。
  • リッチ: シェル統合がアクティブで、コマンド検出が理想的な方法で機能しています。
  • ベーシック: シェル統合はアクティブですが、コマンド検出がすべての機能をサポートしていない可能性があります。たとえば、コマンド実行場所は検出されますが、終了ステータスは検出されません。

シェル統合の品質を表示するには、ターミナルタブにマウスを合わせます。必要に応じて、ホバー時に詳細を表示を選択すると、より詳細な情報が表示されます。

コマンドの装飾と概要ルーラー

シェル統合によって可能になることの 1 つは、ターミナル内で実行されたコマンドの終了コードを取得できることです。この情報を使用して、コマンドが成功したか失敗したかを示す装飾が行の左側に追加されます。これらの装飾は、エディターと同様に、スクロールバーの比較的新しい概要ルーラーにも表示されます。

Blue circles appear next to successful commands, red circles with crosses appear next to failed commands. The color of the circles appears in the scroll bar

装飾は、コマンドの再実行のようなコンテキストアクションを実行するために操作できます。

Clicking a successful command decoration shows a context menu containing items: Copy Output, Copy Output as HTML, Rerun Command and How does this work?

コマンドと概要ルーラーの装飾は、terminal.integrated.shellIntegration.decorationsEnabled 設定で構成できます。

コマンドナビゲーション

シェル統合によって検出されたコマンドは、コマンドナビゲーション機能 (Ctrl/Cmd+UpCtrl/Cmd+Down) にフィードされ、より信頼性の高いコマンド位置を提供します。この機能により、コマンド間の迅速なナビゲーションと出力の選択が可能になります。現在の位置からコマンドまで選択するには、Shift を押し続けて、Shift+Ctrl/Cmd+UpShift+Ctrl/Cmd+Down を押すこともできます。

コマンドガイド

コマンドガイドは、コマンドとその出力にマウスを合わせたときに表示されるバーです。これにより、コマンドをより迅速に識別でき、シェル統合が正しく機能しているかを確認する方法にもなります。

Screenshot of the terminal, highlighting the command guide vertical bar on the left-hand side to indicate the boundary of a command.

カラーテーマを使用して、コマンドガイドの色をカスタマイズできます。コマンドガイドを切り替えるには、terminal.integrated.shellIntegration.showCommandGuide 設定を構成します。

スティッキースクロール

スティッキースクロール機能は、ターミナル上部に部分的に表示されているコマンドを「固定」し、その出力がどのコマンドに属するかをはるかに見やすくします。スティッキースクロールコンポーネントをクリックすると、ターミナルバッファ内のコマンドの場所にスクロールします。

Sticky scroll will show the command at the top of the terminal viewport

これは、terminal.integrated.stickyScroll.enabled 設定で有効にできます。

クイックフィックス

VS Code はコマンドの出力をスキャンし、ユーザーが次に実行したい可能性が高いアクションを含むクイックフィックスを提示します。

Running 'git push --set-upstream' will present a lightbulb that opens a dropdown with an option to open a new PR on github.com

組み込みのクイックフィックスの一部をご紹介します。

  • ポートがすでにリッスンされていることが検出された場合、プロセスを強制終了して前のコマンドを再実行することを提案します。
  • アップストリームが設定されていないために git push が失敗した場合、アップストリームを設定してプッシュすることを提案します。
  • git サブコマンドが類似したコマンドエラーで失敗した場合、類似したコマンドを使用することを提案します。
  • git push の結果、GitHub PR の作成が提案された場合、リンクを開くことを提案します。
  • General または cmd-not-found PowerShell フィードバックプロバイダーがトリガーされた場合、各提案を提示します。

クイックフィックス機能は、クイックフィックスが利用可能な場合に、追加のフィードバックのためにアクセシビリティシグナルもサポートします。

最近のコマンドを実行

Terminal: Run Recent Command コマンドは、さまざまなソースからの履歴をクイックピックに表示し、シェルのリバースサーチ (Ctrl+R) と同様の機能を提供します。ソースは、現在のセッションの履歴、このシェルタイプの前回のセッション履歴、および共通のシェル履歴ファイルです。

The "run recent command" command shows a quick pick with previously run commands that can be filtered similar to the go to file command

このコマンドのその他の機能

  • デフォルトでは、検索モードは「連続検索」であり、検索語が完全に一致する必要があります。検索入力の右側にあるボタンで、ファジー検索に切り替えることができます。
  • 現在のセッションセクションには、クイックピックの右側にクリップボードアイコンがあり、コマンド出力をエディターで開きます。
  • クイックピックの右側にあるピンアクションは、コマンドをリストの先頭に固定できます。
  • Alt を押すと、実行せずにテキストをターミナルに書き込めます。
  • 前回のセッションセクションに保存される履歴の量は、terminal.integrated.shellIntegration.history 設定によって決まります。

このコマンドのデフォルトのキーボードショートカットは Ctrl+Alt+R です。ただし、アクセシビリティモードがオンの場合、これらは逆になります。Ctrl+R は最近のコマンドを実行し、Ctrl+Alt+R は Ctrl+R をシェルに送信します。

アクセシビリティモードがオフの場合、次のキーボードショートカットでキーボードショートカットを反転できます。

{
    "key": "ctrl+r",
    "command": "workbench.action.terminal.runRecentCommand",
    "when": "terminalFocus"
},
{
  "key": "ctrl+alt+r",
  "command": "workbench.action.terminal.sendSequence",
  "args": { "text": "\u0012"/*^R*/ },
  "when": "terminalFocus"
}

最近のディレクトリに移動

最近のコマンドを実行する機能と同様に、Terminal: Go to Recent Directory コマンドは、訪問したディレクトリを追跡し、それらのディレクトリへの迅速なフィルタリングとナビゲーション (cd) を可能にします。Alt を押し続けると、実行せずにテキストをターミナルに書き込めます。

このコマンドのデフォルトのキーボードショートカットは、エディターの行/列に移動コマンドと同様の動作をするため、⌘G (Windows、Linux Ctrl+G) です。Ctrl+G は、Ctrl+Alt+G でシェルに送信できます。

現在の作業ディレクトリの検出

シェル統合は、シェルの現在の作業ディレクトリを VS Code に伝えます。この情報は、Windows では正規表現でプロンプトを検出しようとしない限り取得できず、macOS および Linux ではポーリングが必要であり、パフォーマンスに悪影響を及ぼします。

これにより可能になる最大の機能の 1 つは、ターミナル内のリンクの解決の強化です。たとえば、リンク package.json を考えてみましょう。シェル統合が無効な状態でリンクがアクティブ化されると、ワークスペースに複数の package.json ファイルがある場合、package.json をフィルターとする検索クイックピックが開きます。しかし、シェル統合が有効な場合、現在の場所がわかっているため、現在のフォルダーの package.json ファイルが直接開かれます。これにより、たとえば ls の出力が正しいファイルを確実に開くことができます。

現在の作業ディレクトリは、ターミナルタブ、最近のコマンドのクイックピック、および "terminal.integrated.splitCwd": "inherited" 機能でディレクトリを表示するためにも使用されます。

PowerShell の拡張キーボードショートカット

Windows のコンソール API は、Linux/macOS ターミナルよりも多くのキーボードショートカットを許可します。VS Code のターミナルは Windows でも後者をエミュレートするため、Ctrl+Space のような VT エンコーディングの欠如により標準的な方法では不可能な PowerShell のキーボードショートカットがいくつかあります。シェル統合により、VS Code はカスタムキーボードショートカットをアタッチして、特別なシーケンスを PowerShell に送信し、それがシェル統合スクリプトで処理され、適切なキーハンドラーに転送されます。

シェル統合が有効な場合、PowerShell で次のキーボードショートカットが機能するはずです。

  • Ctrl+Space: Windows のみ MenuComplete がデフォルト
  • Alt+Space: すべてのプラットフォームで SetMark がデフォルト
  • Shift+Enter: すべてのプラットフォームで AddLine がデフォルト
  • Shift+End: すべてのプラットフォームで SelectLine がデフォルト
  • Shift+Home: すべてのプラットフォームで SelectBackwardsLine がデフォルト

アクセシビリティの強化

シェル統合が VS Code に提供する情報は、ターミナルのアクセシビリティを向上させるために使用されます。強化の例としては、次のようなものがあります。

  • アクセス可能なバッファー内の検出されたコマンド間のナビゲーション (⌥F2 (Windows Alt+F2, Linux Shift+Alt+F2))
  • コマンドが失敗すると、オーディオキューが再生されます。
  • 矢印キーとバックスペースキーがより正確に動作するように、下層のテキストボックスが同期します。

IntelliSense (プレビュー)

ターミナルの IntelliSense を使用すると、ファイル、フォルダー、コマンド、コマンド引数、オプションの提案を受け取ることができます。この機能はシェル統合 terminal.integrated.shellIntegration.enable によって提供され、terminal.integrated.suggest.enabled で有効にできます。

A user has typed git checkout in a terminal and requests completions. The completion list shows branch names like main and merogge/terminal-section

VS Code は、Fig specs からコマンドを取得し、terminal.integrated.suggest.windowsExecutableExtensions 設定で、Windows での特定の実行可能ファイルのセットを構成できます。Windows では、terminal.integrated.suggest.windowsExecutableExtensions 設定で、特定の実行可能ファイルのセットを構成できます。

キーボードナビゲーション

デフォルトでは、Tab で提案が挿入されます。リストのナビゲーションが行われた後、Enter も同様に提案を挿入します。この動作は、terminal.integrated.suggest.selectionMode 設定で構成できます。

ターミナルで補完を受け入れたときに挿入して実行するには、terminal.integrated.suggest.runOnEnter を構成します。

IntelliSense は、⌃Space (Windows、Linux Ctrl+Space) を手動でトリガーすることも、入力によってトリガーすることもできます。入力によるトリガーは、terminal.integrated.suggest.quickSuggestions で無効にできます。IntelliSense は、/ のような特定の文字が入力されたときにもトリガーされ、これは terminal.integrated.suggest.suggestOnTriggerCharacters で構成できます。

シェルがインライン補完を提供する場合、VS Code はこれをリストの最初の補完項目として表示します。この動作は、terminal.integrated.suggest.inlineSuggestion 設定でさらに構成できます。

terminal.integrated.suggest.showStatusBar 設定は、リストの下部にステータスバーを表示するかどうかを制御します。このステータスバーには、詳細を学ぶ (⇧⌘L (Windows、Linux Ctrl+Shift+L))、挿入 (Tab)、および設定 (⇧⌘, (Windows、Linux Ctrl+Shift+,)) などのアクションが表示されます。IntelliSense 機能を初めて使用する際、詳細を学ぶアクションは、さらなる発見性を高めるために強調表示されます。

サジェストコントロールは、提案に関する追加の詳細を表示できます。⌃Space (Windows、Linux Ctrl+Space) でこれらの詳細の表示を切り替えることができます。スクリーンリーダーのユーザーは、⌃⌥Space (Windows、Linux Ctrl+Alt+Space) で詳細コントロールにフォーカスを当てて読み上げを聞くことができます。

グローバル補完キャッシュ

パフォーマンスを向上させるため、VS Code は特定のシェルのグローバルを積極的にキャッシュします。コマンドを追加するシェル起動ロジックを変更した場合、自動的に検出されない場合は、Terminal: Clear Suggest Cached Globals コマンド (terminal.integrated.suggest.clearCachedGlobals) を使用して手動でキャッシュを更新してください。

サポートされているエスケープシーケンス

VS Code はいくつかのカスタムエスケープシーケンスをサポートしています

VS Code カスタムシーケンス 'OSC 633 ; ... ST'

VS Code には、VS Code のターミナルで実行されたときにシェル統合機能を有効にするために設計された一連のカスタムエスケープシーケンスがあります。これらは組み込みスクリプトによって使用されますが、シーケンスをターミナルに送信できる任意のアプリケーションでも使用できます。たとえば、Julia 拡張機能は、Julia REPL でシェル統合をサポートするためにこれらを使用します。

これらのシーケンスは他のターミナルでは無視されるべきですが、他のターミナルがこれらのシーケンスをより広く採用しない限り、書き込む前に $TERM_PROGRAMvscode であることを確認することをお勧めします。

  • OSC 633 ; A ST: プロンプトの開始をマークします。

  • OSC 633 ; B ST: プロンプトの終了をマークします。

  • OSC 633 ; C ST: 実行前をマークします。

  • OSC 633 ; D [; <exitcode>] ST: オプションの終了コードで実行終了をマークします。

  • OSC 633 ; E ; <commandline> [; <nonce] ST: オプションのノンスでコマンドラインを明示的に設定します。

    E シーケンスを使用すると、ターミナルはシェルによって解釈された正確なコマンドラインを確実に取得できます。これが指定されていない場合、ターミナルはコマンドを取得するために A、B、C シーケンスを使用するか、信頼性が低い場合は検出を完全に無効にする可能性があります。

    オプションの nonce は、コマンドのなりすましを防ぐために、シーケンスがシェル統合スクリプトから来たものであることを検証するために使用できます。nonce が正常に検証されると、コマンドを使用する前にいくつかの保護が解除され、ユーザーエクスペリエンスが向上します。

    コマンドラインは、\xAB 形式を使用して ASCII 文字をエスケープできます。ここで AB は文字コードの 16 進数表現 (大文字と小文字を区別しない) であり、\ 文字は \\ を使用してエスケープします。セミコロン (0x3b) と 0x20 以下の文字をエスケープする必要があり、これは改行とセミコロンにとって特に重要です。

    いくつかの例

    "\"  -> "\\"
    "\n" -> "\x0a"
    ";"  -> "\x3b"
    
  • OSC 633 ; P ; <Property>=<Value> ST: ターミナルにプロパティを設定します。既知のプロパティのみが処理されます。

    既知のプロパティ

    • Cwd: 現在の作業ディレクトリをターミナルに報告します。
    • IsWindows: ターミナルが winpty や conpty のような Windows バックエンドを使用しているかどうかを示します。シェル統合シーケンスの位置が正しいことが保証されないため、追加のヒューリスティックを有効にするために使用される場合があります。有効な値は TrueFalse です。
    • HasRichCommandDetection: ターミナルが豊富なコマンド検出機能を備えているかどうかを示します。このプロパティは、シェル統合スクリプトが VS Code が期待するように理想的に動作する場合に True に設定されます。具体的には、シーケンスは A、B、E、C、D の順序で予想される位置にくる必要があります。

Final Term シェル統合

VS Code は Final Term のシェル統合シーケンスをサポートしており、VS Code 以外のシェル統合スクリプトを VS Code で動作させることができます。ただし、OSC 633 ほど多くの機能をサポートしていないため、エクスペリエンスはいくらか低下します。サポートされている特定のシーケンスは次のとおりです。

  • OSC 133 ; A ST: プロンプトの開始をマークします。
  • OSC 133 ; B ST: プロンプトの終了をマークします。
  • OSC 133 ; C ST: 実行前をマークします。
  • OSC 133 ; D [; <exitcode>] ST: オプションの終了コードで実行終了をマークします。

iTerm2 シェル統合

iTerm2 が開拓した以下のシーケンスがサポートされています。

  • OSC 1337 ; CurrentDir=<Cwd> ST: ターミナルの現在の作業ディレクトリを設定します。OSC 633 ; P ; Cwd=<Cwd> ST と同様です。

  • OSC 1337 ; SetMark ST: トリガーされた行の左側にマークを追加し、スクロールバーに注釈も追加します。

    When the sequence is written to the terminal a small grey circle will appear to the left of the command, with a matching annotation in the scroll bar

    これらのマークはコマンドナビゲーションと統合されており、⌘↑ (Windows、Linux Ctrl+Up) および ⌘↓ (Windows、Linux Ctrl+Down) を介して簡単にナビゲートできます。

よくある質問

自動注入が機能しないのはどんな場合ですか?

自動注入が機能しないケースはいくつかあります。一般的なケースをいくつかご紹介します。

  • $PROMPT_COMMAND がサポートされていない形式である場合、それを単一の関数を指すように変更することで、簡単に回避できます。例:

    prompt() {
      printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}"
    }
    PROMPT_COMMAND=prompt
    
  • 一部のシェルプラグインは、初期化時に $VSCODE_SHELL_INTEGRATION を設定解除することで、VS Code のシェル統合を明示的に無効にする場合があります。

機能が無効になっているのにコマンドの装飾が表示されるのはなぜですか?

この可能性が高い原因は、お使いのシステムに VS Code が理解する別のターミナルのシェル統合がインストールされているためです。装飾を全く表示したくない場合は、次の設定で非表示にできます。

"terminal.integrated.shellIntegration.decorationsEnabled": never

あるいは、シェル rc/スタートアップスクリプトからシェル統合スクリプトを削除することもできますが、コマンドナビゲーションのようなコマンド認識機能へのアクセスを失います。

Windows でコマンドの装飾が飛び跳ねるのはなぜですか?

Windows は、ConPTY と呼ばれるエミュレートされた擬似ターミナル (pty) バックエンドを使用します。これは、Windows コンソール API との互換性を維持する必要があるため、通常の pty とは少し異なる動作をします。その影響の 1 つは、pty がレンダリングを特殊な方法で処理するため、ターミナルバッファ内のコマンドを識別するシェル統合シーケンスが誤った位置に配置される可能性があることです。コマンドが飛び跳ねるのは通常、コマンドが実行された後で、VS Code のヒューリスティックがコマンドの装飾の位置を改善するために機能し始めたときです。

© . This site is unofficial and not affiliated with Microsoft.