# vim:ft=zsh ts=2 sw=2 sts=2 et fenc=utf-8
################################################################
# Utility functions
# This file holds some utility-functions for
# the powerlevel9k-ZSH-theme
# 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( ) {
local varname = " $1 "
typeset -p " $varname " > /dev/null 2>& 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
# for scalar values.
function set_default( ) {
local varname = " $1 "
local default_value = " $2 "
defined " $varname " || typeset -g " $varname " = " $default_value "
}
# Converts large memory values into a human-readable unit (e.g., bytes --> GB)
printSizeHumanReadable( ) {
typeset -F 2 size
size = " $1 " +0.00001
local extension
extension = ( 'B' 'K' 'M' 'G' 'T' 'P' 'E' 'Z' 'Y' )
local index = 1
# if the base is not Bytes
if [ [ -n $2 ] ] ; then
for idx in " ${ extension [@] } " ; do
if [ [ " $2 " = = " $idx " ] ] ; then
break
fi
index = $(( index + 1 ))
done
fi
while ( ( ( size / 1024) > 0.1 ) ) ; do
size = $(( size / 1024 ))
index = $(( index + 1 ))
done
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( ) {
setopt shwordsplit # We need to split the words in $interfaces
local list callback
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 for the `os_icon` segment
case $( uname) in
Darwin)
OS = 'OSX'
OS_ICON = $( print_icon 'APPLE_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'
OS_ICON = $( print_icon 'LINUX_ICON' )
; ;
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
# 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( ) {
local -A raw_deprecated_segments = ( ${ (kvP)1 } )
for key in ${ (@k)raw_deprecated_segments } ; do
if [ [ -n " ${ POWERLEVEL9K_LEFT_PROMPT_ELEMENTS [(r) $key ] } " ] ] || [ [ -n " ${ POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS [(r) $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
}