如何更改默认的Virtualenvwrapper提示?默认情况下,使用类似“workon< _name_of_env_>”的命令处理特定虚拟环境在您的提示符前面加上virtualenv的名称。如果您没有使用默认命令提示符,这可能效果不佳。
答案 0 :(得分:62)
如果您正在使用自定义PS1(我在发现此问题时),建议您禁用提示更改,使用export VIRTUAL_ENV_DISABLE_PROMPT=1
(请参阅virtualenv docs),并制作您自己的virtualenv提示为了添加到你的PS1。
请参阅我使用过的代码段:
function virtualenv_info(){
# Get Virtual Env
if [[ -n "$VIRTUAL_ENV" ]]; then
# Strip out the path and just leave the env name
venv="${VIRTUAL_ENV##*/}"
else
# In case you don't have one activated
venv=''
fi
[[ -n "$venv" ]] && echo "(venv:$venv) "
}
# disable the default virtualenv prompt change
export VIRTUAL_ENV_DISABLE_PROMPT=1
VENV="\$(virtualenv_info)";
# the '...' are for irrelevant info here.
export PS1="... ${VENV} ..."
答案 1 :(得分:8)
默认情况下,当您使用命令“workon< name_of_env>”切换到virtualenv时,virtualenvwrapper会在您的命令提示符前面添加一行“(< name_of_env>)”。问题是我用以下行设置了Bash提示符:
PROMPT_COLOR1='0;36m'
PROMPT_COLOR2='1;34m'
PS1='\n\[\033[$PROMPT_COLOR1\](\t)\[\033[$PROMPT_COLOR2\] \u @ \w \n\[\033[$PROMPT_COLOR1\]$ \[\033[0;39m\]'
这产生了一个命令提示符:
< old_line >
(19:11:05) kevin @ ~/research
$
使用“workon&lt; name_of_env&gt;”切换到新的虚拟环境将命令提示符改为:
< old_line >
(< name_of_env >)
(19:11:05) kevin @ ~/research
$
哪个比我想要的更混乱,并且引导的颜色错误。我希望有类似的东西:
< old_line >
(< name_of_env >) (19:11:05) kevin @ ~/research
$
Ian Bicking先前已经指出virtualenvwrapper's hooks were the solution但我想我会发布我的实际代码,以便在一分钟之后拯救其他人。
我只是编辑了$ WORKON_HOME / postactivate文件以包含这些行:
# color virtualenv name properly and put it after the \n if there is one at the start of the prompt
if [ ${_OLD_VIRTUAL_PS1:0:2} == '\n' ]; then
PS1="\n\[\033[$PROMPT_COLOR1\](`basename \"$VIRTUAL_ENV\"`) ${_OLD_VIRTUAL_PS1:2:${#_OLD_VIRTUAL_PS1}}"
else
PS1="\[\033[$PROMPT_COLOR1\](`basename \"$VIRTUAL_ENV\"`) $_OLD_VIRTUAL_PS1 "
fi
瞧,瞧!颜色和位置是正确的,甚至可以直接从一个虚拟环境切换到另一个虚拟环境(我没想到)。
答案 2 :(得分:8)
我认为以下是最简单的解决方案:
添加到~/.virtualenvs/postactivate
以下内容:
PS1="\[\e[1;33;45m\] (`basename \"$VIRTUAL_ENV\"`) \[\e[0m\]$_OLD_VIRTUAL_PS1"
取自:http://wiki.hackzine.org/development/python/virtualenv.html
答案 3 :(得分:3)
我通过减少函数来采用@ivanalejandro0's solution:
function virtualenv_info {
# Get Virtual Env
if [[ -n "$VIRTUAL_ENV" ]]; then
# Strip out the path and just leave the env name
echo "(venv:${VIRTUAL_ENV##*/})"
fi
或者,如果你感觉真的很讨厌:
function virtualenv_info {
[[ -n "$VIRTUAL_ENV" ]] && echo "(venv:${VIRTUAL_ENV##*/})"
}
答案 4 :(得分:1)
可以通过使用“备用值”参数扩展来缩小@ivanalejandro0's solution中的功能。另外,正如@ crimson-egret所评论的,该呼叫可以在没有VENV中间件的情况下直接在PS1中进行:
function __virtualenv_ps1 {
echo "${VIRTUAL_ENV:+(venv:${VIRTUAL_ENV##*/})}"
}
# disable the default virtualenv prompt change
export VIRTUAL_ENV_DISABLE_PROMPT=1
# the '...' are for irrelevant info here.
export PS1="... \$(__virtualenv_ps1) ..."