[PowerShell] Oh my Posh (Powerline) を使ってPowerShellコンソールをおしゃれにカスタマイズする

2021.01.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

BashやZshなどのシェルではPowerlineをつかってコンソールのプロンプトをおしゃれにカスタマイズすることができます。

(上図はこれから説明する内容を実施した後の結果ですが、こんな感じの表示ができるやつです)

この本家PowerlineはPowerShellには対応していないのですが、PowerShellでも派生プロダクトであるchrisbenti / PS-Config Jaykul / PowerLineJanDeDobbeleer / oh-my-poshといったOSSが以前から存在しており本家と同じ様なカスタマイズをすることが可能となっています。
このうちoh-my-poshについてはDocsでも取り上げられWindows Terminal上でのカスタマイズ方法が紹介されたりもしています。

※oh-my-poshはあくまでも有志のOSSですのでその点はご留意ください

基本方針

私はブログでの検証のためPowerShellコンソールは限界までバニラにする事にしており、これまでこの様なカスタマイズを一切してきませんでした。

ただ、長年ブログを書いてきた結果、バニラである必要があるのは標準のPowerShellコンソールだけで十分と判断し、Windows TerminalからPowerShellを使う場合は自由にカスタマイズしても問題ないだろうとの決断に至りました。

このため本記事では通常のPowerShellコンソールの表示はそのままにWindows TerminalからPowerShellを起動した場合のみ表示がカスタマイズされる様にすることを基本方針とします。

Oh my Poshとは

Oh my Poshは先ほど説明したとおりPowerShellでPowerlineと同様のカスタマイズを実現するためのOSSです。
名前のとおりOh My Zshに影響を受けて開発されています。

Oh my Poshは現行のStableリリースであるVersion.2系と、内部実装をGoで書き直しているVersion.3系 *1が存在し、Version.3系はベータ版となっています。
Version.3系はJanDeDobbeleer / oh-my-posh3とリポジトリ自体も別です。

ベータ版といえども更新頻度も活発でドキュメントはすでにVersion.3系ベースとなっているので積極的に利用して良いんじゃないかと思います。
(加えて個人環境のカスタマイズ用のソフトウェアですし、積極的に新しいバージョンを使ってフィードバックする方があるべき姿だとも思います。)

やってみた

それでは早速やっていきます。

検証環境

検証環境は私の開発機で以下の環境となっています。

  • 日本語版 Windows 10 October 2020 Update(20H2)
    • ただし表示言語は英語化している
  • Windows Terminal Ver.1.4.3243.0
  • PowerShell 7.1.0

この環境に最新のOh my Posh 3 (Ver.3.68.3)をインストールします。

0. 前提条件

以下のソフトウェアがインストールされている前提です。

これらのインストール方法については本記事では触れません。
適宜インストールしておいてください。

1. Oh my Poshモジュールのインストール

【2022/08/11追記】

現在はPowerShellモジュールの利用が廃止されました。

Oh My PoshのインストールはWindows Package Manager (WinGet)かScoopを使うのがオフィシャルな方法になっています。

【追記ここまで】


Oh my PoshはPowerShellモジュールとして提供されています。
このためInstall-ModuleからインストールするだけでOKです。

ただ、Version.2系がStableバージョンとなっているため現在Version.3系を使うには-AllowPrereleaseオプションを指定してやる必要があります。

# ※PowerShellモジュールを使ったインストールは廃止ずみ

# WinGetを使ってインストールする場合はこんな感じ
winget install JanDeDobbeleer.OhMyPosh -s winget

2. Powerline Fonts (Nerd Fonts)のインストール

Powerlineでは専用のフォント(一般的にPowerline fontsと呼称されるフォント群)を使って独自の表示を実現しています。
Oy my PoshではNerd Fontsで提供されているフォントに合わせているとのことなので、こちらから環境と好みに応じたフォントをダウンロードしてインストールしておきます。

Windows環境向けには、Windows Terminal用に開発されたCascadia Codeフォントを拡張した「Caskaydia Cove Nerd Font」があったので今回はこれを使うことにします。

上記リンクからフォントをダウンロードして適当なディレクトリに保存、解凍します。

インストールしたいフォントをダブルクリックして「インストール」すればOKです。
(今回はCaskaydia Cove Nerd Font Complete.ttf、フォント名CaskaydiaCove Nerd Fontを選んでいます )

