ターミナルのシェル統合
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
ファイルに以下を追加します。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"
シェル統合の品質
シェル統合を使用する場合、その能力を宣言する「品質」が関連付けられています。これらの品質は、シェル統合スクリプトがどのように動作するかによって決定されます。
- None: シェル統合がアクティブではありません。
- Rich: シェル統合がアクティブで、コマンド検出が理想的な方法で機能しています。
- Basic: シェル統合はアクティブですが、コマンド検出がすべての機能をサポートしていない可能性があります。たとえば、コマンドが実行された場所は検出されますが、その終了ステータスは検出されません。
シェル統合の品質を表示するには、ターミナルタブにカーソルを合わせます。オプションで、ホバーの 詳細の表示 を選択して、より詳細な情報を表示します。
コマンドのデコレーションと概要ルーラー
シェル統合が有効にするものの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 上でも後者をエミュレートするため、VT エンコーディングがないために標準的な方法では不可能な PowerShell のキーボードショートカットがいくつかあります (例: Ctrl+Space)。シェル統合により、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 の仕様 からコマンドを取得し、シェルごとの組み込み関数 (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
: オプションのnonce付きでコマンドラインを明示的に設定します。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バックエンドを使用しているかどうかを示します。シェル統合シーケンスの位置が正しいことが保証されないため、追加のヒューリスティックスを有効にするために使用される場合があります。有効な値は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とは少し異なる動作をします。この影響の1つは、ptyがレンダリングを特別に処理するため、ターミナルバッファ内のコマンドを識別するシェル統合シーケンスがずれてしまう可能性があることです。コマンドが飛び回るのは、通常、コマンドが実行された後で、VS Codeのヒューリスティクスがコマンドデコレーションの位置を改善するために機能したときです。