Windows Terminal Tips

# Windows Terminal
Windowsの新しいTerminalアプリケーション。WindowのTab化や様々な設定が可能。デフォルトでコマンドプロンプト、PowerShell、WSL、Azure Cloud Shellを使用可能。2020/5/19に正式版（V1.0）がリリースされた。
Preview版で実装されていた設定画面が、遂にV1.7安定板でも実装された。このページで説明していた設定ファイル（`settings.json`）の編集方法は、ページの後半に移動した。

![windows_terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/5e7b003f-859c-2da5-64d1-36f340e6029e.png)

## How to install
Windows 10 20H1 (build 19041)以降であれば、インストール可能。
Microsoft Storeから`Windows Terminal`を検索してインストール。とっても簡単。

## Settings
Windows Terminal画面で`Ctrl + ,`を押す、またはTabの右横のメニューから`Settings`をクリックすることで設定画面が表示される。基本的に設定画面から設定可能。以降は、設定画面からは設定できず、`settings.json`を直接編集する必要がある設定に関して説明する。`settings.json`は`Ctrl + Shift + ,`で開くことができる。

### unfocusedAppearance設定（フォーカスが外れた画面の外観設定）
unfocusedAppearanceプロパティで、フォーカスが外れた画面に関する外観の設定を行うことができる。設定できる項目は`backgroundImage`, `backgroundImageAlignment`, `backgroundImageOpacity`, `backgroundImageStretchMode`, `cursorHeight`, `cursorShape`, `cursorColor`, `colorScheme`, `foreground`, `background`, `selectionBackground`, `experimental.retroTerminalEffect`, `experimental.pixelShaderPath`。プロファイルのDefault設定 or プロファイルごとの設定のどちらかに設定可能。

```json:settings.json
        "defaults": 
        {
　　　　　　...
            "unfocusedAppearance": 
            {
                "foreground": "#DCDFE4",
                "background": "#282C34",
                "experimental.retroTerminalEffect": true
            }
        }
```
上記の設定結果が下記。フォーカスは下の画面にある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/4e4ef6ee-43a6-12b7-d758-22694a8bc49b.png)

## 便利機能
個人的に使っている便利な機能を紹介。

### スクロールバーにマークを表示
下記の設定をオンにすると、コマンド実行時にスクロールバーにマークが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/7a9305d3-fef9-491d-a8e7-f3dff958e3a5.png)

下記の設定をすると、`Ctrl+PageUp`で前のマークへ、`Ctrl+PageDown`で次のマークへ移動できて便利。

:::note info
設定画面でも`前のマークまでスクロールする`にキー設定はできる。しかし、`次のマークまでスクロールする`は選択できなかったため、setting.jsonを直接編集している。
:::

```json: setting.json
    "actions": 
    [
        ...
        {
            "command": 
            {
                "action": "scrollToMark",
                "direction": "previous"
            },
            "id": "User.scrollToMark.prev"
        },
        {
            "command": 
            {
                "action": "scrollToMark",
                "direction": "next"
            },
            "id": "User.scrollToMark.next"
        }
    ]
    ...
    "keybindings": 
    [
        ...
        {
            "id": "User.scrollToMark.prev",
            "keys": "ctrl+pgup"
        },
        {
            "id": "User.scrollToMark.next",
            "keys": "ctrl+pgdn"
        }
    ]
```



## 管理者権限での実行
タブを開く際に`Ctrl`キーを押しながら開くと、管理者権限で実行することが可能。管理者権限で開いた画面は、画面左上に盾のようなマークが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/1863f8d5-cda1-52cb-1867-c01f0b2f9204.png)

## Shortcut Keys
覚えておくと便利かも。

