Windowsはクソ！という方に贈るWindowsターミナルの設定

## ターミナル(黒画面)は好きですか？

賛否両論あるかと思いますが、
ターミナル(Windowsのコマンドプロンプト)、嫌いな人多いと思います。

なんでもかんでもGUIで済まそうとするおじさんもいるのも事実。
まあマウス使うからわかりやすいんですよね。

今回はその逆で、Windowsでターミナルを活用する方法を語っていきたいと思います。

### Linux/Unixを触ったときに思うこと

みなさんは、Dockerを使うのにも関わらずWindowsを強要されてつらい思いをしたことありませんか？

MacやSolarisをはじめとするUnixも、Linuxも、どちらもターミナルの機能が強すぎてGUIがおまけみたいなところがあります。


それに、黒画面のターミナルがとてつもなくカッコよく映ります。
それが使いこなせるんだからもうイキっちゃいよね。


「もうぜんぶコマンドでよくね？」

みたいに思うはずです。


え？そんなことない？


### Mac -> Windowsでつらいこと

なんでもかんでもGUI。
まあ便利ではあるんだけどね。

というかHomebrewが便利すぎる。
Ubuntuはapt、RedHat系はyum(今はdnf)もあるし。

コマンドたたけばいろんなものがそろうのに対し、Windowsはブラウザを開きダウンロードしてインストールする。

まあまあ面倒である。

### Windowsは総じてクソ？

Windowsは初心者向けなんです！
同じ知識で初心者から上級者まで使うことができる最強のOSなんです。


というわけで、今回はWindowsのターミナルを活用するための方法を紹介していきます。


## ターミナルを考えなおす

MacやLinux使いがコマンドプロンプトを使うと、
まずls -> dirのようにコマンドが違うところでつまずきます。

まずはコマンドプロンプトを捨てましょう。
コマンドプロンプトは下位互換のために残された、いわばIEのような存在です。

まずは、Win+Rでcmdと打つのをやめるところから始めましょう。

ここで実施するのは2つです。

### Windows Terminalの導入

Microsoftの新しい端末アプリであるWindows Terminalを導入します。

[Windows Terminal - Microsoft Store](https://www.microsoft.com/ja-jp/p/windows-terminal/9n0dx20hk701?activetab=pivot:overviewtab)

以降は、Win + R から「wt」と打ち込んでWindows Terminalを使うように心がけましょう。

### PowerShellの最新を使う

コマンドプロンプトではなくPowerShellを使いましょう。
PowerShellを使うだけでもQoLが爆上がりします。
特に、新しいバージョンを使うことでさらによくなります。
(なぜかInsiderPreviewだと標準のPowerShellが文字化けしたので入れなおした)

[PowerShell 7.x](https://github.com/PowerShell/PowerShell/releases)

なお、PowerShell7は後述の方法でもインストールできるので、後回しでもOKです。

これだけでも見た目がだいぶ変わります。これでマカーにダサいとは言われない。はず。
lsもcdもclearも使えます。これだけで価値あるんじゃね？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/40cf306c-bcd4-7d52-44fe-ff30274bcc2a.png)


Windows TerminalはWSLのターミナルもまとめて表示できますので、複数のWSLを使っていたりする場合はさらに便利になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/9620429b-eae6-5066-90a4-d2e4a59288ff.png)

## Homebrewの代替を探す

マカーにマウントとられる最大のポイント、それがHomebrew。

Windowsにはそんなものない？

**？？？「あるよ」**

Windows Package Manager(通称winget)というものが公開されました。

