Oh My Poshを利用してcmdプロンプト（Clink）をいい感じにする

`Oh My Posh`は`Posh`という`PowerShell`の短縮形が命名にはいっている事からわかるように。
元々は`PowerShell`のコマンドプロンプトをいいかんじにする`PowerShell`モジュールでありましたが、今現在は、`PowerShell`以外のシェルについてもいい感じにするようサポートされています。

本記事ではcmdプロンプト（`Clink`）をいい感じにしてみます

## ドキュメント

[Change your prompt | Oh My Posh](https://ohmyposh.dev/docs/installation/prompt)
[chrisant996/clink](https://github.com/chrisant996/clink)
[Overview | Clink](https://chrisant996.github.io/clink/)

## Clinkとは？

`Clink`はWindowsのシェルである`cmd.exe`に`GNU Readline library`の補完、履歴、行編集を追加するプロジェクトのようです。

`Oh My Posh`は`cmd.exe`に対して、直接カスタムプロンプトを提供はしませんが。
`Oh My Posh`と`Clink`は簡単に統合できるようになっています。

なおClinkはオリジナルは`Martin Ridgers`さんの[mridgers/clink](https://github.com/mridgers/clink)になるようですが、2022年現在は更新されておらず。

フォークされた[chrisant996/clink](https://github.com/chrisant996/clink)が更新されている状況のようです。

## Clinkをインストールする

[Overview | Clink](https://chrisant996.github.io/clink/)

ZIPのポータブル版、EXEのインストーラー版があるようです。

本記事ではインストーラー版からインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/bca88823-7eb2-1685-5aff-c9f9673e6987.png)

デフォルト設定すべてにチェックが入っていました。（ショートカット、%CLINK_DIR%の追加、自動起動等々）

`Autorun when cmd.exe starts`は`cmd.exe`を起動する時に、自動で`Clink`を起動するようにオプションでデフォルトでチェックがついています。

`cmd.exe`をスタートする時に常にClinkを開始してくれるのはよさそうですが、多少起動が遅くなると記載があるので今回はチェックオフ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/40d13a4d-18de-173f-29a0-cf559d126785.png)

デフォルトのインストールパスのママインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4324c0af-a0dc-c3b2-1b14-b39b23e48caf.png)

インストール成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/52c13d68-56d7-d64c-9193-2a8be99a254f.png)

インストールオプションで指定したスタートメニューに`Clink`が追加されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1c80113e-96a4-4735-e65b-a643d6a5516c.png)

インストールオプションで指定したユーザー環境変数を確認すると、%CLINK_DIR%が登録されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e5254f5d-4fa4-0ae8-d779-f8bdbeec2d75.png)

## Clinkを起動してみる（スタートメニュー）

スタートメニューに登録されて`Clink`から選択すれば起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/cd42d820-1468-d67b-17e2-aecc5f8d5052.png)

`Clink`のバージョン情報が表示されて起動してきました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/55fbec07-7691-b36c-9ed9-b267f650d926.png)

## Clinkを起動してみる（コマンドプロンプトから）

ドキュメントを参照すると既存のプロセスで`Clink`を起動する方法が記載されていました。

[Usage](https://chrisant996.github.io/clink/clink.html#usage)

既存プロセスで`Clink`を起動するには下記コマンドを実行します。　`<install_dir>`　はインストール時に選択したディレクトリ。

```cmd
<install_dir>\clink inject
```

インストーラで環境変数`CLINK_DIR`を設定するオプションにチェックしてインストールしている場合は、下記環境変数を参照する形でも問題なさそう。

```cmd
cmd.exe /K "%CLINK_DIR%\clink" inject
```

## Windows TerminalからClinkを起動できるようにする

既存のプロセス上から先程の用法で`Clink`を利用できるので下記のように`Windows Terminal`に設定すればOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ca117c69-c432-c3ee-5b5e-2c0fc202199c.png)

[Need to open clink in windows terminal ?](https://github.com/chrisant996/clink/issues/242)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ec6ff182-87fb-e851-8521-2eaf67f29a55.png)

`Autorun when cmd.exe starts`オプションを有効にしてインストールすると、`cmd.exe`起動時に自動的に`Clink`が有効になるのでその場合は単純に`cmd.exe`起動すれば`Clink`も有効になっている気がします。

## ClinkでOh My Poshを利用できるようにする

[Change your prompt | Oh My Posh](https://ohmyposh.dev/docs/installation/prompt)

`Clink scripts directory`に下記設定ファイル（oh-my-posh.lua）を配置すれば`Clink`と`Oh My Posh`が連携します。

```lua:oh-my-posh.lua
load(io.popen('oh-my-posh init cmd'):read("*a"))()
```

`Clink scripts directory`については、Clinkが起動している状態で`clink info`を実行すると`scripts`として表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0f98ffbb-119e-6780-bde6-f4b52137d808.png)

ユーザーフォルダ配下の`AppData\Local\clink`に`oh-my-posh.lua`を格納しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/d4c389af-9651-3d41-bd91-1a63abeb04f3.png)

`Clink`を起動し直すと、`Clink`のプロンプト表示がいい感じになりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/ba02671e-1558-514a-b6ba-3b3fd0707494.png)

## 設定するテーマを切り替える

`oh-my-posh.lua`を下記のように書き換えれば、読み込むテーマを変更できました。

```lua:oh-my-posh.lua
load(io.popen('oh-my-posh init cmd --config "<oh-my-posh_theme_path>"'):read("*a"))()
```

下記は`Oh My Posh`の標準テーマ`1_shell`を設定している例。

```lua:oh-my-posh.lua
load(io.popen('oh-my-posh init cmd --config "%POSH_THEMES_PATH%\\1_shell.omp.json"'):read("*a"))()
```

`oh-my-posh.lua`を更新して起動しなおすと、`1_shell`テーマに変更されている事を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3aa0c87a-6911-0bbe-1367-9c104f2937f8.png)


## 総評

`Oh My Posh`という名前ですが、`cmd.exe（Clink）`もプロンプト表示をリッチにできるのは、名前的にちょっと混乱します。