aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md16
-rw-r--r--powerlevel9k.zsh-theme178
2 files changed, 179 insertions, 15 deletions
diff --git a/README.md b/README.md
index 187a67b4..f1208f2d 100644
--- a/README.md
+++ b/README.md
@@ -41,6 +41,7 @@ this theme focus on four primary goals:
- [The AWS Profile Segment](#the-aws-profile-segment)
- [The 'context' Segment](#the-context-segment)
- [The 'dir' segment](#the-dir-segment)
+ - [The 'ip' segment](#the-ip-segment)
- [The 'time' segment](#the-time-segment)
- [Unit Test Ratios](#unit-test-ratios)
- [The 'vcs' Segment](#the-vcs-segment)
@@ -234,8 +235,11 @@ currently available are:
* **context** - Your username and host (more info below)
* **dir** - Your current working directory.
* **history** - The command number for the current line.
+* **ip** - Shows the current IP address.
+* **load** - Your machines 5 minute load average and free RAM.
* **node_version** - Show the version number of the installed Node.js.
* **os_icon** - Display a nice little icon, depending on your operating system.
+* **php_version** - Show the current PHP version.
* **rbenv** - Ruby environment information (if one is active).
* **rspec_stats** - Show a ratio of test classes vs code classes for RSpec.
* **status** - The return code of the previous command, and status of background jobs.
@@ -291,6 +295,15 @@ In each case you have to specify the length you want to shorten the directory
to. So in some cases `POWERLEVEL9K_SHORTEN_DIR_LENGTH` means characters, in
others whole directories.
+#### The 'ip' segment
+
+This segment shows you your current internal IP address. It tries to examine
+all currently used network interfaces and prints the first address it finds.
+In the case that this is not the right IP address you can specify the correct
+network interface by setting:
+
+ POWERLEVEL9K_IP_INTERFACE="eth0"
+
#### The 'time' segment
By default the time is show in 'H:M:S' format. If you want to change it,
@@ -414,6 +427,9 @@ This special prompt does not work on the right side, as it would be too long,
and ZSH hides it automatically. Also have in mind, that the output depends on
your `POWERLEVEL9K_MODE` settings.
+You can change any icon by setting a environment variable. To get a full list
+of icons just type `get_icon_names` in your terminal.
+
#### Segment Color Customization
For each segment in your prompt, you can specify a foreground and background
diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme
index e0b5eecd..8d3953a6 100644
--- a/powerlevel9k.zsh-theme
+++ b/powerlevel9k.zsh-theme
@@ -32,6 +32,18 @@ function defined() {
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"
+}
+
# Safety function for printing icons
# Prints the named icon, or if that icon is undefined, the string name.
function print_icon() {
@@ -45,16 +57,58 @@ function print_icon() {
fi
}
-# 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"
+printSizeHumanReadable() {
+ local size=$1
+ 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
- defined "$varname" || typeset -g "$varname"="$default_value"
+ while (( ($size / 1024) > 0 )); 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
+}
+
+get_icon_names() {
+ for key in "${(@k)icons}"; do
+ echo "POWERLEVEL9K_$key: ${icons[$key]}"
+ done
}
################################################################
@@ -88,11 +142,15 @@ case $POWERLEVEL9K_MODE in
NODE_ICON $'\U2B22' # ⬢
MULTILINE_FIRST_PROMPT_PREFIX $'\U256D'$'\U2500'
MULTILINE_SECOND_PROMPT_PREFIX $'\U2570'$'\U2500 '
- APPLE_ICON $'\UF8FF' # 
+ APPLE_ICON $'\UE26E' # 
FREEBSD_ICON $'\U1F608 ' # 😈
- LINUX_ICON $'\U1F427 ' # 🐧
+ LINUX_ICON $'\UE271' # 
SUNOS_ICON $'\U1F31E ' # 🌞
- HOME_ICON $'\UE12C' # 
+ HOME_ICON $'\UE12C ' # 
+ NETWORK_ICON $'\UE1AD ' # 
+ LOAD_ICON $'\UE190 ' # 
+ #RAM_ICON $'\UE87D' # 
+ RAM_ICON $'\UE1E2 ' # 
VCS_UNTRACKED_ICON "\UE16C" # 
VCS_UNSTAGED_ICON "\UE17C" # 
VCS_STAGED_ICON "\UE168" # 
@@ -136,6 +194,9 @@ case $POWERLEVEL9K_MODE in
LINUX_ICON 'Lx'
SUNOS_ICON 'Sun'
HOME_ICON ''
+ NETWORK_ICON 'IP'
+ LOAD_ICON 'L'
+ RAM_ICON 'RAM'
VCS_UNTRACKED_ICON '?'
VCS_UNSTAGED_ICON "\u25CF" # ●
VCS_STAGED_ICON "\u271A" # ✚
@@ -256,7 +317,7 @@ VCS_DEFAULT_FORMAT="$VCS_CHANGESET_PREFIX%F{$POWERLEVEL9K_VCS_FOREGROUND}%b%c%u%
zstyle ':vcs_info:git*:*' formats "%F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_GIT_ICON')%f$VCS_DEFAULT_FORMAT"
zstyle ':vcs_info:hg*:*' formats "%F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_HG_ICON')%f$VCS_DEFAULT_FORMAT"
-zstyle ':vcs_info:*' actionformats " %b %F{red}| %a%f"
+zstyle ':vcs_info:*' actionformats "%b %F{red}| %a%f"
zstyle ':vcs_info:*' stagedstr " %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_STAGED_ICON')%f"
zstyle ':vcs_info:*' unstagedstr " %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_UNSTAGED_ICON')%f"
@@ -398,7 +459,7 @@ prompt_vcs() {
$1_prompt_segment "$0" "green" "$DEFAULT_COLOR"
fi
- echo -n "%F{$POWERLEVEL9K_VCS_FOREGROUND}%f$vcs_prompt "
+ echo -n "$vcs_prompt "
fi
}
@@ -531,7 +592,7 @@ prompt_dir() {
fi
- $1_prompt_segment "$0" "blue" "$DEFAULT_COLOR" "$(print_icon 'HOME_ICON') $current_path"
+ $1_prompt_segment "$0" "blue" "$DEFAULT_COLOR" "$(print_icon 'HOME_ICON')$current_path"
}
# Command number (in local history)
@@ -549,6 +610,75 @@ prompt_icons_test() {
done
}
+prompt_ip() {
+ if [[ "$OS" == "OSX" ]]; then
+ if defined POWERLEVEL9K_IP_INTERFACE; then
+ # Get the IP address of the specified interface.
+ ip=$(ipconfig getifaddr $POWERLEVEL9K_IP_INTERFACE)
+ else
+ local interfaces callback
+ # Get network interface names ordered by service precedence.
+ interfaces=$(networksetup -listnetworkserviceorder | grep -o "Device:\s*[a-z0-9]*" | grep -o -E '[a-z0-9]*$')
+ callback='ipconfig getifaddr $item'
+
+ ip=$(getRelevantItem $interfaces $callback)
+ fi
+ else
+ if defined POWERLEVEL9K_IP_INTERFACE; then
+ # Get the IP address of the specified interface.
+ ip=$(ip -4 a show $POWERLEVEL9K_IP_INTERFACE | grep -o "inet\s*[0-9.]*" | grep -o "[0-9.]*")
+ else
+ local interfaces callback
+ # Get all network interface names that are up
+ interfaces=$(ip link ls up | grep -o -E ":\s+[a-z0-9]+:" | grep -v "lo" | grep -o "[a-z0-9]*")
+ callback='ip -4 a show $item | grep -o "inet\s*[0-9.]*" | grep -o "[0-9.]*"'
+
+ ip=$(getRelevantItem $interfaces $callback)
+ fi
+ fi
+
+ $1_prompt_segment "$0" "cyan" "$DEFAULT_COLOR" "$(print_icon 'NETWORK_ICON') $ip"
+}
+
+set_default POWERLEVEL9K_LOAD_SHOW_FREE_RAM true
+prompt_load() {
+ if [[ "$OS" == "OSX" ]]; then
+ load_avg_5min=$(sysctl vm.loadavg | grep -o -E '[0-9]+(\.|,)[0-9]+' | head -n 1)
+ if [[ "$POWERLEVEL9K_LOAD_SHOW_FREE_RAM" == true ]]; then
+ ramfree=$(vm_stat | grep "Pages free" | grep -o -E '[0-9]+')
+ # Convert pages into Bytes
+ ramfree=$(( $ramfree * 4096 ))
+ base=''
+ fi
+ else
+ load_avg_5min=$(grep -o "[0-9.]*" /proc/loadavg | head -n 1)
+ if [[ "$POWERLEVEL9K_LOAD_SHOW_FREE_RAM" == true ]]; then
+ ramfree=$(grep -o -E "MemFree:\s+[0-9]+" /proc/meminfo | grep -o "[0-9]*")
+ base=K
+ fi
+ fi
+
+ # Replace comma
+ load_avg_5min=${load_avg_5min//,/.}
+
+ if [[ "$load_avg_5min" -gt 10 ]]; then
+ BACKGROUND_COLOR="red"
+ FUNCTION_SUFFIX="_CRITICAL"
+ elif [[ "$load_avg_5min" -gt 3 ]]; then
+ BACKGROUND_COLOR="yellow"
+ FUNCTION_SUFFIX="_WARNING"
+ else
+ BACKGROUND_COLOR="green"
+ FUNCTION_SUFFIX="_NORMAL"
+ fi
+
+ $1_prompt_segment "$0$FUNCTION_SUFFIX" $BACKGROUND_COLOR "$DEFAULT_COLOR" "$(print_icon 'LOAD_ICON') $load_avg_5min"
+
+ if [[ "$POWERLEVEL9K_LOAD_SHOW_FREE_RAM" == true ]]; then
+ echo -n "$(print_icon 'RAM_ICON') $(printSizeHumanReadable $ramfree $base) "
+ fi
+}
+
# Right Status: (return code, root status, background jobs)
# This creates a status segment for the *right* prompt. Exact same thing as
# above - just other side.
@@ -583,6 +713,16 @@ prompt_os_icon() {
$1_prompt_segment "$0" "008" "255" "$OS_ICON"
}
+# print PHP version number
+prompt_php_version() {
+ local php_version
+ php_version=$(php -v 2>&1 | grep -oe "^PHP\s*[0-9.]*")
+
+ if [[ -n "$php_version" ]]; then
+ $1_prompt_segment "$0" "013" "255" "$php_version"
+ fi
+}
+
# rbenv information
prompt_rbenv() {
if [[ -n "$RBENV_VERSION" ]]; then
@@ -703,6 +843,14 @@ build_right_prompt() {
}
powerlevel9k_init() {
+ # Display a warning if the terminal does not support 256 colors
+ local term_colors
+ term_colors=$(tput colors)
+ if (( $term_colors < 256 )); then
+ print -P "%F{red}WARNING!%f Your terminal supports less than 256 colors!"
+ print "You should set TERM=xterm-256colors in your ~/.zshrc"
+ fi
+
setopt LOCAL_OPTIONS
unsetopt XTRACE KSH_ARRAYS
prompt_opts=(cr percent subst)