2020/06/15

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 を利用します。

Strawberry 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だとそういうのもないのでプロンプトの記号を緑にしてみた。これは目線をフォーカスしやすくするため。

See Also

サイト内検索