From b8d648b339c2b6cd784c73c704c0ebddd821f2e4 Mon Sep 17 00:00:00 2001 From: romkatv Date: Thu, 3 Oct 2019 09:42:02 +0200 Subject: [PATCH] Revert "Revert "speed up startup by about 3x"" This reverts commit e5e6249ffd592695ccdb6030a42d3664b3dde480. --- internal/p10k.zsh | 174 ++++++++++++++++++++++++++++++---------------- 1 file changed, 115 insertions(+), 59 deletions(-) diff --git a/internal/p10k.zsh b/internal/p10k.zsh index 240e4bdc..20685b32 100755 --- a/internal/p10k.zsh +++ b/internal/p10k.zsh @@ -1218,6 +1218,7 @@ prompt_dir() { fi local -i fake_first=0 expand=0 + [[ -z $_p9k_locale ]] || local LC_ALL=$_p9k_locale local delim=${_POWERLEVEL9K_SHORTEN_DELIMITER-$'\u2026'} local -i shortenlen=${_POWERLEVEL9K_SHORTEN_DIR_LENGTH:--1} @@ -2744,7 +2745,7 @@ function _p9k_vcs_gitstatus() { prompt_vcs() { local -a backends=($_POWERLEVEL9K_VCS_BACKENDS) - if (( ${backends[(I)git]} && !_POWERLEVEL9K_DISABLE_GITSTATUS )) && _p9k_vcs_gitstatus; then + if (( ${backends[(I)git]} && !_p9k_gitstatus_disabled )) && _p9k_vcs_gitstatus; then _p9k_vcs_render && return backends=(${backends:#git}) fi @@ -3336,12 +3337,38 @@ _p9k_save_status() { fi } +function _p9k_dump_state() { + local dir=${XDG_CACHE_HOME:-$HOME/.cache} + [[ -d $dir ]] || mkdir -pm 0700 $dir || return + [[ -w $dir && -z $dir(#qNR) ]] || return + local tmp=$dir/p10k-state-$USER.zsh.$$-$EPOCHREALTIME-$RANDOM + local -i fd + sysopen -a -m 600 -o creat,trunc -u fd $tmp || return + { + print -r -- "# $_p9k_param_sig" >&$fd || return + typeset -pm '(_POWERLEVEL9K_|_p9k_)*~(_p9k_async_pump*)' >&$fd || return + } always { + exec {fd}>&- + } + zf_mv -f $tmp $dir/p10k-state-$USER.zsh +} + +function _p9k_restore_state() { + local file=${XDG_CACHE_HOME:-$HOME/.cache}/p10k-state-$USER.zsh + [[ -r $file && -z $file(#qNW) ]] || return + local content && content="$(<$file)" + [[ $content == '# '$_p9k_param_sig$'\n'* ]] || return + eval $content +} + _p9k_precmd_impl() { emulate -L zsh setopt no_hist_expand extended_glob no_prompt_bang prompt_{percent,subst} (( __p9k_enabled )) || return + local -i init=0 + if ! zle || [[ -z $_p9k_param_sig ]]; then if zle; then __p9k_new_status=0 @@ -3377,6 +3404,7 @@ _p9k_precmd_impl() { fi fi _p9k_init + local -i init=1 fi _p9k_timer_end=EPOCHREALTIME @@ -3399,6 +3427,8 @@ _p9k_precmd_impl() { _p9k_refresh_reason=precmd _p9k_set_prompt _p9k_refresh_reason='' + + (( init )) && _p9k_dump_state } _p9k_precmd() { @@ -3554,8 +3584,9 @@ _p9k_init_async_pump() { _p9k_start_async_pump() { setopt err_return no_bg_nice - _p9k_async_pump_lock="$(mktemp ${TMPDIR:-/tmp}/p9k-$$-async-pump-lock.XXXXXXXXXX)" - _p9k_async_pump_fifo="$(mktemp -u ${TMPDIR:-/tmp}/p9k-$$-async-pump-fifo.XXXXXXXXXX)" + _p9k_async_pump_lock=${TMPDIR:-/tmp}/p9k-$$-async-pump-lock.$EPOCHREALTIME.$RANDOM + _p9k_async_pump_fifo=${TMPDIR:-/tmp}/p9k-$$-async-pump-fifo.$EPOCHREALTIME.$RANDOM + echo -n >$_p9k_async_pump_lock mkfifo $_p9k_async_pump_fifo sysopen -rw -o cloexec,sync -u _p9k_async_pump_fd $_p9k_async_pump_fifo zle -F $_p9k_async_pump_fd _p9k_on_async_message @@ -3690,6 +3721,10 @@ _p9k_init_vars() { typeset -gi _p9k_fetch_iface typeset -g _p9k_keymap typeset -g _p9k_zle_state + typeset -g _p9k_uname + typeset -g _p9k_uname_o + typeset -g _p9k_uname_m + typeset -gi _p9k_gitstatus_disabled typeset -g P9K_VISUAL_IDENTIFIER typeset -g P9K_CONTENT @@ -4289,7 +4324,7 @@ _p9k_must_init() { ${(o)parameters[(I)(POWERLEVEL9K_*|GITSTATUS_LOG_LEVEL|GITSTATUS_ENABLE_LOGGING|GITSTATUS_DAEMON|GITSTATUS_NUM_THREADS|DEFAULT_USER|ZLE_RPROMPT_INDENT)]}) local IFS param_sig IFS=$'\1' param_sig="${(@)param_keys:/(#b)(*)/$match[1]=\$$match[1]}" - IFS=$'\2' eval "param_sig=$__p9k_ksh_arrays$__p9k_sh_glob\"$param_sig\"" + IFS=$'\2' eval "param_sig=0.$USER.$P9K_SSH$__p9k_ksh_arrays$__p9k_sh_glob\"$param_sig\"" [[ -o transient_rprompt ]] && param_sig+=t [[ $param_sig == $_p9k_param_sig ]] && return 1 [[ -n $_p9k_param_sig ]] && _p9k_deinit @@ -4302,17 +4337,19 @@ function _p9k_set_os() { _p9k_os_icon=$_p9k_ret } -_p9k_init() { +function _p9k_init_cacheable() { _p9k_init_icons - _p9k_init_vars _p9k_init_params _p9k_init_prompt - local uname="$(uname)" - if [[ $uname == Linux && "$(uname -o 2>/dev/null)" == Android ]]; then + _p9k_uname="$(uname)" + [[ $_p9k_uname == Linux ]] && _p9k_uname_o="$(uname -o 2>/dev/null)" + _p9k_uname_m="$(uname -m)" + + if [[ $_p9k_uname == Linux && _p9k_uname_o == Android ]]; then _p9k_set_os Android ANDROID_ICON else - case $uname in + case $_p9k_uname in SunOS) _p9k_set_os Solaris SUNOS_ICON;; Darwin) _p9k_set_os OSX APPLE_ICON;; CYGWIN_NT-* | MSYS_NT-*) _p9k_set_os Windows WINDOWS_ICON;; @@ -4394,12 +4431,60 @@ _p9k_init() { fi done + case $_p9k_os in + OSX) (( $+commands[sysctl] )) && _p9k_num_cpus="$(sysctl -n hw.logicalcpu 2>/dev/null)";; + BSD) (( $+commands[sysctl] )) && _p9k_num_cpus="$(sysctl -n hw.ncpu 2>/dev/null)";; + *) (( $+commands[nproc] )) && _p9k_num_cpus="$(nproc 2>/dev/null)";; + esac + + if _p9k_segment_in_use dir; then + if (( $+_POWERLEVEL9K_DIR_CLASSES )); then + [[ -z $_p9k_locale ]] || local LC_ALL=$_p9k_locale + local -i i=3 + for ((; i <= $#_POWERLEVEL9K_DIR_CLASSES; i+=3)); do + _POWERLEVEL9K_DIR_CLASSES[i]=${(g::)_POWERLEVEL9K_DIR_CLASSES[i]} + done + else + typeset -ga _POWERLEVEL9K_DIR_CLASSES=() + _p9k_get_icon prompt_dir_ETC ETC_ICON + _POWERLEVEL9K_DIR_CLASSES+=('/etc|/etc/*' ETC "$_p9k_ret") + _p9k_get_icon prompt_dir_HOME HOME_ICON + _POWERLEVEL9K_DIR_CLASSES+=('~' HOME "$_p9k_ret") + _p9k_get_icon prompt_dir_HOME_SUBFOLDER HOME_SUB_ICON + _POWERLEVEL9K_DIR_CLASSES+=('~/*' HOME_SUBFOLDER "$_p9k_ret") + _p9k_get_icon prompt_dir_DEFAULT FOLDER_ICON + _POWERLEVEL9K_DIR_CLASSES+=('*' DEFAULT "$_p9k_ret") + fi + fi + + if _p9k_segment_in_use status; then + typeset -g _p9k_exitcode2str=({0..255}) + local -i i=2 + if (( !_POWERLEVEL9K_STATUS_HIDE_SIGNAME )); then + for ((; i <= $#signals; ++i)); do + local sig=$signals[i] + (( _POWERLEVEL9K_STATUS_VERBOSE_SIGNAME )) && sig="SIG${sig}($((i-1)))" + _p9k_exitcode2str[$((128+i))]=$sig + done + fi + fi + + if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]] && _p9k_segment_in_use public_ip || + _p9k_segment_in_use ip || _p9k_segment_in_use vpn_ip; then + _p9k_fetch_iface=1 + fi +} + +_p9k_init() { + _p9k_init_vars + _p9k_restore_state || _p9k_init_cacheable + if _p9k_segment_in_use vcs; then _p9k_vcs_info_init - local gitstatus_dir=${_POWERLEVEL9K_GITSTATUS_DIR:-${__p9k_root_dir}/gitstatus} if [[ $_POWERLEVEL9K_DISABLE_GITSTATUS == 0 && -n $_POWERLEVEL9K_VCS_BACKENDS[(r)git] ]]; then - if [[ -z $GITSTATUS_DAEMON && "$(uname -m)" == i686 && -z $gitstatus_dir/bin/*-i686(-static|)(#qN) ]]; then - _POWERLEVEL9K_DISABLE_GITSTATUS=1 + local gitstatus_dir=${_POWERLEVEL9K_GITSTATUS_DIR:-${__p9k_root_dir}/gitstatus} + if [[ -z $GITSTATUS_DAEMON && $_p9k_uname == i686 && -z $gitstatus_dir/bin/*-i686(-static|)(#qN) ]]; then + _p9k_gitstatus_disabled=1 >&2 echo -E - "${(%):-[%1FERROR%f]: %BPowerlevel10k%b is unable to use %Bgitstatus%b. Git prompt will be slow.}" >&2 echo -E - "" >&2 echo -E - "${(%):-Reason: There is no %Bgitstatusd%b binary for i686 (32-bit Intel architecture).}" @@ -4431,6 +4516,19 @@ _p9k_init() { >&2 echo -E - "${(%):- * You %Bwill not%b see this error message again.}" >&2 echo -E - "${(%):- * Git prompt will be %Bfast%b.}" else + local -i daemon threads + if (( ! $+GITSTATUS_DAEMON )); then + local os=$_p9k_uname + [[ $_p9k_uname == Linux && _p9k_uname_o == Android ]] && os=Android + typeset -g GITSTATUS_DAEMON=$gitstatus_dir/bin/gitstatusd-${os:l}-${_p9k_uname_m:l} + daemon=1 + fi + if (( ! $+GITSTATUS_NUM_THREADS )); then + typeset -gi GITSTATUS_NUM_THREADS=$(( _p9k_num_cpus * 2 )) + (( GITSTATUS_NUM_THREADS > 0 )) || GITSTATUS_NUM_THREADS=8 + (( GITSTATUS_NUM_THREADS <= 32 )) || GITSTATUS_NUM_THREADS=32 + threads=1 + fi source $gitstatus_dir/gitstatus.plugin.zsh gitstatus_start \ -s $_POWERLEVEL9K_VCS_STAGED_MAX_NUM \ @@ -4438,7 +4536,9 @@ _p9k_init() { -d $_POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM \ -c $_POWERLEVEL9K_VCS_CONFLICTED_MAX_NUM \ -m $_POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY \ - POWERLEVEL9K || _POWERLEVEL9K_DISABLE_GITSTATUS=1 + POWERLEVEL9K || _p9k_gitstatus_disabled=1 + (( daemon )) && unset GITSTATUS_DAEMON + (( threads )) && unset GITSTATUS_NUM_THREADS fi fi fi @@ -4460,36 +4560,6 @@ _p9k_init() { fi fi - if _p9k_segment_in_use load; then - case $_p9k_os in - OSX) (( $+commands[sysctl] )) && _p9k_num_cpus="$(sysctl -n hw.logicalcpu 2>/dev/null)";; - BSD) (( $+commands[sysctl] )) && _p9k_num_cpus="$(sysctl -n hw.ncpu 2>/dev/null)";; - *) (( $+commands[nproc] )) && _p9k_num_cpus="$(nproc 2>/dev/null)";; - esac - fi - - if _p9k_segment_in_use dir; then - if (( $+_POWERLEVEL9K_DIR_CLASSES )); then - [[ -z $_p9k_locale ]] || local LC_ALL=$_p9k_locale - local -i i=3 - for ((; i <= $#_POWERLEVEL9K_DIR_CLASSES; i+=3)); do - _POWERLEVEL9K_DIR_CLASSES[i]=${(g::)_POWERLEVEL9K_DIR_CLASSES[i]} - done - else - typeset -ga _POWERLEVEL9K_DIR_CLASSES=() - _p9k_get_icon prompt_dir_ETC ETC_ICON - _POWERLEVEL9K_DIR_CLASSES+=('/etc|/etc/*' ETC "$_p9k_ret") - _p9k_get_icon prompt_dir_HOME HOME_ICON - _POWERLEVEL9K_DIR_CLASSES+=('~' HOME "$_p9k_ret") - _p9k_get_icon prompt_dir_HOME_SUBFOLDER HOME_SUB_ICON - _POWERLEVEL9K_DIR_CLASSES+=('~/*' HOME_SUBFOLDER "$_p9k_ret") - _p9k_get_icon prompt_dir_DEFAULT FOLDER_ICON - _POWERLEVEL9K_DIR_CLASSES+=('*' DEFAULT "$_p9k_ret") - fi - fi - - _p9k_init_async_pump - if _p9k_segment_in_use vi_mode || _p9k_segment_in_use prompt_char; then _p9k_wrap_zle_widget zle-keymap-select _p9k_zle_keymap_select fi @@ -4510,22 +4580,7 @@ _p9k_init() { print -rP -- 'Either install %F{green}jq%f or change the value of %BPOWERLEVEL9K_SHORTEN_STRATEGY%b.' fi - if _p9k_segment_in_use status; then - typeset -g _p9k_exitcode2str=({0..255}) - local -i i=2 - if (( !_POWERLEVEL9K_STATUS_HIDE_SIGNAME )); then - for ((; i <= $#signals; ++i)); do - local sig=$signals[i] - (( _POWERLEVEL9K_STATUS_VERBOSE_SIGNAME )) && sig="SIG${sig}($((i-1)))" - _p9k_exitcode2str[$((128+i))]=$sig - done - fi - fi - - if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]] && _p9k_segment_in_use public_ip || - _p9k_segment_in_use ip || _p9k_segment_in_use vpn_ip; then - _p9k_fetch_iface=1 - fi + _p9k_init_async_pump } _p9k_deinit() { @@ -4727,6 +4782,7 @@ zmodload zsh/mathfunc zmodload zsh/system zmodload -F zsh/stat b:zstat zmodload -F zsh/net/socket b:zsocket +zmodload -F zsh/files b:zf_mv _p9k_init_ssh prompt_powerlevel9k_setup