Configurar El Prompt en Zshell Para Trabajar Con Python

Configurar el prompt de zsh

Queremos modificar el prompt para que además de mostrar el entorno virtual de python (cuando haya uno activo) muestre también la versión de Python que usa ese venv

Para añadir la info de git a mi prompt de zsh ya estoy usando el paquete zsh git prompt

Deshabilitar el prompt generado por pyenv

En primer lugar, como tenemos instalado pyenv necesitamos inhibir el comportamiento por defecto de pyenv que muestra el nombre del entorno virtual en el prompt. Para ello, en el fichero ~/.zshrc añadimos las siguientes lineas antes de la activación de pyenv:

1
2
3
# disable prompt modification by pyenv
# I'm using virtualenv plugin for prompt customization
export PYENV_VIRTUALENV_DISABLE_PROMPT=1

Generamos una función que nos devuelva el venv y la versión de python.

Podemos instalar el plugin de zsh: virtualenv que sirve justamente para instalar una función que devuelve el virtualenv para usarlo en el prompt de zsh. El plugin dejará la función en el directorio de antigen:

antigen/bundles/robbyrussell/oh-my-zsh/plugins/virtualenv/virtualenv.plugin.zsh

Yo he instalado el plugin y modificado la función, también puedes usar la función directamente sin instalar el plugin.pero como de todas formas la tenemos que cambiar pongo aquí el texto completo de la función, ya modificada para añadir la versión de Python. Mi función modificada:

1
2
3
4
5
6
7
8
function virtualenv_prompt_info(){
  [[ -n ${VIRTUAL_ENV}  || "system" != `pyenv version-name` ]] || return
  [[ -n ${VIRTUAL_ENV} ]] || VIRTUAL_ENV="pyenv-`pyenv version-name`"
  echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV:t:gs/%/%%} - ${$(python -V)#* }${ZSH_THEME_VIRTUALENV_SUFFIX=]}"
}

# disables prompt mangling in virtual_env/bin/activate
export VIRTUAL_ENV_DISABLE_PROMPT=1

Editamos el prompt en nuestro tema de zsh favorito

Yo estoy usando el tema gnzh, pero viene a ser lo mismo en cualquier tema. En mi fichero del tema el prompt queda configurado con las siguientes lineas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
local return_code="%(?..%F{red}%? ↵%f)"

local user_host="${PR_USER}%F{cyan}@${PR_HOST}"
local current_dir="%B%F{blue}%~%f%b"
local git_branch='$(git_super_status)'
local venv_prompt='$(virtualenv_prompt_info)'

PROMPT="╭─${user_host} ${current_dir} $(ruby_prompt_info) ${venv_prompt} ${git_branch}
╰─$PR_PROMPT "
RPROMPT="${return_code}"

ZSH_THEME_GIT_PROMPT_PREFIX="‹"
ZSH_THEME_GIT_PROMPT_SUFFIX="› %f"
ZSH_THEME_RUBY_PROMPT_PREFIX="%F{red}‹"
ZSH_THEME_RUBY_PROMPT_SUFFIX="›%f"
ZSH_THEME_VIRTUALENV_PREFIX="%F{red}("
ZSH_THEME_VIRTUALENV_SUFFIX=")%f "

git_super_status

Esta función está definida en el paquete zsh-git-prompt y se encarga de añadir a nuestro prompt la información del repositorio de git (si es que nuestro directorio de trabajo pertenece a un repo de git, claro)

También he modificado esta función para que no muestre nada en el caso de que no estemos en un directorio controlado por git, he modificado la linea echo "$STATUS"del fichero zshrc.sh de zsh-git-prompt:

1
2
3
4
5
6
7
# echo "$STATUS"
if [[ "$__CURRENT_GIT_STATUS" == ": 0 0 0 0 0 0" ]]
then
    echo ""
else
	echo "$STATUS"
fi

En resumen

Con estos cambios mi prompt de zsh:

  • No muestra nada si no tenemos un venv activo o estamos usando el python del sistema
  • Nos muestra cualquier Python diferente de system que esté activado via pyenv
  • En el caso de que activemos un venv especifico, por ejemplo un venv de Poetry nos muestra ese venv en el prompt
0%