在 PS1 上方添加一个换行符,该换行符在前置后仍然存在

在 PS1 上方添加一个换行符,该换行符在前置后仍然存在

在 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://github.com/pyenv/pyenv-virtualenv/blob/c85c1c9ed520d28cbb34e10e1fe82c6ee37130bc/bin/pyenv-sh-activate#L244

也颇为有趣。您可以找到很多围绕此变量的问题/讨论以及提示修改的“弃用”。例如https://stackoverflow.com/questions/74611317/enable-pyenv-virtualenv-prompt-at-terminal

此弃用最近已被删除,并且 pyenv 计划保留提示符修改(包括通过这种方式禁用它)。看https://github.com/pyenv/pyenv-virtualenv/commit/77a7644ff7a7a624ba4dfebe5c7441a57be3cc48

PS:假设$()ksh 中的工作方式与 bash 中的工作方式相同,添加tputas 命令而不是它的输出可能对 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(我在问题中错误输入了双引号)。

相关内容