[winget-cli](https://github.com/microsoft/winget-cli/releases/tag/v.0.2.2521-preview)

これで完璧である。

Windows Terminalから、以下の感じで実行できれば準備完了。

```
> winget -v
v0.2.2521 プレビュー
```

### wingetの使い方

#### 検索

```
> winget search <パッケージ名>
```

例えば、.NET Coreは以下のように検索できる。
4系は多分ライセンスの問題もあるのか入っていない模様

```
> winget search dotnet
名前                        ID                                バージョン                 一致
-------------------------------------------------------------------------------------------------
.NET Core                 Microsoft.dotnet                  3.1.402               Moniker: dotnet
.NET Core Preview         Microsoft.dotnetPreview           5.0.100-rc.2.20479.15 Command: dotnet
reko                      uxmal.reko                        0.9.1.0               Tag: dotnet
Unity Hub                 UnityTechnologies.UnityHub        2.4.0.0               Tag: dotnet
Stride                    Stride.Stride                     5.0.1                 Tag: dotnet
Smallbasic                Microsoft.SmallBasic              1.2                   Tag: dotnet
Ironpython 2              Microsoft.Ironpython2             2.7.10                Tag: dotnet
.NET Core Runtime         Microsoft.dotnetRuntime           3.1.8.29220           Tag: dotnet
.Net Framework            Microsoft.dotNetFramework         4.8                   Tag: dotnet
Jchem .NET api            ChemAxon.jchemdotnetapi           20.19.0               Tag: dotnet
Powershell Preview (msix) microsoft.powershell-preview-msix 7.0.2                 Tag: dotnet
```

名前かIDを入力することで、そのパッケージをコマンドからインストールできる。

.NET Coreは名前にスペースが入っているので、IDを使う方法しか見つからなかった。

```
> winget install microsoft.dotnet
```

なお、wingetがあれば PowerShell7も入れられるようなので、以下のコマンドでも幸せになれたみたい。

```
> winget install microsoft.powershell-preview-msix
```

#### 入れておきたいアプリたち

必要に応じて足していきますが、ひとまず思いついたものを列挙。

```
> winget install git
> winget install Microsoft.VisualStudioCode
> winget install slack
> winget install 7zip
> winget install docker
```

git for Windowsは改行コードの問題があるので、

Windowsのみしか使わなければ特に考えなくてもいいとは思いますが、以下のほうが確実みたいです。

```
> git config --global core.autocrlf input
```

### インストール済みのパッケージ一覧と削除

~~なんと、内部的にはインストーラのダウンロードと実行をしているようなので、
アンインストールは既存の方法でしかできない模様。
そこばかりは我慢するしかないかな・・・~~

v1.0.11451の時点でアンインストールコマンドが実装されています。

#### インストール済みの一覧取得

```shell
winget list
```

#### アンインストール

```shell
winget uninstall <アプリ名>
```

#### サイレントインストール

インストール時にGUIが出てうざい場合には、``-h``オプション

```shell
winget <アプリ名> -h
```

### MS Storeの対応によるソース選択

ストアアプリからのインストールに対応したことで、次のようなエラーが出る場合があります。

```shell
> winget install microsoft.powershell
複数のパッケージが入力条件に一致しました。入力内容を修正してください。
名前               ID                   ソース
-----------------------------------------------
Microsoft Envision 9NBLGGH5PB0S         msstore
PowerShell         Microsoft.PowerShell winget
```

その場合は、次のように明確にインストールのソースを指定すると良いです。

```shell
> winget install microsoft.powershell -h -s winget
```

``-s``を引数ととることで、 ``winget``か``msstore``を明示的に選択できます。

### Vimの導入

次に大事なのがvimです。
これがないとターミナルとは言えないですよね。

[先駆者](https://qiita.com/shuhoyo/items/d9966e12976275f20c24) がいらっしゃったので、それに倣って進めていきます。


[Emacs使いの皆様向けの手順](https://github.com/mhatta/emacs-27-x86_64-win-ime)はあるようですが、ガチ勢はおとなしくWSL使ったほうがよげですね。


#### インストール

wingetでさくっとインストールします。

```
> winget install vim
```

しかし、このままではvimはつかえません。(パス通ってないので)

```
> vim
vim : 用語 'vim' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを
確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ vim
+ ~~~
    + CategoryInfo          : ObjectNotFound: (vim:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException
```

#### ps1の実行権限変更

PowerShellファイルの実行は標準で無効化されているので、
さくっと変更をしてしまいます。
(InsiderPreviewとかははじめから使えるぽい)

```
> set-executionpolicy remotesigned
> get-executionpolicy
RemoteSigned
```

RemoteSignedと出ていればOK。

#### プロファイルを確認

```
> $profile
C:\Users\XXXXXXXX\OneDrive\ドキュメント\PowerShell\Microsoft.PowerShell_profile.ps1
```

なぜOneDriveなのかは不明だが(たぶん連携したせい)、
ひとまずそこにあるそうなのでファイルをいじる。

エイリアスを設定することで、powershellからvimが使えるようになります。

```:Microsoft.PowerShell_profile.ps1
set-alias vi 'C:\Program Files\Vim\vim90\vim.exe'
set-alias vim 'C:\Program Files\Vim\vim90\vim.exe'
```

※インストールするvimによってパスが変わりますので注意しましょう！

さいごに、書き込んだprofileを反映します。(sourceコマンドと同等)

```
> . $profile
```

設定が終わったら、以下のコマンドを打ちこんで動くことを確認しましょう。

```
> vim $profile
```

うまくいきました。あとは``:q!``で終了しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/ad5c3566-0ef7-936f-647d-c26207ba60fd.png)

## su / sudo

windowsでターミナルを使う際に、いつも面倒なのが管理者権限で実行。

あそこまでとは言わないけど、簡単に管理者で実行したい。

というわけで、この[神記事](https://qiita.com/yokra9/items/6a783e4288f9f16deea9)を参考に作業開始。

powershell7 previewはエイリアスがpwshなので、
それに合わせた版を使用します。

```
> cd
> git clone -b feature/wt-pwsh7 https://github.com/hikaruright/sudo.git
```

その後、以下を環境変数に追加。

(コマンドでやると変なことになったので、PowerShellがPreviewのうちは、GUIで操作したほうがよさそう)

```
%USERPROFILE%\sudo
```

この状態でWindows Terminalを起動し、``su``と打つと管理者権限でwindows terminal(+PowerShell7)が新しく起動します。
``sudo``を使えばGUIを管理者権限下で実行することも可能。これで怖いものはない。

## さいごに

まだまだ発展途上とはいえ、Windowsのターミナルでもやれることは増えてきています。

Windowsが嫌いな人も、Docker使うときにコマンドプロンプトを使う程度の方も、
Windowsでターミナルを使いこなしてドヤッてはいかがでしょうか。