PowerShellにposh(oh-my-posh)を叩き込む

ふとWindowsのTerminalをもっとかっこいい見た目にしておもちゃにしたいと思い、poshを入れたりPowerShellをアプグレしたりした際の備忘録。
Twitter(X)に画像でメモしてたけれども、場所や環境によってはTwitterを堂々と見られなかったり、そもそも画像じゃこんな長文をコピーできず面倒くさかったりするのでQiitaに書き込んでおく。

https://x.com/tomato1323/status/1874115277967024323

# PowerShellをアップグレードする
Terminalなんて滅多に触らないって人はあんまりいないだろうが、初期状態だとPowerShell 5.1を使っているはず。
アップグレードは簡単なんでちゃちゃっとやっとく。
```powershell
winget install --id Microsoft.Powershell --source winget
```
![powers1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/e2384c1c-9aa0-4357-8e60-31cd4d260f3c.png)
出来たらこんな感じになるのでターミナルを再起動してあげよう。
そしたら左上のプラスの隣の下矢印を押すともう一つPowerShellができている。この黒い奴が新しいPowerShellとなっている。
![powers2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/77668e51-cc6d-4ee7-b14f-56dcd51896fe.png)

# PowerShell 7をデフォルトにする
これで新しいPowerShellをインストールできた。
ただこのままではターミナルを起動して矢印を押して新しいPowershellに切り替えて～なんて手間がかかる。
なので下矢印を押して設定→既定のプロファイル→PowerShellを選ぶ。
選んだら保存を忘れずに。
![powers3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/c82b3295-8c87-4ae6-a841-dbc449c9ddf3.png)

### いらないやつを非表示にする
さっきの矢印を押したときに古いPowerShellやらAzureやら色々表示されたが、古いPowerShellやAzure Cloudなんて多分一生使わないだろう。
そこで設定画面左下にあった"JSONファイルを開く"から設定ファイルを見てみる。
色々書いてあるが重要なのは"profiles"の部分。
```json
{
    "commandline": "hogehoge",
    "guid": "{fugafuga}",
    "hidden": false,
    "name": "Windows PowerShell"
}
```
"commandline"や"guid"の部分は人によって違うだろうから適当な文字にしている。
この"name"に書いてある部分が、さっき矢印を押したときに出てきたAzureやらコマンドプロンプト(Unicode文字になっているから読めないけど)やら書いてあった部分だ。
もうわかると思うが、表示から消したい項目(今回は古いPowerShellである"Windows PowerShell")の"hidden"をtrueにしてやればいい。
多分コマンドプロンプト君とは今後ともお世話になると思うが、いらない人は消しちゃってもいいと思う。

# Poshをインストールする
本題、Poshのインストール。
こちらもPowerShellのアップグレードと同じように、wingetでダウンロードからインストールまでやっちゃう。
```powershell
winget install JanDeDobbeleer.OhMyPosh -s winget
```
終わったらターミナルの再起動を忘れずに。
再起動を忘れると次以降の手順で「そんなコマンドがありません！」と怒られてしまう。（実際怒られた）

wingetに頼らずStep by Stepでインストールしたいのであれば公式のドキュメントを見ながらやろう。

https://ohmyposh.dev/docs

# フォントのインストール
Poshは特定のフォント(Nerd font)を使わないと一部レイアウトが文字化けしてしまうのだが、どのサイトを検索してもフォントサイトから直接ダウンロードするよう解説されていた。
それで直接ダウンロードしてみても以前文字化けしたままであったり、表示されなかったりと非常に煩雑。
なのでPoshから提供されているFontのインストール機能を使おう。
```powershell
oh-my-posh font install
```
実行するとこんな感じでフォントを選ぶ画面が出る
![powers4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/e2f25ca5-2a1e-4b99-b114-aa47ee571e5a.png)
調べていた際、一番おすすめされていたフォントがCascadiaCodeだったのでとりあえずそれを入れておけばなんとかなる。多分。
普通のCascadiaやMSの文字のあるものなどいろいろあるが、迷ったら無印の方を選んでいる。
![powers5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/7255f933-e617-4a73-90c3-fac215a48771.png)
終わったらこんな感じ。

