Skip to content
This repository has been archived by the owner on Apr 24, 2020. It is now read-only.

More flexible colorsettings #29

Merged
merged 10 commits into from
Jun 4, 2015
41 changes: 41 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,47 @@ Light'](https://github.com/altercation/solarized) users. Check it out:

![](http://bhilburn.org/content/images/2015/03/solarized-light.png)

#### Further color customizations

For every segment you can specify foreground and background color by setting them in your `~/.zshrc`:

POWERLEVEL9K_TIME_FOREGROUND='red'
POWERLEVEL9K_TIME_BACKGROUND='blue'

This will change the appearance of the `time` segment. Take the segment names from the Chapter `Segment Customization`.
Some of the Segments have special color variables, as they change the colors according some internal rules. These Segments are `vcs`, `rspec_stats`, `symfony2_tests`:

POWERLEVEL9K_VCS_FOREGROUND='blue'
POWERLEVEL9K_VCS_DARK_FOREGROUND='black'
POWERLEVEL9K_VCS_BACKGROUND='green'
# If VCS changes are detected:
POWERLEVEL9K_VCS_MODIFIED_FOREGROUND='red'
POWERLEVEL9K_VCS_MODIFIED_BACKGROUND='cyan'
# rspec_stats for good test coverage
POWERLEVEL9K_RSPEC_STATS_GOOD_FOREGROUND='blue'
POWERLEVEL9K_RSPEC_STATS_GOOD_BACKGROUND='green'
# rspec_stats for average test coverage
POWERLEVEL9K_RSPEC_STATS_AVG_FOREGROUND='black'
POWERLEVEL9K_RSPEC_STATS_AVG_BACKGROUND='cyan'
# rspec_stats for poor test coverage
POWERLEVEL9K_RSPEC_STATS_BAD_FOREGROUND='red'
POWERLEVEL9K_RSPEC_STATS_BAD_BACKGROUND='white'
# symfony2_tests for good test coverage
POWERLEVEL9K_SYMFONY2_TESTS_GOOD_FOREGROUND='blue'
POWERLEVEL9K_SYMFONY2_TESTS_GOOD_BACKGROUND='green'
# symfony2_tests for average test coverage
POWERLEVEL9K_SYMFONY2_TESTS_AVG_FOREGROUND='black'
POWERLEVEL9K_SYMFONY2_TESTS_AVG_BACKGROUND='cyan'
# symfony2_tests for poor test coverage
POWERLEVEL9K_SYMFONY2_TESTS_BAD_FOREGROUND='red'
POWERLEVEL9K_SYMFONY2_TESTS_BAD_BACKGROUND='white'

You could also use a colorcode as value. Example:

POWERLEVEL9K_VCS_FOREGROUND='021' # Dark blue

For a full list of supported colors just type `spectrum_ls` in your terminal to see all possibilities.

### Troubleshooting

Here are some fixes to some common problems.
Expand Down
142 changes: 92 additions & 50 deletions powerlevel9k.zsh-theme
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,19 @@ else
DEFAULT_COLOR_DARK="236"
fi

# Unfortunately the foreground colors for the VCS segment have
# to be overwritten at this point.
# Overwrite given foreground-color by user defined variable for this segment.
local VCS_FOREGROUND_COLOR=$DEFAULT_COLOR
local VCS_FOREGROUND_USER_VARIABLE=POWERLEVEL9K_VCS_FOREGROUND
local VCS_FG_COLOR_MODIFIER=${(P)VCS_FOREGROUND_USER_VARIABLE}
[[ -n $VCS_FG_COLOR_MODIFIER ]] && VCS_FOREGROUND_COLOR=$VCS_FG_COLOR_MODIFIER

local VCS_FOREGROUND_COLOR_DARK=$DEFAULT_COLOR_DARK
local VCS_FOREGROUND_USER_VARIABLE_DARK=POWERLEVEL9K_VCS_DARK_FOREGROUND
local VCS_FG_DARK_COLOR_MODIFIER=${(P)VCS_FOREGROUND_USER_VARIABLE_DARK}
[[ -n $VCS_FG_DARK_COLOR_MODIFIER ]] && VCS_FOREGROUND_COLOR_DARK=$VCS_FG_DARK_COLOR_MODIFIER

################################################################
# VCS Information Settings
################################################################
Expand All @@ -86,17 +99,17 @@ if [[ "$POWERLEVEL9K_SHOW_CHANGESET" == true ]]; then
VCS_CHANGESET_HASH_LENGTH=$POWERLEVEL9K_CHANGESET_HASH_LENGTH
fi

VCS_CHANGESET_PREFIX="%F{$DEFAULT_COLOR_DARK}%0.$VCS_CHANGESET_HASH_LENGTH""i@%f"
VCS_CHANGESET_PREFIX="%F{$VCS_FOREGROUND_COLOR_DARK}%0.$VCS_CHANGESET_HASH_LENGTH""i@%f"
fi

zstyle ':vcs_info:*' enable git hg
zstyle ':vcs_info:*' check-for-changes true

zstyle ':vcs_info:*' formats " $VCS_CHANGESET_PREFIX%F{$DEFAULT_COLOR}%b%c%u%m%f"
zstyle ':vcs_info:*' formats " $VCS_CHANGESET_PREFIX%F{$VCS_FOREGROUND_COLOR}%b%c%u%m%f"
zstyle ':vcs_info:*' actionformats " %b %F{red}| %a%f"

zstyle ':vcs_info:*' stagedstr " %F{$DEFAULT_COLOR}$VCS_STAGED_ICON%f"
zstyle ':vcs_info:*' unstagedstr " %F{$DEFAULT_COLOR}$VCS_UNSTAGED_ICON%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:git*+set-message:*' hooks git-untracked git-aheadbehind git-stash git-remotebranch git-tagname

Expand Down Expand Up @@ -127,16 +140,35 @@ fi
# Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground.
left_prompt_segment() {
# Unfortunately that doesn't work. But it should. The Example in
# http://zsh.sourceforge.net/FAQ/zshfaq03.html#l39 is quite similar.
# local BG_COLOR_MODIFIER=${(P)POWERLEVEL9K_${(U)1#prompt_}_BACKGROUND}

# 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

# Overwrite given foreground-color by user defined variable for this segment.
local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_FOREGROUND
local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE}
[[ -n $FG_COLOR_MODIFIER ]] && 3=$FG_COLOR_MODIFIER

local bg fg
[[ -n $1 ]] && bg="%K{$1}" || bg="%k"
[[ -n $2 ]] && fg="%F{$2}" || fg="%f"
if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then
[[ -n $2 ]] && bg="%K{$2}" || bg="%k"
[[ -n $3 ]] && fg="%F{$3}" || fg="%f"
if [[ $CURRENT_BG != 'NONE' && $2 != $CURRENT_BG ]]; then
echo -n "%{$bg%F{$CURRENT_BG}%}$LEFT_SEGMENT_SEPARATOR%{$fg%} "
else
echo -n "%{$bg%}%{$fg%} "
fi
CURRENT_BG=$1
[[ -n $3 ]] && echo -n $3
CURRENT_BG=$2
[[ -n $4 ]] && echo -n $4
}

