Windows Terminal の設定メモ

## はじめに

* Windows マシンのお引越しをする機会があったので、その際の Windows Terminal 周りの設定をメモします。
* おもに未来の自分自身に向けたメモです。
* インストールした Windows Terminal のバージョンは 1.17.11461.0 です。

## Windows Terminal のインストール

インストール方法はいくつかあるみたいですが、通常は Microsoft Store からダウンロードしてインストールすればよいはず。

https://learn.microsoft.com/ja-jp/windows/terminal/install

## プロファイルの設定例

WSL や PowerShell などは、自動でプロファイルが設定されるはず。
（Windows Terminal と、WSL/PowerShell のどちらを先にインストールしても大丈夫、とのこと）

https://learn.microsoft.com/ja-jp/windows/terminal/dynamic-profiles

> Windows ターミナルでは、Linux 用 Windows サブシステム (WSL) と PowerShell のシェルがマシンにインストールされている場合、これらに対するプロファイルが自動的に作成されます。
>
> （略）
>
> 新しいシェルがインストールされるのがターミナルのインストールの前か後かに関係なく、ターミナルでは新しくインストールされたシェルに対する新しいプロファイルが作成されます。

また、それ以外の独自プロファイル（Git Bash など）もタブの横のメニューから「設定」を選んで、「新しいプロファイルを追加します」で追加することができます。

### 【参考】WSL の設定

| 項目名  | 設定値 | 注意書き |
|:------|:------|:---|
| 名前   | `Ubuntu` | 任意 |
| コマンドライン | `%SystemRoot%\system32\wsl.exe -d Ubuntu` | インストールしたパス |
| 開始ディレクトリ | `~` | ホームディレクトリ |
| アイコン | `ms-appx:///ProfileIcons/{9acb9455-ca41-5af7-950f-6bca1bc9722f}.png` | 任意 |
| タブタイトル名 | `Ubuntu` | 任意 |

### 【参考】PowerShell 5.x

| 項目名  | 設定値 | 注意書き |
|:------|:------|:---|
| 名前   | `PowerShell 5.x` | 任意 |
| コマンドライン | `%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe` | インストールしたパス |
| 開始ディレクトリ | `%UserProfile%` | ホームディレクトリ（省略可） |
| アイコン | `ms-appx:///ProfileIcons/{61c54bbd-c2c6-5271-96e7-009a87ff44bf}.png` | 任意 |

### PowerShell 7.x

インストール方法は以下を参照してください。

https://learn.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-windows

| 項目名  | 設定値 | 注意書き |
|:------|:------|:---|
| 名前   | `PowerShell 7.x` | 任意 |
| コマンドライン | `%ProgramFiles%\PowerShell\7\pwsh.exe` | インストールしたパス |
| 開始ディレクトリ | `%UserProfile%` | ホームディレクトリ（省略可） |
| アイコン | `ms-appx:///ProfileIcons/pwsh.png` | 任意 |

### Git Bash (Git for Windows)

ダウンロードとインストールは以下のサイトから。

https://gitforwindows.org/

設定は以下のページが参考になります。

https://learn.microsoft.com/ja-jp/windows/terminal/dynamic-profiles

このページには他にも以下の設定例があります。

* Anaconda
* cmder
* Cygwin
* Far Manager
* Git Bash (WOW64)
* MSYS2

【設定例】

| 項目名  | 設定値 | 注意書き |
|:------|:------|:---|
| 名前   | `Git Bash` | 任意 |
| コマンドライン | `%ProgramFiles%\Git\bin\bash.exe -li` | インストールしたパス |
| 開始ディレクトリ | `%UserProfile%` | ホームディレクトリ（省略可） |
| アイコン | `%ProgramFiles%\Git\mingw64\share\git\git-for-windows.ico` | 任意 |

ちなみに Git for Windows をアップグレードする(`git update-git-for-windows` を実行する)場合には、Windows Terminal 上の Git Bash 上からで実行しない方が良いかもしれません。
アップグレードの途中で実行中の exe ファイルを削除されて Windows Terminal がエラーになってしまった気がするので（もしかしたら、やり方によっては上手くいくのかもしれない）。

### ssh

以下のページが参考になります。

https://learn.microsoft.com/ja-jp/windows/terminal/tutorials/ssh

| 項目名  | 設定値 | 注意書き |
|:------|:------|:---|
| 名前   | 任意 | 接続先情報や目的など |
| コマンドライン | `ssh <ユーザ名>@<ホスト情報>` | 接続情報など |
| アイコン | 任意 | お好みのアイコンを指定 |

普通の `ssh` は、Windows 版の OpenSSH なので、普通にコマンドライン引数を指定可能です。

* 接続先のみを指定 `ssh <ユーザー名>@<ホスト情報>`
* ポート番号指定 `ssh -p <ポート番号> <ユーザー名>@<ホスト情報>`
* 秘密鍵指定 `ssh -i "%UserProfile%\.ssh\id_ed25519" <ユーザー名>@<ホスト情報>`
* ポートフォワード（ローカル→リモート） `ssh -L <ローカルポート番号>:<リモートホスト>:<リモートポート> <ユーザー名>@<ホスト情報>`
* ポートフォワード（リモート→ローカル） `ssh -R <ローカルポート番号>:<リモートホスト>:<リモートポート> <ユーザー名>@<ホスト情報>`
* 開始ディレクトリ指定（bash の例） `ssh -t <ユーザー名>@<ホスト情報> "cd <開始ディレクトリ> && exec bash -l"`

