Windows PowerShellのプロンプトを変更する
Windows で Electron アプリ開発していて、(VSCode使っているのだけど) コマンドラインでgit操作するときに、プロンプトにgit情報がなくてつらい。
Windows PowerShellのデフォルトプロンプトは以下のような感じ。
PS C:\Users\user>
そっけないですね。RPGの主人公が最初みすぼらしい格好してるのは装備充実させるモチベーションになるため、ってのに似ているかもしれない。プロンプトを充実させるところからWindows開発は始まるのでしょう。知らんけど。
取り急ぎ、git のブランチ名とか出てほしい。あわよくば Linux で使ってるプロンプトと同じ感じにしたい。
Linuxで使ってるのは以下のような感じ。
[2020/06/13 17:11:57] user@host (Perl 5.30.2)
~/current/dir/path
branch-name : user/repo-name
$
キモイと思いますが、わたしはこれで満足です。
Windows PowerShellのプロンプトはどうやって変更するのか
実行ポリシーの変更
細かい話はこのページ あたりに書かれていますが、Windows Power Shell をカスタマイズするにあたっては実行ポリシーの変更が必要です。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Confirm
PS1設定にあたるものは profile.ps1 というファイル
Linuxなら .bash_profile なり .bashrc に書きますが、Windows の場合は profile.ps1
というファイルがそれにあたります。
profile.ps1 が存在するか確認する
Test-Path $profile
というコマンドで確認できます。
> Test-Path $profile
False
profile.ps1 を作成する
profile.ps1 がまだ作成されてなければ New-Item -path $profile -type file -force
と打って作成しましょう。
> New-Item -path $profile -type file -force
Directory: C:\Users\user\OneDrive\Documents\WindowsPowerShell
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2020-06-13 14:21 0 Microsoft.PowerShell_profile.ps1
C:\Users\user\OneDrive\Documents\WindowsPowerShell
に作成されました。ファイル名は profile.ps1
ではなくて Microsoft.PowerShell_profile.ps1
というのが作成されています。気にせずそのままのファイル名で中身を書き換えていけば OK です。たぶん Windows のバージョンか Shell のバージョンなどによって異なるのではないかと思います。
profile.ps1 の中身
prompt という関数を用意しておくと実行される
最小構成
function prompt {
"Foo >"
}
WindowsのコマンドがよくわからないのでPerlでやる
gitコマンドから任意のブランチ名やリポジトリ名を取り出すのに、Windows PowerShellのコマンドまわりがよくわからないので、しゅっとなんでもできてしまう Perl を利用します。
ぼくが考えたさいつよのPowerShell prompt
というわけで、以下が完成形 prompt
。
function prompt {
(Get-Host).UI.RawUI.WindowTitle = "PowerShell $pwd"
$date = Get-Date -UFormat "%Y/%m/%d %H:%M:%S"
$execution_policy = Get-ExecutionPolicy
$git_branch = git branch 2>$null | perl -e 'while(my $line = <>){if($line =~ m!^\* (.+)!){ print $1; last; }}'
$git_repo = git remote -v 2>$null | perl -e 'my $line = <>; if($line =~ m!:([^(.]+)!){ print qq| : $1| if $1; }'
$perl = perl -v | perl -e '<>; my $line = <>; $line =~ m!v(\d+\.\d+\.\d+)!; print $1'
Write-Host "`r`n[" -NoNewLine
Write-Host $date -NoNewLine
Write-Host "] " -NoNewLine
Write-Host $env:USERNAME -NoNewLine
write-Host " $execution_policy " -NoNewLine
write-Host "(Perl $perl)"
Write-Host " $pwd"
Write-Host " $git_branch" -NoNewLine
Write-Host "$git_repo"
Write-Host "$" -NoNewLine -ForegroundColor Green
return " ";
}
こんな感じのプロンプトになった。だいたいLinuxと同じ。Yas!
[2020/06/13 17:33:39] user RemoteSigned (Perl 5.30.2)
C:\Users\user\mclocks
master : bayashi/mclocks
$
ちなみにプロンプトにはあまり色を付けない派です。Linuxだと本番環境の時だけホスト名を赤にしたり、rootのときプロンプトの記号を赤くしたりしていますが、Windowsだとそういうのもないのでプロンプトの記号を緑にしてみた。これは目線をフォーカスしやすくするため。