summaryrefslogtreecommitdiff
path: root/functions/utilities.zsh
diff options
context:
space:
mode:
Diffstat (limited to 'functions/utilities.zsh')
-rwxr-xr-xfunctions/utilities.zsh76
1 files changed, 76 insertions, 0 deletions
diff --git a/functions/utilities.zsh b/functions/utilities.zsh
index 1f4df9bc..a9559922 100755
--- a/functions/utilities.zsh
+++ b/functions/utilities.zsh
@@ -258,6 +258,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() {