Windows Terminal v0.8.10091.0 に入門する (+ PowerShell Core 7.0.0v-rc.1 の導入)

## やること

この記事では Windows Terminal の設定について書きます。
また PowerShell Core 7 の内容には触れませんが、Windows Terminal 上で使う場合の設定を書きます。

## 前提

- Windows 10 Pro
- PowerShell Core 6 がインストールされていないこと。
    - v6 と v7 の環境共存についてはこの記事では触れません。

## 目次

1. PowerShell Core 7 をインストール (MSIX パッケージ使用)
1. Windows Terminal をインストール (Windows Store 使用)
1. Windows Terminal で PowerShell Core 7 を起動
1. Windows Terminal 設定
    2. 概要
    2. デフォルトシェル
    2. フォント
    2. カラースキーム
    2. アイコン
    2. 背景
    2. コピーペースト
    2. ブラウン管風画面
1. Awesome PowerShell

## 1. PowerShell Core 7 をインストール (MSIX パッケージ使用)

**PowerShell Core 7 を導入しない場合はここは飛ばしてください。**

[PowerShell Core の GitHub Release ページ](https://github.com/PowerShell/PowerShell/releases)から拡張子が `msix` のファイルをダウンロードします。
執筆時は `PowerShell-7.0.0-rc.1-win-x64.msix` をダウンロードしました。
MSIX パッケージは**ファイルをダブルクリックではインストールできない**ので、PowerShell プロンプトを開いて以下を実行してインストールします。

```powershell
# ファイルのあるフォルダで実行する
Add-AppxPackage PowerShell-7.0.0-rc.1-win-x64.msix
```

ちなみに v7 からはアイコンが以下のように変わったみたいです。
![powershellcore.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/005da1ee-960a-eb6c-8d46-682f850139f0.png)

他のインストール方法は以下を参照してください。
参考: [Windows への PowerShell Core のインストール \- PowerShell \| Microsoft Docs](https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-windows?view=powershell-7)

## 2. Windows Terminal をインストール (Windows Store 使用)

Windows Terminal は Windows Store からインストールします。
`Terminal` で検索すれば出てきます。(下図の一番左)
![windowsstore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/ab1a96a0-8c4e-c08e-4b75-2b9ad2b87b3e.png)

## 3. Windows Terminal で PowerShell Core 7 を起動

初期状態だとメニューに PowerShell Core が表示されません。[^1]
これを以下のようにします。
![pscoreonterminal.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/0d35ce3d-f4db-4e40-a724-bfaca102e34f.png)

メニューから Settings を開き、`profile.json` を開きます。
このとき `*.json` に関連付けが無い場合はメモ帳が開きます。
別のエディタで編集したい場合は関連付けしておきましょう。

追加する設定は以下の通りです。

```json
    "profiles":
    [
    // 省略
        {
            "guid": "{afaa79f1-5186-4f66-9c26-57671e5ab2a7}",
            "name": "PowerShell Core 7.0.0v-rc.1",
            "commandline": "pwsh.exe",
            "icon": "C:\\Program Files\\WindowsApps\\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\\assets\\Powershell_av_colors.ico",
            "hidden": false
        },
    // 省略
```

設定は基本的にファイルを保存すると即時反映されます。
設定ミスがある場合は Windows Terminal 側でエラーの場所が表示されます。

### 設定値の説明

簡単に設定した値の説明をします。

|設定値|説明|
|---|---|
|`guid`| ユニークID (後述)|
|`name`|表示名|
|`commandline`|シェルの実行ファイル|
|`icon`|アイコン画像のファイルパス|
|`hidden`|メニューに表示するかどうか|

`guid` はアプリケーションとは全く関係ないと考えて良いようです。

私も最初、cmd や PowerShell Core v6 の `guid` がどの解説ページを見ても同じだったので PowerShell Core v7 も決まった値があると思って探しました。しかし結論は Windows Terminal の説明ではどこにもアプリケーションに紐付くとは書いておらず、ただ「設定を一意に特定する」とだけ書いてあります。つまりユニークなIDであれば何でもいいと解釈しました。
解説ページで同じなのは Windows Terminal の[デフォルト設定にハードコードされているから](https://github.com/microsoft/terminal/blob/5a57c5a6c975592c2ce52ce078082a209fde5e88/src/cascadia/TerminalApp/userDefaults.json)です。

[Issue を流し読み](https://github.com/microsoft/terminal/issues/1735)したところ `guid` の生成には PowerShell で `new-guid` を実行すれば良いようです。

```
PS C:\> new-guid

Guid
----
4e66dda2-8853-4195-bcec-91e64f154726
```

## 4. Windows Terminal 設定

### 4-1. 概要

Windows Terminal の設定を理解するには以下を見れば大体分かります。

- [Editing Windows Terminal JSON Settings](https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md)
    - 設定のガイド
- [Profiles.json Documentation](https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md)
    - `profile.json` のスキーマ解説
    - vscode だと JSON スキーマを参照してタブ補完や解説を表示してくれる
- [default.json](https://github.com/microsoft/terminal/blob/cbdfd0e2a249cefe07398e50dc39423bed17a53f/src/cascadia/TerminalApp/defaults.json)
    - ハードコードされているグローバルの設定値
    - 組み込みのカラースキームなどはこれで設定されている

#### `profile.json` のパスと特殊な URI スキーム

`ms-appdata:///Local/` という URI は `profile.json` のあるパスを指します。[^2]
同じフォルダに背景画像などを入れておくと便利です。

`profile.json` のパスは以下の通りです。

```
%localappdata%\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState\
```

詳しくは[こちら](https://github.com/microsoft/terminal/blob/master/doc/cascadia/SettingsSchema.md#background-images-and-icons)を参照して下さい。

### 4-2. デフォルトシェル

`defaultProfile` に設定した `guid` の値と対応する設定がデフォルトシェルになります。

例: PowerShell Core v7 をデフォルトコンソールにする

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

    "defaultProfile": "{afaa79f1-5186-4f66-9c26-57671e5ab2a7}",

    "profiles":
    [
    // 省略
        {
            "guid": "{afaa79f1-5186-4f66-9c26-57671e5ab2a7}", // この値を設定
            "name": "PowerShell Core 7.0.0v-rc.1",
    // 省略
```

### 4-3. フォント

`fontFace` と `fontSize` で設定出来ます。

例: 白源フォント, フォントサイズ 16 に設定する

```json
"fontFace" : "HackGen Console for Powerline",
"fontSize" : 16    // デフォルト値は 12
```

### 4-4. カラースキーム

カラースキームは 4-1. 概要 に記載した `default.json` で定義されているものであれば `colorScheme` にその `name` 値を書くだけで使えます。
他のカラースキームを使いたい場合は `schemes` に追加します。

例: Doracula カラースキームを使う

```json
// 省略
        {
            "guid": "{afaa79f1-5186-4f66-9c26-57671e5ab2a7}",
            "name": "PowerShell Core 7.0.0v-rc.1",
            "commandline": "pwsh.exe",
            "icon": "C:\\Program Files\\WindowsApps\\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\\assets\\Powershell_av_colors.ico",
            "colorScheme": "Dracula", // 追加
// 省略
    "schemes": [
        {
            "name" : "Dracula",
            "background" : "#282A36",
            "black" : "#21222C",
            "blue" : "#BD93F9",
            "brightBlack" : "#6272A4",
            "brightBlue" : "#D6ACFF",
            "brightCyan" : "#A4FFFF",
            "brightGreen" : "#69FF94",
            "brightPurple" : "#FF92DF",
            "brightRed" : "#FF6E6E",
            "brightWhite" : "#FFFFFF",
            "brightYellow" : "#FFFFA5",
            "cyan" : "#8BE9FD",
            "foreground" : "#F8F8F2",
            "green" : "#50FA7B",
            "purple" : "#FF79C6",
            "red" : "#FF5555",
            "white" : "#F8F8F2",
            "yellow" : "#F1FA8C"
        }
    ],
// 省略
```

参考: [Dracula — A dark theme for Windows Terminal and 84\+ apps](https://draculatheme.com/windows-terminal/)

### 4-5. アイコン

アイコンは `icon` に画像のパスを設定するだけで好きな画像を使えます。
この記事では以下のように Windows アプリからアイコンを参照しているので、その解説をします。

```json
"icon": "C:\\Program Files\\WindowsApps\\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\\assets\\Powershell_av_colors.ico"
```

なお、いくつかの解説記事では `ms-appx:///ProfileIcons/` という URI スキームを使っていますが、[推奨されない](https://github.com/microsoft/terminal/issues/1918)ようです。
私も試そうとしましたが、そもそもパスが分からなかったので諦めました。

#### 解説

探し方を簡単に説明します。まず Windows アプリ情報は `Get-AppxPackage` コマンドで表示できます。
全部出すと表示が長くなるので `Where-Object (where)` で絞り込みするのが良いでしょう。

```
Get-AppxPackage | where { $_.Name -eq "Microsoft.WindowsTerminal" }
```

出力:

```
Name              : Microsoft.WindowsTerminal
Publisher         : CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US
Architecture      : X64
ResourceId        :
Version           : 0.7.3451.0
PackageFullName   : Microsoft.WindowsTerminal_0.7.3451.0_x64__8wekyb3d8bbwe
InstallLocation   : C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_0.7.3451.0_x64__8wekyb3d8bbwe
IsFramework       : False
PackageFamilyName : Microsoft.WindowsTerminal_8wekyb3d8bbwe
PublisherId       : 8wekyb3d8bbwe
IsResourcePackage : False
IsBundle          : False
IsDevelopmentMode : False
NonRemovable      : False
Dependencies      : {Microsoft.VCLibs.140.00_14.0.27810.0_x64__8wekyb3d8bbwe, Microsoft.VCLibs.140.00.UWPDesktop_14.0.2
                    7810.0_x64__8wekyb3d8bbwe}
IsPartiallyStaged : False
SignatureKind     : Store
Status            : Ok
```

ここの `InstallLocation` にアプリのあるパスが書かれています。
なお `C:\Program Files\WindowsApps\` 配下にはエクスプローラからアクセスすることはできません。(アクセス権限を変更すれば可能ですがセキュリティ的に脆弱になるので非推奨です)
PowerShell でなら中身を検索できるので、以下のようなコマンドで `*.ico` や `*.png` を探してみると画像ファイルが見つかります。

```
// *.png を探す
Get-ChildItem -r -Filter "*.png" "C:\Program Files\WindowsApps\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe" | select fullname
// *.ico を探す
Get-ChildItem -r -Filter "*.ico" "C:\Program Files\WindowsApps\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe" | select fullname
```

出力例: `*.ico`

```
FullName
--------
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\assets\Powershell_av_colors.ico
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\assets\Powershell_avatar.ico
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\assets\Powershell_black.ico
C:\Program Files\WindowsApps\Microsoft.PowerShell_7.0.1.0_x64__8wekyb3d8bbwe\assets\ps_black_32x32.ico
```

`Powershell_black.ico` は従来の黒い PowerShell Core アイコンです。お好みでご利用ください。

### 4-6. 背景

背景は `useAcrylic` でアクリル板のような半透過にしたり、背景画像を `backgroundImage` で設定出来たりします。

アクリル風
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/0cb7b148-67b1-ed4a-4bf6-36f3cfa11f94.png)

背景画像
![background1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/6f40e8da-e280-251c-0a10-6b28b180c940.png)

### 4-7. コピーペースト

コピペは普通にできますが[^3]、いくつかやり方があります。

- コピー
    - ウィンドウ内の文字を選択して右クリック
    - ウィンドウ内の文字を選択して `Ctrl+Shift+c`
        - `Ctrl+c` はコマンドの中断 (正確には SIGINT) の送信に使われているため
- ペースト
    - 何も選択していない状態でウィンドウ内を右クリック
    - `Ctrl+v`
    - `Ctrl+Shift+v`
    - `Shift+Insert`

### 4-8. ブラウン管風の画面にする

Windows Terminal v0.8.10091.0 からブラウン管風の画面にする機能が追加されました。
参考: [Microsoftの無料コマンドラインアプリ「Windows Terminal」がブラウン管ライクな見た目に変身可能に \- GIGAZINE](https://gigazine.net/news/20200111-microsoft-windows-terminal-retro-style-crt/)

以下の設定をして、アプリケーションを再起動すれば適用されます。

```
"experimental.retroTerminalEffect": true
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/58889/1c62d606-50f1-688c-1704-798dc27fa9df.png)
※右の方にフォントのゴミ（？）が映っていますが、なおせませんでした。

## 5. Awesome PowerShell

その他の便利なモジュールや解説はこちらを参照してください。
[janikvonrotz/awesome\-powershell: A curated list of delightful PowerShell modules and resources](https://github.com/janikvonrotz/awesome-powershell)

おわり

[^1]: PowerShell Core v6 の場合は Windows Terminal が自動的に認識して設定に追加してくれるようです。
[^2]: 正確には「PCごとのアプリケーション設定フォルダ」ですが、こっちの方が分かりやすいので。
[^3]: [Editing Windows Terminal JSON Settings](https://github.com/microsoft/terminal/blob/master/doc/user-docs/UsingJsonSettings.md) にはコピペ用のキーバインドを設定してね、と書かれていますが現在は設定不要でした。