From c7405e46789396ffa8e8ff012c2a90cc9ab6652a Mon Sep 17 00:00:00 2001
From: romkatv <roman.perepelitsa@gmail.com>
Date: Mon, 27 Jan 2020 15:04:34 +0100
Subject: start working on faster globbing

---
 internal/p10k.zsh | 219 +++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 167 insertions(+), 52 deletions(-)

(limited to 'internal')

diff --git a/internal/p10k.zsh b/internal/p10k.zsh
index c0cf2371..1912a027 100644
--- a/internal/p10k.zsh
+++ b/internal/p10k.zsh
@@ -201,6 +201,122 @@ function _p9k_declare() {
   esac
 }
 
+# todox: move these to init_vars
+
+# _p9k__parent_dirs and _p9k__parent_mtimes are parallel arrays. They are updated
+# together with _p9k__pwd. _p9k__parent_mtimes[i] is mtime for _p9k__parent_dirs[i].
+#
+# When _p9k__pwd is / or ~, both arrays are empty. When _p9k__pwd is ~/foo/bar,
+# _p9k__parent_dirs is (/home/user/foo/bar /home/user/foo). When _p9k__pwd is
+# /foo/bar, it's (/foo/bar /foo).
+#
+# _p9k__parent_mtimes_s is always "$_p9k__parent_mtimes".
+typeset -ga _p9k__parent_dirs
+typeset -ga _p9k__parent_mtimes
+typeset -g  _p9k__parent_mtimes_s
+
+# dir/pattern => dir mtime ':' num_matches
+typeset -gA _p9k__glob_cache
+
+# dir/pattern => space-separated parent dir mtimes ' :' the first matching parent dir
+# Note: ' :' is indeed the delimiter.
+typeset -gA _p9k__upsearch_cache
+
+function _p9k_fetch_cwd() {
+  _p9k__cwd=${(%):-%/}
+  _p9k__cwd_a=${_p9k__cwd:A}
+
+  case $_p9k__cwd in
+    ~|/)
+      _p9k__parent_dirs=()
+      _p9k__parent_mtimes=()
+    ;;
+    ~/*)
+      local parent=~/
+      local parts=(${(s./.)_p9k__cwd#$parent})
+    ;;
+    *)
+      local parent=/
+      local parts=(${(s./.)_p9k__cwd})
+    ;;
+  esac
+  local MATCH
+  _p9k__parent_dirs=(${(@)${:-{$#parts..1}}/(#m)*/$parent${(pj./.)parts[1,$MATCH]}})
+  if ! zstat -A _p9k__parent_mtimes +mtime -- $_p9k__parent_dirs 2>/dev/null; then
+    _p9k__parent_mtimes=(${(@)parts/*/-1})
+  fi
+  _p9k__parent_mtimes_s="$_p9k__parent_mtimes"
+}
+
+# Usage: _p9k_glob parent_dir_index pattern
+#
+# parent_dir_index indexes _p9k__parent_dirs.
+#
+# Returns the number of matches capped at 2.
+#
+# Pattern cannot have slashes.
+#
+# Example: _p9k_glob 3 '*.csproj'
+function _p9k_glob() {
+  local dir=$_p9k__parent_dirs[$1]
+  local cached=$_p9k__glob_cache[$dir/$2]
+  if [[ $cached == $_p9k__parent_mtimes[$1]:* ]]; then
+    return ${cached##*:}
+  fi
+  local -a stat
+  zstat -A stat +mtime -- $dir || stat=(-1)
+  local files=($dir/$~2(N:t))
+  local -i res=$(($#files < 2 ? $#files : 2))
+  _p9k__glob_cache[$dir/$2]="$stat[1]:$res"
+  return res
+}
+
+# Usage: _p9k_upsearch pattern
+#
+# On match, sets _p9k_ret to the directory in which match happened and returns 0.
+# Otherwise sets _p9k_ret to "" and returns 1.
+#
+# Pattern cannot have slashes. Never matches in / or ~. Search stops before reaching / or ~.
+#
+# Example: _p9k_upsearch '*.csproj'
+function _p9k_upsearch() {
+  local key=""
+  local cached=$_p9k__upsearch_cache[$_p9k__pwd/$1]
+  if [[ $cached == $_p9k__parent_mtimes_s\ * ]]; then
+    _p9k_ret=${cached:$(($#_p9k__parent_mtimes_s+2))}
+    [[ -n $_p9k_ret ]]
+    return
+  fi
+
+  _p9k_ret=
+
+  if [[ -n $cached ]]; then
+    local last_mtime cur_mtime dir last_dir=${cached##*:}
+    local -i i=0
+    for last_mtime cur_mtime in ${${(s: :)cached}:^_p9k__parent_mtimes}; do
+      dir=$_p9k__parent_dirs[++i]
+      if [[ $last_mtime == $cur_mtime ]] && (( $#last_dir <= $#dir )); then
+        (( $#last_dir < $#dir )) && continue
+        _p9k_ret=$last_dir
+        break
+      fi
+      _p9k_glob $i $1 && continue
+      _p9k_ret=$last_dir
+      break
+    done
+  else
+    local -i i
+    for i in {1..$#_p9k__parent_dirs}; do
+      _p9k_glob $i $1 && continue
+      _p9k_ret=$_p9k__parent_dirs[i]
+      break
+    done
+  fi
+
+  _p9k__upsearch_cache[$_p9k__pwd/$1]="$_p9k__parent_mtimes_s :$_p9k_ret"
+  [[ -n $_p9k_ret ]]
+}
+
 # If we execute `print -P $1`, how many characters will be printed on the last line?
 # Assumes that `%{%}` and `%G` don't lie.
 #
@@ -1036,7 +1152,7 @@ _p9k_prompt_aws_init() {
 prompt_aws_eb_env() {
   (( $+commands[eb] )) || return
 
-  local dir=$_p9k__pwd
+  local dir=$_p9k__cwd
   while true; do
     [[ $dir == / ]] && return
     [[ -d $dir/.elasticbeanstalk ]] && break
@@ -1090,7 +1206,7 @@ _p9k_prompt_disk_usage_init() {
   typeset -g _p9k__disk_usage_normal=
   typeset -g _p9k__disk_usage_warning=
   typeset -g _p9k__disk_usage_critical=
-  _p9k__async_segments_compute+='_p9k_prompt_disk_usage_compute ${(q)_p9k__pwd_a}'
+  _p9k__async_segments_compute+='_p9k_prompt_disk_usage_compute ${(q)_p9k__cwd_a}'
 }
 
 _p9k_prompt_disk_usage_compute() {
@@ -1133,7 +1249,7 @@ function _p9k_read_file() {
 
 prompt_fvm() {
   (( $+commands[fvm] )) || return
-  local dir=$_p9k__pwd_a
+  local dir=$_p9k__cwd_a
   while [[ $dir != / ]]; do
     local link=$dir/fvm
     if [[ -L $link ]]; then
@@ -1548,10 +1664,10 @@ function _p9k_shorten_delim_len() {
 # Dir: current working directory
 prompt_dir() {
   if (( _POWERLEVEL9K_DIR_PATH_ABSOLUTE )); then
-    local p=$_p9k__pwd
+    local p=$_p9k__cwd
     local -a parts=("${(s:/:)p}")
   elif [[ -o auto_name_dirs ]]; then
-    local p=${_p9k__pwd/#(#b)$HOME(|\/*)/'~'$match[1]}
+    local p=${_p9k__cwd/#(#b)$HOME(|\/*)/'~'$match[1]}
     local -a parts=("${(s:/:)p}")
   else
     local p=${(%):-%~}
@@ -1565,7 +1681,7 @@ prompt_dir() {
       local -a parts=()
       for func in zsh_directory_name $zsh_directory_name_functions; do
         local reply=()
-        if (( $+functions[$func] )) && $func d $_p9k__pwd && [[ $p == '~['$reply[1]']'* ]]; then
+        if (( $+functions[$func] )) && $func d $_p9k__cwd && [[ $p == '~['$reply[1]']'* ]]; then
           parts+='~['$reply[1]']'
           break
         fi
@@ -1573,7 +1689,7 @@ prompt_dir() {
       if (( $#parts )); then
         parts+=(${(s:/:)${p#$parts[1]}})
       else
-        p=$_p9k__pwd
+        p=$_p9k__cwd
         parts=("${(s:/:)p}")
       fi
     else
@@ -1614,7 +1730,7 @@ prompt_dir() {
            $+commands[jq] == 1 && $#_POWERLEVEL9K_DIR_PACKAGE_FILES > 0 ]] || return
         local pats="(${(j:|:)_POWERLEVEL9K_DIR_PACKAGE_FILES})"
         local -i i=$#parts
-        local dir=$_p9k__pwd
+        local dir=$_p9k__cwd
         for (( ; i > 0; --i )); do
           local markers=($dir/${~pats}(N))
           if (( $#markers )); then
@@ -1675,7 +1791,7 @@ prompt_dir() {
       elif [[ $p[1] == / ]]; then
         (( ++i ))
       fi
-      local parent="${_p9k__pwd%/${(pj./.)parts[i,-1]}}"
+      local parent="${_p9k__cwd%/${(pj./.)parts[i,-1]}}"
       if (( i <= e )); then
         local MATCH= mtimes=()
         zstat -A mtimes +mtime -- ${(@)${:-{$i..$e}}/(#m)*/$parent/${(pj./.)parts[i,$MATCH]}} 2>/dev/null || mtimes=()
@@ -1683,7 +1799,7 @@ prompt_dir() {
       else
         local key='good'
       fi
-      if ! _p9k_cache_ephemeral_get $0 $e $i $_p9k__pwd || [[ $key != $_p9k_cache_val[1] ]] ; then
+      if ! _p9k_cache_ephemeral_get $0 $e $i $_p9k__cwd || [[ $key != $_p9k_cache_val[1] ]] ; then
         _p9k_prompt_length $delim
         local -i real_delim_len=_p9k_ret
         [[ -n $parts[i-1] ]] && parts[i-1]="\${(Q)\${:-${(qqq)${(q)parts[i-1]}}}}"$'\2'
@@ -1758,7 +1874,7 @@ prompt_dir() {
     ;;
     truncate_with_folder_marker)
       if [[ -n $_POWERLEVEL9K_SHORTEN_FOLDER_MARKER ]]; then
-        local dir=$_p9k__pwd
+        local dir=$_p9k__cwd
         local -a m=()
         local -i i=$(($#parts - 1))
         for (( ; i > 1; --i )); do
@@ -1782,9 +1898,9 @@ prompt_dir() {
     ;;
   esac
 
-  [[ $_POWERLEVEL9K_DIR_SHOW_WRITABLE == 1 && ! -w $_p9k__pwd ]]
+  [[ $_POWERLEVEL9K_DIR_SHOW_WRITABLE == 1 && ! -w $_p9k__cwd ]]
   local w=$?
-  if ! _p9k_cache_ephemeral_get $0 $_p9k__pwd $p $w $fake_first "${parts[@]}"; then
+  if ! _p9k_cache_ephemeral_get $0 $_p9k__cwd $p $w $fake_first "${parts[@]}"; then
     local state=$0
     local icon=''
     if (( ! w )); then
@@ -1793,7 +1909,7 @@ prompt_dir() {
     else
       local a='' b='' c=''
       for a b c in "${_POWERLEVEL9K_DIR_CLASSES[@]}"; do
-        if [[ $_p9k__pwd == ${~a} ]]; then
+        if [[ $_p9k__cwd == ${~a} ]]; then
           [[ -n $b ]] && state+=_${(U)b}
           icon=$'\1'$c
           break
@@ -1881,7 +1997,7 @@ prompt_dir() {
 
     local content="${(pj.$sep.)parts}"
     if (( _POWERLEVEL9K_DIR_HYPERLINK )); then
-      local header=$'%{\e]8;;file://'${${_p9k__pwd//\%/%%25}//'#'/%%23}$'\a%}'
+      local header=$'%{\e]8;;file://'${${_p9k__cwd//\%/%%25}//'#'/%%23}$'\a%}'
       local footer=$'%{\e]8;;\a%}'
       if (( expand )); then
         _p9k_escape $header
@@ -1937,8 +2053,8 @@ prompt_go_version() {
         p="$(go env GOPATH 2>/dev/null)" && [[ -n $p ]] || return
       fi
     fi
-    if [[ $_p9k__pwd/ != $p/* && $_p9k__pwd_a/ != $p/* ]]; then
-      local dir=$_p9k__pwd_a
+    if [[ $_p9k__cwd/ != $p/* && $_p9k__cwd_a/ != $p/* ]]; then
+      local dir=$_p9k__cwd_a
       while true; do
         [[ $dir == / ]] && return
         [[ -e $dir/go.mod ]] && break
@@ -2112,7 +2228,7 @@ prompt_node_version() {
   (( $+commands[node] )) || return
 
   if (( _POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY )); then
-    local dir=$_p9k__pwd
+    local dir=$_p9k__cwd
     while true; do
       [[ $dir == / ]] && return
       [[ -e $dir/package.json ]] && break
@@ -2282,7 +2398,7 @@ prompt_nodenv() {
   (( $+commands[nodenv] || $+functions[nodenv] )) || return
   _p9k_ret=$NODENV_VERSION
   if [[ -z $_p9k_ret ]]; then
-    [[ $NODENV_DIR == /* ]] && local dir=$NODENV_DIR || local dir="$_p9k__pwd_a/$NODENV_DIR"
+    [[ $NODENV_DIR == /* ]] && local dir=$NODENV_DIR || local dir="$_p9k__cwd_a/$NODENV_DIR"
     while [[ $dir != //[^/]# ]]; do
       _p9k_read_nodenv_version_file $dir/.node-version && break
       [[ $dir == / ]] && break
@@ -2313,15 +2429,15 @@ prompt_dotnet_version() {
   (( $+commands[dotnet] )) || return
 
   if (( _POWERLEVEL9K_DOTNET_VERSION_PROJECT_ONLY )); then
-    case $_p9k__pwd in
+    case $_p9k__cwd in
       ~|/) return 0;;
       ~/*)
         local parent=~/
-        local parts=(${(s./.)_p9k__pwd#$parent})
+        local parts=(${(s./.)_p9k__cwd#$parent})
       ;;
       *)
         local parent=/
-        local parts=(${(s./.)_p9k__pwd})
+        local parts=(${(s./.)_p9k__cwd})
       ;;
     esac
     local MATCH
@@ -2329,7 +2445,7 @@ prompt_dotnet_version() {
     local mtimes=()
     zstat -A mtimes +mtime -- $dirs 2>/dev/null || mtimes=()
     local key="${(pj.:.)mtimes}"
-    if ! _p9k_cache_ephemeral_get $0 $_p9k__pwd || [[ $key != $_p9k_cache_val[1] ]] ; then
+    if ! _p9k_cache_ephemeral_get $0 $_p9k__cwd || [[ $key != $_p9k_cache_val[1] ]] ; then
       local -i i found
       for i in {1..$#dirs}; do
         local dir=$dirs[i] mtime=$mtimes[i]
@@ -2460,7 +2576,7 @@ prompt_rbenv() {
     local v=$RBENV_VERSION
   else
     (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)local|global]} )) || return
-    [[ $RBENV_DIR == /* ]] && local dir=$RBENV_DIR || local dir="$_p9k__pwd_a/$RBENV_DIR"
+    [[ $RBENV_DIR == /* ]] && local dir=$RBENV_DIR || local dir="$_p9k__cwd_a/$RBENV_DIR"
     while true; do
       if _p9k_read_rbenv_version_file $dir/.ruby-version; then
         (( ${_POWERLEVEL9K_RBENV_SOURCES[(I)local]} )) || return
@@ -2511,7 +2627,7 @@ prompt_luaenv() {
     local v=$LUAENV_VERSION
   else
     (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)local|global]} )) || return
-    [[ $LUAENV_DIR == /* ]] && local dir=$LUAENV_DIR || local dir="$_p9k__pwd_a/$LUAENV_DIR"
+    [[ $LUAENV_DIR == /* ]] && local dir=$LUAENV_DIR || local dir="$_p9k__cwd_a/$LUAENV_DIR"
     while true; do
       if _p9k_read_luaenv_version_file $dir/.lua-version; then
         (( ${_POWERLEVEL9K_LUAENV_SOURCES[(I)local]} )) || return
@@ -2573,7 +2689,7 @@ prompt_plenv() {
     local v=$PLENV_VERSION
   else
     (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)local|global]} )) || return
-    [[ $PLENV_DIR == /* ]] && local dir=$PLENV_DIR || local dir="$_p9k__pwd_a/$PLENV_DIR"
+    [[ $PLENV_DIR == /* ]] && local dir=$PLENV_DIR || local dir="$_p9k__cwd_a/$PLENV_DIR"
     while true; do
       if _p9k_read_plenv_version_file $dir/.perl-version; then
         (( ${_POWERLEVEL9K_PLENV_SOURCES[(I)local]} )) || return
@@ -2613,7 +2729,7 @@ prompt_jenv() {
     local v=$JENV_VERSION
   else
     (( ${_POWERLEVEL9K_JENV_SOURCES[(I)local|global]} )) || return
-    [[ $JENV_DIR == /* ]] && local dir=$JENV_DIR || local dir="$_p9k__pwd_a/$JENV_DIR"
+    [[ $JENV_DIR == /* ]] && local dir=$JENV_DIR || local dir="$_p9k__cwd_a/$JENV_DIR"
     while true; do
       if _p9k_read_jenv_version_file $dir/.java-version; then
         (( ${_POWERLEVEL9K_JENV_SOURCES[(I)local]} )) || return
@@ -2674,7 +2790,7 @@ prompt_rust_version() {
   unset P9K_RUST_VERSION
   (( $+commands[rustc] )) || return
   if (( _POWERLEVEL9K_RUST_VERSION_PROJECT_ONLY )); then
-    local dir=$_p9k__pwd_a
+    local dir=$_p9k__cwd_a
     while true; do
       [[ $dir == / ]] && return
       [[ -e $dir/Cargo.toml ]] && break
@@ -2707,7 +2823,7 @@ prompt_rust_version() {
         _p9k_cache_stat_set ${keys:^vals}
       fi
       local -A overrides=($_p9k_cache_val)
-      local dir=$_p9k__pwd_a
+      local dir=$_p9k__cwd_a
       while true; do
         if (( $+overrides[$dir] )); then
           toolchain=$overrides[$dir]
@@ -3327,7 +3443,7 @@ function _p9k_vcs_status_for_dir() {
     _p9k_ret=$_p9k__gitstatus_last[GIT_DIR:$GIT_DIR]
     [[ -n $_p9k_ret ]]
   else
-    local dir=$_p9k__pwd_a
+    local dir=$_p9k__cwd_a
     while true; do
       _p9k_ret=$_p9k__gitstatus_last[$dir]
       [[ -n $_p9k_ret ]] && return 0
@@ -3566,8 +3682,8 @@ function _p9k_vcs_resume() {
   if [[ -z $_p9k__gitstatus_next_dir ]]; then
     unset _p9k__gitstatus_next_dir
     case $VCS_STATUS_RESULT in
-      norepo-async) (( $1 )) && _p9k_vcs_status_purge $_p9k__pwd_a;;
-      ok-async) (( $1 )) || _p9k__gitstatus_next_dir=$_p9k__pwd_a;;
+      norepo-async) (( $1 )) && _p9k_vcs_status_purge $_p9k__cwd_a;;
+      ok-async) (( $1 )) || _p9k__gitstatus_next_dir=$_p9k__cwd_a;;
     esac
   fi
 
@@ -3595,12 +3711,12 @@ function _p9k_vcs_resume() {
 function _p9k_vcs_gitstatus() {
   if [[ $_p9k_refresh_reason == precmd ]]; then
     if (( $+_p9k__gitstatus_next_dir )); then
-      _p9k__gitstatus_next_dir=$_p9k__pwd_a
+      _p9k__gitstatus_next_dir=$_p9k__cwd_a
     else
       local -F timeout=_POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS
       if ! _p9k_vcs_status_for_dir; then
         _p9k__git_dir=$GIT_DIR
-        gitstatus_query -d $_p9k__pwd_a -t $timeout -p -c '_p9k_vcs_resume 0' POWERLEVEL9K || return 1
+        gitstatus_query -d $_p9k__cwd_a -t $timeout -p -c '_p9k_vcs_resume 0' POWERLEVEL9K || return 1
         _p9k_maybe_ignore_git_repo
         case $VCS_STATUS_RESULT in
           tout) _p9k__gitstatus_next_dir=''; _p9k__gitstatus_start_time=$EPOCHREALTIME; return 0;;
@@ -3611,7 +3727,7 @@ function _p9k_vcs_gitstatus() {
         if [[ -n $GIT_DIR ]]; then
           [[ $_p9k_git_slow[GIT_DIR:$GIT_DIR] == 1 ]] && timeout=0
         else
-          local dir=$_p9k__pwd_a
+          local dir=$_p9k__cwd_a
           while true; do
             case $_p9k_git_slow[$dir] in
               "") [[ $dir == / ]] && break; dir=${dir:h};;
@@ -3623,14 +3739,14 @@ function _p9k_vcs_gitstatus() {
       fi
       (( _p9k__prompt_idx == 1 )) && timeout=0
       _p9k__git_dir=$GIT_DIR
-      if ! gitstatus_query -d $_p9k__pwd_a -t $timeout -c '_p9k_vcs_resume 1' POWERLEVEL9K; then
+      if ! gitstatus_query -d $_p9k__cwd_a -t $timeout -c '_p9k_vcs_resume 1' POWERLEVEL9K; then
         unset VCS_STATUS_RESULT
         return 1
       fi
       _p9k_maybe_ignore_git_repo
       case $VCS_STATUS_RESULT in
         tout) _p9k__gitstatus_next_dir=''; _p9k__gitstatus_start_time=$EPOCHREALTIME;;
-        norepo-sync) _p9k_vcs_status_purge $_p9k__pwd_a;;
+        norepo-sync) _p9k_vcs_status_purge $_p9k__cwd_a;;
         ok-sync) _p9k_vcs_status_save;;
       esac
     fi
@@ -3763,7 +3879,7 @@ prompt_pyenv() {
     (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)shell]} )) || return
   else
     (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)local|global]} )) || return
-    [[ $PYENV_DIR == /* ]] && local dir=$PYENV_DIR || local dir="$_p9k__pwd_a/$PYENV_DIR"
+    [[ $PYENV_DIR == /* ]] && local dir=$PYENV_DIR || local dir="$_p9k__cwd_a/$PYENV_DIR"
     while true; do
       if _p9k_read_pyenv_version_file $dir/.python-version; then
         (( ${_POWERLEVEL9K_PYENV_SOURCES[(I)local]} )) || return
@@ -3810,7 +3926,7 @@ prompt_goenv() {
   (( $+commands[goenv] || $+functions[goenv] )) || return
   local v=${(j.:.)${(s.:.)GOENV_VERSION}}
   if [[ -z $v ]]; then
-    [[ $GOENV_DIR == /* ]] && local dir=$GOENV_DIR || local dir="$_p9k__pwd_a/$GOENV_DIR"
+    [[ $GOENV_DIR == /* ]] && local dir=$GOENV_DIR || local dir="$_p9k__cwd_a/$GOENV_DIR"
     while true; do
       if _p9k_read_goenv_version_file $dir/.go-version; then
         v=$_p9k_ret
@@ -3869,7 +3985,7 @@ _p9k_prompt_swift_version_init() {
 ################################################################
 # dir_writable: Display information about the user's permission to write in the current directory
 prompt_dir_writable() {
-  if [[ ! -w "$_p9k__pwd" ]]; then
+  if [[ ! -w "$_p9k__cwd" ]]; then
     _p9k_prompt_segment "$0_FORBIDDEN" "red" "yellow1" 'LOCK_ICON' 0 '' ''
   fi
 }
@@ -4451,7 +4567,7 @@ function _p9k_set_prompt() {
         for _p9k_segment_name in ${${(0)_p9k_line_segments_right[_p9k_line_index]}%_joined}; do
           if (( $+functions[instant_prompt_$_p9k_segment_name] )); then
             local disabled=_POWERLEVEL9K_${(U)_p9k_segment_name}_DISABLED_DIR_PATTERN
-            if [[ $_p9k__pwd != ${(P)~disabled} ]]; then
+            if [[ $_p9k__cwd != ${(P)~disabled} ]]; then
               local -i len=$#_p9k__prompt
               _p9k_non_hermetic_expansion=0
               instant_prompt_$_p9k_segment_name
@@ -4467,7 +4583,7 @@ function _p9k_set_prompt() {
           local cond=$_p9k__segment_cond_right[_p9k_segment_index]
           if [[ -z $cond || -n ${(e)cond} ]]; then
             local disabled=_POWERLEVEL9K_${(U)_p9k_segment_name}_DISABLED_DIR_PATTERN
-            if [[ $_p9k__pwd != ${(P)~disabled} ]]; then
+            if [[ $_p9k__cwd != ${(P)~disabled} ]]; then
               local val=$_p9k__segment_val_right[_p9k_segment_index]
               if [[ -n $val ]]; then
                 _p9k__prompt+=$val
@@ -4497,7 +4613,7 @@ function _p9k_set_prompt() {
       for _p9k_segment_name in ${${(0)_p9k_line_segments_left[_p9k_line_index]}%_joined}; do
         if (( $+functions[instant_prompt_$_p9k_segment_name] )); then
           local disabled=_POWERLEVEL9K_${(U)_p9k_segment_name}_DISABLED_DIR_PATTERN
-          if [[ $_p9k__pwd != ${(P)~disabled} ]]; then
+          if [[ $_p9k__cwd != ${(P)~disabled} ]]; then
             local -i len=$#_p9k__prompt
             _p9k_non_hermetic_expansion=0
             instant_prompt_$_p9k_segment_name
@@ -4513,7 +4629,7 @@ function _p9k_set_prompt() {
         local cond=$_p9k__segment_cond_left[_p9k_segment_index]
         if [[ -z $cond || -n ${(e)cond} ]]; then
           local disabled=_POWERLEVEL9K_${(U)_p9k_segment_name}_DISABLED_DIR_PATTERN
-          if [[ $_p9k__pwd != ${(P)~disabled} ]]; then
+          if [[ $_p9k__cwd != ${(P)~disabled} ]]; then
             local val=$_p9k__segment_val_left[_p9k_segment_index]
             if [[ -n $val ]]; then
               _p9k__prompt+=$val
@@ -4594,7 +4710,7 @@ _p9k_dump_instant_prompt() {
   local root_dir=${__p9k_dump_file:h}
   local prompt_dir=${root_dir}/p10k-$user
   local root_file=$root_dir/p10k-instant-prompt-$user.zsh
-  local prompt_file=$prompt_dir/prompt-${#_p9k__pwd}
+  local prompt_file=$prompt_dir/prompt-${#_p9k__cwd}
   [[ -d $prompt_dir ]] || mkdir -p $prompt_dir || return
   [[ -w $root_dir && -w $prompt_dir ]] || return
 
@@ -5102,7 +5218,7 @@ function _p9k_clear_instant_prompt() {
 function _p9k_maybe_dump() {
   (( __p9k_dumps_enabled )) || return 0
 
-  _p9k__instant_prompt_sig=$_p9k__pwd:$P9K_SSH:${(%):-%#}
+  _p9k__instant_prompt_sig=$_p9k__cwd:$P9K_SSH:${(%):-%#}
 
   if (( ! _p9k__dump_pid )) || ! kill -0 $_p9k__dump_pid 2>/dev/null; then
     _p9k__dump_pid=0
@@ -5303,8 +5419,7 @@ _p9k_precmd_impl() {
     (( ++_p9k__prompt_idx ))
   fi
 
-  _p9k__pwd=${(%):-%/}
-  _p9k__pwd_a=${_p9k__pwd:A}
+  _p9k_fetch_cwd
 
   local f_compute
   for f_compute in "${_p9k__async_segments_compute[@]}"; do
@@ -5497,8 +5612,8 @@ _p9k_init_vars() {
   typeset -g  _p9k_w
   typeset -gi _p9k_dir_len
   typeset -gi _p9k_num_cpus
-  typeset -g  _p9k__pwd
-  typeset -g  _p9k__pwd_a
+  typeset -g  _p9k__cwd
+  typeset -g  _p9k__cwd_a
   typeset -g  _p9k__keymap
   typeset -g  _p9k__zle_state
   typeset -g  _p9k_uname
@@ -5872,12 +5987,12 @@ function _p9k_on_widget_zle-line-finish() {
   (( $+functions[p10k-on-post-prompt] )) && p10k-on-post-prompt
 
   if [[ -n $_p9k_transient_prompt ]]; then
-    if [[ $_POWERLEVEL9K_TRANSIENT_PROMPT == always || $_p9k__pwd == $_p9k__last_prompt_pwd ]]; then
+    if [[ $_POWERLEVEL9K_TRANSIENT_PROMPT == always || $_p9k__cwd == $_p9k__last_prompt_pwd ]]; then
       RPROMPT=
       PROMPT=$_p9k_transient_prompt
       __p9k_reset_state=2
     else
-      _p9k__last_prompt_pwd=$_p9k__pwd
+      _p9k__last_prompt_pwd=$_p9k__cwd
     fi
   fi
 
-- 
cgit v1.2.3