チュートリアル: Windows ターミナルでシェル統合を有効にする

ターミナル 1.15 プレビュー以降、Windows ターミナルは一部の "シェル統合" 機能を実験的にサポートするようになりました。 これらの機能により、コマンドラインが使いやすくなります。 以前のリリースでは、シェルが現在の作業ディレクトリをターミナルに伝えることができました。 今回、シェルがターミナル出力の一部を "プロンプト"、"コマンド"、または "出力" として意味的に記述できるように、より多くのシーケンスをサポートするようになりました。 また、シェルは、コマンドが成功したか失敗したかをターミナルに伝えることもできます。

これは、ターミナル v1.18 の時点でロールアウトされているシェル統合機能の一部についてのガイドです。 将来的には、これらに加えてさらに多くの機能を構築する予定です。そのため、どのように使っているかについて追加のフィードバックをお寄せください。

: 特に "マーク" はまだ実験段階であり、ターミナルのプレビュー ビルドでのみ有効です。 これらの機能の設定は、今後のリリースで変更される可能性があります。

この処理のしくみ

シェル統合は、シェル (または任意のコマンド ライン アプリケーション) が特別な "エスケープ シーケンス" をターミナルに書き込むことで機能します。 これらのエスケープ シーケンスはターミナルに出力されません。代わりに、いくつかのメタデータが用意されています。ターミナルでこれを使うと、アプリケーションで何が起こっているかを詳しく把握できます。 これらのシーケンスをシェルのプロンプトに貼り付けることで、シェルのみが認識している情報をシェルからターミナルに継続的に提供することができます。

次のシーケンスの場合:

  • OSC は文字列 "\x1b]" (エスケープ文字) で、その後に ] が続きます。
  • ST は "文字列の終端記号" であり、\x1b\ (ESC 文字、その後に \ が続きます) または \x7 (BEL 文字) のいずれかになります。
  • スペースは単なる例です。
  • <> の文字列は、他の値に置き換える必要があるパラメーターです。

ターミナル v1.18 の時点でサポートされている関連するシェル統合シーケンスは次のとおりです。

  • OSC 133 ; A ST ("FTCS_PROMPT") - プロンプトの開始。
  • OSC 133 ; B ST ("FTCS_COMMAND_START") - コマンドラインの開始 (READ: プロンプトの終了)。
  • OSC 133 ; C ST ("FTCS_COMMAND_EXECUTED") - コマンド出力の開始またはコマンドラインの終了。
  • OSC 133 ; D ; <ExitCode> ST ("FTCS_COMMAND_FINISHED") - コマンドの終了。 ExitCode - ExitCode を指定すると、ターミナルは 0 を "成功" として扱い、それ以外はエラーとして扱います。 省略した場合、ターミナルはマークを既定の色のままにします。

シェル統合のマークを有効にする方法

これらの機能をサポートするには、シェルとターミナル間の連携が必要です。 これらの新機能を使うには、ターミナルでの設定を有効にすることと、シェルのプロンプトを変更することの両方が必要です。

ターミナルでこれらの機能を有効にするには、設定に以下を追加する必要があります。

"profiles":
{
    "defaults":
    {
        // Marks in general
        "experimental.showMarksOnScrollbar": true,

        // Needed for both pwsh and CMD shell integration
        "experimental.autoMarkPrompts": true,

        // Add support for a right-click context menu
        // You can also just bind the `showContextMenu` action
        "experimental.rightClickContextMenu": true,
    },
}
"actions":
[
    { "keys": "ctrl+up",   "command": { "action": "scrollToMark", "direction": "previous" }, },
    { "keys": "ctrl+down", "command": { "action": "scrollToMark", "direction": "next" }, },

    // Add the ability to select a whole command (or its output)
    { "keys": "ctrl+shift+w", "command": { "action": "selectOutput", "direction": "prev" }, },
    { "keys": "ctrl+shift+s", "command": { "action": "selectOutput", "direction": "next" }, },

    { "keys": "ctrl+alt+shift+w", "command": { "action": "selectCommand", "direction": "prev" }, },
    { "keys": "ctrl+alt+shift+s", "command": { "action": "selectCommand", "direction": "next" }, },
]

シェルでこれらのマークを有効にする方法は、シェルによって異なります。 CMD と PowerShell のチュートリアルを次に示します。

PowerShell (pwsh.exe)

PowerShell プロンプトを以前に変更したことがない場合は、最初に about_Prompts を確認する必要があります。

prompt を編集して、CWD についてターミナルに確実に伝え、プロンプトに適切なマークを付けるようにする必要があります。 PowerShell を使うと、133;D シーケンスに前のコマンドのエラー コードを含めることもできます。これにより、コマンドが成功したか失敗したかに基づいて、ターミナルが自動的にマークを色分けできるようになります。

PowerShell プロファイルに次の内容を追加します。

$Global:__LastHistoryId = -1

function Global:__Terminal-Get-LastExitCode {
  if ($? -eq $True) {
    return 0
  }
  $LastHistoryEntry = $(Get-History -Count 1)
  $IsPowerShellError = $Error[0].InvocationInfo.HistoryId -eq $LastHistoryEntry.Id
  if ($IsPowerShellError) {
    return -1
  }
  return $LastExitCode
}

function prompt {

  # First, emit a mark for the _end_ of the previous command.

  $gle = $(__Terminal-Get-LastExitCode);
  $LastHistoryEntry = $(Get-History -Count 1)
  # Skip finishing the command if the first command has not yet started
  if ($Global:__LastHistoryId -ne -1) {
    if ($LastHistoryEntry.Id -eq $Global:__LastHistoryId) {
      # Don't provide a command line or exit code if there was no history entry (eg. ctrl+c, enter on no command)
      $out += "`e]133;D`a"
    } else {
      $out += "`e]133;D;$gle`a"
    }
  }


  $loc = $($executionContext.SessionState.Path.CurrentLocation);

  # Prompt started
  $out += "`e]133;A$([char]07)";

  # CWD
  $out += "`e]9;9;`"$loc`"$([char]07)";

  # (your prompt here)
  $out += "PWSH $loc$('>' * ($nestedPromptLevel + 1)) ";

  # Prompt ended, Command started
  $out += "`e]133;B$([char]07)";

  $Global:__LastHistoryId = $LastHistoryEntry.Id

  return $out
}

コマンド プロンプト

コマンド プロンプトは、PROMPT 環境変数からプロンプトを取得します。 CMD.exe は $eESC 文字として読み取ります。 残念ながら、CMD.exe には、プロンプトで前のコマンドのリターン コードを取得する方法がないため、CMD プロンプトで成功またはエラーの情報を提供することはできません。

以下を実行することで、現在の CMD.exe インスタンスのプロンプトを変更できます。

PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\

または、今後のすべてのセッションに対してコマンドラインから変数を設定できます。

setx PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\$P$G$e]133;B$e\

これらの例では、現在の PROMPT が単なる $P$G であると仮定しています。 代わりに、現在のプロンプトを次のようなもので囲むこともできます。

PROMPT $e]133;D$e\$e]133;A$e\$e]9;9;$P$e\%PROMPT%$e]133;B$e\

: お気に入りのシェルがここに表示されていない場合 解決方法が判明した場合は、お気に入りのシェルでの解決策をご自由にお寄せください

シェル統合デモ

同じ作業ディレクトリ内で新しいタブを開く

Open new tabs in the same working directory

スクロールバーに各コマンドのマークを表示する

Show marks for each command in the scrollbar

コマンド間を自動的にジャンプする

Automatically jump between commands

コマンドの出力全体を選ぶ

Select the entire output of a command

Select the command using the right-click context menu