在 OBSD ksh 中,我有一个 PS1,它前面有一个空行:
PS1="\n[\u@\h] \w\n\$"
问题在于,当激活虚拟环境时, pyenv 会在虚拟环境的名称前面加上该名称。这是 pyenv 激活脚本的相关部分:
PS1="(porcupine) ${PS1:-}"
这会吃掉空行,转动
[myusername@myhostname] ~/some/path $ echo foo
foo
[myusername@myhostname] ~/some/path $
进入
(virtual-environment-name)
[myusername@myhostname] ~/some/path $ echo foo
foo
(virtual-environment-name)
[myusername@myhostname] ~/some/path $
这很烦人,所以我尝试用 tput 修复它:
PS1_TEXT="[\u@\h] \w\n\$ "
PS1="$(tput sc il1 nw)$(tput rc DO 1)\n$PS1_TEXT"
这会将光标移动到虚拟环境名称上方的行,使其成为空行,然后返回并停留在我原来的 PS1 中。
这几乎可以工作,但是当我点击终端窗口的底部时,虚拟环境名称消失了。这又很烦人。
答案1
假设我检查了正确的 pyenv 源,我建议设置PYENV_VIRTUALENV_DISABLE_PROMPT=1
然后构建您自己的自定义,PS1
而不受 pyenv 的干扰。
激活的环境应该可用PYENV_VIRTUAL_ENV
(或者您使用 来检查激活后设置的内容env
)。
也颇为有趣。您可以找到很多围绕此变量的问题/讨论以及提示修改的“弃用”。例如https://stackoverflow.com/questions/74611317/enable-pyenv-virtualenv-prompt-at-terminal
此弃用最近已被删除,并且 pyenv 计划保留提示符修改(包括通过这种方式禁用它)。看https://github.com/pyenv/pyenv-virtualenv/commit/77a7644ff7a7a624ba4dfebe5c7441a57be3cc48。
PS:假设$()
ksh 中的工作方式与 bash 中的工作方式相同,添加tput
as 命令而不是它的输出可能对 shell 性能产生不必要的影响。
答案2
谢谢。对于后代,OBSD ksh 的详细信息位于 .kshrc 中:
VIRTUAL_ENV_DISABLE_PROMPT=1
function prompt_command {
if [[ -n ${VIRTUAL_ENV} ]]; then
print -r "(${VIRTUAL_ENV##*/})"
fi
print -n "[\u@\h] \w\n\$ "
}
PS1='\n$(prompt_command)'
请注意环境变量VIRTUAL_ENV_DISABLE_PROMPT
以及运行时使用单引号prompt_command
(我在问题中错误输入了双引号)。