🚀 VS Code で を入手しましょう!

ターミナル シェル統合

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 ファイルに追加します。bash で 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+Up および Shift+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 フィードバックプロバイダーがトリガーされた場合、各提案を提案します。

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

最近使用したコマンドを実行

ターミナル: 最近使用したコマンドを実行 コマンドは、さまざまなソースからの履歴をクイックピッカーに表示し、シェルのリバース検索 (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"
}

最近使用したディレクトリへ移動

最近使用したコマンドを実行する機能と同様に、ターミナル: 最近使用したディレクトリへ移動 コマンドは、アクセスしたディレクトリを追跡し、それらをすばやくフィルタリングしてナビゲート (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

PowerShell の実験的な IntelliSense

PowerShell の実験的な IntelliSense は、エディターエクスペリエンスと同様に、PowerShell で入力すると補完リストを表示します。バックグラウンドでは、この機能は PowerShell セッションのネイティブ補完 API によって駆動されるため、変数などのコンテキスト対応の補完が利用可能です。

PowerShell IntelliSense shows completions like Get-Alias, Get-ChildItem, for example when typing Get-

PowerShell の実験的な IntelliSense は、terminal.integrated.suggest.enabled 設定で有効にできます。

"terminal.integrated.suggest.enabled": true

: この機能は現在、Windows および macOS でのみ利用可能です。

Git および VS Code の補完

実験的な IntelliSense が有効になっている場合、CLI gitcode、および code-insiders の補完はデフォルトでオンになります。PowerShell プロファイルにすでに補完がある場合は、terminal.integrated.suggest.builtinCompletions 設定を使用してこれらをオフにすることができます。

強化されたアクセシビリティ

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

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

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

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 シーケンスを使用してコマンドを取得するか、信頼できない場合は検出を完全に無効にするフォールバックを行う場合があります。

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

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

    いくつかの例:

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

    既知のプロパティ:

    • Cwd - 現在の作業ディレクトリをターミナルに報告します。
    • IsWindows - ターミナルが winpty や conpty などの Windows バックエンドを使用しているかどうかを示します。これは、シェル統合シーケンスの位置が正しいことが保証されていないため、追加のヒューリスティックを有効にするために使用される場合があります。有効な値は TrueFalse です。

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> S - ターミナルの現在の作業ディレクトリを設定します (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 のヒューリスティックが起動してコマンド装飾の位置を改善したためです。