$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Pythonのvenvのプロンプト表示をカスタマイズする

pyenv + venvでPython3環境を構築する - $shibayu36->blog;の記事で、Python3でvenvを使った環境を構築することができた。しかしvenvでsource bin/activateすると、自分の設定したプロンプトの左側に(venvの環境名)という文字列が勝手に挟み込まれてしまって、あまり好みではなかった。
f:id:shiba_yu36:20170401143732p:plain

それを以下のように、venv環境の中にいたらpy:(pythonのversion):(venvの環境名)という表示にしたかった。
f:id:shiba_yu36:20170401143900p:plain

のでやってみた。

プロンプトの左側の環境名表示を消す

まずプロンプトの左側の(venvの環境名)を消す。こちら を参考にして、VIRTUAL_ENV_DISABLE_PROMPTという環境変数を設定しておけば良いらしい。

# virtualenvでpromptを変更しない
export VIRTUAL_ENV_DISABLE_PROMPT=1

環境名をプロンプトの好きな場所に表示する

bin/activateのコードを読んでみると、VIRTUAL_ENVという環境変数にそのディレクトリのパスを入れているということが分かる。また、元々プロンプトの左側に出ていた内容も、VIRTUAL_ENVのbasenameを表示していただけだった。

これらを参考にし、またpyenv version-nameを利用すれば、py:(pythonのversion):(venvの環境名)という文字列を作ることが出来る。

PYTHON_VERSION_STRING="py:"$(pyenv version-name)
PYTHON_VIRTUAL_ENV_STRING=""
if [ -n "$VIRTUAL_ENV" ]; then
    PYTHON_VIRTUAL_ENV_STRING=":`basename \"$VIRTUAL_ENV\"`"
fi

あとはこの変数を使ってPROMPTを設定すればOK。僕の場合は他にもperlのversionとかも出していたので、以下のようになった。

### ------------------ ###
# prompt config
precmd () {
    PERL_VERSION_STRING="pl:"$(plenv version-name)
    RUBY_VERSION_STRING="rb:"$(rbenv version-name)
    NODE_VERSION_STRING="nd:"$(ndenv version-name)
    PYTHON_VERSION_STRING="py:"$(pyenv version-name)
    PYTHON_VIRTUAL_ENV_STRING=""
    if [ -n "$VIRTUAL_ENV" ]; then
        PYTHON_VIRTUAL_ENV_STRING=":`basename \"$VIRTUAL_ENV\"`"
    fi
}

function setprompt () {
      PROMPT='%F{yellow}%<...<%~%<< %F{blue}${PERL_VERSION_STRING} ${RUBY_VERSION_STRING} ${NODE_VERSION_STRING} ${PYTHON_VERSION_STRING}${PYTHON_VIRTUAL_ENV_STRING}
%F{blue}%D{%H:%M:%S} %F{green}${USER}%F{white}@%F{green}%m%F{white}%(!.#.$) '
}

setprompt
unfunction setprompt

https://github.com/shibayu36/config-file/blob/master/.zsh/appearance.zsh#L145

まとめ

venvが自動でプロンプトに表示する内容があまりかっこよくなかったので、自分でプロンプト表示をカスタマイズしてみた。以上二つをやれば、最初にやりたかったことができた。