summaryrefslogtreecommitdiff
path: root/powerlevel9k.zsh-theme
diff options
context:
space:
mode:
Diffstat (limited to 'powerlevel9k.zsh-theme')
-rwxr-xr-xpowerlevel9k.zsh-theme147
1 files changed, 117 insertions, 30 deletions
diff --git a/powerlevel9k.zsh-theme b/powerlevel9k.zsh-theme
index 0ae046d5..20bc9d2b 100755
--- a/powerlevel9k.zsh-theme
+++ b/powerlevel9k.zsh-theme
@@ -44,7 +44,7 @@ fi
# Resolve the installation path
if [[ -L "$POWERLEVEL9K_INSTALLATION_PATH" ]]; then
# If this theme is sourced as a symlink, we need to locate the real URL
- filename="$(realpath -P $POWERLEVEL9K_INSTALLATION_PATH 2>/dev/null || readlink -f $POWERLEVEL9K_INSTALLATION_PATH 2>/dev/null || perl -MCwd=abs_path -le 'print abs_path readlink(shift);' $POWERLEVEL9K_INSTALLATION_PATH 2>/dev/null)"
+ filename="${POWERLEVEL9K_INSTALLATION_PATH:A}"
elif [[ -d "$POWERLEVEL9K_INSTALLATION_PATH" ]]; then
# Directory
filename="${POWERLEVEL9K_INSTALLATION_PATH}/powerlevel9k.zsh-theme"
@@ -298,7 +298,7 @@ prompt_anaconda() {
# config - can be overwritten in users' zshrc file.
set_default POWERLEVEL9K_ANACONDA_LEFT_DELIMITER "("
set_default POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER ")"
- "$1_prompt_segment" "$0" "$2" "$3" "$4" "$POWERLEVEL9K_ANACONDA_LEFT_DELIMITER$(basename $_path)$POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER" 'PYTHON_ICON'
+ "$1_prompt_segment" "$0" "$2" "blue" "$DEFAULT_COLOR" "$POWERLEVEL9K_ANACONDA_LEFT_DELIMITER$(basename $_path)$POWERLEVEL9K_ANACONDA_RIGHT_DELIMITER" 'PYTHON_ICON'
fi
}
@@ -337,6 +337,23 @@ prompt_background_jobs() {
fi
}
+# A newline in your prompt, so you can segments on multiple lines.
+prompt_newline() {
+ local lws newline
+ [[ "$1" == "right" ]] && return
+ newline=$'\n'
+ lws=$POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS
+ if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then
+ newline="${newline}$(print_icon 'MULTILINE_NEWLINE_PROMPT_PREFIX')"
+ fi
+ POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS=
+ "$1_prompt_segment" \
+ "$0" \
+ "$2" \
+ "NONE" "NONE" "${newline}"
+ POWERLEVEL9K_WHITESPACE_BETWEEN_LEFT_SEGMENTS=$lws
+}
+
# Segment that indicates usage level of current partition.
set_default POWERLEVEL9K_DISK_USAGE_ONLY_WARNING false
set_default POWERLEVEL9K_DISK_USAGE_WARNING_LEVEL 90
@@ -425,12 +442,17 @@ prompt_battery() {
esac
fi
- if [[ $OS =~ Linux ]]; then
+ if [[ "$OS" == 'Linux' ]] || [[ "$OS" == 'Android' ]]; then
local sysp="/sys/class/power_supply"
+
# Reported BAT0 or BAT1 depending on kernel version
[[ -a $sysp/BAT0 ]] && local bat=$sysp/BAT0
[[ -a $sysp/BAT1 ]] && local bat=$sysp/BAT1
+ # Android-related
+ # Tested on: Moto G falcon (CM 13.0)
+ [[ -a $sysp/battery ]] && local bat=$sysp/battery
+
# Return if no battery found
[[ -z $bat ]] && return
local capacity=$(cat $bat/capacity)
@@ -463,9 +485,24 @@ prompt_battery() {
message="$bat_percent%%"
fi
- # Draw the prompt_segment
- if [[ -n $bat_percent ]]; then
- "$1_prompt_segment" "${0}_${current_state}" "$2" "$DEFAULT_COLOR" "${battery_states[$current_state]}" "$message" 'BATTERY_ICON'
+ # override default icon if we are using battery stages
+ if [[ -n "$POWERLEVEL9K_BATTERY_STAGES" ]]; then
+ local segment=$(( 100.0 / (${#POWERLEVEL9K_BATTERY_STAGES} - 1 ) ))
+ if [[ $segment > 1 ]]; then
+ local offset=$(( ($bat_percent / $segment) + 1 ))
+ # check if the stages are in an array or a string
+ [[ "${(t)POWERLEVEL9K_BATTERY_STAGES}" =~ "array" ]] && POWERLEVEL9K_BATTERY_ICON="$POWERLEVEL9K_BATTERY_STAGES[$offset]" || POWERLEVEL9K_BATTERY_ICON=${POWERLEVEL9K_BATTERY_STAGES:$offset:1}
+ fi
+ fi
+
+ # override the default color if we are using a color level array
+ if [[ -n "$POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND" ]] && [[ "${(t)POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND}" =~ "array" ]]; then
+ local segment=$(( 100.0 / (${#POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND} - 1 ) ))
+ local offset=$(( ($bat_percent / $segment) + 1 ))
+ "$1_prompt_segment" "$0_${current_state}" "$2" "${POWERLEVEL9K_BATTERY_LEVEL_BACKGROUND[$offset]}" "${battery_states[$current_state]}" "${message}" "BATTERY_ICON"
+ else
+ # Draw the prompt_segment
+ "$1_prompt_segment" "$0_${current_state}" "$2" "${DEFAULT_COLOR}" "${battery_states[$current_state]}" "${message}" "BATTERY_ICON"
fi
}
@@ -668,6 +705,7 @@ prompt_command_execution_time() {
# Dir: current working directory
set_default POWERLEVEL9K_DIR_PATH_SEPARATOR "/"
+set_default POWERLEVEL9K_HOME_FOLDER_ABBREVIATION "~"
prompt_dir() {
local current_path="$(print -P "%~")"
if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" || "$POWERLEVEL9K_SHORTEN_STRATEGY" == "truncate_with_folder_marker" ]]; then
@@ -772,6 +810,10 @@ prompt_dir() {
current_path="$( echo "${current_path}" | sed "s/\//${POWERLEVEL9K_DIR_PATH_SEPARATOR}/g")"
fi
+ if [[ "${POWERLEVEL9K_HOME_FOLDER_ABBREVIATION}" != "~" ]]; then
+ current_path="$( echo "${current_path}" | sed "s/^~/${POWERLEVEL9K_HOME_FOLDER_ABBREVIATION}/")"
+ fi
+
typeset -AH dir_states
dir_states=(
"DEFAULT" "FOLDER_ICON"
@@ -813,20 +855,19 @@ prompt_history() {
# Detection for virtualization (systemd based systems only)
prompt_detect_virt() {
- if ! command -v systemd-detect-virt;then
+ if ! command -v systemd-detect-virt > /dev/null; then
return
fi
local virt=$(systemd-detect-virt)
- local color="yellow"
if [[ "$virt" == "none" ]]; then
if [[ "$(ls -di / | grep -o 2)" != "2" ]]; then
virt="chroot"
- "$1_prompt_segment" "$0" "$2" "$color" "$DEFAULT_COLOR" "$virt"
+ "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" "$virt"
else
;
fi
else
- "$1_prompt_segment" "$0" "$2" "$color" "$DEFAULT_COLOR" "$virt"
+ "$1_prompt_segment" "$0" "$2" "$DEFAULT_COLOR" "yellow" "$virt"
fi
}
@@ -920,13 +961,16 @@ prompt_node_version() {
# Node version from NVM
# Only prints the segment if different than the default value
prompt_nvm() {
- [[ ! $(type nvm) =~ 'nvm is a shell function'* ]] && return
- local node_version=$(nvm current)
- [[ -z "${node_version}" ]] || [[ ${node_version} = "none" ]] && return
- local nvm_default=$(cat $NVM_DIR/alias/default)
+ local node_version nvm_default
+ (( $+functions[nvm_version] )) || return
+
+ node_version=$(nvm_version current)
+ [[ -z "${node_version}" || ${node_version} == "none" ]] && return
+
+ nvm_default=$(nvm_version default)
[[ "$node_version" =~ "$nvm_default" ]] && return
- $1_prompt_segment "$0" "$2" "green" "011" "${node_version:1}" 'NODE_ICON'
+ $1_prompt_segment "$0" "$2" "magenta" "black" "${node_version:1}" 'NODE_ICON'
}
# NodeEnv Prompt
@@ -1050,15 +1094,35 @@ prompt_ssh() {
# Status: return code if verbose, otherwise just an icon if an error occurred
set_default POWERLEVEL9K_STATUS_VERBOSE true
set_default POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE false
+set_default POWERLEVEL9K_STATUS_SHOW_PIPESTATUS true
prompt_status() {
- if [[ "$RETVAL" -ne 0 ]]; then
+ local ec_text
+ local ec_sum
+ local ec
+
+ if [[ $POWERLEVEL9K_STATUS_SHOW_PIPESTATUS == true ]]; then
+ ec_text=${RETVALS[1]}
+ ec_sum=${RETVALS[1]}
+
+ for ec in "${(@)RETVALS[2,-1]}"; do
+ ec_text="${ec_text}|${ec}"
+ ec_sum=$(( $ec_sum + $ec ))
+ done
+ else
+ # We use RETVAL instead of the right-most RETVALS item because
+ # PIPE_FAIL may be set.
+ ec_text=${RETVAL}
+ ec_sum=${RETVAL}
+ fi
+
+ if (( ec_sum > 0 )); then
if [[ "$POWERLEVEL9K_STATUS_VERBOSE" == true ]]; then
- "$1_prompt_segment" "$0_ERROR" "$2" "red" "226" "$RETVAL" 'CARRIAGE_RETURN_ICON'
+ "$1_prompt_segment" "$0_ERROR" "$2" "red" "226" "$ec_text" 'CARRIAGE_RETURN_ICON'
else
"$1_prompt_segment" "$0_ERROR" "$2" "$DEFAULT_COLOR" "red" "" 'FAIL_ICON'
fi
elif [[ "$POWERLEVEL9K_STATUS_VERBOSE" == true || "$POWERLEVEL9K_STATUS_OK_IN_NON_VERBOSE" == true ]]; then
- "$1_prompt_segment" "$0_OK" "$2" "$DEFAULT_COLOR" "046" "" 'OK_ICON'
+ "$1_prompt_segment" "$0_OK" "$2" "$DEFAULT_COLOR" "green" "" 'OK_ICON'
fi
}
@@ -1195,6 +1259,12 @@ powerlevel9k_vcs_init() {
zstyle ':vcs_info:hg*:*' get-bookmarks true
zstyle ':vcs_info:hg*+gen-hg-bookmark-string:*' hooks hg-bookmarks
+ # For svn, only
+ # TODO fix the %b (branch) format for svn. Using %b breaks
+ # color-encoding of the foreground for the rest of the powerline.
+ zstyle ':vcs_info:svn*:*' formats "$VCS_CHANGESET_PREFIX%c%u"
+ zstyle ':vcs_info:svn*:*' actionformats "$VCS_CHANGESET_PREFIX%c%u %F{${POWERLEVEL9K_VCS_ACTIONFORMAT_FOREGROUND}}| %a%f"
+
if [[ "$POWERLEVEL9K_SHOW_CHANGESET" == true ]]; then
zstyle ':vcs_info:*' get-revision true
fi
@@ -1331,14 +1401,16 @@ powerlevel9k_preexec() {
set_default POWERLEVEL9K_PROMPT_ADD_NEWLINE false
powerlevel9k_prepare_prompts() {
RETVAL=$?
+ RETVALS=( "$pipestatus[@]" )
_P9K_COMMAND_DURATION=$((EPOCHREALTIME - _P9K_TIMER_START))
+
# Reset start time
- _P9K_TIMER_START=99999999999
+ _P9K_TIMER_START=0x7FFFFFFF
if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then
- PROMPT="$(print_icon 'MULTILINE_FIRST_PROMPT_PREFIX')%f%b%k$(build_left_prompt)
-$(print_icon 'MULTILINE_SECOND_PROMPT_PREFIX')"
+ PROMPT='$(print_icon 'MULTILINE_FIRST_PROMPT_PREFIX')%f%b%k$(build_left_prompt)
+$(print_icon 'MULTILINE_LAST_PROMPT_PREFIX')'
if [[ "$POWERLEVEL9K_RPROMPT_ON_NEWLINE" != true ]]; then
# The right prompt should be on the same line as the first line of the left
# prompt. To do so, there is just a quite ugly workaround: Before zsh draws
@@ -1353,13 +1425,13 @@ $(print_icon 'MULTILINE_SECOND_PROMPT_PREFIX')"
RPROMPT_SUFFIX=''
fi
else
- PROMPT="%f%b%k$(build_left_prompt)"
+ PROMPT='%f%b%k$(build_left_prompt)'
RPROMPT_PREFIX=''
RPROMPT_SUFFIX=''
fi
if [[ "$POWERLEVEL9K_DISABLE_RPROMPT" != true ]]; then
- RPROMPT="$RPROMPT_PREFIX%f%b%k$(build_right_prompt)%{$reset_color%}$RPROMPT_SUFFIX"
+ RPROMPT='$RPROMPT_PREFIX%f%b%k$(build_right_prompt)%{$reset_color%}$RPROMPT_SUFFIX'
fi
NEWLINE='
'
@@ -1367,8 +1439,22 @@ NEWLINE='
}
prompt_powerlevel9k_setup() {
+ # The value below was set to better support 32-bit CPUs.
+ # It's the maximum _signed_ integer value on 32-bit CPUs.
+ # Please don't change it until 19 January of 2038. ;)
+
# Disable false display of command execution time
- _P9K_TIMER_START=99999999999
+ _P9K_TIMER_START=0x7FFFFFFF
+
+ # The prompt function will set these prompt_* options after the setup function
+ # returns. We need prompt_subst so we can safely run commands in the prompt
+ # without them being double expanded and we need prompt_percent to expand the
+ # common percent escape sequences.
+ prompt_opts=(subst percent cr)
+
+ # Borrowed from promptinit, sets the prompt options in case the theme was
+ # not initialized via promptinit.
+ setopt noprompt{bang,cr,percent,subst} "prompt${^prompt_opts[@]}"
# Display a warning if the terminal does not support 256 colors
local term_colors
@@ -1401,12 +1487,6 @@ prompt_powerlevel9k_setup() {
)
print_deprecation_warning deprecated_segments
- setopt prompt_subst
-
- setopt LOCAL_OPTIONS
- unsetopt XTRACE KSH_ARRAYS
- setopt PROMPT_CR PROMPT_PERCENT PROMPT_SUBST MULTIBYTE
-
# initialize colors
autoload -U colors && colors
@@ -1428,4 +1508,11 @@ prompt_powerlevel9k_setup() {
add-zsh-hook preexec powerlevel9k_preexec
}
+prompt_powerlevel9k_teardown() {
+ add-zsh-hook -D precmd powerlevel9k_\*
+ add-zsh-hook -D preexec powerlevel9k_\*
+ PROMPT='%m%# '
+ RPROMPT=
+}
+
prompt_powerlevel9k_setup "$@"