現在のWindows Terminal安定版(Ver.1.17.11461.0)以降では、タブバー右端のメニュー(New Tab Menu。タブメニューと表記)をカスタマイズすることができる。
ただし、現時点でカスタマイズが可能なのは、タブメニューの新規タブを開くプロファイルのリスト部分のみで、メニュー下部にある、「設定」、「コマンドパレット」、「バージョン情報」の部分を変更することはできない。
なお、JSONについては前回の解説を参考にされたい。ここでは、JSONのプロファイルをダブルクオートなしで表記するが、JSONファイル内では、必ずダブルクオートで括られていることに注意されたい。
プロファイルに関しては、過去記事「第3回 プロファイル 基本編」を参考にされたい。
メニューカスタマイズの概要
タブメニューのカスタマイズは、settings.jsonファイルでのみ行える。カスタマイズできるのは、プロファイルに対応した新規タブ項目のみで、現時点では、新規タブ以外のアクションを登録することはできない。
実際に出来るのは、項目の並べ替えと、複数のプロファイルをまとめる「フォルダー」によるサブメニュー化である。これにより、多数のプロファイルを登録しても、カテゴリごとに分類したり、利用頻度の高いものを前方に並べるといったことが可能になる。
なお、タブメニューのプロファイル右側に表示されているショートカットキーは、profilesオブジェクト、list配列内の先頭にあるプロファイルがctrl+shift+1となり、以後、ctrl+shift+2、同3……とctrl+shift+9までが割り当てられ、タブメニューをカスタマイズしても、ショートカットキーは変更されない。
また、現在のWindows Terminalでは、このショートカットキーは固定表示で、ctrl+shift+1~9キーの割り当てを変えても、元の表示のままになるため注意されたい(修正の予定はあるようだが、未対応である)。
メニューの定義方法
タブメニューのカスタマイズは、トップレベルにあるnewTabMenu配列を使って行う(図01)。配列内に、項目に対応したオブジェクトを定義することで、メニュー項目として表示する。以後、newTabMenu配列の要素(JSONのオブジェクト)を「メニュー項目」と表記する。
メニュー項目には、には、必ず“type”プロパティがあり、そのタイプを指定する(表01)。タイプは「単一プロファイル」、「フォルダー」、「プロファイル検索」、「残りプロファイル」の4種類あり、さらにメニュー項目同士を上下に分離できる「セパレーター」を使うことができる。なお、GitHub上の文書には、タブメニューのプロファイル以外の項目(設定やバージョン情報など)に相当する「アクション」が予定されているが、現在は利用できない。
単一プロファイルをメニュー項目にする場合「"type":"profile"」を使う。このときには、profileプロパティを併用し、プロファイルを指定する。プロファイルの指定は、プロファイルのGUIDまたは、名前(name)で行える。
具体的には、以下のようなオブジェクトを定義することで、タブメニュー項目を表示できる。
{
"profile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
"type": "profile"
},
また、プロファイルで定義した名前を使ってメニュー項目を定義することもできる。
{
"profile": "Ubuntu-22.04" ,
"type": "profile"
},
ただし、プロファイルを名前で指定しても、settings.jsonが読み込まれ、Windows Terminalが再起動して、再生成されたときにはGUIDに置き換わる。また、プロファイル指定が存在しない場合には、何も表示しない。
プロファイルのGUIDは、プロファイルのnameプロパティ名称から作られるため、Windows Terminalが自動的に作成する「動的プロファイル」の場合、必ず同じGUIDが使われる。
これにより、異なる動的プロファイルを持つ他のマシンからsettings.jsonを持ってきても、該当のプロファイルが存在しなければメニュー項目は表示されず、エラーにもならない。
単一プロファイル("type":"profile")を指定した場合、プロファイル側で有効なnameとiconプロパティを項目表示に利用する。newTabMenu配列側ではアイコンや表示名を指定できない。
この単一プロファイルがnewTabMenu配列の基本要素となる。タブメニューでは、プロファイル名で表示され、選択すると該当プロファイルを使って新しいタブを開く。クリック時にAltキー、Shiftキー、Ctrlキーを単独で併用することで、それぞれ「ペイン」、「新規ウィンドウ」、「管理者として新規ウィンドウ」で該当プロファイルを開く。
フォルダー
複数のプロファイルをまとめてサブメニューを作るには、メニュー項目にフォルダー("type":"folder")を使いフォルダーを作る。このメニュー項目は、(図02)のような構造を持つ。
フォルダーは、nameプロパティで表示名を定義し、iconプロパティで表示するアイコンを指定できる。どちらも必須ではないが、nameプロパティを定義しないと何も表示されないメニュー項目になってしまう。
フォルダーには、entries配列があり、この中に他のメニュー項目を入れる。フォルダーをさらに入れて、多重にフォルダを定義することもできる。
前述のように、メニュー項目は、実際には存在しないプロパティを指定していることもあり、メニュー項目が定義されていても、対応するプロパティが存在しないことがある。このため、フォルダーは、サブメニュー項目が存在しないとき、存在しても1つしかない場合にフォルダーとして表示するかどうかを制御することができる。
サブ項目が1つだけの場合、inlineプロパティをautoにしておくと、サブメニューを作らず、サブ項目を1つの項目のように表示する。それに対してneverを指定すると、サブ項目が1つしかなくてもフォルダーとして表示する。
サブ項目が存在しない場合、allowEmptyプロパティをtureにすると、常にフォルダーをメニュー項目として表示する。falseにすると、サブ項目が存在しない場合には、フォルダー自体を表示しない。同様に、プロファイル側でhiddenプロパティにtrueが定義されていると、該当のプロファイルは、タブメニューでは扱えなくなる。
matchProfiles
プロファイル検索("type":"matchProfiles")を使うと、指定した条件を満たすプロパティをすべてメニュー項目とする。これは、フォルダーに入れても入れなくてもよい。
プロパティを選択する条件は、commandline、name、sourceプロパティで指定を行う。それぞれ、プロファイルの同名のプロパティと一致したものを選択する。ただし、この選択は、完全一致でのみ行われ、ワイルドカードや部分一致ではないことに注意されたい。
プロファイルのsourceプロパティは、動的プロファイルの対象を区別するもので、現時点では、(表02)の4種類がある。たとえば、動的プロパティで登録されたWSLのディストリビューションをすべてメニュー項目にするには、
"source":"Windows.Terminal.Wsl"
をmatchProfilesのプロパティとして追加する。
参照しなかったプロファイル
メニュー項目として残りプロファイル("type":"remainingProfiles")を使うと、上記のメニュー項目で参照されなかった残りのプロファイルをまとめて扱うことができる。メニュー項目として入れておくことで、利用可能なプロファイルの残りすべてを表示させることが可能だ。なお、この項目はnewTabMenu配列のどこにあってもよく、位置的に最後に入れる必要はなく、フォルダー内に配置することも可能だ。
このメニュー項目には、追加のプロパティは不要である。
セパレーター
メニュー項目同士を離して、区別しやすくするにはセパレーターを使うことができる。それには、以下のメニュー項目を分離したいメニュー項目の間に置く。
{ "type": "separator" },
セパレーターはいくつでも置くことができ、フォルダー内にも置くことが可能だ。
サンプル
(リスト01)は、カスタムメニューのサンプルである。基本的には、動的プロファイルをすべて含み、種類ごとにフォルダーに分類し、PowerShell 7とWSLのUbuntuだけは単一プロファイルでトップレベルに入れてある。
■リスト01
"newTabMenu": [
{ "type": "profile","profile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}" },
{ "type": "profile","profile": "{51855cb2-8cce-5362-8f54-464b92b32386}" },
{ "type":"separator"},
{
"type": "folder",
"name": "PowerShell",
"allowEmpty": false,
"inline": "never",
"entries": [
{ "type": "profile","profile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}" },
{ "type": "matchProfiles","source": "Windows.Terminal.PowershellCore" }
]
},
{
"type": "folder",
"name": "WSL",
"allowEmpty": false,
"inline": "never",
"entries": [ { "type": "matchProfiles", "source": "Windows.Terminal.Wsl" } ]
},
{
"type": "folder",
"name": "Visual Studio開発コマンド",
"allowEmpty": false,
"inline": "never",
"entries": [ { "type": "matchProfiles","source": "Windows.Terminal.VisualStudio" } ]
},
{ "type":"separator"},
{
"type": "folder",
"name": "その他",
"allowEmpty": false,
"inline": "never",
"entries": [ { "type": "remainingProfiles" } ]
}
],
自分で登録したプロファイルがある場合には、メニュー項目としてプロファイルを作り、適当なところに登録する。
また、動的プロファイルのうち、利用しないものがあるなら、プロファイル側でhiddenプロパティをtureにしてタブメニューから隠すのがいいだろう。
別の方法として、settings.jsonのグローバル設定(トップレベルの波括弧の中)にdisabledProfileSources配列を置き、(表02)の項目を指定すると、該当する動的プロファイルの自動生成が無効になる。
標準のタブメニューでもいいのだが、項目が増えると選択が面倒になる。PowerShell、WSL、開発ツール(Visual Studioのコマンドライン)をサブ項目とすることでメニューがすっきりする。利用頻度の高いプロファイルのみトップレベルに置くことで、選択が簡単になる。
>> Windows Terminal ベスト設定 連載バックナンバー
https://news.mynavi.jp/tag/winterminal/