LoginSignup
13
16

Oh My Poshを利用してPowerShellプロンプトをいい感じにする

Last updated at Posted at 2021-10-16

注意事項(2022年5月1日追記)

Oh My Poshのバージョンが7.75.0から、本記事で紹介しているPowerShellギャラリーからインストールするPowerShellモジュール版のサポートは終了するようです。

※PowerShellモジュール版のoh-my-posh v 7.75.0をインストールすると下記のメッセージが表示される。

image.png

現在は提供方式がバイナリをインストールする方式に変更されており。
インストール手順も変更となっています。

PowerShell module

このため本手順で紹介しているインストール方法は過去の手法となり。
本手順でインストールされるモジュール版は古い手順となるためご注意下さい

なおすでにインストールしているPowerShellモジュール版のOh My Poshをバイナリ版に移行する記事を下記に投稿しています。

Oh My PoshをPowerShellモジュール版からバイナリインストール版に移行してみる

また一からバイナリ提供版をインストールする場合は下記参照。

Oh My Poshを利用してPowerShellプロンプトをいい感じにする(バイナリインストール・Windows Terminal)

以上追記終了、以下本文

Git For Windowsをさわってみる from PowerShell+【oh-my-poshとposh-gitも】 の記事で、PowerShellgitを利用する過程でOh My Poshposh-git利用について書きましたが、Oh My Poshについてはざっくりと流したので本記事ではOh My Poshの利用を主題において記載します。

Oh My Poshとは

Oh My PoshPowerShellのコンソールをいい感じにカスタマイズ表示してくれるPowerShellモジュールとなっており。
zshoh-my-zashに影響されて始まったプロジェクトのようです。

このモジュールが作られた動機については下記ブログに記載があります。

Shell shock

いいかんじに設定するとは書きましたが、どんな感じになるかは下記サイトに標準テーマの見栄えがまとまっているため。
こちらをみて気になった方はOh My Poshの導入を検討するのがいいでしょう。

Oh My Posh Docs - themes

各種Webサイト

v2とv3

Oh My Posh 3 vs Oh My Posh 2

上記ドキュメントにはv2とv3についての記載がありますが今現在は普通にインストールするとv5.8.0がインストールされるため特に気にする必要はないかと思います。

ちなみにv2からv3にかけて実装を作り直して、色々とコマンドレット名に変更があったりしました。

端末環境

  • Windows 10
  • PowerShell 7.2.0-preview.10
  • Windows Terminal Preview 1.11.2731.0
  • oh-my-posh v5.8.0
  • posh-git v1.0.0

普段、WindowsTerminal上でPowerShellを利用しているため、本記事でもフォント設定部分はWindowsTerminalを設定する事で対応しています。

oh-my-poshをインストールする

oh-my-poshをインストール
Install-Module -Name oh-my-posh 

上記の例だとマシンスコープにモジュールをインストールしていますが、ユーザスコープにインストールする場合は-Scope CurrentUserをつけてインストールして下さい。

フォントをインストールする

Oh My Posh Docs - Font

Oh My PoshNerdフォントと呼ばれる、多数のアイコンを含む開発者向けのフォント利用を前提として構築されています。

このため、まずはNerdフォントをインストールする必要があります。
ちなみに上記ドキュメントでは、Meslo LGM NFフォントを推奨しています。

フォントをインストールしたあとは、コンソールでインストールしたフォントを利用するよう設定して下さい。

下記はWindowsTerminalHackGenNerd Consoleフォントを設定した図。

image.png

Oh my Poshで用意されている標準テーマを確認してみる。

まずは本モジュールで利用できるコマンドレットを確認してみます。

image.png

v5.8.0では上記のコマンドがインストールされています。
v2からv3にかけて変更された古いコマンドがAliasとして登録されており、実行するとドキュメントへのリンクを表示するGet-PoshInfoForV2Usersが実行されます。

ここではGet-PoshThemesコマンドレットを実行してOh My Poshが提供しているテーマ一覧がを表示してみます。

実行すると、各種テーマが表示されるので自分が気に入るテーマ名を控えておいて下さい。

image.png

PoshThemesを適用する

先程控えておいたテーマを適用するにはSet-PoshPrompt -Theme テーマ名で適用できます。

rudolfs-darkテーマを適用してみた例。

image.png

さてこのSet-PoshPormptでテーマが適用された状態でもう一度、モジュールで利用できるコマンドを確認してみます。

image.png

現在、読み込んでいるテーマファイルの場所を表示するGet-PoshContext。テーマのイメージファイルを保存するExport-PoshImageなどのコマンドが増えています。

なおSet-PoshPormptで適用したテーマの有効期間ついては現在開いているセッション中有効となり。

別セッションでPowerShellプロンプト起動時は再度読み込む必要があります。

毎回コマンドを実行するのは手間なので起動時に自動実行される起動プロファイル$Profileに設定を書き込みます。

起動時にPoshTemesを読み込むよう$profileに設定を書き込む

Powershellのプロファイルは環境変数$Profileに場所が格納されているためnotepadで編集する場合は下記のように実行して下さい。

notepad $Profile

下記は起動時にrudolfs-darkを読み込む設定

Import-Module oh-my-posh
Set-PoshPrompt -Theme rudolfs-dark

