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

Merge branch 'master' into dritter/prezto

This commit is contained in:
Dominik Ritter 2015-06-09 17:08:09 +02:00
commit 1e31869e13
2 changed files with 416 additions and 110 deletions

199
README.md
View file

@ -7,7 +7,37 @@ giving you the most epic terminal styling in the universe.
Look like a bad-ass. Impress everyone in 'Screenshot Your Desktop' threads. Use powerlevel9k. Look like a bad-ass. Impress everyone in 'Screenshot Your Desktop' threads. Use powerlevel9k.
In addition to looking amazing, this theme actually provides a lot of useful In addition to looking amazing, this theme actually provides a lot of useful
information in configurable prompt segments. information in configurable prompt segments. Here is an example of what it looks
like with a normal installation and default settings:
![](http://bhilburn.org/content/images/2015/01/pl9k-improved.png)
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
- [Features](#features)
- [Installation](#installation)
- [Install Powerlevel9k](#install-powerlevel9k)
- [Install Powerline Fonts for Normal Configuration](#install-powerline-fonts-for-normal-configuration)
- [Alternative Configuration: Über](#alternative-configuration-%C3%BCber)
- [Alternative Configuration: Bare Bones](#alternative-configuration-bare-bones)
- [Segment Customization](#segment-customization)
- [The AWS Profile Segment](#the-aws-profile-segment)
- [The 'context' Segment](#the-context-segment)
- [The 'time' segment](#the-time-segment)
- [Unit Test Ratios](#unit-test-ratios)
- [The 'vcs' Segment](#the-vcs-segment)
- [Symbols](#symbols)
- [Styling](#styling)
- [Double-Lined Prompt](#double-lined-prompt)
- [Light Color Theme](#light-color-theme)
- [Further color customizations](#further-color-customizations)
- [Troubleshooting](#troubleshooting)
- [Gaps Between Segments](#gaps-between-segments)
- [Contributions / Bugs / Contact](#contributions--bugs--contact)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
### Features ### Features
@ -31,22 +61,36 @@ information in configurable prompt segments.
doesn't require Powerline fonts, check out the sister font, doesn't require Powerline fonts, check out the sister font,
[hackersaurus](https://github.com/bhilburn/hackersaurus).** [hackersaurus](https://github.com/bhilburn/hackersaurus).**
Here are some screenshots of `powerlevel9k` with default settings: Here is a detailed screenshot showing `powerlevel9k` with default settings and
varying terminal status indicators:
![](http://bhilburn.org/content/images/2014/12/powerlevel9k.png) ![](http://bhilburn.org/content/images/2014/12/powerlevel9k.png)
![](http://bhilburn.org/content/images/2015/01/pl9k-improved.png)
### Installation ### Installation
There are three different forms of installation that you can use to make use of
this theme:
There are two things you need to make this theme work correctly: Powerline * Normal - Theme + Powerline Fonts
fonts, and the theme itself. * Über - Theme + Awesome Powerline Fonts
* Bare Bones - Theme Only
#### Install Powerline Fonts #### Install Powerlevel9k
First, you need to install Powerline Fonts. You can find the [installation
instructions To install this theme, clone this repository into your Oh-My-Zsh `custom/themes`
here](https://powerline.readthedocs.org/en/latest/installation/linux.html#fonts-installation). directory.
$ cd ~/.oh-my-zsh/custom
$ git clone https://github.com/bhilburn/powerlevel9k.git themes/powerlevel9k
You then need to select this theme in your `~/.zshrc`:
ZSH_THEME="powerlevel9k/powerlevel9k"
#### Install Powerline Fonts for Normal Configuration
You can find the [installation instructions for Powerline Fonts here]
(https://powerline.readthedocs.org/en/latest/installation/linux.html#fonts-installation).
You can also find the raw font files [in this Github You can also find the raw font files [in this Github
repository](https://github.com/powerline/fonts) if you want to manually install repository](https://github.com/powerline/fonts) if you want to manually install
them for your OS. them for your OS.
@ -54,6 +98,9 @@ them for your OS.
After you have installed Powerline fonts, make the default font in your terminal After you have installed Powerline fonts, make the default font in your terminal
emulator the Powerline font you want to use. emulator the Powerline font you want to use.
This is the default mode for `Powerlevel9k`, and no further configuration is
necessary.
#### Install Powerlevel9k #### Install Powerlevel9k
##### Within Oh-my-ZSH ##### Within Oh-my-ZSH
@ -81,6 +128,45 @@ You then need to select this theme in your `~/.zpreztorc`:
zstyle ':prezto:module:prompt' theme 'powerlevel9k' zstyle ':prezto:module:prompt' theme 'powerlevel9k'
#### Alternative Configuration: Über
Alternatively, you can install [Awesome Powerline
Fonts](https://github.com/gabrielelana/awesome-terminal-fonts), which provide
a number of additional glyphs.
You then need to indicate that you wish to use the additional glyphs by defining
the following in your `~/.zshrc`:
POWERLEVEL9K_MODE='awesome-patched'
If you choose to make use of this, your prompt will look something like this:
![](https://cloud.githubusercontent.com/assets/1544760/7959660/67612918-09fb-11e5-9ef2-2308363c3c51.png)
Note that if you prefer flat segment transitions, you can use the following with
`Awesome Powerline Fonts` installed:
POWERLEVEL9K_MODE='flat'
Which looks like this:
![](https://cloud.githubusercontent.com/assets/1544760/7981324/76d0eb5a-0aae-11e5-9608-d662123d0b0a.png)
#### Alternative Configuration: Bare Bones
This option is best if you prefer not to install additional fonts. This option
will work out-of-the-box if your your terminal font supports the segment
separator characters `\uE0B0` (left segment separator) and `\uE0B2` (right
segment separator).
All you need to do to in this case is install the `Powerlevel9k` theme itself,
as explained above, and then define the following in your `~/.zshrc`:
POWERLEVEL9K_MODE='compatible'
Note that depending on your terminal font, this may still not render
appropriately. This configuration should be used as a back-up.
### Segment Customization ### Segment Customization
Customizing your prompt is easy! Select the segments you want to have displayed, Customizing your prompt is easy! Select the segments you want to have displayed,
@ -125,14 +211,6 @@ elements (it is by default), and define a `DEFAULT_USER` in your `~/.zshrc`:
export DEFAULT_USER=<your username> export DEFAULT_USER=<your username>
#### Test ratio
The `symfony2_tests` and `rspec_tests` segments show both a ratio of "real" classes
vs test classes. This is just a very simple ratio, and does not show your code
coverage or any sophisticated stats. All this does is just to count your files
and test files and calculate the ratio between them. Not more, but is may give
a quick overview about the test situation of the project you are dealing with.
#### The 'time' segment #### The 'time' segment
By default the time is show in 'H:M:S' format. If you want to change it, By default the time is show in 'H:M:S' format. If you want to change it,
@ -141,6 +219,15 @@ just set another format in your `~/.zshrc`:
# Reversed time format # Reversed time format
POWERLEVEL9K_TIME_FORMAT='%D{%S:%M:%H}' POWERLEVEL9K_TIME_FORMAT='%D{%S:%M:%H}'
#### Unit Test Ratios
The `symfony2_tests` and `rspec_tests` segments both show a ratio of "real"
classes vs test classes in your source code. This is just a very simple ratio,
and does not show your code coverage or any sophisticated stats. All this does
is count your source files and test files, and calculate the ratio between them.
Just enough to give you a quick overview about the test situation of the project
you are dealing with.
#### The 'vcs' Segment #### The 'vcs' Segment
By default, the `vcs` segment will provide quite a bit of information. If you By default, the `vcs` segment will provide quite a bit of information. If you
@ -157,16 +244,24 @@ Example:
##### Symbols ##### Symbols
The `vcs` segment uses various symbols to tell you the state of your repository: The `vcs` segment uses various symbols to tell you the state of your repository.
These symbols depend on your installed font and selected `POWERLEVEL9K_MODE`
from the [Installation](#Installation) section above.
* `↑4` - The number of commits your repository is ahead of your remote branch | `Bare Bones` | `Normal` | `Über` | explanation
* `↓5` - The number of commits your repository is behind of your remote branch |--------------|---------------------|-------------------|--------------------------
* `⍟3` - The number of stashes, here 3. | `↑4` | `↑4` | ![icon_outgoing](https://cloud.githubusercontent.com/assets/1544760/7976089/b5904d6e-0a76-11e5-8147-5e873ac52d79.gif)4 | Number of commits your repository is ahead of your remote branch
* `●` - There are unstaged changes in your working copy | `↓5` | `↓5` | ![icon_incoming](https://cloud.githubusercontent.com/assets/1544760/7976091/b5909c9c-0a76-11e5-9cad-9bf0a28a897c.gif)5 | Number of commits your repository is behind of your remote branch
* `✚` - There are staged changes in your working copy | `⍟3` | `⍟3` | ![icon_stash](https://cloud.githubusercontent.com/assets/1544760/7976094/b5ae9346-0a76-11e5-8cc7-e98b81824118.gif)3 | Number of stashes, here 3.
* `?` - There are files in your working copy, that are unknown to your repository | `●` | `●` | ![icon_unstaged](https://cloud.githubusercontent.com/assets/1544760/7976096/b5aefa98-0a76-11e5-9408-985440471215.gif) | There are unstaged changes in your working copy
* `→` - The name of your branch differs from its tracking branch. | `✚` | `✚` | ![icon_staged](https://cloud.githubusercontent.com/assets/1544760/7976095/b5aecc8a-0a76-11e5-8988-221afc6e8982.gif) | There are staged changes in your working copy
* `☿` - A mercurial bookmark is active. | `?` | `?` | ![icon_untracked](https://cloud.githubusercontent.com/assets/1544760/7976098/b5c7a2e6-0a76-11e5-8c5b-315b595b2bc4.gif) | There are files in your working copy, that are unknown to your repository
| `→` | `→` | ![icon_remote_tracking_branch](https://cloud.githubusercontent.com/assets/1544760/7976093/b5ad2c0e-0a76-11e5-9cd3-62a077b1b0c7.gif) | The name of your branch differs from its tracking branch.
| `☿` | `☿` | ![icon_bookmark](https://cloud.githubusercontent.com/assets/1544760/7976197/546cfac6-0a78-11e5-88a6-ce3a1e0a174e.gif) | A mercurial bookmark is active.
| `@` | ![icon_branch_powerline](https://cloud.githubusercontent.com/assets/1544760/8000852/e7e8d8a0-0b5f-11e5-9834-de9b25c92284.gif) | ![](https://cloud.githubusercontent.com/assets/1544760/7976087/b58bbe3e-0a76-11e5-8d0d-7a5c1bc7f730.gif) | Branch Icon
| None | None | ![icon_commit](https://cloud.githubusercontent.com/assets/1544760/7976088/b58f4e50-0a76-11e5-9e70-86450d937030.gif)2c3705 | The current commit hash. Here "2c3705"
| None | None | ![icon_git](https://cloud.githubusercontent.com/assets/1544760/7976092/b5909f80-0a76-11e5-9950-1438b9d72465.gif) | Repository is a git repository
| None | None | ![icon_mercurial](https://cloud.githubusercontent.com/assets/1544760/7976090/b5908da6-0a76-11e5-8c91-452b6e73f631.gif) | Repository is a Mercurial repository
### Styling ### Styling
@ -197,6 +292,54 @@ Light'](https://github.com/altercation/solarized) users. Check it out:
![](http://bhilburn.org/content/images/2015/03/solarized-light.png) ![](http://bhilburn.org/content/images/2015/03/solarized-light.png)
#### Further color customizations
For each segment in your prompt, you can specify a foreground and background
color by setting them in your `~/.zshrc`. For example, to change the appearance
of the `time` segment, you would use:
POWERLEVEL9K_TIME_FOREGROUND='red'
POWERLEVEL9K_TIME_BACKGROUND='blue'
Use the segment names from the above section `Segment Customization`. Some of
the Segments have special color variables, as they change the colors according
to some internal rules. These Segments are `vcs`, `rspec_stats`, `symfony2_tests`:
# General VCS color segments:
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 value. Example:
POWERLEVEL9K_VCS_FOREGROUND='021' # Dark blue
For a full list of supported colors, run the `spectrum_ls` program in your
terminal.
### Troubleshooting ### Troubleshooting
Here are some fixes to some common problems. Here are some fixes to some common problems.

View file

@ -8,9 +8,6 @@
# #
# The `vcs_info` hooks in this file are from Tom Upton: # The `vcs_info` hooks in this file are from Tom Upton:
# https://github.com/tupton/dotfiles/blob/master/zsh/zshrc # https://github.com/tupton/dotfiles/blob/master/zsh/zshrc
#
# In order for this theme to render correctly, you will need a Powerline-patched font:
# https://github.com/Lokaltog/powerline-fonts
################################################################ ################################################################
################################################################ ################################################################
@ -43,17 +40,130 @@
# POWERLEVEL9K_COLOR_SCHEME='light' # POWERLEVEL9K_COLOR_SCHEME='light'
################################################################ ################################################################
# The `CURRENT_BG` variable is used to remember what the last BG color used was ## Debugging
# when building the left-hand prompt. Because the RPROMPT is created from #zstyle ':vcs_info:*+*:*' debug true
# right-left but reads the opposite, this isn't necessary for the other side. #set -o xtrace
local CURRENT_BG='NONE'
# These characters require the Powerline fonts to work properly. If see boxes or # These characters require the Powerline fonts to work properly. If see boxes or
# bizarre characters below, your fonts are not correctly installed. # bizarre characters below, your fonts are not correctly installed. If you
LEFT_SEGMENT_SEPARATOR='' # do not want to install a special font, you can set `POWERLEVEL9K_MODE` to
RIGHT_SEGMENT_SEPARATOR='' # `compatible`. This shows all icons in regular symbols.
VCS_UNSTAGED_ICON='●' case $POWERLEVEL9K_MODE in
VCS_STAGED_ICON='✚' 'flat')
# 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" # ✘
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_BRANCH_ICON=''
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" # ✘
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_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" # ✘
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_BRANCH_ICON=''
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" # ✘
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_BRANCH_ICON=''
VCS_REMOTE_BRANCH_ICON="\u2192" # →
VCS_GIT_ICON="\uE0A0" # 
VCS_HG_ICON="\uE0A0" # 
;;
esac
################################################################ ################################################################
# color scheme # color scheme
@ -70,6 +180,17 @@ else
DEFAULT_COLOR_DARK="236" DEFAULT_COLOR_DARK="236"
fi fi
local VCS_FOREGROUND_COLOR=$DEFAULT_COLOR
local 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
################################################################ ################################################################
# VCS Information Settings # VCS Information Settings
################################################################ ################################################################
@ -86,22 +207,25 @@ if [[ "$POWERLEVEL9K_SHOW_CHANGESET" == true ]]; then
VCS_CHANGESET_HASH_LENGTH="$POWERLEVEL9K_CHANGESET_HASH_LENGTH" VCS_CHANGESET_HASH_LENGTH="$POWERLEVEL9K_CHANGESET_HASH_LENGTH"
fi fi
VCS_CHANGESET_PREFIX="%F{$DEFAULT_COLOR_DARK}%0.$VCS_CHANGESET_HASH_LENGTH""i@%f" VCS_CHANGESET_PREFIX="%F{$VCS_FOREGROUND_COLOR_DARK}$VCS_COMMIT_ICON%0.$VCS_CHANGESET_HASH_LENGTH""i%f"
fi fi
zstyle ':vcs_info:*' enable git hg zstyle ':vcs_info:*' enable git hg
zstyle ':vcs_info:*' check-for-changes true zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' formats " $VCS_CHANGESET_PREFIX%F{$DEFAULT_COLOR}%b%c%u%m%f" local 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"
zstyle ':vcs_info:*' actionformats " %b %F{red}| %a%f" zstyle ':vcs_info:*' actionformats " %b %F{red}| %a%f"
zstyle ':vcs_info:*' stagedstr " %F{$DEFAULT_COLOR}$VCS_STAGED_ICON%f" zstyle ':vcs_info:*' stagedstr " %F{$VCS_FOREGROUND_COLOR}$VCS_STAGED_ICON%f"
zstyle ':vcs_info:*' unstagedstr " %F{$DEFAULT_COLOR}$VCS_UNSTAGED_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 zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-aheadbehind git-stash git-remotebranch git-tagname
# For Hg, only show the branch name # For Hg, only show the branch name
zstyle ':vcs_info:hg*:*' branchformat "%b" zstyle ':vcs_info:hg*:*' branchformat "$VCS_BRANCH_ICON%b"
# The `get-revision` function must be turned on for dirty-check to work for Hg # 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-revision true
zstyle ':vcs_info:hg*:*' get-bookmarks true zstyle ':vcs_info:hg*:*' get-bookmarks true
@ -115,9 +239,6 @@ else
zstyle ':vcs_info:*' use-simple true zstyle ':vcs_info:*' use-simple true
fi fi
## Debugging
#zstyle ':vcs_info:*+*:*' debug true
################################################################ ################################################################
# Prompt Segment Constructors # Prompt Segment Constructors
################################################################ ################################################################
@ -125,27 +246,44 @@ fi
# Begin a left prompt segment # Begin a left prompt segment
# Takes two arguments, background and foreground. Both can be omitted, # Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground. # rendering default background/foreground.
function left_prompt_segment { 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
# 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 local bg fg
[[ -n "$1" ]] && bg="%K{$1}" || bg="%k" [[ -n $2 ]] && bg="%K{$2}" || bg="%k"
[[ -n "$2" ]] && fg="%F{$2}" || fg="%f" [[ -n $3 ]] && fg="%F{$3}" || fg="%f"
if [[ "$CURRENT_BG" != 'NONE' && "$1" != "$CURRENT_BG" ]]; then if [[ $CURRENT_BG != 'NONE' && $2 != $CURRENT_BG ]]; then
echo -n "$bg%F{$CURRENT_BG}$LEFT_SEGMENT_SEPARATOR$fg " # Middle segment
echo -n "%{$bg%F{$CURRENT_BG}%}$LEFT_SEGMENT_SEPARATOR%{$fg%} "
else else
echo -n "$bg$fg " # First segment
echo -n "%{$bg%}%{$fg%} "
fi fi
CURRENT_BG="$1" CURRENT_BG=$2
[[ -n "$3" ]] && echo -n "$3" [[ -n $4 ]] && echo -n "$4 "
} }
# End the left prompt, closing any open segments # End the left prompt, closing any open segments
function left_prompt_end { left_prompt_end() {
if [[ -n "$CURRENT_BG" ]]; then if [[ -n $CURRENT_BG ]]; then
echo -n " %k%F{$CURRENT_BG}$LEFT_SEGMENT_SEPARATOR" echo -n "%{%k%F{$CURRENT_BG}%}$LEFT_SEGMENT_SEPARATOR"
else else
echo -n "%k" echo -n "%{%k%}"
fi fi
echo -n "%f" echo -n "%{%f%} "
CURRENT_BG='' CURRENT_BG=''
} }
@ -153,12 +291,22 @@ function left_prompt_end {
# Takes two arguments, background and foreground. Both can be omitted, # Takes two arguments, background and foreground. Both can be omitted,
# rendering default background/foreground. No ending for the right prompt # rendering default background/foreground. No ending for the right prompt
# segment is needed (unlike the left prompt, above). # segment is needed (unlike the left prompt, above).
function right_prompt_segment { 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 local bg fg
[[ -n "$1" ]] && bg="%K{$1}" || bg="%k" [[ -n $2 ]] && bg="%K{$2}" || bg="%k"
[[ -n "$2" ]] && fg="%F{$2}" || fg="%f" [[ -n $3 ]] && fg="%F{$3}" || fg="%f"
echo -n " %f%F{$1}$RIGHT_SEGMENT_SEPARATOR%f%{$bg%}%{$fg%} " echo -n "%f%F{$2}$RIGHT_SEGMENT_SEPARATOR%f%{$bg%}%{$fg%} "
[[ -n "$3" ]] && echo -n "$3" [[ -n $4 ]] && echo -n "$4 "
} }
################################################################ ################################################################
@ -169,19 +317,19 @@ prompt_vcs() {
if [[ -n "$vcs_prompt" ]]; then if [[ -n "$vcs_prompt" ]]; then
if [[ "$VCS_WORKDIR_DIRTY" == true ]]; then if [[ "$VCS_WORKDIR_DIRTY" == true ]]; then
$1_prompt_segment "yellow" "$DEFAULT_COLOR" $1_prompt_segment "$0_MODIFIED" "yellow" "$DEFAULT_COLOR"
else else
$1_prompt_segment "green" "$DEFAULT_COLOR" $1_prompt_segment "$0" "green" "$DEFAULT_COLOR"
fi fi
echo -n "%F{$DEFAULT_COLOR}%f$vcs_prompt" echo -n "%F{$VCS_FOREGROUND_COLOR}%f$vcs_prompt "
fi fi
} }
function +vi-git-untracked() { function +vi-git-untracked() {
if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' && \ 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 $(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}$VCS_UNTRACKED_ICON%f"
fi fi
} }
@ -194,12 +342,12 @@ function +vi-git-aheadbehind() {
# for git prior to 1.7 # for git prior to 1.7
# ahead=$(git rev-list origin/${branch_name}..HEAD | wc -l) # 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=$(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}$VCS_OUTGOING_CHANGES${ahead// /}%f" )
# for git prior to 1.7 # for git prior to 1.7
# behind=$(git rev-list HEAD..origin/${branch_name} | wc -l) # 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=$(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}$VCS_INCOMING_CHANGES${behind// /}%f" )
hook_com[misc]+=${(j::)gitstatus} hook_com[misc]+=${(j::)gitstatus}
} }
@ -211,12 +359,12 @@ function +vi-git-remotebranch() {
remote=${$(git rev-parse --verify HEAD@{upstream} --symbolic-full-name 2>/dev/null)/refs\/(remotes|heads)\/} 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)} 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}$VCS_BRANCH_ICON${hook_com[branch]}%f"
# Always show the remote # Always show the remote
#if [[ -n ${remote} ]] ; then #if [[ -n ${remote} ]] ; then
# Only show the remote if it differs from the local # Only show the remote if it differs from the local
if [[ -n ${remote} && ${remote#*/} != ${branch_name} ]] ; then 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}$VCS_REMOTE_BRANCH_ICON%f%F{$VCS_FOREGROUND_COLOR}${remote// /}%f"
fi fi
} }
@ -224,7 +372,7 @@ function +vi-git-tagname() {
local tag local tag
tag=$(git describe --tags --exact-match HEAD 2>/dev/null) 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}$VCS_TAG_ICON${tag}%f"
} }
# Show count of stashed changes # Show count of stashed changes
@ -234,20 +382,20 @@ function +vi-git-stash() {
if [[ -s $(git rev-parse --git-dir)/refs/stash ]] ; then if [[ -s $(git rev-parse --git-dir)/refs/stash ]] ; then
stashes=$(git stash list 2>/dev/null | wc -l) stashes=$(git stash list 2>/dev/null | wc -l)
hook_com[misc]+=" %F{$DEFAULT_COLOR}⍟${stashes// /}%f" hook_com[misc]+=" %F{$VCS_FOREGROUND_COLOR}$VCS_STASH_ICON${stashes// /}%f"
fi fi
} }
function +vi-hg-bookmarks() { function +vi-hg-bookmarks() {
if [[ -n "${hgbmarks[@]}" ]]; then if [[ -n "${hgbmarks[@]}" ]]; then
hook_com[hg-bookmark-string]=" ☿ ${hgbmarks[@]}" hook_com[hg-bookmark-string]=" %F{$VCS_FOREGROUND_COLOR}$VCS_BOOKMARK_ICON${hgbmarks[@]}%f"
# And to signal, that we want to use the sting we just generated, # And to signal, that we want to use the sting we just generated,
# set the special variable `ret' to something other than the default # set the special variable `ret' to something other than the default
# zero: # zero:
ret=1 ret=1
return 0 return 0
fi fi
} }
function +vi-vcs-detect-changes() { function +vi-vcs-detect-changes() {
@ -262,12 +410,17 @@ function +vi-vcs-detect-changes() {
# Prompt Segments # Prompt Segments
################################################################ ################################################################
# 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'
# AWS Profile # AWS Profile
prompt_aws() { prompt_aws() {
local aws_profile="$AWS_DEFAULT_PROFILE" local aws_profile="$AWS_DEFAULT_PROFILE"
if [[ -n "$aws_profile" ]]; if [[ -n "$aws_profile" ]];
then then
$1_prompt_segment red white "AWS: $aws_profile" $1_prompt_segment "$0" red white "$AWS_ICON $aws_profile"
fi fi
} }
@ -275,18 +428,18 @@ prompt_aws() {
# Note that if $DEFAULT_USER is not set, this prompt segment will always print # Note that if $DEFAULT_USER is not set, this prompt segment will always print
prompt_context() { prompt_context() {
if [[ "$USER" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then 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 fi
} }
# Dir: current working directory # Dir: current working directory
prompt_dir() { prompt_dir() {
$1_prompt_segment "blue" "$DEFAULT_COLOR" '%~' $1_prompt_segment "$0" "blue" "$DEFAULT_COLOR" '%~'
} }
# Command number (in local history) # Command number (in local history)
prompt_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) # Right Status: (return code, root status, background jobs)
@ -300,20 +453,20 @@ prompt_longstatus() {
symbols+="%F{226}%? ↵" symbols+="%F{226}%? ↵"
bg="009" bg="009"
else else
symbols+="%F{046}✓" symbols+="%{%F{"046"}%}$OK_ICON"
bg="008" bg="008"
fi fi
[[ "$UID" -eq 0 ]] && symbols+="%F{yellow}⚡" [[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%} $ROOT_ICON"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%F{cyan}⚙" [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$BACKGROUND_JOBS_ICON"
[[ -n "$symbols" ]] && $1_prompt_segment "$bg" "$DEFAULT_COLOR" "$symbols" [[ -n "$symbols" ]] && $1_prompt_segment "$0" "$bg" "$DEFAULT_COLOR" "$symbols"
} }
# rbenv information # rbenv information
prompt_rbenv() { prompt_rbenv() {
if [[ -n "$RBENV_VERSION" ]]; then if [[ -n "$RBENV_VERSION" ]]; then
$1_prompt_segment "red" "$DEFAULT_COLOR" "$RBENV_VERSION" $1_prompt_segment "$0" "red" "$DEFAULT_COLOR" "$RBENV_VERSION"
fi fi
} }
@ -323,7 +476,7 @@ prompt_rspec_stats() {
local code_amount=$(ls -1 app/**/*.rb | wc -l) local code_amount=$(ls -1 app/**/*.rb | wc -l)
local tests_amount=$(ls -1 spec/**/*.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 $TEST_ICON"
fi fi
} }
@ -332,7 +485,7 @@ prompt_rvm() {
local rvm_prompt local rvm_prompt
rvm_prompt=`rvm-prompt` rvm_prompt=`rvm-prompt`
if [ "$rvm_prompt" != "" ]; then if [ "$rvm_prompt" != "" ]; then
$1_prompt_segment "240" "$DEFAULT_COLOR" "$rvm_prompt " $1_prompt_segment "$0" "240" "$DEFAULT_COLOR" "$rvm_prompt $RUBY_ICON "
fi fi
} }
@ -341,11 +494,11 @@ prompt_rvm() {
prompt_status() { prompt_status() {
local symbols local symbols
symbols=() symbols=()
[[ "$RETVAL" -ne 0 ]] && symbols+="%{%F{red}%}" [[ "$RETVAL" -ne 0 ]] && symbols+="%{%F{red}%}$FAIL_ICON"
[[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%}" [[ "$UID" -eq 0 ]] && symbols+="%{%F{yellow}%} $ROOT_ICON"
[[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}" [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}$BACKGROUND_JOBS_ICON"
[[ -n "$symbols" ]] && $1_prompt_segment "$DEFAULT_COLOR" "default" "$symbols" [[ -n "$symbols" ]] && $1_prompt_segment "$0" "$DEFAULT_COLOR" "default" "$symbols"
} }
# Symfony2-PHPUnit test ratio # Symfony2-PHPUnit test ratio
@ -354,23 +507,23 @@ prompt_symfony2_tests() {
local code_amount=$(ls -1 src/**/*.php | grep -v Tests | wc -l) local code_amount=$(ls -1 src/**/*.php | grep -v Tests | wc -l)
local tests_amount=$(ls -1 src/**/*.php | grep 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 $TEST_ICON"
fi fi
} }
# Show a ratio of tests vs code # Show a ratio of tests vs code
build_test_stats() { build_test_stats() {
local code_amount="$2" local code_amount="$3"
local tests_amount="$3"+0.00001 local tests_amount="$4"+0.00001
local headline="$4" local headline="$5"
# Set float precision to 2 digits: # Set float precision to 2 digits:
typeset -F 2 ratio typeset -F 2 ratio
local ratio=$(( (tests_amount/code_amount) * 100 )) local ratio=$(( (tests_amount/code_amount) * 100 ))
[[ ratio -ge 0.75 ]] && $1_prompt_segment "cyan" "$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 "yellow" "$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 "red" "$DEFAULT_COLOR" "$headline: $ratio%%" [[ ratio -lt 0.5 ]] && $1_prompt_segment "$2_BAD" "red" "$DEFAULT_COLOR" "$headline: $ratio%%"
} }
# System time # System time
@ -380,7 +533,7 @@ prompt_time() {
time_format="$POWERLEVEL9K_TIME_FORMAT" time_format="$POWERLEVEL9K_TIME_FORMAT"
fi 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 # Virtualenv: current working virtualenv
@ -389,7 +542,7 @@ prompt_time() {
prompt_virtualenv() { prompt_virtualenv() {
local virtualenv_path="$VIRTUAL_ENV" local virtualenv_path="$VIRTUAL_ENV"
if [[ -n "$virtualenv_path" && -n "$VIRTUAL_ENV_DISABLE_PROMPT" ]]; then 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 fi
} }
@ -446,10 +599,20 @@ powerlevel9k_init() {
if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then if [[ "$POWERLEVEL9K_PROMPT_ON_NEWLINE" == true ]]; then
PROMPT="╭─%{%f%b%k%}"'$(build_left_prompt)'" PROMPT="╭─%{%f%b%k%}"'$(build_left_prompt)'"
╰─ " ╰─ "
# 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
# advise it to go one line down. See:
# http://superuser.com/questions/357107/zsh-right-justify-in-ps1
RPROMPT_PREFIX='%{'$'\e[1A''%}' # one line up
RPROMPT_SUFFIX='%{'$'\e[1B''%}' # one line down
else else
PROMPT="%{%f%b%k%}"'$(build_left_prompt)'" " PROMPT="%{%f%b%k%}"'$(build_left_prompt)'
RPROMPT_PREFIX=''
RPROMPT_SUFFIX=''
fi fi
RPROMPT="%{%f%b%k%}"'$(build_right_prompt)'"%{$reset_color%}" RPROMPT=$RPROMPT_PREFIX"%{%f%b%k%}"'$(build_right_prompt)'"%{$reset_color%}"$RPROMPT_SUFFIX
} }
powerlevel9k_init "$@" powerlevel9k_init "$@"