diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme index b8494994..31254db8 100755 --- a/powerlevel9k.zsh-theme +++ b/powerlevel9k.zsh-theme @@ -2034,9 +2034,6 @@ typeset -fH _p9k_set_prompt() { build_right_prompt RPROMPT=$_P9K_RIGHT_PREFIX$_P9K_PROMPT$_P9K_RIGHT_SUFFIX fi - - unset _P9K_H1 - unset _P9K_H2 } typeset -g _P9K_REFRESH_REASON @@ -2085,46 +2082,30 @@ typeset -g OS typeset -g OS_ICON typeset -g SED_EXTENDED_REGEX_PARAMETER -typeset -gi _P9K_TIMER_FD1=0 -typeset -gi _P9K_TIMER_FD2=0 +typeset -gi _P9K_TIMER_FD=0 _p9k_init_timer() { - local fifo1 fifo2 + local fifo _p9k_start_timer() { emulate -L zsh setopt err_return no_bg_nice - fifo1=$(mktemp -u "${TMPDIR:-/tmp}"/p9k.$$.pipe1.timer.XXXXXXXXXX) - fifo2=$(mktemp -u "${TMPDIR:-/tmp}"/p9k.$$.pipe2.timer.XXXXXXXXXX) - mkfifo $fifo1 - mkfifo $fifo2 - exec {_P9K_TIMER_FD1}<>$fifo1 - exec {_P9K_TIMER_FD2}<>$fifo2 + fifo=$(mktemp -u "${TMPDIR:-/tmp}"/p9k.$$.pipe.timer.XXXXXXXXXX) + mkfifo $fifo + exec {_P9K_TIMER_FD}<>$fifo function _p9k_on_timer() { emulate -L zsh - local reason - IFS='' read -u $_P9K_TIMER_FD1 reason || return - unset _P9K_H1 - unset _P9K_H2 - [[ -n $reason ]] && _p9k_update_prompt $reason || zle .reset-prompt + local dummy && IFS='' read -u $_P9K_TIMER_FD dummy && zle .reset-prompt } - zle -F $_P9K_TIMER_FD1 _p9k_on_timer - - # This `sleep 1 && kill -WINCH $$` is a workaround for what seems like a bug in zsh. - zsh -c " - while kill -0 $$; do - if IFS='' read -u $_P9K_TIMER_FD2 -t 1; then - sleep 1 - kill -WINCH $$ - echo job-complete - elif [[ $POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME == true ]]; then - echo - fi - done - " <&$_P9K_TIMER_FD2 >&$_P9K_TIMER_FD1 2>/dev/null &! + zle -F $_P9K_TIMER_FD _p9k_on_timer + + # `kill -WINCH $$` is a workaround for a bug in zsh. After a background job completes, callbacks + # registered with `zle -F` stop firing until the user presses any key or the process receives a + # signal (any signal at all). + zsh -c "while kill -WINCH $$; do sleep 1; echo; done" &$_P9K_TIMER_FD 2>/dev/null &! local pid=$! function _p9k_kill_timer_${pid}() { emulate -L zsh @@ -2135,18 +2116,14 @@ _p9k_init_timer() { if ! _p9k_start_timer ; then echo "powerlevel10k: failed to initialize background timer" >&2 - if (( _P9K_TIMER_FD1 )); then - zle -F $_P9K_TIMER_FD1 - exec {_P9K_TIMER_FD1}>&- + if (( _P9K_TIMER_FD )); then + zle -F $_P9K_TIMER_FD + exec {_P9K_TIMER_FD}>&- + _P9K_TIMER_FD=0 fi - if (( _P9K_TIMER_FD2 )); then - exec {_P9K_TIMER_FD2}>&- - fi - _P9K_TIMER_FD1=0 - _P9K_TIMER_FD2=0 unset -f _p9k_on_timer fi - command rm -f "$fifo1" "$fifo2" + command rm -f "$fifo" } _p9k_init() { @@ -2279,10 +2256,6 @@ _p9k_init() { _P9K_LEFT_PREFIX="%{$(iterm2_prompt_mark)%}$_P9K_LEFT_PREFIX" fi - if segment_in_use background_jobs && (( _P9K_TIMER_FD2 )); then - _P9K_LEFT_SUFFIX+="\${_P9K_H1+\${_P9K_H2-\${_P9K_H2=}\$(echo>&$_P9K_TIMER_FD2)}}\${_P9K_H1=}" - 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!"