web-dev-qa-db-fra.com

Comment modifier l'invite virtualenv par défaut?

Comment modifiez-vous l'invite Virtualenvwrapper par défaut? Par défaut, travailler sur un environnement virtuel particulier avec une commande comme "workon <_name_of_env_>" ajoute le nom de virtualenv à votre invite. Cela peut mal fonctionner si vous n'utilisez pas d'invite de commandes par défaut.

42
kevin

Par défaut, lorsque vous basculez dans un virtualenv avec la commande "workon <name_of_env>", virtualenvwrapper ajoute une chaîne le long des lignes de "(<name_of_env>)" à votre invite de commande. Le problème est que j'ai défini mon invite Bash avec les lignes:

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

Ce qui donne une invite de commande dans le sens de:

< old_line >

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

Le passage à un nouvel environnement virtuel avec "workon <name_of_env>" a transformé l'invite de commande en quelque chose comme:

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

Ce qui était plus encombré que je ne le voulais et la mauvaise couleur pour démarrer. J'espérais quelque chose comme:

< old_line >

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

Ian Bicking a déjà souligné que les crochets de virtualenvwrapper étaient la solution mais j'ai pensé que je publierais mon code réel pour peut-être sauver quelqu'un d'autre une minute plus tard.

J'ai simplement modifié le fichier $ WORKON_HOME/postactivate pour inclure ces lignes:

# 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

et le tour est joué! La couleur et l'emplacement sont corrects et cela fonctionne même lorsque vous passez directement d'un environnement virtuel à un autre (ce à quoi je ne m'attendais pas).

8
kevin

Si vous travaillez sur une PS1 personnalisée (comme j'ai découvert ce problème), je vous recommande de désactiver la modification rapide, utilisez export VIRTUAL_ENV_DISABLE_Prompt=1 (voir virtualenv docs ), et créez votre propre invite virtualenv afin de l'ajouter à votre PS1.

Voir cet extrait que j'ai utilisé:

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

Je pense que ce qui suit est la solution la plus simple:

Ajouter à ~/.virtualenvs/postactivate le suivant:

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

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

8
Dror

J'ai adopté la solution de @ ivanalejandro en amincissant un peu la fonction:

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

Ou si vous vous sentez vraiment hacky:

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

On pourrait réduire la fonction dans solution de @ ivanalejandro en utilisant une extension de paramètre "valeur alternative". En outre, comme l'a commenté @ crimson-egret, l'appel peut être directement dans PS1 sans l'intermédiaire VENV:

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) ..."
2
TomB