Chapter 04

設定ファイルの読み方

MURAOKA Taro
MURAOKA Taro
2020.10.22に更新

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の一部です。

https://github.com/microsoft/terminal/blob/90452664ff4541a417ccc1f50d38faca39ec89bb/doc/cascadia/profiles.schema.json#L1038-L1057

この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に定義されている全てのプロパティを置けるということになります。前章で紹介したalwaysOnTopGlobalsのプロパティの1つです。

allOfの2つ目の要素はインラインによるスキーマ定義です。その内容はおおざっぱにいうとprofilesschemesの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とアクションなどいくつかの例外はあるものの、おおよそ読み解くことができるでしょう。