diff --git a/functions/colors.zsh b/functions/colors.zsh deleted file mode 100755 index e5477aef..00000000 --- a/functions/colors.zsh +++ /dev/null @@ -1,291 +0,0 @@ -# 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 - 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 compatibility with Powerlevel9k. -# -# Type `getColorCode background` or `getColorCode foreground` to see the list of predefined colors. -function getColorCode() { - emulate -L zsh - 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 dea4d3bd..00000000 --- a/functions/utilities.zsh +++ /dev/null @@ -1,137 +0,0 @@ -# _p9k_declare [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 - 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 -} diff --git a/functions/vcs.zsh b/functions/vcs.zsh deleted file mode 100755 index 7c431067..00000000 --- a/functions/vcs.zsh +++ /dev/null @@ -1,163 +0,0 @@ -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 == 1 ]]; 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 (( $+_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=$(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_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=$(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/internal/p10k.zsh b/internal/p10k.zsh index d72ee2bd..bd4c90d8 100755 --- a/internal/p10k.zsh +++ b/internal/p10k.zsh @@ -27,9 +27,229 @@ if ! autoload -Uz is-at-least || ! is-at-least 5.1; then return 1 fi -source "${__p9k_installation_dir}/functions/utilities.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 + 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 [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 + 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 +} + source "${__p9k_installation_dir}/functions/icons.zsh" -source "${__p9k_installation_dir}/functions/colors.zsh" source "${__p9k_installation_dir}/functions/vcs.zsh" # Caching allows storing array-to-array associations. It should be used like this: @@ -1970,6 +2190,171 @@ typeset -gA __p9k_vcs_states=( 'LOADING' '8' ) +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 == 1 ]]; 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 (( $+_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=$(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_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=$(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 +} + + powerlevel9k_vcs_init() { autoload -Uz vcs_info