秘密鍵の配置場所は注意が必要です。
Linux/Unix だと秘密鍵のパーミッションが `rw-------` (600) でなければいけないなどの条件がありますが、Windows の場合にも該当ユーザ以外が読み書きができない状態でないとエラーになります。
一般的には `C:\Users\<ユーザ名>\.ssh\` （環境変数なら `%UserProfile%\.ssh\`）に配置します（確認していませんが、別のパスでもパーミッションが正しければ動くはず）。

### その他のプロファイル

上記を見ればわかりますが、その他のコマンドを実行するプロファイルも簡単に作れます。

例えば WSL 上の node.js を動かすために「コマンドライン」に `wsl -e node` とすることなどが可能です。

設定方法の詳細は以下のページやその前後のページを参考にしてください。

https://learn.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-general

## 配色と背景画像

端末（シェル）の種類（WSL / PowerShell / Git Bash / ...）によって、ターミナルの背景色を変えておくと、どの画面を操作しているかをわかりやすくすることができます。

また、背景画像を設定することによって（例：画面中央あるいは右下に、薄く Ubuntu っぽいロゴを表示する、など）さらにわかりやすくできると思います。

https://qiita.com/dsyuuto/items/d97cbc538b0d992e0f8c


## 非フォーカス時の外観設定

ウィンドウ（あるいはペイン）にフォーカスが当たっていない場合の外観を一部変更することができます。

https://learn.microsoft.com/ja-jp/windows/terminal/customize-settings/profile-appearance#unfocused-appearance-settings

以下のプロパティだけしか指定できないので注意が必要です。

* `backgroundImage`
* `backgroundImageAlignment`
* `backgroundImageOpacity`
* `backgroundImageStretchMode`
* `cursorHeight`
* `cursorShape`
* `cursorColor`
* `colorScheme`
* `foreground`
* `background`
* `selectionBackground`
* `experimental.retroTerminalEffect`
* `experimental.pixelShaderPath`

`background` や `selectionBackground` の値を変えて、非フォーカス状態かフォーカス状態かをわかりやすくするとよいと思います。

（`Opacity` も変えられるとよかったのですけど、現状は指定できなそう。`backgroundImageOpacity` は背景画像の不透明度なので関係ない）

## JSON フラグメント拡張機能

Windows Terminal の設定は `settings.json` というファイルに保存されますが、プロファイルや配色などは別のファイルに定義することができます。

https://learn.microsoft.com/ja-jp/windows/terminal/json-fragment-extensions

Git Bash や ssh の接続情報などは、別のファイルにしておいた方が再利用がしやすいかもしれません。

その他のプロファイル（WSL や PowerShell など）でも、設定をこだわるなら分離したほうが楽かもしれません。

Git Bash の例を以下に示します。
プロファイル（背景画像などを含む）と配色などをまとめて設定が可能です。

```json
{
    "profiles": [
        {
            "name": "GitBash",
            "commandline": "%ProgramFiles%/Git/bin/bash.exe -li",
            "startingDirectory": "%UserProfile%",
            "icon": "%ProgramFiles%/Git/mingw64/share/git/git-for-windows.ico",
            "colorScheme": "GitBashColor",

            "backgroundImage": "%LocalAppData%/Microsoft/Windows Terminal/fragments/Profiles/git-bash.png",
            "backgroundImageAlignment": "bottomRight",
            "backgroundImageOpacity": 0.1,
            "backgroundImageStretchMode": "none",

            "unfocusedAppearance": {
                "background": "#303030"
            }
        },
    ],
    "schemes": 
    [
        {
            "name": "GitBashColor",
            "cursorColor": "#FFFFFF",
            "selectionBackground": "#FFFFFF",
            "background": "#0C0C0C",
            "foreground": "#CCCCCC",

            "black": "#0C0C0C",
            "red": "#C50F1F",
            "green": "#13A10E",
            "yellow": "#C19C00",
            "blue": "#0037DA",
            "purple": "#881798",
            "cyan": "#3A96DD",
            "white": "#CCCCCC",

            "brightBlack": "#767676",
            "brightRed": "#E74856",
            "brightGreen": "#16C60C",
            "brightYellow": "#F9F1A5",
            "brightBlue": "#3B78FF",
            "brightPurple": "#B4009E",
            "brightCyan": "#61D6D6",
            "brightWhite": "#F2F2F2"
        }
    ]
}
```

このファイルを配置する場所は、以下のどちらかになると思います。

* `C:\ProgramData\Microsoft\Windows Terminal\Fragments\<app-name>\<file-name>.json`
* `C:\Users\<ユーザ名>\AppData\Local\Microsoft\Windows Terminal\Fragments\<app-name>\<file-name>.json`

前者が全ユーザ共通、後者が個別ユーザ独自の定義なので、基本は後者に配置することになると思います。

`app-name` や `file-name` は重複しなければ任意です。

背景画像などのパスは `C:\Users\<ユーザ名>` （環境変数なら `%UserProfile%`）配下、特に OneDrive を使っている場合には `C:\Users\<ユーザ名>\OneDrive` （環境変数なら `%OneDrive%`）配下がよいかもしれませんが、個人的には JSON フラグメント拡張機能の JSON ファイルと同じ場所（環境変数を使うなら、`%UserProfile%\AppData\Local\Microsoft\Windows Terminal\Fragments\<app-name>\`、あるいは `%LocalAppData%\Microsoft\Windows Terminal\Fragments\<app-name>\`）でも、まとめて配置/管理ができるので良いかと思っています。