Windows TerminalをWSL用に軽くいじってみた

**2020-06-13 追記**
`v0.11` で設定ファイルの構造が変わりましたので、それに合わせて設定した記事を書きました。
そちらも一緒に参照してください。( [Windows Terminalの設定が変わったので改めていじる](https://qiita.com/hotaru51/items/e189eec0515c289e0a90) )

Windows Terminalが発表され、ストアからも簡単に落とせるようになってしばらく経ったものの、インストールしただけであんまり触れていなかったので、WSL用に軽く設定をいじってみた。

# 環境

* Windows 10 Pro 1903
* Windows Terminal (Preview) 0.7.3451.0
* WSL
    * Ubuntu 18.04.3 LTS

# 触ったところ

* WSLのUbuntuをデフォルトにする
    * 起動時のカレントディレクトリは `%USERPROFILE%` ではなくWSL上の `/home/{user名}` に変更
* 起動時の行、列
* フォント
* カーソル
* キーバインド
    * タブ操作
    * 画面分割

がっつりカスタマイズする人ではないので、ひとまずこのあたりを整えれば使っていけるかなと。

# インストール

随分前にインストールしたのと、特に難しいことはないので割愛。Microsoft Storeから `windows terminal` で検索して `Windows Terminal (Preview)` をインストールする。

# 設定ファイル(profiles.json)を開く

Windows Terminalを起動し、 `+` の右隣のボタンで表示されるメニューの `Settings` か、 `Ctrl + ,` で設定ファイルを開く。ちなみにこのファイルは `%USERPROFILE%\AppData\Local\Packages\Microsoft.WindowsTerminal_{ランダムな文字列}\LocalState` に格納されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304815/a479185a-0495-fbe3-6526-fc61d3353a30.png)

# profiles.json概要

構造をわかりやすくするためにいろいろ端折ったものがこちら。

```json:profiles.json
{
    "$schema": "https://aka.ms/terminal-profiles-schema",
    "globals" : 
    {
        "defaultProfile" : "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}",
        "keybindings" : 
        [
            {
                "command" : "closeTab",
                "keys" : 
                [
                    "ctrl+w"
                ]
            }
        ]
    },
    "profiles" : 
    [
        {
            "guid" : "{yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy}",
            "name" : "Windows PowerShell"
        },
        {
            "guid": "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}",
            "name": "Ubuntu"
        }
    ],
    "schemes" : 
    [
        {
            "name" : "Solarized Dark"
        },
        {
            "name" : "Solarized Light"
        }
    ]
}
```

`globals` は文字通りWindows Terminal全体の設定。キーバインドの設定もここ。`profiles` に PowerShellやWSLのディストリビューション等の設定が並ぶ。 `schemes` はカラースキームの設定。試しにデフォルトで入ってた `Solarized Dark` にしてみたけど、 `ls` 打ったときにファイルとディレクトリの色の区別が付かなくなってしまったので、今回はやめました。

# 設定

設定項目についてはGithubリポジトリ内のドキュメントを参照する。

* [terminal/SettingsSchema.md at master · microsoft/terminal](https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md)

## Ubuntuをデフォルトにする

`profiles` 内のUbuntuのprofileのguidを `globals` の `defaultProfile` に指定する。

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

        (略)

        "defaultProfile" : "{2c4de342-38b7-51cf-b940-2309a097f518}",

        (略)
```

起動時のカレントディレクトリの設定はUbuntuのprofile内の `startingDirectory` で指定。WSLの場合は `//wsl$/{ディストリビューション名}/home/{user名}` となる。(ディストリビューション名は `wslconfig /l` で確認)

```json
    "profiles" : 
    [
        {
            "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
            
            (略)

            "startingDirectory" : "//wsl$/Ubuntu/home/hotaru",
            "name": "Ubuntu",
            "source": "Windows.Terminal.Wsl"
        }
    ],

    (略)
```

## 見た目系

### 行、列

`globals` の `initialRows` と `initialCols` で指定。

```json
{
    "$schema": "https://aka.ms/terminal-profiles-schema",
    "globals" : 
    {
        (略)

        "initialCols" : 150,
        "initialRows" : 40,

        (略)
```

### フォント、カーソル

こちらはUbuntuのprofile内で指定。

```json
    "profiles" : 
    [
        {
            "guid": "{2c4de342-38b7-51cf-b940-2309a097f518}",
            
            (略)

            "acrylicOpacity" : 0.75,
            "useAcrylic" : true,
            "padding" : "0",
            "fontFace" : "Migu 1M",
            "fontSize" : 10,
            "cursorShape" : "filledBox",

            (略)

        }
    ],

    (略)
```

| 項目               | 説明 |
|--------------------|------|
| acrylicOpacity     | 透過率。0 ～ 1で指定。 |
| useAcrylic         | `true` にしないと `acrylicOpacity` が反映されない。 |
| padding            | ウィンドウ内の余白の設定。カンマ区切りで `0, 0, 0, 0` などとして左上右下で指定も可能。 |
| fontFace           | フォントの指定。|
| fontSize           | フォントサイズ。|
| cursorShape        | カーソルの形の指定。値の種類はドキュメント参照。 |

ちなみに `padding` を指定したときとしないときはこんな感じ。

* なし
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304815/b8a0b406-bc56-16d5-64aa-fbdd76b195b8.png)

