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

pull/22/head
romkatv 6 years ago
parent 696290fb22
commit 5ee0054298

@ -6,10 +6,9 @@
# https://github.com/bhilburn/powerlevel9k # https://github.com/bhilburn/powerlevel9k
################################################################ ################################################################
typeset -gAh __P9K_COLORS
# https://jonasjacek.github.io/colors/ # https://jonasjacek.github.io/colors/
# use color names by default to allow dark/light themes to adjust colors based on names # use color names by default to allow dark/light themes to adjust colors based on names
__P9K_COLORS=( typeset -gAh __P9K_COLORS=(
black 000 black 000
red 001 red 001
green 002 green 002
@ -270,89 +269,29 @@ __P9K_COLORS=(
grey93 255 grey93 255
) )
function termColors() { # For user convenience: type `getColorCode background` or `getColorCode foreground` to see
if [[ $POWERLEVEL9K_IGNORE_TERM_COLORS == true ]]; then # the list of predefined colors.
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.
function getColorCode() { function getColorCode() {
# Early exit: Check if given value is already numerical if (( ARGC == 1 )); then
if [[ "$1" == <-> ]]; then case $1 in
# Pad color with zeroes foreground)
echo -n "${(l:3::0:)1}" local k
return for k in "${(k@)__P9K_COLORS}"; do
fi local v=${__P9K_COLORS[$k]}
print -P "%F{$v}$v - $k%f"
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 done
elif [[ "${colorName}" == "background" ]]; then return
# call via `getColorCode background` ;;
for i in "${(k@)__P9K_COLORS}"; do background)
print -P "$(backgroundColor $i)$(getColor $i) - $i%k" local k
for k in "${(k@)__P9K_COLORS}"; do
local v=${__P9K_COLORS[$k]}
print -P "%K{$v}$v - $k%k"
done done
else return
# Strip eventual "bg-" prefixes ;;
colorName=${colorName#bg-} esac
# Strip eventual "fg-" prefixes
colorName=${colorName#fg-}
# Strip eventual "br" prefixes ("bright" colors)
colorName=${colorName#br}
echo -n $__P9K_COLORS[$colorName]
fi fi
} echo "Usage: getColorCode background|foreground" >&2
# Check if two colors are equal, even if one is specified as ANSI code.
function isSameColor() {
if [[ "$1" == "NONE" || "$2" == "NONE" ]]; then
return 1 return 1
fi
local color1=$(getColorCode "$1")
local color2=$(getColorCode "$2")
return $(( color1 != color2 ))
} }

@ -13,8 +13,12 @@
# Initialize the icon list according to the user's `POWERLEVEL9K_MODE`. # Initialize the icon list according to the user's `POWERLEVEL9K_MODE`.
typeset -gAH icons typeset -gAH icons
() { # add scope to protect the users locale and not overwrite LC_CTYPE!
case $POWERLEVEL9K_MODE in set_default POWERLEVEL9K_HIDE_BRANCH_ICON false
set_default POWERLEVEL9K_MODE ""
function _p9k_init_icons() {
case $POWERLEVEL9K_MODE in
'flat'|'awesome-patched') 'flat'|'awesome-patched')
# Awesome-Patched Font required! See: # Awesome-Patched Font required! See:
# https://github.com/gabrielelana/awesome-terminal-fonts/tree/patching-strategy/patched # https://github.com/gabrielelana/awesome-terminal-fonts/tree/patching-strategy/patched
@ -505,10 +509,10 @@ case $POWERLEVEL9K_MODE in
LARAVEL_ICON '' LARAVEL_ICON ''
) )
;; ;;
esac esac
# Override the above icon settings with any user-defined variables. # Override the above icon settings with any user-defined variables.
case $POWERLEVEL9K_MODE in case $POWERLEVEL9K_MODE in
'flat') 'flat')
# Set the right locale to protect special characters # Set the right locale to protect special characters
local LC_ALL="" LC_CTYPE="en_US.UTF-8" local LC_ALL="" LC_CTYPE="en_US.UTF-8"
@ -524,19 +528,19 @@ case $POWERLEVEL9K_MODE in
icons[RIGHT_SEGMENT_SEPARATOR]=$'\u2B82' # ⮂ icons[RIGHT_SEGMENT_SEPARATOR]=$'\u2B82' # ⮂
icons[VCS_BRANCH_ICON]='@' icons[VCS_BRANCH_ICON]='@'
;; ;;
esac esac
if [[ "$POWERLEVEL9K_HIDE_BRANCH_ICON" == true ]]; then if [[ "$POWERLEVEL9K_HIDE_BRANCH_ICON" == true ]]; then
icons[VCS_BRANCH_ICON]='' icons[VCS_BRANCH_ICON]=''
fi fi
} }
# Safety function for printing icons # Safety function for printing icons
# Prints the named icon, or if that icon is undefined, the string name. # Prints the named icon, or if that icon is undefined, the string name.
function print_icon() { function print_icon() {
local icon_name=$1 local icon_name=$1
local ICON_USER_VARIABLE=POWERLEVEL9K_${icon_name} local var_name=POWERLEVEL9K_${icon_name}
if defined "$ICON_USER_VARIABLE"; then if [[ -v "$var_name" ]]; then
echo -n "${(P)ICON_USER_VARIABLE}" echo -n "${(P)ICON_USER_VARIABLE}"
else else
echo -n "${icons[$icon_name]}" echo -n "${icons[$icon_name]}"
@ -547,7 +551,7 @@ function print_icon() {
# * $1 string - If "original", then the original icons are printed, # * $1 string - If "original", then the original icons are printed,
# otherwise "print_icon" is used, which takes the users # otherwise "print_icon" is used, which takes the users
# overrides into account. # overrides into account.
get_icon_names() { function get_icon_names() {
# Iterate over a ordered list of keys of the icons array # Iterate over a ordered list of keys of the icons array
for key in ${(@kon)icons}; do for key in ${(@kon)icons}; do
echo -n "POWERLEVEL9K_$key: " echo -n "POWERLEVEL9K_$key: "

@ -6,22 +6,28 @@
# https://github.com/bhilburn/powerlevel9k # https://github.com/bhilburn/powerlevel9k
################################################################ ################################################################
# Exits with 0 if a variable has been previously defined (even if empty) # Usage: set_default [OPTION]... NAME [VALUE]...
# 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.
# #
# Typeset cannot set the value for an array, so this will only work # Options are the same as in `typeset`.
# for scalar values.
function set_default() { function set_default() {
local varname="$1" local -a flags=(-g)
local default_value="$2" 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) # Converts large memory values into a human-readable unit (e.g., bytes --> GB)
@ -54,147 +60,6 @@ printSizeHumanReadable() {
echo "$size${extension[$index]}" 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 # 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 # Pass the name of the segment to this function to test for its presence in
@ -202,76 +67,8 @@ fi
# * $1: The segment to be tested. # * $1: The segment to be tested.
segment_in_use() { segment_in_use() {
local key=$1 local key=$1
if [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)$key]}" ]] || [[ -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)$key]}" ]]; then [[ -n "${POWERLEVEL9K_LEFT_PROMPT_ELEMENTS[(r)$key]}" ||
return 0 -n "${POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS[(r)$key]}" ]]
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
} }
################################################################ ################################################################
@ -350,14 +147,6 @@ function truncatePath() {
fi 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. # Search recursively in parent folders for given file.
function upsearch () { function upsearch () {
if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then if [[ "$PWD" == "$HOME" || "$PWD" == "/" ]]; then

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save