ターミナル(WindowsTerminal)で効率アップ(2021年睦月)

# 初めに
こんにちは、本書をご覧になっていただき、ありがとうございます。
今回はCLIには必須なターミナルの設定です。

## 対象の読者
以下のような方々のお役にたてれば幸いです。

- ソフトウェア開発、特に製造や評価などに関わる人
- Windows用のアプリやツールをコマンドから使いたい人
- Windows用のアプリやツールをスクリプト化して処理したい人

#　ターミナル

Wikipedia(日本版)によると、ターミナルとは、「 端末とも呼ばれ、コンピュータへのデータ入出力に用いる電子式あるいは電気機械式のハードウェア。」となっており、それに関連して「端末エミュレータとは、 上記機器の動作をエミュレートするソフトウェア」となっている。

昔のコンピュータ(IBMのホストシステムなど)は演算を実行する本体とは別に、入出力や中継・変換などの機器を接続して使用する構成になっていた。もともとは「紙カードリーダー」や「紙テープリーダ」、「テレタイプ」などの機械式装置であったが、やがてキーボードとモニターを備えた装置が主流となり、扱える情報も英数文字だけから、制御文字、グラフィックへと進歩した。現在では専用装置は使わず、ソフトウェアとしてのターミナルを仮想的に使っている。

要は、入出力を行う機能がターミナルであり、特にコマンドラインで主に文字の入出力を行うものを、そう呼んでいる。cmd.exeやpowershellで表示されるものもターミナルの1種であり、Linux系OSでは、Xterm, GNOME Terminal などがターミナルである。Linux系では、ターミナルそのものと、ターミナル内で動くとシェルとは分離されていて、組合わせて使うことができる。Windowsの素の状態では、ターミナルとシェルは一体化しており、細かい設定がやりずらい。例えば扱う言語ごとにパスを変えたりとか、背景色や文字色、プロンプトなどを変えたりとか、フォントフェースやサイズを切り替えて使うとか、、、特にパスの設定や環境変数の指定がbashなどに比べるとやりにくい。複数開いた画面をタブでまとめて表示することもできない。この点を補助してくれるのが高機能ターミナルであり、Windows Terminal やCmderなどがある。

## ターミナルのいろいろ
### cmd.exe
MS-DOSの時代から継承されたMicrosoftのCLI環境、「COMMAND.COM」の後継。COMMAND.COMは、16ビットアプリであり、Windows-NTからは、cmd.exeと共存となり、64ビット版Windowsでは削除されて、「cmd.exe」だけとなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/53f4662d-6565-9b06-f5b1-02f55e1ae0c6.png)

### powershell
コマンドレットを利用してWindowsの管理をスクリプトベースで実行できる環境。Coreの出現でマルチ言語の扱いが改善され、マルチプラットフォームで動作するようになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/e6a63a57-7a4d-749e-453f-b0b2162801af.png)

### mintty
Cygwin,MSYSでのターミナル。(画像はCygwinから起動したもの)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/4bdb3ec9-e8fe-96da-8ae1-9cd91d933cdf.png)

### Cmder
タブによるマルチ画面を扱え、bash的機能も内蔵した高機能ターミナル。(画像では2つ開いている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/2eb97a7e-f066-81b3-6031-31353ef36cd6.png)

### RLogin
SSHなどのリモートログイン用ターミナル。PuTTYやTeraTermなどと類似。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/83f78848-f37e-4e9e-7f64-6eede9399e97.png)

### WindowsTerminal
今回インストールするターミナル。(画像では、PowerShell7, cmd.exe, PowerShell, AzureCloudShellを開いている)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/cabbeb36-c56a-6f5b-11f1-f83a1f743c67.png)


# WindowsTerminal

Wikipedia(日本版)では、「マイクロソフトによるWindows 10向けの端末エミュレータ。MITライセンスの下で公開、コマンドプロンプト、PowerShell、WSL及びSSHに対応。」となっている。オープンソースで開発されており、リポジトリはGitHub[^1]にある。

**Microsoft Store の説明：**
> Windows ターミナルは、コマンド プロンプト、PowerShell、WSL などのコマンドライン ツールおよびシェルのユーザーのための、高速、効率的、強力な、生産性を向上させる最新のターミナル アプリケーションです。主な機能には、複数のタブ、ウィンドウ、Unicode および UTF-8 文字のサポート、GPU アクセラレータによるテキスト レンダリング エンジン、カスタマイズできるテーマ、スタイル、構成が含まれます。

