don't read configuration options until the first precmd; plus massive refactoring and cleanup

This commit is contained in:
romkatv 2019-03-13 17:04:27 +01:00
parent 696290fb22
commit 5ee0054298
4 changed files with 892 additions and 1191 deletions

View file

@ -6,10 +6,9 @@
# https://github.com/bhilburn/powerlevel9k
################################################################
typeset -gAh __P9K_COLORS
# https://jonasjacek.github.io/colors/
# use color names by default to allow dark/light themes to adjust colors based on names
__P9K_COLORS=(
typeset -gAh __P9K_COLORS=(
black 000
red 001
green 002
@ -270,89 +269,29 @@ __P9K_COLORS=(
grey93 255
)
function termColors() {
if [[ $POWERLEVEL9K_IGNORE_TERM_COLORS == true ]]; then
return
fi
local term_colors
if which tput &>/dev/null; then
term_colors=$(tput colors)
else
term_colors=$(echotc Co)
fi
if (( ! $? && ${term_colors:-0} < 256 )); then
print -P "%F{red}WARNING!%f Your terminal appears to support fewer than 256 colors!"
print -P "If your terminal supports 256 colors, please export the appropriate environment variable"
print -P "_before_ loading this theme in your \~\/.zshrc. In most terminal emulators, putting"
print -P "%F{blue}export TERM=\"xterm-256color\"%f at the top of your \~\/.zshrc is sufficient."
fi
}
# get the proper color code if it does not exist as a name.
function getColor() {
# If Color is not numerical, try to get the color code.
if [[ "$1" != <-> ]]; then
1=$(getColorCode $1)
fi
echo -n "$1"
}
# empty paramenter resets (stops) background color
function backgroundColor() {
echo -n "%K{$(getColor $1)}"
}
# empty paramenter resets (stops) foreground color
function foregroundColor() {
echo -n "%F{$(getColor $1)}"
}
# Get numerical color codes. That way we translate ANSI codes
# into ZSH-Style color codes.
# For user convenience: type `getColorCode background` or `getColorCode foreground` to see
# the list of predefined colors.
function getColorCode() {
# Early exit: Check if given value is already numerical
if [[ "$1" == <-> ]]; then
# Pad color with zeroes
echo -n "${(l:3::0:)1}"
return
fi
local colorName="${1}"
# Check if value is none with any case.
if [[ "${(L)colorName}" == "none" ]]; then
echo -n 'none'
elif [[ "${colorName}" == "foreground" ]]; then
# for testing purposes in terminal
# call via `getColorCode foreground`
for i in "${(k@)__P9K_COLORS}"; do
print -P "$(foregroundColor $i)$(getColor $i) - $i%f"
done
elif [[ "${colorName}" == "background" ]]; then
# call via `getColorCode background`
for i in "${(k@)__P9K_COLORS}"; do
print -P "$(backgroundColor $i)$(getColor $i) - $i%k"
done
else
# Strip eventual "bg-" prefixes
colorName=${colorName#bg-}
# Strip eventual "fg-" prefixes
colorName=${colorName#fg-}
# Strip eventual "br" prefixes ("bright" colors)
colorName=${colorName#br}
echo -n $__P9K_COLORS[$colorName]
if (( ARGC == 1 )); then
case $1 in
foreground)
local k
for k in "${(k@)__P9K_COLORS}"; do
local v=${__P9K_COLORS[$k]}
print -P "%F{$v}$v - $k%f"
done
return
;;
background)
local k
for k in "${(k@)__P9K_COLORS}"; do
local v=${__P9K_COLORS[$k]}
print -P "%K{$v}$v - $k%k"
done
return
;;
esac
fi
}
# Check if two colors are equal, even if one is specified as ANSI code.
function isSameColor() {
if [[ "$1" == "NONE" || "$2" == "NONE" ]]; then
return 1
fi
local color1=$(getColorCode "$1")
local color2=$(getColorCode "$2")
return $(( color1 != color2 ))
echo "Usage: getColorCode background|foreground" >&2
return 1
}

File diff suppressed because it is too large Load diff

View file

@ -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

File diff suppressed because it is too large Load diff