如何在仍具有自定义 PROMPT_COMMAND 的情况下显示 pipenv 工作区?
How do I display the pipenv workspace while still having a custom PROMPT_COMMAND?
默认情况下,当我输入 pipenv shell 时,提示的开头指示我正在工作的工作区。
user@user-dsktp:~/main$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
user@user-dsktp:~/main$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate
(main-GqtUWnwk) user@user-dsktp:~/main$
但是,如果我自定义提示(显示 git 信息):
PROMPT_COMMAND='__git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]" "\n\$ "'
我丢失了工作区信息:
user@user-dsktp:~/main (develop=)
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
user@user-dsktp:~/main (develop=)
$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate
user@user-dsktp:~/main (develop=)
$
有谁知道如何取回它?非常感谢任何帮助。
activate
脚本大致相当于
PS1="$(basename "$VIRTUAL_ENV") $PS1"
将虚拟环境添加到提示中。您可以简单地添加相同的
命令替换为您自己的提示定义。
您的 PROMPT_COMMAND
很可能会覆盖 activate
对提示所做的任何操作,但是为了避免任何令人讨厌的意外,您可以将 VIRTUAL_ENV_DISABLE_PROMPT
设置为任何非空字符串以防止 activate
从根本上触摸您的提示。
If set, the value is interpreted as a command to execute before the printing of each primary prompt ($PS1
).
在你的例子中,你 运行 函数 __git_ps1
在 $PS1
打印之前带有参数 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\W\[3[00m\]" "\n\$ "
。
什么是__git_ps1
?这取决于您的环境(它不是标准的 Bash 函数),但它是一个生成 PS1 和 Git 信息的帮助函数。你可以看看它是什么
$ type __git_ps1
如果您查看源代码,您可能会发现 __git_ps1
覆盖 默认值 PS1。这就是未显示虚拟环境名称的原因。正如@chepner 提到的,虚拟环境的名称通过修改 PS1
的 activate
脚本显示。但是,__git_ps1
会覆盖该更改。
一劳永逸地解决它的方法是学习一些 Bash,并尝试制作更好的 PROMPT_COMMAND
:) 或者你可以改用这个
export PROMPT_COMMAND='
__PS1_SUFFIX="\$ "
if [[ -n "$VIRTUAL_ENV" ]]; then
__PS1_SUFFIX="($(basename "$VIRTUAL_ENV")) $__PS1_SUFFIX"
fi
__git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]" "\n$__PS1_SUFFIX"
'
此代码段检查是否设置了 VIRTUAL_ENV
(如果由 virtualenv 设置,这将指向虚拟环境的根目录),并将其名称添加到提示符的第二行(在 $
之前) .现在这不是最好的方法,因为目录名称并不总是与提示匹配,但它现在应该适合您。如果您发现此代码段不足以满足您的用例,您可以自行决定是否深入此 Bash 脚本深渊。
默认情况下,当我输入 pipenv shell 时,提示的开头指示我正在工作的工作区。
user@user-dsktp:~/main$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
user@user-dsktp:~/main$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate
(main-GqtUWnwk) user@user-dsktp:~/main$
但是,如果我自定义提示(显示 git 信息):
PROMPT_COMMAND='__git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]" "\n\$ "'
我丢失了工作区信息:
user@user-dsktp:~/main (develop=)
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
user@user-dsktp:~/main (develop=)
$ . /home/user/.local/share/virtualenvs/main-GqtUWnwk/bin/activate
user@user-dsktp:~/main (develop=)
$
有谁知道如何取回它?非常感谢任何帮助。
activate
脚本大致相当于
PS1="$(basename "$VIRTUAL_ENV") $PS1"
将虚拟环境添加到提示中。您可以简单地添加相同的 命令替换为您自己的提示定义。
您的 PROMPT_COMMAND
很可能会覆盖 activate
对提示所做的任何操作,但是为了避免任何令人讨厌的意外,您可以将 VIRTUAL_ENV_DISABLE_PROMPT
设置为任何非空字符串以防止 activate
从根本上触摸您的提示。
If set, the value is interpreted as a command to execute before the printing of each primary prompt (
$PS1
).
在你的例子中,你 运行 函数 __git_ps1
在 $PS1
打印之前带有参数 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\W\[3[00m\]" "\n\$ "
。
什么是__git_ps1
?这取决于您的环境(它不是标准的 Bash 函数),但它是一个生成 PS1 和 Git 信息的帮助函数。你可以看看它是什么
$ type __git_ps1
如果您查看源代码,您可能会发现 __git_ps1
覆盖 默认值 PS1。这就是未显示虚拟环境名称的原因。正如@chepner 提到的,虚拟环境的名称通过修改 PS1
的 activate
脚本显示。但是,__git_ps1
会覆盖该更改。
一劳永逸地解决它的方法是学习一些 Bash,并尝试制作更好的 PROMPT_COMMAND
:) 或者你可以改用这个
export PROMPT_COMMAND='
__PS1_SUFFIX="\$ "
if [[ -n "$VIRTUAL_ENV" ]]; then
__PS1_SUFFIX="($(basename "$VIRTUAL_ENV")) $__PS1_SUFFIX"
fi
__git_ps1 "\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[3[01;32m\]\u@\h\[3[00m\]:\[3[01;34m\]\w\[3[00m\]" "\n$__PS1_SUFFIX"
'
此代码段检查是否设置了 VIRTUAL_ENV
(如果由 virtualenv 设置,这将指向虚拟环境的根目录),并将其名称添加到提示符的第二行(在 $
之前) .现在这不是最好的方法,因为目录名称并不总是与提示匹配,但它现在应该适合您。如果您发现此代码段不足以满足您的用例,您可以自行决定是否深入此 Bash 脚本深渊。