## 特徴(詳細は省略)
- タブで複数画面の切替ができるインタフェース
- ANSIエスケープシーケンス（英語版）のサポート：文字や背景の色付けなど
- UTF-8及びUTF-16のサポート (CJK統合漢字及び絵文字を含む)
- テーマ（英語版）のサポート
- JSONによる設定ファイル

## インストールの準備
#### １） PowerShell 7 を起動(PowerShell,cmd.exeでもよい)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/e55a25fc-a523-5de6-74f1-bf3038ac291f.png)

#### ２） Bucketの更新

```powershell
scoop update
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/cf81e0aa-8a74-b222-a27a-9ec691d0e855.png)

#### ３） パッケージ検索
scoopで「terminal」を含むパッケージを検索。見つからない場合は対応するBucketを追加する。

```powershell
scoop search terminal
```
現時点(2021年睦月)では、「windows-terminal (1.5.10271.0)」が「extra」Bucketで見つかった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/c3313e94-204f-e554-98d5-c2a585cb29c1.png)

その後、2021年弥生には1.6および1.7プレビューが公開された。[^5]
2022年葉月では、1.14および1.15プレビューがBucketに存在している。

## インストール
#### ４） Scoopにてインストール

```powershell
scoop install windows-terminal
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/99f7de0b-c385-3108-9141-24a718dcc4c3.png)

ショートカットとして「Windows Terminal.exe」が、shim[^2]として「WindowsTerminal」「wt」が作られていることがわかる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/5a0bf1ab-bb3e-9ff4-7398-6393b9a18675.png)

#### ５） 確認
コマンドが有効になっているかを確認してみる。

* PowerShell系

```powershell
get-command WindowsTerminal
get-command wt
```
* cmd.exe

```cmd.exe
where WindowsTerminal
where wt
```
scoopの管理下にインストールされていることがわかる。

#### ６） WindowsTerminalの起動

```powershell
wt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/d510c351-9a10-88ea-8f20-3998d46419a4.png)

Windows-Terminalの1.14系パッケージでは、起動時にエラーになることがある。その場合は、章末の[補足](#補足トラブル治療室)を参考にしていただきたい。

## 複数のシェルを起動

#### ７） タブ横の下向きアングルをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/694c244d-b0b9-b03b-9e1a-8ab43de016b4.png)

#### ８） コマンドプロンプトを選択する
cmd.exeが起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/c4c91914-85f3-26db-91d2-3344577c2d29.png)

#### ９） WindowsPowerShellを選択する
旧来のPowerShell(5.1)が起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/9325e55f-684c-ce3e-a42d-8bd3e4de3dfb.png)

## 設定

#### 設定を選択する
settings.jsonがデフォルトのシステムエディタで開かれる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/b91f18ba-2fde-a241-11e2-efa563c9fd6b.png)

#### プロファイル
複数のシェルがメニューに載っていたが、これもjsonで定義されていて、自分で追加することもできる。以下に設定の一部を載せておくが、全体設定(default)ではFont指定を、個別設定(list[{},{},,])ではstartingDirectory指定を、それぞれ追加している。
なお、Fontは「scoop install hack-font」で入れたもの。

```json
        "defaults": // 共通シェル設定
        {
            "fontFace": "Hack",
            "fontSize": 14
        },
        "list":
        [
            {
                // Make changes here to the powershell.exe profile.
                "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
                "name": "Windows PowerShell",
                "commandline": "powershell.exe",
                "startingDirectory" : "c:\\home",
                "hidden": false
            },
            {
                // Make changes here to the cmd.exe profile.
                "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
                "name": "コマンド プロンプト",
                "commandline": "cmd.exe",
                "startingDirectory" : "c:\\home",
                "hidden": false
            },
            {
                "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
                "hidden": false,
                "name": "PowerShell",
                "startingDirectory" : "c:\\home",
                "source": "Windows.Terminal.PowershellCore"
            },
            {
                "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
                "hidden": false,
                "name": "Azure Cloud Shell",
                "startingDirectory" : "c:\\home",
                "source": "Windows.Terminal.Azure"
            }
        ]
