mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2026-09-16 02:06:22 -04:00
The precmd hook is causing a significant overhead on every command executed in the shell. The shell hook does not need to be this strict however, it can also run only on directory changes, ensuring that the shell remains snappy while executing commands. Also contains a similar fix for fish. Fixes #259.
163 lines
3.1 KiB
Bash
Executable file
163 lines
3.1 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Summary: Configure the shell environment for pyenv-virtualenv
|
|
# Usage: eval "$(pyenv virtualenv-init - [<shell>])"
|
|
#
|
|
# Automatically activates a Python virtualenv environment based on current
|
|
# pyenv version.
|
|
#
|
|
|
|
set -e
|
|
[ -n "$PYENV_DEBUG" ] && set -x
|
|
|
|
resolve_link() {
|
|
$(type -p greadlink readlink | head -1) "$1"
|
|
}
|
|
|
|
abs_dirname() {
|
|
local cwd="$(pwd)"
|
|
local path="$1"
|
|
|
|
while [ -n "$path" ]; do
|
|
cd "${path%/*}"
|
|
local name="${path##*/}"
|
|
path="$(resolve_link "$name" || true)"
|
|
done
|
|
|
|
pwd
|
|
cd "$cwd"
|
|
}
|
|
|
|
PYENV_VIRTUALENV_INSTALL_PREFIX="$(dirname "$(abs_dirname "$0")")"
|
|
|
|
print=""
|
|
for args in "$@"
|
|
do
|
|
if [ "$args" = "-" ]; then
|
|
print=1
|
|
shift
|
|
fi
|
|
done
|
|
|
|
shell="${1:-$PYENV_SHELL}"
|
|
if [ -z "$shell" ]; then
|
|
shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
|
|
shell="${shell##-}"
|
|
shell="${shell%% *}"
|
|
shell="${shell:-$SHELL}"
|
|
shell="${shell##*/}"
|
|
shell="${shell%%-*}"
|
|
fi
|
|
|
|
if [ -z "$print" ]; then
|
|
case "$shell" in
|
|
bash )
|
|
profile='~/.bashrc'
|
|
;;
|
|
zsh )
|
|
profile='~/.zshrc'
|
|
;;
|
|
ksh )
|
|
profile='~/.profile'
|
|
;;
|
|
fish )
|
|
profile='~/.config/fish/config.fish'
|
|
;;
|
|
* )
|
|
profile='your profile'
|
|
;;
|
|
esac
|
|
|
|
{ echo "# Load pyenv-virtualenv automatically by adding"
|
|
echo "# the following to ${profile}:"
|
|
echo
|
|
case "$shell" in
|
|
fish )
|
|
echo 'status --is-interactive; and source (pyenv virtualenv-init -|psub)'
|
|
;;
|
|
* )
|
|
echo 'eval "$(pyenv virtualenv-init -)"'
|
|
;;
|
|
esac
|
|
echo
|
|
} >&2
|
|
|
|
exit 1
|
|
fi
|
|
|
|
case "$shell" in
|
|
fish )
|
|
cat <<EOS
|
|
while set index (contains -i -- "${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims" \$PATH)
|
|
set -eg PATH[\$index]; end; set -e index
|
|
set -gx PATH '${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims' \$PATH;
|
|
set -gx PYENV_VIRTUALENV_INIT 1;
|
|
EOS
|
|
;;
|
|
* )
|
|
cat <<EOS
|
|
export PATH="${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims:\${PATH}";
|
|
export PYENV_VIRTUALENV_INIT=1;
|
|
EOS
|
|
;;
|
|
esac
|
|
|
|
case "$shell" in
|
|
fish )
|
|
cat <<EOS
|
|
function _pyenv_virtualenv_hook --on-variable PWD;
|
|
set -l ret \$status
|
|
if [ -n "\$VIRTUAL_ENV" ]
|
|
pyenv activate --quiet; or pyenv deactivate --quiet; or true
|
|
else
|
|
pyenv activate --quiet; or true
|
|
end
|
|
return \$ret
|
|
end
|
|
EOS
|
|
;;
|
|
ksh )
|
|
cat <<EOS
|
|
function _pyenv_virtualenv_hook() {
|
|
EOS
|
|
;;
|
|
* )
|
|
cat <<EOS
|
|
_pyenv_virtualenv_hook() {
|
|
EOS
|
|
;;
|
|
esac
|
|
|
|
if [[ "$shell" != "fish" ]]; then
|
|
cat <<EOS
|
|
local ret=\$?
|
|
if [ -n "\${VIRTUAL_ENV-}" ]; then
|
|
eval "\$(pyenv sh-activate --quiet || pyenv sh-deactivate --quiet || true)" || true
|
|
else
|
|
eval "\$(pyenv sh-activate --quiet || true)" || true
|
|
fi
|
|
return \$ret
|
|
};
|
|
EOS
|
|
|
|
case "$shell" in
|
|
bash )
|
|
cat <<EOS
|
|
if ! [[ "\${PROMPT_COMMAND-}" =~ _pyenv_virtualenv_hook ]]; then
|
|
PROMPT_COMMAND="_pyenv_virtualenv_hook;\${PROMPT_COMMAND-}"
|
|
fi
|
|
EOS
|
|
;;
|
|
zsh )
|
|
cat <<EOS
|
|
typeset -g -a precwd_functions
|
|
if [[ -z \$precwd_functions[(r)_pyenv_virtualenv_hook] ]]; then
|
|
precwd_functions=(_pyenv_virtualenv_hook \$precwd_functions);
|
|
fi
|
|
EOS
|
|
;;
|
|
* )
|
|
# FIXME: what should i do here??
|
|
;;
|
|
esac
|
|
fi
|