# vim:ft=zsh ts=2 sw=2 sts=2 # # agnoster's Theme - https://gist.github.com/3712874 # A Powerline-inspired theme for ZSH # # # README # # In order for this theme to render correctly, you will need a # [Powerline-patched font](https://github.com/Lokaltog/powerline-fonts). # Make sure you have a recent version: the code points that Powerline # uses changed in 2012, and older versions will display incorrectly, # in confusing ways. # # In addition, I recommend the # [Solarized theme](https://github.com/altercation/solarized/) and, if you're # using it on Mac OS X, [iTerm 2](https://iterm2.com/) over Terminal.app - # it has significantly better color fidelity. # # If using with "light" variant of the Solarized color schema, set # SOLARIZED_THEME variable to "light". If you don't specify, we'll assume # you're using the "dark" variant. # # # Goals # # The aim of this theme is to only show you *relevant* information. Like most # prompts, it will only show git information when in a git working directory. # However, it goes a step further: everything from the current user and # hostname to whether the last call exited with an error to whether background # jobs are running in this shell will all be displayed automatically when # appropriate. ### Segment drawing # A few utility functions to make it easy and re-usable to draw segmented prompts CURRENT_BG='NONE' case ${SOLARIZED_THEME:-dark} in light) CURRENT_FG='white';; *) CURRENT_FG='black';; esac # Special Powerline characters () { local LC_ALL="en_US.utf8" LC_CTYPE="en_US.utf8" # NOTE: This segment separator character is correct. In 2012, Powerline changed # the code points they use for their special characters. This is the new code point. # If this is not working for you, you probably have an old version of the # Powerline-patched fonts installed. Download and install the new version. # Do not submit PRs to change this unless you have reviewed the Powerline code point # history and have new information. # This is defined using a Unicode escape sequence so it is unambiguously readable, regardless of # what font the user is viewing this source code in. Do not replace the # escape sequence with a single literal character. # Do not change this! Do not make it '\u2b80'; that is the old, wrong code point. SEGMENT_SEPARATOR=$'\ue0b0' } # Begin a segment # Takes two arguments, background and foreground. Both can be omitted, # rendering default background/foreground. prompt_segment() { 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 echo -n "%{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%}" else echo -n "%{$bg%}%{$fg%}" fi CURRENT_BG=$1 [[ -n $3 ]] && echo -n $3 } # End the prompt, closing any open segments prompt_end() { if [[ -n $CURRENT_BG ]]; then echo -n "%{%k%F{$CURRENT_BG}%}" else echo -n "%{%k%}" fi echo -n "%{%f%}" CURRENT_BG='' } prompt_context() { prompt_segment #printf to kill the mystery space...? echo -n "%B%{$fg[red]%}[%{$fg[yellow]%}%n%{$fg[green]%}@%{$fg[blue]%}%M %{$fg[magenta]%}%~%{$fg[red]%}]%{$reset_color%}%b" } # Git: branch/detached head, dirty status prompt_git() { (( $+commands[git] )) || return if [[ "$(git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then return fi local PL_BRANCH_CHAR () { local LC_ALL="en_US.utf8" LC_CTYPE="en_US.utf8" PL_BRANCH_CHAR=$'\ue0a0' #  } local ref dirty mode repo_path if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then repo_path=$(git rev-parse --git-dir 2>/dev/null) dirty=$(parse_git_dirty) ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" if [[ -n $dirty ]]; then prompt_segment yellow black else prompt_segment green $CURRENT_FG fi if [[ -e "${repo_path}/BISECT_LOG" ]]; then mode="" elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then mode=">M<" elif [[ -e "${repo_path}/rebase" || -e "${repo_path}/rebase-apply" || -e "${repo_path}/rebase-merge" || -e "${repo_path}/../.dotest" ]]; then mode=">R>" fi remote="$(git ls-remote --get-url 2>/dev/null)" setopt promptsubst autoload -Uz vcs_info zstyle ':vcs_info:*' enable git zstyle ':vcs_info:*' get-revision true zstyle ':vcs_info:*' check-for-changes true zstyle ':vcs_info:*' stagedstr '✚' zstyle ':vcs_info:*' unstagedstr '±' zstyle ':vcs_info:*' formats ' %u%c' zstyle ':vcs_info:*' actionformats ' %u%c' vcs_info echo -n " $remote ${ref/refs\/heads\//$PL_BRANCH_CHAR }${vcs_info_msg_0_%% }${mode}" prompt_segment echo fi } # Virtualenv: current working virtualenv prompt_virtualenv() { local virtualenv_path="$VIRTUAL_ENV" if [[ -n $virtualenv_path && -n $VIRTUAL_ENV_DISABLE_PROMPT ]]; then prompt_segment blue black "(`basename $virtualenv_path`)" fi } # Status: # - was there an error # - am I root # - are there background jobs? prompt_status() { local -a symbols [[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘" [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" [[ -n "$symbols" ]] && prompt_segment black default "$symbols" } ## Main prompt build_prompt() { RETVAL=$? prompt_status prompt_virtualenv prompt_git prompt_context prompt_end } if [[ $UID -eq 0 ]]; then prompt_char="Σ" else prompt_char="λ" fi PROMPT='$(build_prompt)$prompt_char '