補足

ちなみに専用フォントがインストールされていない場合はこの様に特殊文字が表示できず「□」になってしまいます。

3. Windows Terminalのカスタマイズ

ここまでで事前準備が完了したので、以降は実際にOh my Poshを利用するための設定を追加していきます。

まずはWindows Terminalで先ほどインストールしたフォント(CaskaydiaCove Nerd Font)を使用するために設定ファイルsettings.jsonをカスタマイズします。
PowerShell 7用の設定は「"source": "Windows.Terminal.PowershellCore"」となっている要素ですので、ここに

"fontFace": "CaskaydiaCove Nerd Font"

と使用フォントの設定を追記します。

settings.json

// PowerShell 7 用設定の "fontFace" を変更
{
    "guid": "{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}",
    "hidden": false,
    "name": "PowerShell",
    "source": "Windows.Terminal.PowershellCore",
    "fontFace": "CaskaydiaCove Nerd Font"
}

これでWindows Terminalのフォント設定が完了となります。

4. PowerShellプロファイル(Microsoft.PowerShell_profile.ps1)のカスタマイズ

続けてPowerShell側の設定変更を行います。
Oy my PoshではGet-PoshThemesコマンドレットでインストール済みのテーマ一覧を取得できます。

こちらで好きなテーマを決めて名前を控えておいてください。
(ちなみに自分専用のテーマを作ることもできますが本記事では割愛します。詳細はドキュメントをご覧ください。)

使いたいテーマを決めたあとはSet-PoshPromptコマンドレットでテーマを変更します。
使いたいテーマを決めたあとはoh-my-posh init pwshコマンドでテーマを変更します。

# agnosterplus テーマを使う場合の実行例
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\agnosterplus.omp.json" | Invoke-Expression

これで基本はOKなのですが、まだ設定は永続化されていません。
設定を永続化したい場合はPowerShellのプロファイル(Microsoft.PowerShell_profile.ps1)でSet-PoshPromptを呼び出す様にする必要があります。

ただ、PowerShellのプロファイルはWindows PowerShell/PowerShell 7/PowerShell ISEといったホスト別で用意されているものの、通常のコンソール利用かWindows Terminal経由での利用かまでは区別してくれません。

このためどうにかしてWindows Terminal経由で起動されていることを判定してやる必要があります。

Windows Terminalから各シェルを起動した場合WT_で始まる環境変数がいくつか追加されるため、今回はこのうちWT_PROFILE_ID環境変数を採用し、この環境変数が存在する場合はWindows Terminalからの起動と見做すことにします。
今回は以下の様なコードをMicrosoft.PowerShell_profile.ps1に追記しWindows TerminalからPowerShellが起動された場合にagnosterplusテーマを使う様にしました。

Microsoft.PowerShell_profile.ps1

# プロファイル(Microsoft.PowerShell_profile.ps1)をカスタマイズし設定を永続化
if ($env:WT_PROFILE_ID) {
    # Windows Terminalから実行されたときだけ変更する設定をここに記述する
    oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\agnosterplus.omp.json" | Invoke-Expression
}

(WT_PROFILE_ID環境変数はWindows Terminalの設定にあるプロファイルIDを表示する変数ですので、たとえばPowerShellを複数用意している場合などは適宜条件を変えてください)

あとはOh my Poshの機能ではありませんがPSReadline 2.1のFish風補完を加えてみるのも良いでしょう。

Microsoft.PowerShell_profile.ps1

# (optional) せっかくなのでPSReadlineのカスタマイズも加えてみる
Set-PSReadLineOption -PredictionSource History
Set-PSReadLineKeyHandler -Key "Ctrl+f" -Function ForwardWord

実行例

これですべての設定が完了となります。
下図の様にWindows Terminalから起動した場合はカスタマイズされた表示に変わりつつも通常のコンソールはデフォルトの表示を維持しています。

最後に

以上となります。

今回はデフォルトで用意されているテーマを使うまでを試しましたが、Oh my Poshでは他にも様々なカスタマイズが可能となっています。
ドキュメントを読み込んで自分好みのカスタマイズをしてみてください。

脚注

  1. 再実装と同時にPowerShell以外のシェルでも使える様になり可搬性が上がっている