今回は、前回に引き続き、Windows Terminal 1.3で拡張されたコマンドパレットの使い方を紹介する。前回の記事の執筆時点ではバージョン1.3はまだプレビュー版だったが、その後2020年9月22日に正式リリースされたため、拡張されたコマンドパレットも正式版として利用できるようになった。バージョン1.3のコマンドパレットは、複数のコマンドをグループ化して階層構造を作れるなど、いくつかの新機能が追加された。それに伴って「setting.json」および「default.json」におけるキーボードショートカット設定の記述方法も拡張されている。今回はその拡張された設定方法について取り上げる。

コマンドにアイコンを表示する

まず、バージョン1.3ではコマンドパレットの各コマンドに任意のアイコンを表示できるようになった。アイコンの表示は必須ではなく、デフォルトでは省略されている。アイコンを表示したい場合は、次のようにコマンドの設定に対してiconプロパティを追加すればよい。一番簡単なのは任意の文字をアイコンに使用することで、この例の場合は虫眼鏡の絵文字を使っている。

iconプロパティに虫眼鏡の絵文字をセット

この場合、次のようにコマンド名の左側に絵文字がアイコンとして表示される。

絵文字をアイコンとして追加

任意の画像をアイコンにすることもできる。その場合、次のように画像のパスをiconプロパティに設定すれば、指定された画像がアイコンとして表示される。

iconプロパティに画像ファイルのパスをセット

任意の画像をアイコンとして追加

アイコンを追加する3つ目の方法はSegoe MDL2アセットのアイコンフォントを使用することだ。Segoe MDL2アセットはWindows 10に標準で用意されているフォントファミリーで、よく使われそうなアイコンに相当するフォントをたくさん含んでいる。Segoe MDL2アセットについては、以下のガイドラインを参照していただきたい。


このガイドラインで解説されているように、Segoe MDL2アセットフォントに含まれるアイコンはUnicodeの私用領域(PUA) にマップされている。そのため、setting.jsonでは、使用したいアイコンをUnicodeのコードポイントとして指定することができる。例えば、検索によく使われる虫眼鏡アイコンのコードポイントは「E721」だ(ガイドラインのページの一覧表を参照されたい)。そこで、iconプロパティには次のように「\u」の後に「E721」を繋げて記述する。

iconプロパティにSegoe MDL2アセットのコードポイントをセット

これで、Segoe MDL2アセットの虫眼鏡マークが、コマンドパレットのアイコンに表示されるようになる。

Segoe MDL2アセットフォントの文字をアイコンとして追加

ネストされたコマンドの設定方法

複数のコマンドをグループ化してネスト表示する設定も、setting.jsonへのキーボードショートカットの設定部分で記述することができる。例えば次のように、タブの色設定を行うコマンドをグループ化したい場合を考えてみよう。

複数のコマンドを「タブの色を設定する」という項目にまとめる

「カラーパレットを開く」は文字通りカラーパレットを表示し、「タブの色を○にする」はタブの背景色をその色に変える。いずれも第34回で紹介した、バージョン1.2で追加された新しいコマンドである。

このようなネストされたコマンドを作りたい場合には、設定ファイルには次のように記述する。

{
    "name": "タブの色を設定する",
    "commands": [
        {
            "name": "カラーパレットを開く",
            "command": "openTabColorPicker",
            "keys": "ctrl+alt+c"
        },
        {
            "name": "タブの色を赤にする",
            "command": { "action": "setTabColor", "color": "#ff0000" },
            "keys": "ctrl+alt+r"
        },
        {
            "name": "タブの色を緑にする",
            "command": { "action": "setTabColor", "color": "#00ff00" },
            "keys": "ctrl+alt+g"
        },
        {
            "name": "タブの色を青にする",
            "command": { "action": "setTabColor", "color": "#0000ff" },
            "keys": "ctrl+alt+b"
        }
    ]
}

まず最初のnameプロパティはトップに表示されるコマンド名(コマンドのグループ名)である。続いて、「commands」プロパティを使って、グループ化したいコマンドを配列として記述する(「[」と「]」の中にカンマ区切りで並べる)。commandsの中に入れるコマンドは、それぞれ単体のコマンドとして記述する場合と同様でよい。

