Windows の pipenv で上下キーでヒストリーをたどりたい

タイトルのとおりですが、Windows の powershell 7 で pipenv shell するとコマンドの実行履歴がたどれなくなりなんとかしたいと思っていた。

ネット上を検索するといくつか回避策を見つけられたがどれも自分にはしっくりこなかったので、Claude に聞いてみて解決策を見つけたので記事にする。

そもそも pipenv shell すると powershell にいるにも関わらず command プロンプトが起動しているのが原因じゃないかと推測している。

いくつかのページでは、pipenv run pwsh で、直接powershell を起動すればいい的なことを書いているがそうするとプロンプト文字列の (VENV名) が消えてしまう。

(VENV名) は venv フォルダの Scripts の中にある activate.ps1 や activate.bat を起動すると表示できる。

解決策は Claude が言うままに $PROFILE に関数とエリアスを定義してやる。


function Invoke-PipenvPwsh {
  $venv_path = pipenv --venv 2>$null
  if ($venv_path -and (Test-path "$venv_path\Scripts\Activate.ps1")) {
    & "$venv_path\Scripts\Activate.ps1"
  } else {
    Write-error "Pipenv venv not found"
  }
}

Set-Alias pipenv-shell Invoke-PipenvPwsh

反映するには以下を実行する。

; $PROFILE を反映する
PS > . $PROFILE

; pipenv shell の変わりに pipenv-shell で activate.ps1  を起動する
PS > pipenv-shell
(VENV 名)  PS > 

; 注意 exit しちゃうと shell そのものから抜けちゃうので  deactivate で抜ける
(VENV 名)  PS >  deactivate

function でやっていることは特別難しいことではなくて、 pipenv –venv で venv の場所を取得して、そのなかの activate.ps1 を起動している。

win / Linux に限らず shell 関係のスクリプトを空で書くのって結構面倒だからほんと Claude に頼りきりだ。こうやって人は AI の奴隷になっていくのかと思ってみたり。

ともあれ、これでちょっといい感じになった。