• Windows Terminal ベスト設定 第12回「Windows Terminalのコマンドライン サブコマンド編」

今回は、Windows Terminalのコマンドラインで利用するサブコマンドについて解説する。サブコマンドは、タブやペインの作成や移動、選択状態にするタブやペインを指定できる。これにより、単に、Windows Terminalの初期状態としてタブやペインを定義するだけでなく、その中で有効にするタブやペインを選択状態にできる。

また、--windowオプションで対象ウィンドウを指定することで、既存のWindows Terminalウィンドウのタブやペインを制御することも可能だ。

サブコマンドの概要

(表01)は、サブコマンドの一覧である。このサブコマンドには、必ず対応するアクションがあり、ほぼ同等のことをキー割り当てで行うことができる。しかし、キー割り当てでは、引数が固定されてしまう。たとえば、newTabアクションをキーに割り当てると固定したプロファイルか、現在のプロファイルしか指定できない。これに対して、コマンドラインを使えば、その場で任意のプロファイルを指定できる。この点でキー割り当てとコマンドラインのサブコマンドは異なる。さらにコマンドラインで“--window”オプションを併用してサブコマンドを使えば、既存のWindows Terminalウィンドウを対象にタブやペインの制御が可能だ。

  • ■表01

サブコマンドは、サブコマンド名で始まり、サブコマンドのオプションや引数が並ぶ。最後の引数は、起動コマンドなので、複数のサブコマンドを指定する場合には、間をセミコロン“;”で区切る。具体的には、以下のパターンの2つになる


書式1
サブコマンド名 [オプションの並び] [コマンドライン][;]
書式2
サブコマンド名 オプション [;]

角カッコは省略可能な項目を示す。書式1は、new-tabまたはsplit-paneの場合を示す。それ以外のサブコマンドは、書式2を使う。

書式1のコマンドラインは、オプション文字がなく、サブコマンド並びの最後の部分をコマンドラインとして解釈する。

何もサブコマンドを指定しない場合には、“new-tab”サブコマンドがあると仮定される。たとえば、コマンドラインで、ウィドウオプションのみを指定した場合、最後に省略されたnew-tabサブコマンドがあると仮定され、何もサブコマンドオプションが指定されていないため、デフォルトのプロファイルが指定されたとされる。このため、ウィンドウオプションののみのコマンドラインでは、デフォルトプロファイルで新規タブが開く。このことは、きちんと理解しておく必要がある。たとえば、--windowオプションのみのコマンドラインを実行すれば、指定されたウィンドウIDを持つウィンドウに新しいタブがデフォルトプロファイルで起動することになる。

このため、コマンドラインの末尾に不要なセミコロン“;”を付けると、その後ろにnew-tabサブコマンドが省略されていると解釈され、タブが1つ余計に開いてしまうので注意が必要だ。

サブコマンドのうちnew-tabおよびsplit-paneサブコマンドには、オプションが多いが、その一部だけがショート形式(ハイフンとアルファベット1文字の形式)のオプションを持ち、大半のオプションがロング形式である。

Windows Terminalでは、ロング形式、ショート形式ともに大文字小文字の区別がある点に注意が必要だ。たとえば、"-d"と"-D"は異なるオプションである。また、“--tabColor”オプションは、“--tabcolor”では無効である。

new-tabおよびsplit-paneサブコマンド

new-tabおよびsplit-paneは、新規タブ、新規ペインの作成に使う。両者は、作成されるものがタブなのかペインなのかという違いを除けばほとんど同じ機能を持つ。というのもタブ内に表示されているのは単独でもペインであり、タブを作ることはペインを作ることだからだ。このため、new-paneではなく、split-paneと既存のタブを「分割」するという動作を示す。

new-tab、split-paneは、プロファイル指定やコマンド指定を含む多数のオプション(表02)がある。

  • ■表02

この表で、“new-tab”欄はオプションがnew-tabに利用可能かどうかを示す。表内のすべてのオプションは、split-paneでは利用可能である。

“安定版”欄は、オプションがプレビュー版のみ対応しているかどうかを示す。現時点では“v1.19”と表記のあるものは、Windows Terminal プレビュー版 v1.19でのみ利用可能だ。

new-tabとsplit-paneのオプションの違いは、分割方法を示すオプション(--horizontalと--vertical)、分割比指定(--size)と、現在のプロファイルを利用する“--duplicate”によるプロファイル指定が可能なことだけである。

ここでは、指定に注意が必要となるオプションを解説する。

ペインの分割には、「水平」(--horizontal)と「垂直」(--vertical)および「自動」がある。“--horizontal”または“--vertical”のどちらも指定しないと「自動」が指定されたと解釈され、現在のペインで水平、垂直の長い方の辺を分割する。タブ内が分割されていないときには、左右に分割され、そのうちの片方なら上下に分割される。

ペインサイズの比率は、“--size 数値”を使い、数値に1未満の小数を指定する。“--size”を指定しない場合には、0.5が仮定される。実際の範囲としては0.01から0.99までとなっており、1や0ではエラーになる。

