ターミナルシェル統合
Visual Studio Codeには一般的なシェルと統合する機能があり、ターミナルがシェル内で実際に何が起きているのかを詳細に把握できるようになります。この追加情報により、作業ディレクトリの検出やコマンド検出、装飾、ナビゲーションといった便利な機能が利用可能になります。
サポートされているシェル
- Linux/macOS: bash, fish, pwsh, zsh
- Windows: Git Bash, pwsh
インストール
自動スクリプトインジェクション
デフォルトでは、VS Codeから起動されたサポート対象シェルに対して、シェル統合スクリプトが自動的に有効化されます。これは、シェルセッションの起動時に引数や環境変数を挿入することで行われます。この自動挿入は、 terminal.integrated.shellIntegration.enabled を false に設定することで無効化できます。
この標準的で簡単な方法は、サブシェル内や通常の ssh セッション経由(Remote - SSH 拡張機能を使用していない場合)、または一部の複雑なシェル設定など、高度なユースケースでは機能しません。それらの環境でシェル統合を有効にする推奨の方法は、手動インストールです。
注: 自動挿入は古いバージョンのシェルでは機能しない場合があります。例えば、古いバージョンのfishは、挿入の仕組みである
$XDG_DATA_DIRS環境変数をサポートしていません。手動インストールを行えば動作する可能性があります。
Windowsの注意: VS Codeのシェル統合には、PowerShellスクリプトを実行する権限が必要です。マシン上のユーザーアカウントを専有している場合は、以下の実行を検討してください
if ((Get-ExecutionPolicy -Scope LocalMachine) -eq 'Undefined' -and (Get-ExecutionPolicy -Scope CurrentUser) -eq 'Undefined') { Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser }
手動インストール
シェル統合を手動でインストールするには、シェルの初期化中にVS Codeのシェル統合スクリプトを実行する必要があります。その方法と場所は、使用しているシェルとOSによって異なります。手動インストールを使用する場合、必須ではありませんが、 terminal.integrated.shellIntegration.enabled を false に設定することをお勧めします。
ヒント: Insidersビルドを使用している場合は、以下の
codeをcode-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"
シェル統合の品質
シェル統合を使用する場合、その機能レベルを示す「品質(Quality)」という概念があります。これらの品質は、シェル統合スクリプトがどのように動作するかによって決定されます。
- None(なし): シェル統合はアクティブではありません。
- Rich(リッチ): シェル統合はアクティブであり、コマンド検出が理想的な状態で機能しています。
- Basic(基本): シェル統合はアクティブですが、コマンド検出がすべての機能をサポートしていない場合があります。例えば、コマンドの実行位置は検出されますが、終了ステータスは検出されないなどです。
シェル統合の品質を確認するには、ターミナルタブにマウスカーソルを合わせます。必要に応じて、ホバー時に詳細を表示を選択すると、より詳細な情報が表示されます。
IntelliSense
ターミナルのIntelliSenseにより、ファイル、フォルダー、コマンド、コマンド引数、オプションの候補を受け取ることができます。この機能は terminal.integrated.suggest.enabled 設定で有効または無効にできます。

入力に合わせて候補リストが表示されます。手動で候補をトリガーするには、⌃Space (Windows, Linux Ctrl+Space) キーボードショートカットを使用します。
Ctrl+Space は、OSレベルで入力メソッドエディター (IME) をトリガーするキーバインドになっている場合があります。その場合は、workbench.action.terminal.triggerSuggest コマンドをカスタム キーバインド で再設定するか、OSレベルのショートカットを変更してください。
デフォルトでは、Tab キーで候補が挿入されます。リストを選択した状態で Enter を押すと、候補が挿入されます。この動作は terminal.integrated.suggest.selectionMode 設定で構成できます。
ターミナルのIntelliSenseの動作を構成する設定は他にもあります
- terminal.integrated.suggest.quickSuggestions : Ctrl+Space を使った手動操作ではなく、コマンドラインの内容に応じて自動的に候補を表示します。
- terminal.integrated.suggest.suggestOnTriggerCharacters :
-や/などの「トリガー文字」の後に自動的に候補を表示します。 - terminal.integrated.suggest.runOnEnter : Enter キーが押されたときに(Tab ではなく)コマンドを即座に実行するオプション。
- terminal.integrated.suggest.windowsExecutableExtensions : Windowsで実行可能ファイルとして扱われる拡張子のリスト。
- terminal.integrated.suggest.providers : 特定のプロバイダーを無効化する機能。例えば、拡張機能が提供する不要な補完機能をオフにする際に使用します。
- terminal.integrated.suggest.showStatusBar : IntelliSenseポップアップの下部にステータスバーを表示します。
- terminal.integrated.suggest.cdPath :
$CDPATH統合を有効にします。 - terminal.integrated.suggest.inlineSuggestion : シェルの「ゴーストテキスト」と統合し、その表示方法を定義します。
- terminal.integrated.suggest.upArrowNavigatesHistory : 補完の閲覧ではなく、上矢印キーをシェルに送信します。zshで特に便利で、プレフィックスを指定した状態で上矢印を押すと履歴検索ができます。
- terminal.integrated.suggest.selectionMode : IntelliSenseポップアップへのフォーカス方法。これにより、Enter および Tab キーの動作が決まります。
- terminal.integrated.suggest.insertTrailingSpace : 補完を受け入れた後、末尾にスペースを挿入し、再度補完をトリガーします。
グローバル補完キャッシュ
パフォーマンス向上のため、VS Codeは特定のシェルに対するグローバル情報を積極的にキャッシュします。コマンドを追加するようなシェル起動ロジックを変更した場合で、キャッシュが自動的に更新されないときは、Terminal: Clear Suggest Cached Globals コマンド (terminal.integrated.suggest.clearCachedGlobals) で手動更新してください。
コマンド装飾と概要ルーラー
シェル統合によって可能になる機能の一つに、ターミナル内で実行されたコマンドの終了コードの取得があります。この情報を利用して、コマンドが成功したか失敗したかを示す装飾が、行の左側に追加されます。これらの装飾は、エディターと同様に、スクロールバー内の比較的新しい概要ルーラーにも表示されます。