# End the left prompt, closing any open segments
Expand All @@ -155,11 +187,21 @@ left_prompt_end() {
# rendering default background/foreground. No ending for the right prompt
# segment is needed (unlike the left prompt, above).
right_prompt_segment() {
# Overwrite given background-color by user defined variable for this segment.
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

# Overwrite given foreground-color by user defined variable for this segment.
local FOREGROUND_USER_VARIABLE=POWERLEVEL9K_${(U)1#prompt_}_FOREGROUND
local FG_COLOR_MODIFIER=${(P)FOREGROUND_USER_VARIABLE}
[[ -n $FG_COLOR_MODIFIER ]] && 3=$FG_COLOR_MODIFIER

local bg fg
[[ -n $1 ]] && bg="%K{$1}" || bg="%k"
[[ -n $2 ]] && fg="%F{$2}" || fg="%f"
echo -n " %f%F{$1}$RIGHT_SEGMENT_SEPARATOR%f%{$bg%}%{$fg%} "
[[ -n $3 ]] && echo -n $3
[[ -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%} "
[[ -n $4 ]] && echo -n $4
}

################################################################
Expand All @@ -170,19 +212,19 @@ prompt_vcs() {

if [[ -n $vcs_prompt ]]; then
if [[ "$VCS_WORKDIR_DIRTY" == true ]]; then
$1_prompt_segment yellow $DEFAULT_COLOR
$1_prompt_segment $0_MODIFIED yellow $DEFAULT_COLOR
else
$1_prompt_segment green $DEFAULT_COLOR
$1_prompt_segment $0 green $DEFAULT_COLOR
fi

echo -n "%F{$DEFAULT_COLOR}%f$vcs_prompt"
echo -n "%F{$VCS_FOREGROUND_COLOR}%f$vcs_prompt"
fi
}

function +vi-git-untracked() {
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' && \
$(git ls-files --others --exclude-standard | sed q | wc -l | tr -d ' ') != 0 ]]; then
hook_com[unstaged]+=" %F{$DEFAULT_COLOR}?%f"
hook_com[unstaged]+=" %F{$VCS_FOREGROUND_COLOR}?%f"
fi
}

Expand All @@ -195,12 +237,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 | tr -d ' ')
(( $ahead )) && gitstatus+=( " %F{$DEFAULT_COLOR}↑${ahead// /}%f" )
(( $ahead )) && gitstatus+=( " %F{$VCS_FOREGROUND_COLOR}↑${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 | tr -d ' ')
(( $behind )) && gitstatus+=( " %F{$DEFAULT_COLOR}↓${behind// /}%f" )
(( $behind )) && gitstatus+=( " %F{$VCS_FOREGROUND_COLOR}↓${behind// /}%f" )

hook_com[misc]+=${(j::)gitstatus}
}
Expand All @@ -212,20 +254,20 @@ 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{$DEFAULT_COLOR}${hook_com[branch]}%f"
hook_com[branch]="%F{$VCS_FOREGROUND_COLOR}${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{$DEFAULT_COLOR}→%f%F{$DEFAULT_COLOR}${remote// /}%f"
hook_com[branch]+="%F{$VCS_FOREGROUND_COLOR}→%f%F{$VCS_FOREGROUND_COLOR}${remote// /}%f"
fi
}

function +vi-git-tagname() {
local tag

tag=$(git describe --tags --exact-match HEAD 2>/dev/null)
[[ -n ${tag} ]] && hook_com[branch]=" %F{$DEFAULT_COLOR}${tag}%f"
[[ -n ${tag} ]] && hook_com[branch]=" %F{$VCS_FOREGROUND_COLOR}${tag}%f"
}

# Show count of stashed changes
Expand All @@ -235,20 +277,20 @@ 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{$DEFAULT_COLOR}⍟${stashes// /}%f"
hook_com[misc]+=" %F{$VCS_FOREGROUND_COLOR}⍟${stashes// /}%f"
fi
}

function +vi-hg-bookmarks() {
if [[ -n "${hgbmarks[@]}" ]]; then
hook_com[hg-bookmark-string]=" ☿ ${hgbmarks[@]}"

# 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:
ret=1
return 0
fi
if [[ -n "${hgbmarks[@]}" ]]; then
hook_com[hg-bookmark-string]=" ☿ ${hgbmarks[@]}"

# 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:
ret=1
return 0
fi
}

function +vi-vcs-detect-changes() {
Expand All @@ -268,26 +310,26 @@ prompt_aws() {
local aws_profile=$AWS_DEFAULT_PROFILE
if [[ -n $aws_profile ]];
then
$1_prompt_segment red white "AWS: $aws_profile"
$1_prompt_segment $0 red white "AWS: $aws_profile"
fi
}

# Context: user@hostname (who am I and where am I)
# Note that if $DEFAULT_USER is not set, this prompt segment will always print
prompt_context() {
if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
$1_prompt_segment $DEFAULT_COLOR "011" "%(!.%{%F{yellow}%}.)$USER@%m"
$1_prompt_segment $0 $DEFAULT_COLOR "011" "%(!.%{%F{yellow}%}.)$USER@%m"
fi
}

# Dir: current working directory
prompt_dir() {
$1_prompt_segment blue $DEFAULT_COLOR '%~'
$1_prompt_segment $0 blue $DEFAULT_COLOR '%~'
}

# Command number (in local history)
prompt_history() {
$1_prompt_segment "244" $DEFAULT_COLOR '%h'
$1_prompt_segment $0 "244" $DEFAULT_COLOR '%h'
}

# Right Status: (return code, root status, background jobs)
Expand All @@ -308,13 +350,13 @@ prompt_longstatus() {
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙"

[[ -n "$symbols" ]] && $1_prompt_segment $bg $DEFAULT_COLOR "$symbols"
[[ -n "$symbols" ]] && $1_prompt_segment $0 $bg $DEFAULT_COLOR "$symbols"
}

# rbenv information
prompt_rbenv() {
if [[ -n "$RBENV_VERSION" ]]; then
$1_prompt_segment red $DEFAULT_COLOR "$RBENV_VERSION"
$1_prompt_segment $0 red $DEFAULT_COLOR "$RBENV_VERSION"
fi
}

Expand All @@ -324,7 +366,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 $code_amount $tests_amount "RSpec"
build_test_stats $1 $0 $code_amount $tests_amount "RSpec"
fi
}

Expand All @@ -333,7 +375,7 @@ prompt_rvm() {
local rvm_prompt
rvm_prompt=`rvm-prompt`
if [ "$rvm_prompt" != "" ]; then
$1_prompt_segment "240" $DEFAULT_COLOR "$rvm_prompt "
$1_prompt_segment $0 "240" $DEFAULT_COLOR "$rvm_prompt "
fi
}

Expand All @@ -346,7 +388,7 @@ prompt_status() {
[[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙"

[[ -n "$symbols" ]] && $1_prompt_segment $DEFAULT_COLOR default "$symbols"
[[ -n "$symbols" ]] && $1_prompt_segment $0 $DEFAULT_COLOR default "$symbols"
}

# Symfony2-PHPUnit test ratio
Expand All @@ -355,23 +397,23 @@ 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 $code_amount $tests_amount "SF2-Tests"
build_test_stats $1 $0 $code_amount $tests_amount "SF2-Tests"
fi
}

# Show a ratio of tests vs code
build_test_stats() {
local code_amount=$2
local tests_amount=$3+0.00001
local headline=$4
local code_amount=$3
local tests_amount=$4+0.00001
local headline=$5

# Set float precision to 2 digits:
typeset -F 2 ratio
local ratio=$(( (tests_amount/code_amount) * 100 ))

[[ ratio -ge 0.75 ]] && $1_prompt_segment cyan $DEFAULT_COLOR "$headline: $ratio%%"
[[ ratio -ge 0.5 && ratio -lt 0.75 ]] && $1_prompt_segment yellow $DEFAULT_COLOR "$headline: $ratio%%"
[[ ratio -lt 0.5 ]] && $1_prompt_segment red $DEFAULT_COLOR "$headline: $ratio%%"
[[ ratio -ge 0.75 ]] && $1_prompt_segment ${2}_GOOD cyan $DEFAULT_COLOR "$headline: $ratio%%"
[[ ratio -ge 0.5 && ratio -lt 0.75 ]] && $1_prompt_segment $2_AVG yellow $DEFAULT_COLOR "$headline: $ratio%%"
[[ ratio -lt 0.5 ]] && $1_prompt_segment $2_BAD red $DEFAULT_COLOR "$headline: $ratio%%"
}

# System time
Expand All @@ -381,7 +423,7 @@ prompt_time() {
time_format=$POWERLEVEL9K_TIME_FORMAT
fi

$1_prompt_segment $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$time_format "
$1_prompt_segment $0 $DEFAULT_COLOR_INVERTED $DEFAULT_COLOR "$time_format "
}

# Virtualenv: current working virtualenv
Expand All @@ -390,7 +432,7 @@ prompt_time() {
prompt_virtualenv() {
local virtualenv_path="$VIRTUAL_ENV"
if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then
$1_prompt_segment blue $DEFAULT_COLOR "(`basename $virtualenv_path`)"
$1_prompt_segment $0 blue $DEFAULT_COLOR "(`basename $virtualenv_path`)"
fi
}

Expand Down