Windows Terminalをカスタマイズしよう！(v1.0.1401.0版)

## Windows Terminalって？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/b9ffa9c7-5f68-e444-7c81-8d02884729d6.png)

[**Windows Terminal**](https://github.com/microsoft/terminal)はMicrosoftによって~~開発中の~~開発された新しいターミナルアプリです。
~~まだPreview版なので不具合もありますが、~~シンプルで使いやすいので少しずつカスタマイズしています。

**■2020/06/13更新：v0.11.1121.0版からv1.0.1401.0版に更新しました。**
2020/06/13時点で最新のv1.0.1401.0版でも本記事の内容は有効です。
**■2020/04/27更新：v0.8.10091.0版からv0.11.1121.0版に更新しました。**
2020/04/27時点で最新のv0.11.1121.0版でも本記事の内容は有効です。
設定ファイルの名称が`profiles.json`から`settings.json`にリネームとなった点を修正しました。
**■2020/01/16更新：v0.7.3451.0版からv0.8.10091.0版に更新しました。**
2020/01/16時点で最新のv0.8.10091.0版でも本記事の内容は有効です。
複数のprofileで共通のシェル設定を指定する新機能について追記しました。
**■2020/01/09更新：v0.5.2661.0版からv0.7.3451.0版に更新しました。**
2020/01/09時点で最新のv0.7.3451.0版でも本記事の内容は有効です。

## settings.jsonを編集しよう！

Windows Terminalはv0.5.2661.0にアップデートしてから、設定ファイルである~~`profiles.json`~~`settings.json`の内容が大きく変わりました。
以前のバージョンではすべての設定を`settings.json`で管理していましたが、アップデート後は

- 既定の設定である`defaults.json`
- 環境に合わせて動的に生成される`Dynamic Profiles`
- ユーザ毎の設定である`settings.json`

という3つの設定に分かれました。
`settings.json`の内容がユーザ毎の設定に限られるので、以前のバージョンよりも設定を管理しやすくなりましたね。

> 参考
> https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md#settings-layering

今回は次のカスタマイズをしてみたいと思います。

1. Windows Terminal起動時、WSLが開くようにする
2. 背景画像の追加／カラースキームを変更して見た目を変える
3. フォントを変える
4. [2020/01/16追記]複数の`profile`で共通のシェル設定を指定する

そもそもですが、`settings.json`は`%LOCALAPPDATA%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState`に格納されています。Windows Terminalの[Settings]をクリック、又は「<kbd>Ctrl</kbd>+<kbd>,</kbd>」ショートカット操作で、既定のエディタで開くことができます。
ちなみに「<kbd>Alt</kbd>」キーを押下しながら[Settings]をクリックすると、既定の設定である`defaults.json`を開くことができます。既定値を確認したいときに便利です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78896/2d628df3-46c0-f99b-c142-789fcfa2bc8f.png)

