aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorRoman Perepelitsa <roman.perepelitsa@gmail.com>2024-01-20 12:30:56 +0300
committerRoman Perepelitsa <roman.perepelitsa@gmail.com>2024-01-20 12:30:56 +0300
commit8fefef228571c08ce8074d42304adec3b0876819 (patch)
tree96b6701bca9160ba4ed2572b70348afab9e58212 /internal
parentecf91710c0d628d054f0eff72a7f08d7a9285d26 (diff)
rewrite the handling of custom prompt in virtualenv (#2540)
Diffstat (limited to 'internal')
-rw-r--r--internal/p10k.zsh61
1 files changed, 36 insertions, 25 deletions
diff --git a/internal/p10k.zsh b/internal/p10k.zsh
index 26df0e1f..0b003853 100644
--- a/internal/p10k.zsh
+++ b/internal/p10k.zsh
@@ -4255,23 +4255,33 @@ function instant_prompt_chezmoi_shell() {
}
function _p9k_parse_virtualenv_cfg() {
- local cfg=$1
- echo $cfg
- typeset -g reply
- [[ -f $cfg && -r $cfg ]] || return
+ typeset -ga reply=(0)
+ [[ -f $1 && -r $1 ]] || return
- local -a lines
- lines=(${(f)"$(<$cfg)"}) || return
+ local cfg
+ cfg=$(<$1) || return
- local line prompt
local -a match mbegin mend
- for line in $lines; do
- if [[ $line =~ 'prompt = (.*)' ]]; then
- prompt=$match[1]
- eval "reply=$prompt"
- return
- fi
- done
+ [[ $'\n'$cfg$'\n' == (#b)*$'\n'prompt[$' \t']#=[$' \t']#([^$' \t']#)[$' \t']#$'\n'* ]] || return
+ local res=$match[1]
+ if [[ $res == (\"*\"|\'*\') ]]; then
+ # The string is quoted in python style, which isn't the same as quoting in zsh.
+ # For example, the literal 'foo"\'bar' denotes foo"'bar in python but in zsh
+ # it is malformed.
+ #
+ # We cheat a bit and impelement not exactly correct unquoting. It may produce
+ # different visual results but won't perform unintended expansions or bleed out
+ # any escape sequences.
+ #
+ # Note that venv performs unusual and obviously unintended expansions on the
+ # value of `prompt`: single-word expansions are performed twice by `activate`,
+ # and then again on every prompt if `prompt_subst` is in effect. While in general
+ # I am OK with being bug-compatible with other software, the bugs in venv are a
+ # bit too extreme for my comfort. I am going to disable all expansions and
+ # display the configured prompt literally.
+ res=${(Vg:e:)${res[2,-2]}}
+ fi
+ reply=(1 "$res")
}
################################################################
@@ -4283,20 +4293,21 @@ prompt_virtualenv() {
if (( _POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION )) && _p9k_python_version; then
msg="${_p9k__ret//\%/%%} "
fi
- local v=${VIRTUAL_ENV:t}
- if [[ $VIRTUAL_ENV_PROMPT == '('?*') ' && $VIRTUAL_ENV_PROMPT != "($v) " ]]; then
- v=$VIRTUAL_ENV_PROMPT[2,-3]
- elif [[ $v == $~_POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES ]]; then
- v=${VIRTUAL_ENV:h:t}
- fi
- local cfg="$VIRTUAL_ENV/pyvenv.cfg"
+ local cfg=$VIRTUAL_ENV/pyvenv.cfg
if ! _p9k_cache_stat_get $0 $cfg; then
local -a reply
_p9k_parse_virtualenv_cfg $cfg
- _p9k_cache_stat_set $reply
+ _p9k_cache_stat_set "${reply[@]}"
fi
- if [[ -n $_p9k__cache_val[1] ]]; then
- v=$_p9k__cache_val[1]
+ if (( _p9k__cache_val[1] )); then
+ local v=$_p9k__cache_val[2]
+ else
+ local v=${VIRTUAL_ENV:t}
+ if [[ $VIRTUAL_ENV_PROMPT == '('?*') ' && $VIRTUAL_ENV_PROMPT != "($v) " ]]; then
+ v=$VIRTUAL_ENV_PROMPT[2,-3]
+ elif [[ $v == $~_POWERLEVEL9K_VIRTUALENV_GENERIC_NAMES ]]; then
+ v=${VIRTUAL_ENV:h:t}
+ fi
fi
msg+="$_POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER${v//\%/%%}$_POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER"
case $_POWERLEVEL9K_VIRTUALENV_SHOW_WITH_PYENV in
@@ -9446,7 +9457,7 @@ if [[ $__p9k_dump_file != $__p9k_instant_prompt_dump_file && -n $__p9k_instant_p
zf_rm -f -- $__p9k_instant_prompt_dump_file{,.zwc} 2>/dev/null
fi
-typeset -g P9K_VERSION=1.19.13
+typeset -g P9K_VERSION=1.19.14
unset VSCODE_SHELL_INTEGRATION
_p9k_init_ssh