LoginSignup
1
0

どうしてもPowerShellにhook関数を実装したかった

Last updated at Posted at 2024-03-26

はじめに

自宅の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関数っぽく実装する。

cdの簡易的再実装とpwd
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系では、

5.X系
Remove-Item Alias:cd
New-Alias cd chpwd

で動作した。

6以降では、

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>見えてる?"

プロンプトをオタクにして完成。

image.png

どうやら、ダメそうです。

image.png

おわりに

Windows PowerShellのダサいフォントと最悪なUXと共存するために、延々と電波なことを言い続ける異星人を住まわすことにしました。
皆さんも、PowerShellの中の異星人をかわいがってあげてください。
それでは。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0