はじめに
自宅のWindowsで作業するとき常にSSHに潜っていたのでローカルのShellを気にせずに生活していた。
最近になり、ローカル環境で作業するに連れてPowerShellに愛着が湧いてきてこいつにもhook関数とか実装できるのか?と思い立った日に死に目を見た話をする。
hook関数とは
hook関数とは、bashやzshなどUnix系OSではお馴染みの、イベント関数のようなもの。
特に、zshでのhook関数についてはこの記事がめっちゃ詳しく解説しているのでここでは解説しない。
なにがしたかったか?
とにかくキショプロンプトが好き。
一文字プロンプトや、改行する度に文字の色が虹色に変わるプロンプトを見てニチャアとしている。
そんな中、クソながプロンプトがプリントされていく姿を見て、流石に横転しそうになった。
普段は、chpwd関数を使って、cdしたあとにカレントディレクトリを表示している。
これによってプロンプトにディレクトリを含まなくても迷子にならないようにしている。
また、迷子になったらpwdやlsをするという運用をしている。
これをWindowsでもやりたかった。
ただ、公式ドキュメント読みづらい。バージョンによって実装が変わっている。そもそも使っている人が存在しないなど様々な要因からとても苦戦した。
そのため、この世に存在するかもしれないPowerShellに住むシェル芸オタクのために、まとめることにした。
環境構築
今回、PowerShell 5.Xで行った。
バージョンは以下で確認できる。
echo $PSVersionTable
まず、profile.ps1というものを置く。
場所は環境に依存するので確認する。
echo $PROFILE
Microsoft.PowerShell_profile.ps1とプリントされているかもしれないが、ファイル名に禁忌とも言えるキモい文字が入っているのでprofile.ps1で作成した。
profile.ps1をprofileとして読むように設定する必要があるが省略。
一応、すべてが面倒臭い人向けに、これで動く。
notepad $PROFILE
実装
一応、chpwdという名前でhook関数っぽく実装する。
function chpwd {
if $($args[0] -eq $null) {
Set-Location $HOME
}else{
Set-Location $args[0]
}
pwd
}
Set-LocationというのはPowerShellのコマンドレットというもの。
alias cd
とすると確認できるが、cdはSet-Locationへのエイリアスとなっている。
名前と対応が取れていないが、chpwdからの引数をそのままSet-Locationに渡すことでワーキングディレクトリを移動するという仕組みとした。
最後に、pwdすることで、cdしたあとのワーキングディレクトリを表示して終わり。
これをaliasとして登録するだけなのだが、バージョンによってaliasの登録方法が異なる。
少なくとも5.X系では、
Remove-Item Alias:cd
New-Alias cd chpwd
で動作した。
6以降では、
Remove-Alias -name cd
Set-Alias cd chpwd
とすることで動作するかもしれない。
あぶない!
cdのエイリアスを書き換えるということで結構危険なshell芸になる。
もし、タイポなどで失敗してわけがわからなくなってしまった場合は
PowerShell -NoProfile
と打つことでプロファイルを読み込まずに起動することができる。
筆者は
vim profile.ps1
PowerShell
とすることでインスタントにprofileの書き換えを確認しているがnodepadを使う方法が無難だと思う。
exit
がめんどくさいし。
仕上げ
function prompt{
"YUKI.N>"
}
echo "YUKI.N>見えてる?"
プロンプトをオタクにして完成。
どうやら、ダメそうです。
おわりに
Windows PowerShellのダサいフォントと最悪なUXと共存するために、延々と電波なことを言い続ける異星人を住まわすことにしました。
皆さんも、PowerShellの中の異星人をかわいがってあげてください。
それでは。