simplify line-wrapping logic

This version seems to work correctly in the presence of all known
to me ZSH bugs and terminal variations. More testing is needed though.
This commit is contained in:
romkatv 2019-05-30 10:51:21 +02:00
parent 4dad2d81ff
commit 4def4452df

View file

@ -2315,22 +2315,6 @@ _p9k_init_timer() {
fi fi
} }
# Does ZSH have a certain off-by-one bug that triggers when PROMPT overflows to a new line?
#
# Bug: https://github.com/zsh-users/zsh/commit/d8d9fee137a5aa2cf9bf8314b06895bfc2a05518.
# ZSH_PATCHLEVEL=zsh-5.4.2-159-gd8d9fee13. Released in 5.5.
#
# Fix: https://github.com/zsh-users/zsh/commit/64d13738357c9b9c212adbe17f271716abbcf6ea.
# ZSH_PATCHLEVEL=zsh-5.7.1-50-g64d137383.
#
# Test: PROMPT="${(pl:$((COLUMNS))::-:)}<%1(l.%2(l.FAIL.PASS).FAIL)> " zsh -dfis <<<exit
# Workaround: PROMPT="${(pl:$((COLUMNS))::-:)}%{%G%}<%1(l.%2(l.FAIL.PASS).FAIL)> " zsh -dfis <<<exit
function _p9k_prompt_overflow_bug() {
[[ $ZSH_PATCHLEVEL =~ '^zsh-5\.4\.2-([0-9]+)-' ]] && return $(( match[1] < 159 ))
[[ $ZSH_PATCHLEVEL =~ '^zsh-5\.7\.1-([0-9]+)-' ]] && return $(( match[1] >= 50 ))
is-at-least 5.5 && ! is-at-least 5.7.2
}
# Some people write POWERLEVEL9K_DIR_PATH_SEPARATOR='\uNNNN' instead of # Some people write POWERLEVEL9K_DIR_PATH_SEPARATOR='\uNNNN' instead of
# POWERLEVEL9K_DIR_PATH_SEPARATOR=$'\uNNNN'. There is no good reason for it and if we were # POWERLEVEL9K_DIR_PATH_SEPARATOR=$'\uNNNN'. There is no good reason for it and if we were
# starting from scratch we wouldn't perform automatic conversion from the former to the latter. # starting from scratch we wouldn't perform automatic conversion from the former to the latter.
@ -2440,8 +2424,6 @@ _p9k_init() {
_p9k_init_timer _p9k_init_timer
fi fi
_p9k_prompt_overflow_bug && local glitch='%{%G%}' || local glitch=''
_P9K_ALIGNED_RPROMPT='${${:-${_P9K_X::=0}${_P9K_Y::=$((COLUMNS+1))}' _P9K_ALIGNED_RPROMPT='${${:-${_P9K_X::=0}${_P9K_Y::=$((COLUMNS+1))}'
repeat 10; do repeat 10; do
_P9K_ALIGNED_RPROMPT+='${_P9K_M::=$(((_P9K_X+_P9K_Y)/2))}' _P9K_ALIGNED_RPROMPT+='${_P9K_M::=$(((_P9K_X+_P9K_Y)/2))}'
@ -2458,8 +2440,8 @@ _p9k_init() {
repeat 32; do repeat 32; do
_P9K_ALIGNED_RPROMPT+='%-$_P9K_X(l. .)' _P9K_ALIGNED_RPROMPT+='%-$_P9K_X(l. .)'
done done
_P9K_ALIGNED_RPROMPT+=' $_P9K_RPROMPT${(pl.${${ZLE_RPROMPT_INDENT:-1}/#-*/0}.. .)}' _P9K_ALIGNED_RPROMPT+=' $_P9K_RPROMPT'
_P9K_ALIGNED_RPROMPT+=$glitch _P9K_ALIGNED_RPROMPT+=$'\n'
if [[ $POWERLEVEL9K_PROMPT_ADD_NEWLINE == true ]]; then if [[ $POWERLEVEL9K_PROMPT_ADD_NEWLINE == true ]]; then
repeat ${POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT:-1} _P9K_LEFT_PREFIX+=$'\n' repeat ${POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT:-1} _P9K_LEFT_PREFIX+=$'\n'
@ -2479,10 +2461,8 @@ _p9k_init() {
[[ $ruler_char == '.' ]] && local sep=',' || local sep='.' [[ $ruler_char == '.' ]] && local sep=',' || local sep='.'
local indent='${${ZLE_RPROMPT_INDENT:-1}/#-*/0}' local indent='${${ZLE_RPROMPT_INDENT:-1}/#-*/0}'
local ruler_len="\${\$((COLUMNS-$indent))/#-*/0}" local ruler_len="\${\$((COLUMNS-$indent))/#-*/0}"
local pad_len="\$((COLUMNS-$ruler_len))"
_P9K_LEFT_PREFIX+="%b\${(pl$sep$ruler_len$sep$sep${(q)ruler_char}$sep)}%k%f" _P9K_LEFT_PREFIX+="%b\${(pl$sep$ruler_len$sep$sep${(q)ruler_char}$sep)}%k%f"
_P9K_LEFT_PREFIX+="\${(l$sep$pad_len$sep$sep $sep)}" _P9K_LEFT_PREFIX+=$'\n'
_P9K_LEFT_PREFIX+=$glitch
else else
print -P "%F{red}WARNING!%f %BPOWERLEVEL9K_RULER_CHAR%b is not one character long. Ruler won't be rendered." print -P "%F{red}WARNING!%f %BPOWERLEVEL9K_RULER_CHAR%b is not one character long. Ruler won't be rendered."
print -P "Either change the value of %BPOWERLEVEL9K_RULER_CHAR%b or set %BPOWERLEVEL9K_SHOW_RULER=false%b to" print -P "Either change the value of %BPOWERLEVEL9K_RULER_CHAR%b or set %BPOWERLEVEL9K_SHOW_RULER=false%b to"