From 38d7e60ae3f9efd5f4a81d52b5ce6046b0416b8b Mon Sep 17 00:00:00 2001 From: Christo Kotze Date: Sun, 18 Feb 2018 18:36:18 +0400 Subject: [PATCH] Rewrote trunc middle/right to use for loop --- powerlevel9k.zsh-theme | 88 ++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme index 1589cf3d..c0820475 100755 --- a/powerlevel9k.zsh-theme +++ b/powerlevel9k.zsh-theme @@ -723,52 +723,44 @@ set_default POWERLEVEL9K_DIR_PATH_HIGHLIGHT_BOLD false # * $1 Alignment: string - left|right # * $2 Index: integer prompt_dir() { - local current_dir="$(print -P '%~')" - local paths - [[ current_dir != "/" ]] && paths=(${(s:/:)current_dir}) # only split if not root folder - local cur_path cur_short_path directory dir_length cur_dir - + local current_path="$(print -P '%~')" + local paths directory test_dir test_dir_length trunc_path threshhold + (( ${#current_path} > 1 )) && paths=(${(s:/:)current_path}) || paths=() # only split if not root/home folder if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_folder_marker" ]]; then set_default POWERLEVEL9K_SHORTEN_DELIMITER "\u2026" - local delim=$(echo -n $POWERLEVEL9K_SHORTEN_DELIMITER) # convert delimiter from unicode to literal character if required + local delim=$(echo -n $POWERLEVEL9K_SHORTEN_DELIMITER) # convert delimiter from unicode to literal character case "$POWERLEVEL9K_SHORTEN_STRATEGY" in truncate_middle) - if [[ $current_dir != "/" ]]; then # root is an exception and won't have paths - [[ $current_dir == '~'* ]] && cur_short_path='' || cur_short_path='/' # if we are in the $HOME folder, we don't need starting / - local last_pos + if (( ${#paths} > 0 )); then # root is an exception and won't have paths local max_length=$(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH * 2 )) # has to be double the length for beginning / end count - for directory in ${paths[@]} # go through all the paths - do - cur_dir=$directory - dir_length=${#cur_dir} - if (( $dir_length > $max_length )) && [[ $cur_dir != $paths[${#paths}] ]]; then # only shorten if long enough and not last path + local last_pos + for (( i=1; i<${#paths}; i++ )); do + test_dir=$paths[$i] + test_dir_length=${#test_dir} + if (( $test_dir_length > $max_length )); then # only shorten if long enough last_pos=$(( $dir_length - $POWERLEVEL9K_SHORTEN_DIR_LENGTH )) - cur_dir=${cur_dir:0:$POWERLEVEL9K_SHORTEN_DIR_LENGTH}$delim${cur_dir:$last_pos:$dir_length} + trunc_path+="${test_dir:0:$POWERLEVEL9K_SHORTEN_DIR_LENGTH}$delim${test_dir:$last_pos:$test_dir_length}/" + else + trunc_path+="${test_dir}/" fi - cur_short_path+="$cur_dir/" done - current_path="${cur_short_path: : -1}" # remove trailing slash - else - current_path="/" + current_path=$trunc_path${current_path:t} fi ;; truncate_from_right) - if [[ $current_dir != "/" ]]; then # root is an exception and won't have paths - [[ $current_dir == '~'* ]] && cur_short_path='' || cur_short_path='/' # if we are in the $HOME folder, we don't need starting / - for directory in ${paths[@]} - do - cur_dir=$directory - dir_length=${#cur_dir} - local threshhold=$(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH + ${#delim} )) - if (( $dir_length > $threshhold )) && [[ $dir_length != $POWERLEVEL9K_SHORTEN_DIR_LENGTH && $cur_dir != $paths[${#paths}] ]]; then # only shorten if long enough and not last path - cur_dir=${cur_dir:0:$POWERLEVEL9K_SHORTEN_DIR_LENGTH}$delim + if (( ${#paths} > 0 )); then # root is an exception and won't have paths + for (( i=1; i<${#paths}; i++ )); do + test_dir="$paths[$i]" + test_dir_length=${#test_dir} + threshhold=$(( $POWERLEVEL9K_SHORTEN_DIR_LENGTH + ${#delim} )) + if (( $test_dir_length > $threshhold )); then # only shorten if long enough + trunc_path+="${test_dir:0:$POWERLEVEL9K_SHORTEN_DIR_LENGTH}$delim/" + else + trunc_path+="${test_dir}/" fi - cur_short_path+="$cur_dir/" done - current_path="${cur_short_path: : -1}" # remove trailing slash - else - current_path="/" + current_path=$trunc_path${current_path:t} fi ;; truncate_with_package_name) @@ -851,22 +843,24 @@ prompt_dir() { truncate_to_unique) # for each parent path component find the shortest unique beginning # characters sequence. Source: https://stackoverflow.com/a/45336078 - cur_path='/' - cur_short_path='/' - for directory in ${paths[@]} - do - cur_dir='' - for (( i=0; i<${#directory}; i++ )); do - cur_dir+="${directory:$i:1}" - matching=("$cur_path"/"$cur_dir"*/) - if [[ ${#matching[@]} -eq 1 ]]; then - break - fi + if (( ${#paths} > 0 )); then # root is an exception and won't have paths + local matching + local cur_path='/' + [[ $current_path != "~"* ]] && trunc_path='/' || trunc_path='' + for directory in ${paths[@]}; do + test_dir='' + for (( i=0; i<${#directory}; i++ )); do + test_dir+="${directory:$i:1}" + matching=("$cur_path"/"$test_dir"*/) + if [[ ${#matching[@]} -eq 1 ]]; then + break + fi + done + trunc_path+="$test_dir/" + cur_path+="$directory/" done - cur_short_path+="$cur_dir/" - cur_path+="$directory/" - done - current_path="${cur_short_path: : -1}" + current_path="${trunc_path: : -1}" + fi ;; *) current_path="$(print -P "%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:$POWERLEVEL9K_SHORTEN_DELIMITER/:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c")"