support dynamic directories in dir prompt and fix a dozen bugs

This commit is contained in:
romkatv 2019-05-18 23:50:06 +02:00
commit 7cfe479c87
2 changed files with 183 additions and 362 deletions

View file

@ -86,98 +86,6 @@ segment_in_use() {
-n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)${key}_joined]}" ]]
}
################################################################
# 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
}
# Search recursively in parent folders for given file.
function upsearch () {
if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then
echo "$PWD"
elif test -e "$1"; then
pushd .. > /dev/null
upsearch "$1"
popd > /dev/null
echo "$PWD"
else
pushd .. > /dev/null
upsearch "$1"
popd > /dev/null
fi
}
# Parse IP address from ifconfig on OSX and from IP on Linux
# Parameters:
# $1 - string The desired Interface