• Windows Terminal ベスト設定 第4回「プロファイルのカスタマイズとフラグメント機能編」

今回は、プロファイルをカスタマイズして、プロファイル同士を区別しやすくする方法を考える。Windows Terminalでは、プロファイルにアイコンを付けることができるが、標準では、WSL系には同じアイコンが使われるため、複数のWSLディストリビューションを使い分ける場合に、タブやメインメニューの区別がしにくいと感じることがある。これを別のアイコンに変更することで区別が明確になり、使い勝手が向上する。

このとき、Windows Terminalの「フラグメント拡張」と呼ばれる機能を利用することで、個人のプロファイル設定をsettings.jsonとは分離して別ファイルに記録できるようになる。これにより、他のマシンでWindows Terminalを使う場合にも個人のプロファイル設定は、フラグメント拡張ファイルをコピーするだけですむ。あるいは、Windows Terminalをリセットした場合などにsettings.jsonが失われてしまうことがあるが、このような場合でも、個人のプロファイル設定を残すことが可能だ。

なお、同種のプロファイル同士を区別するためには、シェル側の設定を使い、タブタイトルなどを変更したほうがわかりやすい。このため、ここでは同種プロファイル間の区別は除外して考えることにする。

プロファイルを区別しやすくするカスタマイズ

Windows Terminalでは、プロファイルは実行するシェルごとに、Windows Terminalの設定を指定する。しかし、標準状態のプロファイルだと、タブやメインメニューの区別が付きにくいこともある。

たとえば、WSLのディストリビューションには、標準では、すべて同じペンギンのアイコンになってしまう。こうした、プロファイル同士の区別を用意にするには、プロファイル設定のうち「アイコン」、「背景画像」などを設定する(表01)。

  • ■表01

最も簡単な方法はタブタイトル文字列なのだが、タブタイトルは、中で実行するシェルがVTエスケープシーケンスを使って指定を行うもの(たとえばWSLのbashなど)もある。たとえば、カレントディレクトリなどが表示され、プロファイル間の識別としては有効でないことがある。タブタイトルは、同一プロファイル(同一シェル)間での区別に使うほうがよい。

パッと見て、常に区別が付きやすいカスタマイズ項目は、アイコンや背景画像である。前者は、タブやメインメニューでの識別、後者は、ウィンドウ間の識別に利用できる。両方を設定することで、少なくともプロファイル間の識別は容易になるはずだ。

Windows Terminalのアイコンファイルを作る

Windows Terminalでは、プロファイルにアイコンを指定することができる。アイコンには画像ファイル、もしくはユニコード絵文字を指定することができる。画像ファイル形式は、JPEG、GIF、BMP、TIFF、PNG、ICOが利用できる。この中で扱いやすいのはPNGあるいはGIFだ。Windows Terminalでは、画像ファイルの透明色に対応している。JPEG、BMPでは透明色が使えず、TIFFやICOはエクスプローラーのサムネイル表示やプレビューが標準対応していないため、ファイルを開かないと中を見ることができず、扱いが面倒になる。

Windows Terminal上での表示としてはアイコンは16x16ドットになるため、あまり細かい画像は適さない。しかし、直接16x16ドットの画像を作る必要はなく、32×32~64×64ドットのPNGファイルを指定すれば、Windows Terminalが自動的に縮小し適切な表示にしてくれる。

WSLディストリビューションのパッケージフォルダーにはPNG形式のアイコンがある。これらは、PowerShellのコマンドで調べることができる。たとえばUbuntu関連のディストリビューションなら、


