### Please skip down to the bottom of this code
# Given a string, a separator, and a max length, shorten any segments that are
# longer than the max length.
shortenLongSegments() {
local -n destVar=$1; shift # arg1: where do we write our result?
local maxLength=$1; shift # arg2: what's the maximum length?
local IFS=$1; shift # arg3: what character do we split into segments on?
read -r -a allSegments <<<"$1"; shift # arg4: break into an array
for segmentIdx in "${!allSegments[@]}"; do # iterate over array indices
segment=${allSegments[$segmentIdx]} # look up value for index
if (( ${#segment} > maxLength )); then # value over maxLength chars?
segment="${segment:0:3}*${segment:${#segment}-3:3}" # build a short version
allSegments[$segmentIdx]=$segment # store shortened version in array
fi
done
printf -v destVar '%s\n' "${allSegments[*]}" # build result string from array
}
# function to call from PROMPT_COMMAND to actually build a new PS1
buildNewPs1() {
# declare our locals to avoid polluting global namespace
local shorterPath
shortenLongSegments shorterPath 10 / "$PWD"
PS1="${shorterPath}\$"
}
sampleOne() {
PS1=`echo ${PWD#"${PWD%/*/*}/"} | awk -v RS='/' 'length()<=10{printf $0"/"}; length()>10{printf "%s*%s/", substr($0,1,3), substr($0,length()-2,3)};'| tr -d "\n"; echo "#"`
}
time for ((i=0; i<100; i++ )); do sampleOne; done
sampleTwo() {
buildNewPs1
}
time for ((i=0; i<100; i++ )); do sampleTwo; done
IyMjIFBsZWFzZSBza2lwIGRvd24gdG8gdGhlIGJvdHRvbSBvZiB0aGlzIGNvZGUKCiMgR2l2ZW4gYSBzdHJpbmcsIGEgc2VwYXJhdG9yLCBhbmQgYSBtYXggbGVuZ3RoLCBzaG9ydGVuIGFueSBzZWdtZW50cyB0aGF0IGFyZQojIGxvbmdlciB0aGFuIHRoZSBtYXggbGVuZ3RoLgpzaG9ydGVuTG9uZ1NlZ21lbnRzKCkgewogIGxvY2FsIC1uIGRlc3RWYXI9JDE7IHNoaWZ0ICAjIGFyZzE6IHdoZXJlIGRvIHdlIHdyaXRlIG91ciByZXN1bHQ/CiAgbG9jYWwgbWF4TGVuZ3RoPSQxOyBzaGlmdCAgICMgYXJnMjogd2hhdCdzIHRoZSBtYXhpbXVtIGxlbmd0aD8KICBsb2NhbCBJRlM9JDE7IHNoaWZ0ICAgICAgICAgIyBhcmczOiB3aGF0IGNoYXJhY3RlciBkbyB3ZSBzcGxpdCBpbnRvIHNlZ21lbnRzIG9uPwogIHJlYWQgLXIgLWEgYWxsU2VnbWVudHMgPDw8IiQxIjsgc2hpZnQgICAgICAgICMgYXJnNDogYnJlYWsgaW50byBhbiBhcnJheQoKICBmb3Igc2VnbWVudElkeCBpbiAiJHshYWxsU2VnbWVudHNbQF19IjsgZG8gICAjIGl0ZXJhdGUgb3ZlciBhcnJheSBpbmRpY2VzCiAgICBzZWdtZW50PSR7YWxsU2VnbWVudHNbJHNlZ21lbnRJZHhdfSAgICAgICAgIyBsb29rIHVwIHZhbHVlIGZvciBpbmRleAogICAgaWYgKCggJHsjc2VnbWVudH0gPiBtYXhMZW5ndGggKSk7IHRoZW4gICAgICMgdmFsdWUgb3ZlciBtYXhMZW5ndGggY2hhcnM/CiAgICAgIHNlZ21lbnQ9IiR7c2VnbWVudDowOjN9KiR7c2VnbWVudDokeyNzZWdtZW50fS0zOjN9IiAjIGJ1aWxkIGEgc2hvcnQgdmVyc2lvbgogICAgICBhbGxTZWdtZW50c1skc2VnbWVudElkeF09JHNlZ21lbnQgICAgICAgICMgc3RvcmUgc2hvcnRlbmVkIHZlcnNpb24gaW4gYXJyYXkKICAgIGZpCiAgZG9uZQogIHByaW50ZiAtdiBkZXN0VmFyICclc1xuJyAiJHthbGxTZWdtZW50c1sqXX0iICMgYnVpbGQgcmVzdWx0IHN0cmluZyBmcm9tIGFycmF5Cn0KCiMgZnVuY3Rpb24gdG8gY2FsbCBmcm9tIFBST01QVF9DT01NQU5EIHRvIGFjdHVhbGx5IGJ1aWxkIGEgbmV3IFBTMQpidWlsZE5ld1BzMSgpIHsKICAjIGRlY2xhcmUgb3VyIGxvY2FscyB0byBhdm9pZCBwb2xsdXRpbmcgZ2xvYmFsIG5hbWVzcGFjZQogIGxvY2FsIHNob3J0ZXJQYXRoCiAgc2hvcnRlbkxvbmdTZWdtZW50cyBzaG9ydGVyUGF0aCAxMCAvICIkUFdEIgogIFBTMT0iJHtzaG9ydGVyUGF0aH1cJCIKfQoKc2FtcGxlT25lKCkgewogIFBTMT1gZWNobyAke1BXRCMiJHtQV0QlLyovKn0vIn0gfCBhd2sgLXYgUlM9Jy8nICdsZW5ndGgoKTw9MTB7cHJpbnRmICQwIi8ifTsgbGVuZ3RoKCk+MTB7cHJpbnRmICIlcyolcy8iLCBzdWJzdHIoJDAsMSwzKSwgc3Vic3RyKCQwLGxlbmd0aCgpLTIsMyl9Oyd8IHRyIC1kICJcbiI7IGVjaG8gIiMiYAp9CnRpbWUgZm9yICgoaT0wOyBpPDEwMDsgaSsrICkpOyBkbyBzYW1wbGVPbmU7IGRvbmUKCnNhbXBsZVR3bygpIHsKCWJ1aWxkTmV3UHMxCn0KdGltZSBmb3IgKChpPTA7IGk8MTAwOyBpKysgKSk7IGRvIHNhbXBsZVR3bzsgZG9uZQ==