私が歌川です

@utgwkk が書いている

Windows Terminalを試す

Windows Terminalは、Microsoftが開発しているオープンソースの新しいターミナルソフトウェアです。

github.com

ちょっと調べて様子を眺めると、コマンドプロンプト時代からは信じられないほどにカスタマイズ可能になっているようです。 WindowsからはWSLでコードを書いたりSSHしたりするぐらいしかやってないので、このさいwsl-terminalを捨ててみよう、と考えて、Windows Terminalを試してみることにしました。

インストールする

プレビュー版だけどMicrosoft Storeからボタン1つでインストールできます。 GitHubのreleaseから落としてくる、みたいなことをしなくても気軽にお試しできて便利ですね。

www.microsoft.com

Chocolateyでもインストールできるようです。

設定をカスタマイズする

標準状態では、以下のシェルを起動できるプロファイル設定が行われています。

Settingsを押すと設定を編集できますが、突然メモ帳でJSONファイルが開かれるので何が何だか、となってしまいます。 VSCodeで開くと、JSON schemaによる補完やバリデーションが効いて便利です。 %LocalAppData%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\profiles.json に設定ファイルがあるので開きます。

このファイルにどんどん所望の設定を突っ込めばカスタマイズ完了です。とりあえず以下のようにしてみました。

// なんとコメントが書ける!!!
{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    // デフォルトでWSLを起動する
    "defaultProfile": "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}",

    "copyOnSelect": true, // 選択するだけでコピーする
    "snapToGridOnResize": true, // 文字のbounding boxの大きさ単位でウィンドウサイズを変える

    // Azure Cloud Shellを追加されないようにする
    "disabledProfileSources": ["Windows.Terminal.Azure"],

    "profiles":
    {
        "defaults":
        {
            "backgroundImage": "(snip)",
            "backgroundImageOpacity": 0.2,
            "closeOnExit": "always", // exit code関係なくexitしたらタブを閉じる
            "colorScheme": "Campbell",
            "cursorShape": "filledBox", // カーソルの形を █ にする
            "fontFace": "Ricty Diminished",
            "fontSize": 16,
            "padding": "4" // 画面のpadding
        },
        "list":
        [
            {
                "guid": "{58ad8b0c-3ef8-5f4d-bc6f-13e4c00f2530}",
                "hidden": false,
                "name": "WSL",
                "source": "Windows.Terminal.Wsl",
                "commandline": "wsl.exe ~" // %USERPROFILE% じゃなくてWSLの $HOME を起動時のディレクトリとする
            },
            {
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "hidden": false
            },
            {
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "cmd",
                "commandline": "cmd.exe",
                "hidden": true
            },
            {
                // こんな感じでプロファイルを追加できる
                // guidは適当に生成してかぶらなければよさそう?
                "guid": "{084fbb3a-e4f1-445e-92e7-d65eef40e6fa}",
                "name": "SSH (yuuko)",
                "commandline": "ssh.exe yuuko",
                "hidden": false
            }
        ]
    },

    "schemes": [],


    "keybindings": [
        {
            // フォントサイズを大きくする
            "command": "increaseFontSize",
            "keys": ["ctrl+="]
        },
        {
            // フォントサイズを小さくする
            "command": "decreaseFontSize",
            "keys": ["ctrl+-"]
        },
        {
            // フォントサイズをリセットする
            "command": "resetFontSize",
            "keys": ["ctrl+0"]
        },
        // ペイン分割のショートカットキーを封じる
        // - 分割したくなったらtmux使うから
        // - 誤爆したら紛らわしいことになるから
        {
            "command": {
                "action": "unbound",
                "split": "horizontal"
            },
            "keys": [ "alt+shift+-" ]
        },
        {
            "command": {
                "action": "unbound",
                "split": "vertical"
            },
            "keys": [ "alt+shift+plus" ]
        }
    ]
}

完成したターミナルがこちらになります。かわいらしい感じに仕上がってよかったですね。

gyazo.com *1

他にも、以下のページを参考にすれば、いろいろな設定を変えることができます。

デフォルトの設定は、Altを押しながらSettingsを押すと(メモ帳で!)確認することができます。

使い心地どうなの

色をいい感じに変えられる、背景画像を設定できる、ということで、wsl-terminalを使っていたときに欲していた機能や設定は満たしています*2。 日本語も絵文字も難なく入出力できます。

設定を変えよう、となったときにメモ帳が開くのは驚き最大ですが、JSONで設定できるしJSON schemaもあるので安心して設定できるし、再起動しなくても即座に設定が反映され、エラーがあるとエラーだよって教えてくれるのがおもてなしポイント高いです。

がんばってminttyを入れる、みたいなことをせずに快適なターミナルを得ることができてよかったですね。

見つけた不具合

profiles.jsonJSON schemaにない値がある

keybindingsのcommandに unbound (キーとコマンドの関連付けを解除する) があるけどJSON schemaには含まれておらず、警告が出ます。 実際unbindはできているのでJSON schemaの定義に漏れがあるのだと思います。 ざっと検索してみたところissueはなさそうだったので立ててみました。

github.com

JSON schemaを書き直すだけだったらさっとPRを出せるけど、Contribution License Agreementへの同意が必要、ということでいったん立ち止まっているところです。

エスケープシーケンスによって意図せず文字が小さくなることがある

gyazo.com

man zshbuiltins を、wsl-terminal(左)とWindows Terminal(右)で見比べています。 赤い文字列の後に来る文字列がいきなり小さくなることがあります。

gyazo.com

エスケープシーケンスのなにかがおかしそう、という予感がしますが再現条件がまだ特定できていません。 サークルの友だちは、vimで日本語文章を表示すると漢字がときどき小さくなることがあるようでした。

*1:背景画像: #バーチャルYouTuber この子にしましたー - 坦々めお/雲呑めおのイラスト - pixiv

*2:もともとそこまで凝った設定をしてなかったと思う、背景画像が設定できるのはマストだった