explorer.exe @(Get-AppPackage | where -Property PackageFullName -like "*Ubuntu*" | % { Write-Output "`"$(Join-Path $_.Installlocation "Assets")`"" })[0]

とする(写真01)。このファイルをそのままWindows Terminalのアイコンとして指定することも、別フォルダーにコピーして編集して使うこともできる。

  • 写真01: WSLのディストリビューションは、パッケージ内にPNGファイルのアイコンデータを持っている。これを使うことで、Windows Terminalでアイコンを表示できるようになる

アイコン画像を作るとき、画像の周囲の空き部分はなるべく小さくして透明にしておく。PNG形式の画像ファイルは、ペイントソフトなどを使って、色違いのアイコン画像を作ると同種のプロファイル、たとえばUbuntuとUbuntu 20.04 TLSなどを区別するアイコンを作り分けることが可能だ。

簡易な方法として、ユニコード絵文字を使う方法もある。Windowsでは、カラー絵文字がサポートされており、たとえば、色違いの矩形や円、ハートマークなどをアイコンとして使うことで、タブやメニューを区別しやすくすることも可能だ。

背景画像を作る

Windows Terminalでプロファイルを区別する別の方法として背景画像がある。アイコン画像がメインメニューやタブの区別に有用なのに対して、背景画像はWindows Terminalウィンドウ間、タブ間の区別に役立つ。

背景画像は、適当なサイズであれば、どんなものでもかまわない。もちろん、自分好みの画像を使ってもよい。

ここでは、プロファイル名を画像にしたものを背景画像として作成する。好みの方法を使ってかまわないが、ImageMagickを使うと、コマンドラインから作成が行える(写真02)。

  • 写真02: 背景画像としてプロファイルに関連した文字を画像化したものを使うとタブやウィンドウが区別しやすくなる。ここでは、ImageMagickというプログラムを使い、コマンドで画像を生成させた


magick.exe -background green  -fill gray20  -font "Times-New-Roman-Bold" -pointsize 500 -gravity center -fuzz 20% caption:"Ubuntu" -transparent green c:\temp\Ubuntu.png

上記の例では文字は20%グレーとし、背景を透明(グリーンで描画したのち、グリーンを透明色に指定)にしてある。表示する文字は“caption:”で指定する。

注意が必要なのはデフォルトの背景画像は黒なので、画像の背景が透明だと背景が黒になるため、文字を黒で描画すると見えなくなる点だ。逆に明度の高い画像では文字などが見にくくなる恐れがある。Windows Terminal設定の「背景画像の不透明度」は、背景画像の透明な部分には影響しない。しかし、設定の「背景の不透明度」はWindows Terminalの背景全体を透過させるため、背景画像の透明部分の表示にも影響が出る(図01)。

  • 図01: 背景画像の指定では、Windows Terminalの標準背景色が黒であること、背景と背景画像に個別に不透明度を指定できる点に注意が必要。背景画像の透明部分は設定にかかわらず、必ずWindows Terminalの背景を透過する

画像をどのようにWindows Terminalウィンドウ内に表示させるかを指定するのが“backgroundImageStretchMode”(表02)だ。簡単にいうと、横を合わせるか(Uniform-Fit)、縦を合わせるか(Uniform)、ウィンドウに合わせるか(Fill)、何もしないか(None)の4つのパターンが選択できる。通常は、横幅を合わせるUniform-Fitにしておけば問題ないが、縦横比に影響されない模様のようなものはFillが向いている。逆に周囲のほとんどが透明なロゴのような画像だとUnifomにして画像がはみ出さないようにできる(図02)。

  • ■表02

  • 図02: 背景画像の配置を指定する“backgroundImageStretchMode”では、4つのパターンが選択可能だ。画像の内容や状態によって適切なパターンを選択する

JSONフラグメント拡張機能とは?

Windows TerminalのJSONフラグメント拡張は、settings.jsonによる設定に対して、プロファイルの追加、更新、カラースキーマの追加を可能にする機能だ。

ただし、フラグメント拡張で行えるのは、プロファイルの更新および追加に限られ、Windows Terminal全般の設定、たとえば、ウィンドウサイズやキーボード割り当てなどを設定することはできない。

フラグメント拡張は、以下のパスのどれかに新規にフォルダーを作成し、後述するフラグメント拡張JSONファイルを置くことで動作する。


C:\ProgramData\Microsoft\Windows Terminal\Fragments\
C:\Users\<user>\AppData\Local\Microsoft\Windows Terminal\Fragments\

フラグメント拡張JSONファイルは、基本的には、settings.jsonのプロファイル設定やカラースキーマ設定に準じた記述を行う。ただし、以下のフラグメント拡張用のプロパティが利用できる。


"update":"<更新プロファイルのGUID>"

フラグメント拡張JSONファイルは(図03)のような構造になっている。図の「プロファイル更新/追加設定」の部分は、settings.jsonのプロファイル設定とまったく同じ記述が利用できる。プロファイル設定に関しては、

  • 図03: フラグメント拡張は、JSON形式ファイルで、profilesとschemesの2つのオブジェクトを持つ。profilesは配列を内部に持ち、その中にプロファイルの更新、追加設定をオブジェクトとして持つ

・Windows Terminal ベスト設定 第3回「プロファイル 基本編」
https://news.mynavi.jp/article/20220407-2315883/

に説明がある。これに加えて、settings.jsonで定義されたプロファイルを更新(書き換え)る場合には、前述の"update"プロパティを入れて、対象のプロファイルをGUIDで指定する。"update"プロパティが存在しない「プロファイル更新/追加設定」は、新規に追加するプロファイルだと判断される。

settings.jsonやプロファイルGUIDに関しては、

・Windows Terminal ベスト設定 第1回「キーボードカスタマイズ 導入編」
https://news.mynavi.jp/article/20211025-2168960/ ・Windows Terminal ベスト設定 第3回「プロファイル 基本編」
https://news.mynavi.jp/article/20220407-2315883/

に解説がある。

フラグメント拡張を設定する

ここでは具体的にフラグメント拡張を使い、既存のプロファイルを更新、新規プロファイルの追加を行う。具体的には、WSLのUbuntuのプロファイルにアイコンを追加し、open-ssh接続用のプロファイルを追加する。

まずは、Ubuntu用のアイコン、背景画像を用意する。アイコンにはUbuntuのパッケージに含まれている画像を使う。背景画像ファイル(Ubuntu.png)は前記のImage Magickコマンドで作成した。どちらもC:\tempフォルダーに配置したとする。

新規プロファイルとして、open-sshによるリモートログイン用のプロファイルを作る。"commandLine"プロパティにssh.exeと引数を設定することで、プロファイルを追加できる。

まずは、自身のユーザーフォルダーの下にフラグメント拡張JSONファイルを置くことにしよう。ここでは仮のフォルダ名を“shioda”とする。

以下のパスでフォルダーを作成する。“”は自分のユーザーフォルダに合わせて書き換える。


"C:\Users\<user>\AppData\Local\Microsoft\Windows Terminal\Fragments\shioda"

ここに適当な名前のJSONファイルを作成する(ここではMyFragment.jsonとする)。その中身は、(リスト01)のようになる。パス指定では区切り文字を“\”とする点に注意されたい。

リスト01


{
    "profiles": [
        {
            // Ubuntu
            "updates":"{2c4de342-38b7-51cf-b940-2309a097f518}",
            "backgroundImage":"C:\\temp\\Ubuntu.png",
            "backgroundImageStretchMode": "uniform",
            "icon":"C:\\temp\\Ubuntu32.png"
        },
        {
            // Add New Profile ssh hostX
            "name":"ssh hostX",
            "commandline": "ssh shioda@hostX"
        }
    ]
}

JSONファイルを作成したら、Windows Terminalを再起動する。これで、フラグメント拡張が読み込まれる(写真03)。フラグメントの更新は、必ずWindows Terminalの再起動が必要になる。

  • 写真03: フラグメント拡張で、Ubuntuのプロファイルにアイコンと背景画像を追加し、新規にssh用のプロファイルを追加した

Windows Terminalの標準状態はあくまでも最低限の設定であるため、たとえば複数のシェルを使うなどの場合には、判別が難しく、使い勝手が悪いことがある。しかし、プロファイル間の判別を容易にすることは難しくない。