また、この範囲の値であっても、ペインの列数、行数が1以下になってしまう場合、split-paneは無視される。この場合には、エラーにはならないが、ペインが作られないので注意が必要だ。

プレビュー版で利用可能な“--appendCommandLine”では、プロファイルの起動コマンドに指定したコマンドラインを追加できる。追加するコマンドラインは、“--appendCommandLine”の引数ではなく、サブコマンドの末尾に置かれるコマンドラインであることに注意が必要だ。以下は、PowerShellから起動する場合である。cmd.exeから起動する場合は、解析停止オプション“--%”は不要である。


wt.exe --% -w test1 new-tab --appendCommandLine --tabColor #FF0000 -p PowerShell -- -noprofile

もし、プロファイルの起動コマンドに対してオプション文字のついた引数(上記の-noprofile)を追加するような場合、上記のように追加オプションの前に“--”を置いて、Windows Terminalがこれを自身に対するオプションと解釈させないようにする。

ここは面倒なところで、末尾の「-noprofile」をシングルクオート、ダブルクオートでくくってしまうと、起動コマンドに正しくオプションが渡らない。

“--”は、オプション文字を含む文字列をオプションとして解釈させないためのWindows Terminalの表記方法である。おなじものは、bashなどにもある。Windows Terminalのドキュメントなどには記載がないが、ソースコードでは、この記法をPositional Markと呼んでいる。

“--inheritEnvironment”と、“--reloadEnvironment”は、タブやペインで起動されるシェルに対して引き渡される環境変数に関するものだ。

Windows Terminal V1.16安定版までは、Windows Terminalからプロファイルや起動コマンドとして起動されるプログラム(シェル)は、すべて、Windows Terminalの子プロセスだった。すべてのシェルは、Windows Terminal自身が起動時に引き継いだ環境変数を継承していた。

ところがV1.17からは、プロファイルなどで起動されるシェルは、その時点の環境変数を受け取り、Windows Terminalから環境変数を引き継がないようになった。

シェルの場合、あとからインストールしたプログラムがPath環境変数などに追加されるようなことを考えると、起動時に最新の環境変数を受け取るほうが便利である。しかし、環境変数を使って、子プロセスに情報を伝えるという手法も広く使われている。このような場合には、親プロセスから環境変数を引き継ぐ必要があり、最新の環境変数を引き継いだのでは、親プロセスが設定した環境変数をアクセスできない。V1.17の標準では、これができなかった。

その対策として、settings.jsonのプロファイルに「compatibility.reloadEnvironmentVariables」プロパティが導入され、コマンドラインには、環境変数の引き継ぎを制御する“--inheritEnvironment”と“--reloadEnvironment”が追加された。

コマンドラインのオプションは、設定に依存せず、親プロセスの環境変数を引き継ぐ(“--inheritEnvironment”)もしくは、引き継がず最新の環境変数を受け取る(“--reloadEnvironment”)といった動作を強制的に行う。

これに対して、“compatibility.reloadEnvironmentVariables”は、プロファイル単位で設定し、プロパティにtrueを設定するとV1.17と同じになり、falseでは、V1.16以前と同じ挙動となる。前記のオプションをどちらも指定しない場合には、この設定で動作が決定する。

ただし、シェルによっては、最新の環境変数を読み出して設定することも可能であるが、これは、シェル自体の機能に依存する。たとえば、PowerShellは可能だが、cmd.exeでは不可能である。

“--tabColor”と“--title”オプションは、split-paneで使う場合、“--profileや“--duplicate”でプロファイルを指定すると、有効にならないようだ(V1.19とV1.17で確認)。ただし、プロファイル指定がない、あるいはコマンドラインで直接起動コマンドを指定した場合には、 両オプションは有効になる。

その他のサブオプション

focus-tabおよびmove-paneサブコマンドは、引数として対象タブを識別するタブインデックスを使う。タブインデックスは、タブの作成順に割り当てられる整数番号で、最初のタブは0となる。また、最後のタブインデックスよりも大きな値を指定すると、move-paneは新規にタブを作成してそこにペインを移動させる。この2つのサブコマンドは、それぞれswitchToTab、moveFocusアクションに対応している。

move-focus、swap-paneでは、キーワードを使って対象を指定する。move-focusは、ペインの選択を行うが、キーワード(表03)で指定されたペインを選択状態にする。この2つのサブコマンドは、movePane、swapPaneアクションを実行するものだ。

  • ■表03

対象の指定は、タブ内の位置によるもの(up、down、left、right)と、作成順(first、netinOrder、previousInOrder)と、最後に利用したペイン(previous)の大きく3つに分類できる。ただし、タブインデックスのように対象を数値で直接指定することはできない。

Windows Terminalのコマンドラインを使うと、起動状態を細かく設定できる。また、ウィンドウIDを指定することで、サブコマンドを使って、タブやペインの追加や移動などが可能になる。

>> Windows Terminal ベスト設定 連載バックナンバー
https://news.mynavi.jp/tag/winterminal/