Windows Terminalの設定はとても数が多く、また頻繁に追加・変更されます。変更と言っても主に説明書きが改善されたり定義が厳密になることがほとんどで、互換性が壊れるようなことは滅多には起こりませんので安心してください。
そのように頻繁に追加・変更されるため1つ1つ解説するのでは、読む側も書く側も時間がいくらあっても足りません。そのため設定ファイルとその定義の読み解き方を知ってしまうほうが幾分効率的です。
Windows Terminalの設定ファイルはJSON形式です。その設定可能な内容はJSON Schemaで定義され、各項目の説明がとても丁寧に記述されています。そのためJSON Schemaを読めるならば直接そのSchemaを読んでしまったほうが、どのような設定が可能なのかそれがどんな働きをするのかが瞬時にわかるでしょう。JSON Schemaはデファクトスタンダードですから、今は読めない人もこの際に読めるように勉強してしまうのが良いかもしれません。
最新のWindows Terminalの設定ファイルのSchemaはGitHub上の次のURLで確認できます。
https://github.com/microsoft/terminal/blob/master/doc/cascadia/profiles.schema.json
またJSON Schema自体がデファクトスタンダードに相当するため、それを可視化したりJSONエディタが対応している(=Schemaを読み込んで設定ファイルの専用エディタのようにふるまえる)場合があります。以下はJSON Schemaに対応したオンラインエディタです。
https://json-editor.github.io/json-editor/
本書ではJSON Schemaそのものについて解説するつもりはありませんが、Windows Terminalの設定ファイルの定義の入り口のところを題材にちょっとだけ解説しておきます。以下は執筆時点で最新のSchemaの一部です。
この1038~1057行目は設定ファイルのルート部分に何が書けるかを示しています。allOf
は配列で、要素内のスキーマを全て満たすことが求められます。その要素は2つで1つめはGlobals
です。これは前章で少し触れたGlobals
に相当します。
{ "$ref": "#/definitions/Globals" }
という表記はJSON Hyper-SchemaとかRelative JSON Pointersと言われるもので、要はJSON内の別のオブジェクトを参照するというものです。なおここではルート(#
)のdefintions
プロパティ内のGlobals
プロパティを参照しています。その開始位置は以下の場所になります。
https://github.com/microsoft/terminal/blob/90452664ff4541a417ccc1f50d38faca39ec89bb/doc/cascadia/profiles.schema.json#L498
つまり設定ファイルのルートにはGlobals
に定義されている全てのプロパティを置けるということになります。前章で紹介したalwaysOnTop
もGlobals
のプロパティの1つです。
allOf
の2つ目の要素はインラインによるスキーマ定義です。その内容はおおざっぱにいうとprofiles
とschemes
の2つ(これも前章で触れましたね)を必須プロパティとし、それに加えてdefaultProfiles
を必須としています。つまりこの3つは設定のルートに置けるではなく、置かねばならないわけです。
さてこのdefaultProfiles
は起動時のプロファイル設定を選択するものでGlobals
のプロパティの1つであり、その定義は次の場所にあります。これはGlobalsのpropertiesプロパティの中に相当します。
https://github.com/microsoft/terminal/blob/90452664ff4541a417ccc1f50d38faca39ec89bb/doc/cascadia/profiles.schema.json#L537-L540
defaultProfile
の定義を引用すると以下の通りで、その型が文字列でデフォルトプロファイルがどのような時に使われるかが解説されています。おっとWindows Terminalの起動時にも使われることは書いていませんが、実際には使われますね。
"defaultProfile": {
"description": "Sets the default profile. Opens by clicking the \"+\" icon or typing the key binding assigned to \"newTab\".",
"type": "string"
},
以上のように1つ1つ丁寧にJSON Schemaを読んでいけばどのような設定項目があるのか、それをどこにどのように書いたら良いのかは、keybindingsとアクションなどいくつかの例外はあるものの、おおよそ読み解くことができるでしょう。