```

#### タスクパーにピン留め
よく使うので、タスクバーに置いておくと便利。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/263a6971-af17-1894-935b-e057054ab62b.png)

#### 詳細設定などは省略
他にいろいろな記事が出ているので、参照して試してみるとよい。
例えば、【Windows Terminal Tips】[^3]とか、【Windows Terminal でも Cmder を使う方法】[^4]とか。

親記事：[WSL2とVSCで作るWindowsでのDocker内開発環境(2021年睦月)](https://qiita.com/CinTAKE/items/ee348acec54195ef5bd1)


# 補足： トラブル治療室
## xxx.dll が見つからないため、コードの実行を続行できません。 (2022-08-14)
wtの実行時にエラーダイアログが表示され、Terminalが起動しない。
### 前提
発生条件：
- アプリなどが入っていない素の状態に近いWindows10
- Scoopを入れ、sudo,pwsh,をインストール
- Windows-Terminalをインストール

### 現象
起動時にエラーダイアログが表示され、以下の2つのDLLが見つからないと報告される。
- VCRUNTIME140.dll
- MSVCP140.dll

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/89fe1317-602d-6244-7e7b-bca3288fcec7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/9594d027-81c3-eadf-bdf2-165bd0b46783.png)

### 原因
「alacritty」というパッケージがscoop install で同じ現象を発生させていた。これは、DLLが必須の依存関係になっていないためであり、独自にインストールすればよいとのこと。

[alacritty depends on MSVCP140.dll and VCRUNTIME140.dll.](https://github.com/ScoopInstaller/Extras/issues/1589)

### 治療
理由が分かれば対処は簡単で、必要なランタイムをインストールすればよい。ただし、「VCRUNTIME」「MSVPC」で検索してもscoopのパッケージには見つからない。上記の記事にあるように「vcredist」で検索する必要がある。
```powershell
PS C:\Users\cintake> scoop search vcredist
Results from local buckets...

Name         Version        Source Binaries
----         -------        ------ --------
vcredist-aio 0.61.0         extras
vcredist     14.32.31332.0  extras
vcredist2005 8.0.61001      extras
vcredist2008 9.0.30729.6161 extras
vcredist2010 10.0.40219.473 extras
vcredist2012 11.0.61030     extras
vcredist2013 12.0.40664     extras
vcredist2015 14.0.24215.1   extras
vcredist2017 14.16.27027.1  extras
vcredist2019 14.28.29914.0  extras
vcredist2022 14.32.31332.0  extras
```
14系での最新版が2022なので、これをインストールする。(無印のvcredistも同じバージョン)
```powershell
PS C:\Users\cintake> scoop install vcredist2022
Updating Scoop...
Updating 'extras' bucket...
. . . . .
Scoop was updated successfully!
Installing 'vcredist2022' (14.32.31332.0) [64bit] from extras bucket
VC_redist.x64.exe (24.1 MB) [=================================================================================] 100%
Checking hash of VC_redist.x64.exe ... ok.
VC_redist.x86.exe (13.1 MB) [=================================================================================] 100%
Checking hash of VC_redist.x86.exe ... ok.
Linking ~\scoop\apps\vcredist2022\current => ~\scoop\apps\vcredist2022\14.32.31332.0
Running post_install script...
'vcredist2022' (14.32.31332.0) was installed successfully!
Notes
-----
You can now remove this installer with 'scoop uninstall vcredist2022'
```
scoopはインストーラをインストールして実行するだけなので、パッケージは不要となる。
```powershell
PS C:\Users\cintake> scoop uninstall vcredist2022
Uninstalling 'vcredist2022' (14.32.31332.0).
Unlinking ~\scoop\apps\vcredist2022\current
'vcredist2022' was uninstalled.
```

### 結果と予防

Windows-Terminalがきちんと起動するようになった。Bucketの開発で依存関係を分かりやすくしてもらいたいものだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352975/672884ed-c427-3343-f859-86aa1325e4eb.png)
----------

[^1]: https://github.com/microsoft/terminal
[^2]: Shimとは部品の隙間を埋める「埋め木」や「調整板」のことから、ソフトウェアの隙間を埋めるスクリプトやアプリのことを指している。
[^3]: https://qiita.com/whim0321/items/6a6b11dea54642bd6724
[^4]: https://qiita.com/tawara_/items/7cb1c8a12db81ab43a4c
[^5]: [Windows Store にて公開されている。](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)1.7からは多くの設定変更をGUIで行えるようになった。json直接編集もできる。