ターミナルシェル統合
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
ファイルに追加してください。VS Code でファイルを開くには、bash で code ~/.bashrc
を実行します。
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path bash)"
fish
以下の内容を config.fish
に追加してください。VS Code でファイルを開くには、fish で code $__fish_config_dir/config.fish
を実行します。
string match -q "$TERM_PROGRAM" "vscode"
and . (code --locate-shell-integration-path fish)
pwsh
以下の内容を PowerShell プロファイルに追加してください。VS Code でファイルを開くには、pwsh で code $Profile
を実行します。
if ($env:TERM_PROGRAM -eq "vscode") { . "$(code --locate-shell-integration-path pwsh)" }
zsh
以下の内容を ~/.zshrc
ファイルに追加してください。VS Code でファイルを開くには、zsh で code ~/.zshrc
を実行します。
[[ "$TERM_PROGRAM" == "vscode" ]] && . "$(code --locate-shell-integration-path zsh)"
Git Bash
以下の内容を ~/.bashrc
ファイルに追加してください。VS Code でファイルを開くには、Git Bash で code ~/.bashrc
を実行します。
[[ "$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
がデフォルト
アクセシビリティの強化
シェル統合が VS Code に提供する情報は、ターミナルのアクセシビリティを向上させるために使用されます。機能強化の例をいくつか示します。
- アクセス可能なバッファ内で検出されたコマンドをナビゲートする (⌥F2 (Windows Alt+F2, Linux Shift+Alt+F2))
- コマンドが失敗するとオーディオキューが再生されます。
- 下層のテキストボックスを同期させ、矢印キーやバックスペースキーの動作をより正確にする。
IntelliSense (プレビュー)
ターミナル内の IntelliSense を使用すると、ファイル、フォルダー、コマンド、コマンド引数、およびオプションの候補を受け取ることができます。この機能はシェル統合 terminal.integrated.shellIntegration.enable によって提供され、terminal.integrated.suggest.enabled で有効にできます。
VS Code は、Fig specs からコマンドを取得し、シェルごとの組み込み関数 (pwsh
、bash
、zsh
、fish
用) を $PATH
に対して検証し、それらが存在することを確認します。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 はいくつかのカスタムエスケープシーケンスをサポートしています
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 シーケンスを使用してコマンドを取得するか、信頼できない場合は検出を完全に無効にする可能性があります。
オプションのナンスは、コマンドスプーフィングを防ぐために、シーケンスがシェル統合スクリプトから来たものであることを確認するために使用できます。ナンスが正常に検証されると、ユーザーエクスペリエンスを向上させるために、コマンドを使用する前のいくつかの保護が削除されます。
コマンドラインは、
\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 が期待するように理想的に動作する場合に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> 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 のヒューリスティックが機能してコマンド装飾の位置を改善しているためです。