PowershellでMinicondaの環境名を表示させる方法

この記事は約8分で読めます。

こんにちは、おしんです

 

先日AnacondaからMincondaに移行したら環境切り替え時にPowershellに環境名が表示されなくなってしまいました

そこで自分でPowershellのプロンプトを編集して表示させるようにしました

 

自分が作成したプロンプトの紹介と簡単な解説を書いていきます

 

Mincondaでの説明にはなっていますが、Anacondaでも同様のことができると思います

 

作成したプロンプト

結論から言うと、以下の内容をMicrosoft.PowerShell_profile.ps1に記載したらMincondaの環境名が表示されるようになりました

function prompt() {
    $username = $env:UserName
    $computername = $env:ComputerName.ToLower()
    $path = $pwd.path.Replace($HOME, "~")
    $ps = "$"

    # Micondaの環境名を取得
    $condaEnvName = ""
    if (conda info -e) {
        (conda info -e | select-string ".*\*.*").ToString() | set-variable -name condaEnvName
        $condaEnvName = $condaEnvName.Split(" ")[0]
        $condaEnvName = "(" + $condaEnvName + ") "
    }
    
    if($condaEnvName -ne "(base) "){    // -neはNotEqualという意味
        Write-Host "$condaEnvName" -ForegroundColor "Yellow" -NoNewLine
    }
    Write-Host "$username@$computername" -ForegroundColor "DarkGreen" -NoNewLine
    Write-Host ":" -NoNewLine
    Write-Host "$path" -ForegroundColor "DarkBlue" -NoNewLine
    # Write-Host "$branch" -ForegroundColor "Yellow"
    Write-Host "$ps" -ForegroundColor "DarkGreen" -NoNewLine

    return " "
}

 

解説

まず初めに、この記事の筆者に感謝申し上げます

とても参考にさせていただきました

 

解説とか言っておきながら細かいところまでは理解しきれていないので、Mincondaで環境名を取得した部分だけ説明します

    # Micondaの環境名を取得
    $condaEnvName = ""
    if (conda info -e) {
        (conda info -e | select-string ".*\*.*").ToString() | set-variable -name condaEnvName
        $condaEnvName = $condaEnvName.Split(" ")[0]
        $condaEnvName = "(" + $condaEnvName + ") "
    }
    
    if($condaEnvName -ne "(base) "){    // -neはNotEqualという意味
        Write-Host "$condaEnvName" -ForegroundColor "Yellow" -NoNewLine
    }

 

まずは環境名を格納する変数を宣言します

$condaEnvName = ""

 

 

つぎに$conda info -eの出力があることを確認して後続の処理を行います

if (conda info -e) {

 

おしん
おしん

$conda info -eはMincondaの仮想環境を表示させるコマンドですね

 

次に現在適用されている環境の情報を取得します

(conda info -e | select-string ".*\*.*").ToString() | set-variable -name condaEnvName

 

まず前提として$conda info -eを実行すると、現在使用してる環境には*(アスタリスク)が付いています

$ conda info -e
# conda environments:
#
base * C:\Users\hogehoge\miniconda3
test C:\Users\hogehoge\miniconda3\envs\test
test38 C:\Users\hogehoge\miniconda3\envs\test38

 

仮想環境が存在していない場合、もしくは特に切り替えを行っていない場合はbaseに*がついています

なので*を目印に現在の仮想環境の情報を抜き出します

 

この部分もう少し説明します

(conda info -e | select-string ".*\*.*")

 

この処理では$conda info -eの出力結果から正規表現を利用して*を含む行のみをセレクトしています

“.*\*.*”

おしん
おしん

アスタリスクが多くてややこしいですね、、、

 

これは”[任意の文字が0回以上繰り返されている]*任意の文字が0回以上繰り返されている]”という条件を表しています

hogehoge*fugafuga みたいな感じです

 

正規表現では「.」が任意の文字、「*」が0回以上の繰り返しを表しています

また、繰り返しの意味の「*」ではなく文字としての「*」を判定するために、判定したい「*」の前にエスケープシーケンスの「\」をつけています

詳しくは「正規表現 任意文字の繰り返し」などで調べてみてください

 

そして正規表現で条件にマッチした出力行を文字列として変数condaEnvNameに入力しています

(conda info -e | select-string ".*\*.*").ToString() | set-variable -name condaEnvName

 

続いて抽出した環境情報から環境名だけを取得します

$condaEnvName = $condaEnvName.Split(" ")[0]

 

$conda info -eの出力結果は以下のように「環境名[半角スペース]*[半角スペース]環境情報のパス」になっています

base * C:\Users\hogehoge\miniconda3

 

そのため、この文字列を半角スペースで区切って文字列配列にした後に0番目を取得することで環境名だけを抽出することができます

[base, *, C:\Users\hogehoge\miniconda3]

 

あとは環境名をカッコで囲んでプロンプトの先頭に表示させるだけです

$condaEnvName = "(" + $condaEnvName + ") "

 

 

ただし、baseの時はわざわざ表示させなくてもいいので、その時だけプロンプトへの追加処理を省いています

if($condaEnvName -ne "(base) "){
  Write-Host "$condaEnvName" -ForegroundColor "Yellow" -NoNewLine
}

 

PowershellだとNotEqualは「A -ne B」を表記するみたいです

おしん
おしん

言語ごとに違ってて覚えられない~~~ (T T)

 

おわりに

簡単にではありますが、Mincondaの環境名をPowershellに表示させる方法の説明をしました

 

Powershellのプロンプトの書き方が全然わかっていないため、かなりアバウトの説明になってしまいましたが誰かの役に立てればと思い書いてみました

 

また、余談ですがこの表示方法だとコマンド実行後に若干のラグが発生してしまうんですよね、、、

なんでそうなるかもわからず、、、

 

もしご存じの方いましたらご教授頂けますと幸いです

 

参考

Powershellの文法

 

正規表現の書き方

コメント

タイトルとURLをコピーしました