# Poshが使えるか見てみる
とりあえずここまでやったが「あれ？全然画面が変わってないぞ？」と疑問になるかもしれない。
なのでとりあえず画面を変えてみよう。
```powershell
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json" | Invoke-Expression
```
これを入力してみるとあら不思議、一部文字化けした画面が出てきます。
![powers6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/506b5f1a-b51e-433c-b717-f744a5d86b28.png)
それも当然のこと、インストールしたフォントがまだ適用されていません。
まず設定→PowerShell→外観
![powers7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/7a0d9df1-4300-4f29-8a47-95ea17ccfd6a.png)
フォントフェイスから"CascadiaCove Nerd Font"を選択
![powers8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/24244996-01d0-40f0-895e-46d39540ee77.png)
忘れずに保存をしてからPowerShellに戻ってみると...
![powers9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/220e87eb-3281-4671-b6cc-c202f9afcc1d.png)
できた。

先ほど入力したコマンドがPoshのテーマを適用するコマンドになっており、最後についている`*.omp.json`の部分を書き換えると違うテーマを使うことができる。
どんなテーマがあるかは[公式ドキュメント](https://ohmyposh.dev/docs/themes)を見るとわかりやすい。

# Profileを作る
これでターミナルをいい感じの見た目にできたが、このままでは起動のたびにテーマを適用するコマンドを打たないと元に戻ってしまう。
面倒なのでターミナルが起動されたらコマンドを勝手に実行するようにする。
そのためにはまずPowerShell用のProfileを作成する。
```powershell
New-Item -Path $PROFILE -ItemType file -force
```
:::note alert
追加: 既にプロファイルを作成済みの場合、このコマンドを使うと初期化されてしまうのでスキップしてください
:::
このコマンドひとつでユーザーのドキュメントファイルにPowerShellフォルダを作成し、その中にMicrosoft.PowerShell_profile.ps1というファイルを作成してくれる。便利。
作成したら以下コマンドでProfileをメモ帳で開く。
```powershell
notepad $profile
```
(もちろんわかってる人なら自分の好きなテキストエディタで当該ファイルをいじってもよい)
メモ帳で開いたら以下を追記する
```powershell
if($env:WT_PROFILE_ID){
    oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\jandedobbeleer.omp.json" | Invoke-Expression
}
```
この部分は以下サイトを使ってます。

https://dev.classmethod.jp/articles/customize-your-powershell-console-with-oh-my-posh3/

`if($env:WT_PROFILE_ID)`を使うことでPowerShellを直接起動した際には実行せず、ターミナルでPowerShellを起動した際にコマンドが実行されるようになる。

これでターミナルを起動すればカッコいい画面になるぞ！やったね！

# おまけ: 外観の設定
黒い背景は画面や文字が見やすく利点しかないですが、やっぱりこういうところもカスタマイズしたいですよね。
というわけでカスタマイズしちゃいましょう。
フォントの設定時に開いたPowerShellの外観設定ページを開き、"背景画像のパス"を選択、参照ボタンを押して画像を選択するか、デスクトップの壁紙を使用を押します。
これだけでもかなり変わりますが、もうひと手間かけます。
"背景画像の不透明度"及びその下にある"背景の不透明度"を任意の数値に下げておきます。
その際、両方同じ値にしておかないと高い方の不透明度に引っ張られちゃうので何も考えず設定するなら同じ数値にした方がいいです。

上記設定をするとこのようになります。
![powers10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4076305/287c6435-6f43-4bff-8cf0-1d86ab52e00f.png)
見えずらいかもしれませんが、ターミナル後ろの画面が透けて見えるようになります。
これで「ネットでコマンドを調べながらターミナルを叩いている最中にターミナル画面がでかすぎてコマンドが読めない！」なんてことが減ったりするので地味に便利です。

- - -
以上、Posh導入方法でした。Twitterに書いた備忘録より長いな。冗長。