diff options
Diffstat (limited to 'functions/utilities.zsh')
-rwxr-xr-x | functions/utilities.zsh | 255 |
1 files changed, 22 insertions, 233 deletions
diff --git a/functions/utilities.zsh b/functions/utilities.zsh index 8c18bb44..3a77eaca 100755 --- a/functions/utilities.zsh +++ b/functions/utilities.zsh @@ -6,22 +6,28 @@ # https://github.com/bhilburn/powerlevel9k ################################################################ -# Exits with 0 if a variable has been previously defined (even if empty) -# Takes the name of a variable that should be checked. -function defined() { - [[ ! -z "${(tP)1}" ]] -} - -# Given the name of a variable and a default value, sets the variable -# value to the default only if it has not been defined. +# Usage: set_default [OPTION]... NAME [VALUE]... # -# Typeset cannot set the value for an array, so this will only work -# for scalar values. +# Options are the same as in `typeset`. function set_default() { - local varname="$1" - local default_value="$2" + local -a flags=(-g) + while true; do + case $1 in + --) shift; break;; + -*) flags+=$1; shift;; + *) break; + esac + done - defined "$varname" || typeset -g "$varname"="$default_value" + local varname=$1 + shift + if [[ -v $varname ]]; then + typeset $flags $varname + elif [[ "$flags" == *[aA]* ]]; then + eval "typeset ${(@q)flags} ${(q)varname}=(${(qq)@})" + else + typeset $flags $varname="$*" + fi } # Converts large memory values into a human-readable unit (e.g., bytes --> GB) @@ -54,224 +60,15 @@ printSizeHumanReadable() { echo "$size${extension[$index]}" } -# Gets the first value out of a list of items that is not empty. -# The items are examined by a callback-function. -# Takes two arguments: -# * $list - A list of items -# * $callback - A callback function to examine if the item is -# worthy. The callback function has access to -# the inner variable $item. -function getRelevantItem() { - local -a list - local callback - # Explicitly split the elements by whitespace. - list=(${=1}) - callback=$2 - - for item in $list; do - # The first non-empty item wins - try=$(eval "$callback") - if [[ -n "$try" ]]; then - echo "$try" - break; - fi - done -} - -# OS detection -case $(uname) in - Darwin) - OS='OSX' - OS_ICON=$(print_icon 'APPLE_ICON') - ;; - CYGWIN_NT-* | MSYS_NT-*) - OS='Windows' - OS_ICON=$(print_icon 'WINDOWS_ICON') - ;; - FreeBSD) - OS='BSD' - OS_ICON=$(print_icon 'FREEBSD_ICON') - ;; - OpenBSD) - OS='BSD' - OS_ICON=$(print_icon 'FREEBSD_ICON') - ;; - DragonFly) - OS='BSD' - OS_ICON=$(print_icon 'FREEBSD_ICON') - ;; - Linux) - OS='Linux' - if [ -f /etc/os-release ]; then - [[ ${(f)"$((</etc/os-release) 2>/dev/null)"} =~ "ID=([A-Za-z]+)" ]] && os_release_id="${match[1]}" - fi - case "$os_release_id" in - *arch*) - OS_ICON=$(print_icon 'LINUX_ARCH_ICON') - ;; - *debian*) - OS_ICON=$(print_icon 'LINUX_DEBIAN_ICON') - ;; - *ubuntu*) - OS_ICON=$(print_icon 'LINUX_UBUNTU_ICON') - ;; - *elementary*) - OS_ICON=$(print_icon 'LINUX_ELEMENTARY_ICON') - ;; - *fedora*) - OS_ICON=$(print_icon 'LINUX_FEDORA_ICON') - ;; - *coreos*) - OS_ICON=$(print_icon 'LINUX_COREOS_ICON') - ;; - *gentoo*) - OS_ICON=$(print_icon 'LINUX_GENTOO_ICON') - ;; - *mageia*) - OS_ICON=$(print_icon 'LINUX_MAGEIA_ICON') - ;; - *centos*) - OS_ICON=$(print_icon 'LINUX_CENTOS_ICON') - ;; - *opensuse*|*tumbleweed*) - OS_ICON=$(print_icon 'LINUX_OPENSUSE_ICON') - ;; - *sabayon*) - OS_ICON=$(print_icon 'LINUX_SABAYON_ICON') - ;; - *slackware*) - OS_ICON=$(print_icon 'LINUX_SLACKWARE_ICON') - ;; - *linuxmint*) - OS_ICON=$(print_icon 'LINUX_MINT_ICON') - ;; - *alpine*) - OS_ICON=$(print_icon 'LINUX_ALPINE_ICON') - ;; - *aosc*) - OS_ICON=$(print_icon 'LINUX_AOSC_ICON') - ;; - *nixos*) - OS_ICON=$(print_icon 'LINUX_NIXOS_ICON') - ;; - *devuan*) - OS_ICON=$(print_icon 'LINUX_DEVUAN_ICON') - ;; - *manjaro*) - OS_ICON=$(print_icon 'LINUX_MANJARO_ICON') - ;; - *) - OS='Linux' - OS_ICON=$(print_icon 'LINUX_ICON') - ;; - esac - - # Check if we're running on Android - case $(uname -o 2>/dev/null) in - Android) - OS='Android' - OS_ICON=$(print_icon 'ANDROID_ICON') - ;; - esac - ;; - SunOS) - OS='Solaris' - OS_ICON=$(print_icon 'SUNOS_ICON') - ;; - *) - OS='' - OS_ICON='' - ;; -esac - -# Determine the correct sed parameter. -# -# `sed` is unfortunately not consistent across OSes when it comes to flags. -SED_EXTENDED_REGEX_PARAMETER="-r" -if [[ "$OS" == 'OSX' ]]; then - local IS_BSD_SED="$(sed --version &>> /dev/null || echo "BSD sed")" - if [[ -n "$IS_BSD_SED" ]]; then - SED_EXTENDED_REGEX_PARAMETER="-E" - fi -fi - # Determine if the passed segment is used in the prompt # # Pass the name of the segment to this function to test for its presence in # either the LEFT or RIGHT prompt arrays. # * $1: The segment to be tested. segment_in_use() { - local key=$1 - if [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)$key]}" ]] || [[ -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)$key]}" ]]; then - return 0 - else - return 1 - fi -} - -# Print a deprecation warning if an old segment is in use. -# Takes the name of an associative array that contains the -# deprecated segments as keys, the values contain the new -# segment names. -print_deprecation_warning() { - typeset -AH raw_deprecated_segments - raw_deprecated_segments=(${(kvP@)1}) - - for key in ${(@k)raw_deprecated_segments}; do - if segment_in_use $key; then - # segment is deprecated - print -P "%F{yellow}Warning!%f The '$key' segment is deprecated. Use '%F{blue}${raw_deprecated_segments[$key]}%f' instead. For more informations, have a look at the CHANGELOG.md." - fi - done -} - -# A helper function to determine if a segment should be -# joined or promoted to a full one. -# Takes three arguments: -# * $1: The array index of the current segment -# * $2: The array index of the last printed segment -# * $3: The array of segments of the left or right prompt -function segmentShouldBeJoined() { - local current_index=$1 - local last_segment_index=$2 - # Explicitly split the elements by whitespace. - local -a elements - elements=(${=3}) - - local current_segment=${elements[$current_index]} - local joined=false - if [[ ${current_segment[-7,-1]} == '_joined' ]]; then - joined=true - # promote segment to a full one, if the predecessing full segment - # was conditional. So this can only be the case for segments that - # are not our direct predecessor. - if (( $(($current_index - $last_segment_index)) > 1)); then - # Now we have to examine every previous segment, until we reach - # the last printed one (found by its index). This is relevant if - # all previous segments are joined. Then we want to join our - # segment as well. - local examined_index=$((current_index - 1)) - while (( $examined_index > $last_segment_index )); do - local previous_segment=${elements[$examined_index]} - # If one of the examined segments is not joined, then we know - # that the current segment should not be joined, as the target - # segment is the wrong one. - if [[ ${previous_segment[-7,-1]} != '_joined' ]]; then - joined=false - break - fi - examined_index=$((examined_index - 1)) - done - fi - fi - - # Return 1 means error; return 0 means no error. So we have - # to invert $joined - if [[ "$joined" == "true" ]]; then - return 0 - else - return 1 - fi + local key=$1 + [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)$key]}" || + -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)$key]}" ]] } ################################################################ @@ -350,14 +147,6 @@ function truncatePath() { fi } -# Given a directory path, truncate it according to the settings for -# `truncate_from_right` -function truncatePathFromRight() { - local delim_len=${#POWERLEVEL9K_SHORTEN_DELIMITER:-1} - echo $1 | sed $SED_EXTENDED_REGEX_PARAMETER \ - "s@(([^/]{$((POWERLEVEL9K_SHORTEN_DIR_LENGTH))})([^/]{$delim_len}))[^/]+/@\2$POWERLEVEL9K_SHORTEN_DELIMITER/@g" -} - # Search recursively in parent folders for given file. function upsearch () { if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then |