speed up prompt scaffolding

This commit is contained in:
romkatv 2019-03-13 18:52:22 +01:00
parent ef1f958f2c
commit 630ca49cf4
1 changed files with 44 additions and 40 deletions

View File

@ -1964,52 +1964,24 @@ typeset -gF _P9K_TIMER_START
powerlevel9k_preexec() { _P9K_TIMER_START=$EPOCHREALTIME }
typeset -g _P9K_PROMPT
typeset -g _P9K_LEFT_PREFIX
typeset -g _P9K_LEFT_SUFFIX
typeset -g _P9K_RIGHT_PREFIX
typeset -g _P9K_RIGHT_SUFFIX
set_default POWERLEVEL9K_DISABLE_RPROMPT false
typeset -fH _p9k_set_prompt() {
_P9K_PROMPT=''
build_left_prompt
local left=$_P9K_PROMPT
_P9K_PROMPT=''
build_right_prompt
local right=$_P9K_PROMPT
PROMPT=$_P9K_LEFT_PREFIX$_P9K_PROMPT$_P9K_LEFT_SUFFIX
local NEWLINE=$'\n'
local RPROMPT_SUFFIX RPROMPT_PREFIX
if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then
_p9k_get_icon MULTILINE_FIRST_PROMPT_PREFIX
PROMPT="$_P9K_RETVAL%f%b%k$left$NEWLINE"
_p9k_get_icon MULTILINE_LAST_PROMPT_PREFIX
PROMPT+=$_P9K_RETVAL
if [[ "$POWERLEVEL9K_RPROMPT_ON_NEWLINE" != true ]]; then
# The right prompt should be on the same line as the first line of the left
# prompt. To do so, there is just a quite ugly workaround: Before zsh draws
# the RPROMPT, we advise it, to go one line up. At the end of RPROMPT, we
# advise it to go one line down. See:
# http://superuser.com/questions/357107/zsh-right-justify-in-ps1
local LC_ALL="" LC_CTYPE="en_US.UTF-8" # Set the right locale to protect special characters
RPROMPT_PREFIX='%{'$'\e[1A''%}' # one line up
RPROMPT_SUFFIX='%{'$'\e[1B''%}' # one line down
else
RPROMPT_PREFIX=''
RPROMPT_SUFFIX=''
fi
if [[ $POWERLEVEL9K_DISABLE_RPROMPT == true ]]; then
RPROMPT=''
else
PROMPT="%f%b%k$left"
RPROMPT_PREFIX=''
RPROMPT_SUFFIX=''
_P9K_PROMPT=''
build_right_prompt
RPROMPT=$_P9K_RIGHT_PREFIX$_P9K_PROMPT$_P9K_RIGHT_SUFFIX
fi
if [[ "$POWERLEVEL9K_DISABLE_RPROMPT" != true ]]; then
RPROMPT="${RPROMPT_PREFIX}%f%b%k$right%{$reset_color%}${RPROMPT_SUFFIX}"
fi
if [[ $POWERLEVEL9K_PROMPT_ADD_NEWLINE == true ]]; then
local NEWLINES=""
repeat ${POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT:-1} { NEWLINES+=$NEWLINE }
PROMPT="$NEWLINES$PROMPT"
fi
# Allow iTerm integration to work
[[ $ITERM_SHELL_INTEGRATION_INSTALLED == "Yes" ]] && PROMPT="%{$(iterm2_prompt_mark)%}$PROMPT"
}
typeset -g _P9K_REFRESH_REASON
@ -2135,6 +2107,38 @@ _p9k_init() {
fi
done
local RPROMPT_SUFFIX RPROMPT_PREFIX
if [[ $POWERLEVEL9K_PROMPT_ON_NEWLINE == true ]]; then
_p9k_get_icon MULTILINE_FIRST_PROMPT_PREFIX
_P9K_LEFT_PREFIX="$_P9K_RETVAL%f%b%k"
#PROMPT="$_P9K_RETVAL%f%b%k$left$NEWLINE"
_p9k_get_icon MULTILINE_LAST_PROMPT_PREFIX
_P9K_LEFT_SUFFIX=$'\n'$_P9K_RETVAL
if [[ $POWERLEVEL9K_RPROMPT_ON_NEWLINE != true ]]; then
# The right prompt should be on the same line as the first line of the left
# prompt. To do so, there is just a quite ugly workaround: Before zsh draws
# the RPROMPT, we advise it, to go one line up. At the end of RPROMPT, we
# advise it to go one line down. See:
# http://superuser.com/questions/357107/zsh-right-justify-in-ps1
local LC_ALL="" LC_CTYPE="en_US.UTF-8" # Set the right locale to protect special characters
_P9K_RIGHT_PREFIX='%{'$'\e[1A''%}' # one line up
_P9K_RIGHT_SUFFIX='%{'$'\e[1B''%}' # one line down
fi
else
_P9K_LEFT_PREFIX="%f%b%k"
fi
if [[ $ITERM_SHELL_INTEGRATION_INSTALLED == Yes ]]; then
_P9K_LEFT_PREFIX="%{$(iterm2_prompt_mark)%}$_P9K_LEFT_PREFIX"
fi
_P9K_RIGHT_PREFIX+="%f%b%k"
_P9K_RIGHT_SUFFIX="%{$reset_color%}$_P9K_RIGHT_SUFFIX"
if [[ $POWERLEVEL9K_PROMPT_ADD_NEWLINE == true ]]; then
repeat ${POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT:-1} { _P9K_LEFT_PREFIX=$'\n'$_P9K_LEFT_PREFIX }
fi
# If the terminal `LANG` is set to `C`, this theme will not work at all.
if [[ $LANG == C && $POWERLEVEL9K_IGNORE_TERM_LANG == false ]]; then
print -P "\t%F{red}WARNING!%f Your terminal's 'LANG' is set to 'C', which breaks this theme!"