1
0
Fork 0
mirror of https://github.com/romkatv/powerlevel10k.git synced 2024-11-16 09:50:06 +00:00

Resolving conflicts from PR #86

This commit is contained in:
Ben Hilburn 2015-09-05 14:48:18 -07:00
commit 8ce144423b
2 changed files with 305 additions and 236 deletions

View file

@ -1,7 +1,7 @@
## powerlevel9k Theme for ZSH
Powerlevel9k is a theme for ZSH which uses [Powerline
Fonts](https://github.com/Lokaltog/powerline-fonts). It can be used with vanilla
Fonts](https://github.com/powerline/fonts). It can be used with vanilla
ZSH, [Oh-My-Zsh](https://github.com/robbyrussell/oh-my-zsh), or
[Prezto](https://github.com/sorin-ionescu/prezto), and can also be installed
using [antigen](https://github.com/zsh-users/antigen).
@ -49,11 +49,13 @@ this theme focus on four primary goals:
- [Double-Lined Prompt](#double-lined-prompt)
- [Disable Right Prompt](#disable-right-prompt)
- [Light Color Theme](#light-color-theme)
- [Icon Customization](#icon-customization)
- [Segment Color Customization](#segment-color-customization)
- [Special Segment Colors](#special-segment-colors)
- [Troubleshooting](#troubleshooting)
- [Gaps Between Segments](#gaps-between-segments)
- [Segment Colors are Wrong](#segment-colors-are-wrong)
- [Strange Characters in prompt](#strange-characters-in-prompt)
- [Meta](#meta)
- [Kudos](#kudos)
- [Developing](#developing)
@ -277,6 +279,18 @@ to a certain length:
# Limit to the last two folders
POWERLEVEL9K_SHORTEN_DIR_LENGTH=2
To change the way how the current working directory is truncated, just set:
# truncate the middle part
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_middle"
# truncate from right, leaving the first X characters untouched
POWERLEVEL9K_SHORTEN_STRATEGY="truncate_from_right"
# default behaviour is to truncate whole directories
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 'time' segment
By default the time is show in 'H:M:S' format. If you want to change it,
@ -382,6 +396,24 @@ Light'](https://github.com/altercation/solarized) users. Check it out:
![](http://bhilburn.org/content/images/2015/03/solarized-light.png)
#### Icon Customization
Each icon used can be customized too by specifying a variable named like
the icon and prefixed with 'POWERLEVEL9K'. If you want to use another icon
as segment separators, you can easily do that:
POWERLEVEL9K_LEFT_SEGMENT_SEPARATOR=$'\uE0B1'
POWERLEVEL9K_RIGHT_SEGMENT_SEPARATOR=$'\uE0B3'
You could get a list of all icons defined in random colors, by adding the
special segment `icons_test` to your prompt:
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(icons_test)
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.
#### Segment Color Customization
For each segment in your prompt, you can specify a foreground and background
@ -462,12 +494,21 @@ terminal, which should yield `256`. If you see something different, try setting
TERM=xterm-256color
#### Strange Characters in prompt
If your prompt shows strange character like this:
![](https://cloud.githubusercontent.com/assets/1544760/9156161/e0e584e6-3ed0-11e5-897a-2318a8e32d35.png)
it is most likely that you set `POWERLEVEL9K_MODE="awesome-patched"`, but
did not install an [awesome-font](https://github.com/gabrielelana/awesome-terminal-fonts). For most other modes, you need a [powerline-patched](https://github.com/powerline/fonts) font.
### Meta
#### Kudos
This theme wouldn't have happened without inspiration from the original
[agnoster](https://gist.github.com/agnoster/3712874) Oh-My-ZSH theme.
[agnoster](https://github.com/agnoster/agnoster-zsh-theme) ZSH theme.
Before creating this theme, I also tried [jeremyFreeAgent's
theme](https://github.com/jeremyFreeAgent/oh-my-zsh-powerline-theme) and

View file

@ -12,197 +12,205 @@
################################################################
# Please see the README file located in the source repository for full docs.
# What follows is a brief list of the settings variables used by this theme.
# You should define these variables in your `~/.zshrc`.
#
# Customize which segments appear in which prompts (below is also the default):
# POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir rbenv vcs)
# POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(status history time)
#
# Set your Amazon Web Services profile for the `aws` segment:
# export AWS_DEFAULT_PROFILE=<profile_name>
#
# Set your username for the `context` segment:
# export DEFAULT_USER=<your username>
#
# Customize the format of the time segment. Example of reverse format:
# POWERLEVEL9K_TIME_FORMAT='%D{%S:%M:%H}'
#
# Show the hash/changeset string in the `vcs` segment:
# POWERLEVEL9K_SHOW_CHANGESET=true
# Set the length of the hash/changeset if enabled in the `vcs` segment:
# POWERLEVEL9K_CHANGESET_HASH_LENGTH=6
#
# Make powerlevel9k a double-lined prompt:
# POWERLEVEL9K_PROMPT_ON_NEWLINE=true
#
# Set the colorscheme:
# POWERLEVEL9K_COLOR_SCHEME='light'
# There are a lot of easy ways you can customize your prompt segments and
# theming with simple variables defined in your `~/.zshrc`.
################################################################
## Debugging
## Turn on for Debugging
#zstyle ':vcs_info:*+*:*' debug true
#set -o xtrace
# The `CURRENT_BG` variable is used to remember what the last BG color used was
# when building the left-hand prompt. Because the RPROMPT is created from
# right-left but reads the opposite, this isn't necessary for the other side.
CURRENT_BG='NONE'
################################################################
# Utility functions
################################################################
# These characters require the Powerline fonts to work properly. If see boxes or
# bizarre characters below, your fonts are not correctly installed. If you
# do not want to install a special font, you can set `POWERLEVEL9K_MODE` to
# 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
}
# Safety function for printing icons
# Prints the named icon, or if that icon is undefined, the string name.
function print_icon() {
local icon_name=$1
local ICON_USER_VARIABLE=POWERLEVEL9K_${icon_name}
local USER_ICON=${(P)ICON_USER_VARIABLE}
if defined "$ICON_USER_VARIABLE"; then
echo -n $USER_ICON
else
echo -n ${icons[$icon_name]}
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"
defined "$varname" || typeset -g "$varname"="$default_value"
}
################################################################
# Icons
################################################################
# These characters require the Powerline fonts to work properly. If you see
# boxes or bizarre characters below, your fonts are not correctly installed. If
# you do not want to install a special font, you can set `POWERLEVEL9K_MODE` to
# `compatible`. This shows all icons in regular symbols.
# Initialize the icon list according to the user's `POWERLEVEL9K_MODE`.
typeset -gAH icons
case $POWERLEVEL9K_MODE in
'flat')
'flat'|'awesome-patched')
# Awesome-Patched Font required!
# See https://github.com/gabrielelana/awesome-terminal-fonts/tree/patching-strategy/patched
LEFT_SEGMENT_SEPARATOR=''
RIGHT_SEGMENT_SEPARATOR=''
ROOT_ICON="\UE801" # 
RUBY_ICON="\UE847" # 
AWS_ICON="\UE895" # 
BACKGROUND_JOBS_ICON="\UE82F " # 
TEST_ICON="\UE891" # 
OK_ICON="\U2713" # ✓
FAIL_ICON="\U2718" # ✘
SYMFONY_ICON="SF"
APPLE_ICON=$'\UF8FF' # 
FREEBSD_ICON=$'\U1F608 ' # 😈
LINUX_ICON=$'\U1F427 ' # 🐧
SUNOS_ICON=$'\U1F31E ' # 🌞
VCS_UNTRACKED_ICON="\UE16C" # 
VCS_UNSTAGED_ICON="\UE17C" # 
VCS_STAGED_ICON="\UE168" # 
VCS_STASH_ICON="\UE133 " # 
#VCS_INCOMING_CHANGES="\UE1EB " # 
#VCS_INCOMING_CHANGES="\UE80D " # 
VCS_INCOMING_CHANGES="\UE131 " # 
#VCS_OUTGOING_CHANGES="\UE1EC " # 
#VCS_OUTGOING_CHANGES="\UE80E " # 
VCS_OUTGOING_CHANGES="\UE132 " # 
VCS_TAG_ICON="\UE817 " # 
VCS_BOOKMARK_ICON="\UE87B" # 
VCS_COMMIT_ICON="\UE821 " # 
VCS_BRANCH_ICON=$'\UE220' # 
VCS_REMOTE_BRANCH_ICON=" \UE804 " # 
VCS_GIT_ICON="\UE20E " # 
VCS_HG_ICON="\UE1C3 " # 
;;
'compatible')
LEFT_SEGMENT_SEPARATOR="\U2B80" # ⮀
RIGHT_SEGMENT_SEPARATOR="\U2B82" # ⮂
ROOT_ICON="\U26A1" # ⚡
RUBY_ICON=''
AWS_ICON="AWS:"
BACKGROUND_JOBS_ICON="\U2699" # ⚙
TEST_ICON=''
OK_ICON="\U2713" # ✓
FAIL_ICON="\U2718" # ✘
SYMFONY_ICON="SF"
APPLE_ICON='OSX'
FREEBSD_ICON='BSD'
LINUX_ICON='Lx'
SUNOS_ICON='Sun'
VCS_UNTRACKED_ICON='?'
VCS_UNSTAGED_ICON="\U25CF" # ●
VCS_STAGED_ICON="\U271A" # ✚
VCS_STASH_ICON="\U235F" # ⍟
VCS_INCOMING_CHANGES="\U2193" # ↓
VCS_OUTGOING_CHANGES="\U2191" # ↑
VCS_TAG_ICON=''
VCS_BOOKMARK_ICON="\U263F" # ☿
VCS_COMMIT_ICON=''
VCS_BRANCH_ICON='@'
VCS_REMOTE_BRANCH_ICON="\U2192" # →
VCS_GIT_ICON='Git'
VCS_HG_ICON='HG'
;;
'awesome-patched')
# Awesome-Patched Font required!
# See https://github.com/gabrielelana/awesome-terminal-fonts/tree/patching-strategy/patched
LEFT_SEGMENT_SEPARATOR="\UE0B0" # 
RIGHT_SEGMENT_SEPARATOR="\UE0B2" # 
ROOT_ICON="\U26A1" # ⚡
RUBY_ICON="\UE847" # 
AWS_ICON="\UE895" # 
BACKGROUND_JOBS_ICON="\UE82F " # 
TEST_ICON="\UE891" # 
OK_ICON="\U2713" # ✓
FAIL_ICON="\U2718" # ✘
SYMFONY_ICON="SF"
APPLE_ICON=$'\UF8FF' # 
FREEBSD_ICON=$'\U1F608 ' # 😈
LINUX_ICON=$'\U1F427 ' # 🐧
SUNOS_ICON=$'\U1F31E ' # 🌞
VCS_UNTRACKED_ICON="\UE16C" # 
VCS_UNSTAGED_ICON="\UE17C" # 
VCS_STAGED_ICON="\UE168" # 
VCS_STASH_ICON="\UE133 " # 
#VCS_INCOMING_CHANGES="\UE1EB " # 
#VCS_INCOMING_CHANGES="\UE80D " # 
VCS_INCOMING_CHANGES="\UE131 " # 
#VCS_OUTGOING_CHANGES="\UE1EC " # 
#VCS_OUTGOING_CHANGES="\UE80E " # 
VCS_OUTGOING_CHANGES="\UE132 " # 
VCS_TAG_ICON="\UE817 " # 
VCS_BOOKMARK_ICON="\UE87B" # 
VCS_COMMIT_ICON="\UE821 " # 
VCS_BRANCH_ICON=$'\UE220' # 
VCS_REMOTE_BRANCH_ICON=" \UE804 " # 
VCS_GIT_ICON="\UE20E " # 
VCS_HG_ICON="\UE1C3 " # 
icons=(
LEFT_SEGMENT_SEPARATOR "\UE0B0" # 
RIGHT_SEGMENT_SEPARATOR "\UE0B2" # 
ROOT_ICON "\UE801" # 
RUBY_ICON "\UE847" # 
AWS_ICON "\UE895" # 
BACKGROUND_JOBS_ICON "\UE82F " # 
TEST_ICON "\UE891" # 
OK_ICON "\U2713" # ✓
FAIL_ICON "\U2718" # ✘
SYMFONY_ICON "SF"
NODE_ICON $'\U2B22' # ⬢
MULTILINE_FIRST_PROMPT_PREFIX $'\U256D'$'\U2500'
MULTILINE_SECOND_PROMPT_PREFIX $'\U2570'$'\U2500 '
APPLE_ICON $'\UF8FF' # 
FREEBSD_ICON $'\U1F608 ' # 😈
LINUX_ICON $'\U1F427 ' # 🐧
SUNOS_ICON $'\U1F31E ' # 🌞
HOME_ICON $'\UE12C' # 
VCS_UNTRACKED_ICON "\UE16C" # 
VCS_UNSTAGED_ICON "\UE17C" # 
VCS_STAGED_ICON "\UE168" # 
VCS_STASH_ICON "\UE133 " # 
#VCS_INCOMING_CHANGES_ICON "\UE1EB " # 
#VCS_INCOMING_CHANGES_ICON "\UE80D " # 
VCS_INCOMING_CHANGES_ICON "\UE131 " # 
#VCS_OUTGOING_CHANGES_ICON "\UE1EC " # 
#VCS_OUTGOING_CHANGES_ICON "\UE80E " # 
VCS_OUTGOING_CHANGES_ICON "\UE132 " # 
VCS_TAG_ICON "\UE817 " # 
VCS_BOOKMARK_ICON "\UE87B" # 
VCS_COMMIT_ICON "\UE821 " # 
VCS_BRANCH_ICON $'\UE220' # 
VCS_REMOTE_BRANCH_ICON " \UE804 " # 
VCS_GIT_ICON "\UE20E " # 
VCS_HG_ICON "\UE1C3 " # 
)
;;
*)
# Powerline-Patched Font required!
# See https://github.com/Lokaltog/powerline-fonts
LEFT_SEGMENT_SEPARATOR="\UE0B0" # 
RIGHT_SEGMENT_SEPARATOR="\UE0B2" # 
ROOT_ICON="\U26A1" # ⚡
RUBY_ICON=''
AWS_ICON="AWS:"
BACKGROUND_JOBS_ICON="\U2699" # ⚙
TEST_ICON=''
OK_ICON="\U2713" # ✓
FAIL_ICON="\U2718" # ✘
SYMFONY_ICON="SF"
APPLE_ICON='OSX'
FREEBSD_ICON='BSD'
LINUX_ICON='Lx'
SUNOS_ICON='Sun'
VCS_UNTRACKED_ICON='?'
VCS_UNSTAGED_ICON="\U25CF" # ●
VCS_STAGED_ICON="\U271A" # ✚
VCS_STASH_ICON="\U235F" # ⍟
VCS_INCOMING_CHANGES="\U2193" # ↓
VCS_OUTGOING_CHANGES="\U2191" # ↑
VCS_TAG_ICON=''
VCS_BOOKMARK_ICON="\U263F" # ☿
VCS_COMMIT_ICON=''
VCS_BRANCH_ICON="\UE0A0 " # 
VCS_REMOTE_BRANCH_ICON="\U2192" # →
VCS_GIT_ICON=""
VCS_HG_ICON=""
icons=(
LEFT_SEGMENT_SEPARATOR "\uE0B0" # 
RIGHT_SEGMENT_SEPARATOR "\uE0B2" # 
ROOT_ICON "\u26A1" # ⚡
RUBY_ICON ''
AWS_ICON "AWS:"
BACKGROUND_JOBS_ICON "\u2699" # ⚙
TEST_ICON ''
OK_ICON "\u2713" # ✓
FAIL_ICON "\u2718" # ✘
SYMFONY_ICON "SF"
NODE_ICON $'\u2B22' # ⬢
MULTILINE_FIRST_PROMPT_PREFIX $'\u256D'$'\u2500'
MULTILINE_SECOND_PROMPT_PREFIX $'\u2570'$'\u2500 '
APPLE_ICON 'OSX'
FREEBSD_ICON 'BSD'
LINUX_ICON 'Lx'
SUNOS_ICON 'Sun'
HOME_ICON ''
VCS_UNTRACKED_ICON '?'
VCS_UNSTAGED_ICON "\u25CF" # ●
VCS_STAGED_ICON "\u271A" # ✚
VCS_STASH_ICON "\u235F" # ⍟
VCS_INCOMING_CHANGES_ICON "\u2193" # ↓
VCS_OUTGOING_CHANGES_ICON "\u2191" # ↑
VCS_TAG_ICON ''
VCS_BOOKMARK_ICON "\u263F" # ☿
VCS_COMMIT_ICON ''
VCS_BRANCH_ICON "\uE0A0 " # 
VCS_REMOTE_BRANCH_ICON "\u2192" # →
VCS_GIT_ICON ""
VCS_HG_ICON ""
)
;;
esac
# OS detection for the `os_icon` segment
case $(uname) in
Darwin) OS_ICON=$APPLE_ICON ;;
FreeBSD) OS_ICON=$FREEBSD_ICON ;;
OpenBSD) OS_ICON=$FREEBSD_ICON ;;
DragonFly) OS_ICON=$FREEBSD_ICON ;;
Linux) OS_ICON=$LINUX_ICON ;;
SunOS) OS_ICON=$SUNOS_ICON ;;
*) OS_ICON='' ;;
# Override the above icon settings with any user-defined variables.
case $POWERLEVEL9K_MODE in
'flat')
icons[LEFT_SEGMENT_SEPARATOR]=''
icons[RIGHT_SEGMENT_SEPARATOR]=''
;;
'compatible')
icons[LEFT_SEGMENT_SEPARATOR]="\u2B80" # ⮀
icons[RIGHT_SEGMENT_SEPARATOR]="\u2B82" # ⮂
icons[VCS_BRANCH_ICON]='@'
;;
esac
if [[ "$POWERLEVEL9K_HIDE_BRANCH_ICON" == true ]]; then
VCS_BRANCH_ICON=''
icons[VCS_BRANCH_ICON]=''
fi
# 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
################################################################
# color scheme
# Color Scheme
################################################################
if [[ "$POWERLEVEL9K_COLOR_SCHEME" == "light" ]]; then
@ -215,16 +223,8 @@ else
DEFAULT_COLOR_DARK="236"
fi
VCS_FOREGROUND_COLOR=$DEFAULT_COLOR
VCS_FOREGROUND_COLOR_DARK=$DEFAULT_COLOR_DARK
# If user has defined custom colors for the `vcs` segment, override the defaults
if [[ -n $POWERLEVEL9K_VCS_FOREGROUND ]]; then
VCS_FOREGROUND_COLOR=$POWERLEVEL9K_VCS_FOREGROUND
fi
if [[ -n $POWERLEVEL9K_VCS_DARK_FOREGROUND ]]; then
VCS_FOREGROUND_COLOR_DARK=$POWERLEVEL9K_VCS_DARK_FOREGROUND
fi
set_default POWERLEVEL9K_VCS_FOREGROUND "$DEFAULT_COLOR"
set_default POWERLEVEL9K_VCS_DARK_FOREGROUND "$DEFAULT_COLOR_DARK"
################################################################
# VCS Information Settings
@ -242,26 +242,26 @@ if [[ "$POWERLEVEL9K_SHOW_CHANGESET" == true ]]; then
VCS_CHANGESET_HASH_LENGTH="$POWERLEVEL9K_CHANGESET_HASH_LENGTH"
fi
VCS_CHANGESET_PREFIX="%F{$VCS_FOREGROUND_COLOR_DARK}$VCS_COMMIT_ICON%0.$VCS_CHANGESET_HASH_LENGTH""i%f "
VCS_CHANGESET_PREFIX="%F{$POWERLEVEL9K_VCS_DARK_FOREGROUND}$(print_icon 'VCS_COMMIT_ICON')%0.$VCS_CHANGESET_HASH_LENGTH""i%f "
fi
zstyle ':vcs_info:*' enable git hg
zstyle ':vcs_info:*' check-for-changes true
VCS_DEFAULT_FORMAT="$VCS_CHANGESET_PREFIX%F{$VCS_FOREGROUND_COLOR}%b%c%u%m%f"
zstyle ':vcs_info:git*:*' formats "%F{$VCS_FOREGROUND_COLOR}$VCS_GIT_ICON%f$VCS_DEFAULT_FORMAT"
zstyle ':vcs_info:hg*:*' formats "%F{$VCS_FOREGROUND_COLOR}$VCS_HG_ICON%f$VCS_DEFAULT_FORMAT"
VCS_DEFAULT_FORMAT="$VCS_CHANGESET_PREFIX%F{$POWERLEVEL9K_VCS_FOREGROUND}%b%c%u%m%f"
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:*' stagedstr " %F{$VCS_FOREGROUND_COLOR}$VCS_STAGED_ICON%f"
zstyle ':vcs_info:*' unstagedstr " %F{$VCS_FOREGROUND_COLOR}$VCS_UNSTAGED_ICON%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"
zstyle ':vcs_info:git*+set-message:*' hooks vcs-detect-changes git-untracked git-aheadbehind git-stash git-remotebranch git-tagname
zstyle ':vcs_info:hg*+set-message:*' hooks vcs-detect-changes
# For Hg, only show the branch name
zstyle ':vcs_info:hg*:*' branchformat "$VCS_BRANCH_ICON%b"
zstyle ':vcs_info:hg*:*' branchformat "$(print_icon 'VCS_BRANCH_ICON')%b"
# The `get-revision` function must be turned on for dirty-check to work for Hg
zstyle ':vcs_info:hg*:*' get-revision true
zstyle ':vcs_info:hg*:*' get-bookmarks true
@ -273,8 +273,21 @@ fi
################################################################
# Prompt Segment Constructors
#
# Methodology behind user-defined variables overwriting colors:
# The first parameter to the segment constructors is the calling function's
# name. From this function name, we strip the "prompt_"-prefix and
# uppercase it. This is then prefixed with "POWERLEVEL9K_" and suffixed
# with either "_BACKGROUND" or "_FOREGROUND", thus giving us the variable
# name. So each new segment is user-overwritable by a variable following
# this naming convention.
################################################################
# The `CURRENT_BG` variable is used to remember what the last BG color used was
# when building the left-hand prompt. Because the RPROMPT is created from
# right-left but reads the opposite, this isn't necessary for the other side.
CURRENT_BG='NONE'
# Begin a left prompt segment
# Takes four arguments:
# * $1: Name of the function that was orginally invoked (mandatory).
@ -285,11 +298,6 @@ fi
# The latter three can be omitted,
left_prompt_segment() {
# Overwrite given background-color by user defined variable for this segment.
# We get as first Parameter the function name, which called this function.
# From the given function name, we strip the "prompt_"-prefix and uppercase it.
# This is, prefixed with "POWERLEVEL9K_" and suffixed with either "_BACKGROUND"
# of "_FOREGROUND", our variable name. So each new Segment should automatically
# be overwritable by a variable following this naming convention.
local BACKGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_BACKGROUND
local BG_COLOR_MODIFIER=${(P)BACKGROUND_USER_VARIABLE}
[[ -n $BG_COLOR_MODIFIER ]] && 2=$BG_COLOR_MODIFIER
@ -304,7 +312,7 @@ left_prompt_segment() {
[[ -n $3 ]] && fg="%F{$3}" || fg="%f"
if [[ $CURRENT_BG != 'NONE' && $2 != $CURRENT_BG ]]; then
# Middle segment
echo -n "%{$bg%F{$CURRENT_BG}%}$LEFT_SEGMENT_SEPARATOR%{$fg%} "
echo -n "%{$bg%F{$CURRENT_BG}%}$(print_icon 'LEFT_SEGMENT_SEPARATOR')%{$fg%} "
else
# First segment
echo -n "%{$bg%}%{$fg%} "
@ -313,10 +321,10 @@ left_prompt_segment() {
[[ -n $4 ]] && echo -n "$4 "
}
# End the left prompt, closing any open segments
# End the left prompt, closes the final segment.
left_prompt_end() {
if [[ -n $CURRENT_BG ]]; then
echo -n "%{%k%F{$CURRENT_BG}%}$LEFT_SEGMENT_SEPARATOR"
echo -n "%{%k%F{$CURRENT_BG}%}$(print_icon 'LEFT_SEGMENT_SEPARATOR')"
else
echo -n "%{%k%}"
fi
@ -346,12 +354,12 @@ right_prompt_segment() {
local bg fg
[[ -n $2 ]] && bg="%K{$2}" || bg="%k"
[[ -n $3 ]] && fg="%F{$3}" || fg="%f"
echo -n "%f%F{$2}$RIGHT_SEGMENT_SEPARATOR%f%{$bg%}%{$fg%} "
echo -n "%f%F{$2}$(print_icon 'RIGHT_SEGMENT_SEPARATOR')%f%{$bg%}%{$fg%} "
[[ -n $4 ]] && echo -n "$4 "
}
################################################################
# The 'vcs' Segment and VCS_INFO hooks / helper functions
# The `vcs` Segment and VCS_INFO hooks / helper functions
################################################################
prompt_vcs() {
local vcs_prompt="${vcs_info_msg_0_}"
@ -370,7 +378,7 @@ prompt_vcs() {
function +vi-git-untracked() {
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' && \
-n $(git ls-files --others --exclude-standard | sed q) ]]; then
hook_com[unstaged]+=" %F{$VCS_FOREGROUND_COLOR}$VCS_UNTRACKED_ICON%f"
hook_com[unstaged]+=" %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_UNTRACKED_ICON')%f"
fi
}
@ -383,12 +391,12 @@ function +vi-git-aheadbehind() {
# for git prior to 1.7
# ahead=$(git rev-list origin/${branch_name}..HEAD | wc -l)
ahead=$(git rev-list ${branch_name}@{upstream}..HEAD 2>/dev/null | wc -l)
(( $ahead )) && gitstatus+=( " %F{$VCS_FOREGROUND_COLOR}$VCS_OUTGOING_CHANGES${ahead// /}%f" )
(( $ahead )) && gitstatus+=( " %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_OUTGOING_CHANGES_ICON')${ahead// /}%f" )
# for git prior to 1.7
# behind=$(git rev-list HEAD..origin/${branch_name} | wc -l)
behind=$(git rev-list HEAD..${branch_name}@{upstream} 2>/dev/null | wc -l)
(( $behind )) && gitstatus+=( " %F{$VCS_FOREGROUND_COLOR}$VCS_INCOMING_CHANGES${behind// /}%f" )
(( $behind )) && gitstatus+=( " %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_INCOMING_CHANGES_ICON')${behind// /}%f" )
hook_com[misc]+=${(j::)gitstatus}
}
@ -400,12 +408,12 @@ function +vi-git-remotebranch() {
remote=${$(git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)/refs\/(remotes|heads)\/}
branch_name=${$(git symbolic-ref --short HEAD 2>/dev/null)}
hook_com[branch]="%F{$VCS_FOREGROUND_COLOR}$VCS_BRANCH_ICON${hook_com[branch]}%f"
hook_com[branch]="%F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_BRANCH_ICON')${hook_com[branch]}%f"
# Always show the remote
#if [[ -n ${remote} ]] ; then
# Only show the remote if it differs from the local
if [[ -n ${remote} && ${remote#*/} != ${branch_name} ]] ; then
hook_com[branch]+="%F{$VCS_FOREGROUND_COLOR}$VCS_REMOTE_BRANCH_ICON%f%F{$VCS_FOREGROUND_COLOR}${remote// /}%f"
hook_com[branch]+="%F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_REMOTE_BRANCH_ICON')%f%F{$POWERLEVEL9K_VCS_FOREGROUND}${remote// /}%f"
fi
}
@ -413,7 +421,7 @@ function +vi-git-tagname() {
local tag
tag=$(git describe --tags --exact-match HEAD 2>/dev/null)
[[ -n "${tag}" ]] && hook_com[branch]=" %F{$VCS_FOREGROUND_COLOR}$VCS_TAG_ICON${tag}%f"
[[ -n "${tag}" ]] && hook_com[branch]=" %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_TAG_ICON')${tag}%f"
}
# Show count of stashed changes
@ -423,17 +431,16 @@ function +vi-git-stash() {
if [[ -s $(git rev-parse --git-dir)/refs/stash ]] ; then
stashes=$(git stash list 2>/dev/null | wc -l)
hook_com[misc]+=" %F{$VCS_FOREGROUND_COLOR}$VCS_STASH_ICON${stashes// /}%f"
hook_com[misc]+=" %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_STASH_ICON')${stashes// /}%f"
fi
}
function +vi-hg-bookmarks() {
if [[ -n "${hgbmarks[@]}" ]]; then
hook_com[hg-bookmark-string]=" %F{$VCS_FOREGROUND_COLOR}$VCS_BOOKMARK_ICON${hgbmarks[@]}%f"
hook_com[hg-bookmark-string]=" %F{$POWERLEVEL9K_VCS_FOREGROUND}$(print_icon 'VCS_BOOKMARK_ICON')${hgbmarks[@]}%f"
# And to signal, that we want to use the sting we just generated,
# set the special variable `ret' to something other than the default
# zero:
# To signal that we want to use the sting we just generated, set the special
# variable `ret' to something other than the default zero:
ret=1
return 0
fi
@ -448,7 +455,7 @@ function +vi-vcs-detect-changes() {
}
################################################################
# Prompt Segments
# Prompt Segment Definitions
################################################################
# The `CURRENT_BG` variable is used to remember what the last BG color used was
@ -461,7 +468,7 @@ prompt_aws() {
local aws_profile="$AWS_DEFAULT_PROFILE"
if [[ -n "$aws_profile" ]];
then
$1_prompt_segment "$0" red white "$AWS_ICON $aws_profile"
$1_prompt_segment "$0" red white "$(print_icon 'AWS_ICON') $aws_profile"
fi
}
@ -482,11 +489,22 @@ prompt_context() {
prompt_dir() {
local current_path='%~'
if [[ -n "$POWERLEVEL9K_SHORTEN_DIR_LENGTH" ]]; then
# shorten path to $POWERLEVEL9K_SHORTEN_DIR_LENGTH
current_path="%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:.../:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c"
case "$POWERLEVEL9K_SHORTEN_STRATEGY" in
truncate_middle)
current_path=$(pwd | sed -e "s,^$HOME,~," | sed $SED_EXTENDED_REGEX_PARAMETER "s/([^/]{$POWERLEVEL9K_SHORTEN_DIR_LENGTH})[^/]+([^/]{$POWERLEVEL9K_SHORTEN_DIR_LENGTH})\//\1\.\.\2\//g")
;;
truncate_from_right)
current_path=$(pwd | sed -e "s,^$HOME,~," | sed $SED_EXTENDED_REGEX_PARAMETER "s/([^/]{$POWERLEVEL9K_SHORTEN_DIR_LENGTH})[^/]+\//\1..\//g")
;;
*)
current_path="%$((POWERLEVEL9K_SHORTEN_DIR_LENGTH+1))(c:.../:)%${POWERLEVEL9K_SHORTEN_DIR_LENGTH}c"
;;
esac
fi
$1_prompt_segment "$0" "blue" "$DEFAULT_COLOR" "$current_path"
$1_prompt_segment "$0" "blue" "$DEFAULT_COLOR" "$(print_icon 'HOME_ICON') $current_path"
}
# Command number (in local history)
@ -494,6 +512,16 @@ prompt_history() {
$1_prompt_segment "$0" "244" "$DEFAULT_COLOR" '%h'
}
prompt_icons_test() {
for key in "${(@k)icons}"; do
# The lower color spectrum in ZSH makes big steps. Choosing
# the next color has enough contrast to read.
local random_color=$((RANDOM % 8))
local next_color=$((random_color+1))
$1_prompt_segment "$0" "$random_color" "$next_color" "$key: ${icons[$key]}"
done
}
# 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.
@ -505,12 +533,12 @@ prompt_longstatus() {
symbols+="%F{226}%? ↵"
bg="009"
else
symbols+="%{%F{"046"}%}$OK_ICON"
symbols+="%{%F{"046"}%}$(print_icon 'OK_ICON')"
bg="008"
fi
[[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%} $ROOT_ICON"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$BACKGROUND_JOBS_ICON"
[[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%} $(print_icon 'ROOT_ICON')"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$(print_icon 'BACKGROUND_JOBS_ICON')"
[[ -n "$symbols" ]] && $1_prompt_segment "$0" "$bg" "$DEFAULT_COLOR" "$symbols"
}
@ -519,9 +547,8 @@ prompt_longstatus() {
prompt_node_version() {
local nvm_prompt=$(node -v 2>/dev/null)
[[ -z "${nvm_prompt}" ]] && return
NODE_ICON=$'\U2B22' # ⬢
$1_prompt_segment "$0" "green" "white" "${nvm_prompt:1} $NODE_ICON"
$1_prompt_segment "$0" "green" "white" "${nvm_prompt:1} $(print_icon 'NODE_ICON')"
}
# print a little OS icon
@ -542,7 +569,7 @@ prompt_rspec_stats() {
local code_amount=$(ls -1 app/**/*.rb | wc -l)
local tests_amount=$(ls -1 spec/**/*.rb | wc -l)
build_test_stats "$1" $0 "$code_amount" $tests_amount "RSpec $TEST_ICON"
build_test_stats "$1" $0 "$code_amount" $tests_amount "RSpec $(print_icon 'TEST_ICON')"
fi
}
@ -551,7 +578,7 @@ prompt_rvm() {
local rvm_prompt
rvm_prompt=`rvm-prompt`
if [ "$rvm_prompt" != "" ]; then
$1_prompt_segment "$0" "240" "$DEFAULT_COLOR" "$rvm_prompt $RUBY_ICON "
$1_prompt_segment "$0" "240" "$DEFAULT_COLOR" "$rvm_prompt $(print_icon 'RUBY_ICON') "
fi
}
@ -560,9 +587,9 @@ prompt_rvm() {
prompt_status() {
local symbols
symbols=()
[[ "$RETVAL" -ne 0 ]] && symbols+="%{%F{red}%}$FAIL_ICON"
[[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%} $ROOT_ICON"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$BACKGROUND_JOBS_ICON"
[[ "$RETVAL" -ne 0 ]] && symbols+="%{%F{red}%}$(print_icon 'FAIL_ICON')"
[[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%} $(print_icon 'ROOT_ICON')"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$(print_icon 'BACKGROUND_JOBS_ICON')"
[[ -n "$symbols" ]] && $1_prompt_segment "$0" "$DEFAULT_COLOR" "default" "$symbols"
}
@ -573,7 +600,7 @@ prompt_symfony2_tests() {
local code_amount=$(ls -1 src/**/*.php | grep -v Tests | wc -l)
local tests_amount=$(ls -1 src/**/*.php | grep Tests | wc -l)
build_test_stats "$1" "$0" "$code_amount" "$tests_amount" "SF2 $TEST_ICON"
build_test_stats "$1" "$0" "$code_amount" "$tests_amount" "SF2 $(print_icon 'TEST_ICON')"
fi
}
@ -581,7 +608,7 @@ prompt_symfony2_tests() {
prompt_symfony2_version() {
if [[ -f app/bootstrap.php.cache ]]; then
local symfony2_version=$(grep " VERSION " app/bootstrap.php.cache | sed -e 's/[^.0-9]*//g')
$1_prompt_segment "$0" "240" "$DEFAULT_COLOR" "$SYMFONY_ICON $symfony2_version"
$1_prompt_segment "$0" "240" "$DEFAULT_COLOR" "$(print_icon 'SYMFONY_ICON') $symfony2_version"
fi
}
@ -628,9 +655,7 @@ prompt_virtualenv() {
build_left_prompt() {
RETVAL=$?
if [[ "${#POWERLEVEL9K_LEFT_PROMPT_ELEMENTS}" == 0 ]]; then
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir rbenv vcs)
fi
defined POWERLEVEL9K_LEFT_PROMPT_ELEMENTS || POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(context dir rbenv vcs)
for element in $POWERLEVEL9K_LEFT_PROMPT_ELEMENTS; do
prompt_$element "left"
@ -643,9 +668,7 @@ build_left_prompt() {
build_right_prompt() {
RETVAL=$?
if [[ "${#POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS}" == 0 ]]; then
POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(longstatus history time)
fi
defined POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS || POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(longstatus history time)
for element in $POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS; do
prompt_$element "right"
@ -653,6 +676,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)
@ -666,11 +697,8 @@ powerlevel9k_init() {
add-zsh-hook precmd vcs_info
if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then
[[ -n $POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX ]] || POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX="╭─"
[[ -n $POWERLEVEL9K_MULTILINE_SECOND_PROMPT_PREFIX ]] || POWERLEVEL9K_MULTILINE_SECOND_PROMPT_PREFIX="╰─ "
PROMPT="$POWERLEVEL9K_MULTILINE_FIRST_PROMPT_PREFIX%{%f%b%k%}"'$(build_left_prompt)'"
$POWERLEVEL9K_MULTILINE_SECOND_PROMPT_PREFIX"
PROMPT="$(print_icon 'MULTILINE_FIRST_PROMPT_PREFIX')%{%f%b%k%}"'$(build_left_prompt)'"
$(print_icon 'MULTILINE_SECOND_PROMPT_PREFIX')"
# 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
# the RPROMPT, we advise it, to go one line up. At the end of RPROMPT, we