* あり
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304815/a9129f2e-5ba3-c6b3-a3d4-8871b3cd4cdb.png)

0にしても右と下に微妙にまだ余白が…　右はスクロールバーの分かな？
そして今回指定したフォントで全角記号を打つとこんな表示に…　おしい…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304815/bd60b1cf-f5aa-06ae-4c0a-7dd84528fa44.png)


## キーバインド

タブ操作や画面分割あたりを手に馴染むように変更。デフォルトの `closeTab` が `ctrl+w` だったんですが、単語削除のキーバインドにぶつけてくるの個人的にはどうかと思う…
ちなみに一部のcommandについては前述のページに載ってないのものもあるので、こちらも合わせて参照。
[terminal/AppKeyBindingsSerialization.cpp at master · microsoft/terminal](https://github.com/microsoft/terminal/blob/master/src/cascadia/TerminalApp/AppKeyBindingsSerialization.cpp)

```json
        "keybindings" : 
        [
            {
                "command" : "closeTab",
                "keys" : 
                [
                    "ctrl+shift+w"
                ]
            },
            {
                "command" : "newTab",
                "keys" : 
                [
                    "ctrl+shift+t"
                ]
            },
            {
                "command" : "splitVertical",
                "keys" : 
                [
                    "ctrl+alt+i"
                ]
            },
            {
                "command" : "splitHorizontal",
                "keys" : 
                [
                    "ctrl+alt+o"
                ]
            },
            {
                "command" : "nextTab",
                "keys" : 
                [
                    "ctrl+tab"
                ]
            },
            {
                "command" : "nextTab",
                "keys" : 
                [
                    "ctrl+right"
                ]
            },
            {
                "command" : "openSettings",
                "keys" : 
                [
                    "ctrl+,"
                ]
            },
            {
                "command" : "prevTab",
                "keys" : 
                [
                    "ctrl+shift+tab"
                ]
            },
            {
                "command" : "prevTab",
                "keys" : 
                [
                    "ctrl+left"
                ]
            },
        ],
```

変更、追加したもののみ記載してます。
split系のデフォルトが `alt+shift++` 、 `alt+shift+-` なのが微妙に違和感あったので変更。
ちなみに同じコマンドに対して2つ以上のキーバインドを設定することも可能みたい。

あとキーバインドではないけど、文字列をドラッグして選択したときに自動でクリップボードにコピーするように `globals` 内で `"copyOnSelect": true,` を設定。

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

        "copyOnSelect": true,

        (略)
```

# ひとまず完成

こんな感じになりました。カラースキームも特に指定していないので地味ですね。
あと透過させても後ろの文字見えないやつ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/304815/37126b9d-a30a-5a8f-dc5a-7025709b0e38.png)


# 所感

前述のフォントの件だったり、タブを閉じた時に表示がおかしくなったり等、まだPreview版なので不具合はあるけど、それなりにカスタマイズできるしPowerShellもコマンドプロンプトもWSLもこれ1つで扱えるのでなかなかいい感じです。正式版が楽しみですね。

# 参考

* [Windows Terminalをカスタマイズしてみたり - 鉄道と、テクノロジー](http://kuha209-36.hatenablog.com/entry/2019/06/26/090000)
* [terminal/UsingJsonSettings.md at master · microsoft/terminal](https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md)
* [terminal/SettingsSchema.md at master · microsoft/terminal](https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md)