¿Cómo cambio el indicador virtualenv predeterminado?

¿Cómo cambias el indicador de Virtualenvwrapper predeterminado? De forma predeterminada, trabajar en un entorno virtual en particular con un comando como “workon ” antepunta el nombre de virtualenv a su solicitud. Esto puede funcionar mal si no está utilizando un indicador de comando predeterminado.

Si está trabajando en una PS1 personalizada (como descubrí este problema), le recomiendo que deshabilite el cambio de solicitud, use export VIRTUAL_ENV_DISABLE_PROMPT=1 (ver documentos de virtualenv ) y haga su propia solicitud de virtualenv para agregar a su PS1 .

Mira este fragmento que he usado:

 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} ..." 

De forma predeterminada, cuando cambia a un virtualenv con el comando “workon “, virtualenvwrapper antepone una cadena a lo largo de las líneas de “()” a su símbolo del sistema. El problema es que configuro mi indicador de Bash con las líneas:

 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\]' 

Lo que produce un símbolo del sistema a lo largo de las líneas de:

 < old_line > (19:11:05) kevin @ ~/research $ 

El cambio a un nuevo entorno virtual con “workon ” convirtió el símbolo del sistema en algo como:

 < old_line > (< name_of_env >) (19:11:05) kevin @ ~/research $ 

Que estaba más desordenado de lo que quería y el color equivocado para arrancar. Esperaba algo como:

 < old_line > (< name_of_env >) (19:11:05) kevin @ ~/research $ 

Ian Bicking ha señalado anteriormente que los ganchos de virtualenvwrapper eran la solución, pero pensé que publicaría mi código real para salvar a otra persona un minuto más tarde.

Simplemente edité el archivo $ WORKON_HOME / postactivate para incluir estas líneas:

 # 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 

¡y voilá! El color y la ubicación son correctos e incluso funcionan cuando se cambia directamente de un entorno virtual a otro (lo cual no esperaba).

Creo que la siguiente es la solución más simple:

Agregue a ~/.virtualenvs/postactivate lo siguiente:

 PS1="\[\e[1;33;45m\] (`basename \"$VIRTUAL_ENV\"`) \[\e[0m\]$_OLD_VIRTUAL_PS1" 

Tomado de: http://wiki.hackzine.org/development/python/virtualenv.html

Adopté la solución de @ ivanalejandro0 reduciendo un poco la función:

 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 

O si te sientes realmente hacky:

 function virtualenv_info { [[ -n "$VIRTUAL_ENV" ]] && echo "(venv:${VIRTUAL_ENV##*/})" }