装飾をクリックすると、コマンドの再実行といった文脈に応じた操作が可能です。

コマンドおよび概要ルーラーの装飾は、 terminal.integrated.shellIntegration.decorationsEnabled 設定で構成できます。
コマンドナビゲーション
シェル統合によって検出されたコマンドはコマンドナビゲーション機能 (Ctrl/Cmd+Up, Ctrl/Cmd+Down) に送られ、より信頼性の高いコマンド位置を提供します。この機能により、コマンド間を素早く移動し、その出力を選択できます。現在の位置からコマンドまでを選択するには、Shift キーを押しながら Shift+Ctrl/Cmd+Up や Shift+Ctrl/Cmd+Down を押します。
コマンドガイド
コマンドガイドは、マウスを合わせたときにコマンドとその出力の横に表示されるバーです。これによりコマンドを素早く特定できるほか、シェル統合が正しく機能しているかを確認する手段にもなります。

カラーテーマを使用して、コマンドガイドの色をカスタマイズできます。コマンドガイドの切り替えは terminal.integrated.shellIntegration.showCommandGuide 設定で行います。
スティッキースクロール
スティッキースクロール機能は、ターミナルの上部に部分的に表示されているコマンドを「固定」し、その出力がどのコマンドに属しているのかを容易に確認できるようにします。固定されたコマンド部分をクリックすると、ターミナルバッファ内のコマンド位置までスクロールします。

これは terminal.integrated.stickyScroll.enabled 設定で有効にできます。
クイックフィックス
VS Codeはコマンドの出力をスキャンし、ユーザーが次に行いたい可能性が高い操作を「クイックフィックス(Quick Fix)」として提案します。

組み込みのクイックフィックスの一部を以下に示します。
- ポートが既に使用されていることが検出された場合、プロセスを終了して前のコマンドを再実行することを提案します。
- アップストリームが設定されていないために
git pushが失敗した場合、アップストリームを設定してプッシュすることを提案します。 gitのサブコマンドが同様のコマンドエラーで失敗した場合、類似のコマンドの使用を提案します。git pushの結果としてGitHub PRの作成が提案された場合、そのリンクを開くことを提案します。Generalまたはcmd-not-foundPowerShellフィードバックプロバイダーがトリガーされた場合、各提案を表示します。
クイックフィックス機能は、クイックフィックスが利用可能な場合に追加のフィードバックとして アクセシビリティ信号 もサポートしています。
最近実行したコマンド
Terminal: Run Recent Command コマンドは、クイックピックで様々なソースの履歴を表示し、シェルの逆検索 (Ctrl+R) と同様の機能を提供します。ソースには、現在のセッション履歴、このシェルタイプの過去のセッション履歴、および共通のシェル履歴ファイルが含まれます。

