Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Automatic virtualenv activation and deactivation, virtualenv non lazy mode. #517

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 23 additions & 0 deletions modules/python/README.md
Expand Up @@ -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
-------

Expand Down
53 changes: 51 additions & 2 deletions modules/python/init.zsh
Expand Up @@ -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
#
Expand Down