From 43d15b69e137363ccee2348aa32fcfaa072a2f43 Mon Sep 17 00:00:00 2001 From: Hongyi Zhao Date: Fri, 13 Mar 2020 16:43:35 +0800 Subject: [PATCH] Ensure that the eval command only executed once for one virutualenv: modified: completion/available/pip.completion.bash modified: completion/available/pip3.completion.bash --- completion/available/pip.completion.bash | 44 ++++++++++++++++++----- completion/available/pip3.completion.bash | 44 ++++++++++++++++++----- 2 files changed, 70 insertions(+), 18 deletions(-) diff --git a/completion/available/pip.completion.bash b/completion/available/pip.completion.bash index 31acfe8c..e73e9507 100644 --- a/completion/available/pip.completion.bash +++ b/completion/available/pip.completion.bash @@ -7,7 +7,36 @@ # you should first install pip for the corresponding environment. # Fix pip completion for running it within/outside of pyenv/virtualenv/venv/conda environment. -_regex="(^|;[ ]*)_pip_completion_hook([ ]*;|$)" + +#https://github.com/Bash-it/bash-it/blob/b35d41464c0bd390e573f7423eaaa63666521c70/themes/base.theme.bash#L511 +function safe_append_prompt_command { + local prompt_re + + if [ "${__bp_imported}" == "defined" ]; then + # We are using bash-preexec + if ! __check_precmd_conflict "${1}" ; then + precmd_functions+=("${1}") + fi + else + # Set OS dependent exact match regular expression + if [[ ${OSTYPE} == darwin* ]]; then + # macOS + prompt_re="[[:<:]]${1}[[:>:]]" + else + # Linux, FreeBSD, etc. + prompt_re="\<${1}\>" + fi + + if [[ ${PROMPT_COMMAND} =~ ${prompt_re} ]]; then + return + elif [[ -z ${PROMPT_COMMAND} ]]; then + PROMPT_COMMAND="${1}" + else + PROMPT_COMMAND="${1};${PROMPT_COMMAND}" + fi + fi +} + _pip_completion_hook() { local _pip @@ -21,17 +50,14 @@ _pip_completion_hook() { _pip=/usr/bin/pip fi if [ -n "$_pip" ]; then - eval "$($_pip completion --bash)" + if [ -z "$_pip_old" ] || [ "$_pip_old" != "$_pip" ]; then + eval "$($_pip completion --bash)" + export _pip_old=$_pip + fi fi unset _pip } +safe_append_prompt_command _pip_completion_hook -if [ -z "$PROMPT_COMMAND" ]; then - PROMPT_COMMAND=_pip_completion_hook -elif ! [[ "$PROMPT_COMMAND" =~ $_regex ]]; then - PROMPT_COMMAND="_pip_completion_hook;$PROMPT_COMMAND" -fi - -unset _regex diff --git a/completion/available/pip3.completion.bash b/completion/available/pip3.completion.bash index 6732bd8d..e7a46c72 100644 --- a/completion/available/pip3.completion.bash +++ b/completion/available/pip3.completion.bash @@ -7,7 +7,36 @@ # you should first install pip for the corresponding environment. # Fix pip completion for running it within/outside of pyenv/virtualenv/venv/conda environment. -_regex="(^|;[ ]*)_pip_completion_hook([ ]*;|$)" + +#https://github.com/Bash-it/bash-it/blob/b35d41464c0bd390e573f7423eaaa63666521c70/themes/base.theme.bash#L511 +function safe_append_prompt_command { + local prompt_re + + if [ "${__bp_imported}" == "defined" ]; then + # We are using bash-preexec + if ! __check_precmd_conflict "${1}" ; then + precmd_functions+=("${1}") + fi + else + # Set OS dependent exact match regular expression + if [[ ${OSTYPE} == darwin* ]]; then + # macOS + prompt_re="[[:<:]]${1}[[:>:]]" + else + # Linux, FreeBSD, etc. + prompt_re="\<${1}\>" + fi + + if [[ ${PROMPT_COMMAND} =~ ${prompt_re} ]]; then + return + elif [[ -z ${PROMPT_COMMAND} ]]; then + PROMPT_COMMAND="${1}" + else + PROMPT_COMMAND="${1};${PROMPT_COMMAND}" + fi + fi +} + _pip_completion_hook() { local _pip @@ -21,17 +50,14 @@ _pip_completion_hook() { _pip=/usr/bin/pip3 fi if [ -n "$_pip" ]; then - eval "$($_pip completion --bash)" + if [ -z "$_pip_old" ] || [ "$_pip_old" != "$_pip" ]; then + eval "$($_pip completion --bash)" + export _pip_old=$_pip + fi fi unset _pip } +safe_append_prompt_command _pip_completion_hook -if [ -z "$PROMPT_COMMAND" ]; then - PROMPT_COMMAND=_pip_completion_hook -elif ! [[ "$PROMPT_COMMAND" =~ $_regex ]]; then - PROMPT_COMMAND="_pip_completion_hook;$PROMPT_COMMAND" -fi - -unset _regex