diff options
-rwxr-xr-x | functions/colors.zsh | 297 | ||||
-rwxr-xr-x | functions/utilities.zsh | 142 | ||||
-rwxr-xr-x | functions/vcs.zsh | 165 | ||||
-rwxr-xr-x | internal/icons.zsh (renamed from functions/icons.zsh) | 55 | ||||
-rwxr-xr-x | internal/p10k.zsh | 3070 | ||||
-rwxr-xr-x | powerlevel9k.zsh-theme | 17 |
6 files changed, 1759 insertions, 1987 deletions
diff --git a/functions/colors.zsh b/functions/colors.zsh deleted file mode 100755 index d8b7cbe8..00000000 --- a/functions/colors.zsh +++ /dev/null @@ -1,297 +0,0 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 -################################################################ -# Color functions -# This file holds some color-functions for -# the powerlevel9k-ZSH-theme -# https://github.com/bhilburn/powerlevel9k -################################################################ - -# https://jonasjacek.github.io/colors/ -# use color names by default to allow dark/light themes to adjust colors based on names -typeset -gAh __P9K_COLORS=( - black 000 - red 001 - green 002 - yellow 003 - blue 004 - magenta 005 - cyan 006 - white 007 - grey 008 - maroon 009 - lime 010 - olive 011 - navy 012 - fuchsia 013 - purple 013 - aqua 014 - teal 014 - silver 015 - grey0 016 - navyblue 017 - darkblue 018 - blue3 019 - blue3 020 - blue1 021 - darkgreen 022 - deepskyblue4 023 - deepskyblue4 024 - deepskyblue4 025 - dodgerblue3 026 - dodgerblue2 027 - green4 028 - springgreen4 029 - turquoise4 030 - deepskyblue3 031 - deepskyblue3 032 - dodgerblue1 033 - green3 034 - springgreen3 035 - darkcyan 036 - lightseagreen 037 - deepskyblue2 038 - deepskyblue1 039 - green3 040 - springgreen3 041 - springgreen2 042 - cyan3 043 - darkturquoise 044 - turquoise2 045 - green1 046 - springgreen2 047 - springgreen1 048 - mediumspringgreen 049 - cyan2 050 - cyan1 051 - darkred 052 - deeppink4 053 - purple4 054 - purple4 055 - purple3 056 - blueviolet 057 - orange4 058 - grey37 059 - mediumpurple4 060 - slateblue3 061 - slateblue3 062 - royalblue1 063 - chartreuse4 064 - darkseagreen4 065 - paleturquoise4 066 - steelblue 067 - steelblue3 068 - cornflowerblue 069 - chartreuse3 070 - darkseagreen4 071 - cadetblue 072 - cadetblue 073 - skyblue3 074 - steelblue1 075 - chartreuse3 076 - palegreen3 077 - seagreen3 078 - aquamarine3 079 - mediumturquoise 080 - steelblue1 081 - chartreuse2 082 - seagreen2 083 - seagreen1 084 - seagreen1 085 - aquamarine1 086 - darkslategray2 087 - darkred 088 - deeppink4 089 - darkmagenta 090 - darkmagenta 091 - darkviolet 092 - purple 093 - orange4 094 - lightpink4 095 - plum4 096 - mediumpurple3 097 - mediumpurple3 098 - slateblue1 099 - yellow4 100 - wheat4 101 - grey53 102 - lightslategrey 103 - mediumpurple 104 - lightslateblue 105 - yellow4 106 - darkolivegreen3 107 - darkseagreen 108 - lightskyblue3 109 - lightskyblue3 110 - skyblue2 111 - chartreuse2 112 - darkolivegreen3 113 - palegreen3 114 - darkseagreen3 115 - darkslategray3 116 - skyblue1 117 - chartreuse1 118 - lightgreen 119 - lightgreen 120 - palegreen1 121 - aquamarine1 122 - darkslategray1 123 - red3 124 - deeppink4 125 - mediumvioletred 126 - magenta3 127 - darkviolet 128 - purple 129 - darkorange3 130 - indianred 131 - hotpink3 132 - mediumorchid3 133 - mediumorchid 134 - mediumpurple2 135 - darkgoldenrod 136 - lightsalmon3 137 - rosybrown 138 - grey63 139 - mediumpurple2 140 - mediumpurple1 141 - gold3 142 - darkkhaki 143 - navajowhite3 144 - grey69 145 - lightsteelblue3 146 - lightsteelblue 147 - yellow3 148 - darkolivegreen3 149 - darkseagreen3 150 - darkseagreen2 151 - lightcyan3 152 - lightskyblue1 153 - greenyellow 154 - darkolivegreen2 155 - palegreen1 156 - darkseagreen2 157 - darkseagreen1 158 - paleturquoise1 159 - red3 160 - deeppink3 161 - deeppink3 162 - magenta3 163 - magenta3 164 - magenta2 165 - darkorange3 166 - indianred 167 - hotpink3 168 - hotpink2 169 - orchid 170 - mediumorchid1 171 - orange3 172 - lightsalmon3 173 - lightpink3 174 - pink3 175 - plum3 176 - violet 177 - gold3 178 - lightgoldenrod3 179 - tan 180 - mistyrose3 181 - thistle3 182 - plum2 183 - yellow3 184 - khaki3 185 - lightgoldenrod2 186 - lightyellow3 187 - grey84 188 - lightsteelblue1 189 - yellow2 190 - darkolivegreen1 191 - darkolivegreen1 192 - darkseagreen1 193 - honeydew2 194 - lightcyan1 195 - red1 196 - deeppink2 197 - deeppink1 198 - deeppink1 199 - magenta2 200 - magenta1 201 - orangered1 202 - indianred1 203 - indianred1 204 - hotpink 205 - hotpink 206 - mediumorchid1 207 - darkorange 208 - salmon1 209 - lightcoral 210 - palevioletred1 211 - orchid2 212 - orchid1 213 - orange1 214 - sandybrown 215 - lightsalmon1 216 - lightpink1 217 - pink1 218 - plum1 219 - gold1 220 - lightgoldenrod2 221 - lightgoldenrod2 222 - navajowhite1 223 - mistyrose1 224 - thistle1 225 - yellow1 226 - lightgoldenrod1 227 - khaki1 228 - wheat1 229 - cornsilk1 230 - grey100 231 - grey3 232 - grey7 233 - grey11 234 - grey15 235 - grey19 236 - grey23 237 - grey27 238 - grey30 239 - grey35 240 - grey39 241 - grey42 242 - grey46 243 - grey50 244 - grey54 245 - grey58 246 - grey62 247 - grey66 248 - grey70 249 - grey74 250 - grey78 251 - grey82 252 - grey85 253 - grey89 254 - grey93 255 -) - -# For user convenience: type `getColorCode background` or `getColorCode foreground` to see -# the list of predefined colors. -function getColorCode() { - if (( ARGC == 1 )); then - case $1 in - foreground) - local k - for k in "${(k@)__P9K_COLORS}"; do - local v=${__P9K_COLORS[$k]} - print -P "%F{$v}$v - $k%f" - done - return - ;; - background) - local k - for k in "${(k@)__P9K_COLORS}"; do - local v=${__P9K_COLORS[$k]} - print -P "%K{$v}$v - $k%k" - done - return - ;; - esac - fi - echo "Usage: getColorCode background|foreground" >&2 - return 1 -} diff --git a/functions/utilities.zsh b/functions/utilities.zsh deleted file mode 100755 index 5d32370c..00000000 --- a/functions/utilities.zsh +++ /dev/null @@ -1,142 +0,0 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 -################################################################ -# Utility functions -# This file holds some utility-functions for -# the powerlevel9k-ZSH-theme -# https://github.com/bhilburn/powerlevel9k -################################################################ - -# Usage: set_default [OPTION]... NAME [VALUE]... -# -# Options are the same as in `typeset`. -function set_default() { - emulate -L zsh - local -a flags=(-g) - while true; do - case $1 in - --) shift; break;; - -*) flags+=$1; shift;; - *) break; - esac - done - - local varname=$1 - shift - if [[ -n ${(tP)varname} ]]; then - typeset $flags $varname - elif [[ "$flags" == *[aA]* ]]; then - eval "typeset ${(@q)flags} ${(q)varname}=(${(qq)@})" - else - typeset $flags $varname="$*" - fi -} - -function _p9k_g_expand() { - (( $+parameters[$1] )) || return - local -a ts=("${=$(typeset -p $1)}") - shift ts - local x - for x in "${ts[@]}"; do - [[ $x == -* ]] || break - # Don't change readonly variables. Ideally, we shouldn't modify any variables at all, - # but for now this will do. - [[ $x == -*r* ]] && return - done - typeset -g $1=${(g::)${(P)1}} -} - -# If we execute `print -P $1`, how many characters will be printed on the last line? -# Assumes that `%{%}` and `%G` don't lie. -# -# _p9k_prompt_length '' => 0 -# _p9k_prompt_length 'abc' => 3 -# _p9k_prompt_length $'abc\nxy' => 2 -# _p9k_prompt_length $'\t' => 8 -# _p9k_prompt_length '%F{red}abc' => 3 -# _p9k_prompt_length $'%{a\b%Gb%}' => 1 -function _p9k_prompt_length() { - emulate -L zsh - local COLUMNS=1024 - local -i x y=$#1 m - if (( y )); then - while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do - x=y - (( y *= 2 )); - done - local xy - while (( y > x + 1 )); do - m=$(( x + (y - x) / 2 )) - typeset ${${(%):-$1%$m(l.x.y)}[-1]}=$m - done - fi - _P9K_RETVAL=$x -} - -typeset -g _P9K_BYTE_SUFFIX=('B' 'K' 'M' 'G' 'T' 'P' 'E' 'Z' 'Y') - -# 42 => 42B -# 1536 => 1.5K -function _p9k_human_readable_bytes() { - typeset -F 2 n=$1 - local suf - for suf in $_P9K_BYTE_SUFFIX; do - (( n < 100 )) && break - (( n /= 1024 )) - done - _P9K_RETVAL=$n$suf -} - -# Determine if the passed segment is used in the prompt -# -# Pass the name of the segment to this function to test for its presence in -# either the LEFT or RIGHT prompt arrays. -# * $1: The segment to be tested. -segment_in_use() { - local key=$1 - [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)${key}]}" || - -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)${key}_joined]}" || - -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)${key}]}" || - -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)${key}_joined]}" ]] -} - -function _p9k_parse_ip() { - local desiredInterface=${1:-'^[^ ]+'} - - if [[ $OS == OSX ]]; then - [[ -x /sbin/ifconfig ]] || return - local rawInterfaces && rawInterfaces="$(/sbin/ifconfig -l 2>/dev/null)" || return - local -a interfaces=(${(A)=rawInterfaces}) - local pattern="${desiredInterface}[^ ]?" - local -a relevantInterfaces - for rawInterface in $interfaces; do - [[ "$rawInterface" =~ $pattern ]] && relevantInterfaces+=$MATCH - done - local newline=$'\n' - local interfaceName interface - for interfaceName in $relevantInterfaces; do - interface="$(/sbin/ifconfig $interfaceName 2>/dev/null)" || continue - [[ "${interface}" =~ "lo[0-9]*" ]] && continue - if [[ "${interface//${newline}/}" =~ "<([^>]*)>(.*)inet[ ]+([^ ]*)" ]]; then - local ipFound="${match[3]}" - local -a interfaceStates=(${(s:,:)match[1]}) - if (( ${interfaceStates[(I)UP]} )); then - _P9K_RETVAL=$ipFound - return - fi - fi - done - else - [[ -x /sbin/ip ]] || return - local -a interfaces=( "${(f)$(/sbin/ip -brief -4 a show 2>/dev/null)}" ) - local pattern="^${desiredInterface}[[:space:]]+UP[[:space:]]+([^/ ]+)" - local interface - for interface in "${(@)interfaces}"; do - if [[ "$interface" =~ $pattern ]]; then - _P9K_RETVAL=$match[1] - return - fi - done - fi - - return 1 -} diff --git a/functions/vcs.zsh b/functions/vcs.zsh deleted file mode 100755 index d89525fd..00000000 --- a/functions/vcs.zsh +++ /dev/null @@ -1,165 +0,0 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 -################################################################ -# vcs -# This file holds supplemental VCS functions -# for the powerlevel9k-ZSH-theme -# https://github.com/bhilburn/powerlevel9k -################################################################ - -set_default POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY false -function +vi-git-untracked() { - [[ -z "${vcs_comm[gitdir]}" || "${vcs_comm[gitdir]}" == "." ]] && return - - # get the root for the current repo or submodule - local repoTopLevel="$(command git rev-parse --show-toplevel 2> /dev/null)" - # dump out if we're outside a git repository (which includes being in the .git folder) - [[ $? != 0 || -z $repoTopLevel ]] && return - - local untrackedFiles=$(command git ls-files --others --exclude-standard "${repoTopLevel}" 2> /dev/null) - - if [[ -z $untrackedFiles && "$POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY" == "true" ]]; then - untrackedFiles+=$(command git submodule foreach --quiet --recursive 'command git ls-files --others --exclude-standard' 2> /dev/null) - fi - - [[ -z $untrackedFiles ]] && return - - hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" - VCS_WORKDIR_HALF_DIRTY=true -} - -function +vi-git-aheadbehind() { - local ahead behind - local -a gitstatus - - # for git prior to 1.7 - # ahead=$(command git rev-list origin/${hook_com[branch]}..HEAD | wc -l) - ahead=$(command git rev-list --count "${hook_com[branch]}"@{upstream}..HEAD 2>/dev/null) - (( ahead )) && gitstatus+=( " $(print_icon 'VCS_OUTGOING_CHANGES_ICON')${ahead// /}" ) - - # for git prior to 1.7 - # behind=$(command git rev-list HEAD..origin/${hook_com[branch]} | wc -l) - behind=$(command git rev-list --count HEAD.."${hook_com[branch]}"@{upstream} 2>/dev/null) - (( behind )) && gitstatus+=( " $(print_icon 'VCS_INCOMING_CHANGES_ICON')${behind// /}" ) - - hook_com[misc]+=${(j::)gitstatus} -} - -function +vi-git-remotebranch() { - local remote - local branch_name="${hook_com[branch]}" - - # Are we on a remote-tracking branch? - remote=${$(command git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)/refs\/(remotes|heads)\/} - - if [[ -n "$POWERLEVEL9K_VCS_SHORTEN_LENGTH" ]] && [[ -n "$POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH" ]]; then - if [ ${#hook_com[branch]} -gt ${POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH} ] && [ ${#hook_com[branch]} -gt ${POWERLEVEL9K_VCS_SHORTEN_LENGTH} ]; then - case "$POWERLEVEL9K_VCS_SHORTEN_STRATEGY" in - truncate_middle) - hook_com[branch]="${branch_name:0:$POWERLEVEL9K_VCS_SHORTEN_LENGTH}${POWERLEVEL9K_VCS_SHORTEN_DELIMITER}${branch_name: -$POWERLEVEL9K_VCS_SHORTEN_LENGTH}" - ;; - truncate_from_right) - hook_com[branch]="${branch_name:0:$POWERLEVEL9K_VCS_SHORTEN_LENGTH}${POWERLEVEL9K_VCS_SHORTEN_DELIMITER}" - ;; - esac - fi - fi - - hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${hook_com[branch]}" - # Always show the remote - #if [[ -n ${remote} ]] ; then - # Only show the remote if it differs from the local - if [[ -n ${remote} ]] && [[ "${remote#*/}" != "${branch_name}" ]] ; then - hook_com[branch]+="$(print_icon 'VCS_REMOTE_BRANCH_ICON')${remote// /}" - fi -} - -set_default POWERLEVEL9K_VCS_HIDE_TAGS false -function +vi-git-tagname() { - if [[ "$POWERLEVEL9K_VCS_HIDE_TAGS" == "false" ]]; then - # If we are on a tag, append the tagname to the current branch string. - local tag - tag=$(command git describe --tags --exact-match HEAD 2>/dev/null) - - if [[ -n "${tag}" ]] ; then - # There is a tag that points to our current commit. Need to determine if we - # are also on a branch, or are in a DETACHED_HEAD state. - if [[ -z $(command git symbolic-ref HEAD 2>/dev/null) ]]; then - # DETACHED_HEAD state. We want to append the tag name to the commit hash - # and print it. Unfortunately, `vcs_info` blows away the hash when a tag - # exists, so we have to manually retrieve it and clobber the branch - # string. - local revision - revision=$(command git rev-list -n 1 --abbrev-commit --abbrev=${POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH} HEAD) - hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${revision} $(print_icon 'VCS_TAG_ICON')${tag}" - else - # We are on both a tag and a branch; print both by appending the tag name. - hook_com[branch]+=" $(print_icon 'VCS_TAG_ICON')${tag}" - fi - fi - fi -} - -# Show count of stashed changes -# Port from https://github.com/whiteinge/dotfiles/blob/5dfd08d30f7f2749cfc60bc55564c6ea239624d9/.zsh_shouse_prompt#L268 -function +vi-git-stash() { - if [[ -s "${vcs_comm[gitdir]}/logs/refs/stash" ]] ; then - local -a stashes=( "${(@f)"$(<${vcs_comm[gitdir]}/logs/refs/stash)"}" ) - hook_com[misc]+=" $(print_icon 'VCS_STASH_ICON')${#stashes}" - fi -} - -function +vi-hg-bookmarks() { - if [[ -n "${hgbmarks[@]}" ]]; then - hook_com[hg-bookmark-string]=" $(print_icon 'VCS_BOOKMARK_ICON')${hgbmarks[@]}" - - # To signal that we want to use the sting we just generated, set the special - # variable `ret' to something other than the default zero: - ret=1 - return 0 - fi -} - -function +vi-vcs-detect-changes() { - if [[ "${hook_com[vcs]}" == "git" ]]; then - - local remote=$(command git ls-remote --get-url 2> /dev/null) - if [[ "$remote" =~ "github" ]] then - vcs_visual_identifier='VCS_GIT_GITHUB_ICON' - elif [[ "$remote" =~ "bitbucket" ]] then - vcs_visual_identifier='VCS_GIT_BITBUCKET_ICON' - elif [[ "$remote" =~ "stash" ]] then - vcs_visual_identifier='VCS_GIT_BITBUCKET_ICON' - elif [[ "$remote" =~ "gitlab" ]] then - vcs_visual_identifier='VCS_GIT_GITLAB_ICON' - else - vcs_visual_identifier='VCS_GIT_ICON' - fi - - elif [[ "${hook_com[vcs]}" == "hg" ]]; then - vcs_visual_identifier='VCS_HG_ICON' - elif [[ "${hook_com[vcs]}" == "svn" ]]; then - vcs_visual_identifier='VCS_SVN_ICON' - fi - - if [[ -n "${hook_com[staged]}" ]] || [[ -n "${hook_com[unstaged]}" ]]; then - VCS_WORKDIR_DIRTY=true - else - VCS_WORKDIR_DIRTY=false - fi -} - -function +vi-svn-detect-changes() { - local svn_status="$(svn status)" - if [[ -n "$(echo "$svn_status" | \grep \^\?)" ]]; then - hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" - VCS_WORKDIR_HALF_DIRTY=true - fi - if [[ -n "$(echo "$svn_status" | \grep \^\M)" ]]; then - hook_com[unstaged]+=" $(print_icon 'VCS_UNSTAGED_ICON')" - VCS_WORKDIR_DIRTY=true - fi - if [[ -n "$(echo "$svn_status" | \grep \^\A)" ]]; then - hook_com[staged]+=" $(print_icon 'VCS_STAGED_ICON')" - VCS_WORKDIR_DIRTY=true - fi -} diff --git a/functions/icons.zsh b/internal/icons.zsh index 64f6a04e..658c7703 100755 --- a/functions/icons.zsh +++ b/internal/icons.zsh @@ -1,34 +1,15 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8 -################################################################ -# icons -# This file holds the icon definitions and -# icon-functions for the powerlevel9k-ZSH-theme -# https://github.com/bhilburn/powerlevel9k -################################################################ - -# These characters require the Powerline fonts to work properly. If you see -# boxes or bizarre characters below, your fonts are not correctly installed. If -# you do not want to install a special font, you can set `POWERLEVEL9K_MODE` to -# `compatible`. This shows all icons in regular symbols. - -# Initialize the icon list according to the user's `POWERLEVEL9K_MODE`. -typeset -gAH icons - -set_default POWERLEVEL9K_HIDE_BRANCH_ICON false -set_default POWERLEVEL9K_MODE "" - -typeset -gi _P9K_ICONS_INITIALIZED=0 +typeset -gA icons function _p9k_init_icons() { - (( _P9K_ICONS_INITIALIZED )) && return - _P9K_ICONS_INITIALIZED=1 + [[ $+_p9k_icon_mode == 1 && $_p9k_icon_mode == $POWERLEVEL9K_MODE ]] && return + typeset -g _p9k_icon_mode=$POWERLEVEL9K_MODE + + local LC_ALL=C.UTF-8 case $POWERLEVEL9K_MODE in 'flat'|'awesome-patched') # Awesome-Patched Font required! See: # https://github.com/gabrielelana/awesome-terminal-fonts/tree/patching-strategy/patched - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" icons=( RULER_CHAR $'\u2500' # ─ LEFT_SEGMENT_SEPARATOR $'\uE0B0' # @@ -131,8 +112,6 @@ function _p9k_init_icons() { 'awesome-fontconfig') # fontconfig with awesome-font required! See # https://github.com/gabrielelana/awesome-terminal-fonts - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" icons=( RULER_CHAR $'\u2500' # ─ LEFT_SEGMENT_SEPARATOR $'\uE0B0' # @@ -232,16 +211,12 @@ function _p9k_init_icons() { # mapped fontconfig with awesome-font required! See # https://github.com/gabrielelana/awesome-terminal-fonts # don't forget to source the font maps in your startup script - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" - if [ -z "$AWESOME_GLYPHS_LOADED" ]; then echo "Powerlevel9k warning: Awesome-Font mappings have not been loaded. Source a font mapping in your shell config, per the Awesome-Font docs (https://github.com/gabrielelana/awesome-terminal-fonts), Or use a different Powerlevel9k font configuration."; fi - icons=( RULER_CHAR $'\u2500' # ─ LEFT_SEGMENT_SEPARATOR $'\uE0B0' # @@ -337,8 +312,6 @@ function _p9k_init_icons() { # nerd-font patched (complete) font required! See # https://github.com/ryanoasis/nerd-fonts # http://nerdfonts.com/#cheat-sheet - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" icons=( RULER_CHAR $'\u2500' # ─ LEFT_SEGMENT_SEPARATOR $'\uE0B0' # @@ -437,8 +410,6 @@ function _p9k_init_icons() { *) # Powerline-Patched Font required! # See https://github.com/Lokaltog/powerline-fonts - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" icons=( RULER_CHAR $'\u2500' # ─ LEFT_SEGMENT_SEPARATOR $'\uE0B0' # @@ -539,30 +510,22 @@ function _p9k_init_icons() { # Override the above icon settings with any user-defined variables. case $POWERLEVEL9K_MODE in 'flat') - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" icons[LEFT_SEGMENT_SEPARATOR]='' icons[RIGHT_SEGMENT_SEPARATOR]='' icons[LEFT_SUBSEGMENT_SEPARATOR]='|' icons[RIGHT_SUBSEGMENT_SEPARATOR]='|' ;; 'compatible') - # Set the right locale to protect special characters - local LC_ALL="" LC_CTYPE="en_US.UTF-8" icons[LEFT_SEGMENT_SEPARATOR]=$'\u2B80' # ⮀ icons[RIGHT_SEGMENT_SEPARATOR]=$'\u2B82' # ⮂ icons[VCS_BRANCH_ICON]='@' ;; esac - - if [[ "$POWERLEVEL9K_HIDE_BRANCH_ICON" == true ]]; then - icons[VCS_BRANCH_ICON]='' - fi } -# Safety function for printing icons -# Prints the named icon, or if that icon is undefined, the string name. +# Sadly, this is a part of public API. Its use is emphatically discouraged. function print_icon() { + emulate -L zsh _p9k_init_icons local icon_name=$1 local var_name=POWERLEVEL9K_${icon_name} @@ -573,11 +536,13 @@ function print_icon() { fi } -# Get a list of configured icons +# Prints a list of configured icons. +# # * $1 string - If "original", then the original icons are printed, # otherwise "print_icon" is used, which takes the users # overrides into account. function get_icon_names() { + emulate -L zsh _p9k_init_icons # Iterate over a ordered list of keys of the icons array for key in ${(@kon)icons}; do diff --git a/internal/p10k.zsh b/internal/p10k.zsh index d6806bfc..8e6c4f0a 100755 --- a/internal/p10k.zsh +++ b/internal/p10k.zsh @@ -1,4 +1,4 @@ -if ! autoload -U is-at-least || ! is-at-least 5.1; then +if ! autoload -Uz is-at-least || ! is-at-least 5.1; then () { >&2 echo -E "You are using ZSH version $ZSH_VERSION. The minimum required version for Powerlevel10k is 5.1." >&2 echo -E "Type 'echo \$ZSH_VERSION' to see your current zsh version." @@ -9,7 +9,7 @@ if ! autoload -U is-at-least || ! is-at-least 5.1; then >&2 echo -E "The shell you are currently running is likely $cur." fi local other=${${:-zsh}:c} - if [[ -n $other ]] && $other -c 'autoload -U is-at-least && is-at-least 5.1' &>/dev/null; then + if [[ -n $other ]] && $other -c 'autoload -Uz is-at-least && is-at-least 5.1' &>/dev/null; then local other_v=$($other -c 'echo -E $ZSH_VERSION' 2>/dev/null) if [[ -n $other_v && $other_v != $ZSH_VERSION ]]; then >&2 echo -E "You have $other with version $other_v but this is not what you are using." @@ -27,25 +27,229 @@ if ! autoload -U is-at-least || ! is-at-least 5.1; then return 1 fi -source "${_p9k_installation_dir}/functions/utilities.zsh" -source "${_p9k_installation_dir}/functions/icons.zsh" -source "${_p9k_installation_dir}/functions/colors.zsh" -source "${_p9k_installation_dir}/functions/vcs.zsh" - -typeset -g _P9K_RETVAL -typeset -g _P9K_CACHE_KEY -typeset -ga _P9K_CACHE_VAL -typeset -gA _P9K_CACHE -typeset -ga _P9K_T -typeset -g _P9K_N -typeset -gi _P9K_I -typeset -g _P9K_BG -typeset -g _P9K_F - -# Specifies the maximum number of elements in the cache. When the cache grows over this limit, -# it gets cleared. This is meant to avoid memory leaks when a rogue prompt is filling the cache -# with data. -set_default -i POWERLEVEL9K_MAX_CACHE_SIZE 10000 +source "${__p9k_installation_dir}/internal/icons.zsh" + +# For compatibility with Powerlevel9k. It's not recommended to use mnemonic color +# names in the configuration except for colors 0-7 as these are standard. +typeset -grA __p9k_colors=( + black 000 red 001 green 002 yellow 003 + blue 004 magenta 005 cyan 006 white 007 + grey 008 maroon 009 lime 010 olive 011 + navy 012 fuchsia 013 aqua 014 teal 014 + silver 015 grey0 016 navyblue 017 darkblue 018 + blue3 020 blue1 021 darkgreen 022 deepskyblue4 025 + dodgerblue3 026 dodgerblue2 027 green4 028 springgreen4 029 + turquoise4 030 deepskyblue3 032 dodgerblue1 033 darkcyan 036 + lightseagreen 037 deepskyblue2 038 deepskyblue1 039 green3 040 + springgreen3 041 cyan3 043 darkturquoise 044 turquoise2 045 + green1 046 springgreen2 047 springgreen1 048 mediumspringgreen 049 + cyan2 050 cyan1 051 purple4 055 purple3 056 + blueviolet 057 grey37 059 mediumpurple4 060 slateblue3 062 + royalblue1 063 chartreuse4 064 paleturquoise4 066 steelblue 067 + steelblue3 068 cornflowerblue 069 darkseagreen4 071 cadetblue 073 + skyblue3 074 chartreuse3 076 seagreen3 078 aquamarine3 079 + mediumturquoise 080 steelblue1 081 seagreen2 083 seagreen1 085 + darkslategray2 087 darkred 088 darkmagenta 091 orange4 094 + lightpink4 095 plum4 096 mediumpurple3 098 slateblue1 099 + wheat4 101 grey53 102 lightslategrey 103 mediumpurple 104 + lightslateblue 105 yellow4 106 darkseagreen 108 lightskyblue3 110 + skyblue2 111 chartreuse2 112 palegreen3 114 darkslategray3 116 + skyblue1 117 chartreuse1 118 lightgreen 120 aquamarine1 122 + darkslategray1 123 deeppink4 125 mediumvioletred 126 darkviolet 128 + purple 129 mediumorchid3 133 mediumorchid 134 darkgoldenrod 136 + rosybrown 138 grey63 139 mediumpurple2 140 mediumpurple1 141 + darkkhaki 143 navajowhite3 144 grey69 145 lightsteelblue3 146 + lightsteelblue 147 darkolivegreen3 149 darkseagreen3 150 lightcyan3 152 + lightskyblue1 153 greenyellow 154 darkolivegreen2 155 palegreen1 156 + darkseagreen2 157 paleturquoise1 159 red3 160 deeppink3 162 + magenta3 164 darkorange3 166 indianred 167 hotpink3 168 + hotpink2 169 orchid 170 orange3 172 lightsalmon3 173 + lightpink3 174 pink3 175 plum3 176 violet 177 + gold3 178 lightgoldenrod3 179 tan 180 mistyrose3 181 + thistle3 182 plum2 183 yellow3 184 khaki3 185 + lightyellow3 187 grey84 188 lightsteelblue1 189 yellow2 190 + darkolivegreen1 192 darkseagreen1 193 honeydew2 194 lightcyan1 195 + red1 196 deeppink2 197 deeppink1 199 magenta2 200 + magenta1 201 orangered1 202 indianred1 204 hotpink 206 + mediumorchid1 207 darkorange 208 salmon1 209 lightcoral 210 + palevioletred1 211 orchid2 212 orchid1 213 orange1 214 + sandybrown 215 lightsalmon1 216 lightpink1 217 pink1 218 + plum1 219 gold1 220 lightgoldenrod2 222 navajowhite1 223 + mistyrose1 224 thistle1 225 yellow1 226 lightgoldenrod1 227 + khaki1 228 wheat1 229 cornsilk1 230 grey100 231 + grey3 232 grey7 233 grey11 234 grey15 235 + grey19 236 grey23 237 grey27 238 grey30 239 + grey35 240 grey39 241 grey42 242 grey46 243 + grey50 244 grey54 245 grey58 246 grey62 247 + grey66 248 grey70 249 grey74 250 grey78 251 + grey82 252 grey85 253 grey89 254 grey93 255) + +# For compatibility with Powerlevel9k. +# +# Type `getColorCode background` or `getColorCode foreground` to see the list of predefined colors. +function getColorCode() { + emulate -L zsh && setopt no_hist_expand extended_glob + if (( ARGC == 1 )); then + case $1 in + foreground) + local k + for k in "${(k@)__p9k_colors}"; do + local v=${__p9k_colors[$k]} + print -P "%F{$v}$v - $k%f" + done + return + ;; + background) + local k + for k in "${(k@)__p9k_colors}"; do + local v=${__p9k_colors[$k]} + print -P "%K{$v}$v - $k%k" + done + return + ;; + esac + fi + echo "Usage: getColorCode background|foreground" >&2 + return 1 +} + +# _p9k_declare <type> <uppercase-name> [default]... +function _p9k_declare() { + local -i set=$+parameters[$2] + (( ARGC > 2 || set )) || return 0 + case $1 in + -b) + if (( set )); then + [[ ${(P)2} == true ]] && typeset -gi _$2=1 || typeset -gi _$2=0 + else + typeset -gi _$2=$3 + fi + ;; + -a) + local -a v=(${(P)2}) + if (( set )); then + eval "typeset -ga _${(q)2}=(${(@qq)v})"; + else + if [[ $3 != '--' ]]; then + echo "internal error in _p9k_declare " "${(qqq)@}" >&2 + fi + eval "typeset -ga _${(q)2}=(${(@qq)*[4,-1]})" + fi + ;; + -i) + (( set )) && typeset -gi _$2=$2 || typeset -gi _$2=$3 + ;; + -F) + (( set )) && typeset -gF _$2=$2 || typeset -gF _$2=$3 + ;; + -s) + (( set )) && typeset -g _$2=${(P)2} || typeset -g _$2=$3 + ;; + -e) + if (( set )); then + local v=${(P)2} + typeset -g _$2=${(g::)v} + else + typeset -g _$2=${(g::)3} + fi + ;; + *) + echo "internal error in _p9k_declare " "${(qqq)@}" >&2 + esac +} + +# If we execute `print -P $1`, how many characters will be printed on the last line? +# Assumes that `%{%}` and `%G` don't lie. +# +# _p9k_prompt_length '' => 0 +# _p9k_prompt_length 'abc' => 3 +# _p9k_prompt_length $'abc\nxy' => 2 +# _p9k_prompt_length $'\t' => 8 +# _p9k_prompt_length '%F{red}abc' => 3 +# _p9k_prompt_length $'%{a\b%Gb%}' => 1 +function _p9k_prompt_length() { + emulate -L zsh && setopt no_hist_expand extended_glob + local COLUMNS=1024 + local -i x y=$#1 m + if (( y )); then + while (( ${${(%):-$1%$y(l.1.0)}[-1]} )); do + x=y + (( y *= 2 )); + done + local xy + while (( y > x + 1 )); do + m=$(( x + (y - x) / 2 )) + typeset ${${(%):-$1%$m(l.x.y)}[-1]}=$m + done + fi + _p9k_ret=$x +} + +typeset -gr __p9k_byte_suffix=('B' 'K' 'M' 'G' 'T' 'P' 'E' 'Z' 'Y') + +# 42 => 42B +# 1536 => 1.5K +function _p9k_human_readable_bytes() { + typeset -F 2 n=$1 + local suf + for suf in $__p9k_byte_suffix; do + (( n < 100 )) && break + (( n /= 1024 )) + done + _p9k_ret=$n$suf +} + +# Determine if the passed segment is used in the prompt +# +# Pass the name of the segment to this function to test for its presence in +# either the LEFT or RIGHT prompt arrays. +# * $1: The segment to be tested. +segment_in_use() { + (( $_POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(I)$1(|_joined)] || + $_POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(I)$1(|_joined)] )) +} + +function _p9k_parse_ip() { + local desiredInterface=${1:-'^[^ ]+'} + + if [[ $_p9k_os == OSX ]]; then + [[ -x /sbin/ifconfig ]] || return + local rawInterfaces && rawInterfaces="$(/sbin/ifconfig -l 2>/dev/null)" || return + local -a interfaces=(${(A)=rawInterfaces}) + local pattern="${desiredInterface}[^ ]?" + local -a relevantInterfaces + for rawInterface in $interfaces; do + [[ "$rawInterface" =~ $pattern ]] && relevantInterfaces+=$MATCH + done + local newline=$'\n' + local interfaceName interface + for interfaceName in $relevantInterfaces; do + interface="$(/sbin/ifconfig $interfaceName 2>/dev/null)" || continue + [[ "${interface}" =~ "lo[0-9]*" ]] && continue + if [[ "${interface//${newline}/}" =~ "<([^>]*)>(.*)inet[ ]+([^ ]*)" ]]; then + local ipFound="${match[3]}" + local -a interfaceStates=(${(s:,:)match[1]}) + if (( ${interfaceStates[(I)UP]} )); then + _p9k_ret=$ipFound + return + fi + fi + done + else + [[ -x /sbin/ip ]] || return + local -a interfaces=( "${(f)$(/sbin/ip -brief -4 a show 2>/dev/null)}" ) + local pattern="^${desiredInterface}[[:space:]]+UP[[:space:]]+([^/ ]+)" + local interface + for interface in "${(@)interfaces}"; do + if [[ "$interface" =~ $pattern ]]; then + _p9k_ret=$match[1] + return + fi + done + fi + + return 1 +} # Caching allows storing array-to-array associations. It should be used like this: # @@ -53,7 +257,7 @@ set_default -i POWERLEVEL9K_MAX_CACHE_SIZE 10000 # # Compute val1 and val2 and then store them in the cache. # _p9k_cache_set "$val1" "$val2" # fi -# # Here ${_P9K_CACHE_VAL[1]} and ${_P9K_CACHE_VAL[2]} are $val1 and $val2 respectively. +# # Here ${_p9k_cache_val[1]} and ${_p9k_cache_val[2]} are $val1 and $val2 respectively. # # Limitations: # @@ -63,147 +267,143 @@ set_default -i POWERLEVEL9K_MAX_CACHE_SIZE 10000 # and _p9k_cache_set. _p9k_cache_set() { # Uncomment to see cache misses. - # echo "caching: ${(@0q)_P9K_CACHE_KEY} => (${(q)@})" >&2 - _P9K_CACHE[$_P9K_CACHE_KEY]="${(pj:\0:)*}0" - _P9K_CACHE_VAL=("$@") - (( $#_P9K_CACHE < POWERLEVEL9K_MAX_CACHE_SIZE )) || typeset -gAH _P9K_CACHE=() + # echo "caching: ${(@0q)_p9k_cache_key} => (${(q)@})" >&2 + _p9k_cache[$_p9k_cache_key]="${(pj:\0:)*}0" + _p9k_cache_val=("$@") } _p9k_cache_get() { - _P9K_CACHE_KEY="${(pj:\0:)*}" - local v=$_P9K_CACHE[$_P9K_CACHE_KEY] - [[ -n $v ]] && _P9K_CACHE_VAL=("${(@0)${v[1,-2]}}") + _p9k_cache_key="${(pj:\0:)*}" + local v=$_p9k_cache[$_p9k_cache_key] + [[ -n $v ]] && _p9k_cache_val=("${(@0)${v[1,-2]}}") } -typeset -ga _P9K_LEFT_JOIN=(1) -typeset -ga _P9K_RIGHT_JOIN=(1) - # _p9k_param prompt_foo_BAR BACKGROUND red _p9k_param() { local key="_p9k_param ${(pj:\0:)*}" - _P9K_RETVAL=$_P9K_CACHE[key] - if [[ -n $_P9K_RETVAL ]]; then - _P9K_RETVAL[-1,-1]='' + _p9k_ret=$_p9k_cache[$key] + if [[ -n $_p9k_ret ]]; then + _p9k_ret[-1,-1]='' else if [[ $1 == (#b)prompt_([a-z0-9_]#)(*) ]]; then local var=POWERLEVEL9K_${(U)match[1]}$match[2]_$2 if (( $+parameters[$var] )); then - _P9K_RETVAL=${(P)var} + _p9k_ret=${(P)var} else var=POWERLEVEL9K_${(U)match[1]%_}_$2 if (( $+parameters[$var] )); then - _P9K_RETVAL=${(P)var} + _p9k_ret=${(P)var} else var=POWERLEVEL9K_$2 if (( $+parameters[$var] )); then - _P9K_RETVAL=${(P)var} + _p9k_ret=${(P)var} else - _P9K_RETVAL=$3 + _p9k_ret=$3 fi fi fi else local var=POWERLEVEL9K_$2 if (( $+parameters[$var] )); then - _P9K_RETVAL=${(P)var} + _p9k_ret=${(P)var} else - _P9K_RETVAL=$3 + _p9k_ret=$3 fi fi - _P9K_CACHE[$key]=${_P9K_RETVAL}. + _p9k_cache[$key]=${_p9k_ret}. fi } # _p9k_get_icon prompt_foo_BAR BAZ_ICON quix _p9k_get_icon() { local key="_p9k_param ${(pj:\0:)*}" - _P9K_RETVAL=$_P9K_CACHE[key] - if [[ -n $_P9K_RETVAL ]]; then - _P9K_RETVAL[-1,-1]='' + _p9k_ret=$_p9k_cache[$key] + if [[ -n $_p9k_ret ]]; then + _p9k_ret[-1,-1]='' else if [[ $2 == $'\1'* ]]; then - _P9K_RETVAL=${2[2,-1]} + _p9k_ret=${2[2,-1]} else _p9k_param "$@" ${icons[$2]-$'\1'$3} - if [[ $_P9K_RETVAL == $'\1'* ]]; then - _P9K_RETVAL=${_P9K_RETVAL[2,-1]} + if [[ $_p9k_ret == $'\1'* ]]; then + _p9k_ret=${_p9k_ret[2,-1]} else - _P9K_RETVAL=${(g::)_P9K_RETVAL} - [[ $_P9K_RETVAL != $'\b'? ]] || _P9K_RETVAL="%{$_P9K_RETVAL%}" # penance for past sins + _p9k_ret=${(g::)_p9k_ret} + [[ $_p9k_ret != $'\b'? ]] || _p9k_ret="%{$_p9k_ret%}" # penance for past sins fi fi - _P9K_CACHE[$key]=${_P9K_RETVAL}. + _p9k_cache[$key]=${_p9k_ret}. fi } _p9k_translate_color() { if [[ $1 == <-> ]]; then # decimal color code: 255 - _P9K_RETVAL=$1 + _p9k_ret=$1 elif [[ $1 == '#'[[:xdigit:]]## ]]; then # hexademical color code: #ffffff - _P9K_RETVAL=$1 + _p9k_ret=$1 else # named color: red # Strip prifixes if there are any. - _P9K_RETVAL=$__P9K_COLORS[${${${1#bg-}#fg-}#br}] + _p9k_ret=$__p9k_colors[${${${1#bg-}#fg-}#br}] fi } # _p9k_param prompt_foo_BAR BACKGROUND red _p9k_color() { local key="_p9k_color ${(pj:\0:)*}" - _P9K_RETVAL=$_P9K_CACHE[key] - if [[ -n $_P9K_RETVAL ]]; then - _P9K_RETVAL[-1,-1]='' + _p9k_ret=$_p9k_cache[$key] + if [[ -n $_p9k_ret ]]; then + _p9k_ret[-1,-1]='' else _p9k_param "$@" - _p9k_translate_color $_P9K_RETVAL - _P9K_CACHE[$key]=${_P9K_RETVAL}. + _p9k_translate_color $_p9k_ret + _p9k_cache[$key]=${_p9k_ret}. fi } # _p9k_vcs_color CLEAN REMOTE_BRANCH _p9k_vcs_style() { local key="_p9k_vcs_color ${(pj:\0:)*}" - _P9K_RETVAL=$_P9K_CACHE[key] - if [[ -n $_P9K_RETVAL ]]; then - _P9K_RETVAL[-1,-1]='' + _p9k_ret=$_p9k_cache[$key] + if [[ -n $_p9k_ret ]]; then + _p9k_ret[-1,-1]='' else local style=%b # TODO: support bold - _p9k_color prompt_vcs_$1 BACKGROUND "${vcs_states[$1]}" - _p9k_background $_P9K_RETVAL - style+=$_P9K_RETVAL + _p9k_color prompt_vcs_$1 BACKGROUND "${__p9k_vcs_states[$1]}" + _p9k_background $_p9k_ret + style+=$_p9k_ret local var=POWERLEVEL9K_VCS_${1}_${2}FORMAT_FOREGROUND if (( $+parameters[$var] )); then - _P9K_RETVAL=${(P)var} + _p9k_ret=${(P)var} else var=POWERLEVEL9K_VCS_${2}FORMAT_FOREGROUND if (( $+parameters[$var] )); then - _P9K_RETVAL=${(P)var} + _p9k_ret=${(P)var} else - _p9k_color prompt_vcs_$1 FOREGROUND "$DEFAULT_COLOR" + _p9k_color prompt_vcs_$1 FOREGROUND "$_p9k_color1" fi fi - _p9k_foreground $_P9K_RETVAL - _P9K_RETVAL=$style$_P9K_RETVAL - _P9K_CACHE[$key]=${_P9K_RETVAL}. + _p9k_foreground $_p9k_ret + _p9k_ret=$style$_p9k_ret + _p9k_cache[$key]=${_p9k_ret}. fi } _p9k_background() { - [[ -n $1 ]] && _P9K_RETVAL="%K{$1}" || _P9K_RETVAL="%k" + [[ -n $1 ]] && _p9k_ret="%K{$1}" || _p9k_ret="%k" } _p9k_foreground() { - [[ -n $1 ]] && _P9K_RETVAL="%F{$1}" || _P9K_RETVAL="%f" + [[ -n $1 ]] && _p9k_ret="%F{$1}" || _p9k_ret="%f" } _p9k_escape_rcurly() { - _P9K_RETVAL=${${1//\\/\\\\}//\}/\\\}} + _p9k_ret=${${1//\\/\\\\}//\}/\\\}} } _p9k_escape() { - [[ $1 == *["~!#\$^&*()\\\"'<>?{}[]"]* ]] && _P9K_RETVAL="\${(Q)\${:-${(qqq)${(q)1}}}}" || _P9K_RETVAL=$1 + [[ $1 == *["~!#\$^&*()\\\"'<>?{}[]"]* ]] && _p9k_ret="\${(Q)\${:-${(qqq)${(q)1}}}}" || _p9k_ret=$1 } # * $1: Name of the function that was originally invoked. @@ -216,104 +416,103 @@ _p9k_escape() { # * $7: If not empty but becomes empty after parameter expansion and process substitution, # the segment isn't rendered. # * $8: Content. -set_default POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS " " left_prompt_segment() { if ! _p9k_cache_get "$0" "$1" "$2" "$3" "$4" "$5"; then _p9k_color $1 BACKGROUND $3 - local bg_color=$_P9K_RETVAL + local bg_color=$_p9k_ret _p9k_background $bg_color - local bg=$_P9K_RETVAL + local bg=$_p9k_ret _p9k_color $1 FOREGROUND $4 - local fg_color=$_P9K_RETVAL + local fg_color=$_p9k_ret _p9k_foreground $fg_color - local fg=$_P9K_RETVAL + local fg=$_p9k_ret _p9k_get_icon $1 LEFT_SEGMENT_SEPARATOR - local sep=$_P9K_RETVAL - _p9k_escape $_P9K_RETVAL - local sep_=$_P9K_RETVAL + local sep=$_p9k_ret + _p9k_escape $_p9k_ret + local sep_=$_p9k_ret _p9k_get_icon $1 LEFT_SUBSEGMENT_SEPARATOR - _p9k_escape $_P9K_RETVAL - local subsep_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + local subsep_=$_p9k_ret local icon_ if [[ -n $5 ]]; then _p9k_get_icon $1 $5 - _p9k_escape $_P9K_RETVAL - icon_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + icon_=$_p9k_ret fi _p9k_get_icon $1 LEFT_PROMPT_FIRST_SEGMENT_START_SYMBOL - local start_sep=$_P9K_RETVAL + local start_sep=$_p9k_ret [[ -n $start_sep ]] && start_sep="%b%k%F{$bg_color}$start_sep" _p9k_get_icon $1 LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL $sep - _p9k_escape $_P9K_RETVAL - local end_sep_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + local end_sep_=$_p9k_ret local style=%b$bg$fg _p9k_escape_rcurly $style - local style_=$_P9K_RETVAL + local style_=$_p9k_ret - _p9k_get_icon $1 WHITESPACE_BETWEEN_LEFT_SEGMENTS - local space=$_P9K_RETVAL + _p9k_get_icon $1 WHITESPACE_BETWEEN_LEFT_SEGMENTS ' ' + local space=$_p9k_ret _p9k_get_icon $1 LEFT_LEFT_WHITESPACE $space - local left_space=$_P9K_RETVAL + local left_space=$_p9k_ret [[ $left_space == *%* ]] && left_space+=$style _p9k_get_icon $1 LEFT_RIGHT_WHITESPACE $space - _p9k_escape $_P9K_RETVAL - local right_space_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + local right_space_=$_p9k_ret [[ $right_space_ == *%* ]] && right_space_+=$style_ - local s='<_P9K_S>' ss='<_P9K_SS>' + local s='<_p9k_s>' ss='<_p9k_ss>' # Segment separator logic: # - # if [[ $_P9K_BG == NONE ]]; then + # if [[ $_p9k_bg == NONE ]]; then # 1 # elif (( joined )); then # 2 - # elif [[ $bg_color == (${_P9K_BG}|${_P9K_BG:-0}) ]]; then + # elif [[ $bg_color == (${_p9k_bg}|${_p9k_bg:-0}) ]]; then # 3 # else # 4 # fi - local t=$#_P9K_T - _P9K_T+=$start_sep$style$left_space # 1 - _P9K_T+=$style # 2 + local t=$#_p9k_t + _p9k_t+=$start_sep$style$left_space # 1 + _p9k_t+=$style # 2 if [[ -n $fg_color && $fg_color == $bg_color ]]; then - if [[ $fg_color == $DEFAULT_COLOR ]]; then - _p9k_foreground $DEFAULT_COLOR_INVERTED + if [[ $fg_color == $_p9k_color1 ]]; then + _p9k_foreground $_p9k_color2 else - _p9k_foreground $DEFAULT_COLOR + _p9k_foreground $_p9k_color1 fi - _P9K_T+=%b$bg$_P9K_RETVAL$ss$style$left_space # 3 + _p9k_t+=%b$bg$_p9k_ret$ss$style$left_space # 3 else - _P9K_T+=%b$bg$fg$ss$style$left_space # 3 + _p9k_t+=%b$bg$fg$ss$style$left_space # 3 fi - _P9K_T+=%b$bg$s$style$left_space # 4 + _p9k_t+=%b$bg$s$style$left_space # 4 - local join="_P9K_I>=$_P9K_LEFT_JOIN[$2]" + local join="_p9k_i>=$_p9k_left_join[$2]" _p9k_param $1 SELF_JOINED false - [[ $_P9K_RETVAL == false ]] && join+="&&_P9K_I<$2" + [[ $_p9k_ret == false ]] && join+="&&_p9k_i<$2" local p= - p+="\${_P9K_N::=}" - p+="\${\${\${_P9K_BG:-0}:#NONE}:-\${_P9K_N::=$((t+1))}}" # 1 - p+="\${_P9K_N:=\${\${\$(($join)):#0}:+$((t+2))}}" # 2 - p+="\${_P9K_N:=\${\${(M)\${:-x$bg_color}:#x(\$_P9K_BG|\${_P9K_BG:-0})}:+$((t+3))}}" # 3 - p+="\${_P9K_N:=$((t+4))}" # 4 + p+="\${_p9k_n::=}" + p+="\${\${\${_p9k_bg:-0}:#NONE}:-\${_p9k_n::=$((t+1))}}" # 1 + p+="\${_p9k_n:=\${\${\$(($join)):#0}:+$((t+2))}}" # 2 + p+="\${_p9k_n:=\${\${(M)\${:-x$bg_color}:#x(\$_p9k_bg|\${_p9k_bg:-0})}:+$((t+3))}}" # 3 + p+="\${_p9k_n:=$((t+4))}" # 4 _p9k_param $1 VISUAL_IDENTIFIER_EXPANSION '${P9K_VISUAL_IDENTIFIER}' - local icon_exp_=${_P9K_RETVAL:+\"$_P9K_RETVAL\"} + local icon_exp_=${_p9k_ret:+\"$_p9k_ret\"} _p9k_param $1 CONTENT_EXPANSION '${P9K_CONTENT}' - local content_exp_=${_P9K_RETVAL:+\"$_P9K_RETVAL\"} + local content_exp_=${_p9k_ret:+\"$_p9k_ret\"} if [[ ( $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ) || ( $content_exp_ != '"${P9K_CONTENT}"' && $content_exp_ == *'$'* ) ]]; then @@ -323,12 +522,12 @@ left_prompt_segment() { local -i has_icon=-1 # maybe if [[ $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ]]; then - p+='${_P9K_V::='$icon_exp_$style_'}' + p+='${_p9k_v::='$icon_exp_$style_'}' else - [[ $icon_exp_ == '"${P9K_VISUAL_IDENTIFIER}"' ]] && _P9K_RETVAL=$icon_ || _P9K_RETVAL=$icon_exp_ - if [[ -n $_P9K_RETVAL ]]; then - p+="\${_P9K_V::=$_P9K_RETVAL" - [[ $_P9K_RETVAL == *%* ]] && p+=$style_ + [[ $icon_exp_ == '"${P9K_VISUAL_IDENTIFIER}"' ]] && _p9k_ret=$icon_ || _p9k_ret=$icon_exp_ + if [[ -n $_p9k_ret ]]; then + p+="\${_p9k_v::=$_p9k_ret" + [[ $_p9k_ret == *%* ]] && p+=$style_ p+="}" has_icon=1 # definitely yes else @@ -336,79 +535,79 @@ left_prompt_segment() { fi fi - p+="\${_P9K_C::=$content_exp_}" + p+="\${_p9k_c::=$content_exp_}" if (( has_icon == -1 )); then - p+='${_P9K_E::=${${(%):-$_P9K_C%1(l.1.0)}[-1]}${${(%):-$_P9K_V%1(l.1.0)}[-1]}}' + p+='${_p9k_e::=${${(%):-$_p9k_c%1(l.1.0)}[-1]}${${(%):-$_p9k_v%1(l.1.0)}[-1]}}' else - p+='${_P9K_E::=${${(%):-$_P9K_C%1(l.1.0)}[-1]}'$has_icon'}' + p+='${_p9k_e::=${${(%):-$_p9k_c%1(l.1.0)}[-1]}'$has_icon'}' fi p+='}+}' - p+='${${_P9K_E:#00}:+${${_P9K_T[$_P9K_N]/'$ss'/$_P9K_SS}/'$s'/$_P9K_S}' + p+='${${_p9k_e:#00}:+${${_p9k_t[$_p9k_n]/'$ss'/$_p9k_ss}/'$s'/$_p9k_s}' _p9k_param $1 ICON_BEFORE_CONTENT '' - if [[ $_P9K_RETVAL != false ]]; then + if [[ $_p9k_ret != false ]]; then _p9k_param $1 PREFIX '' - _P9K_RETVAL=${(g::)_P9K_RETVAL} - _p9k_escape $_P9K_RETVAL - p+=$_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && local -i need_style=1 || local -i need_style=0 + _p9k_ret=${(g::)_p9k_ret} + _p9k_escape $_p9k_ret + p+=$_p9k_ret + [[ $_p9k_ret == *%* ]] && local -i need_style=1 || local -i need_style=0 if (( has_icon != 0 )); then _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color - _p9k_foreground $_P9K_RETVAL - _p9k_escape_rcurly %b$bg$_P9K_RETVAL - [[ $_P9K_RETVAL != $style_ || $need_style == 1 ]] && p+=$_P9K_RETVAL - p+='${_P9K_V}' + _p9k_foreground $_p9k_ret + _p9k_escape_rcurly %b$bg$_p9k_ret + [[ $_p9k_ret != $style_ || $need_style == 1 ]] && p+=$_p9k_ret + p+='${_p9k_v}' _p9k_get_icon $1 LEFT_MIDDLE_WHITESPACE ' ' - if [[ -n $_P9K_RETVAL ]]; then - _p9k_escape $_P9K_RETVAL - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=$style_ - p+='${${(M)_P9K_E:#11}:+'$_P9K_RETVAL'}' + if [[ -n $_p9k_ret ]]; then + _p9k_escape $_p9k_ret + [[ _p9k_ret == *%* ]] && _p9k_ret+=$style_ + p+='${${(M)_p9k_e:#11}:+'$_p9k_ret'}' fi elif (( need_style )); then p+=$style_ fi - p+='${_P9K_C}'$style_ + p+='${_p9k_c}'$style_ else _p9k_param $1 PREFIX '' - _P9K_RETVAL=${(g::)_P9K_RETVAL} - _p9k_escape $_P9K_RETVAL - p+=$_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && p+=$style_ + _p9k_ret=${(g::)_p9k_ret} + _p9k_escape $_p9k_ret + p+=$_p9k_ret + [[ $_p9k_ret == *%* ]] && p+=$style_ - p+='${_P9K_C}'$style_ + p+='${_p9k_c}'$style_ if (( has_icon != 0 )); then local -i need_style=0 _p9k_get_icon $1 LEFT_MIDDLE_WHITESPACE ' ' - if [[ -n $_P9K_RETVAL ]]; then - _p9k_escape $_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && need_style=1 - p+='${${(M)_P9K_E:#11}:+'$_P9K_RETVAL'}' + if [[ -n $_p9k_ret ]]; then + _p9k_escape $_p9k_ret + [[ $_p9k_ret == *%* ]] && need_style=1 + p+='${${(M)_p9k_e:#11}:+'$_p9k_ret'}' fi _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color - _p9k_foreground $_P9K_RETVAL - _p9k_escape_rcurly %b$bg$_P9K_RETVAL - [[ $_P9K_RETVAL != $style_ || $need_style == 1 ]] && p+=$_P9K_RETVAL - p+='$_P9K_V' + _p9k_foreground $_p9k_ret + _p9k_escape_rcurly %b$bg$_p9k_ret + [[ $_p9k_ret != $style_ || $need_style == 1 ]] && p+=$_p9k_ret + p+='$_p9k_v' fi fi _p9k_param $1 SUFFIX '' - _P9K_RETVAL=${(g::)_P9K_RETVAL} - _p9k_escape $_P9K_RETVAL - p+=$_P9K_RETVAL - [[ $_P9K_RETVAL == *%* && -n $right_space_ ]] && p+=$style_ + _p9k_ret=${(g::)_p9k_ret} + _p9k_escape $_p9k_ret + p+=$_p9k_ret + [[ $_p9k_ret == *%* && -n $right_space_ ]] && p+=$style_ p+=$right_space_ p+='${${:-' - p+="\${_P9K_S::=%F{$bg_color\}$sep_}\${_P9K_SS::=$subsep_}\${_P9K_SSS::=%F{$bg_color\}$end_sep_}" - p+="\${_P9K_I::=$2}\${_P9K_BG::=$bg_color}" + p+="\${_p9k_s::=%F{$bg_color\}$sep_}\${_p9k_ss::=$subsep_}\${_p9k_sss::=%F{$bg_color\}$end_sep_}" + p+="\${_p9k_i::=$2}\${_p9k_bg::=$bg_color}" p+='}+}' p+='}' @@ -416,105 +615,104 @@ left_prompt_segment() { _p9k_cache_set "$p" fi - (( $6 )) && _P9K_RETVAL=$8 || _p9k_escape $8 + (( $6 )) && _p9k_ret=$8 || _p9k_escape $8 if [[ -z $7 ]]; then - _P9K_PROMPT+="\${\${:-\${P9K_CONTENT::=$_P9K_RETVAL}$_P9K_CACHE_VAL[1]" + _p9k_prompt+="\${\${:-\${P9K_CONTENT::=$_p9k_ret}$_p9k_cache_val[1]" else - _P9K_PROMPT+="\${\${:-$7}:+\${\${:-\${P9K_CONTENT::=$_P9K_RETVAL}$_P9K_CACHE_VAL[1]}" + _p9k_prompt+="\${\${:-$7}:+\${\${:-\${P9K_CONTENT::=$_p9k_ret}$_p9k_cache_val[1]}" fi } # The same as left_prompt_segment above but for the right prompt. -set_default POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS " " right_prompt_segment() { if ! _p9k_cache_get "$0" "$1" "$2" "$3" "$4" "$5"; then _p9k_color $1 BACKGROUND $3 - local bg_color=$_P9K_RETVAL + local bg_color=$_p9k_ret _p9k_background $bg_color - local bg=$_P9K_RETVAL - _p9k_escape_rcurly $_P9K_RETVAL - local bg_=$_P9K_RETVAL + local bg=$_p9k_ret + _p9k_escape_rcurly $_p9k_ret + local bg_=$_p9k_ret _p9k_color $1 FOREGROUND $4 - local fg_color=$_P9K_RETVAL + local fg_color=$_p9k_ret _p9k_foreground $fg_color - local fg=$_P9K_RETVAL + local fg=$_p9k_ret _p9k_get_icon $1 RIGHT_SEGMENT_SEPARATOR - local sep=$_P9K_RETVAL - _p9k_escape $_P9K_RETVAL - local sep_=$_P9K_RETVAL + local sep=$_p9k_ret + _p9k_escape $_p9k_ret + local sep_=$_p9k_ret _p9k_get_icon $1 RIGHT_SUBSEGMENT_SEPARATOR - local subsep=$_P9K_RETVAL + local subsep=$_p9k_ret local icon_ if [[ -n $5 ]]; then _p9k_get_icon $1 $5 - _p9k_escape $_P9K_RETVAL - icon_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + icon_=$_p9k_ret fi _p9k_get_icon $1 RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL $sep - local start_sep=$_P9K_RETVAL + local start_sep=$_p9k_ret [[ -n $start_sep ]] && start_sep="%b%k%F{$bg_color}$start_sep" _p9k_get_icon $1 RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL - _p9k_escape $_P9K_RETVAL - local end_sep_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + local end_sep_=$_p9k_ret local style=%b$bg$fg _p9k_escape_rcurly $style - local style_=$_P9K_RETVAL + local style_=$_p9k_ret - _p9k_get_icon $1 WHITESPACE_BETWEEN_RIGHT_SEGMENTS - local space=$_P9K_RETVAL + _p9k_get_icon $1 WHITESPACE_BETWEEN_RIGHT_SEGMENTS ' ' + local space=$_p9k_ret _p9k_get_icon $1 RIGHT_LEFT_WHITESPACE $space - local left_space=$_P9K_RETVAL + local left_space=$_p9k_ret [[ $left_space == *%* ]] && left_space+=$style _p9k_get_icon $1 RIGHT_RIGHT_WHITESPACE $space - _p9k_escape $_P9K_RETVAL - local right_space_=$_P9K_RETVAL + _p9k_escape $_p9k_ret + local right_space_=$_p9k_ret [[ $right_space_ == *%* ]] && right_space_+=$style_ - local w='<_P9K_W>' s='<_P9K_S>' + local w='<_p9k_w>' s='<_p9k_s>' # Segment separator logic: # - # if [[ $_P9K_BG == NONE ]]; then + # if [[ $_p9k_bg == NONE ]]; then # 1 # elif (( joined )); then # 2 - # elif [[ $_P9K_BG == (${bg_color}|${bg_color:-0}) ]]; then + # elif [[ $_p9k_bg == (${bg_color}|${bg_color:-0}) ]]; then # 3 # else # 4 # fi - local t=$#_P9K_T - _P9K_T+=$start_sep$style$left_space # 1 - _P9K_T+=$w$style # 2 - _P9K_T+=$w$subsep$style$left_space # 3 - _P9K_T+=$w%F{$bg_color}$sep$style$left_space # 4 + local t=$#_p9k_t + _p9k_t+=$start_sep$style$left_space # 1 + _p9k_t+=$w$style # 2 + _p9k_t+=$w$subsep$style$left_space # 3 + _p9k_t+=$w%F{$bg_color}$sep$style$left_space # 4 - local join="_P9K_I>=$_P9K_RIGHT_JOIN[$2]" + local join="_p9k_i>=$_p9k_right_join[$2]" _p9k_param $1 SELF_JOINED false - [[ $_P9K_RETVAL == false ]] && join+="&&_P9K_I<$2" + [[ $_p9k_ret == false ]] && join+="&&_p9k_i<$2" local p= - p+="\${_P9K_N::=}" - p+="\${\${\${_P9K_BG:-0}:#NONE}:-\${_P9K_N::=$((t+1))}}" # 1 - p+="\${_P9K_N:=\${\${\$(($join)):#0}:+$((t+2))}}" # 2 - p+="\${_P9K_N:=\${\${(M)\${:-x\$_P9K_BG}:#x(${(b)bg_color}|${(b)bg_color:-0})}:+$((t+3))}}" # 3 - p+="\${_P9K_N:=$((t+4))}" # 4 + p+="\${_p9k_n::=}" + p+="\${\${\${_p9k_bg:-0}:#NONE}:-\${_p9k_n::=$((t+1))}}" # 1 + p+="\${_p9k_n:=\${\${\$(($join)):#0}:+$((t+2))}}" # 2 + p+="\${_p9k_n:=\${\${(M)\${:-x\$_p9k_bg}:#x(${(b)bg_color}|${(b)bg_color:-0})}:+$((t+3))}}" # 3 + p+="\${_p9k_n:=$((t+4))}" # 4 _p9k_param $1 VISUAL_IDENTIFIER_EXPANSION '${P9K_VISUAL_IDENTIFIER}' - local icon_exp_=${_P9K_RETVAL:+\"$_P9K_RETVAL\"} + local icon_exp_=${_p9k_ret:+\"$_p9k_ret\"} _p9k_param $1 CONTENT_EXPANSION '${P9K_CONTENT}' - local content_exp_=${_P9K_RETVAL:+\"$_P9K_RETVAL\"} + local content_exp_=${_p9k_ret:+\"$_p9k_ret\"} if [[ ( $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ) || ( $content_exp_ != '"${P9K_CONTENT}"' && $content_exp_ == *'$'* ) ]]; then @@ -524,12 +722,12 @@ right_prompt_segment() { local -i has_icon=-1 # maybe if [[ $icon_exp_ != '"${P9K_VISUAL_IDENTIFIER}"' && $icon_exp_ == *'$'* ]]; then - p+="\${_P9K_V::=$icon_exp_$style_}" + p+="\${_p9k_v::=$icon_exp_$style_}" else - [[ $icon_exp_ == '"${P9K_VISUAL_IDENTIFIER}"' ]] && _P9K_RETVAL=$icon_ || _P9K_RETVAL=$icon_exp_ - if [[ -n $_P9K_RETVAL ]]; then - p+="\${_P9K_V::=$_P9K_RETVAL" - [[ $_P9K_RETVAL == *%* ]] && p+=$style_ + [[ $icon_exp_ == '"${P9K_VISUAL_IDENTIFIER}"' ]] && _p9k_ret=$icon_ || _p9k_ret=$icon_exp_ + if [[ -n $_p9k_ret ]]; then + p+="\${_p9k_v::=$_p9k_ret" + [[ $_p9k_ret == *%* ]] && p+=$style_ p+="}" has_icon=1 # definitely yes else @@ -537,96 +735,96 @@ right_prompt_segment() { fi fi - p+="\${_P9K_C::=$content_exp_}" + p+="\${_p9k_c::=$content_exp_}" if (( has_icon == -1 )); then - p+='${_P9K_E::=${${(%):-$_P9K_C%1(l.1.0)}[-1]}${${(%):-$_P9K_V%1(l.1.0)}[-1]}}' + p+='${_p9k_e::=${${(%):-$_p9k_c%1(l.1.0)}[-1]}${${(%):-$_p9k_v%1(l.1.0)}[-1]}}' else - p+='${_P9K_E::=${${(%):-$_P9K_C%1(l.1.0)}[-1]}'$has_icon'}' + p+='${_p9k_e::=${${(%):-$_p9k_c%1(l.1.0)}[-1]}'$has_icon'}' fi p+='}+}' - p+='${${_P9K_E:#00}:+${_P9K_T[$_P9K_N]/'$w'/$_P9K_W}' + p+='${${_p9k_e:#00}:+${_p9k_t[$_p9k_n]/'$w'/$_p9k_w}' _p9k_param $1 ICON_BEFORE_CONTENT '' - if [[ $_P9K_RETVAL != true ]]; then + if [[ $_p9k_ret != true ]]; then _p9k_param $1 PREFIX '' - _P9K_RETVAL=${(g::)_P9K_RETVAL} - _p9k_escape $_P9K_RETVAL - p+=$_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && p+=$style_ + _p9k_ret=${(g::)_p9k_ret} + _p9k_escape $_p9k_ret + p+=$_p9k_ret + [[ $_p9k_ret == *%* ]] && p+=$style_ - p+='${_P9K_C}'$style_ + p+='${_p9k_c}'$style_ if (( has_icon != 0 )); then local -i need_style=0 _p9k_get_icon $1 RIGHT_MIDDLE_WHITESPACE ' ' - if [[ -n $_P9K_RETVAL ]]; then - _p9k_escape $_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && need_style=1 - p+='${${(M)_P9K_E:#11}:+'$_P9K_RETVAL'}' + if [[ -n $_p9k_ret ]]; then + _p9k_escape $_p9k_ret + [[ $_p9k_ret == *%* ]] && need_style=1 + p+='${${(M)_p9k_e:#11}:+'$_p9k_ret'}' fi _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color - _p9k_foreground $_P9K_RETVAL - _p9k_escape_rcurly %b$bg$_P9K_RETVAL - [[ $_P9K_RETVAL != $style_ || $need_style == 1 ]] && p+=$_P9K_RETVAL - p+='$_P9K_V' + _p9k_foreground $_p9k_ret + _p9k_escape_rcurly %b$bg$_p9k_ret + [[ $_p9k_ret != $style_ || $need_style == 1 ]] && p+=$_p9k_ret + p+='$_p9k_v' fi else _p9k_param $1 PREFIX '' - _P9K_RETVAL=${(g::)_P9K_RETVAL} - _p9k_escape $_P9K_RETVAL - p+=$_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && local -i need_style=1 || local -i need_style=0 + _p9k_ret=${(g::)_p9k_ret} + _p9k_escape $_p9k_ret + p+=$_p9k_ret + [[ $_p9k_ret == *%* ]] && local -i need_style=1 || local -i need_style=0 if (( has_icon != 0 )); then _p9k_color $1 VISUAL_IDENTIFIER_COLOR $fg_color - _p9k_foreground $_P9K_RETVAL - _p9k_escape_rcurly %b$bg$_P9K_RETVAL - [[ $_P9K_RETVAL != $style_ || $need_style == 1 ]] && p+=$_P9K_RETVAL - p+='${_P9K_V}' + _p9k_foreground $_p9k_ret + _p9k_escape_rcurly %b$bg$_p9k_ret + [[ $_p9k_ret != $style_ || $need_style == 1 ]] && p+=$_p9k_ret + p+='${_p9k_v}' _p9k_get_icon $1 RIGHT_MIDDLE_WHITESPACE ' ' - if [[ -n $_P9K_RETVAL ]]; then - _p9k_escape $_P9K_RETVAL - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=$style_ - p+='${${(M)_P9K_E:#11}:+'$_P9K_RETVAL'}' + if [[ -n $_p9k_ret ]]; then + _p9k_escape $_p9k_ret + [[ _p9k_ret == *%* ]] && _p9k_ret+=$style_ + p+='${${(M)_p9k_e:#11}:+'$_p9k_ret'}' fi elif (( need_style )); then p+=$style_ fi - p+='${_P9K_C}'$style_ + p+='${_p9k_c}'$style_ fi _p9k_param $1 SUFFIX '' - _P9K_RETVAL=${(g::)_P9K_RETVAL} - _p9k_escape $_P9K_RETVAL - p+=$_P9K_RETVAL + _p9k_ret=${(g::)_p9k_ret} + _p9k_escape $_p9k_ret + p+=$_p9k_ret p+='${${:-' if [[ -n $fg_color && $fg_color == $bg_color ]]; then - if [[ $fg_color == $DEFAULT_COLOR ]]; then - _p9k_foreground $DEFAULT_COLOR_INVERTED + if [[ $fg_color == $_p9k_color1 ]]; then + _p9k_foreground $_p9k_color2 else - _p9k_foreground $DEFAULT_COLOR + _p9k_foreground $_p9k_color1 fi else - _P9K_RETVAL=$fg + _p9k_ret=$fg fi - _p9k_escape_rcurly $_P9K_RETVAL - p+="\${_P9K_W::=${right_space_:+$style_}$right_space_%b$bg_$_P9K_RETVAL}" + _p9k_escape_rcurly $_p9k_ret + p+="\${_p9k_w::=${right_space_:+$style_}$right_space_%b$bg_$_p9k_ret}" - p+='${_P9K_SSS::=' + p+='${_p9k_sss::=' p+=$style_$right_space_ [[ $right_space_ == *%* ]] && p+=$style_ p+=$end_sep_ [[ $end_sep_ == *%* ]] && p+=$style_ p+='}' - p+="\${_P9K_I::=$2}\${_P9K_BG::=$bg_color}" + p+="\${_p9k_i::=$2}\${_p9k_bg::=$bg_color}" p+='}+}' p+='}' @@ -634,11 +832,11 @@ right_prompt_segment() { _p9k_cache_set "$p" fi - (( $6 )) && _P9K_RETVAL=$8 || _p9k_escape $8 + (( $6 )) && _p9k_ret=$8 || _p9k_escape $8 if [[ -z $7 ]]; then - _P9K_PROMPT+="\${\${:-\${P9K_CONTENT::=$_P9K_RETVAL}$_P9K_CACHE_VAL[1]" + _p9k_prompt+="\${\${:-\${P9K_CONTENT::=$_p9k_ret}$_p9k_cache_val[1]" else - _P9K_PROMPT+="\${\${:-$7}:+\${\${:-\${P9K_CONTENT::=$_P9K_RETVAL}$_P9K_CACHE_VAL[1]}" + _p9k_prompt+="\${\${:-$7}:+\${\${:-\${P9K_CONTENT::=$_p9k_ret}$_p9k_cache_val[1]}" fi } @@ -666,14 +864,14 @@ function p9k_prompt_segment() { return 1 } (( sym )) || icon=$'\1'$icon - "${_P9K_PROMPT_SIDE}_prompt_segment" "prompt_${_P9K_SEGMENT_NAME}${state:+_${(U)state}}" \ - "${_P9K_SEGMENT_INDEX}" "$bg" "${fg:-$DEFAULT_COLOR}" "$icon" "$expand" "$cond" "$text" + "${_p9k_prompt_side}_prompt_segment" "prompt_${_p9k_segment_name}${state:+_${(U)state}}" \ + "${_p9k_segment_index}" "$bg" "${fg:-$_p9k_color1}" "$icon" "$expand" "$cond" "$text" return 0 } function _p9k_python_version() { _p9k_cached_cmd_stdout_stderr python --version || return - [[ $_P9K_RETVAL == (#b)Python\ ([[:digit:].]##)* ]] && _P9K_RETVAL=$match[1] + [[ $_p9k_ret == (#b)Python\ ([[:digit:].]##)* ]] && _p9k_ret=$match[1] } ################################################################ @@ -682,18 +880,15 @@ function _p9k_python_version() { ################################################################ # Anaconda Environment -set_default POWERLEVEL9K_ANACONDA_LEFT_DELIMITER "(" -set_default POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER ")" -set_default POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION true prompt_anaconda() { local p=${CONDA_PREFIX:-$CONDA_ENV_PATH} [[ -n $p ]] || return local msg='' - if [[ $POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION == true ]] && _p9k_python_version; then - msg="$_P9K_RETVAL " + if (( _POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION )) && _p9k_python_version; then + msg="$_p9k_ret " fi - msg+="$POWERLEVEL9K_ANACONDA_LEFT_DELIMITER${${p:t}//\%/%%}$POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER" - "$1_prompt_segment" "$0" "$2" "blue" "$DEFAULT_COLOR" 'PYTHON_ICON' 0 '' "$msg" + msg+="$_POWERLEVEL9K_ANACONDA_LEFT_DELIMITER${${p:t}//\%/%%}$_POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER" + "$1_prompt_segment" "$0" "$2" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '' "$msg" } ################################################################ @@ -709,74 +904,63 @@ prompt_aws() { # Current Elastic Beanstalk environment prompt_aws_eb_env() { [[ -r .elasticbeanstalk/config.yml ]] || return - local v=${=$(command grep environment .elasticbeanstalk/config.yml 2>/dev/null)[2]} + local v=${=$(grep environment .elasticbeanstalk/config.yml 2>/dev/null)[2]} [[ -n $v ]] && "$1_prompt_segment" "$0" "$2" black green 'AWS_EB_ICON' 0 '' "${v//\%/%%}" } ################################################################ # Segment to indicate background jobs with an icon. -set_default POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE true -set_default POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS false prompt_background_jobs() { local msg - if [[ $POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE == true ]]; then - if [[ $POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS == true ]]; then + if (( _POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE )); then + if (( _POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS )); then msg='${(%):-%j}' else msg='${${(%):-%j}:#1}' fi fi - $1_prompt_segment $0 $2 "$DEFAULT_COLOR" cyan BACKGROUND_JOBS_ICON 1 '${${(%):-%j}:#0}' "$msg" + $1_prompt_segment $0 $2 "$_p9k_color1" cyan BACKGROUND_JOBS_ICON 1 '${${(%):-%j}:#0}' "$msg" } ################################################################ # Segment that indicates usage level of current partition. -set_default POWERLEVEL9K_DISK_USAGE_ONLY_WARNING false -set_default -i POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL 90 -set_default -i POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL 95 prompt_disk_usage() { (( $+commands[df] )) || return - local disk_usage=${${=${(f)"$(command df -P . 2>/dev/null)"}[2]}[5]%%%} + local disk_usage=${${=${(f)"$(df -P . 2>/dev/null)"}[2]}[5]%%%} local state bg fg - if (( disk_usage >= POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL )); then + if (( disk_usage >= _POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL )); then state=critical bg=red fg=white - elif (( disk_usage >= POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL )); then + elif (( disk_usage >= _POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL )); then state=warning bg=yellow - fg=$DEFAULT_COLOR + fg=$_p9k_color1 else - [[ "$POWERLEVEL9K_DISK_USAGE_ONLY_WARNING" == true ]] && return + (( _POWERLEVEL9K_DISK_USAGE_ONLY_WARNING )) && return state=normal - bg=$DEFAULT_COLOR + bg=$_p9k_color1 fg=yellow fi $1_prompt_segment $0_$state $2 $bg $fg DISK_ICON 0 '' "$disk_usage%%" } -################################################################ -# Segment that displays the battery status in levels and colors -set_default -i POWERLEVEL9K_BATTERY_LOW_THRESHOLD 10 -set_default -i POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD 999 -set_default -a POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND -set_default POWERLEVEL9K_BATTERY_VERBOSE true -typeset -g POWERLEVEL9K_BATTERY_STAGES - function _p9k_read_file() { - _P9K_RETVAL='' - [[ -n $1 ]] && read -r _P9K_RETVAL <$1 - [[ -n $_P9K_RETVAL ]] + _p9k_ret='' + [[ -n $1 ]] && read -r _p9k_ret <$1 + [[ -n $_p9k_ret ]] } +################################################################ +# Segment that displays the battery status in levels and colors prompt_battery() { local state remain local -i bat_percent - case $OS in + case $_p9k_os in OSX) (( $+commands[pmset] )) || return - local raw_data=${${(f)"$(command pmset -g batt 2>/dev/null)"}[2]} + local raw_data=${${(f)"$(pmset -g batt 2>/dev/null)"}[2]} [[ $raw_data == *InternalBattery* ]] || return remain=${${(s: :)${${(s:; :)raw_data}[3]}}[1]} [[ $remain == *no* ]] && remain="..." @@ -787,7 +971,7 @@ prompt_battery() { state=CHARGING ;; 'discharging') - (( bat_percent < POWERLEVEL9K_BATTERY_LOW_THRESHOLD )) && state=LOW || state=DISCONNECTED + (( bat_percent < _POWERLEVEL9K_BATTERY_LOW_THRESHOLD )) && state=LOW || state=DISCONNECTED ;; *) state=CHARGED @@ -806,17 +990,17 @@ prompt_battery() { for dir in $bats; do local -i pow=0 full=0 if _p9k_read_file $dir/(energy_full|charge_full|charge_counter)(N); then - (( energy_full += ${full::=_P9K_RETVAL} )) + (( energy_full += ${full::=_p9k_ret} )) fi - if _p9k_read_file $dir/(power|current)_now(N) && (( $#_P9K_RETVAL < 9 )); then - (( power_now += ${pow::=$_P9K_RETVAL} )) + if _p9k_read_file $dir/(power|current)_now(N) && (( $#_p9k_ret < 9 )); then + (( power_now += ${pow::=$_p9k_ret} )) fi if _p9k_read_file $dir/(energy|charge)_now(N); then - (( energy_now += _P9K_RETVAL )) + (( energy_now += _p9k_ret )) elif _p9k_read_file $dir/capacity(N); then - (( energy_now += _P9K_RETVAL * full / 100. + 0.5 )) + (( energy_now += _p9k_ret * full / 100. + 0.5 )) fi - _p9k_read_file $dir/status(N) && local bat_status=$_P9K_RETVAL || continue + _p9k_read_file $dir/status(N) && local bat_status=$_p9k_ret || continue [[ $bat_status != Full ]] && is_full=0 [[ $bat_status == Charging ]] && is_charching=1 [[ $bat_status == (Charging|Discharging) && $pow == 0 ]] && is_calculating=1 @@ -832,7 +1016,7 @@ prompt_battery() { else if (( is_charching )); then state=CHARGING - elif (( bat_percent < POWERLEVEL9K_BATTERY_LOW_THRESHOLD )); then + elif (( bat_percent < _POWERLEVEL9K_BATTERY_LOW_THRESHOLD )); then state=LOW else state=DISCONNECTED @@ -853,65 +1037,53 @@ prompt_battery() { ;; esac - (( bat_percent >= POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD )) && return + (( bat_percent >= _POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD )) && return local msg="$bat_percent%%" - [[ $POWERLEVEL9K_BATTERY_VERBOSE == true && -n $remain ]] && msg+=" ($remain)" + [[ $_POWERLEVEL9K_BATTERY_VERBOSE == 1 && -n $remain ]] && msg+=" ($remain)" local icon=BATTERY_ICON - if (( $#POWERLEVEL9K_BATTERY_STAGES )); then - local -i idx=$#POWERLEVEL9K_BATTERY_STAGES - (( bat_percent < 100 )) && idx=$((bat_percent * $#POWERLEVEL9K_BATTERY_STAGES / 100 + 1)) - icon=$'\1'${(g::)POWERLEVEL9K_BATTERY_STAGES[idx]} + if (( $#_POWERLEVEL9K_BATTERY_STAGES )); then + local -i idx=$#_POWERLEVEL9K_BATTERY_STAGES + (( bat_percent < 100 )) && idx=$((bat_percent * $#_POWERLEVEL9K_BATTERY_STAGES / 100 + 1)) + icon=$'\1'$_POWERLEVEL9K_BATTERY_STAGES[idx] fi - local bg=$DEFAULT_COLOR - if (( $#POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND )); then - local -i idx=$#POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND - (( bat_percent < 100 )) && idx=$((bat_percent * $#POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND / 100 + 1)) - bg=$POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND[idx] + local bg=$_p9k_color1 + if (( $#_POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND )); then + local -i idx=$#_POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND + (( bat_percent < 100 )) && idx=$((bat_percent * $#_POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND / 100 + 1)) + bg=$_POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND[idx] fi - $1_prompt_segment $0_$state $2 "$bg" "$_P9K_BATTERY_STATES[$state]" $icon 0 '' $msg + $1_prompt_segment $0_$state $2 "$bg" "$_p9k_battery_states[$state]" $icon 0 '' $msg } -typeset -g _P9K_PUBLIC_IP - ################################################################ # Public IP segment -set_default -F POWERLEVEL9K_PUBLIC_IP_TIMEOUT 300 -set_default -a POWERLEVEL9K_PUBLIC_IP_METHODS dig curl wget -set_default POWERLEVEL9K_PUBLIC_IP_NONE "" -set_default POWERLEVEL9K_PUBLIC_IP_HOST "http://ident.me" -set_default POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE "" - prompt_public_ip() { local icon='PUBLIC_IP_ICON' - if [[ -n $POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]]; then - _p9k_parse_ip $POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE && icon='VPN_ICON' + if [[ -n $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE ]]; then + _p9k_parse_ip $_POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE && icon='VPN_ICON' fi - local ip='${_P9K_PUBLIC_IP:-$POWERLEVEL9K_PUBLIC_IP_NONE}' - $1_prompt_segment "$0" "$2" "$DEFAULT_COLOR" "$DEFAULT_COLOR_INVERTED" "$icon" 1 $ip $ip + local ip='${_p9k_public_ip:-$_POWERLEVEL9K_PUBLIC_IP_NONE}' + $1_prompt_segment "$0" "$2" "$_p9k_color1" "$_p9k_color2" "$icon" 1 $ip $ip } ################################################################ # Context: user@hostname (who am I and where am I) -# Note that if $DEFAULT_USER is not set, this prompt segment will always print -set_default POWERLEVEL9K_ALWAYS_SHOW_CONTEXT false -set_default POWERLEVEL9K_ALWAYS_SHOW_USER false -set_default POWERLEVEL9K_CONTEXT_TEMPLATE "%n@%m" prompt_context() { if ! _p9k_cache_get $0; then local -i enabled=1 local content='' state='' - if [[ $POWERLEVEL9K_ALWAYS_SHOW_CONTEXT == true || -z $DEFAULT_USER || $_P9K_SSH == 1 ]]; then - content=$POWERLEVEL9K_CONTEXT_TEMPLATE + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_CONTEXT == 1 || -z $DEFAULT_USER || $_P9K_SSH == 1 ]]; then + content=$_POWERLEVEL9K_CONTEXT_TEMPLATE else local user=$(whoami) if [[ $user != $DEFAULT_USER ]]; then - content="${POWERLEVEL9K_CONTEXT_TEMPLATE}" - elif [[ $POWERLEVEL9K_ALWAYS_SHOW_USER == true ]]; then + content=$_POWERLEVEL9K_CONTEXT_TEMPLATE + elif (( _POWERLEVEL9K_ALWAYS_SHOW_USER )); then content="${user//\%/%%}" else enabled=0 @@ -936,38 +1108,35 @@ prompt_context() { _p9k_cache_set "$enabled" "$state" "$content" fi - (( _P9K_CACHE_VAL[1] )) || return - "$1_prompt_segment" "$0_$_P9K_CACHE_VAL[2]" "$2" "$DEFAULT_COLOR" yellow '' 0 '' "$_P9K_CACHE_VAL[3]" + (( _p9k_cache_val[1] )) || return + "$1_prompt_segment" "$0_$_p9k_cache_val[2]" "$2" "$_p9k_color1" yellow '' 0 '' "$_p9k_cache_val[3]" } ################################################################ # User: user (who am I) -# Note that if $DEFAULT_USER is not set, this prompt segment will always print -set_default POWERLEVEL9K_USER_TEMPLATE "%n" prompt_user() { if ! _p9k_cache_get $0 $1 $2; then local user=$(whoami) - if [[ $POWERLEVEL9K_ALWAYS_SHOW_USER != true && $user == $DEFAULT_USER ]]; then + if [[ $_POWERLEVEL9K_ALWAYS_SHOW_USER == 0 && $user == $DEFAULT_USER ]]; then _p9k_cache_set true elif [[ "${(%):-%#}" == '#' ]]; then - _p9k_cache_set "$1_prompt_segment" "${0}_ROOT" "$2" "${DEFAULT_COLOR}" yellow ROOT_ICON 0 '' "${POWERLEVEL9K_USER_TEMPLATE}" + _p9k_cache_set "$1_prompt_segment" "${0}_ROOT" "$2" "${_p9k_color1}" yellow ROOT_ICON 0 '' "$_POWERLEVEL9K_USER_TEMPLATE" elif [[ -n "$SUDO_COMMAND" ]]; then - _p9k_cache_set "$1_prompt_segment" "${0}_SUDO" "$2" "${DEFAULT_COLOR}" yellow SUDO_ICON 0 '' "${POWERLEVEL9K_USER_TEMPLATE}" + _p9k_cache_set "$1_prompt_segment" "${0}_SUDO" "$2" "${_p9k_color1}" yellow SUDO_ICON 0 '' "$_POWERLEVEL9K_USER_TEMPLATE" else - _p9k_cache_set "$1_prompt_segment" "${0}_DEFAULT" "$2" "${DEFAULT_COLOR}" yellow USER_ICON 0 '' "${user//\%/%%}" + _p9k_cache_set "$1_prompt_segment" "${0}_DEFAULT" "$2" "${_p9k_color1}" yellow USER_ICON 0 '' "${user//\%/%%}" fi fi - "$_P9K_CACHE_VAL[@]" + "$_p9k_cache_val[@]" } ################################################################ # Host: machine (where am I) -set_default POWERLEVEL9K_HOST_TEMPLATE "%m" prompt_host() { if (( _P9K_SSH )); then - "$1_prompt_segment" "$0_REMOTE" "$2" "${DEFAULT_COLOR}" yellow SSH_ICON 0 '' "${POWERLEVEL9K_HOST_TEMPLATE}" + "$1_prompt_segment" "$0_REMOTE" "$2" "${_p9k_color1}" yellow SSH_ICON 0 '' "$_POWERLEVEL9K_HOST_TEMPLATE" else - "$1_prompt_segment" "$0_LOCAL" "$2" "${DEFAULT_COLOR}" yellow HOST_ICON 0 '' "${POWERLEVEL9K_HOST_TEMPLATE}" + "$1_prompt_segment" "$0_LOCAL" "$2" "${_p9k_color1}" yellow HOST_ICON 0 '' "$_POWERLEVEL9K_HOST_TEMPLATE" fi } @@ -981,28 +1150,26 @@ prompt_custom() { whence $cmd[1] &>/dev/null || return local content=$("$cmd[@]") [[ -n $content ]] || return - "$1_prompt_segment" "${0}_${3:u}" "$2" $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "CUSTOM_${segment_name}_ICON" 0 '' "$content" + "$1_prompt_segment" "${0}_${3:u}" "$2" $_p9k_color2 $_p9k_color1 "CUSTOM_${segment_name}_ICON" 0 '' "$content" } ################################################################ # Display the duration the command needed to run. -set_default -i POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD 3 -set_default -i POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION 2 -# Other options: "d h m s". -set_default POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT "H:M:S" prompt_command_execution_time() { - (( $+P9K_COMMAND_DURATION_SECONDS && P9K_COMMAND_DURATION_SECONDS >= POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD )) || return + (( __p9k_timer_start )) || return + P9K_COMMAND_DURATION_SECONDS=$((__p9k_timer_end - __p9k_timer_start)) + (( P9K_COMMAND_DURATION_SECONDS >= _POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD )) || return if (( P9K_COMMAND_DURATION_SECONDS < 60 )); then - if [[ $POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION == 0 ]]; then + if (( !_POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION )); then local -i sec=$((P9K_COMMAND_DURATION_SECONDS + 0.5)) else - local -F $POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION sec=P9K_COMMAND_DURATION_SECONDS + local -F $_POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION sec=P9K_COMMAND_DURATION_SECONDS fi local text=${sec}s else local -i d=$((P9K_COMMAND_DURATION_SECONDS + 0.5)) - if [[ $POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT == "H:M:S" ]]; then + if [[ $_POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT == "H:M:S" ]]; then local text=${(l.2..0.)$((d % 60))} if (( d >= 60 )); then text=${(l.2..0.)$((d / 60 % 60))}:$text @@ -1029,78 +1196,16 @@ prompt_command_execution_time() { "$1_prompt_segment" "$0" "$2" "red" "yellow1" 'EXECUTION_TIME_ICON' 0 '' $text } -set_default POWERLEVEL9K_DIR_PATH_SEPARATOR "/" -set_default POWERLEVEL9K_HOME_FOLDER_ABBREVIATION "~" -set_default POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD false -set_default POWERLEVEL9K_DIR_ANCHORS_BOLD false -set_default POWERLEVEL9K_DIR_PATH_ABSOLUTE false -set_default POWERLEVEL9K_DIR_SHOW_WRITABLE false -set_default POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER false -set_default POWERLEVEL9K_DIR_HYPERLINK false -set_default POWERLEVEL9K_SHORTEN_STRATEGY "" -set_default POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND "" -set_default POWERLEVEL9K_SHORTEN_FOLDER_MARKER "(.shorten_folder_marker|.bzr|CVS|.git|.hg|.svn|.terraform|.citc)" - -# Shorten directory if it's longer than this even if there is space for it. -# The value can be either absolute (e.g., '80') or a percentage of terminal -# width (e.g, '50%'). If empty, directory will be shortened only when prompt -# doesn't fit. Applies only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. -set_default POWERLEVEL9K_DIR_MAX_LENGTH 0 - -# Individual elements are patterns. They are expanded with the options set -# by `emulate zsh && setopt extended_glob`. -set_default -a POWERLEVEL9K_DIR_PACKAGE_FILES package.json composer.json - -# When dir is on the last prompt line, try to shorten it enough to leave at least this many -# columns for typing commands. Applies only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. -set_default -i POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS 40 - -# When dir is on the last prompt line, try to shorten it enough to leave at least -# COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. Applies -# only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. -set_default -F POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT 50 - -# You can define POWERLEVEL9K_DIR_CLASSES to specify custom styling and icons for different -# directories. -# -# POWERLEVEL9K_DIR_CLASSES must be an array with 3 * N elements. Each triplet consists of: -# -# 1. A pattern against which the current directory is matched. Matching is done with -# extended_glob option enabled. -# 2. Directory class for the purpose of styling. -# 3. Icon. -# -# Triplets are tried in order. The first triplet whose pattern matches $PWD wins. If there are no -# matches, there will be no icon and the styling is done according to POWERLEVEL9K_DIR_BACKGROUND, -# POWERLEVEL9K_DIR_FOREGROUND, etc. -# -# Example: -# -# POWERLEVEL9K_DIR_CLASSES=( -# '~/work(/*)#' WORK '(╯°□°)╯︵ ┻━┻' -# '~(/*)#' HOME '⌂' -# '*' DEFAULT '') -# -# POWERLEVEL9K_DIR_WORK_BACKGROUND=red -# POWERLEVEL9K_DIR_HOME_BACKGROUND=blue -# POWERLEVEL9K_DIR_DEFAULT_BACKGROUND=yellow -# -# With these settings, the current directory in the prompt may look like this: -# -# (╯°□°)╯︵ ┻━┻ ~/work/projects/important/urgent -# -# ⌂ ~/best/powerlevel10k - function _p9k_shorten_delim_len() { local def=$1 - _P9K_RETVAL=${POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH:--1} - (( _P9K_RETVAL >= 0 )) || _p9k_prompt_length $1 + _p9k_ret=${_POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH:--1} + (( _p9k_ret >= 0 )) || _p9k_prompt_length $1 } ################################################################ # Dir: current working directory prompt_dir() { - [[ $POWERLEVEL9K_DIR_PATH_ABSOLUTE == true ]] && local p=$PWD || local p=${(%):-%~} + (( _POWERLEVEL9K_DIR_PATH_ABSOLUTE )) && local p=$PWD || local p=${(%):-%~} if [[ $p == '~['* ]]; then # If "${(%):-%~}" expands to "~[a]/]/b", is the first component "~[a]" or "~[a]/]"? @@ -1127,14 +1232,14 @@ prompt_dir() { fi local -i fake_first=0 expand=0 - local delim=${POWERLEVEL9K_SHORTEN_DELIMITER-$'\u2026'} - local -i shortenlen=${POWERLEVEL9K_SHORTEN_DIR_LENGTH:--1} + local delim=${_POWERLEVEL9K_SHORTEN_DELIMITER-$'\u2026'} + local -i shortenlen=${_POWERLEVEL9K_SHORTEN_DIR_LENGTH:--1} - case $POWERLEVEL9K_SHORTEN_STRATEGY in + case $_POWERLEVEL9K_SHORTEN_STRATEGY in truncate_absolute|truncate_absolute_chars) if (( shortenlen > 0 && $#p > shortenlen )); then _p9k_shorten_delim_len $delim - if (( $#p > shortenlen + $_P9K_RETVAL )); then + if (( $#p > shortenlen + $_p9k_ret )); then local -i n=shortenlen local -i i=$#parts while true; do @@ -1154,9 +1259,9 @@ prompt_dir() { ;; truncate_with_package_name|truncate_middle|truncate_from_right) () { - [[ $POWERLEVEL9K_SHORTEN_STRATEGY == truncate_with_package_name && - $+commands[jq] == 1 && $#POWERLEVEL9K_DIR_PACKAGE_FILES > 0 ]] || return - local pat="(${(j:|:)POWERLEVEL9K_DIR_PACKAGE_FILES})" + [[ $_POWERLEVEL9K_SHORTEN_STRATEGY == truncate_with_package_name && + $+commands[jq] == 1 && $#_POWERLEVEL9K_DIR_PACKAGE_FILES > 0 ]] || return + local pat="(${(j:|:)_POWERLEVEL9K_DIR_PACKAGE_FILES})" local -i i=$#parts local dir=$PWD for (( ; i > 0; --i )); do @@ -1166,11 +1271,11 @@ prompt_dir() { zstat -H stat -- $pkg_file 2>/dev/null || return if ! _p9k_cache_get $0_pkg $stat[inode] $stat[mtime] $stat[size]; then local pkg_name='' - pkg_name=$(command jq -j '.name' <$pkg_file 2>/dev/null) || pkg_name='' + pkg_name=$(jq -j '.name' <$pkg_file 2>/dev/null) || pkg_name='' _p9k_cache_set "$pkg_name" fi - [[ -n $_P9K_CACHE_VAL[1] ]] || return - parts[1,i]=($_P9K_CACHE_VAL[1]) + [[ -n $_p9k_cache_val[1] ]] || return + parts[1,i]=($_p9k_cache_val[1]) fake_first=1 return done @@ -1179,8 +1284,8 @@ prompt_dir() { } if (( shortenlen > 0 )); then _p9k_shorten_delim_len $delim - local -i d=_P9K_RETVAL pref=shortenlen suf=0 i=2 - [[ $POWERLEVEL9K_SHORTEN_STRATEGY == truncate_middle ]] && suf=pref + local -i d=_p9k_ret pref=shortenlen suf=0 i=2 + [[ $_POWERLEVEL9K_SHORTEN_STRATEGY == truncate_middle ]] && suf=pref for (( ; i < $#parts; ++i )); do local dir=$parts[i] if (( $#dir > pref + suf + d )); then @@ -1205,7 +1310,7 @@ prompt_dir() { ;; truncate_to_unique) expand=1 - delim=${POWERLEVEL9K_SHORTEN_DELIMITER-'*'} + delim=${_POWERLEVEL9K_SHORTEN_DELIMITER-'*'} local -i i=2 [[ $p[1] == / ]] && (( ++i )) local parent="${PWD%/${(pj./.)parts[i,-1]}}" @@ -1216,19 +1321,19 @@ prompt_dir() { else local mtime='good' fi - if ! _p9k_cache_get $0 "${parts[@]}" || [[ -z $mtime || $mtime != $_P9K_CACHE_VAL[1] ]] ; then + if ! _p9k_cache_get $0 "${parts[@]}" || [[ -z $mtime || $mtime != $_p9k_cache_val[1] ]] ; then _p9k_prompt_length $delim - local -i real_delim_len=_P9K_RETVAL n=1 q=0 + local -i real_delim_len=_p9k_ret n=1 q=0 [[ -n $parts[i-1] ]] && parts[i-1]="\${(Q)\${:-${(qqq)${(q)parts[i-1]}}}}"$'\2' [[ $p[i,-1] == *["~!#\$^&*()\\\"'<>?{}[]"]* ]] && q=1 - local -i d=${POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH:--1} + local -i d=${_POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH:--1} (( d >= 0 )) || d=real_delim_len - shortenlen=${POWERLEVEL9K_SHORTEN_DIR_LENGTH:-1} + shortenlen=${_POWERLEVEL9K_SHORTEN_DIR_LENGTH:-1} (( shortenlen >= 0 )) && n=shortenlen for (( ; i <= $#parts - n; ++i )); do local dir=$parts[i] - if [[ -n $POWERLEVEL9K_SHORTEN_FOLDER_MARKER && - -n $parent/$dir/${~POWERLEVEL9K_SHORTEN_FOLDER_MARKER}(#qN) ]]; then + if [[ -n $_POWERLEVEL9K_SHORTEN_FOLDER_MARKER && + -n $parent/$dir/${~_POWERLEVEL9K_SHORTEN_FOLDER_MARKER}(#qN) ]]; then parent+=/$dir (( q )) && parts[i]="\${(Q)\${:-${(qqq)${(q)dir}}}}" parts[i]+=$'\2' @@ -1242,10 +1347,10 @@ prompt_dir() { local -i saved=$(($#dir - j - d)) if (( saved > 0 )); then if (( q )); then - parts[i]='${${${_P9K_D:#-*}:+${(Q)${:-'${(qqq)${(q)dir}}'}}}:-${(Q)${:-' - parts[i]+=$'\3'${(qqq)${(q)dir[1,j]}}$'}}\1\3''${$((_P9K_D+='$saved'))+}}' + parts[i]='${${${_p9k_d:#-*}:+${(Q)${:-'${(qqq)${(q)dir}}'}}}:-${(Q)${:-' + parts[i]+=$'\3'${(qqq)${(q)dir[1,j]}}$'}}\1\3''${$((_p9k_d+='$saved'))+}}' else - parts[i]='${${${_P9K_D:#-*}:+'$dir$'}:-\3'$dir[1,j]$'\1\3''${$((_P9K_D+='$saved'))+}}' + parts[i]='${${${_p9k_d:#-*}:+'$dir$'}:-\3'$dir[1,j]$'\1\3''${$((_p9k_d+='$saved'))+}}' fi else (( q )) && parts[i]="\${(Q)\${:-${(qqq)${(q)dir}}}}" @@ -1258,16 +1363,16 @@ prompt_dir() { done _p9k_cache_set "$mtime" "${parts[@]}" fi - parts=("${(@)_P9K_CACHE_VAL[2,-1]}") + parts=("${(@)_p9k_cache_val[2,-1]}") ;; truncate_with_folder_marker) - if [[ -n $POWERLEVEL9K_SHORTEN_FOLDER_MARKER ]]; then + if [[ -n $_POWERLEVEL9K_SHORTEN_FOLDER_MARKER ]]; then local dir=$PWD local -a m=() local -i i=$(($#parts - 1)) for (( ; i > 1; --i )); do dir=${dir:h} - [[ -n $dir/${~POWERLEVEL9K_SHORTEN_FOLDER_MARKER}(#qN) ]] && m+=$i + [[ -n $dir/${~_POWERLEVEL9K_SHORTEN_FOLDER_MARKER}(#qN) ]] && m+=$i done m+=1 for (( i=1; i < $#m; ++i )); do @@ -1286,7 +1391,7 @@ prompt_dir() { ;; esac - [[ $POWERLEVEL9K_DIR_SHOW_WRITABLE == true && ! -w $PWD ]] + [[ $_POWERLEVEL9K_DIR_SHOW_WRITABLE == 1 && ! -w $PWD ]] local w=$? if ! _p9k_cache_get $0 $2 $PWD $w $fake_first "${parts[@]}"; then local state=$0 @@ -1296,7 +1401,7 @@ prompt_dir() { icon=LOCK_ICON else local a='' b='' c='' - for a b c in "${POWERLEVEL9K_DIR_CLASSES[@]}"; do + for a b c in "${_POWERLEVEL9K_DIR_CLASSES[@]}"; do if [[ $PWD == ${~a} ]]; then [[ -n $b ]] && state+=_${(U)b} icon=$'\1'$c @@ -1307,116 +1412,116 @@ prompt_dir() { local style=%b _p9k_color $state BACKGROUND blue - _p9k_background $_P9K_RETVAL - style+=$_P9K_RETVAL - _p9k_color $state FOREGROUND "$DEFAULT_COLOR" - _p9k_foreground $_P9K_RETVAL - style+=$_P9K_RETVAL + _p9k_background $_p9k_ret + style+=$_p9k_ret + _p9k_color $state FOREGROUND "$_p9k_color1" + _p9k_foreground $_p9k_ret + style+=$_p9k_ret if (( expand )); then _p9k_escape_rcurly $style - style=$_P9K_RETVAL + style=$_p9k_ret fi parts=("${(@)parts//\%/%%}") - if [[ $POWERLEVEL9K_HOME_FOLDER_ABBREVIATION != '~' && $fake_first == 0 && $p == ('~'|'~/'*) ]]; then - (( expand )) && _p9k_escape $POWERLEVEL9K_HOME_FOLDER_ABBREVIATION || _P9K_RETVAL=$POWERLEVEL9K_HOME_FOLDER_ABBREVIATION - parts[1]=$_P9K_RETVAL - [[ $_P9K_RETVAL == *%* ]] && parts[1]+=$style + if [[ $_POWERLEVEL9K_HOME_FOLDER_ABBREVIATION != '~' && $fake_first == 0 && $p == ('~'|'~/'*) ]]; then + (( expand )) && _p9k_escape $_POWERLEVEL9K_HOME_FOLDER_ABBREVIATION || _p9k_ret=$_POWERLEVEL9K_HOME_FOLDER_ABBREVIATION + parts[1]=$_p9k_ret + [[ $_p9k_ret == *%* ]] && parts[1]+=$style fi - [[ $POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER == true && $#parts > 1 && -n $parts[2] ]] && parts[1]=() + [[ $_POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER == 1 && $#parts > 1 && -n $parts[2] ]] && parts[1]=() local last_style= - [[ $POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD == true ]] && last_style+=%B - if (( $+POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND )); then - _p9k_translate_color $POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND - _p9k_foreground $_P9K_RETVAL - last_style+=$_P9K_RETVAL + (( _POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD )) && last_style+=%B + if (( $+_POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND )); then + _p9k_translate_color $_POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND + _p9k_foreground $_p9k_ret + last_style+=$_p9k_ret fi if [[ -n $last_style ]]; then - (( expand )) && _p9k_escape_rcurly $last_style || _P9K_RETVAL=$last_style - parts[-1]=$_P9K_RETVAL${parts[-1]//$'\1'/$'\1'$_P9K_RETVAL}$style + (( expand )) && _p9k_escape_rcurly $last_style || _p9k_ret=$last_style + parts[-1]=$_p9k_ret${parts[-1]//$'\1'/$'\1'$_p9k_ret}$style fi local anchor_style= - [[ $POWERLEVEL9K_DIR_ANCHOR_BOLD == true ]] && anchor_style+=%B - if (( $+POWERLEVEL9K_DIR_ANCHOR_FOREGROUND )); then - _p9k_translate_color $POWERLEVEL9K_DIR_ANCHOR_FOREGROUND - _p9k_foreground $_P9K_RETVAL - anchor_style+=$_P9K_RETVAL + (( _POWERLEVEL9K_DIR_ANCHOR_BOLD )) && anchor_style+=%B + if (( $+_POWERLEVEL9K_DIR_ANCHOR_FOREGROUND )); then + _p9k_translate_color $_POWERLEVEL9K_DIR_ANCHOR_FOREGROUND + _p9k_foreground $_p9k_ret + anchor_style+=$_p9k_ret fi if [[ -n $anchor_style ]]; then - (( expand )) && _p9k_escape_rcurly $anchor_style || _P9K_RETVAL=$anchor_style + (( expand )) && _p9k_escape_rcurly $anchor_style || _p9k_ret=$anchor_style if [[ -z $last_style ]]; then - parts=("${(@)parts/%(#b)(*)$'\2'/$_P9K_RETVAL$match[1]$style}") + parts=("${(@)parts/%(#b)(*)$'\2'/$_p9k_ret$match[1]$style}") else - (( $#parts > 1 )) && parts[1,-2]=("${(@)parts[1,-2]/%(#b)(*)$'\2'/$_P9K_RETVAL$match[1]$style}") + (( $#parts > 1 )) && parts[1,-2]=("${(@)parts[1,-2]/%(#b)(*)$'\2'/$_p9k_ret$match[1]$style}") parts[-1]=${parts[-1]/$'\2'} fi else parts=("${(@)parts/$'\2'}") fi - if (( $+POWERLEVEL9K_DIR_SHORTENED_FOREGROUND )); then - _p9k_translate_color $POWERLEVEL9K_DIR_SHORTENED_FOREGROUND - _p9k_foreground $_P9K_RETVAL - (( expand )) && _p9k_escape_rcurly $_P9K_RETVAL - local shortened_fg=$_P9K_RETVAL - (( expand )) && _p9k_escape $delim || _P9K_RETVAL=$delim - [[ $_P9K_RETVAL == *%* ]] && _P9K_RETVAL+=$style$shortened_fg - parts=("${(@)parts/(#b)$'\3'(*)$'\1'(*)$'\3'/$shortened_fg$match[1]$_P9K_RETVAL$match[2]$style}") - parts=("${(@)parts/(#b)(*)$'\1'(*)/$shortened_fg$match[1]$_P9K_RETVAL$match[2]$style}") + if (( $+_POWERLEVEL9K_DIR_SHORTENED_FOREGROUND )); then + _p9k_translate_color $_POWERLEVEL9K_DIR_SHORTENED_FOREGROUND + _p9k_foreground $_p9k_ret + (( expand )) && _p9k_escape_rcurly $_p9k_ret + local shortened_fg=$_p9k_ret + (( expand )) && _p9k_escape $delim || _p9k_ret=$delim + [[ $_p9k_ret == *%* ]] && _p9k_ret+=$style$shortened_fg + parts=("${(@)parts/(#b)$'\3'(*)$'\1'(*)$'\3'/$shortened_fg$match[1]$_p9k_ret$match[2]$style}") + parts=("${(@)parts/(#b)(*)$'\1'(*)/$shortened_fg$match[1]$_p9k_ret$match[2]$style}") else - (( expand )) && _p9k_escape $delim || _P9K_RETVAL=$delim - [[ $_P9K_RETVAL == *%* ]] && _P9K_RETVAL+=$style - parts=("${(@)parts/$'\1'/$_P9K_RETVAL}") + (( expand )) && _p9k_escape $delim || _p9k_ret=$delim + [[ $_p9k_ret == *%* ]] && _p9k_ret+=$style + parts=("${(@)parts/$'\1'/$_p9k_ret}") parts=("${(@)parts//$'\3'}") fi local sep='' - if [[ -n $POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND ]]; then - _p9k_translate_color $POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND - _p9k_foreground $_P9K_RETVAL - (( expand )) && _p9k_escape_rcurly $_P9K_RETVAL - sep=$_P9K_RETVAL - fi - (( expand )) && _p9k_escape $POWERLEVEL9K_DIR_PATH_SEPARATOR || _P9K_RETVAL=$POWERLEVEL9K_DIR_PATH_SEPARATOR - sep+=$_P9K_RETVAL + if (( $+_POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND )); then + _p9k_translate_color $_POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND + _p9k_foreground $_p9k_ret + (( expand )) && _p9k_escape_rcurly $_p9k_ret + sep=$_p9k_ret + fi + (( expand )) && _p9k_escape $_POWERLEVEL9K_DIR_PATH_SEPARATOR || _p9k_ret=$_POWERLEVEL9K_DIR_PATH_SEPARATOR + sep+=$_p9k_ret [[ $sep == *%* ]] && sep+=$style local content="${(pj.$sep.)parts}" - if [[ $POWERLEVEL9K_DIR_HYPERLINK == true ]]; then + if (( _POWERLEVEL9K_DIR_HYPERLINK )); then local pref=$'%{\e]8;;file://'${${PWD//\%/%%25}//'#'/%%23}$'\a%}' local suf=$'%{\e]8;;\a%}' if (( expand )); then _p9k_escape $pref - pref=$_P9K_RETVAL + pref=$_p9k_ret _p9k_escape $suf - suf=$_P9K_RETVAL + suf=$_p9k_ret fi content=$pref$content$suf fi - (( expand )) && eval "_p9k_prompt_length \"\${\${_P9K_D::=0}+}$content\"" || _P9K_RETVAL= - _p9k_cache_set "$state" "$icon" "$expand" "$content" $_P9K_RETVAL + (( expand )) && eval "_p9k_prompt_length \"\${\${_p9k_d::=0}+}$content\"" || _p9k_ret= + _p9k_cache_set "$state" "$icon" "$expand" "$content" $_p9k_ret fi - if (( _P9K_CACHE_VAL[3] )); then - if (( $+_P9K_DIR )); then - _P9K_CACHE_VAL[4]='${${_P9K_D::=-1024}+}'$_P9K_CACHE_VAL[4] + if (( _p9k_cache_val[3] )); then + if (( $+_p9k_dir )); then + _p9k_cache_val[4]='${${_p9k_d::=-1024}+}'$_p9k_cache_val[4] else - _P9K_DIR=$_P9K_CACHE_VAL[4] - _P9K_DIR_LEN=$_P9K_CACHE_VAL[5] - _P9K_CACHE_VAL[4]='%{d%\}'$_P9K_CACHE_VAL[4]'%{d%\}' + _p9k_dir=$_p9k_cache_val[4] + _p9k_dir_len=$_p9k_cache_val[5] + _p9k_cache_val[4]='%{d%\}'$_p9k_cache_val[4]'%{d%\}' fi fi - $1_prompt_segment "$_P9K_CACHE_VAL[1]" "$2" "blue" "$DEFAULT_COLOR" "$_P9K_CACHE_VAL[2]" "$_P9K_CACHE_VAL[3]" "" "$_P9K_CACHE_VAL[4]" + $1_prompt_segment "$_p9k_cache_val[1]" "$2" "blue" "$_p9k_color1" "$_p9k_cache_val[2]" "$_p9k_cache_val[3]" "" "$_p9k_cache_val[4]" } ################################################################ # Docker machine prompt_docker_machine() { if [[ -n "$DOCKER_MACHINE_NAME" ]]; then - "$1_prompt_segment" "$0" "$2" "magenta" "$DEFAULT_COLOR" 'SERVER_ICON' 0 '' "${DOCKER_MACHINE_NAME//\%/%%}" + "$1_prompt_segment" "$0" "$2" "magenta" "$_p9k_color1" 'SERVER_ICON' 0 '' "${DOCKER_MACHINE_NAME//\%/%%}" fi } @@ -1425,14 +1530,14 @@ prompt_docker_machine() { prompt_go_version() { _p9k_cached_cmd_stdout go version || return local -a match - [[ $_P9K_RETVAL == (#b)*go([[:digit:].]##)* ]] || return + [[ $_p9k_ret == (#b)*go([[:digit:].]##)* ]] || return local v=$match[1] local p=$GOPATH if [[ -z $p ]]; then if [[ -d $HOME/go ]]; then p=$HOME/go else - p=$(command go env GOPATH 2>/dev/null) && [[ -n $p ]] || return + p=$(go env GOPATH 2>/dev/null) && [[ -n $p ]] || return fi fi if [[ $PWD/ != $p/* ]]; then @@ -1448,19 +1553,19 @@ prompt_go_version() { ################################################################ # Command number (in local history) prompt_history() { - "$1_prompt_segment" "$0" "$2" "grey50" "$DEFAULT_COLOR" '' 0 '' '%h' + "$1_prompt_segment" "$0" "$2" "grey50" "$_p9k_color1" '' 0 '' '%h' } ################################################################ # Detection for virtualization (systemd based systems only) prompt_detect_virt() { (( $+commands[systemd-detect-virt] )) || return - local virt=$(command systemd-detect-virt 2>/dev/null) + local virt=$(systemd-detect-virt 2>/dev/null) if [[ "$virt" == "none" ]]; then - [[ "$(command ls -di /)" != "2 /" ]] && virt="chroot" + [[ "$(ls -di /)" != "2 /" ]] && virt="chroot" fi if [[ -n "${virt}" ]]; then - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" '' 0 '' "${virt//\%/%%}" + "$1_prompt_segment" "$0" "$2" "$_p9k_color1" "yellow" '' 0 '' "${virt//\%/%%}" fi } @@ -1478,19 +1583,16 @@ prompt_icons_test() { ################################################################ # Segment to display the current IP address -set_default POWERLEVEL9K_IP_INTERFACE "^[^ ]+" prompt_ip() { - _p9k_parse_ip $POWERLEVEL9K_IP_INTERFACE || return - "$1_prompt_segment" "$0" "$2" "cyan" "$DEFAULT_COLOR" 'NETWORK_ICON' 0 '' "${_P9K_RETVAL//\%/%%}" + _p9k_parse_ip $_POWERLEVEL9K_IP_INTERFACE || return + "$1_prompt_segment" "$0" "$2" "cyan" "$_p9k_color1" 'NETWORK_ICON' 0 '' "${_p9k_ret//\%/%%}" } ################################################################ # Segment to display if VPN is active -set_default POWERLEVEL9K_VPN_IP_INTERFACE "tun" -# prompt if vpn active prompt_vpn_ip() { - _p9k_parse_ip $POWERLEVEL9K_VPN_IP_INTERFACE || return - "$1_prompt_segment" "$0" "$2" "cyan" "$DEFAULT_COLOR" 'VPN_ICON' 0 '' "${_P9K_RETVAL//\%/%%}" + _p9k_parse_ip $_POWERLEVEL9K_VPN_IP_INTERFACE || return + "$1_prompt_segment" "$0" "$2" "cyan" "$_p9k_color1" 'VPN_ICON' 0 '' "${_p9k_ret//\%/%%}" } ################################################################ @@ -1506,46 +1608,39 @@ prompt_laravel_version() { ################################################################ # Segment to display load -set_default -i POWERLEVEL9K_LOAD_WHICH 5 prompt_load() { local bucket=2 - case $POWERLEVEL9K_LOAD_WHICH in + case $_POWERLEVEL9K_LOAD_WHICH in 1) bucket=1;; 5) bucket=2;; 15) bucket=3;; esac local load - case $OS in + case $_p9k_os in OSX|BSD) (( $+commands[sysctl] )) || return - load=$(command sysctl -n vm.loadavg 2>/dev/null) || return + load=$(sysctl -n vm.loadavg 2>/dev/null) || return load=${${(A)=load}[bucket+1]//,/.} ;; *) [[ -r /proc/loadavg ]] || return _p9k_read_file /proc/loadavg || return - load=${${(A)=_P9K_RETVAL}[bucket]//,/.} + load=${${(A)=_p9k_ret}[bucket]//,/.} ;; esac - if (( ! $+_P9K_NUM_CPUS )); then - case $OS in - OSX) (( $+commands[sysctl] )) && _P9K_NUM_CPUS=$(command sysctl -n hw.logicalcpu 2>/dev/null) || return;; - BSD) (( $+commands[sysctl] )) && _P9K_NUM_CPUS=$(command sysctl -n hw.ncpu 2>/dev/null) || return;; - *) (( $+commands[nproc] )) && _P9K_NUM_CPUS=$(command nproc 2>/dev/null) || return;; - esac - fi + (( _p9k_num_cpus )) || return - if (( load > 0.7 * _P9K_NUM_CPUS )); then + if (( load > 0.7 * _p9k_num_cpus )); then local state=critical bg=red - elif (( load > 0.5 * _P9K_NUM_CPUS )); then + elif (( load > 0.5 * _p9k_num_cpus )); then local state=warning bg=yellow else local state=normal bg=green fi - $1_prompt_segment $0_$state $2 $bg "$DEFAULT_COLOR" LOAD_ICON 0 '' $load + $1_prompt_segment $0_$state $2 $bg "$_p9k_color1" LOAD_ICON 0 '' $load } function _p9k_cached_cmd_stdout() { @@ -1559,8 +1654,8 @@ function _p9k_cached_cmd_stdout() { out=$($cmd "$@" 2>/dev/null) _p9k_cache_set $(( ! $? )) "$out" fi - (( $_P9K_CACHE_VAL[1] )) || return - _P9K_RETVAL=$_P9K_CACHE_VAL[2] + (( $_p9k_cache_val[1] )) || return + _p9k_ret=$_p9k_cache_val[2] } function _p9k_cached_cmd_stdout_stderr() { @@ -1574,17 +1669,16 @@ function _p9k_cached_cmd_stdout_stderr() { out=$($cmd "$@" 2>&1) # this line is the only diff with _p9k_cached_cmd_stdout _p9k_cache_set $(( ! $? )) "$out" fi - (( $_P9K_CACHE_VAL[1] )) || return - _P9K_RETVAL=$_P9K_CACHE_VAL[2] + (( $_p9k_cache_val[1] )) || return + _p9k_ret=$_p9k_cache_val[2] } ################################################################ # Segment to diplay Node version -set_default P9K_NODE_VERSION_PROJECT_ONLY false prompt_node_version() { (( $+commands[node] )) || return - if [[ $P9K_NODE_VERSION_PROJECT_ONLY == true ]] ; then + if (( _POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY )); then local dir=$PWD while true; do [[ $dir == / ]] && return @@ -1593,8 +1687,8 @@ prompt_node_version() { done fi - _p9k_cached_cmd_stdout node --version && [[ $_P9K_RETVAL == v?* ]] || return - "$1_prompt_segment" "$0" "$2" "green" "white" 'NODE_ICON' 0 '' "${_P9K_RETVAL#v}" + _p9k_cached_cmd_stdout node --version && [[ $_p9k_ret == v?* ]] || return + "$1_prompt_segment" "$0" "$2" "green" "white" 'NODE_ICON' 0 '' "${_p9k_ret#v}" } # Almost the same as `nvm_version default` but faster. The differences shouldn't affect @@ -1614,7 +1708,7 @@ function _p9k_nvm_ls_default() { return 1 ;; system|v) - _P9K_RETVAL=system + _p9k_ret=system return ;; iojs-[0-9]*) @@ -1627,10 +1721,10 @@ function _p9k_nvm_ls_default() { if [[ $v == v*.*.* ]]; then if [[ -x $NVM_DIR/versions/node/$v/bin/node || -x $NVM_DIR/$v/bin/node ]]; then - _P9K_RETVAL=$v + _p9k_ret=$v return elif [[ -x $NVM_DIR/versions/io.js/$v/bin/node ]]; then - _P9K_RETVAL=iojs-$v + _p9k_ret=iojs-$v return else return 1 @@ -1667,8 +1761,8 @@ function _p9k_nvm_ls_default() { v=${(j::)${(@l:6::0:)match}} [[ $v > $max ]] || continue max=$v - _P9K_RETVAL=${path:t} - [[ ${path:h:t} != io.js ]] || _P9K_RETVAL=iojs-$_P9K_RETVAL + _p9k_ret=${path:t} + [[ ${path:h:t} != io.js ]] || _p9k_ret=iojs-$_p9k_ret done [[ -n $max ]] @@ -1682,12 +1776,12 @@ _p9k_nvm_ls_current() { local nvm_dir=${NVM_DIR:A} if [[ -n $nvm_dir && $node_path == $nvm_dir/versions/io.js/* ]]; then _p9k_cached_cmd_stdout iojs --version || return - _P9K_RETVAL=iojs-v${_P9K_RETVAL#v} + _p9k_ret=iojs-v${_p9k_ret#v} elif [[ -n $nvm_dir && $node_path == $nvm_dir/* ]]; then _p9k_cached_cmd_stdout node --version || return - _P9K_RETVAL=v${_P9K_RETVAL#v} + _p9k_ret=v${_p9k_ret#v} else - _P9K_RETVAL=system + _p9k_ret=system fi } @@ -1696,8 +1790,8 @@ _p9k_nvm_ls_current() { # Only prints the segment if different than the default value prompt_nvm() { [[ -n $NVM_DIR ]] && _p9k_nvm_ls_current || return - local current=$_P9K_RETVAL - ! _p9k_nvm_ls_default || [[ $_P9K_RETVAL != $current ]] || return + local current=$_p9k_ret + ! _p9k_nvm_ls_default || [[ $_p9k_ret != $current ]] || return $1_prompt_segment "$0" "$2" "magenta" "black" 'NODE_ICON' 0 '' "${${current#v}//\%/%%}" } @@ -1706,7 +1800,7 @@ prompt_nvm() { prompt_nodeenv() { if [[ -n "$NODE_VIRTUAL_ENV" ]]; then _p9k_cached_cmd_stdout node --version || return - local info="${_P9K_RETVAL}[${NODE_VIRTUAL_ENV:t}]" + local info="${_p9k_ret}[${NODE_VIRTUAL_ENV:t}]" "$1_prompt_segment" "$0" "$2" "black" "green" 'NODE_ICON' 0 '' "${info//\%/%%}" fi } @@ -1714,50 +1808,49 @@ prompt_nodeenv() { function _p9k_read_nodenv_version_file() { [[ -r $1 ]] || return local rest - read _P9K_RETVAL rest <$1 2>/dev/null - [[ -n $_P9K_RETVAL ]] + read _p9k_ret rest <$1 2>/dev/null + [[ -n $_p9k_ret ]] } function _p9k_nodeenv_version_transform() { local dir=${NODENV_ROOT:-$HOME/.nodenv}/versions - [[ -z $1 || $1 == system ]] && _P9K_RETVAL=$1 && return - [[ -d $dir/$1 ]] && _P9K_RETVAL=$1 && return - [[ -d $dir/${1/v} ]] && _P9K_RETVAL=${1/v} && return - [[ -d $dir/${1#node-} ]] && _P9K_RETVAL=${1#node-} && return - [[ -d $dir/${1#node-v} ]] && _P9K_RETVAL=${1#node-v} && return + [[ -z $1 || $1 == system ]] && _p9k_ret=$1 && return + [[ -d $dir/$1 ]] && _p9k_ret=$1 && return + [[ -d $dir/${1/v} ]] && _p9k_ret=${1/v} && return + [[ -d $dir/${1#node-} ]] && _p9k_ret=${1#node-} && return + [[ -d $dir/${1#node-v} ]] && _p9k_ret=${1#node-v} && return return 1 } function _p9k_nodenv_global_version() { - _p9k_read_nodenv_version_file ${NODENV_ROOT:-$HOME/.nodenv}/version || _P9K_RETVAL=system + _p9k_read_nodenv_version_file ${NODENV_ROOT:-$HOME/.nodenv}/version || _p9k_ret=system } ################################################################ # Segment to display nodenv information # https://github.com/nodenv/nodenv -set_default POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW false prompt_nodenv() { (( $+commands[nodenv] )) || return - _P9K_RETVAL=$NODENV_VERSION - if [[ -z $_P9K_RETVAL ]]; then + _p9k_ret=$NODENV_VERSION + if [[ -z $_p9k_ret ]]; then [[ $NODENV_DIR == /* ]] && local dir=$NODENV_DIR || local dir="$PWD/$NODENV_DIR" while [[ $dir != //[^/]# ]]; do _p9k_read_nodenv_version_file $dir/.node-version && break [[ $dir == / ]] && break dir=${dir:h} done - if [[ -z $_P9K_RETVAL ]]; then - [[ $POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW == true ]] || return + if [[ -z $_p9k_ret ]]; then + (( _POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW )) || return _p9k_nodenv_global_version fi fi - _p9k_nodeenv_version_transform $_P9K_RETVAL || return - local v=$_P9K_RETVAL + _p9k_nodeenv_version_transform $_p9k_ret || return + local v=$_p9k_ret - if [[ $POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW == false ]]; then + if (( !_POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW )); then _p9k_nodenv_global_version - _p9k_nodeenv_version_transform $_P9K_RETVAL && [[ $v == $_P9K_RETVAL ]] && return + _p9k_nodeenv_version_transform $_p9k_ret && [[ $v == $_p9k_ret ]] && return fi "$1_prompt_segment" "$0" "$2" "black" "green" 'NODE_ICON' 0 '' "${v//\%/%%}" @@ -1766,7 +1859,7 @@ prompt_nodenv() { ################################################################ # Segment to print a little OS icon prompt_os_icon() { - "$1_prompt_segment" "$0" "$2" "black" "white" '' 0 '' "$OS_ICON" + "$1_prompt_segment" "$0" "$2" "black" "white" '' 0 '' "$_p9k_os_icon" } ################################################################ @@ -1774,7 +1867,7 @@ prompt_os_icon() { prompt_php_version() { _p9k_cached_cmd_stdout php --version || return local -a match - [[ $_P9K_RETVAL == (#b)(*$'\n')#(PHP [[:digit:].]##)* ]] || return + [[ $_p9k_ret == (#b)(*$'\n')#(PHP [[:digit:].]##)* ]] || return local v=$match[2] "$1_prompt_segment" "$0" "$2" "fuchsia" "grey93" '' 0 '' "${v//\%/%%}" } @@ -1784,10 +1877,10 @@ prompt_php_version() { prompt_ram() { local -F free_bytes - case $OS in + case $_p9k_os in OSX) (( $+commands[vm_stat] )) || return - local stat && stat=$(command vm_stat 2>/dev/null) || return + local stat && stat=$(vm_stat 2>/dev/null) || return [[ $stat =~ 'Pages free:[[:space:]]+([0-9]+)' ]] || return (( free_bytes+=match[1] )) [[ $stat =~ 'Pages inactive:[[:space:]]+([0-9]+)' ]] || return @@ -1795,35 +1888,34 @@ prompt_ram() { (( free_bytes *= 4096 )) ;; BSD) - local stat && stat=$(command grep -F 'avail memory' /var/run/dmesg.boot 2>/dev/null) || return + local stat && stat=$(grep -F 'avail memory' /var/run/dmesg.boot 2>/dev/null) || return free_bytes=${${(A)=stat}[4]} ;; *) - local stat && stat=$(command grep -F MemAvailable /proc/meminfo 2>/dev/null) || return + local stat && stat=$(grep -F MemAvailable /proc/meminfo 2>/dev/null) || return free_bytes=$(( ${${(A)=stat}[2]} * 1024 )) ;; esac _p9k_human_readable_bytes $free_bytes - $1_prompt_segment $0 $2 yellow "$DEFAULT_COLOR" RAM_ICON 0 '' $_P9K_RETVAL + $1_prompt_segment $0 $2 yellow "$_p9k_color1" RAM_ICON 0 '' $_p9k_ret } function _p9k_read_rbenv_version_file() { [[ -r $1 ]] || return local content read -r content <$1 2>/dev/null - _P9K_RETVAL="${${(A)=content}[1]}" - [[ -n $_P9K_RETVAL ]] + _p9k_ret="${${(A)=content}[1]}" + [[ -n $_p9k_ret ]] } function _p9k_rbenv_global_version() { - _p9k_read_rbenv_version_file ${RBENV_ROOT:-$HOME/.rbenv}/version || _P9K_RETVAL=system + _p9k_read_rbenv_version_file ${RBENV_ROOT:-$HOME/.rbenv}/version || _p9k_ret=system } ################################################################ # Segment to display rbenv information # https://github.com/rbenv/rbenv#choosing-the-ruby-version -set_default POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW false prompt_rbenv() { (( $+commands[rbenv] )) || return local v=$RBENV_VERSION @@ -1831,53 +1923,51 @@ prompt_rbenv() { [[ $RBENV_DIR == /* ]] && local dir=$RBENV_DIR || local dir="$PWD/$RBENV_DIR" while true; do if _p9k_read_rbenv_version_file $dir/.ruby-version; then - v=$_P9K_RETVAL + v=$_p9k_ret break fi if [[ $dir == / ]]; then - [[ $POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW == true ]] || return + (( _POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW )) || return _p9k_rbenv_global_version - v=$_P9K_RETVAL + v=$_p9k_ret break fi dir=${dir:h} done fi - if [[ $POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW == false ]]; then + if (( !_POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW )); then _p9k_rbenv_global_version - [[ $v == $_P9K_RETVAL ]] && return + [[ $v == $_p9k_ret ]] && return fi - "$1_prompt_segment" "$0" "$2" "red" "$DEFAULT_COLOR" 'RUBY_ICON' 0 '' "${v//\%/%%}" + "$1_prompt_segment" "$0" "$2" "red" "$_p9k_color1" 'RUBY_ICON' 0 '' "${v//\%/%%}" } ################################################################ # Segment to display chruby information # see https://github.com/postmodern/chruby/issues/245 for chruby_auto issue with ZSH -set_default POWERLEVEL9K_CHRUBY_SHOW_VERSION true -set_default POWERLEVEL9K_CHRUBY_SHOW_ENGINE true prompt_chruby() { [[ -n $RUBY_ENGINE ]] || return local v='' - [[ $POWERLEVEL9K_CHRUBY_SHOW_ENGINE == true ]] && v=$RUBY_ENGINE - if [[ $POWERLEVEL9K_CHRUBY_SHOW_VERSION == true && -n $RUBY_VERSION ]] && v+=${v:+ }$RUBY_VERSION - "$1_prompt_segment" "$0" "$2" "red" "$DEFAULT_COLOR" 'RUBY_ICON' 0 '' "${v//\%/%%}" + (( _POWERLEVEL9K_CHRUBY_SHOW_ENGINE )) && v=$RUBY_ENGINE + if [[ $_POWERLEVEL9K_CHRUBY_SHOW_VERSION == 1 && -n $RUBY_VERSION ]] && v+=${v:+ }$RUBY_VERSION + "$1_prompt_segment" "$0" "$2" "red" "$_p9k_color1" 'RUBY_ICON' 0 '' "${v//\%/%%}" } ################################################################ # Segment to print an icon if user is root. prompt_root_indicator() { - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" 'ROOT_ICON' 0 '${${(%):-%#}:#%}' '' + "$1_prompt_segment" "$0" "$2" "$_p9k_color1" "yellow" 'ROOT_ICON' 0 '${${(%):-%#}:#%}' '' } ################################################################ # Segment to display Rust version number prompt_rust_version() { _p9k_cached_cmd_stdout rustc --version || return - local v=${${_P9K_RETVAL#rustc }%% *} + local v=${${_p9k_ret#rustc }%% *} [[ -n $v ]] || return - "$1_prompt_segment" "$0" "$2" "darkorange" "$DEFAULT_COLOR" 'RUST_ICON' 0 '' "${v//\%/%%}" + "$1_prompt_segment" "$0" "$2" "darkorange" "$_p9k_color1" 'RUST_ICON' 0 '' "${v//\%/%%}" } # RSpec test ratio @@ -1897,97 +1987,85 @@ prompt_rvm() { [[ $GEM_HOME == *rvm* && $ruby_string != $rvm_path/bin/ruby ]] || return local v=${${${GEM_HOME:t}%%${rvm_gemset_separator:-@}*}#*-} [[ -n $v ]] || return - "$1_prompt_segment" "$0" "$2" "240" "$DEFAULT_COLOR" 'RUBY_ICON' 0 '' "${v//\%/%%}" + "$1_prompt_segment" "$0" "$2" "240" "$_p9k_color1" 'RUBY_ICON' 0 '' "${v//\%/%%}" } ################################################################ # Segment to display SSH icon when connected prompt_ssh() { if [[ -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" 'SSH_ICON' 0 '' '' + "$1_prompt_segment" "$0" "$2" "$_p9k_color1" "yellow" 'SSH_ICON' 0 '' '' fi } -################################################################ -# Status: When an error occur, return the error code, or a cross icon if option is set -# Display an ok icon when no error occur, or hide the segment if option is set to false -# -set_default POWERLEVEL9K_STATUS_CROSS false -set_default POWERLEVEL9K_STATUS_OK true -set_default POWERLEVEL9K_STATUS_SHOW_PIPESTATUS true -set_default POWERLEVEL9K_STATUS_HIDE_SIGNAME false -# old options, retro compatibility -set_default POWERLEVEL9K_STATUS_VERBOSE true -set_default POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE false - exit_code_or_status() { local ec=$1 - if [[ "$POWERLEVEL9K_STATUS_HIDE_SIGNAME" = true ]] || (( ec <= 128 )); then - _P9K_RETVAL=$ec + if (( _POWERLEVEL9K_STATUS_HIDE_SIGNAME || ec <= 128 )); then + _p9k_ret=$ec else - _P9K_RETVAL="SIG${signals[$((ec - 127))]}($((ec - 128)))" + _p9k_ret="SIG${signals[$((ec - 127))]}($((ec - 128)))" fi } -typeset -gi _P9K_EXIT_CODE -typeset -ga _P9K_PIPE_EXIT_CODES - +################################################################ +# Status: When an error occur, return the error code, or a cross icon if option is set +# Display an ok icon when no error occur, or hide the segment if option is set to false prompt_status() { - if ! _p9k_cache_get "$0" "$2" "$_P9K_EXIT_CODE" "${(@)_P9K_PIPE_EXIT_CODES}"; then + if ! _p9k_cache_get "$0" "$2" "$__p9k_exit_code" "${(@)__p9k_pipe_exit_codes}"; then local ec_text local ec_sum local ec - if [[ $POWERLEVEL9K_STATUS_SHOW_PIPESTATUS == true ]]; then - if (( $#_P9K_PIPE_EXIT_CODES > 1 )); then - ec_sum=${_P9K_PIPE_EXIT_CODES[1]} - exit_code_or_status "${_P9K_PIPE_EXIT_CODES[1]}" + if (( _POWERLEVEL9K_STATUS_SHOW_PIPESTATUS )); then + if (( $#__p9k_pipe_exit_codes > 1 )); then + ec_sum=${__p9k_pipe_exit_codes[1]} + exit_code_or_status "${__p9k_pipe_exit_codes[1]}" else - ec_sum=${_P9K_EXIT_CODE} - exit_code_or_status "${_P9K_EXIT_CODE}" + ec_sum=${__p9k_exit_code} + exit_code_or_status "${__p9k_exit_code}" fi - ec_text=$_P9K_RETVAL - for ec in "${(@)_P9K_PIPE_EXIT_CODES[2,-1]}"; do + ec_text=$_p9k_ret + for ec in "${(@)__p9k_pipe_exit_codes[2,-1]}"; do (( ec_sum += ec )) exit_code_or_status "$ec" - ec_text+="|$_P9K_RETVAL" + ec_text+="|$_p9k_ret" done else - ec_sum=${_P9K_EXIT_CODE} - # We use _P9K_EXIT_CODE instead of the right-most _P9K_PIPE_EXIT_CODES item because + ec_sum=${__p9k_exit_code} + # We use __p9k_exit_code instead of the right-most __p9k_pipe_exit_codes item because # PIPE_FAIL may be set. - exit_code_or_status "${_P9K_EXIT_CODE}" - ec_text=$_P9K_RETVAL + exit_code_or_status "${__p9k_exit_code}" + ec_text=$_p9k_ret fi if (( ec_sum > 0 )); then - if [[ "$POWERLEVEL9K_STATUS_CROSS" == false && "$POWERLEVEL9K_STATUS_VERBOSE" == true ]]; then - _P9K_CACHE_VAL=("$0_ERROR" "$2" red yellow1 CARRIAGE_RETURN_ICON 0 '' "$ec_text") + if (( !_POWERLEVEL9K_STATUS_CROSS && _POWERLEVEL9K_STATUS_VERBOSE )); then + _p9k_cache_val=("$0_ERROR" "$2" red yellow1 CARRIAGE_RETURN_ICON 0 '' "$ec_text") else - _P9K_CACHE_VAL=("$0_ERROR" "$2" "$DEFAULT_COLOR" red FAIL_ICON 0 '' '') + _p9k_cache_val=("$0_ERROR" "$2" "$_p9k_color1" red FAIL_ICON 0 '' '') fi - elif [[ "$POWERLEVEL9K_STATUS_OK" == true ]] && [[ "$POWERLEVEL9K_STATUS_VERBOSE" == true || "$POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE" == true ]]; then - _P9K_CACHE_VAL=("$0_OK" "$2" "$DEFAULT_COLOR" green OK_ICON 0 '' '') + elif (( _POWERLEVEL9K_STATUS_OK && (_POWERLEVEL9K_STATUS_VERBOSE || _POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE) )); then + _p9k_cache_val=("$0_OK" "$2" "$_p9k_color1" green OK_ICON 0 '' '') else return fi - if (( $#_P9K_PIPE_EXIT_CODES < 3 )); then - _p9k_cache_set "${(@)_P9K_CACHE_VAL}" + if (( $#__p9k_pipe_exit_codes < 3 )); then + _p9k_cache_set "${(@)_p9k_cache_val}" fi fi - "$1_prompt_segment" "${(@)_P9K_CACHE_VAL}" + "$1_prompt_segment" "${(@)_p9k_cache_val}" } prompt_prompt_char() { - if (( _P9K_EXIT_CODE )); then - $1_prompt_segment $0_ERROR_VIINS $2 "$DEFAULT_COLOR" 196 '' 0 '${${KEYMAP:-0}:#vicmd}' '❯' - $1_prompt_segment $0_ERROR_VICMD $2 "$DEFAULT_COLOR" 196 '' 0 '${(M)${:-$KEYMAP$_P9K_REGION_ACTIVE}:#vicmd0}' '❮' - $1_prompt_segment $0_ERROR_VIVIS $2 "$DEFAULT_COLOR" 196 '' 0 '${(M)${:-$KEYMAP$_P9K_REGION_ACTIVE}:#vicmd1}' 'Ⅴ' + if (( __p9k_exit_code )); then + $1_prompt_segment $0_ERROR_VIINS $2 "$_p9k_color1" 196 '' 0 '${${KEYMAP:-0}:#vicmd}' '❯' + $1_prompt_segment $0_ERROR_VICMD $2 "$_p9k_color1" 196 '' 0 '${(M)${:-$KEYMAP$_p9k_region_active}:#vicmd0}' '❮' + $1_prompt_segment $0_ERROR_VIVIS $2 "$_p9k_color1" 196 '' 0 '${(M)${:-$KEYMAP$_p9k_region_active}:#vicmd1}' 'Ⅴ' else - $1_prompt_segment $0_OK_VIINS $2 "$DEFAULT_COLOR" 76 '' 0 '${${KEYMAP:-0}:#vicmd}' '❯' - $1_prompt_segment $0_OK_VICMD $2 "$DEFAULT_COLOR" 76 '' 0 '${(M)${:-$KEYMAP$_P9K_REGION_ACTIVE}:#vicmd0}' '❮' - $1_prompt_segment $0_OK_VIVIS $2 "$DEFAULT_COLOR" 76 '' 0 '${(M)${:-$KEYMAP$_P9K_REGION_ACTIVE}:#vicmd1}' 'Ⅴ' + $1_prompt_segment $0_OK_VIINS $2 "$_p9k_color1" 76 '' 0 '${${KEYMAP:-0}:#vicmd}' '❯' + $1_prompt_segment $0_OK_VICMD $2 "$_p9k_color1" 76 '' 0 '${(M)${:-$KEYMAP$_p9k_region_active}:#vicmd0}' '❮' + $1_prompt_segment $0_OK_VIVIS $2 "$_p9k_color1" 76 '' 0 '${(M)${:-$KEYMAP$_p9k_region_active}:#vicmd1}' 'Ⅴ' fi } @@ -1996,9 +2074,9 @@ prompt_prompt_char() { prompt_swap() { local -F used_bytes - if [[ "$OS" == "OSX" ]]; then + if [[ "$_p9k_os" == "OSX" ]]; then (( $+commands[sysctl] )) || return - [[ "$(command sysctl vm.swapusage 2>/dev/null)" =~ "used = ([0-9,.]+)([A-Z]+)" ]] || return + [[ "$(sysctl vm.swapusage 2>/dev/null)" =~ "used = ([0-9,.]+)([A-Z]+)" ]] || return used_bytes=${match[1]//,/.} case ${match[2]} in 'K') (( used_bytes *= 1024 ));; @@ -2008,7 +2086,7 @@ prompt_swap() { *) return;; esac else - local meminfo && meminfo=$(command grep -F 'Swap' /proc/meminfo 2>/dev/null) || return + local meminfo && meminfo=$(grep -F 'Swap' /proc/meminfo 2>/dev/null) || return [[ $meminfo =~ 'SwapTotal:[[:space:]]+([0-9]+)' ]] || return (( used_bytes+=match[1] )) [[ $meminfo =~ 'SwapFree:[[:space:]]+([0-9]+)' ]] || return @@ -2017,7 +2095,7 @@ prompt_swap() { fi _p9k_human_readable_bytes $used_bytes - $1_prompt_segment $0 $2 yellow "$DEFAULT_COLOR" SWAP_ICON 0 '' $_P9K_RETVAL + $1_prompt_segment $0 $2 yellow "$_p9k_color1" SWAP_ICON 0 '' $_p9k_ret } ################################################################ @@ -2035,8 +2113,8 @@ prompt_symfony2_tests() { # Segment to display Symfony2-Version prompt_symfony2_version() { if [[ -r app/bootstrap.php.cache ]]; then - local v="${$(command grep -F " VERSION " app/bootstrap.php.cache 2>/dev/null)//[![:digit:].]}" - "$1_prompt_segment" "$0" "$2" "grey35" "$DEFAULT_COLOR" 'SYMFONY_ICON' 0 '' "${v//\%/%%}" + local v="${$(grep -F " VERSION " app/bootstrap.php.cache 2>/dev/null)//[![:digit:].]}" + "$1_prompt_segment" "$0" "$2" "grey35" "$_p9k_color1" 'SYMFONY_ICON' 0 '' "${v//\%/%%}" fi } @@ -2050,80 +2128,55 @@ build_test_stats() { (( code_amount > 0 )) || return local -F 2 ratio=$(( 100. * tests_amount / code_amount )) - (( ratio >= 75 )) && "$1_prompt_segment" "${2}_GOOD" "$3" "cyan" "$DEFAULT_COLOR" "$6" 0 '' "$headline: $ratio%%" - (( ratio >= 50 && ratio < 75 )) && "$1_prompt_segment" "$2_AVG" "$3" "yellow" "$DEFAULT_COLOR" "$6" 0 '' "$headline: $ratio%%" - (( ratio < 50 )) && "$1_prompt_segment" "$2_BAD" "$3" "red" "$DEFAULT_COLOR" "$6" 0 '' "$headline: $ratio%%" + (( ratio >= 75 )) && "$1_prompt_segment" "${2}_GOOD" "$3" "cyan" "$_p9k_color1" "$6" 0 '' "$headline: $ratio%%" + (( ratio >= 50 && ratio < 75 )) && "$1_prompt_segment" "$2_AVG" "$3" "yellow" "$_p9k_color1" "$6" 0 '' "$headline: $ratio%%" + (( ratio < 50 )) && "$1_prompt_segment" "$2_BAD" "$3" "red" "$_p9k_color1" "$6" 0 '' "$headline: $ratio%%" } ################################################################ # System time - -# Format for the current time: 09:51:02. See `man 3 strftime`. -set_default POWERLEVEL9K_TIME_FORMAT "%D{%H:%M:%S}" -# If set to true, time will update every second. -set_default POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME false -# If set to true, time will update when you hit enter. This way prompts for the past -# commands will contain the start times of their commands as opposed to the default -# behavior where they contain the end times of their preceding commands. -set_default POWERLEVEL9K_TIME_UPDATE_ON_COMMAND false prompt_time() { - if [[ $POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME == true ]]; then - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "TIME_ICON" 0 '' \ - "$POWERLEVEL9K_TIME_FORMAT" + if (( _POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME )); then + "$1_prompt_segment" "$0" "$2" "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 0 '' \ + "$_POWERLEVEL9K_TIME_FORMAT" else - local t=${${(%)POWERLEVEL9K_TIME_FORMAT}//\%/%%} - if [[ $POWERLEVEL9K_TIME_UPDATE_ON_COMMAND == true ]]; then + local t=${${(%)_POWERLEVEL9K_TIME_FORMAT}//\%/%%} + if (( _POWERLEVEL9K_TIME_UPDATE_ON_COMMAND )); then _p9k_escape $t - t=$_P9K_RETVAL - _p9k_escape $POWERLEVEL9K_TIME_FORMAT - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "TIME_ICON" 1 '' \ - "\${_P9K_LINE_FINISH-$t}\${_P9K_LINE_FINISH+$_P9K_RETVAL}" + t=$_p9k_ret + _p9k_escape $_POWERLEVEL9K_TIME_FORMAT + "$1_prompt_segment" "$0" "$2" "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 1 '' \ + "\${_p9k_line_finish-$t}\${_p9k_line_finish+$_p9k_ret}" else - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "TIME_ICON" 0 '' $t + "$1_prompt_segment" "$0" "$2" "$_p9k_color2" "$_p9k_color1" "TIME_ICON" 0 '' $t fi fi } ################################################################ # System date -set_default POWERLEVEL9K_DATE_FORMAT "%D{%d.%m.%y}" prompt_date() { - local d=$POWERLEVEL9K_DATE_FORMAT - [[ $POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME == true ]] || d=${${(%)d}//\%/%%} - "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR_INVERTED" "$DEFAULT_COLOR" "DATE_ICON" 0 '' "$d" + local d=${${(%)_POWERLEVEL9K_DATE_FORMAT}//\%/%%} + "$1_prompt_segment" "$0" "$2" "$_p9k_color2" "$_p9k_color1" "DATE_ICON" 0 '' "$d" } ################################################################ # todo.sh: shows the number of tasks in your todo.sh file prompt_todo() { local todo=$commands[todo.sh] - [[ -n $todo ]] || return - if (( ! $+_P9K_TODO_FILE )); then - local bash=${commands[bash]:-:} - typeset -g _P9K_TODO_FILE=$($bash 2>/dev/null -c " - [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/.todo/config - [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/todo.cfg - [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/.todo.cfg - [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\${XDG_CONFIG_HOME:-\$HOME/.config}/todo/config - [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=${(qqq)todo:h}/todo.cfg - [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\${TODOTXT_GLOBAL_CFG_FILE:-/etc/todo/config} - [ -r \"\$TODOTXT_CFG_FILE\" ] || exit - source \"\$TODOTXT_CFG_FILE\" &>/dev/null - echo \"\$TODO_FILE\"") - fi - [[ -r $_P9K_TODO_FILE ]] || return + [[ -n $todo && -r $_p9k_todo_file ]] || return local -H stat - zstat -H stat -- $_P9K_TODO_FILE 2>/dev/null || return + zstat -H stat -- $_p9k_todo_file 2>/dev/null || return if ! _p9k_cache_get $0 $stat[inode] $stat[mtime] $stat[size]; then - local count=$($todo -p ls | command tail -1) + local count="$($todo -p ls | tail -1)" if [[ $count == (#b)'TODO: '[[:digit:]]##' of '([[:digit:]]##)' '* ]]; then _p9k_cache_set 1 $match[1] else _p9k_cache_set 0 0 fi fi - (( $_P9K_CACHE_VAL[1] )) || return - "$1_prompt_segment" "$0" "$2" "grey50" "$DEFAULT_COLOR" 'TODO_ICON' 0 '' "${_P9K_CACHE_VAL[2]}" + (( $_p9k_cache_val[1] )) || return + "$1_prompt_segment" "$0" "$2" "grey50" "$_p9k_color1" 'TODO_ICON' 0 '' "${_p9k_cache_val[2]}" } ################################################################ @@ -2131,51 +2184,206 @@ prompt_todo() { # version control # The vcs segment can have 4 different states - defaults to 'CLEAN'. -typeset -gA vcs_states=( +typeset -gA __p9k_vcs_states=( 'CLEAN' '2' 'MODIFIED' '3' 'UNTRACKED' '2' 'LOADING' '8' ) -set_default POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND red -set_default POWERLEVEL9K_SHOW_CHANGESET false -set_default POWERLEVEL9K_VCS_LOADING_TEXT loading -set_default -i POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH 8 -set_default -a POWERLEVEL9K_VCS_GIT_HOOKS vcs-detect-changes git-untracked git-aheadbehind git-stash git-remotebranch git-tagname -set_default -a POWERLEVEL9K_VCS_HG_HOOKS vcs-detect-changes -set_default -a POWERLEVEL9K_VCS_SVN_HOOKS vcs-detect-changes svn-detect-changes +function +vi-git-untracked() { + [[ -z "${vcs_comm[gitdir]}" || "${vcs_comm[gitdir]}" == "." ]] && return -# If it takes longer than this to fetch git repo status, display the prompt with a greyed out -# vcs segment and fix it asynchronously when the results come it. -set_default -F POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS 0.05 -set_default -a POWERLEVEL9K_VCS_BACKENDS git + # get the root for the current repo or submodule + local repoTopLevel="$(git rev-parse --show-toplevel 2> /dev/null)" + # dump out if we're outside a git repository (which includes being in the .git folder) + [[ $? != 0 || -z $repoTopLevel ]] && return -powerlevel9k_vcs_init() { - if [[ -n "$POWERLEVEL9K_CHANGESET_HASH_LENGTH" ]]; then - POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH="$POWERLEVEL9K_CHANGESET_HASH_LENGTH" + local untrackedFiles=$(git ls-files --others --exclude-standard "${repoTopLevel}" 2> /dev/null) + + if [[ -z $untrackedFiles && $_POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY == 1 ]]; then + untrackedFiles+=$(git submodule foreach --quiet --recursive 'git ls-files --others --exclude-standard' 2> /dev/null) fi + [[ -z $untrackedFiles ]] && return + + hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" + VCS_WORKDIR_HALF_DIRTY=true +} + +function +vi-git-aheadbehind() { + local ahead behind + local -a gitstatus + + # for git prior to 1.7 + # ahead=$(git rev-list origin/${hook_com[branch]}..HEAD | wc -l) + ahead=$(git rev-list --count "${hook_com[branch]}"@{upstream}..HEAD 2>/dev/null) + (( ahead )) && gitstatus+=( " $(print_icon 'VCS_OUTGOING_CHANGES_ICON')${ahead// /}" ) + + # for git prior to 1.7 + # behind=$(git rev-list HEAD..origin/${hook_com[branch]} | wc -l) + behind=$(git rev-list --count HEAD.."${hook_com[branch]}"@{upstream} 2>/dev/null) + (( behind )) && gitstatus+=( " $(print_icon 'VCS_INCOMING_CHANGES_ICON')${behind// /}" ) + + hook_com[misc]+=${(j::)gitstatus} +} + +function +vi-git-remotebranch() { + local remote + local branch_name="${hook_com[branch]}" + + # Are we on a remote-tracking branch? + remote=${$(git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)/refs\/(remotes|heads)\/} + + if (( $+_POWERLEVEL9K_VCS_SHORTEN_LENGTH && $+_POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH )); then + if (( ${#hook_com[branch]} > _POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH && ${#hook_com[branch]} > _POWERLEVEL9K_VCS_SHORTEN_LENGTH )); then + case $_POWERLEVEL9K_VCS_SHORTEN_STRATEGY in + truncate_middle) + hook_com[branch]="${branch_name:0:$_POWERLEVEL9K_VCS_SHORTEN_LENGTH}${_POWERLEVEL9K_VCS_SHORTEN_DELIMITER}${branch_name: -$_POWERLEVEL9K_VCS_SHORTEN_LENGTH}" + ;; + truncate_from_right) + hook_com[branch]="${branch_name:0:$_POWERLEVEL9K_VCS_SHORTEN_LENGTH}${_POWERLEVEL9K_VCS_SHORTEN_DELIMITER}" + ;; + esac + fi + fi + + if (( _POWERLEVEL9K_HIDE_BRANCH_ICON )); then + hook_com[branch]="${hook_com[branch]}" + else + hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${hook_com[branch]}" + fi + # Always show the remote + #if [[ -n ${remote} ]] ; then + # Only show the remote if it differs from the local + if [[ -n ${remote} ]] && [[ "${remote#*/}" != "${branch_name}" ]] ; then + hook_com[branch]+="$(print_icon 'VCS_REMOTE_BRANCH_ICON')${remote// /}" + fi +} + +function +vi-git-tagname() { + if (( !_POWERLEVEL9K_VCS_HIDE_TAGS )); then + # If we are on a tag, append the tagname to the current branch string. + local tag + tag=$(git describe --tags --exact-match HEAD 2>/dev/null) + + if [[ -n "${tag}" ]] ; then + # There is a tag that points to our current commit. Need to determine if we + # are also on a branch, or are in a DETACHED_HEAD state. + if [[ -z $(git symbolic-ref HEAD 2>/dev/null) ]]; then + # DETACHED_HEAD state. We want to append the tag name to the commit hash + # and print it. Unfortunately, `vcs_info` blows away the hash when a tag + # exists, so we have to manually retrieve it and clobber the branch + # string. + local revision + revision=$(git rev-list -n 1 --abbrev-commit --abbrev=${_POWERLEVEL9K_CHANGESET_HASH_LENGTH} HEAD) + if (( _POWERLEVEL9K_HIDE_BRANCH_ICON )); then + hook_com[branch]="${revision} $(print_icon 'VCS_TAG_ICON')${tag}" + else + hook_com[branch]="$(print_icon 'VCS_BRANCH_ICON')${revision} $(print_icon 'VCS_TAG_ICON')${tag}" + fi + else + # We are on both a tag and a branch; print both by appending the tag name. + hook_com[branch]+=" $(print_icon 'VCS_TAG_ICON')${tag}" + fi + fi + fi +} + +# Show count of stashed changes +# Port from https://github.com/whiteinge/dotfiles/blob/5dfd08d30f7f2749cfc60bc55564c6ea239624d9/.zsh_shouse_prompt#L268 +function +vi-git-stash() { + if [[ -s "${vcs_comm[gitdir]}/logs/refs/stash" ]] ; then + local -a stashes=( "${(@f)"$(<${vcs_comm[gitdir]}/logs/refs/stash)"}" ) + hook_com[misc]+=" $(print_icon 'VCS_STASH_ICON')${#stashes}" + fi +} + +function +vi-hg-bookmarks() { + if [[ -n "${hgbmarks[@]}" ]]; then + hook_com[hg-bookmark-string]=" $(print_icon 'VCS_BOOKMARK_ICON')${hgbmarks[@]}" + + # To signal that we want to use the sting we just generated, set the special + # variable `ret' to something other than the default zero: + ret=1 + return 0 + fi +} + +function +vi-vcs-detect-changes() { + if [[ "${hook_com[vcs]}" == "git" ]]; then + + local remote=$(git ls-remote --get-url 2> /dev/null) + if [[ "$remote" =~ "github" ]] then + vcs_visual_identifier='VCS_GIT_GITHUB_ICON' + elif [[ "$remote" =~ "bitbucket" ]] then + vcs_visual_identifier='VCS_GIT_BITBUCKET_ICON' + elif [[ "$remote" =~ "stash" ]] then + vcs_visual_identifier='VCS_GIT_BITBUCKET_ICON' + elif [[ "$remote" =~ "gitlab" ]] then + vcs_visual_identifier='VCS_GIT_GITLAB_ICON' + else + vcs_visual_identifier='VCS_GIT_ICON' + fi + + elif [[ "${hook_com[vcs]}" == "hg" ]]; then + vcs_visual_identifier='VCS_HG_ICON' + elif [[ "${hook_com[vcs]}" == "svn" ]]; then + vcs_visual_identifier='VCS_SVN_ICON' + fi + + if [[ -n "${hook_com[staged]}" ]] || [[ -n "${hook_com[unstaged]}" ]]; then + VCS_WORKDIR_DIRTY=true + else + VCS_WORKDIR_DIRTY=false + fi +} + +function +vi-svn-detect-changes() { + local svn_status="$(svn status)" + if [[ -n "$(echo "$svn_status" | \grep \^\?)" ]]; then + hook_com[unstaged]+=" $(print_icon 'VCS_UNTRACKED_ICON')" + VCS_WORKDIR_HALF_DIRTY=true + fi + if [[ -n "$(echo "$svn_status" | \grep \^\M)" ]]; then + hook_com[unstaged]+=" $(print_icon 'VCS_UNSTAGED_ICON')" + VCS_WORKDIR_DIRTY=true + fi + if [[ -n "$(echo "$svn_status" | \grep \^\A)" ]]; then + hook_com[staged]+=" $(print_icon 'VCS_STAGED_ICON')" + VCS_WORKDIR_DIRTY=true + fi +} + + +powerlevel9k_vcs_init() { autoload -Uz vcs_info - VCS_CHANGESET_PREFIX='' - if [[ "$POWERLEVEL9K_SHOW_CHANGESET" == true ]]; then - VCS_CHANGESET_PREFIX="$(print_icon 'VCS_COMMIT_ICON')%0.$POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH""i " + local prefix='' + if (( _POWERLEVEL9K_SHOW_CHANGESET )); then + _p9k_get_icon '' VCS_COMMIT_ICON + prefix="$_p9k_ret%0.${_POWERLEVEL9K_CHANGESET_HASH_LENGTH}i " fi zstyle ':vcs_info:*' check-for-changes true - VCS_DEFAULT_FORMAT="$VCS_CHANGESET_PREFIX%b%c%u%m" - zstyle ':vcs_info:*' formats "$VCS_DEFAULT_FORMAT" - zstyle ':vcs_info:*' actionformats "%b %F{${POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}}| %a%f" - zstyle ':vcs_info:*' stagedstr " $(print_icon 'VCS_STAGED_ICON')" - zstyle ':vcs_info:*' unstagedstr " $(print_icon 'VCS_UNSTAGED_ICON')" - zstyle ':vcs_info:git*+set-message:*' hooks $POWERLEVEL9K_VCS_GIT_HOOKS - zstyle ':vcs_info:hg*+set-message:*' hooks $POWERLEVEL9K_VCS_HG_HOOKS - zstyle ':vcs_info:svn*+set-message:*' hooks $POWERLEVEL9K_VCS_SVN_HOOKS + zstyle ':vcs_info:*' formats "$prefix%b%c%u%m" + zstyle ':vcs_info:*' actionformats "%b %F{$_POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}| %a%f" + _p9k_get_icon '' VCS_STAGED_ICON + zstyle ':vcs_info:*' stagedstr " $_p9k_ret" + _p9k_get_icon '' VCS_UNSTAGED_ICON + zstyle ':vcs_info:*' unstagedstr " $_p9k_ret" + zstyle ':vcs_info:git*+set-message:*' hooks $_POWERLEVEL9K_VCS_GIT_HOOKS + zstyle ':vcs_info:hg*+set-message:*' hooks $_POWERLEVEL9K_VCS_HG_HOOKS + zstyle ':vcs_info:svn*+set-message:*' hooks $_POWERLEVEL9K_VCS_SVN_HOOKS # For Hg, only show the branch name - zstyle ':vcs_info:hg*:*' branchformat "$(print_icon 'VCS_BRANCH_ICON')%b" + if (( _POWERLEVEL9K_HIDE_BRANCH_ICON )); then + zstyle ':vcs_info:hg*:*' branchformat "%b" + else + _p9k_get_icon '' VCS_BRANCH_ICON + zstyle ':vcs_info:hg*:*' branchformat "$_p9k_ret%b" + fi # The `get-revision` function must be turned on for dirty-check to work for Hg zstyle ':vcs_info:hg*:*' get-revision true zstyle ':vcs_info:hg*:*' get-bookmarks true @@ -2183,23 +2391,17 @@ powerlevel9k_vcs_init() { # TODO: fix the %b (branch) format for svn. Using %b breaks color-encoding of the foreground # for the rest of the powerline. - zstyle ':vcs_info:svn*:*' formats "$VCS_CHANGESET_PREFIX%c%u" - zstyle ':vcs_info:svn*:*' actionformats "$VCS_CHANGESET_PREFIX%c%u %F{${POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}}| %a%f" + zstyle ':vcs_info:svn*:*' formats "$prefix%c%u" + zstyle ':vcs_info:svn*:*' actionformats "$prefix%c%u %F{$_POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}| %a%f" - if [[ "$POWERLEVEL9K_SHOW_CHANGESET" == true ]]; then + if (( _POWERLEVEL9K_SHOW_CHANGESET )); then zstyle ':vcs_info:*' get-revision true fi } -# git workdir => the last prompt we've shown for it -typeset -gAH _P9K_LAST_GIT_PROMPT - -# git workdir => 1 if gitstatus is slow on it, 0 if it's fast. -typeset -gAH _P9K_GIT_SLOW - function _p9k_vcs_status_save() { local z=$'\0' - _P9K_LAST_GIT_PROMPT[$VCS_STATUS_WORKDIR]=$VCS_STATUS_ACTION$z$VCS_STATUS_COMMIT\ + _p9k_last_git_prompt[$VCS_STATUS_WORKDIR]=$VCS_STATUS_ACTION$z$VCS_STATUS_COMMIT\ $z$VCS_STATUS_COMMITS_AHEAD$z$VCS_STATUS_COMMITS_BEHIND$z$VCS_STATUS_HAS_CONFLICTED\ $z$VCS_STATUS_HAS_STAGED$z$VCS_STATUS_HAS_UNSTAGED$z$VCS_STATUS_HAS_UNTRACKED\ $z$VCS_STATUS_INDEX_SIZE$z$VCS_STATUS_LOCAL_BRANCH$z$VCS_STATUS_NUM_CONFLICTED\ @@ -2221,20 +2423,19 @@ function _p9k_vcs_status_restore() { function _p9k_vcs_status_for_dir() { local dir=$1 while true; do - _P9K_RETVAL=$_P9K_LAST_GIT_PROMPT[$dir] - [[ -n $_P9K_RETVAL ]] && return 0 + _p9k_ret=$_p9k_last_git_prompt[$dir] + [[ -n $_p9k_ret ]] && return 0 [[ $dir == / ]] && return 1 dir=${dir:h} done } function _p9k_vcs_status_purge() { - unsetopt nomatch local dir=$1 while true; do # unset doesn't work if $dir contains weird shit - _P9K_LAST_GIT_PROMPT[$dir]="" - _P9K_GIT_SLOW[$dir]="" + _p9k_last_git_prompt[$dir]="" + _p9k_git_slow[$dir]="" [[ $dir == / ]] && break dir=${dir:h} done @@ -2242,34 +2443,30 @@ function _p9k_vcs_status_purge() { function _p9k_vcs_icon() { case "$VCS_STATUS_REMOTE_URL" in - *github*) _P9K_RETVAL=VCS_GIT_GITHUB_ICON;; - *bitbucket*) _P9K_RETVAL=VCS_GIT_BITBUCKET_ICON;; - *stash*) _P9K_RETVAL=VCS_GIT_GITHUB_ICON;; - *gitlab*) _P9K_RETVAL=VCS_GIT_GITLAB_ICON;; - *) _P9K_RETVAL=VCS_GIT_ICON;; + *github*) _p9k_ret=VCS_GIT_GITHUB_ICON;; + *bitbucket*) _p9k_ret=VCS_GIT_BITBUCKET_ICON;; + *stash*) _p9k_ret=VCS_GIT_GITHUB_ICON;; + *gitlab*) _p9k_ret=VCS_GIT_GITLAB_ICON;; + *) _p9k_ret=VCS_GIT_ICON;; esac } -set_default POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING false - function _p9k_vcs_render() { local state - if (( $+_P9K_NEXT_VCS_DIR )); then + if (( $+_p9k_next_vcs_dir )); then if _p9k_vcs_status_for_dir ${${GIT_DIR:a}:-$PWD}; then - _p9k_vcs_status_restore $_P9K_RETVAL + _p9k_vcs_status_restore $_p9k_ret state=LOADING else - if [[ -n $POWERLEVEL9K_VCS_LOADING_TEXT ]] || { _p9k_get_icon prompt_vcs_LOADING VCS_LOADING_ICON; [[ -n $_P9K_RETVAL ]] }; then - $1_prompt_segment prompt_vcs_LOADING $2 "${vcs_states[LOADING]}" "$DEFAULT_COLOR" VCS_LOADING_ICON 0 '' "$POWERLEVEL9K_VCS_LOADING_TEXT" - fi + $1_prompt_segment prompt_vcs_LOADING $2 "${__p9k_vcs_states[LOADING]}" "$_p9k_color1" VCS_LOADING_ICON 0 '' "$_POWERLEVEL9K_VCS_LOADING_TEXT" return 0 fi elif [[ $VCS_STATUS_RESULT != ok-* ]]; then return 1 fi - if [[ $POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING == true ]]; then + if (( _POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING )); then if [[ -z $state ]]; then if [[ $VCS_STATUS_HAS_STAGED != 0 || $VCS_STATUS_HAS_UNSTAGED != 0 ]]; then state=MODIFIED @@ -2280,21 +2477,21 @@ function _p9k_vcs_render() { fi fi _p9k_vcs_icon - $1_prompt_segment prompt_vcs_$state $2 "${vcs_states[$state]}" "$DEFAULT_COLOR" "$_P9K_RETVAL" 0 '' "" + $1_prompt_segment prompt_vcs_$state $2 "${__p9k_vcs_states[$state]}" "$_p9k_color1" "$_p9k_ret" 0 '' "" return 0 fi - (( ${POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-untracked]} )) || VCS_STATUS_HAS_UNTRACKED=0 - (( ${POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-aheadbehind]} )) || { VCS_STATUS_COMMITS_AHEAD=0 && VCS_STATUS_COMMITS_BEHIND=0 } - (( ${POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-stash]} )) || VCS_STATUS_STASHES=0 - (( ${POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-remotebranch]} )) || VCS_STATUS_REMOTE_BRANCH="" - (( ${POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-tagname]} )) || VCS_STATUS_TAG="" + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-untracked]} )) || VCS_STATUS_HAS_UNTRACKED=0 + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-aheadbehind]} )) || { VCS_STATUS_COMMITS_AHEAD=0 && VCS_STATUS_COMMITS_BEHIND=0 } + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-stash]} )) || VCS_STATUS_STASHES=0 + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-remotebranch]} )) || VCS_STATUS_REMOTE_BRANCH="" + (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)git-tagname]} )) || VCS_STATUS_TAG="" - (( POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM >= 0 && VCS_STATUS_COMMITS_AHEAD > POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM )) && - VCS_STATUS_COMMITS_AHEAD=$POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM + (( _POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM >= 0 && VCS_STATUS_COMMITS_AHEAD > _POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM )) && + VCS_STATUS_COMMITS_AHEAD=$_POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM - (( POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM >= 0 && VCS_STATUS_COMMITS_BEHIND > POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM )) && - VCS_STATUS_COMMITS_BEHIND=$POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM + (( _POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM >= 0 && VCS_STATUS_COMMITS_BEHIND > _POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM )) && + VCS_STATUS_COMMITS_BEHIND=$_POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM local -a cache_key=( "$VCS_STATUS_LOCAL_BRANCH" @@ -2312,7 +2509,7 @@ function _p9k_vcs_render() { "$VCS_STATUS_STASHES" "$VCS_STATUS_TAG" ) - if [[ $POWERLEVEL9K_SHOW_CHANGESET == true || -z $VCS_STATUS_LOCAL_BRANCH ]]; then + if [[ $_POWERLEVEL9K_SHOW_CHANGESET == 1 || -z $VCS_STATUS_LOCAL_BRANCH ]]; then cache_key+=$VCS_STATUS_COMMIT fi @@ -2320,7 +2517,7 @@ function _p9k_vcs_render() { local icon local content - if (( ${POWERLEVEL9K_VCS_GIT_HOOKS[(I)vcs-detect-changes]} )); then + if (( ${_POWERLEVEL9K_VCS_GIT_HOOKS[(I)vcs-detect-changes]} )); then if [[ $VCS_STATUS_HAS_STAGED != 0 || $VCS_STATUS_HAS_UNSTAGED != 0 ]]; then : ${state:=MODIFIED} elif [[ $VCS_STATUS_HAS_UNTRACKED != 0 ]]; then @@ -2342,24 +2539,24 @@ function _p9k_vcs_render() { function _$0_fmt() { _p9k_vcs_style $state $1 - content+="$_P9K_RETVAL$2" + content+="$_p9k_ret$2" } local ws - if [[ $POWERLEVEL9K_SHOW_CHANGESET == true || -z $VCS_STATUS_LOCAL_BRANCH ]]; then + if [[ $_POWERLEVEL9K_SHOW_CHANGESET == 1 || -z $VCS_STATUS_LOCAL_BRANCH ]]; then _p9k_get_icon prompt_vcs_$state VCS_COMMIT_ICON - _$0_fmt COMMIT "$_P9K_RETVAL${${VCS_STATUS_COMMIT:0:$POWERLEVEL9K_VCS_INTERNAL_HASH_LENGTH}:-HEAD}" + _$0_fmt COMMIT "$_p9k_ret${${VCS_STATUS_COMMIT:0:$_POWERLEVEL9K_CHANGESET_HASH_LENGTH}:-HEAD}" ws=' ' fi if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then - _p9k_get_icon prompt_vcs_$state VCS_BRANCH_ICON - _$0_fmt BRANCH "$ws$_P9K_RETVAL${VCS_STATUS_LOCAL_BRANCH//\%/%%}" + (( _POWERLEVEL9K_HIDE_BRANCH_ICON )) && _p9k_ret='' || _p9k_get_icon prompt_vcs_$state VCS_BRANCH_ICON + _$0_fmt BRANCH "$ws$_p9k_ret${VCS_STATUS_LOCAL_BRANCH//\%/%%}" fi - if [[ $POWERLEVEL9K_VCS_HIDE_TAGS == false && -n $VCS_STATUS_TAG ]]; then + if [[ $_POWERLEVEL9K_VCS_HIDE_TAGS == 0 && -n $VCS_STATUS_TAG ]]; then _p9k_get_icon prompt_vcs_$state VCS_TAG_ICON - _$0_fmt TAG " $_P9K_RETVAL${VCS_STATUS_TAG//\%/%%}" + _$0_fmt TAG " $_p9k_ret${VCS_STATUS_TAG//\%/%%}" fi if [[ -n $VCS_STATUS_ACTION ]]; then @@ -2368,82 +2565,80 @@ function _p9k_vcs_render() { if [[ -n $VCS_STATUS_REMOTE_BRANCH && $VCS_STATUS_LOCAL_BRANCH != $VCS_STATUS_REMOTE_BRANCH ]]; then _p9k_get_icon prompt_vcs_$state VCS_REMOTE_BRANCH_ICON - _$0_fmt REMOTE_BRANCH " $_P9K_RETVAL${VCS_STATUS_REMOTE_BRANCH//\%/%%}" + _$0_fmt REMOTE_BRANCH " $_p9k_ret${VCS_STATUS_REMOTE_BRANCH//\%/%%}" fi if [[ $VCS_STATUS_HAS_STAGED == 1 || $VCS_STATUS_HAS_UNSTAGED == 1 || $VCS_STATUS_HAS_UNTRACKED == 1 ]]; then _p9k_get_icon prompt_vcs_$state VCS_DIRTY_ICON - _$0_fmt DIRTY "$_P9K_RETVAL" + _$0_fmt DIRTY "$_p9k_ret" if [[ $VCS_STATUS_HAS_STAGED == 1 ]]; then _p9k_get_icon prompt_vcs_$state VCS_STAGED_ICON - (( ${POWERLEVEL9K_VCS_MAX_NUM_STAGED:-$POWERLEVEL9K_VCS_STAGED_MAX_NUM} != 1 )) && _P9K_RETVAL+=$VCS_STATUS_NUM_STAGED - _$0_fmt STAGED " $_P9K_RETVAL" + (( _POWERLEVEL9K_VCS_STAGED_MAX_NUM != 1 )) && _p9k_ret+=$VCS_STATUS_NUM_STAGED + _$0_fmt STAGED " $_p9k_ret" fi if [[ $VCS_STATUS_HAS_UNSTAGED == 1 ]]; then _p9k_get_icon prompt_vcs_$state VCS_UNSTAGED_ICON - (( ${POWERLEVEL9K_VCS_MAX_NUM_UNSTAGED:-$POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM} != 1 )) && _P9K_RETVAL+=$VCS_STATUS_NUM_UNSTAGED - _$0_fmt UNSTAGED " $_P9K_RETVAL" + (( _POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM != 1 )) && _p9k_ret+=$VCS_STATUS_NUM_UNSTAGED + _$0_fmt UNSTAGED " $_p9k_ret" fi if [[ $VCS_STATUS_HAS_UNTRACKED == 1 ]]; then _p9k_get_icon prompt_vcs_$state VCS_UNTRACKED_ICON - (( ${POWERLEVEL9K_VCS_MAX_NUM_UNTRACKED:-$POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM} != 1 )) && _P9K_RETVAL+=$VCS_STATUS_NUM_UNTRACKED - _$0_fmt UNTRACKED " $_P9K_RETVAL" + (( _POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM != 1 )) && _p9k_ret+=$VCS_STATUS_NUM_UNTRACKED + _$0_fmt UNTRACKED " $_p9k_ret" fi fi if [[ $VCS_STATUS_COMMITS_BEHIND -gt 0 ]]; then _p9k_get_icon prompt_vcs_$state VCS_INCOMING_CHANGES_ICON - (( POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM != 1 )) && _P9K_RETVAL+=$VCS_STATUS_COMMITS_BEHIND - _$0_fmt INCOMING_CHANGES " $_P9K_RETVAL" + (( _POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM != 1 )) && _p9k_ret+=$VCS_STATUS_COMMITS_BEHIND + _$0_fmt INCOMING_CHANGES " $_p9k_ret" fi if [[ $VCS_STATUS_COMMITS_AHEAD -gt 0 ]]; then _p9k_get_icon prompt_vcs_$state VCS_OUTGOING_CHANGES_ICON - (( POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM != 1 )) && _P9K_RETVAL+=$VCS_STATUS_COMMITS_AHEAD - _$0_fmt OUTGOING_CHANGES " $_P9K_RETVAL" + (( _POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM != 1 )) && _p9k_ret+=$VCS_STATUS_COMMITS_AHEAD + _$0_fmt OUTGOING_CHANGES " $_p9k_ret" fi if [[ $VCS_STATUS_STASHES -gt 0 ]]; then _p9k_get_icon prompt_vcs_$state VCS_STASH_ICON - _$0_fmt STASH " $_P9K_RETVAL$VCS_STATUS_STASHES" + _$0_fmt STASH " $_p9k_ret$VCS_STATUS_STASHES" fi fi - _p9k_cache_set "prompt_vcs_$state" "$2" "${vcs_states[$state]}" "$DEFAULT_COLOR" "$icon" 0 '' "$content" + _p9k_cache_set "prompt_vcs_$state" "$2" "${__p9k_vcs_states[$state]}" "$_p9k_color1" "$icon" 0 '' "$content" fi - $1_prompt_segment "$_P9K_CACHE_VAL[@]" + $1_prompt_segment "$_p9k_cache_val[@]" return 0 } -typeset -gF _P9K_GITSTATUS_START_TIME - function _p9k_vcs_resume() { emulate -L zsh && setopt no_hist_expand extended_glob if [[ $VCS_STATUS_RESULT == ok-async ]]; then - local latency=$((EPOCHREALTIME - _P9K_GITSTATUS_START_TIME)) - if (( latency > POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then - _P9K_GIT_SLOW[$VCS_STATUS_WORKDIR]=1 - elif (( $1 && latency < 0.8 * POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then # 0.8 to avoid flip-flopping - _P9K_GIT_SLOW[$VCS_STATUS_WORKDIR]=0 + local latency=$((EPOCHREALTIME - _p9k_gitstatus_start_time)) + if (( latency > _POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then + _p9k_git_slow[$VCS_STATUS_WORKDIR]=1 + elif (( $1 && latency < 0.8 * _POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS )); then # 0.8 to avoid flip-flopping + _p9k_git_slow[$VCS_STATUS_WORKDIR]=0 fi _p9k_vcs_status_save fi - if [[ -z $_P9K_NEXT_VCS_DIR ]]; then - unset _P9K_NEXT_VCS_DIR + if [[ -z $_p9k_next_vcs_dir ]]; then + unset _p9k_next_vcs_dir case $VCS_STATUS_RESULT in norepo-async) (( $1 )) && _p9k_vcs_status_purge ${${GIT_DIR:a}:-$PWD};; - ok-async) (( $1 )) || _P9K_NEXT_VCS_DIR=${${GIT_DIR:a}:-$PWD};; + ok-async) (( $1 )) || _p9k_next_vcs_dir=${${GIT_DIR:a}:-$PWD};; esac fi - if [[ -n $_P9K_NEXT_VCS_DIR ]]; then - if ! gitstatus_query -d $_P9K_NEXT_VCS_DIR -t 0 -c '_p9k_vcs_resume 1' POWERLEVEL9K; then - unset _P9K_NEXT_VCS_DIR + if [[ -n $_p9k_next_vcs_dir ]]; then + if ! gitstatus_query -d $_p9k_next_vcs_dir -t 0 -c '_p9k_vcs_resume 1' POWERLEVEL9K; then + unset _p9k_next_vcs_dir unset VCS_STATUS_RESULT else case $VCS_STATUS_RESULT in - tout) _P9K_NEXT_VCS_DIR=''; _P9K_GITSTATUS_START_TIME=$EPOCHREALTIME;; - norepo-sync) _p9k_vcs_status_purge $_P9K_NEXT_VCS_DIR; unset _P9K_NEXT_VCS_DIR;; - ok-sync) _p9k_vcs_status_save; unset _P9K_NEXT_VCS_DIR;; + tout) _p9k_next_vcs_dir=''; _p9k_gitstatus_start_time=$EPOCHREALTIME;; + norepo-sync) _p9k_vcs_status_purge $_p9k_next_vcs_dir; unset _p9k_next_vcs_dir;; + ok-sync) _p9k_vcs_status_save; unset _p9k_next_vcs_dir;; esac fi fi @@ -2452,23 +2647,23 @@ function _p9k_vcs_resume() { } function _p9k_vcs_gitstatus() { - [[ $POWERLEVEL9K_DISABLE_GITSTATUS == true ]] && return 1 - if [[ $_P9K_REFRESH_REASON == precmd ]]; then - if (( $+_P9K_NEXT_VCS_DIR )); then - _P9K_NEXT_VCS_DIR=${${GIT_DIR:a}:-$PWD} + (( _POWERLEVEL9K_DISABLE_GITSTATUS )) && return 1 + if [[ $_p9k_refresh_reason == precmd ]]; then + if (( $+_p9k_next_vcs_dir )); then + _p9k_next_vcs_dir=${${GIT_DIR:a}:-$PWD} else local dir=${${GIT_DIR:a}:-$PWD} - local -F timeout=$POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS + local -F timeout=_POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS if ! _p9k_vcs_status_for_dir $dir; then gitstatus_query -d $dir -t $timeout -p -c '_p9k_vcs_resume 0' POWERLEVEL9K || return 1 case $VCS_STATUS_RESULT in - tout) _P9K_NEXT_VCS_DIR=''; _P9K_GITSTATUS_START_TIME=$EPOCHREALTIME; return 0;; + tout) _p9k_next_vcs_dir=''; _p9k_gitstatus_start_time=$EPOCHREALTIME; return 0;; norepo-sync) return 0;; ok-sync) _p9k_vcs_status_save;; esac else while true; do - case $_P9K_GIT_SLOW[$dir] in + case $_p9k_git_slow[$dir] in "") [[ $dir == / ]] && break; dir=${dir:h};; 0) break;; 1) timeout=0; break;; @@ -2481,7 +2676,7 @@ function _p9k_vcs_gitstatus() { return 1 fi case $VCS_STATUS_RESULT in - tout) _P9K_NEXT_VCS_DIR=''; _P9K_GITSTATUS_START_TIME=$EPOCHREALTIME;; + tout) _p9k_next_vcs_dir=''; _p9k_gitstatus_start_time=$EPOCHREALTIME;; norepo-sync) _p9k_vcs_status_purge $dir;; ok-sync) _p9k_vcs_status_save;; esac @@ -2494,7 +2689,7 @@ function _p9k_vcs_gitstatus() { # Segment to show VCS information prompt_vcs() { - local -a backends=($POWERLEVEL9K_VCS_BACKENDS) + local -a backends=($_POWERLEVEL9K_VCS_BACKENDS) if (( ${backends[(I)git]} )) && _p9k_vcs_gitstatus; then _p9k_vcs_render $1 $2 && return backends=(${backends:#git}) @@ -2519,26 +2714,22 @@ prompt_vcs() { current_state='CLEAN' fi fi - $1_prompt_segment "${0}_${(U)current_state}" "$2" "${vcs_states[$current_state]}" "$DEFAULT_COLOR" "$vcs_visual_identifier" 0 '' "$vcs_prompt" + $1_prompt_segment "${0}_${(U)current_state}" "$2" "${__p9k_vcs_states[$current_state]}" "$_p9k_color1" "$vcs_visual_identifier" 0 '' "$vcs_prompt" fi fi } ################################################################ # Vi Mode: show editing mode (NORMAL|INSERT|VISUAL) -# -# VISUAL mode is shown as NORMAL unless POWERLEVEL9K_VI_VISUAL_MODE_STRING is explicitly set. -set_default POWERLEVEL9K_VI_INSERT_MODE_STRING "INSERT" -set_default POWERLEVEL9K_VI_COMMAND_MODE_STRING "NORMAL" prompt_vi_mode() { - if [[ -n $POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then - $1_prompt_segment $0_INSERT $2 "$DEFAULT_COLOR" blue '' 0 '${${KEYMAP:-0}:#vicmd}' "$POWERLEVEL9K_VI_INSERT_MODE_STRING" + if [[ -n $_POWERLEVEL9K_VI_INSERT_MODE_STRING ]]; then + $1_prompt_segment $0_INSERT $2 "$_p9k_color1" blue '' 0 '${${KEYMAP:-0}:#vicmd}' "$_POWERLEVEL9K_VI_INSERT_MODE_STRING" fi - if (( $+POWERLEVEL9K_VI_VISUAL_MODE_STRING )); then - $1_prompt_segment $0_NORMAL $2 "$DEFAULT_COLOR" white '' 0 '${(M)${:-$KEYMAP$_P9K_REGION_ACTIVE}:#vicmd0}' "$POWERLEVEL9K_VI_COMMAND_MODE_STRING" - $1_prompt_segment $0_VISUAL $2 "$DEFAULT_COLOR" white '' 0 '${(M)${:-$KEYMAP$_P9K_REGION_ACTIVE}:#vicmd1}' "$POWERLEVEL9K_VI_VISUAL_MODE_STRING" + if (( $+_POWERLEVEL9K_VI_VISUAL_MODE_STRING )); then + $1_prompt_segment $0_NORMAL $2 "$_p9k_color1" white '' 0 '${(M)${:-$KEYMAP$_p9k_region_active}:#vicmd0}' "$_POWERLEVEL9K_VI_COMMAND_MODE_STRING" + $1_prompt_segment $0_VISUAL $2 "$_p9k_color1" white '' 0 '${(M)${:-$KEYMAP$_p9k_region_active}:#vicmd1}' "$_POWERLEVEL9K_VI_VISUAL_MODE_STRING" else - $1_prompt_segment $0_NORMAL $2 "$DEFAULT_COLOR" white '' 0 '${(M)KEYMAP:#vicmd}' "$POWERLEVEL9K_VI_COMMAND_MODE_STRING" + $1_prompt_segment $0_NORMAL $2 "$_p9k_color1" white '' 0 '${(M)KEYMAP:#vicmd}' "$_POWERLEVEL9K_VI_COMMAND_MODE_STRING" fi } @@ -2546,34 +2737,30 @@ prompt_vi_mode() { # Virtualenv: current working virtualenv # More information on virtualenv (Python): # https://virtualenv.pypa.io/en/latest/ -set_default POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION true -set_default POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER "(" -set_default POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER ")" prompt_virtualenv() { [[ -n $VIRTUAL_ENV ]] || return local msg='' - if [[ $POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION == true ]] && _p9k_python_version; then - msg="$_P9K_RETVAL " + if (( _POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION )) && _p9k_python_version; then + msg="$_p9k_ret " fi - msg+="$POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER${${VIRTUAL_ENV:t}//\%/%%}$POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER" - "$1_prompt_segment" "$0" "$2" "blue" "$DEFAULT_COLOR" 'PYTHON_ICON' 0 '' "$msg" + msg+="$_POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER${${VIRTUAL_ENV:t}//\%/%%}$_POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER" + "$1_prompt_segment" "$0" "$2" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '' "$msg" } function _p9k_read_pyenv_version_file() { [[ -r $1 ]] || return local content read -rd $'\0' content <$1 2>/dev/null - _P9K_RETVAL=${${(j.:.)${(@)${=content}#python-}:-system}} + _p9k_ret=${${(j.:.)${(@)${=content}#python-}:-system}} } function _p9k_pyenv_global_version() { - _p9k_read_pyenv_version_file ${PYENV_ROOT:-$HOME/.pyenv}/version || _P9K_RETVAL=system + _p9k_read_pyenv_version_file ${PYENV_ROOT:-$HOME/.pyenv}/version || _p9k_ret=system } ################################################################ # Segment to display pyenv information # https://github.com/pyenv/pyenv#choosing-the-python-version -set_default POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW false prompt_pyenv() { (( $+commands[pyenv] )) || return local v=${(j.:.)${(@)${(s.:.)PYENV_VERSION}#python-}} @@ -2581,25 +2768,25 @@ prompt_pyenv() { [[ $PYENV_DIR == /* ]] && local dir=$PYENV_DIR || local dir="$PWD/$PYENV_DIR" while true; do if _p9k_read_pyenv_version_file $dir/.python-version; then - v=$_P9K_RETVAL + v=$_p9k_ret break fi if [[ $dir == / ]]; then - [[ $POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW == true ]] || return + (( _POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW )) || return _p9k_pyenv_global_version - v=$_P9K_RETVAL + v=$_p9k_ret break fi dir=${dir:h} done fi - if [[ $POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW == false ]]; then + if (( !_POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW )); then _p9k_pyenv_global_version - [[ $v == $_P9K_RETVAL ]] && return + [[ $v == $_p9k_ret ]] && return fi - "$1_prompt_segment" "$0" "$2" "blue" "$DEFAULT_COLOR" 'PYTHON_ICON' 0 '' "${v//\%/%%}" + "$1_prompt_segment" "$0" "$2" "blue" "$_p9k_color1" 'PYTHON_ICON' 0 '' "${v//\%/%%}" } ################################################################ @@ -2608,9 +2795,9 @@ prompt_openfoam() { local wm_project_version="$WM_PROJECT_VERSION" local wm_fork="$WM_FORK" if [[ -n "$wm_project_version" && -z "$wm_fork" ]] ; then - "$1_prompt_segment" "$0" "$2" "yellow" "$DEFAULT_COLOR" '' 0 '' "OF: ${${wm_project_version:t}//\%/%%}" + "$1_prompt_segment" "$0" "$2" "yellow" "$_p9k_color1" '' 0 '' "OF: ${${wm_project_version:t}//\%/%%}" elif [[ -n "$wm_project_version" && -n "$wm_fork" ]] ; then - "$1_prompt_segment" "$0" "$2" "yellow" "$DEFAULT_COLOR" '' 0 '' "F-X: ${${wm_project_version:t}//\%/%%}" + "$1_prompt_segment" "$0" "$2" "yellow" "$_p9k_color1" '' 0 '' "F-X: ${${wm_project_version:t}//\%/%%}" fi } @@ -2618,7 +2805,7 @@ prompt_openfoam() { # Segment to display Swift version prompt_swift_version() { _p9k_cached_cmd_stdout swift --version || return - [[ $_P9K_RETVAL == (#b)[^[:digit:]]#([[:digit:].]##)* ]] || return + [[ $_p9k_ret == (#b)[^[:digit:]]#([[:digit:].]##)* ]] || return "$1_prompt_segment" "$0" "$2" "magenta" "white" 'SWIFT_ICON' 0 '' "${match[1]//\%/%%}" } @@ -2632,35 +2819,6 @@ prompt_dir_writable() { ################################################################ # Kubernetes Current Context/Namespace - -# Set to false to truncate trailing "/default": "mycontext/default" will become "mycontext". -set_default POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE true - -# Defines context classes for the purpose of applying different styling to different contexts. -# -# POWERLEVEL9K_KUBECONTEXT_CLASSES must be an array with even number of elements. The first -# element in each pair defines a pattern against which the current context (in the format it is -# displayed in the prompt) gets matched. The second element defines context class. Patterns are -# tried in order. The first match wins. -# -# If a non-empty class <C> is assigned to a context, the segment is styled with -# POWERLEVEL9K_KUBECONTEXT_<U>_BACKGROUND and POWERLEVEL9K_KUBECONTEXT_<U>_FOREGROUND where <U> is -# uppercased <C>. Otherwise with POWERLEVEL9K_KUBECONTEXT_BACKGROUND and -# POWERLEVEL9K_KUBECONTEXT_FOREGROUND. -# -# Example: Use red background for contexts containing "prod", green for "testing" and yellow for -# everything else. -# -# POWERLEVEL9K_KUBECONTEXT_CLASSES=( -# '*prod*' prod -# '*testing*' testing -# '*' other) -# -# POWERLEVEL9K_KUBECONTEXT_PROD_BACKGROUND=red -# POWERLEVEL9K_KUBECONTEXT_TESTING_BACKGROUND=green -# POWERLEVEL9K_KUBECONTEXT_OTHER_BACKGROUND=yellow -set_default -a POWERLEVEL9K_KUBECONTEXT_CLASSES - prompt_kubecontext() { (( $+commands[kubectl] )) || return local cfg @@ -2672,18 +2830,18 @@ prompt_kubecontext() { done if ! _p9k_cache_get $0 "${key[@]}"; then - local ctx=$(command kubectl config view -o=jsonpath='{.current-context}') + local ctx=$(kubectl config view -o=jsonpath='{.current-context}') if [[ -n $ctx ]]; then local p="{.contexts[?(@.name==\"$ctx\")].context.namespace}" - local ns="${$(command kubectl config view -o=jsonpath=$p):-default}" - if [[ $ctx != $ns && ($ns != default || $POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE == true) ]]; then + local ns="${$(kubectl config view -o=jsonpath=$p):-default}" + if [[ $ctx != $ns && ($ns != default || $_POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE == 1) ]]; then ctx+="/$ns" fi fi local suf if [[ -n $ctx ]]; then local pat class - for pat class in $POWERLEVEL9K_KUBECONTEXT_CLASSES; do + for pat class in "${_POWERLEVEL9K_KUBECONTEXT_CLASSES[@]}"; do if [[ $ctx == ${~pat} ]]; then [[ -n $class ]] && suf=_${(U)class} break @@ -2693,8 +2851,8 @@ prompt_kubecontext() { _p9k_cache_set "$ctx" "$suf" fi - [[ -n $_P9K_CACHE_VAL[1] ]] || return - $1_prompt_segment $0$_P9K_CACHE_VAL[2] $2 magenta white KUBERNETES_ICON 0 '' "${_P9K_CACHE_VAL[1]//\%/%%}" + [[ -n $_p9k_cache_val[1] ]] || return + $1_prompt_segment $0$_p9k_cache_val[2] $2 magenta white KUBERNETES_ICON 0 '' "${_p9k_cache_val[1]//\%/%%}" } ################################################################ @@ -2702,7 +2860,7 @@ prompt_kubecontext() { prompt_dropbox() { (( $+commands[dropbox-cli] )) || return # The first column is just the directory, so cut it - local dropbox_status="$(command dropbox-cli filestatus . | cut -d\ -f2-)" + local dropbox_status="$(dropbox-cli filestatus . | cut -d\ -f2-)" # Only show if the folder is tracked and dropbox is running if [[ "$dropbox_status" != 'unwatched' && "$dropbox_status" != "isn't running!" ]]; then @@ -2715,122 +2873,100 @@ prompt_dropbox() { fi } -# Specifies the format of java version. -# -# POWERLEVEL9K_JAVA_VERSION_FULL=true => 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03 -# POWERLEVEL9K_JAVA_VERSION_FULL=false => 1.8.0_212 -# -# These correspond to `java -fullversion` and `java -version` respectively. -set_default POWERLEVEL9K_JAVA_VERSION_FULL true - # print Java version number prompt_java_version() { _p9k_cached_cmd_stdout_stderr java -fullversion || return - local v=$_P9K_RETVAL + local v=$_p9k_ret v=${${v#*\"}%\"*} - [[ $POWERLEVEL9K_JAVA_VERSION_FULL == true ]] || v=${v%%-*} + (( _POWERLEVEL9K_JAVA_VERSION_FULL )) || v=${v%%-*} [[ -n $v ]] || return "$1_prompt_segment" "$0" "$2" "red" "white" "JAVA_ICON" 0 '' "${v//\%/%%}" } -################################################################ -# Prompt processing and drawing -################################################################ -# Main prompt -set_default -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS context dir vcs -set_default -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS status root_indicator background_jobs history time - powerlevel9k_preexec() { - if (( _P9K_EMULATE_ZERO_RPROMPT_INDENT )); then - if [[ -n $_P9K_REAL_ZLE_RPROMPT_INDENT ]]; then - ZLE_RPROMPT_INDENT=$_P9K_REAL_ZLE_RPROMPT_INDENT + if (( _p9k_emulate_zero_rprompt_indent )); then + if [[ -n $_p9k_real_zle_rprompt_indent ]]; then + ZLE_RPROMPT_INDENT=$_p9k_real_zle_rprompt_indent else unset ZLE_RPROMPT_INDENT fi fi - typeset -gF _P9K_TIMER_START=EPOCHREALTIME + __p9k_timer_start=EPOCHREALTIME } -typeset -g _P9K_PROMPT -typeset -g _P9K_RPROMPT - -typeset -g _P9K_PROMPT_SIDE _P9K_SEGMENT_NAME -typeset -gi _P9K_SEGMENT_INDEX - function _p9k_build_segment() { - _P9K_SEGMENT_NAME=${_P9K_SEGMENT_NAME%_joined} - if [[ $_P9K_SEGMENT_NAME == custom_* ]]; then - prompt_custom $_P9K_PROMPT_SIDE $_P9K_SEGMENT_INDEX $_P9K_SEGMENT_NAME[8,-1] - elif (( $+functions[prompt_$_P9K_SEGMENT_NAME] )); then - prompt_$_P9K_SEGMENT_NAME $_P9K_PROMPT_SIDE $_P9K_SEGMENT_INDEX + _p9k_segment_name=${_p9k_segment_name%_joined} + if [[ $_p9k_segment_name == custom_* ]]; then + prompt_custom $_p9k_prompt_side $_p9k_segment_index $_p9k_segment_name[8,-1] + elif (( $+functions[prompt_$_p9k_segment_name] )); then + prompt_$_p9k_segment_name $_p9k_prompt_side $_p9k_segment_index fi - ((++_P9K_SEGMENT_INDEX)) + ((++_p9k_segment_index)) } -set_default POWERLEVEL9K_DISABLE_RPROMPT false function _p9k_set_prompt() { - unset _P9K_LINE_FINISH - unset _P9K_RPROMPT_OVERRIDE - PROMPT=$_P9K_PROMPT_PREFIX_LEFT + unset _p9k_line_finish + unset _p9k_rprompt_override + PROMPT=$_p9k_prompt_prefix_left RPROMPT= - local -i left_idx=1 right_idx=1 num_lines=$#_P9K_LINE_SEGMENTS_LEFT i + local -i left_idx=1 right_idx=1 num_lines=$#_p9k_line_segments_left i for i in {1..$num_lines}; do local right= - if [[ $POWERLEVEL9K_DISABLE_RPROMPT == false ]]; then - _P9K_DIR= - _P9K_PROMPT= - _P9K_SEGMENT_INDEX=right_idx - _P9K_PROMPT_SIDE=right - for _P9K_SEGMENT_NAME in ${(@0)_P9K_LINE_SEGMENTS_RIGHT[i]}; do + if (( !_POWERLEVEL9K_DISABLE_RPROMPT )); then + _p9k_dir= + _p9k_prompt= + _p9k_segment_index=right_idx + _p9k_prompt_side=right + for _p9k_segment_name in ${(@0)_p9k_line_segments_right[i]}; do _p9k_build_segment done - right_idx=_P9K_SEGMENT_INDEX - if [[ -n $_P9K_PROMPT || $_P9K_LINE_NEVER_EMPTY_RIGHT[i] == 1 ]]; then - right=$_P9K_LINE_PREFIX_RIGHT[i]$_P9K_PROMPT$_P9K_LINE_SUFFIX_RIGHT[i] + right_idx=_p9k_segment_index + if [[ -n $_p9k_prompt || $_p9k_line_never_empty_right[i] == 1 ]]; then + right=$_p9k_line_prefix_right[i]$_p9k_prompt$_p9k_line_suffix_right[i] fi fi - unset _P9K_DIR - _P9K_PROMPT=$_P9K_LINE_PREFIX_LEFT[i] - _P9K_SEGMENT_INDEX=left_idx - _P9K_PROMPT_SIDE=left - for _P9K_SEGMENT_NAME in ${(@0)_P9K_LINE_SEGMENTS_LEFT[i]}; do + unset _p9k_dir + _p9k_prompt=$_p9k_line_prefix_left[i] + _p9k_segment_index=left_idx + _p9k_prompt_side=left + for _p9k_segment_name in ${(@0)_p9k_line_segments_left[i]}; do _p9k_build_segment done - left_idx=_P9K_SEGMENT_INDEX - _P9K_PROMPT+=$_P9K_LINE_SUFFIX_LEFT[i] - if (( $+_P9K_DIR || (i != num_lines && $#right) )); then - PROMPT+='${${:-${_P9K_D::=0}${_P9K_RPROMPT::=${_P9K_RPROMPT_OVERRIDE-'$right'}}${_P9K_LPROMPT::='$_P9K_PROMPT'}}+}' - PROMPT+=$_P9K_GAP_PRE - if (( $+_P9K_DIR )); then - if (( i == num_lines && (POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS > 0 || POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT > 0) )); then - local a=$POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS - local f=$((0.01*POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT))'*_P9K_CLM' - PROMPT+="\${\${_P9K_G::=$((($a<$f)*$f+($a>=$f)*$a))}+}" + left_idx=_p9k_segment_index + _p9k_prompt+=$_p9k_line_suffix_left[i] + if (( $+_p9k_dir || (i != num_lines && $#right) )); then + PROMPT+='${${:-${_p9k_d::=0}${_p9k_rprompt::=${_p9k_rprompt_override-'$right'}}${_p9k_lprompt::='$_p9k_prompt'}}+}' + PROMPT+=$_p9k_gap_pre + if (( $+_p9k_dir )); then + if (( i == num_lines && (_POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS > 0 || _POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT > 0) )); then + local a=$_POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS + local f=$((0.01*_POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT))'*_p9k_clm' + PROMPT+="\${\${_p9k_g::=$((($a<$f)*$f+($a>=$f)*$a))}+}" else - PROMPT+='${${_P9K_G::=0}+}' + PROMPT+='${${_p9k_g::=0}+}' fi - if [[ $POWERLEVEL9K_DIR_MAX_LENGTH == <->('%'|) ]]; then + if [[ $_POWERLEVEL9K_DIR_MAX_LENGTH == <->('%'|) ]]; then local lim - if [[ $POWERLEVEL9K_DIR_MAX_LENGTH[-1] == '%' ]]; then - lim="$_P9K_DIR_LEN-$((0.01*$POWERLEVEL9K_DIR_MAX_LENGTH[1,-2]))*_P9K_CLM" + if [[ $_POWERLEVEL9K_DIR_MAX_LENGTH[-1] == '%' ]]; then + lim="$_p9k_dir_len-$((0.01*$_POWERLEVEL9K_DIR_MAX_LENGTH[1,-2]))*_p9k_clm" else - lim=$((_P9K_DIR_LEN-POWERLEVEL9K_DIR_MAX_LENGTH)) + lim=$((_p9k_dir_len-_POWERLEVEL9K_DIR_MAX_LENGTH)) ((lim <= 0)) && lim= fi if [[ -n $lim ]]; then - PROMPT+='${${${$((_P9K_G<_P9K_M+'$lim')):#1}:-${_P9K_G::=$((_P9K_M+'$lim'))}}+}' + PROMPT+='${${${$((_p9k_g<_p9k_m+'$lim')):#1}:-${_p9k_g::=$((_p9k_m+'$lim'))}}+}' fi fi - PROMPT+='${${_P9K_D::=$((_P9K_M-_P9K_G))}+}' - PROMPT+='${_P9K_LPROMPT/\%\{d\%\}*\%\{d\%\}/'$_P9K_DIR'}' - PROMPT+='${${_P9K_M::=$((_P9K_D+_P9K_G))}+}' + PROMPT+='${${_p9k_d::=$((_p9k_m-_p9k_g))}+}' + PROMPT+='${_p9k_lprompt/\%\{d\%\}*\%\{d\%\}/'$_p9k_dir'}' + PROMPT+='${${_p9k_m::=$((_p9k_d+_p9k_g))}+}' else - PROMPT+='${_P9K_LPROMPT}' + PROMPT+='${_p9k_lprompt}' fi - ((i != num_lines && $#right)) && PROMPT+=$_P9K_LINE_GAP_POST[i] + ((i != num_lines && $#right)) && PROMPT+=$_p9k_line_gap_post[i] else - PROMPT+=$_P9K_PROMPT + PROMPT+=$_p9k_prompt fi if (( i == num_lines )); then RPROMPT=$right @@ -2842,194 +2978,188 @@ function _p9k_set_prompt() { PROMPT=${${PROMPT//$' %{\b'/'%{%G'}//$' \b'} RPROMPT=${${RPROMPT//$' %{\b'/'%{%G'}//$' \b'} - PROMPT+=$_P9K_PROMPT_SUFFIX_LEFT - [[ -n $RPROMPT ]] && RPROMPT=$_P9K_PROMPT_PREFIX_RIGHT$RPROMPT$_P9K_PROMPT_SUFFIX_RIGHT + PROMPT+=$_p9k_prompt_suffix_left + [[ -n $RPROMPT ]] && RPROMPT=$_p9k_prompt_prefix_right$RPROMPT$_p9k_prompt_suffix_right - _P9K_REAL_ZLE_RPROMPT_INDENT= + _p9k_real_zle_rprompt_indent= + (( $#_p9k_cache < _POWERLEVEL9K_MAX_CACHE_SIZE )) || _p9k_cache=() } -typeset -g _P9K_REFRESH_REASON - function _p9k_update_prompt() { - (( _P9K_ENABLED )) || return - _P9K_REFRESH_REASON=$1 + _p9k_refresh_reason=$1 _p9k_set_prompt - _P9K_REFRESH_REASON='' + _p9k_refresh_reason='' zle && zle .reset-prompt && zle -R } -typeset -gi _P9K_REGION_ACTIVE - -set_default POWERLEVEL9K_PROMPT_ADD_NEWLINE false -set_default POWERLEVEL9K_SHOW_RULER false - powerlevel9k_refresh_prompt_inplace() { emulate -L zsh && setopt no_hist_expand extended_glob - _p9k_init - _P9K_REFRESH_REASON=precmd + (( __p9k_enabled )) || return + _p9k_refresh_reason=precmd _p9k_set_prompt - _P9K_REFRESH_REASON='' + _p9k_refresh_reason='' } powerlevel9k_prepare_prompts() { - _P9K_EXIT_CODE=$? - _P9K_PIPE_EXIT_CODES=( "$pipestatus[@]" ) - if (( $+_P9K_TIMER_START )); then - P9K_COMMAND_DURATION_SECONDS=$((EPOCHREALTIME - _P9K_TIMER_START)) - unset _P9K_TIMER_START - else - unset P9K_COMMAND_DURATION_SECONDS - fi - _P9K_REGION_ACTIVE=0 + __p9k_exit_code=$? + __p9k_pipe_exit_codes=( $pipestatus ) + __p9k_timer_end=EPOCHREALTIME + + _p9k_must_init && _p9k_init unsetopt localoptions prompt_opts=(cr percent sp subst) setopt nopromptbang prompt{cr,percent,sp,subst} powerlevel9k_refresh_prompt_inplace + + __p9k_timer_start=0 + _p9k_region_active=0 } function _p9k_zle_keymap_select() { zle && zle .reset-prompt && zle -R } -set_default POWERLEVEL9K_IGNORE_TERM_COLORS false -set_default POWERLEVEL9K_IGNORE_TERM_LANG false -set_default POWERLEVEL9K_DISABLE_GITSTATUS false -set_default -i POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY -1 -set_default -i POWERLEVEL9K_VCS_STAGED_MAX_NUM 1 -set_default -i POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM 1 -set_default -i POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM 1 -set_default -i POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM -1 -set_default -i POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM -1 - -typeset -g _P9K_REAL_ZLE_RPROMPT_INDENT -typeset -gi _P9K_INITIALIZED=0 +_p9k_deinit_async_pump() { + if (( _p9k_async_pump_lock_fd )); then + zsystem flock -u $_p9k_async_pump_lock_fd + _p9k_async_pump_lock_fd=0 + fi + if (( _p9k_async_pump_fd )); then + zle -F $_p9k_async_pump_fd + exec {_p9k_async_pump_fd}>&- + _p9k_async_pump_fd=0 + fi + if (( _p9k_async_pump_pid )); then + kill -- -$_p9k_async_pump_pid &>/dev/null + _p9k_async_pump_pid=0 + fi + if [[ -n $_p9k_async_pump_fifo ]]; then + rm -f $_p9k_async_pump_fifo + _p9k_async_pump_fifo='' + fi + if [[ -n $_p9k_async_pump_lock ]]; then + rm -f $_p9k_async_pump_lock + _p9k_async_pump_lock='' + fi + add-zsh-hook -D zshexit _p9k_kill_async_pump +} -typeset -g OS -typeset -g OS_ICON -typeset -g SED_EXTENDED_REGEX_PARAMETER +function _p9k_on_async_message() { + emulate -L zsh && setopt no_hist_expand extended_glob + (( ARGC == 1 )) || return + local msg='' IFS='' + while read -r -t -u $1 msg; do + [[ $__p9k_enabled == 1 && $1 == $_p9k_async_pump_fd ]] && eval $_p9k_async_pump_line$msg + _p9k_async_pump_line= + msg= + done + _p9k_async_pump_line+=$msg + [[ $__p9k_enabled == 1 && $1 == $_p9k_async_pump_fd ]] && zle && zle .reset-prompt && zle -R +} + +function _p9k_async_pump() { + emulate -L zsh || return + setopt noaliases no_hist_expand extended_glob || return + zmodload zsh/system zsh/datetime || return + echo ok || return + + local ip last_ip + local -F next_ip_time + while ! zsystem flock -t 0 $lock 2>/dev/null && kill -0 $parent_pid; do + if (( time_realtime )); then + echo || break + # SIGWINCH 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). + # Fix: https://github.com/zsh-users/zsh/commit/5e11082349bf72897f93f3a4493a97a2caf15984. + kill -WINCH $parent_pid + fi + if (( public_ip && EPOCHREALTIME >= next_ip_time )); then + ip= + local method='' + local -F start=EPOCHREALTIME + next_ip_time=$((start + 5)) + for method in $ip_methods $ip_methods; do + case $method in + dig) + if (( $+commands[dig] )); then + ip=$(dig +tries=1 +short -4 A myip.opendns.com @resolver1.opendns.com 2>/dev/null) + [[ $ip == ';'* ]] && ip= + if [[ -z $ip ]]; then + ip=$(dig +tries=1 +short -6 AAAA myip.opendns.com @resolver1.opendns.com 2>/dev/null) + [[ $ip == ';'* ]] && ip= + fi + fi + ;; + curl) + if (( $+commands[curl] )); then + ip=$(curl --max-time 5 -w '\n' "$ip_url" 2>/dev/null) + fi + ;; + wget) + if (( $+commands[wget] )); then + ip=$(wget -T 5 -qO- "$ip_url" 2>/dev/null) + fi + ;; + esac + [[ $ip =~ '^[0-9a-f.:]+$' ]] || ip='' + if [[ -n $ip ]]; then + next_ip_time=$((start + tout)) + break + fi + done + if [[ $ip != $last_ip ]]; then + last_ip=$ip + echo _p9k_public_ip=${(q)${${ip//\%/%%}//$'\n'}} || break + kill -WINCH $parent_pid + fi + fi + sleep 1 + done + rm -f $lock $fifo +} -typeset -g _P9K_ASYNC_PUMP_LINE -typeset -g _P9K_ASYNC_PUMP_FIFO -typeset -g _P9K_ASYNC_PUMP_LOCK -typeset -gi _P9K_ASYNC_PUMP_FD=0 -typeset -gi _P9K_ASYNC_PUMP_PID=0 -typeset -gi _P9K_ASYNC_PUMP_SUBSHELL=0 +function _p9k_kill_async_pump() { + emulate -L zsh && setopt no_hist_expand extended_glob + if (( ZSH_SUBSHELL == _p9k_async_pump_subshell )); then + _p9k_deinit_async_pump + fi +} _p9k_init_async_pump() { local -i public_ip time_realtime segment_in_use public_ip && public_ip=1 - segment_in_use time && [[ $POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME == true ]] && time_realtime=1 + segment_in_use time && (( _POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME )) && time_realtime=1 (( public_ip || time_realtime )) || return _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) - mkfifo $_P9K_ASYNC_PUMP_FIFO - sysopen -rw -o cloexec,sync -u _P9K_ASYNC_PUMP_FD $_P9K_ASYNC_PUMP_FIFO - zsystem flock $_P9K_ASYNC_PUMP_LOCK - - function _p9k_on_async_message() { - emulate -L zsh && setopt no_hist_expand extended_glob - local msg='' - while IFS='' read -r -t -u $_P9K_ASYNC_PUMP_FD msg; do - eval $_P9K_ASYNC_PUMP_LINE$msg - _P9K_ASYNC_PUMP_LINE= - msg= - done - _P9K_ASYNC_PUMP_LINE+=$msg - zle && zle .reset-prompt && zle -R - } - - zle -F $_P9K_ASYNC_PUMP_FD _p9k_on_async_message - - function _p9k_async_pump() { - emulate -L zsh && setopt no_hist_expand extended_glob && zmodload zsh/system zsh/datetime && echo ok || return - - local ip last_ip - local -F next_ip_time - while ! zsystem flock -t 0 $lock 2>/dev/null && kill -0 $parent_pid; do - if (( time_realtime )); then - echo || break - # SIGWINCH 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). - # Fix: https://github.com/zsh-users/zsh/commit/5e11082349bf72897f93f3a4493a97a2caf15984. - kill -WINCH $parent_pid - fi - if (( public_ip && EPOCHREALTIME >= next_ip_time )); then - ip= - local method='' - local -F start=EPOCHREALTIME - next_ip_time=$((start + 5)) - for method in $ip_methods $ip_methods; do - case $method in - dig) - if (( $+commands[dig] )); then - ip=$(command dig +tries=1 +short -4 A myip.opendns.com @resolver1.opendns.com 2>/dev/null) - [[ $ip == ';'* ]] && ip= - if [[ -z $ip ]]; then - ip=$(command dig +tries=1 +short -6 AAAA myip.opendns.com @resolver1.opendns.com 2>/dev/null) - [[ $ip == ';'* ]] && ip= - fi - fi - ;; - curl) - if (( $+commands[curl] )); then - ip=$(command curl --max-time 5 -w '\n' "$ip_url" 2>/dev/null) - fi - ;; - wget) - if (( $+commands[wget] )); then - ip=$(wget -T 5 -qO- "$ip_url" 2>/dev/null) - fi - ;; - esac - [[ $ip =~ '^[0-9a-f.:]+$' ]] || ip='' - if [[ -n $ip ]]; then - next_ip_time=$((start + tout)) - break - fi - done - if [[ $ip != $last_ip ]]; then - last_ip=$ip - echo _P9K_PUBLIC_IP=${(q)${${ip//\%/%%}//$'\n'}} || break - kill -WINCH $parent_pid - fi - fi - sleep 1 - done - command rm -f $lock $fifo - } + _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) + 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 + zsystem flock -f _p9k_async_pump_lock_fd $_p9k_async_pump_lock zsh -dfc " local -i public_ip=$public_ip time_realtime=$time_realtime parent_pid=$$ - local -a ip_methods=($POWERLEVEL9K_PUBLIC_IP_METHODS) - local -F tout=$POWERLEVEL9K_PUBLIC_IP_TIMEOUT - local ip_url=$POWERLEVEL9K_PUBLIC_IP_HOST - local lock=$_P9K_ASYNC_PUMP_LOCK - local fifo=$_P9K_ASYNC_PUMP_FIFO + local -a ip_methods=($_POWERLEVEL9K_PUBLIC_IP_METHODS) + local -F tout=$_POWERLEVEL9K_PUBLIC_IP_TIMEOUT + local ip_url=$_POWERLEVEL9K_PUBLIC_IP_HOST + local lock=$_p9k_async_pump_lock + local fifo=$_p9k_async_pump_fifo $functions[_p9k_async_pump] - " </dev/null >&$_P9K_ASYNC_PUMP_FD 2>/dev/null &! - - _P9K_ASYNC_PUMP_PID=$! - _P9K_ASYNC_PUMP_SUBSHELL=$ZSH_SUBSHELL + " </dev/null >&$_p9k_async_pump_fd 2>/dev/null &! - unfunction _p9k_async_pump + _p9k_async_pump_pid=$! + _p9k_async_pump_subshell=$ZSH_SUBSHELL local resp - read -r -u $_P9K_ASYNC_PUMP_FD resp && [[ $resp == ok ]] + read -r -u $_p9k_async_pump_fd resp && [[ $resp == ok ]] - function _p9k_kill_async_pump() { - emulate -L zsh && setopt no_hist_expand extended_glob - if (( ZSH_SUBSHELL == _P9K_ASYNC_PUMP_SUBSHELL )); then - (( _P9K_ASYNC_PUMP_PID )) && kill -- -$_P9K_ASYNC_PUMP_PID &>/dev/null - command rm -f "$_P9K_ASYNC_PUMP_FIFO" "$_P9K_ASYNC_PUMP_LOCK" - fi - } add-zsh-hook zshexit _p9k_kill_async_pump } @@ -3037,18 +3167,7 @@ _p9k_init_async_pump() { >&2 print -P "%F{red}[ERROR]%f Powerlevel10k failed to start async worker. The following segments may malfunction: " (( public_ip )) && >&2 print -P " - %F{green}public_ip%f" (( time_realtime )) && >&2 print -P " - %F{green}time%f" - if (( _P9K_ASYNC_PUMP_FD )); then - zle -F $_P9K_ASYNC_PUMP_FD - exec {_P9K_ASYNC_PUMP_FD}>&- - _P9K_ASYNC_PUMP_FD=0 - fi - if (( _P9K_ASYNC_PUMP_PID )); then - kill -- -$_P9K_ASYNC_PUMP_PID &>/dev/null - _P9K_ASYNC_PUMP_PID=0 - fi - command rm -f $_P9K_ASYNC_PUMP_FIFO - _P9K_ASYNC_PUMP_FIFO='' - unset -f _p9k_on_async_message + _p9k_deinit_async_pump fi } @@ -3068,34 +3187,294 @@ function _p9k_prompt_overflow_bug() { is-at-least 5.5 && ! is-at-least 5.7.2 } -# 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 -# starting from scratch we wouldn't perform automatic conversion from the former to the latter. -# But we aren't starting from scratch, so convert we do. -_p9k_init_strings() { - # To find candidates: +_p9k_init_vars() { + typeset -g _p9k_param_sig + typeset -g _p9k_ret + typeset -g _p9k_cache_key + typeset -ga _p9k_cache_val + typeset -gA _p9k_cache + typeset -ga _p9k_t + typeset -g _p9k_n + typeset -gi _p9k_i + typeset -g _p9k_bg + typeset -ga _p9k_left_join + typeset -ga _p9k_right_join + typeset -g _p9k_public_ip + typeset -g _p9k_todo_file + # git workdir => the last prompt we've shown for it + typeset -gA _p9k_last_git_prompt + # git workdir => 1 if gitstatus is slow on it, 0 if it's fast. + typeset -gA _p9k_git_slow + typeset -gF _p9k_gitstatus_start_time + typeset -g _p9k_prompt + typeset -g _p9k_rprompt + typeset -g _p9k_lprompt + typeset -g _p9k_prompt_side + typeset -g _p9k_segment_name + typeset -gi _p9k_segment_index + typeset -g _p9k_refresh_reason + typeset -gi _p9k_region_active + typeset -g _p9k_real_zle_rprompt_indent + typeset -g _p9k_async_pump_line + typeset -g _p9k_async_pump_fifo + typeset -g _p9k_async_pump_lock + typeset -gi _p9k_async_pump_lock_fd + typeset -gi _p9k_async_pump_fd + typeset -gi _p9k_async_pump_pid + typeset -gi _p9k_async_pump_subshell + typeset -ga _p9k_line_segments_left + typeset -ga _p9k_line_segments_right + typeset -ga _p9k_line_prefix_left + typeset -ga _p9k_line_prefix_right + typeset -ga _p9k_line_suffix_left + typeset -ga _p9k_line_suffix_right + typeset -ga _p9k_line_never_empty_right + typeset -ga _p9k_line_gap_post + typeset -g _p9k_xy + typeset -g _p9k_clm + typeset -g _p9k_p + typeset -gi _p9k_x + typeset -gi _p9k_y + typeset -gi _p9k_m + typeset -gi _p9k_d + typeset -gi _p9k_g + typeset -gi _p9k_ind + typeset -g _p9k_gap_pre + typeset -g _p9k_prompt_prefix_left + typeset -g _p9k_prompt_prefix_right + typeset -g _p9k_prompt_suffix_left + typeset -g _p9k_prompt_suffix_right + typeset -gi _p9k_emulate_zero_rprompt_indent + typeset -gA _p9k_battery_states + typeset -g _p9k_os + typeset -g _p9k_os_icon + typeset -g _p9k_color1 + typeset -g _p9k_color2 + typeset -g _p9k_s + typeset -g _p9k_ss + typeset -g _p9k_sss + typeset -g _p9k_v + typeset -g _p9k_c + typeset -g _p9k_e + typeset -g _p9k_w + typeset -gi _p9k_dir_len + typeset -gi _p9k_num_cpus + + typeset -gF P9K_COMMAND_DURATION_SECONDS + typeset -g P9K_VISUAL_IDENTIFIER + typeset -g P9K_CONTENT + typeset -g P9K_GAP +} + +_p9k_init_params() { + _p9k_declare -a POWERLEVEL9K_LEFT_PROMPT_ELEMENTS -- context dir vcs + _p9k_declare -a POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS -- status root_indicator background_jobs history time + _p9k_declare -b POWERLEVEL9K_DISABLE_RPROMPT 0 + _p9k_declare -b POWERLEVEL9K_PROMPT_ADD_NEWLINE 0 + _p9k_declare -b POWERLEVEL9K_PROMPT_ON_NEWLINE 0 + _p9k_declare -b POWERLEVEL9K_RPROMPT_ON_NEWLINE 0 + _p9k_declare -b POWERLEVEL9K_SHOW_RULER 0 + _p9k_declare -i POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT 1 + _p9k_declare -s POWERLEVEL9K_COLOR_SCHEME dark + _p9k_declare -s POWERLEVEL9K_GITSTATUS_DIR "" + _p9k_declare -b POWERLEVEL9K_VCS_SHOW_SUBMODULE_DIRTY 0 + _p9k_declare -i POWERLEVEL9K_VCS_SHORTEN_LENGTH + _p9k_declare -i POWERLEVEL9K_VCS_SHORTEN_MIN_LENGTH + _p9k_declare -s POWERLEVEL9K_VCS_SHORTEN_STRATEGY + _p9k_declare -s POWERLEVEL9K_VCS_SHORTEN_DELIMITER + _p9k_declare -b POWERLEVEL9K_HIDE_BRANCH_ICON 0 + _p9k_declare -b POWERLEVEL9K_VCS_HIDE_TAGS 0 + _p9k_declare -i POWERLEVEL9K_CHANGESET_HASH_LENGTH 8 + # Specifies the maximum number of elements in the cache. When the cache grows over this limit, + # it gets cleared. This is meant to avoid memory leaks when a rogue prompt is filling the cache + # with data. + _p9k_declare -i POWERLEVEL9K_MAX_CACHE_SIZE 10000 + _p9k_declare -e POWERLEVEL9K_ANACONDA_LEFT_DELIMITER "(" + _p9k_declare -e POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER ")" + _p9k_declare -b POWERLEVEL9K_ANACONDA_SHOW_PYTHON_VERSION 1 + _p9k_declare -b POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE 1 + _p9k_declare -b POWERLEVEL9K_BACKGROUND_JOBS_VERBOSE_ALWAYS 0 + _p9k_declare -b POWERLEVEL9K_DISK_USAGE_ONLY_WARNING 0 + _p9k_declare -i POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL 90 + _p9k_declare -i POWERLEVEL9K_DISK_USAGE_CRITICAL_LEVEL 95 + _p9k_declare -i POWERLEVEL9K_BATTERY_LOW_THRESHOLD 10 + _p9k_declare -i POWERLEVEL9K_BATTERY_HIDE_ABOVE_THRESHOLD 999 + _p9k_declare -a POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND -- + _p9k_declare -b POWERLEVEL9K_BATTERY_VERBOSE 1 + if [[ $parameters[POWERLEVEL9K_BATTERY_STAGES] == scalar ]]; then + _p9k_declare -e POWERLEVEL9K_BATTERY_STAGES + else + _p9k_declare -a POWERLEVEL9K_BATTERY_STAGES -- + _POWERLEVEL9K_BATTERY_STAGES=("${(@g::)_POWERLEVEL9K_BATTERY_STAGES}") + fi + _p9k_declare -F POWERLEVEL9K_PUBLIC_IP_TIMEOUT 300 + _p9k_declare -a POWERLEVEL9K_PUBLIC_IP_METHODS -- dig curl wget + _p9k_declare -e POWERLEVEL9K_PUBLIC_IP_NONE "" + _p9k_declare -s POWERLEVEL9K_PUBLIC_IP_HOST "http://ident.me" + _p9k_declare -s POWERLEVEL9K_PUBLIC_IP_VPN_INTERFACE "" + _p9k_declare -b POWERLEVEL9K_ALWAYS_SHOW_CONTEXT 0 + _p9k_declare -b POWERLEVEL9K_ALWAYS_SHOW_USER 0 + _p9k_declare -e POWERLEVEL9K_CONTEXT_TEMPLATE "%n@%m" + _p9k_declare -e POWERLEVEL9K_USER_TEMPLATE "%n" + _p9k_declare -e POWERLEVEL9K_HOST_TEMPLATE "%m" + _p9k_declare -F POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD 3 + _p9k_declare -i POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION 2 + # Other options: "d h m s". + _p9k_declare -s POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT "H:M:S" + _p9k_declare -e POWERLEVEL9K_DIR_PATH_SEPARATOR "/" + _p9k_declare -e POWERLEVEL9K_HOME_FOLDER_ABBREVIATION "~" + _p9k_declare -b POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD 0 + _p9k_declare -b POWERLEVEL9K_DIR_ANCHORS_BOLD 0 + _p9k_declare -b POWERLEVEL9K_DIR_PATH_ABSOLUTE 0 + _p9k_declare -b POWERLEVEL9K_DIR_SHOW_WRITABLE 0 + _p9k_declare -b POWERLEVEL9K_DIR_OMIT_FIRST_CHARACTER 0 + _p9k_declare -b POWERLEVEL9K_DIR_HYPERLINK 0 + _p9k_declare -s POWERLEVEL9K_SHORTEN_STRATEGY "" + _p9k_declare -s POWERLEVEL9K_DIR_PATH_SEPARATOR_FOREGROUND + _p9k_declare -s POWERLEVEL9K_DIR_PATH_HIGHLIGHT_FOREGROUND + _p9k_declare -s POWERLEVEL9K_DIR_ANCHOR_FOREGROUND + _p9k_declare -s POWERLEVEL9K_DIR_SHORTENED_FOREGROUND + _p9k_declare -s POWERLEVEL9K_SHORTEN_FOLDER_MARKER "(.shorten_folder_marker|.bzr|CVS|.git|.hg|.svn|.terraform|.citc)" + # Shorten directory if it's longer than this even if there is space for it. + # The value can be either absolute (e.g., '80') or a percentage of terminal + # width (e.g, '50%'). If empty, directory will be shortened only when prompt + # doesn't fit. Applies only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. + _p9k_declare -s POWERLEVEL9K_DIR_MAX_LENGTH 0 + # Individual elements are patterns. They are expanded with the options set + # by `emulate zsh && setopt extended_glob`. + _p9k_declare -a POWERLEVEL9K_DIR_PACKAGE_FILES -- package.json composer.json + # When dir is on the last prompt line, try to shorten it enough to leave at least this many + # columns for typing commands. Applies only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. + _p9k_declare -i POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS 40 + # When dir is on the last prompt line, try to shorten it enough to leave at least + # COLUMNS * POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT * 0.01 columns for typing commands. Applies + # only when POWERLEVEL9K_SHORTEN_STRATEGY=truncate_to_unique. + _p9k_declare -F POWERLEVEL9K_DIR_MIN_COMMAND_COLUMNS_PCT 50 + # POWERLEVEL9K_DIR_CLASSES allow you to specify custom styling and icons for different + # directories. + # + # POWERLEVEL9K_DIR_CLASSES must be an array with 3 * N elements. Each triplet consists of: + # + # 1. A pattern against which the current directory is matched. Matching is done with + # extended_glob option enabled. + # 2. Directory class for the purpose of styling. + # 3. Icon. + # + # Triplets are tried in order. The first triplet whose pattern matches $PWD wins. If there are no + # matches, there will be no icon and the styling is done according to POWERLEVEL9K_DIR_BACKGROUND, + # POWERLEVEL9K_DIR_FOREGROUND, etc. + # + # Example: + # + # POWERLEVEL9K_DIR_CLASSES=( + # '~/work(/*)#' WORK '(╯°□°)╯︵ ┻━┻' + # '~(/*)#' HOME '⌂' + # '*' DEFAULT '') + # + # POWERLEVEL9K_DIR_WORK_BACKGROUND=red + # POWERLEVEL9K_DIR_HOME_BACKGROUND=blue + # POWERLEVEL9K_DIR_DEFAULT_BACKGROUND=yellow + # + # With these settings, the current directory in the prompt may look like this: # - # egrep 'set_default [^-]' powerlevel9k.zsh-theme | egrep -v '(true|false)$' - _p9k_g_expand POWERLEVEL9K_ANACONDA_LEFT_DELIMITER - _p9k_g_expand POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER - _p9k_g_expand POWERLEVEL9K_CONTEXT_TEMPLATE - _p9k_g_expand POWERLEVEL9K_DATE_FORMAT - _p9k_g_expand POWERLEVEL9K_DIR_PATH_SEPARATOR - _p9k_g_expand POWERLEVEL9K_HOME_FOLDER_ABBREVIATION - _p9k_g_expand POWERLEVEL9K_HOST_TEMPLATE - _p9k_g_expand POWERLEVEL9K_PUBLIC_IP_NONE - _p9k_g_expand POWERLEVEL9K_SHORTEN_DELIMITER - _p9k_g_expand POWERLEVEL9K_TIME_FORMAT - _p9k_g_expand POWERLEVEL9K_USER_TEMPLATE - _p9k_g_expand POWERLEVEL9K_VCS_LOADING_TEXT - _p9k_g_expand POWERLEVEL9K_VI_COMMAND_MODE_STRING - _p9k_g_expand POWERLEVEL9K_VI_INSERT_MODE_STRING + # (╯°□°)╯︵ ┻━┻ ~/work/projects/important/urgent + # + # ⌂ ~/best/powerlevel10k + _p9k_declare -a POWERLEVEL9K_DIR_CLASSES + _p9k_declare -i POWERLEVEL9K_SHORTEN_DELIMITER_LENGTH + _p9k_declare -e POWERLEVEL9K_SHORTEN_DELIMITER + _p9k_declare -i POWERLEVEL9K_SHORTEN_DIR_LENGTH + _p9k_declare -s POWERLEVEL9K_IP_INTERFACE "^[^ ]+" + _p9k_declare -s POWERLEVEL9K_VPN_IP_INTERFACE "tun" + _p9k_declare -i POWERLEVEL9K_LOAD_WHICH 5 + _p9k_declare -b POWERLEVEL9K_NODENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -b POWERLEVEL9K_NODE_VERSION_PROJECT_ONLY 0 + _p9k_declare -b POWERLEVEL9K_RBENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -b POWERLEVEL9K_CHRUBY_SHOW_VERSION 1 + _p9k_declare -b POWERLEVEL9K_CHRUBY_SHOW_ENGINE 1 + _p9k_declare -b POWERLEVEL9K_STATUS_CROSS 0 + _p9k_declare -b POWERLEVEL9K_STATUS_OK 1 + _p9k_declare -b POWERLEVEL9K_STATUS_SHOW_PIPESTATUS 1 + _p9k_declare -b POWERLEVEL9K_STATUS_HIDE_SIGNAME 0 + _p9k_declare -b POWERLEVEL9K_STATUS_VERBOSE 1 + _p9k_declare -b POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE 0 + # Format for the current time: 09:51:02. See `man 3 strftime`. + _p9k_declare -e POWERLEVEL9K_TIME_FORMAT "%D{%H:%M:%S}" + # If set to true, time will update every second. + _p9k_declare -b POWERLEVEL9K_EXPERIMENTAL_TIME_REALTIME 0 + # If set to true, time will update when you hit enter. This way prompts for the past + # commands will contain the start times of their commands as opposed to the default + # behavior where they contain the end times of their preceding commands. + _p9k_declare -b POWERLEVEL9K_TIME_UPDATE_ON_COMMAND 0 + _p9k_declare -e POWERLEVEL9K_DATE_FORMAT "%D{%d.%m.%y}" + _p9k_declare -s POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND 1 + _p9k_declare -b POWERLEVEL9K_SHOW_CHANGESET 0 + _p9k_declare -e POWERLEVEL9K_VCS_LOADING_TEXT loading + _p9k_declare -a POWERLEVEL9K_VCS_GIT_HOOKS -- vcs-detect-changes git-untracked git-aheadbehind git-stash git-remotebranch git-tagname + _p9k_declare -a POWERLEVEL9K_VCS_HG_HOOKS -- vcs-detect-changes + _p9k_declare -a POWERLEVEL9K_VCS_SVN_HOOKS -- vcs-detect-changes svn-detect-changes + # If it takes longer than this to fetch git repo status, display the prompt with a greyed out + # vcs segment and fix it asynchronously when the results come it. + _p9k_declare -F POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS 0.05 + _p9k_declare -a POWERLEVEL9K_VCS_BACKENDS -- git + _p9k_declare -b POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING 0 + _p9k_declare -i POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY -1 + _p9k_declare -i POWERLEVEL9K_VCS_STAGED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM 1 + _p9k_declare -i POWERLEVEL9K_VCS_COMMITS_AHEAD_MAX_NUM -1 + _p9k_declare -i POWERLEVEL9K_VCS_COMMITS_BEHIND_MAX_NUM -1 + _p9k_declare -b POWERLEVEL9K_DISABLE_GITSTATUS 0 + _p9k_declare -e POWERLEVEL9K_VI_INSERT_MODE_STRING "INSERT" + _p9k_declare -e POWERLEVEL9K_VI_COMMAND_MODE_STRING "NORMAL" + # VISUAL mode is shown as NORMAL unless POWERLEVEL9K_VI_VISUAL_MODE_STRING is explicitly set. + _p9k_declare -e POWERLEVEL9K_VI_VISUAL_MODE_STRING + _p9k_declare -b POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION 1 + _p9k_declare -e POWERLEVEL9K_VIRTUALENV_LEFT_DELIMITER "(" + _p9k_declare -e POWERLEVEL9K_VIRTUALENV_RIGHT_DELIMITER ")" + _p9k_declare -b POWERLEVEL9K_PYENV_PROMPT_ALWAYS_SHOW 0 + _p9k_declare -b POWERLEVEL9K_KUBECONTEXT_SHOW_DEFAULT_NAMESPACE 1 + # Defines context classes for the purpose of applying different styling to different contexts. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES must be an array with even number of elements. The first + # element in each pair defines a pattern against which the current context (in the format it is + # displayed in the prompt) gets matched. The second element defines context class. Patterns are + # tried in order. The first match wins. + # + # If a non-empty class <C> is assigned to a context, the segment is styled with + # POWERLEVEL9K_KUBECONTEXT_<U>_BACKGROUND and POWERLEVEL9K_KUBECONTEXT_<U>_FOREGROUND where <U> is + # uppercased <C>. Otherwise with POWERLEVEL9K_KUBECONTEXT_BACKGROUND and + # POWERLEVEL9K_KUBECONTEXT_FOREGROUND. + # + # Example: Use red background for contexts containing "prod", green for "testing" and yellow for + # everything else. + # + # POWERLEVEL9K_KUBECONTEXT_CLASSES=( + # '*prod*' prod + # '*testing*' testing + # '*' other) + # + # POWERLEVEL9K_KUBECONTEXT_PROD_BACKGROUND=red + # POWERLEVEL9K_KUBECONTEXT_TESTING_BACKGROUND=green + # POWERLEVEL9K_KUBECONTEXT_OTHER_BACKGROUND=yellow + _p9k_declare -a POWERLEVEL9K_KUBECONTEXT_CLASSES -- + # Specifies the format of java version. + # + # POWERLEVEL9K_JAVA_VERSION_FULL=true => 1.8.0_212-8u212-b03-0ubuntu1.18.04.1-b03 + # POWERLEVEL9K_JAVA_VERSION_FULL=false => 1.8.0_212 + # + # These correspond to `java -fullversion` and `java -version` respectively. + _p9k_declare -b POWERLEVEL9K_JAVA_VERSION_FULL 1 } +typeset -ga __p9k_wrapped_zle_widgets + # _p9k_wrap_zle_widget zle-keymap-select _p9k_zle_keymap_select _p9k_wrap_zle_widget() { local widget=$1 local hook=$2 + (( __p9k_wrapped_zle_widgets[(I)$widget:$hook] )) && return + __p9k_wrapped_zle_widgets+=$widget:$hook local orig=p9k-orig-$widget case $widgets[$widget] in user:*) @@ -3116,49 +3495,63 @@ _p9k_wrap_zle_widget() { zle -N -- $widget $wrapper } +function _p9k_zle_line_finish() { + (( __p9k_enabled )) || return + [[ ! -o TRANSIENT_RPROMPT ]] || _p9k_rprompt_override= + _p9k_line_finish= + zle && zle .reset-prompt && zle -R +} + +function _p9k_zle_line_pre_redraw() { + (( __p9k_enabled )) || return + [[ ${KEYMAP:-} == vicmd ]] || return 0 + local region=${${REGION_ACTIVE:-0}/2/1} + [[ $region != $_p9k_region_active ]] || return 0 + _p9k_region_active=$region + zle && zle .reset-prompt && zle -R +} + prompt__p9k_internal_nothing() { - _P9K_PROMPT+='${_P9K_SSS::=}' + _p9k_prompt+='${_p9k_sss::=}' } # _p9k_build_gap_post <first|newline> _p9k_build_gap_post() { _p9k_get_icon '' MULTILINE_${(U)1}_PROMPT_GAP_CHAR - local char=${_P9K_RETVAL:- } + local char=${_p9k_ret:- } _p9k_prompt_length $char - if (( _P9K_RETVAL != 1 || $#char != 1 )); then + if (( _p9k_ret != 1 || $#char != 1 )); then print -P "%F{red}WARNING!%f %BMULTILINE_${(U)1}_PROMPT_GAP_CHAR%b is not one character long. Will use ' '." print -P "Either change the value of %BPOWERLEVEL9K_MULTILINE_${(U)1}_PROMPT_GAP_CHAR%b or remove it." char=' ' fi local style _p9k_color prompt_multiline_$1_prompt_gap BACKGROUND "" - [[ -n $_P9K_RETVAL ]] && _p9k_background $_P9K_RETVAL - style+=$_P9K_RETVAL + [[ -n $_p9k_ret ]] && _p9k_background $_p9k_ret + style+=$_p9k_ret _p9k_color prompt_multiline_$1_prompt_gap FOREGROUND "" - [[ -n $_P9K_RETVAL ]] && _p9k_foreground $_P9K_RETVAL - style+=$_P9K_RETVAL + [[ -n $_p9k_ret ]] && _p9k_foreground $_p9k_ret + style+=$_p9k_ret local exp=POWERLEVEL9K_MULTILINE_${(U)1}_PROMPT_GAP_EXPANSION (( $+parameters[$exp] )) && exp=${(P)exp} || exp='${P9K_GAP}' [[ $char == '.' ]] && local s=',' || local s='.' - _P9K_RETVAL=$style'${${${_P9K_M:#-*}:+' + _p9k_ret=$style'${${${_p9k_m:#-*}:+' if [[ $exp == '${P9K_GAP}' ]]; then - _P9K_RETVAL+='${(pl'$s'$((_P9K_M+1))'$s$s$char$s$')}' + _p9k_ret+='${(pl'$s'$((_p9k_m+1))'$s$s$char$s$')}' else - _P9K_RETVAL+='${${P9K_GAP::=${(pl'$s'$((_P9K_M+1))'$s$s$char$s$')}}+}' - _P9K_RETVAL+='${:-"'$exp'"}' + _p9k_ret+='${${P9K_GAP::=${(pl'$s'$((_p9k_m+1))'$s$s$char$s$')}}+}' + _p9k_ret+='${:-"'$exp'"}' style=1 fi - _P9K_RETVAL+='$_P9K_RPROMPT$_P9K_T[$((1+!_P9K_IND))]}:-\n}' - [[ -n $style ]] && _P9K_RETVAL+='%b%k%f' + _p9k_ret+='$_p9k_rprompt$_p9k_t[$((1+!_p9k_ind))]}:-\n}' + [[ -n $style ]] && _p9k_ret+='%b%k%f' } _p9k_init_lines() { - typeset -ga _P9K_LINE_{SEGMENTS,PREFIX,SUFFIX}_{LEFT,RIGHT} - typeset -ga _P9K_LINE_NEVER_EMPTY_RIGHT _P9K_LINE_GAP_POST - local -a left_segments=($POWERLEVEL9K_LEFT_PROMPT_ELEMENTS) - local -a right_segments=($POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS) + local -a left_segments=($_POWERLEVEL9K_LEFT_PROMPT_ELEMENTS) + local -a right_segments=($_POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS) - if [[ $POWERLEVEL9K_PROMPT_ON_NEWLINE == true ]]; then + if (( _POWERLEVEL9K_PROMPT_ON_NEWLINE )); then left_segments+=(newline _p9k_internal_nothing) fi @@ -3168,7 +3561,7 @@ _p9k_init_lines() { repeat $((num_right_lines - num_left_lines)) left_segments=(newline $left_segments) local -i num_lines=num_right_lines else - if [[ $POWERLEVEL9K_RPROMPT_ON_NEWLINE == true ]]; then + if (( _POWERLEVEL9K_RPROMPT_ON_NEWLINE )); then repeat $((num_left_lines - num_right_lines)) right_segments=(newline $right_segments) else repeat $((num_left_lines - num_right_lines)) right_segments+=newline @@ -3179,89 +3572,89 @@ _p9k_init_lines() { repeat $num_lines; do local -i left_end=${left_segments[(i)newline]} local -i right_end=${right_segments[(i)newline]} - _P9K_LINE_SEGMENTS_LEFT+="${(pj:\0:)left_segments[1,left_end-1]}" - _P9K_LINE_SEGMENTS_RIGHT+="${(pj:\0:)right_segments[1,right_end-1]}" + _p9k_line_segments_left+="${(pj:\0:)left_segments[1,left_end-1]}" + _p9k_line_segments_right+="${(pj:\0:)right_segments[1,right_end-1]}" (( left_end > $#left_segments )) && left_segments=() || shift left_end left_segments (( right_end > $#right_segments )) && right_segments=() || shift right_end right_segments _p9k_get_icon '' LEFT_SEGMENT_SEPARATOR - _p9k_get_icon 'prompt_empty_line' LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL $_P9K_RETVAL - _p9k_escape $_P9K_RETVAL - _P9K_LINE_PREFIX_LEFT+='${${:-${_P9K_BG::=NONE}${_P9K_I::=0}${_P9K_SSS::=%f'$_P9K_RETVAL'}}+}' - _P9K_LINE_SUFFIX_LEFT+='%b%k$_P9K_SSS%b%k%f' + _p9k_get_icon 'prompt_empty_line' LEFT_PROMPT_LAST_SEGMENT_END_SYMBOL $_p9k_ret + _p9k_escape $_p9k_ret + _p9k_line_prefix_left+='${${:-${_p9k_bg::=NONE}${_p9k_i::=0}${_p9k_sss::=%f'$_p9k_ret'}}+}' + _p9k_line_suffix_left+='%b%k$_p9k_sss%b%k%f' _p9k_escape ${(g::)POWERLEVEL9K_EMPTY_LINE_RIGHT_PROMPT_FIRST_SEGMENT_START_SYMBOL} - [[ -n $_P9K_RETVAL ]] && _P9K_LINE_NEVER_EMPTY_RIGHT+=1 || _P9K_LINE_NEVER_EMPTY_RIGHT+=0 - _P9K_LINE_PREFIX_RIGHT+='${${:-${_P9K_BG::=NONE}${_P9K_I::=0}${_P9K_SSS::='$_P9K_RETVAL'}}+}' - _P9K_LINE_SUFFIX_RIGHT+='$_P9K_SSS%b%k%f' # gets overridden for _P9K_EMULATE_ZERO_RPROMPT_INDENT + [[ -n $_p9k_ret ]] && _p9k_line_never_empty_right+=1 || _p9k_line_never_empty_right+=0 + _p9k_line_prefix_right+='${${:-${_p9k_bg::=NONE}${_p9k_i::=0}${_p9k_sss::='$_p9k_ret'}}+}' + _p9k_line_suffix_right+='$_p9k_sss%b%k%f' # gets overridden for _p9k_emulate_zero_rprompt_indent done _p9k_get_icon '' LEFT_SEGMENT_END_SEPARATOR - if [[ -n $_P9K_RETVAL ]]; then - _P9K_RETVAL+=%b%k%f + if [[ -n $_p9k_ret ]]; then + _p9k_ret+=%b%k%f # Not escaped for historical reasons. - _P9K_RETVAL='${:-"'$_P9K_RETVAL'"}' - if [[ $POWERLEVEL9K_PROMPT_ON_NEWLINE == true ]]; then - _P9K_LINE_SUFFIX_LEFT[-2]+=$_P9K_RETVAL + _p9k_ret='${:-"'$_p9k_ret'"}' + if (( _POWERLEVEL9K_PROMPT_ON_NEWLINE )); then + _p9k_line_suffix_left[-2]+=$_p9k_ret else - _P9K_LINE_SUFFIX_LEFT[-1]+=$_P9K_RETVAL + _p9k_line_suffix_left[-1]+=$_p9k_ret fi fi if (( num_lines > 1 )); then _p9k_build_gap_post first - _P9K_LINE_GAP_POST[1]=$_P9K_RETVAL + _p9k_line_gap_post[1]=$_p9k_ret - if [[ $+POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX == 1 || $POWERLEVEL9K_PROMPT_ON_NEWLINE == true ]]; then + if [[ $+POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX == 1 || $_POWERLEVEL9K_PROMPT_ON_NEWLINE == 1 ]]; then _p9k_get_icon '' MULTILINE_FIRST_PROMPT_PREFIX - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=%b%k%f + [[ _p9k_ret == *%* ]] && _p9k_ret+=%b%k%f # Not escaped for historical reasons. - _P9K_RETVAL='${:-"'$_P9K_RETVAL'"}' - _P9K_LINE_PREFIX_LEFT[1]=$_P9K_RETVAL$_P9K_LINE_PREFIX_LEFT[1] + _p9k_ret='${:-"'$_p9k_ret'"}' + _p9k_line_prefix_left[1]=$_p9k_ret$_p9k_line_prefix_left[1] fi - if [[ $+POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX == 1 || $POWERLEVEL9K_PROMPT_ON_NEWLINE == true ]]; then + if [[ $+POWERLEVEL9K_MULTILINE_LAST_PROMPT_PREFIX == 1 || $_POWERLEVEL9K_PROMPT_ON_NEWLINE == 1 ]]; then _p9k_get_icon '' MULTILINE_LAST_PROMPT_PREFIX - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=%b%k%f + [[ _p9k_ret == *%* ]] && _p9k_ret+=%b%k%f # Not escaped for historical reasons. - _P9K_RETVAL='${:-"'$_P9K_RETVAL'"}' - _P9K_LINE_PREFIX_LEFT[-1]=$_P9K_RETVAL$_P9K_LINE_PREFIX_LEFT[-1] + _p9k_ret='${:-"'$_p9k_ret'"}' + _p9k_line_prefix_left[-1]=$_p9k_ret$_p9k_line_prefix_left[-1] fi _p9k_get_icon '' MULTILINE_FIRST_PROMPT_SUFFIX - if [[ -n $_P9K_RETVAL ]]; then - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=%b%k%f - _p9k_escape $_P9K_RETVAL - _P9K_LINE_SUFFIX_RIGHT[1]+=$_P9K_RETVAL - _P9K_LINE_NEVER_EMPTY_RIGHT[1]=1 + if [[ -n $_p9k_ret ]]; then + [[ _p9k_ret == *%* ]] && _p9k_ret+=%b%k%f + _p9k_escape $_p9k_ret + _p9k_line_suffix_right[1]+=$_p9k_ret + _p9k_line_never_empty_right[1]=1 fi _p9k_get_icon '' MULTILINE_LAST_PROMPT_SUFFIX - if [[ -n $_P9K_RETVAL ]]; then - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=%b%k%f - _p9k_escape $_P9K_RETVAL - _P9K_LINE_SUFFIX_RIGHT[-1]+=$_P9K_RETVAL - _P9K_LINE_NEVER_EMPTY_RIGHT[-1]=1 + if [[ -n $_p9k_ret ]]; then + [[ _p9k_ret == *%* ]] && _p9k_ret+=%b%k%f + _p9k_escape $_p9k_ret + _p9k_line_suffix_right[-1]+=$_p9k_ret + _p9k_line_never_empty_right[-1]=1 fi if (( num_lines > 2 )); then _p9k_build_gap_post newline - _P9K_LINE_GAP_POST[2,-2]=(${${:-{3..num_lines}}:/*/$_P9K_RETVAL}) + _p9k_line_gap_post[2,-2]=(${${:-{3..num_lines}}:/*/$_p9k_ret}) - if [[ $+POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX == 1 || $POWERLEVEL9K_PROMPT_ON_NEWLINE == true ]]; then + if [[ $+POWERLEVEL9K_MULTILINE_NEWLINE_PROMPT_PREFIX == 1 || $_POWERLEVEL9K_PROMPT_ON_NEWLINE == 1 ]]; then _p9k_get_icon '' MULTILINE_NEWLINE_PROMPT_PREFIX - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=%b%k%f + [[ _p9k_ret == *%* ]] && _p9k_ret+=%b%k%f # Not escaped for historical reasons. - _P9K_RETVAL='${:-"'$_P9K_RETVAL'"}' - _P9K_LINE_PREFIX_LEFT[2,-2]=$_P9K_RETVAL${^_P9K_LINE_PREFIX_LEFT[2,-2]} + _p9k_ret='${:-"'$_p9k_ret'"}' + _p9k_line_prefix_left[2,-2]=$_p9k_ret${^_p9k_line_prefix_left[2,-2]} fi _p9k_get_icon '' MULTILINE_NEWLINE_PROMPT_SUFFIX - if [[ -n $_P9K_RETVAL ]]; then - [[ _P9K_RETVAL == *%* ]] && _P9K_RETVAL+=%b%k%f - _p9k_escape $_P9K_RETVAL - _P9K_LINE_SUFFIX_RIGHT[2,-2]=${^_P9K_LINE_SUFFIX_RIGHT[2,-2]}$_P9K_RETVAL - _P9K_LINE_NEVER_EMPTY_RIGHT[2,-2]=${(@)_P9K_LINE_NEVER_EMPTY_RIGHT[2,-2]/0/1} + if [[ -n $_p9k_ret ]]; then + [[ _p9k_ret == *%* ]] && _p9k_ret+=%b%k%f + _p9k_escape $_p9k_ret + _p9k_line_suffix_right[2,-2]=${^_p9k_line_suffix_right[2,-2]}$_p9k_ret + _p9k_line_never_empty_right[2,-2]=${(@)_p9k_line_never_empty_right[2,-2]/0/1} fi fi fi @@ -3270,62 +3663,60 @@ _p9k_init_lines() { _p9k_init_prompt() { _p9k_init_lines - typeset -g _P9K_XY _P9K_CLM _P9K_P - typeset -gi _P9K_X _P9K_Y _P9K_M _P9K_D _P9K_G _P9K_IND - typeset -g _P9K_GAP_PRE='${${:-${_P9K_X::=0}${_P9K_Y::=1024}${_P9K_P::=$_P9K_LPROMPT$_P9K_RPROMPT}' + _p9k_gap_pre='${${:-${_p9k_x::=0}${_p9k_y::=1024}${_p9k_p::=$_p9k_lprompt$_p9k_rprompt}' repeat 10; do - _P9K_GAP_PRE+='${_P9K_M::=$(((_P9K_X+_P9K_Y)/2))}' - _P9K_GAP_PRE+='${_P9K_XY::=${${(%):-$_P9K_P%$_P9K_M(l./$_P9K_M;$_P9K_Y./$_P9K_X;$_P9K_M)}##*/}}' - _P9K_GAP_PRE+='${_P9K_X::=${_P9K_XY%;*}}' - _P9K_GAP_PRE+='${_P9K_Y::=${_P9K_XY#*;}}' + _p9k_gap_pre+='${_p9k_m::=$(((_p9k_x+_p9k_y)/2))}' + _p9k_gap_pre+='${_p9k_xy::=${${(%):-$_p9k_p%$_p9k_m(l./$_p9k_m;$_p9k_y./$_p9k_x;$_p9k_m)}##*/}}' + _p9k_gap_pre+='${_p9k_x::=${_p9k_xy%;*}}' + _p9k_gap_pre+='${_p9k_y::=${_p9k_xy#*;}}' done - _P9K_GAP_PRE+='${_P9K_M::=$((_P9K_CLM-_P9K_X-_P9K_IND-1))}' - _P9K_GAP_PRE+='}+}' + _p9k_gap_pre+='${_p9k_m::=$((_p9k_clm-_p9k_x-_p9k_ind-1))}' + _p9k_gap_pre+='}+}' - typeset -g _P9K_PROMPT_PREFIX_LEFT='${${_P9K_CLM::=$COLUMNS}+}${${COLUMNS::=1024}+}' - typeset -g _P9K_PROMPT_PREFIX_RIGHT='${${_P9K_CLM::=$COLUMNS}+}${${COLUMNS::=1024}+}' - typeset -g _P9K_PROMPT_SUFFIX_LEFT='${${COLUMNS::=$_P9K_CLM}+}' - typeset -g _P9K_PROMPT_SUFFIX_RIGHT='${${COLUMNS::=$_P9K_CLM}+}' + _p9k_prompt_prefix_left='${${_p9k_clm::=$COLUMNS}+}${${COLUMNS::=1024}+}' + _p9k_prompt_prefix_right='${${_p9k_clm::=$COLUMNS}+}${${COLUMNS::=1024}+}' + _p9k_prompt_suffix_left='${${COLUMNS::=$_p9k_clm}+}' + _p9k_prompt_suffix_right='${${COLUMNS::=$_p9k_clm}+}' - _P9K_PROMPT_PREFIX_LEFT+='%b%k%f' + _p9k_prompt_prefix_left+='%b%k%f' # Bug fixed in: https://github.com/zsh-users/zsh/commit/3eea35d0853bddae13fa6f122669935a01618bf9. # If affects most terminals when RPROMPT is non-empty and ZLE_RPROMPT_INDENT is zero. # We can work around it as long as RPROMPT ends with a space. - if [[ -n $_P9K_LINE_SEGMENTS_RIGHT[-1] && $_P9K_LINE_NEVER_EMPTY_RIGHT[-1] == 0 && - $ZLE_RPROMPT_INDENT == 0 && $POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS == ' ' && + if [[ -n $_p9k_line_segments_right[-1] && $_p9k_line_never_empty_right[-1] == 0 && + $ZLE_RPROMPT_INDENT == 0 && ${POWERLEVEL9K_WHITESPACE_BETWEEN_RIGHT_SEGMENTS:- } == ' ' && -z $(typeset -m 'POWERLEVEL9K_*(RIGHT_RIGHT_WHITESPACE|RIGHT_PROMPT_LAST_SEGMENT_END_SYMBOL)') ]] && ! is-at-least 5.7.2; then - typeset -gi _P9K_EMULATE_ZERO_RPROMPT_INDENT=1 - _P9K_PROMPT_PREFIX_LEFT+='${${:-${_P9K_REAL_ZLE_RPROMPT_INDENT:=$ZLE_RPROMPT_INDENT}${ZLE_RPROMPT_INDENT::=1}${_P9K_IND::=0}}+}' - _P9K_LINE_SUFFIX_RIGHT[-1]='${_P9K_SSS:+${_P9K_SSS% }%E}' + _p9k_emulate_zero_rprompt_indent=1 + _p9k_prompt_prefix_left+='${${:-${_p9k_real_zle_rprompt_indent:=$ZLE_RPROMPT_INDENT}${ZLE_RPROMPT_INDENT::=1}${_p9k_ind::=0}}+}' + _p9k_line_suffix_right[-1]='${_p9k_sss:+${_p9k_sss% }%E}' else - typeset -gi _P9K_EMULATE_ZERO_RPROMPT_INDENT=0 - _P9K_PROMPT_PREFIX_LEFT+='${${_P9K_IND::=${${ZLE_RPROMPT_INDENT:-1}/#-*/0}}+}' + _p9k_emulate_zero_rprompt_indent=0 + _p9k_prompt_prefix_left+='${${_p9k_ind::=${${ZLE_RPROMPT_INDENT:-1}/#-*/0}}+}' fi - if [[ $POWERLEVEL9K_PROMPT_ADD_NEWLINE == true ]]; then - repeat ${POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT:-1} _P9K_PROMPT_PREFIX_LEFT+=$'\n' + if (( _POWERLEVEL9K_PROMPT_ADD_NEWLINE )); then + repeat $_POWERLEVEL9K_PROMPT_ADD_NEWLINE_COUNT _p9k_prompt_prefix_left+=$'\n' fi - _P9K_T=($'\n' '') - _p9k_prompt_overflow_bug && _P9K_T[2]='%{%G%}' + _p9k_t=($'\n' '') + _p9k_prompt_overflow_bug && _p9k_t[2]='%{%G%}' - if [[ $POWERLEVEL9K_SHOW_RULER == true ]]; then + if (( _POWERLEVEL9K_SHOW_RULER )); then _p9k_get_icon '' RULER_CHAR - local ruler_char=$_P9K_RETVAL + local ruler_char=$_p9k_ret _p9k_prompt_length $ruler_char - if (( _P9K_RETVAL == 1 && $#ruler_char == 1 )); then + if (( _p9k_ret == 1 && $#ruler_char == 1 )); then _p9k_color prompt_ruler BACKGROUND "" - _p9k_background $_P9K_RETVAL - _P9K_PROMPT_PREFIX_LEFT+=%b$_P9K_RETVAL + _p9k_background $_p9k_ret + _p9k_prompt_prefix_left+=%b$_p9k_ret _p9k_color prompt_ruler FOREGROUND "" - _p9k_foreground $_P9K_RETVAL - _P9K_PROMPT_PREFIX_LEFT+=$_P9K_RETVAL + _p9k_foreground $_p9k_ret + _p9k_prompt_prefix_left+=$_p9k_ret [[ $ruler_char == '.' ]] && local sep=',' || local sep='.' - local ruler_len='${$((_P9K_CLM-_P9K_IND))/#-*/0}' - _P9K_PROMPT_PREFIX_LEFT+="\${(pl$sep$ruler_len$sep$sep${(q)ruler_char}$sep)}%k%f" - _P9K_PROMPT_PREFIX_LEFT+='$_P9K_T[$((1+!_P9K_IND))]' + local ruler_len='${$((_p9k_clm-_p9k_ind))/#-*/0}' + _p9k_prompt_prefix_left+="\${(pl$sep$ruler_len$sep$sep${(q)ruler_char}$sep)}%k%f" + _p9k_prompt_prefix_left+='$_p9k_t[$((1+!_p9k_ind))]' else 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" @@ -3334,16 +3725,11 @@ _p9k_init_prompt() { fi if [[ $ITERM_SHELL_INTEGRATION_INSTALLED == Yes ]]; then - _P9K_PROMPT_PREFIX_LEFT+="%{$(iterm2_prompt_mark)%}" + _p9k_prompt_prefix_left+="%{$(iterm2_prompt_mark)%}" fi - if [[ -o TRANSIENT_RPROMPT && -n "$_P9K_LINE_SEGMENTS_RIGHT[2,-1]" ]] || - ( segment_in_use time && [[ $POWERLEVEL9K_TIME_UPDATE_ON_COMMAND == true ]] ); then - function _p9k_zle_line_finish() { - [[ ! -o TRANSIENT_RPROMPT ]] || _P9K_RPROMPT_OVERRIDE= - _P9K_LINE_FINISH= - zle && zle .reset-prompt && zle -R - } + if [[ -o TRANSIENT_RPROMPT && -n "$_p9k_line_segments_right[2,-1]" ]] || + ( segment_in_use time && (( _POWERLEVEL9K_TIME_UPDATE_ON_COMMAND )) ); then _p9k_wrap_zle_widget zle-line-finish _p9k_zle_line_finish fi } @@ -3375,117 +3761,116 @@ _p9k_init_ssh() { [[ $w =~ "\(?($ipv4|$ipv6|$hostname)\)?\$" ]] && _P9K_SSH=1 } +_p9k_must_init() { + emulate -L zsh && setopt no_hist_expand extended_glob + local -a param_keys=(${(o)parameters[(I)(POWERLEVEL9K_*|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=x\"$param_sig\"" + [[ -o transient_rprompt ]] && param_sig+=t + [[ $param_sig == $_p9k_param_sig ]] && return 1 + [[ -n $_p9k_param_sig ]] && _p9k_deinit + _p9k_param_sig=$param_sig +} + +function _p9k_set_os() { + _p9k_os=$1 + _p9k_get_icon prompt_os_icon $2 + _p9k_os_icon=$_p9k_ret +} + _p9k_init() { - (( _P9K_INITIALIZED )) && return + emulate -L zsh && setopt no_hist_expand extended_glob _p9k_init_icons - _p9k_init_strings + _p9k_init_vars + _p9k_init_params _p9k_init_prompt _p9k_init_ssh - function _$0_set_os() { - OS=$1 - _p9k_get_icon prompt_os_icon $2 - OS_ICON=$_P9K_RETVAL - } - - trap "unfunction _$0_set_os" EXIT - local uname=$(uname) if [[ $uname == Linux && $(uname -o 2>/dev/null) == Android ]]; then - _$0_set_os Android ANDROID_ICON + _p9k_set_os Android ANDROID_ICON else case $uname in - SunOS) _$0_set_os Solaris SUNOS_ICON;; - Darwin) _$0_set_os OSX APPLE_ICON;; - CYGWIN_NT-* | MSYS_NT-*) _$0_set_os Windows WINDOWS_ICON;; - FreeBSD|OpenBSD|DragonFly) _$0_set_os BSD FREEBSD_ICON;; + SunOS) _p9k_set_os Solaris SUNOS_ICON;; + Darwin) _p9k_set_os OSX APPLE_ICON;; + CYGWIN_NT-* | MSYS_NT-*) _p9k_set_os Windows WINDOWS_ICON;; + FreeBSD|OpenBSD|DragonFly) _p9k_set_os BSD FREEBSD_ICON;; Linux) - OS='Linux' + _p9k_os='Linux' local os_release_id [[ -f /etc/os-release && "${(f)$((</etc/os-release) 2>/dev/null)}" =~ "ID=([A-Za-z]+)" ]] && os_release_id="${match[1]}" case "$os_release_id" in - *arch*) _$0_set_os Linux LINUX_ARCH_ICON;; - *debian*) _$0_set_os Linux LINUX_DEBIAN_ICON;; - *raspbian*) _$0_set_os Linux LINUX_RASPBIAN_ICON;; - *ubuntu*) _$0_set_os Linux LINUX_UBUNTU_ICON;; - *elementary*) _$0_set_os Linux LINUX_ELEMENTARY_ICON;; - *fedora*) _$0_set_os Linux LINUX_FEDORA_ICON;; - *coreos*) _$0_set_os Linux LINUX_COREOS_ICON;; - *gentoo*) _$0_set_os Linux LINUX_GENTOO_ICON;; - *mageia*) _$0_set_os Linux LINUX_MAGEIA_ICON;; - *centos*) _$0_set_os Linux LINUX_CENTOS_ICON;; - *opensuse*|*tumbleweed*) _$0_set_os Linux LINUX_OPENSUSE_ICON;; - *sabayon*) _$0_set_os Linux LINUX_SABAYON_ICON;; - *slackware*) _$0_set_os Linux LINUX_SLACKWARE_ICON;; - *linuxmint*) _$0_set_os Linux LINUX_MINT_ICON;; - *alpine*) _$0_set_os Linux LINUX_ALPINE_ICON;; - *aosc*) _$0_set_os Linux LINUX_AOSC_ICON;; - *nixos*) _$0_set_os Linux LINUX_NIXOS_ICON;; - *devuan*) _$0_set_os Linux LINUX_DEVUAN_ICON;; - *manjaro*) _$0_set_os Linux LINUX_MANJARO_ICON;; - *) _$0_set_os Linux LINUX_ICON;; + *arch*) _p9k_set_os Linux LINUX_ARCH_ICON;; + *debian*) _p9k_set_os Linux LINUX_DEBIAN_ICON;; + *raspbian*) _p9k_set_os Linux LINUX_RASPBIAN_ICON;; + *ubuntu*) _p9k_set_os Linux LINUX_UBUNTU_ICON;; + *elementary*) _p9k_set_os Linux LINUX_ELEMENTARY_ICON;; + *fedora*) _p9k_set_os Linux LINUX_FEDORA_ICON;; + *coreos*) _p9k_set_os Linux LINUX_COREOS_ICON;; + *gentoo*) _p9k_set_os Linux LINUX_GENTOO_ICON;; + *mageia*) _p9k_set_os Linux LINUX_MAGEIA_ICON;; + *centos*) _p9k_set_os Linux LINUX_CENTOS_ICON;; + *opensuse*|*tumbleweed*) _p9k_set_os Linux LINUX_OPENSUSE_ICON;; + *sabayon*) _p9k_set_os Linux LINUX_SABAYON_ICON;; + *slackware*) _p9k_set_os Linux LINUX_SLACKWARE_ICON;; + *linuxmint*) _p9k_set_os Linux LINUX_MINT_ICON;; + *alpine*) _p9k_set_os Linux LINUX_ALPINE_ICON;; + *aosc*) _p9k_set_os Linux LINUX_AOSC_ICON;; + *nixos*) _p9k_set_os Linux LINUX_NIXOS_ICON;; + *devuan*) _p9k_set_os Linux LINUX_DEVUAN_ICON;; + *manjaro*) _p9k_set_os Linux LINUX_MANJARO_ICON;; + *) _p9k_set_os Linux LINUX_ICON;; esac ;; esac fi - if [[ $POWERLEVEL9K_COLOR_SCHEME == light ]]; then - typeset -g DEFAULT_COLOR=7 - typeset -g DEFAULT_COLOR_INVERTED=0 + if [[ $_POWERLEVEL9K_COLOR_SCHEME == light ]]; then + _p9k_color1=7 + _p9k_color2=0 else - typeset -g DEFAULT_COLOR=0 - typeset -g DEFAULT_COLOR_INVERTED=7 + _p9k_color1=0 + _p9k_color2=7 fi - typeset -gA _P9K_BATTERY_STATES=( + # Someone might be using these. + typeset -g OS=$_p9k_os + typeset -g DEFAULT_COLOR=$_p9k_color1 + typeset -g DEFAULT_COLOR_INVERTED=$_p9k_color2 + + _p9k_battery_states=( 'LOW' 'red' 'CHARGING' 'yellow' 'CHARGED' 'green' - 'DISCONNECTED' "$DEFAULT_COLOR_INVERTED" + 'DISCONNECTED' "$_p9k_color2" ) local -i i=0 - local -a left_segments=(${(@0)_P9K_LINE_SEGMENTS_LEFT[@]}) + local -a left_segments=(${(@0)_p9k_line_segments_left[@]}) + _p9k_left_join=(1) for ((i = 2; i <= $#left_segments; ++i)); do local elem=$left_segments[i] if [[ $elem == *_joined ]]; then - _P9K_LEFT_JOIN+=$_P9K_LEFT_JOIN[((i-1))] + _p9k_left_join+=$_p9k_left_join[((i-1))] else - _P9K_LEFT_JOIN+=$i + _p9k_left_join+=$i fi done - local -a right_segments=(${(@0)_P9K_LINE_SEGMENTS_RIGHT[@]}) + local -a right_segments=(${(@0)_p9k_line_segments_right[@]}) + _p9k_right_join=(1) for ((i = 2; i <= $#right_segments; ++i)); do local elem=$right_segments[i] if [[ $elem == *_joined ]]; then - _P9K_RIGHT_JOIN+=$_P9K_RIGHT_JOIN[((i-1))] + _p9k_right_join+=$_p9k_right_join[((i-1))] else - _P9K_RIGHT_JOIN+=$i + _p9k_right_join+=$i fi done - # 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!" - print -P "\t%F{red}WARNING!%f Please set your 'LANG' to a UTF-8 language, like 'en_US.UTF-8'" - print -P "\t%F{red}WARNING!%f _before_ loading this theme in your \~\.zshrc. Putting" - print -P "\t%F{red}WARNING!%f %F{blue}export LANG=\"en_US.UTF-8\"%f at the top of your \~\/.zshrc is sufficient." - print -P 'Set POWERLEVEL9K_IGNORE_TERM_LANG=true to suppress this warning.' - fi - - # Display a warning if the terminal does not support 256 colors. - if [[ $POWERLEVEL9K_IGNORE_TERM_COLORS == false ]]; then - if zmodload zsh/terminfo 2>/dev/null && (( $+terminfo[colors] && $terminfo[colors] < 256 )); then - print -P '%F{red}WARNING!%f Your terminal appears to support fewer than 256 colors!' - print -P 'If your terminal supports 256 colors, please export the appropriate environment variable.' - print -P 'In most terminal emulators, adding %F{blue}export TERM=xterm-256color%f to your %F{yellow}~/.zshrc%f is sufficient.' - print -P 'Set %F{blue}POWERLEVEL9K_IGNORE_TERM_COLORS=true%f to suppress this warning.' - fi - fi - if [[ -n $POWERLEVEL9K_RIGHT_SEGMENT_END_SEPARATOR ]]; then print -P "%F{yellow}WARNING!%f %F{red}POWERLEVEL9K_RIGHT_SEGMENT_END_SEPARATOR%f is no longer supported!" print -P "" @@ -3515,84 +3900,109 @@ _p9k_init() { if segment_in_use vcs; then powerlevel9k_vcs_init - if [[ $POWERLEVEL9K_DISABLE_GITSTATUS != true && -n $POWERLEVEL9K_VCS_BACKENDS[(r)git] ]]; then - source ${POWERLEVEL9K_GITSTATUS_DIR:-${_p9k_installation_dir}/gitstatus}/gitstatus.plugin.zsh + if [[ $_POWERLEVEL9K_DISABLE_GITSTATUS == 0 && -n $_POWERLEVEL9K_VCS_BACKENDS[(r)git] ]]; then + source ${_POWERLEVEL9K_GITSTATUS_DIR:-${__p9k_installation_dir}/gitstatus}/gitstatus.plugin.zsh gitstatus_start \ - -s ${POWERLEVEL9K_VCS_MAX_NUM_STAGED:-$POWERLEVEL9K_VCS_STAGED_MAX_NUM} \ - -u ${POWERLEVEL9K_VCS_MAX_NUM_UNSTAGED:-$POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM} \ - -d ${POWERLEVEL9K_VCS_MAX_NUM_UNTRACKED:-$POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM} \ - -m $POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY \ + -s $_POWERLEVEL9K_VCS_STAGED_MAX_NUM \ + -u $_POWERLEVEL9K_VCS_UNSTAGED_MAX_NUM \ + -d $_POWERLEVEL9K_VCS_UNTRACKED_MAX_NUM \ + -m $_POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY \ POWERLEVEL9K fi fi + if segment_in_use todo; then + local todo=$commands[todo.sh] + if [[ -n $todo ]]; then + local bash=${commands[bash]:-:} + _p9k_todo_file=$($bash 2>/dev/null -c " + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/.todo/config + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/todo.cfg + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\$HOME/.todo.cfg + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\${XDG_CONFIG_HOME:-\$HOME/.config}/todo/config + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=${(qqq)todo:h}/todo.cfg + [ -e \"\$TODOTXT_CFG_FILE\" ] || TODOTXT_CFG_FILE=\${TODOTXT_GLOBAL_CFG_FILE:-/etc/todo/config} + [ -r \"\$TODOTXT_CFG_FILE\" ] || exit + source \"\$TODOTXT_CFG_FILE\" &>/dev/null + echo \"\$TODO_FILE\"") + fi + fi + + if 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 segment_in_use dir; then - if (( $+POWERLEVEL9K_DIR_CLASSES )); then - local -a x=() - local a='' b='' c='' - for a b c in "${POWERLEVEL9K_DIR_CLASSES[@]}"; do - x+=("$a" "$b" "${(g::)c}") + if (( $+_POWERLEVEL9K_DIR_CLASSES )); then + local -i i=0 + for ((; i <= $#_POWERLEVEL9K_DIR_CLASSES; ++i)); do + _POWERLEVEL9K_DIR_CLASSES[i]=${(g::)_POWERLEVEL9K_DIR_CLASSES[i]} done - POWERLEVEL9K_DIR_CLASSES=("${x[@]}") else - typeset -ga POWERLEVEL9K_DIR_CLASSES=() + typeset -ga _POWERLEVEL9K_DIR_CLASSES=() _p9k_get_icon prompt_dir_ETC ETC_ICON - POWERLEVEL9K_DIR_CLASSES+=('/etc|/etc/*' ETC "$_P9K_RETVAL") + _POWERLEVEL9K_DIR_CLASSES+=('/etc|/etc/*' ETC "$_p9k_ret") _p9k_get_icon prompt_dir_HOME HOME_ICON - POWERLEVEL9K_DIR_CLASSES+=('~' HOME "$_P9K_RETVAL") + _POWERLEVEL9K_DIR_CLASSES+=('~' HOME "$_p9k_ret") _p9k_get_icon prompt_dir_HOME_SUBFOLDER HOME_SUB_ICON - POWERLEVEL9K_DIR_CLASSES+=('~/*' HOME_SUBFOLDER "$_P9K_RETVAL") + _POWERLEVEL9K_DIR_CLASSES+=('~/*' HOME_SUBFOLDER "$_p9k_ret") _p9k_get_icon prompt_dir_DEFAULT FOLDER_ICON - POWERLEVEL9K_DIR_CLASSES+=('*' DEFAULT "$_P9K_RETVAL") + _POWERLEVEL9K_DIR_CLASSES+=('*' DEFAULT "$_p9k_ret") fi fi _p9k_init_async_pump - if segment_in_use vi_mode && (( $+POWERLEVEL9K_VI_VISUAL_MODE_STRING )) || segment_in_use prompt_char; then - function _p9k_zle_line_pre_redraw() { - [[ ${KEYMAP:-} == vicmd ]] || return 0 - local region=${${REGION_ACTIVE:-0}/2/1} - [[ $region != $_P9K_REGION_ACTIVE ]] || return 0 - _P9K_REGION_ACTIVE=$region - zle && zle .reset-prompt && zle -R - } + if segment_in_use vi_mode && (( $+_POWERLEVEL9K_VI_VISUAL_MODE_STRING )) || segment_in_use prompt_char; then _p9k_wrap_zle_widget zle-line-pre-redraw _p9k_zle_line_pre_redraw - _p9k_g_expand POWERLEVEL9K_VI_VISUAL_MODE_STRING fi if segment_in_use dir && - [[ $POWERLEVEL9K_SHORTEN_STRATEGY == truncate_with_package_name && $+commands[jq] == 0 ]]; then + [[ $_POWERLEVEL9K_SHORTEN_STRATEGY == truncate_with_package_name && $+commands[jq] == 0 ]]; then >&2 print -P '%F{yellow}WARNING!%f %BPOWERLEVEL9K_SHORTEN_STRATEGY=truncate_with_package_name%b requires %F{green}jq%f.' >&2 print -P 'Either install %F{green}jq%f or change the value of %BPOWERLEVEL9K_SHORTEN_STRATEGY%b.' fi _p9k_wrap_zle_widget zle-keymap-select _p9k_zle_keymap_select +} - _P9K_INITIALIZED=1 +_p9k_deinit() { + (( $+functions[gitstatus_stop] )) && gitstatus_stop POWERLEVEL9K + _p9k_deinit_async_pump + unset -m '(_POWERLEVEL9K_|P9K_|_p9k_)*' } -typeset -gi _P9K_ENABLED=0 +typeset -gi __p9k_enabled=0 prompt_powerlevel9k_setup() { + emulate -L zsh && setopt no_hist_expand extended_glob prompt_powerlevel9k_teardown - - add-zsh-hook precmd powerlevel9k_prepare_prompts + __p9k_enabled=1 + typeset -gF __p9k_timer_start=0 + typeset -gF __p9k_timer_end=0 + typeset -gi __p9k_exit_code=0 + typeset -ga __p9k_pipe_exit_codes=() add-zsh-hook preexec powerlevel9k_preexec - - unset _P9K_TIMER_START - _P9K_ENABLED=1 + add-zsh-hook precmd powerlevel9k_prepare_prompts } prompt_powerlevel9k_teardown() { + emulate -L zsh && setopt no_hist_expand extended_glob add-zsh-hook -D precmd powerlevel9k_\* add-zsh-hook -D preexec powerlevel9k_\* PROMPT='%m%# ' RPROMPT= - _P9K_ENABLED=0 + if (( __p9k_enabled )); then + _p9k_deinit + __p9k_enabled=0 + fi } -autoload -U colors && colors +autoload -Uz colors && colors autoload -Uz add-zsh-hook zmodload zsh/datetime diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme index fd58c0cf..cf038446 100755 --- a/powerlevel9k.zsh-theme +++ b/powerlevel9k.zsh-theme @@ -20,32 +20,33 @@ fi () { emulate -L zsh - if (( $+_p9k_sourced )); then + if (( $+__p9k_sourced )); then prompt_powerlevel9k_setup return fi - typeset -gr _p9k_sourced=1 - typeset -g _p9k_installation_dir='' + typeset -gr __p9k_sourced=1 + typeset -g __p9k_installation_dir='' if [[ -n $POWERLEVEL9K_INSTALLATION_DIR ]]; then - _p9k_installation_dir=${POWERLEVEL9K_INSTALLATION_DIR:A} + __p9k_installation_dir=${POWERLEVEL9K_INSTALLATION_DIR:A} else if [[ ${(%):-%N} == '(eval)' ]]; then if [[ $0 == '-antigen-load' && -r powerlevel9k.zsh-theme ]]; then # Antigen uses eval to load things so it can change the plugin (!!) # https://github.com/zsh-users/antigen/issues/581 - _p9k_installation_dir=$PWD + __p9k_installation_dir=$PWD else >&2 print -P '%F{red}[ERROR]%f Powerlevel10k cannot figure out its installation directory.' >&2 print -P 'Please set %F{green}POWERLEVEL9K_INSTALLATION_DIR.%f' - return 1 + return fi else - _p9k_installation_dir=${${(%):-%x}:A:h} + __p9k_installation_dir=${${(%):-%x}:A:h} fi fi - source $_p9k_installation_dir/internal/p10k.zsh + typeset -gr __p9k_installation_dir + source $__p9k_installation_dir/internal/p10k.zsh || true } (( ! _p9k_restore_aliases )) || setopt aliases |