一見複雑に見えるが、実際にはcommandsの「[」と「]」の間に各コマンドの記述を並べただけなので、自分なりのグループを定義するのもそれほど難しくはないだろう。

反復指定で複数のコマンドを作成する

続いて、次の「New Tab…」のコマンドがどのように定義されているのかを見てみよう。「New Tab…」はデフォルトで用意された項目で、選択するとどのプロファイルで新規タブを作成するのかというリストが表示される。

「New Tab…」の表示例

ネストされたコマンドと同様だが、注目すべきポイントは、2段目の選択肢には使用可能な全てのプロファイル分用意しなければならないことだ。筆者の環境では6種類のプロファイルがあるので、6個のコマンド定義が必要ということになる。

このようなケースでは、反復指定を利用することで設定ファイルの記述を大幅に省略することができる。反復指定とは、例えば「全てのプロファイルに対して1つずつコマンドを作成する」というような指定方法である。default.jsonの「New Tab…」の定義を見てみると次のようになっている。

{
    "name": { "key": "NewTabParentCommandName" },
        "commands": [
            {
                    "iterateOn": "profiles",
                    "icon": "${profile.icon}",
                    "name": "${profile.name}",
                    "command": { "action": "newTab", "profile": "${profile.name}" }
                }
        ]
}

最初のnameプロパティは少し特殊な指定になっているが、自分で定義する場合はここは通常通りコマンドパレットに表示したい任意の名前を記述すればよい。特徴的なのは2段目にある「iterateOn」というプロパティと、「${profile.icon}」と「${profile.name}」という値指定だ。

まずiterateOnプロパティだが、ここには反復したい対象の要素を指定する。「profile」と指定した場合は、全てのプロファイルについて反復的にコマンドを生成するという意味になる。そして「${profile.icon}」は対象プロファイルのiconプロパティの値に、「${profile.name}」はnameプロパティの値に置き換わる。

バージョン1.3の時点では、反復指定できる対象はプロファイルとスキーマの2つだけであり、その場合にiterateOnに指定する値と、使用可能なプロパティの組み合わせは次のようになっている。

iterateOnの指定 プロパティ プロパティの値の指定方法
profiles name “name”: “${profile.name}”
profiles icon “icon”: “${profile.icon}”
schemes name “name”: “${scheme.name}”

「New Tab…」と同様の反復指定を利用して作成されたコマンドに「Split Pane…」がある。これも「Split Pane…」をクリックした後にペインを開くプロファイルが選択できるが、タブの場合と違うのは、プロファイルを選んだ先でさらにどの方向にウィンドウを分割するのかを選択できることだ。

「Split Pane…」の表示例

日本語表記が少しおかしいが、上から「自動指定」「横に分割」「縦に分割」のコマンドになる。全てのプロファイルに対して、同じように3つの選択肢ができている。このようなネスト構造は、設定ファイルではどのように記述されているのだろうか。

default.jsonの「Split Pane…」の指定部分を見てみると次のような記述になっている。

{
    "name": { "key": "SplitPaneParentCommandName" },
        "commands": [
            {
                    "iterateOn": "profiles",
                    "icon": "${profile.icon}",
                    "name": "${profile.name}...",
                    "commands": [
                            {
                                "command": { "action": "splitPane", "profile": "${profile.name}", "split": "auto" }
                            },
                            {
                                    "command": { "action": "splitPane", "profile": "${profile.name}", "split": "vertical" }
                            },
                            {
                                    "command": { "action": "splitPane", "profile": "${profile.name}", "split": "horizontal" }
                            }
                        ]
                }
        ]
}

各プロファイルの設定部分で、さらにcommandsプロパティを使って複数のコマンドを並べている。反復指定とネストの合わせ技である。

このように、Windows Terminal 1.3のコマンドパレットは1.2のものに比べて設定の記述方法も大幅に拡張されており、柔軟な項目の作成が可能になっている。確実に使いやすくなっているため、新機能も大いに活用していきたい。

参考資料