こんにちは、おしんです
先日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の文法
正規表現の書き方
コメント