diff --git a/modules/python/README.md b/modules/python/README.md index 8e8c8f0..afffc5e 100644 --- a/modules/python/README.md +++ b/modules/python/README.md @@ -61,6 +61,29 @@ system site-packages directory. export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' +### Settings + +#### Lazy loading + +By default, virtualenvwrapper is loaded in lazy mode. This behaviour can be disabled adding the following line to *~/.zpreztorc*: + + zstyle ':prezto:module:python' lazy_venv 'no' + +#### Automatic virtualenv initialization + +To enable autoenv, add the following line to *~/.zpreztorc*: + + zstyle ':prezto:module:python' autoenv 'yes' + +If a virtualenv is active, and was not activated by autoenv, then autoenv does nothing. +Otherwise, autoenv activated or deactivates a virtual environment whenever a directory is changed; based on the following priority: + + 1. Name specified in a file named *.venv* in the cwd. + 2. *.venv* file in git root. If folder is inside git repository. + 3. Name of git root folder. + 4. No virtualenv. + + Aliases ------- diff --git a/modules/python/init.zsh b/modules/python/init.zsh index fa9175e..2eb23ac 100644 --- a/modules/python/init.zsh +++ b/modules/python/init.zsh @@ -31,17 +31,66 @@ if (( ! $+commands[python] && ! $+commands[pyenv] )); then return 1 fi +local venv_script=virtualenvwrapper +if zstyle -T ':prezto:module:python' lazy_venv; then + venv_script+=_lazy +fi + # Load virtualenvwrapper into the shell session. -if (( $+commands[virtualenvwrapper_lazy.sh] )); then +if (( $+commands[$venv_script.sh] )); then # Set the directory where virtual environments are stored. export WORKON_HOME="$HOME/.virtualenvs" # Disable the virtualenv prompt. VIRTUAL_ENV_DISABLE_PROMPT=1 - source "$commands[virtualenvwrapper_lazy.sh]" + source "$commands[$venv_script.sh]" fi +function autoenv { + #Don't run in shell scripts etc. + if [[ $ZSH_SUBSHELL -ne 0 ]]; then + return + fi + + #Don't run if currently in virtual env not set by autoenv + if (( ($+VIRTUAL_ENV) && !($+AUTOENV) )); then + return + fi + + local name="" + if [[ -f .venv ]]; then + #.venv file in current dir gets highest priority + name=$(<.venv) + elif is-true "$(git rev-parse --is-inside-work-tree 2> /dev/null)"; then + local gitroot="$(git rev-parse --show-toplevel 2> /dev/null)" + if [ -f "$gitroot/.venv" ]; then + #If there is a .venv file in gitroot + name=$(<$gitroot/.venv) + else + #Else use the name of the folder as venv name + name=$gitroot:t + fi + fi + + + local venv_name="$VIRTUAL_ENV:t" + if [[ $name != $venv_name ]]; then + if [[ -z $name ]]; then + deactivate && unset AUTOENV + return + fi + + if [[ -d "$WORKON_HOME/$name" ]]; then + workon $name && export AUTOENV=1 + return + fi + fi +} + +if zstyle -T ':prezto:module:python' autoenv; then + add-zsh-hook chpwd autoenv +fi # # Aliases #