diff --git a/README.md b/README.md index add2eefc..b821d602 100644 --- a/README.md +++ b/README.md @@ -208,28 +208,18 @@ easy to fork and contribute any changes back upstream. pyenv repo is cloned and add `$PYENV_ROOT/bin` to your `$PATH` for access to the `pyenv` command-line utility. - - For **bash**: + - For **bash**/**Zsh**: ~~~ bash - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile - echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile - ~~~ - - - For **Ubuntu Desktop**: - ~~~ bash - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc - echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc - ~~~ - - - For **Zsh**: - ~~~ zsh - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc - echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile + echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile + echo 'eval "$(pyenv init --path)"' >> ~/.profile ~~~ - For **Fish shell**: ~~~ fish set -Ux PYENV_ROOT $HOME/.pyenv set -Ux fish_user_paths $PYENV_ROOT/bin $fish_user_paths + pyenv init --path | source ~~~ - **Proxy note**: If you use a proxy, export `http_proxy` and `https_proxy` too. @@ -239,11 +229,6 @@ easy to fork and contribute any changes back upstream. configuration file since it manipulates `PATH` during the initialization. - For **bash**: - ~~~ bash - echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile - ~~~ - - - For **Ubuntu Desktop** and **Fedora**: ~~~ bash echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc ~~~ diff --git a/libexec/pyenv-init b/libexec/pyenv-init index 7240b4c8..0f06c706 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Summary: Configure the shell environment for pyenv -# Usage: eval "$(pyenv init - [--no-rehash] [])" +# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [])" set -e [ -n "$PYENV_DEBUG" ] && set -x @@ -8,6 +8,7 @@ set -e # Provide pyenv completions if [ "$1" = "--complete" ]; then echo - + echo --path echo --no-rehash echo bash echo fish @@ -16,15 +17,20 @@ if [ "$1" = "--complete" ]; then exit fi -print="" +mode="help" no_rehash="" for args in "$@" do if [ "$args" = "-" ]; then - print=1 + mode="print" shift fi + if [ "$args" = "--path" ]; then + mode="path" + shift + fi + if [ "$args" = "--no-rehash" ]; then no_rehash=1 shift @@ -43,14 +49,33 @@ fi root="${0%/*}/.." -if [ -z "$print" ]; then +function main() { + case "$mode" in + "help") + help_ + exit 1 + ;; + "path") + print_path + exit 0 + ;; + "print") + init_dirs + warn_path + print_env + print_completion + print_shell_function + exit 0 + ;; + esac + # should never get here + exit 2 +} + +function help_() { case "$shell" in bash ) - if [ -f "${HOME}/.bashrc" ] && [ ! -f "${HOME}/.bash_profile" ]; then - profile='~/.bashrc' - else - profile='~/.bash_profile' - fi + profile='~/.bashrc' ;; zsh ) profile='~/.zshrc' @@ -78,37 +103,73 @@ if [ -z "$print" ]; then ;; esac echo + echo "# And the following to ~/.profile:" + echo + case "$shell" in + fish ) + echo 'pyenv init --path | source' + ;; + * ) + echo 'eval "$(pyenv init --path)"' + ;; + esac + echo + echo '# Make sure to restart your entire logon session' + echo '# for changes to ~/.profile to take effect.' + echo } >&2 +} - exit 1 -fi +function init_dirs() { + mkdir -p "${PYENV_ROOT}/"{shims,versions} +} -mkdir -p "${PYENV_ROOT}/"{shims,versions} +function print_path() { + # Need to use the login shell rather than the current one + case "$shell" in + fish ) + echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" + ;; + * ) + echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' + ;; + esac +} -case "$shell" in -fish ) - echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" - echo "set -gx PYENV_SHELL $shell" -;; -* ) - echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' - echo "export PYENV_SHELL=$shell" -;; -esac +function warn_path() { + if ! perl -ls0x3A -e 'while (<>) { chomp; ($_ eq $d) && exit 0; } exit 1' -- -d="${PYENV_ROOT}/shims" <<<"$PATH" ; then + echo 'echo '\''WARNING: `pyenv init -` no longer sets PATH.'\' + echo 'echo '\''Run `pyenv init` to see the necessary changes to make to your configuration.'\' + fi +} -completion="${root}/completions/pyenv.${shell}" -if [ -r "$completion" ]; then - echo "source '$completion'" -fi +function print_env() { + case "$shell" in + fish ) + echo "set -gx PYENV_SHELL $shell" + ;; + * ) + echo "export PYENV_SHELL=$shell" + ;; + esac +} -if [ -z "$no_rehash" ]; then - echo 'command pyenv rehash 2>/dev/null' -fi +function print_completion() { + completion="${root}/completions/pyenv.${shell}" + if [ -r "$completion" ]; then + echo "source '$completion'" + fi -commands=(`pyenv-commands --sh`) -case "$shell" in -fish ) - cat </dev/null' + fi +} + +function print_shell_function() { + commands=(`pyenv-commands --sh`) + case "$shell" in + fish ) + cat <