|機能               |ショートカットキー  |説明                          |
|-------------------|------------------|------------------------------|
|コマンドパレット    |Ctrl + Shift + P   |　　　　　　 |
|新規タブ作成        |Ctrl + Shift + T   |default shellが起動　　　　　　 |
|タブの複製          |Ctrl + Shift + D   |現在のタブの複製　　　　　　 |
|タブの切り替え      |Ctrl + Tab        |                              |
|ドロップダウンメニュー表示|Ctrl + Shift + Space|画面上部の下矢印キーをクリックしたときに表示されるメニューを表示|
|検索               |Ctrl + Shift + F   |                              |
|画面の水平分割      |Alt + Shift + -    |分割画面はdefault shellが起動。|
|画面の垂直分割      |Alt + Shift + +    |分割画面はdefault shellが起動。|
|分割画面間の移動    |Alt + ←↑→↓         |            |
|分割画面のサイズ変更 |Alt + Shift + ←↑→↓ |           |
|全画面モード        |Alt + Enter or F11 |2度押すと元に戻る            |
|Quake Mode | Win + ` | Windows Terminalが画面上からシュッと表示される。面白い機能だけど便利かというと微妙・・・|
|設定ファイルのオープン |Ctrl + Shift + , |settings.jsonを開く            |

## JSON fragment extensions
プロファイルの追加、既存プロファイル設定のアップデート、配色(`schemes`)設定を、JSONファイルを別途用意することで適用することができる。例えば、下記のファイルを`GitBash.json`として`%LocalAppData%\Microsoft\Windows Terminal\fragments\GitBash`フォルダに配置して、Windows Terminalを起動すると、Git Bashがプロファイルに追加される。
本来は、Git Bashのインストール時に、Windows Terminalに追加をオンにするとJSONファイルが追加されるような使い方をするのだと思う（アプリ開発者向け機能）。詳細は、[JSONフラグメント拡張機能](https://docs.microsoft.com/ja-jp/windows/terminal/json-fragment-extensions)を参照。

```json:GitBash.json
{
    "profiles": [
        {
            "name": "Git Bash",
            "commandline": "%PROGRAMFILES%/Git/bin/bash.exe -li",
            "icon": "%PROGRAMFILES%/Git/mingw64/share/git/git-for-windows.ico",
            "startingDirectory": "%USERPROFILE%",
            "backgroundImage": "%PROGRAMFILES%/Git/mingw64/share/git/git-for-windows.ico",
            "backgroundImageAlignment": "bottomRight",
            "backgroundImageOpacity": 0.5,
            "backgroundImageStretchMode": "none",
        }
    ]
}
```

## プロンプトのカスタマイズ
Oh My Poshを使うとプロンプトがちょっと見やすく、かつ格好よくなる。[チュートリアル: Oh My Posh を使用して PowerShell または WSL のカスタム プロンプトをセットアップする](https://docs.microsoft.com/ja-jp/windows/terminal/tutorials/custom-prompt-setup)に設定方法が書かれているので、興味がある人は試してみては。私は、WSL Ubuntuで、下記のように設定している。

### Caskaydia Cove Nerd Fontフォントのインストール
下記から`Caskaydia Cove Nerd Font`フォントをダウンロードし、ダウンロードしたzipファイルを展開する。展開した`Caskaydia Cove Nerd Font Complete.ttf`を`右クリック`→`インストール`でインストール完了。

[Nerd Fonts](https://www.nerdfonts.com/font-downloads)

### Windows TerminalのWSL Ubuntuプロファイル設定変更
設定画面からUbuntuのプロファイル設定の`Font face`を`CaskaydiaCove Nerd Font`に変更。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/86d10b98-6dad-493b-a7a2-03bcf1b2cbfa.png)

### Oh My Poshのインストール & 設定
1. Ubuntuにログイン
1. 下記のコマンドを実行し、Oh My Poshをインストール
    ```bash
    curl -s https://ohmyposh.dev/install.sh | bash -s
    ```
1. テーマを`$HOME`ディレクトリにコピー
`$HOME/.cache/oh-my-posh/themes`ディレクトリにテーマが多数インストールされる。自分の好きなテーマを`$HOME`ディレクトリにコピーする。全てのテーマは[ここ](https://ohmyposh.dev/docs/themes)を参照。
1. .profileの最終行に下記の一行を追加
`iterm2.omp.json`は前の手順でコピーしたテーマを設定。
    ```bash
    eval "$(oh-my-posh init bash --config ~/iterm2.omp.json)"
    ```

### 動作確認
一度`exit`しWSL Ubuntuから切断。再度Windows TerminalでWSL Ubuntuに接続すると、次のキャプチャのようにちょっと素敵になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/a1912207-043c-8f52-a870-7e33f868dfda.png)

## その他
### Preview Channel
Windows Terminal Preview版を[ここ](https://aka.ms/terminal-preview)からインストール可能。安定板と共存できるので、新し物好きな方は試してみては。

## 関連リンク
* [Windowsターミナルの概要](https://docs.microsoft.com/ja-jp/windows/terminal/)
  * ここを見れば一通りわかる。一度は見ておくとよい
* [Windows Command Line](https://devblogs.microsoft.com/commandline/)
  - Windows Terminalの最新情報は、こちらをチェック
* [設定のカスタマイズ ](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings)
  - settings.jsonファイルで設定できる項目の説明。ここを見ていろいろ試してみるとよい

--------
Windows Terminalの設定は設定画面から可能である。設定内容は`settings.json`ファイルに保存されている。このファイルを直接編集することでも設定を変更することができる。V1.7での設定画面実装前は`settings.json`を編集して設定を行っていた。以降の内容は、昔懐かしの`settings.json`を編集していたころの記事である。Windows Terminalを使うにあたっては全く不要の、物好きな人向けの内容である。

## settings.jsonでの設定方法
`settings.json`は`Ctrl + Shift + ,`で開くことができる。設定の詳細は[このあたり](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/global-settings)を参照してみましょう。

### Global設定
全Terminal画面共通の設定。

#### Default Profile変更
Windows Terminal起動時に、初期設定ではPowerShellのTerminalが開く。これを自分の好きなshellを起動するように変更できる。
settings.jsonファイルの先頭付近にある`defaultProfile`に自分の好きなshellのGUIDを設定する。

例：defaultProfileをcmd.exeに変更

```json:settings.json(変更前)
...
    "defaultProfile": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",

    "profiles":
    [
        {
            // Make changes here to the powershell.exe profile
            "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
            "name": "Windows PowerShell",
            "commandline": "powershell.exe",
            "hidden": false
        },
        {
            // Make changes here to the cmd.exe profile
            "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
            "name": "cmd",
            "commandline": "cmd.exe",
            "hidden": false
        },
...
```

このdefaultProfileの値をpowershell.exeからcmd.exeのguidに変更して保存する。この後、`Ctrl + Shift + T`で新規タブを開いたときや、Windows Terminalを立ち上げたときに、cmd.exeのタブが起動する。

```json:settings.json(変更後)
...
    "defaultProfile": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}", <- cmd.exeのGUIDに変更

    "profiles":
    [
        {
            // Make changes here to the powershell.exe profile
            "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
            "name": "Windows PowerShell",
            "commandline": "powershell.exe",
            "hidden": false
        },
        {
            // Make changes here to the cmd.exe profile
            "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
            "name": "cmd",
            "commandline": "cmd.exe",
            "hidden": false
        },
...
```

#### 画面関連設定
起動時の画面サイズ、画面位置を設定できる。

|プロパティ      |設定値               |説明                          |
|---------------|--------------------|------------------------------|
|launchMode     |maximized or default|maximizedで起動時に最大化       |
|initialPosition|x,y（数字）          |起動時の位置を指定。0,0で画面左上|
|initialCols    |x（数字）            |起動時の画面幅サイズ            |
|initialRows    |y（数字）            |起動時の画面高さサイズ          |

```json:settings.json（画面最大化で起動）
{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "launchMode": "maximized",
...
```

```json:settings.json（横120、縦30、画面左上で起動）
{
    "$schema": "https://aka.ms/terminal-profiles-schema",

    "defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "initialCols": 120,
    "initialRows": 30,
    "initialPosition": "0,0",
...
```

#### テキスト選択時の自動コピー
初期設定では、Terminal上のテキストを選択した際に自動でコピーされる。`copyOnSelect`を`false`に設定することで、`Ctrl + C`を押すことで選択したテキストがコピーされるように変更できる。（私はデフォルトのまま使っていますが）

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

    "defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "copyOnSelect": false,
...
```

#### Dark Mode設定
最近ちょっと流行りのDark Mode。`theme`を`dark`に設定する。デフォルトではシステム設定に従うので、システム設定をDark Modeにしているなら、あえて設定しなくてよい。

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

    "defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "theme": "dark",
...
```

#### Tabサイズ設定
Tabのサイズを変更できる。`compact`にすると、非アクティブなタブのサイズがコンパクトになる。`titleLength`にすると、タブのタイトルのサイズに合わせる。

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

    "defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "tabWidthMode": "compact",
...
```

#### Tab Switcher設定
`Alt + Tab`を押した際のTab切り替え動作をTab Switcher UIに変更可能。タブの切り替え順番は現時点ではMRUのみ。将来的には、表示順で切り替えられるようにも設定できるようになる。
（一時期Tab Switcherがdefaultになったが、今は元に戻されている。）

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

    "defaultProfile": "{c6eaf9f4-32a7-5fdc-b5cf-066e8a4b1e40}",
    "useTabSwitcher": true,
...
```

![Tab Mode & Tab Switcher](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/d8de5e32-0398-5cd6-391a-bc4764851f71.png)

#### Actions (Key Bindings)設定
キーアクションに好みの動作を割り当て可能。設定できる項目は[ここ](https://docs.microsoft.com/ja-jp/windows/terminal/customize-settings/actions)を参照。デフォルトの設定は`default.json`の`actions`以下を参照。`default.json`はTab右横のメニューから`Alt`を押したまま`設定`をクリックすることで開くことができる。
デフォルトの設定を変更したり、新しい設定を追加する場合は、`settings.json`に設定を追加する。`settings.json`にデフォルトで記載されている`actions`の最後に設定したいキーバインディングを追加していく。
個人的に下記の設定をしている。検索を`Ctrl+F`、次を検索を`F3`、前を検索を`Shift+F3`、現在のシェル画面分割を`Alt+Shift+-`（水平分割）、`Alt+Shift++`（垂直分割）に割り当てている。

```json:settings.json
    "actions": [
        ・・・
        {"command": "find", "keys": "ctrl+f"},
        {"command": {"action": "findMatch", "direction": "next"}, "keys": "f3"},
        {"command": {"action": "findMatch", "direction": "prev"}, "keys": "shift+f3"},
        {"command": {"action": "splitPane", "split": "horizontal", "splitMode": "duplicate"}, "keys": "alt+shift+-"},
        {"command": {"action": "splitPane", "split": "vertical", "splitMode": "duplicate"}, "keys": "alt+shift+plus"}
    ]

```

#### Command Palette
`Ctrl+Shift+P`でコマンドパレットを使うことができる。普段使わない機能のショートカットキーは覚えていられないので、そういう機能を実行するときに便利。個人的に、`F1`キーでコマンドパレットを実行できるように、下記の設定をしている。

```json:settings.json
{ "command": "commandPalette", "keys": "f1" }
```


### Profile設定
Profile(シェル)ごとの設定。`profiles`以降の各Shellに関する設定。

#### Default設定
全Profile共通の設定。defaultsで設定した内容は、list以降の全Profileに適用される。共通に設定したい項目は、ここで設定するとよい。以下の例では全てのProfileのフォントの種類を`Cascadia Code`、サイズを`10`に設定する。（なお、デフォルトのフォントはLigatureのないCascadia Mono。）

```json:settings.json
...
    "profiles": {
        "defaults": {
            "fontFace": "Cascadia Code",
            "fontSize": 10
        },
        "list": [
            {
                // Make changes here to the powershell.exe profile
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "hidden": false
            }
         ]
     },
...
```

#### Profile追加（GUID作成方法）
list配下にProfileを追加可能。Linux Serverにsshで接続するメニューを追加することもできる。[ここ](https://stackoverflow.com/questions/57363597/how-to-use-a-new-windows-terminal-app-for-ssh)とか[ここ](https://docs.microsoft.com/ja-jp/windows/terminal/tutorials/ssh)を参考にするといいかも。Git Bash等は[ここ](https://github.com/microsoft/terminal/blob/master/doc/user-docs/ThirdPartyToolProfiles.md)を参考に。
なお、追加したProfileをDefault Profileに指定するためには、GUIDを作成する必要があるが、Powershellの[New-Guid](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/new-guid?view=powershell-7)コマンドで作成可能。

```powershell
PS C:\> New-Guid

Guid
----
e5942063-0a0f-45e3-ae44-e10e37337d76
```

#### Font変更
Fontの種類を`fontFace`、サイズを`fontSize`で変更可能。プログラマー向けの等幅フォント`Cascadia Code`を使用可能。なお、Windows Terminalのデフォルトフォントは`Cascadia Mono`だが、このフォントにはCoding Ligature(合字)が入っていない。Coding Ligatureって何？という方は[ここ](https://docs.microsoft.com/ja-jp/windows/terminal/cascadia-code#powerline-and-programming-ligatures)を見てみましょう。

```json:settings.json
...
    "profiles": {
    ...
        list: [
            {
                // Make changes here to the powershell.exe profile
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "fontFace": "Cascadia Code",
                "fontSize": 10,
                "hidden": false
            },
...
```

#### Color Scheme設定
カラー設定を`colorScheme`で変更可能。設定できる値は、`default.json`を参照。`default.json`はTab右横のメニューから`Alt`を押したまま`Settings`をクリックすることで開くことができる。自分で`settings.json`に追加することも可能。好きな人はいろいろ変更してみては。
なお、`tabColor`でタブの色を設定できるので、`background`と同じ値にするとシームレスな感じになっていいかも。私は面倒なので設定していないが。

```json:settings.json
...
    "profiles": {
    ...
        list: [
            {
                // Make changes here to the powershell.exe profile
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "tabColor": "#012456",
                "background": "#012456",
                "hidden": false
            },
...
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/9d63fac7-f8ee-f043-7ae5-54a3efee5e49.png)

#### Window透過設定
Windowの背景を透過させることができる。`acrylicOpacity`で初期の透過度を設定する。0~1の範囲で設定可能。Windows Terminal画面上で`Ctrl + Shift`を押したまま、マウスのホイールをスクロールすると動的に透過度を変更可能。

```json:settings.json
...
    "profiles": {
    ...
        list: [
            {
                // Make changes here to the powershell.exe profile
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "useAcrylic": true,
                "acrylicOpacity": 0.5,
                "hidden": false
            },
...
```