その他の機能
- デフォルトの検索モードは「前方一致検索」であり、検索語が完全に一致する必要があります。検索入力の右側にあるボタンを使用すると、ファジー検索に切り替えることができます。
- 現在のセッションセクションには、クイックピックの右側にクリップボードアイコンがあり、コマンドの出力をエディターで開くことができます。
- クイックピックの右側にあるピンのアクションをクリックすると、コマンドをリストの上部に固定できます。
- 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ではパフォーマンス上の観点から避けるべきポーリング(定期問い合わせ)が必要となります。
この機能によって有効になる最大の利点の一つが、ターミナル内でのリンク解決の強化です。例えば package.json というリンクがある場合、シェル統合が無効なときは、ワークスペース内に複数の package.json ファイルが存在すると、フィルターとして package.json を設定した状態で検索クイックピックが開きます。しかしシェル統合が有効な場合、現在の場所が特定されているため、現在のフォルダーにある package.json が直接開かれます。これにより、ls コマンドの出力などから確実に正しいファイルを開くことができます。
現在の作業ディレクトリは、ターミナルタブへの表示、「最近のコマンド」クイックピック、および "terminal.integrated.splitCwd": "inherited" 機能にも使用されます。
PowerShellの拡張キーボードショートカット
WindowsのコンソールAPIは、Linux/macOSターミナルよりも多くのキーボードショートカットを許可しています。VS CodeのターミナルはWindows上でも後者のエミュレーションを行うため、VTエンコーディングの不足により、Ctrl+Space のようなPowerShellのキーボードショートカットの一部が標準的な方法では使用できません。シェル統合により、VS Codeはカスタムのキーボードショートカットを付加し、特殊なシーケンスをPowerShellに送信して、シェル統合スクリプトで処理した上で適切なキーハンドラーに転送することが可能になります。
シェル統合が有効な場合、PowerShellで以下のキーボードショートカットが動作するはずです。
- Ctrl+Space: Windowsでのみ
MenuCompleteにデフォルト設定されます - Alt+Space: すべてのプラットフォームで
SetMarkにデフォルト設定されます - Shift+Enter: すべてのプラットフォームで
AddLineにデフォルト設定されます - Shift+End: すべてのプラットフォームで
SelectLineにデフォルト設定されます - Shift+Home: すべてのプラットフォームで
SelectBackwardsLineにデフォルト設定されます
アクセシビリティの強化
シェル統合が提供する情報は、ターミナルのアクセシビリティ を向上させるためにも使われます。強化の例をいくつか挙げます。
- アクセシビリティバッファ内の検出されたコマンドへのナビゲーション (⌥F2 (Windows Alt+F2, Linux Shift+Alt+F2))
- コマンドが失敗したときに オーディオキュー(音の合図) が鳴ります。
- 基盤となるテキストボックスの同期により、矢印キーやバックスペースキーの動作がより正確になります。
サポートされているエスケープシーケンス
VS Codeはいくつかのカスタムエスケープシーケンスをサポートしています。
VS Codeカスタムシーケンス 'OSC 633 ; ... ST'
VS Codeには、VS Codeのターミナルで実行されたときにシェル統合機能を有効にするよう設計された一連のカスタムエスケープシーケンスがあります。これらは組み込みスクリプトによって使用されますが、シーケンスをターミナルに送信できる任意のアプリケーションでも利用可能です。例えば、Julia拡張機能 はこれを使用してJulia REPLでのシェル統合をサポートしています。
これらのシーケンスは他のターミナルでは無視されるはずですが、他のターミナルがこれらのシーケンスをより広く採用するまでは、書き込む前に $TERM_PROGRAM が vscode であることを確認することを推奨します。
-
OSC 633 ; A ST: プロンプト開始をマーク。 -
OSC 633 ; B ST: プロンプト終了をマーク。 -
OSC 633 ; C ST: 実行前(プレ実行)をマーク。 -
OSC 633 ; D [; <exitcode>] ST: オプションの終了コードと共に実行終了をマーク。 -
OSC 633 ; E ; <commandline> [; <nonce>] ST: オプションのnonceと共にコマンドラインを明示的に設定。Eシーケンスにより、ターミナルはシェルによって解釈された正確なコマンドラインを確実に取得できます。これが指定されていない場合、ターミナルはA、B、Cの各シーケンスを使用してコマンドを取得するか、信頼性が低い場合は検出を完全に無効にします。
オプションのnonceは、コマンドスプーフィングを防ぐために、シーケンスがシェル統合スクリプトから送信されたことを検証するために使用できます。nonceが正常に検証されると、ユーザー体験向上のためにコマンド使用前の保護の一部が解除されます。
コマンドラインは、
\xAB形式(ABは文字コードの16進数、大文字小文字不問)を使用してASCII文字をエスケープし、\\を使用して\文字をエスケープできます。セミコロン (0x3b) および0x20以下の文字のエスケープが必須であり、改行とセミコロンについては特に重要です。いくつかの例
"\" -> "\\" "\n" -> "\x0a" ";" -> "\x3b" -
OSC 633 ; P ; <Property>=<Value> ST: ターミナルのプロパティを設定。既知のプロパティのみが処理されます。既知のプロパティ
Cwd: 現在の作業ディレクトリをターミナルに報告します。IsWindows: ターミナルがwinptyやconptyのようなWindowsバックエンドを使用しているかどうかを示します。これは、シェル統合シーケンスの位置が正確である保証がないため、ヒューリスティックを追加して有効にするために使用される場合があります。有効な値はTrueとFalseです。HasRichCommandDetection: ターミナルがリッチなコマンド検出機能を備えているかどうかを示します。このプロパティは、シェル統合スクリプトがVS Codeの想定通りに動作している場合(具体的にはA, B, E, C, Dの順序でシーケンスが期待される位置に来る場合)にTrueに設定されます。
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: トリガーされた行の左側にマークを追加し、スクロールバーに注釈を追加します。
これらのマークはコマンドナビゲーションと統合されており、⌘↑ (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とは少し動作が異なります。この影響の一つとして、ptyがレンダリングを特殊に扱うため、ターミナルバッファ内のコマンドを識別するシェル統合シーケンスがずれることがあります。コマンドがジャンプするのは通常コマンド実行後であり、VS Codeのヒューリスティックがコマンド装飾の位置を改善するために機能した結果です。