今回は、プロファイルをカスタマイズして、プロファイル同士を区別しやすくする方法を考える。Windows Terminalでは、プロファイルにアイコンを付けることができるが、標準では、WSL系には同じアイコンが使われるため、複数のWSLディストリビューションを使い分ける場合に、タブやメインメニューの区別がしにくいと感じることがある。これを別のアイコンに変更することで区別が明確になり、使い勝手が向上する。
このとき、Windows Terminalの「フラグメント拡張」と呼ばれる機能を利用することで、個人のプロファイル設定をsettings.jsonとは分離して別ファイルに記録できるようになる。これにより、他のマシンでWindows Terminalを使う場合にも個人のプロファイル設定は、フラグメント拡張ファイルをコピーするだけですむ。あるいは、Windows Terminalをリセットした場合などにsettings.jsonが失われてしまうことがあるが、このような場合でも、個人のプロファイル設定を残すことが可能だ。
なお、同種のプロファイル同士を区別するためには、シェル側の設定を使い、タブタイトルなどを変更したほうがわかりやすい。このため、ここでは同種プロファイル間の区別は除外して考えることにする。
プロファイルを区別しやすくするカスタマイズ
Windows Terminalでは、プロファイルは実行するシェルごとに、Windows Terminalの設定を指定する。しかし、標準状態のプロファイルだと、タブやメインメニューの区別が付きにくいこともある。
たとえば、WSLのディストリビューションには、標準では、すべて同じペンギンのアイコンになってしまう。こうした、プロファイル同士の区別を用意にするには、プロファイル設定のうち「アイコン」、「背景画像」などを設定する(表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のアイコンとして指定することも、別フォルダーにコピーして編集して使うこともできる。
アイコン画像を作るとき、画像の周囲の空き部分はなるべく小さくして透明にしておく。PNG形式の画像ファイルは、ペイントソフトなどを使って、色違いのアイコン画像を作ると同種のプロファイル、たとえばUbuntuとUbuntu 20.04 TLSなどを区別するアイコンを作り分けることが可能だ。
簡易な方法として、ユニコード絵文字を使う方法もある。Windowsでは、カラー絵文字がサポートされており、たとえば、色違いの矩形や円、ハートマークなどをアイコンとして使うことで、タブやメニューを区別しやすくすることも可能だ。
背景画像を作る
Windows Terminalでプロファイルを区別する別の方法として背景画像がある。アイコン画像がメインメニューやタブの区別に有用なのに対して、背景画像はWindows Terminalウィンドウ間、タブ間の区別に役立つ。
背景画像は、適当なサイズであれば、どんなものでもかまわない。もちろん、自分好みの画像を使ってもよい。
ここでは、プロファイル名を画像にしたものを背景画像として作成する。好みの方法を使ってかまわないが、ImageMagickを使うと、コマンドラインから作成が行える(写真02)。
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)。
画像をどのようにWindows Terminalウィンドウ内に表示させるかを指定するのが“backgroundImageStretchMode”(表02)だ。簡単にいうと、横を合わせるか(Uniform-Fit)、縦を合わせるか(Uniform)、ウィンドウに合わせるか(Fill)、何もしないか(None)の4つのパターンが選択できる。通常は、横幅を合わせるUniform-Fitにしておけば問題ないが、縦横比に影響されない模様のようなものはFillが向いている。逆に周囲のほとんどが透明なロゴのような画像だとUnifomにして画像がはみ出さないようにできる(図02)。
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のプロファイル設定とまったく同じ記述が利用できる。プロファイル設定に関しては、
・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の再起動が必要になる。
Windows Terminalの標準状態はあくまでも最低限の設定であるため、たとえば複数のシェルを使うなどの場合には、判別が難しく、使い勝手が悪いことがある。しかし、プロファイル間の判別を容易にすることは難しくない。
>> Windows Terminal ベスト設定 連載バックナンバー
https://news.mynavi.jp/tag/winterminal/