実際に自分が使用している`settings.json`は[GitHub](https://github.com/hideki0145/setting-tips/blob/master/terminal/windows/settings.json)にて公開しています。

### 1. Windows Terminal起動時、WSLが開くようにする

```json:settings.json
// To view the default settings, hold "alt" while clicking on the "Settings" button.
// For documentation on these settings, see: https://aka.ms/terminal-documentation

{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{2c4de342-38b7-51cf-b940-2309a097f518}", // ★ここにWSLのGUIDを指定★

    "profiles":
  .
  .
```

Windows Terminalでは、シェル設定を`profiles`という単位で管理しています。このprofiles毎に一意となるIDが`GUID`で、例えばWSL(ディストリビューションはUbuntu)の場合は`"guid": "{2c4de342-38b7-51cf-b940-2309a097f518}"`となります。
このGUIDを`"defaultProfile"`プロパティに指定することで、Windows Terminalを起動した時に対応するシェル：WSLが開くようになります。

ただ、この設定だけだとWSLが開いた際のディレクトリ位置は`%USERPROFILE%`となっています。
WSL上のホームディレクトリを初期位置とするには、次の設定をWSL profileにする必要があります。

```json:settings.json
  .
  .
        {
            "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
            "hidden": false,
            "name": "Ubuntu",
            "source": "Windows.Terminal.Wsl",
            "commandline": "wsl.exe ~ -d Ubuntu" // ★ ~ を付けるのがポイント★
        },
  .
  .
```

WSL profileは`Dynamic Profiles`という仕組みで動的に初期値が生成されるようです。`"source"`プロパティに指定された値によって、どの初期値を生成するかが決まります。このDynamic Profilesという仕組みは、ランタイム情報を確認してからでないと生成できない初期値(＝defaults.jsonには含めづらい動的な初期値)に対応する為に考えられたようです。

> 参考
> Add Dynamic Profile Generators #2603
> https://github.com/microsoft/terminal/pull/2603

Dynamic Profilesで生成される`"commandline"`プロパティの値は`"wsl.exe -d Ubuntu"`(ディストリビューションの部分は環境により変化有)ですが、`"wsl.exe ~ -d Ubuntu"`と`~`を加えてあげると、起動時にWSL上のホームディレクトリを初期位置としてくれます。

他にも`"startingDirectory"`プロパティに`"\\wsl$\Ubuntu\home\username"`と指定しても起動時にWSL上のホームディレクトリを初期位置としてくれます。
しかし、usernameを含まないといけないので自宅／職場等 usernameが異なる環境でsettings.jsonを使いまわしたいときに面倒です。
ちなみに`"startingDirectory"`プロパティはWindows上でのパスを指定しないといけないので、`"~"`と指定したとしても正しく動作しません。

**■2020/01/09追記：`"commandline"`プロパティの設定について補足**
昨年末、本記事を読んでいただいた方から

> `"commandline": "wsl.exe ~ -d Ubuntu" // ★ ~ を付けるのがポイント★`
> のチルダが不要で、動きませんでした。Versionが違うせいかもしれません。

という情報をいただきました。
今のところ自分の環境ではチルダが付いていても問題なくWSL上のホームディレクトリが開きますので、検証したバージョンを記載しておきます。

- Windows 10 Pro 1903
- Windows Terminal (Preview) v0.5.2661.0版
- WSL Ubuntu ディストリビューション

又は

- Windows 10 Pro 1909
- Windows Terminal (Preview) v0.7.3451.0版
- WSL Ubuntu ディストリビューション

もしうまくいかない方がいらっしゃったら、実際に自分が使用している`settings.json`を[GitHub](https://github.com/hideki0145/setting-tips/blob/master/terminal/windows/settings.json)で公開しているので、自身の`settings.json`と差分を取ってみるのもいいかもしれません。

### 2. 背景画像の追加／カラースキームを変更して見た目を変える

Windows Terminalは背景画像も簡単に変更することができます。

```json:settings.json
  .
  .
        {
            "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
            "hidden": false,
            "name": "Ubuntu",
            "source": "Windows.Terminal.Wsl",
            "backgroundImage": "C:\\Windows\\Web\\Wallpaper\\Windows\\img0.jpg", // ★Windows10のデスクトップ画像を指定★
            "backgroundImageOpacity": 0.5, // ★背景画像の透明度を0-1の範囲で指定★
            "colorScheme": "One Half Dark", // ★カラースキーム名を指定★
            "useAcrylic": false // ★ウィンドウ背後にあるコンテンツが透過するかどうか★
        },
  .
  .
```

`"backgroundImage"`プロパティはその名の通り背景画像に使う画像ファイルを指定します。

`"backgroundImageOpacity"`プロパティは指定した背景画像の透明度を指定します。お好みで調整してみましょう。

`"colorScheme"`プロパティは`defaults.json`に予め用意されているカラースキーム名、又は自分で`settings.json`に作成したカラースキーム名を指定することで、どのカラースキームを使用するか指定できます。背景画像によって見易い／見難い配色があると思うので、納得がいくまで調整しましょう。

`"useAcrylic"`プロパティはWindows Terminalウィンドウの背後に別のウィンドウ等があった場合に透過するような見た目とするか指定できます。以前のバージョンでは`false`でないと背景画像が正しく表示されなかったのですが、今は`true`でも`false`でもどちらでも背景画像は表示されます。お好みでいいですが、`true`とするのであれば`"acrylicOpacity"`プロパティも一緒に調整しましょう。

### 3. フォントを変える

```json:settings.json
  .
  .
        {
            "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
            "hidden": false,
            "name": "Ubuntu",
            "source": "Windows.Terminal.Wsl",
            "fontFace": "HackGenNerd Console"
        },
  .
  .
```

自分は今のところ[フリーライセンスのプログラミングフォント「白源」](https://qiita.com/tawara_/items/374f3ca0a386fab8b305)を使用させてもらっています。
`"fontFace"`プロパティにフォント名を設定すれば設定完了です。

### 4. [2020/01/16追記]複数の`profile`で共通のシェル設定を指定する

v0.8.10091.0から**[Default settings](https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md#default-settings)**という機能が追加となっています。WSLやWindows PowerShell、cmd等 複数の`profile`で共通のシェル設定を使用する場合、今までは各`profile`毎に設定を記述する必要がありました。

```json:settings.json
  .
  .
    "profiles":
    [
        {
            "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
            "name": "Windows PowerShell",
            "commandline": "powershell.exe",
            "fontFace": "Cascadia Code", // ★重複★
            "fontSize": 14 // ★重複★
        },
        {
            "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
            "name": "cmd",
            "commandline": "cmd.exe",
            "fontFace": "Cascadia Code", // ★重複★
            "fontSize": 14 // ★重複★
        },
        {
            "commandline" : "cmd.exe /k %CMDER_ROOT%\\vendor\\init.bat",
            "name" : "cmder",
            "startingDirectory" : "%USERPROFILE%",
            "fontFace": "Cascadia Code", // ★重複★
            "fontSize": 14 // ★重複★
        }
    ],
  .
  .
```

これが、Default settings機能を使用すると以下のようにシェル設定が共通化できます。

```json:settings.json
  .
  .
    "profiles":
    {
        "defaults": // ★"defaults"に共通のシェル設定を設定する！★
        {
            "fontFace": "Cascadia Code",
            "fontSize": 14
        },
        "list": // ★従来のprofile毎のシェル設定は"list"に設定する★
        [ 
            {
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
            },
            {
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "cmd",
                "commandline": "cmd.exe"
            },
            {
                "commandline" : "cmd.exe /k %CMDER_ROOT%\\vendor\\init.bat",
                "name" : "cmder",
                "startingDirectory" : "%USERPROFILE%"
            }
        ]
    },
  .
  .
```

シェル設定の共通化、皆さんもやってみてください！

## 他にも設定色々！

[Settings.json Documentation](https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md)という設定用ドキュメントがちゃんと用意されているので、他にも設定を探して自分好みのWindows Terminalにカスタマイズしましょう！
自分はまだkeybindingsは一切触っていないので、良い設定がないか考えてみたいと思っています。


## ~~注意！~~
~~Windows Terminalは2020/04/27時点でPreview版ですので、こちらに書いた設定方法が大きく変わる可能性もあります。ご了承ください。
尚、正式版のリリースは2020/04頃ということです。楽しみ！~~


## 祝 正式版リリース！
Windows Terminalは2020/05に正式版がリリースされました！
今後はPreview版と正式版が毎月リリースされるとのことなので、気になる方は両方チェックするといいかと思います！