aboutsummaryrefslogtreecommitdiff
path: root/functions
diff options
context:
space:
mode:
authorBen Hilburn <bhilburn@gmail.com>2018-03-07 04:52:36 +0300
committerBen Hilburn <bhilburn@gmail.com>2018-03-07 04:52:36 +0300
commit281a3aa3a4863a90087985691a588b12f7cd71f0 (patch)
treeabc7cfeeefeccff9227c824397a0fdd85cdd1ddc /functions
parent33e301078458901f09cadf23c48ed7b3db5311ff (diff)
parent9b7f8babe7f7eb4cd4330c1ba4534150baa90b82 (diff)
Merge branch 'dir_strategies' of https://github.com/onaforeignshore/powerlevel9k into onaforeignshore-dir_strategies
Diffstat (limited to 'functions')
-rw-r--r--functions/utilities.zsh76
1 files changed, 76 insertions, 0 deletions
diff --git a/functions/utilities.zsh b/functions/utilities.zsh
index b4bfb838..b4173b99 100644
--- a/functions/utilities.zsh
+++ b/functions/utilities.zsh
@@ -213,6 +213,82 @@ function segmentShouldBeJoined() {
fi
}
+################################################################
+# Given a directory path, truncate it according to the settings.
+# Parameters:
+# * $1 Path: string - the directory path to be truncated
+# * $2 Length: integer - length to truncate to
+# * $3 Delimiter: string - the delimiter to use
+# * $4 From: string - "right" | "middle". If omited, assumes right.
+function truncatePath() {
+ # if the current path is not 1 character long (e.g. "/" or "~")
+ if (( ${#1} > 1 )); then
+ # convert $2 from string to integer
+ 2=$(( $2 ))
+ # set $3 to "" if not defined
+ [[ -z $3 ]] && 3="" || 3=$(echo -n $3)
+ # set $4 to "right" if not defined
+ [[ -z $4 ]] && 4="right"
+ # create a variable for the truncated path.
+ local trunc_path
+ # if the path is in the home folder, add "~/" to the start otherwise "/"
+ [[ $1 == "~"* ]] && trunc_path='~/' || trunc_path='/'
+ # split the path into an array using "/" as the delimiter
+ local paths=$1
+ paths=(${(s:/:)${paths//"~\/"/}})
+ # declare locals for the directory being tested and its length
+ local test_dir test_dir_length
+ # do the needed truncation
+ case $4 in
+ right)
+ # include the delimiter length in the threshhold
+ local threshhold=$(( $2 + ${#3} ))
+ # loop through the paths
+ for (( i=1; i<${#paths}; i++ )); do
+ # get the current directory value
+ test_dir=$paths[$i]
+ test_dir_length=${#test_dir}
+ # only truncate if the resulting truncation will be shorter than
+ # the truncation + delimiter length and at least 3 characters
+ if (( $test_dir_length > $threshhold )) && (( $test_dir_length > 3 )); then
+ # use the first $2 characters and the delimiter
+ trunc_path+="${test_dir:0:$2}$3/"
+ else
+ # use the full path
+ trunc_path+="${test_dir}/"
+ fi
+ done
+ ;;
+ middle)
+ # we need double the length for start and end truncation + delimiter length
+ local threshhold=$(( $2 * 2 ))
+ # create a variable for the start of the end truncation
+ local last_pos
+ # loop through the paths
+ for (( i=1; i<${#paths}; i++ )); do
+ # get the current directory value
+ test_dir=$paths[$i]
+ test_dir_length=${#test_dir}
+ # only truncate if the resulting truncation will be shorter than
+ # the truncation + delimiter length
+ if (( $test_dir_length > $threshhold )); then
+ # use the first $2 characters, the delimiter and the last $2 characters
+ last_pos=$(( $test_dir_length - $2 ))
+ trunc_path+="${test_dir:0:$2}$3${test_dir:$last_pos:$test_dir_length}/"
+ else
+ # use the full path
+ trunc_path+="${test_dir}/"
+ fi
+ done
+ ;;
+ esac
+ # return the truncated path + the current directory
+ echo $trunc_path${1:t}
+ else # current path is 1 character long (e.g. "/" or "~")
+ echo $1
+ fi
+}
+
# Given a directory path, truncate it according to the settings for
# `truncate_from_right`
function truncatePathFromRight() {