標準テーマをそのまま利用する場合はテーマ名指定で問題ありません。

Set-PoshPrompt -Theme rudolfs-darkを読み込んだあとに、Get-PoshContextを実行すればわかりますが。
テーマ設定が格納されているのは...\Modules\oh-my-posh\5.8.0\binとなっていることからわかる通り。
Oh My Poshのインストールバージョン毎のディレクトリに含まれているテーマを読み込んでいます。

このため、テーマ名の指定だとモジュールをバージョアップした際に、該当のテーマがなくなっていたら起動時にエラーになるかと思います。(そんなケースがあるかどうかですが)

Set-PoshPromptでテーマ名ではなくテーマ設定ファイルのパスを指定してテーマを読み込む

Oh My Posh Docs - Override the theme settings

Oh My Poshのテーマを改造する場合はドキュメントにある通り。

コマンドを実行して読み込んでいるテーマの設定を~/.mytheme.omp.jsonとして保存できるため、保存したファイルを更新するのがいいかと思います。

いきなり1から設定ファイルの記述を始めるのは中々ハードルが高い。

Set-PoshPrompt -Theme rudolfs-dark
Export-PoshTheme -FilePath ~/.mytheme.omp.json -Format json

設定方法は後述しますが、~/.mytheme.omp.jsonを自分好みのカスタマイズが完了したら。

起動プロファイル$ProfileSet-PoshPrompt -Theme ~/.mytheme.omp.jsonとテーマ名ではなく設定ファイルパスで指定します。

こうする事によりモジュールのバージョンを上げるたびに、設定ファイルを最新バージョンのモジュール配下に設置しなくてよくなります。
テーマ名だと動作しているバージョンのフォルダを探しにいく。

実際にテーマを改造してみる

先程エクスポートテーマを改造するために必要な情報は下記のドキュメントを参照すれば得られます。

Configuration|Oh MyPosh

Oh My Poshでは様々な機能がセグメントとして用意されており、それに対してプロパティを設定する事でプロンプトをカスタマイズできます。

下記は筆者が現時点で設定しているテーマをサンプルとして載せておきます。

paradoxテーマを改造して、下記の設定をしています。

  • ユーザ名とホスト名を非表示。
  • Pathセグメントの表示スタイルをAgnosterを指定して、カレントディレクトリとホームの表示を設定
  • AWSセグメントの表示設定
  • posh-gitセグメントの表示設定

posh-gitセグメントを利用するには、前提としてposh-gitモジュールががインストールされていて、環境変数$env:POSH_GIT_ENABLED = $trueとなっている必要があったり。

oh-my-poshでは標準でgitセグメントが用意されていて、どちらか使えば問題ないのですがここで掲載している設定ではなんとなく両方表示させているのでだいぶ冗長な感はあります。

こちらを適用すると下記のような感じになります。

image.png

paradoxを改造した一例
{
  "$schema": "https://raw.githubusercontent.com/JanDeDobbeleer/oh-my-posh/main/themes/schema.json",
  "blocks": [
    {
      "type": "prompt",
      "alignment": "left",
      "segments": [
        {
          "type": "root",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#100e23",
          "background": "#ffe9aa"
        },
        {
          "type": "session",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#100e23",
          "background": "#ffffff",
          "properties": {
            "display_user": false,
            "display_host": false
          }
        },
        {
          "type": "path",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#100e23",
          "background": "#91ddff",
          "properties": {
            "folder_icon": "\uF115",
            "folder_separator_icon": " \uE0B1 ",
            "style": "agnoster"
          }
        },
        {
          "type": "git",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#193549",
          "background": "#95ffa4",
          "properties": {
            "display_status": true,
            "display_stash_count": true,
            "display_upstream_icon": true
          }
        },
        {
          "type": "poshgit",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#000000",
          "background": "#000000"
        },
        {
          "type": "aws",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#ffffff",
          "background": "#FFA400",
          "properties": {
            "prefix": " \uE7AD ",
            "template": "{{.Profile}}{{if .Region}}@{{.Region}}{{end}}"
          }
        },
        {
          "type": "python",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#100e23",
          "background": "#906cff",
          "properties": {
            "prefix": " \uE235 "
          }
        },
        {
          "type": "exit",
          "style": "powerline",
          "powerline_symbol": "\uE0B0",
          "foreground": "#ffffff",
          "background": "#ff8080",
          "properties": {
            "prefix": " \uE20F"
          }
        }
      ]
    },
    {
      "type": "newline"
    },
    {
      "type": "prompt",
      "alignment": "left",
      "segments": [
        {
          "type": "text",
          "style": "plain",
          "foreground": "#007ACC",
          "properties": {
            "prefix": "",
            "text": "\u276F"
          }
        }
      ]
    }
  ],
  "final_space": false
}

総評

プロンプトのカスタマイズについては見栄えという観点以外には。

AWSセグメントは環境変数に設定されているプロファイル情報を表示してくれるため.aws/configに設定しているコンフィグ情報を環境変数AWS_PROFILEに書き込んでくれるposh-awspモジュールと組み合わせ利用すると、視覚的に今どのプロファイルを利用しているのかわかり便利です。

今回は利用していませんが、Azureセグメントも用意されているためAzureを利用する場合にも便利なのかもしれません。

13
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16