ターミナル シェル統合
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
環境変数をサポートしていません。手動インストールで動作させることができる場合があります。
手動インストール
シェル統合を手動でインストールするには、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
ファイルに追加します。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 つは、ターミナル内で実行されたコマンドの終了コードを取得する機能です。この情報を使用して、コマンドが成功したか失敗したかを示す装飾が行の左側に追加されます。これらの装飾は、エディターと同様に、スクロールバーの比較的新しい概要ルーラーにも表示されます。
装飾を操作して、コマンドの再実行などのコンテキストアクションを実行できます。
コマンドと概要ルーラーの装飾は、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 は、コマンドの出力をスキャンし、ユーザーが次に実行したい可能性が高いアクションを含むクイックフィックスを提示します。
組み込みのクイックフィックスの例を次に示します。
- ポートがすでにリッスンされていることが検出された場合、プロセスを強制終了して前のコマンドを再実行することを提案します。
git push
がアップストリームが設定されていないために失敗した場合、アップストリームを設定してプッシュすることを提案します。git
サブコマンドが同様のコマンドエラーで失敗した場合、同様のコマンドを使用することを提案します。git push
の結果、GitHub PR を作成する提案が表示された場合、リンクを開くことを提案します。General
またはcmd-not-found
PowerShell フィードバックプロバイダーがトリガーされた場合、各提案を提案します。
クイックフィックス機能は、クイックフィックスが利用可能な場合の追加のフィードバックとして、アクセシビリティシグナルもサポートしています。
最近使用したコマンドを実行
ターミナル: 最近使用したコマンドを実行 コマンドは、さまざまなソースからの履歴をクイックピッカーに表示し、シェルのリバース検索 (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"
}
最近使用したディレクトリへ移動
最近使用したコマンドを実行する機能と同様に、ターミナル: 最近使用したディレクトリへ移動 コマンドは、アクセスしたディレクトリを追跡し、それらをすばやくフィルタリングしてナビゲート (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 は、terminal.integrated.suggest.enabled 設定で有効にできます。
"terminal.integrated.suggest.enabled": true
注: この機能は現在、Windows および macOS でのみ利用可能です。
Git および VS Code の補完
実験的な IntelliSense が有効になっている場合、CLI git
、code
、および 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_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
- コマンドラインを明示的に設定します (オプションのノンス付き)。E シーケンスを使用すると、ターミナルはシェルによって解釈された正確なコマンドラインを確実に取得できます。これが指定されていない場合、ターミナルは A、B、C シーケンスを使用してコマンドを取得するか、信頼できない場合は検出を完全に無効にするフォールバックを行う場合があります。
オプションのノンスは、コマンドスプーフィングを防ぐために、シーケンスがシェル統合スクリプトから来たことを検証するために使用できます。ノンスが正常に検証されると、コマンドを使用する前のいくつかの保護が削除され、ユーザーエクスペリエンスが向上します。
コマンドラインは、ASCII 文字を
\xAB
形式 (AB は文字コードの 16 進表現 (大文字と小文字を区別しない)) を使用してエスケープし、\
文字を\\
を使用してエスケープできます。セミコロン (0x3b
) と文字 0x20 以下をエスケープする必要があります。これは、改行とセミコロンにとって特に重要です。いくつかの例:
"\" -> "\\" "\n" -> "\x0a" ";" -> "\x3b"
-
OSC 633 ; P ; <Property>=<Value> ST
- ターミナルのプロパティを設定します。既知のプロパティのみが処理されます。既知のプロパティ:
Cwd
- 現在の作業ディレクトリをターミナルに報告します。IsWindows
- ターミナルが winpty や conpty などの Windows バックエンドを使用しているかどうかを示します。これは、シェル統合シーケンスの位置が正しいことが保証されていないため、追加のヒューリスティックを有効にするために使用される場合があります。有効な値はTrue
とFalse
です。
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
- トリガーされた行の左側にマークを追加し、スクロールバーに注釈を追加します。これらのマークは、コマンドナビゲーションと統合されており、⌘↑ (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 のヒューリスティックが起動してコマンド装飾の位置を改善したためです。