|  | # | 
        
          |  | # 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://gist.github.com/1595572). | 
        
          |  | # | 
        
          |  | # In addition, I recommend the | 
        
          |  | # [Solarized theme](https://github.com/altercation/solarized/) and, if you're | 
        
          |  | # using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app - | 
        
          |  | # it has significantly better color fidelity. | 
        
          |  | # | 
        
          |  | # # 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' | 
        
          |  | SEGMENT_SEPARATOR='' | 
        
          |  | SHOW_STASH_SEGMENT=1 | 
        
          |  |  | 
        
          |  | # 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}%}$SEGMENT_SEPARATOR" | 
        
          |  | else | 
        
          |  | echo -n "%{%k%}" | 
        
          |  | fi | 
        
          |  | echo -n "%{%f%}" | 
        
          |  | CURRENT_BG='' | 
        
          |  | } | 
        
          |  |  | 
        
          |  | ### Prompt components | 
        
          |  | # Each component will draw itself, and hide itself if no information needs to be shown | 
        
          |  |  | 
        
          |  | # Context: user@hostname (who am I and where am I) | 
        
          |  | prompt_context() { | 
        
          |  | local user=`whoami` | 
        
          |  |  | 
        
          |  | if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then | 
        
          |  | prompt_segment black white "%(!.%{%F{yellow}%}.)$user |%*| $(promt_ram)G" | 
        
          |  | fi | 
        
          |  | } | 
        
          |  |  | 
        
          |  | # Git: branch/detached head, dirty status | 
        
          |  | prompt_git() { | 
        
          |  | local ref dirty | 
        
          |  | if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then | 
        
          |  | dirty=$(parse_git_dirty) | 
        
          |  |  | 
        
          |  | if [[ $SHOW_STASH_SEGMENT -eq 1 ]]; then | 
        
          |  | stash_size=$(git stash list | wc -l | tr -d ' ') | 
        
          |  | if [[ stash_size -ne 0 ]]; then | 
        
          |  | prompt_segment white black | 
        
          |  | echo -n "+${stash_size}" | 
        
          |  | fi | 
        
          |  | fi | 
        
          |  |  | 
        
          |  | ref=$(git symbolic-ref HEAD 2> /dev/null) || "" | 
        
          |  | if [[ -z $ref ]]; then | 
        
          |  | detached_head=true; | 
        
          |  | ref="$(git show-ref --head -s --abbrev |head -n1 2> /dev/null)"; | 
        
          |  | ref_symbol="➦" | 
        
          |  | else | 
        
          |  | detached_head=false; | 
        
          |  | ref=${ref/refs\/heads\//} | 
        
          |  | ref_symbol="" | 
        
          |  | fi | 
        
          |  |  | 
        
          |  | remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/} | 
        
          |  | if [[ -n ${remote} ]] ; then | 
        
          |  | ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l | tr -d ' ') | 
        
          |  | displayed_ahead=" (+${ahead})" | 
        
          |  | behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l | tr -d ' ') | 
        
          |  | else | 
        
          |  | ahead="" | 
        
          |  | displayed_ahead="" | 
        
          |  | behind="" | 
        
          |  | fi | 
        
          |  |  | 
        
          |  | if [[ -n $dirty ]]; then | 
        
          |  | prompt_segment yellow black | 
        
          |  | else | 
        
          |  | prompt_segment green black | 
        
          |  | fi | 
        
          |  |  | 
        
          |  | echo -n "${ref_symbol} ${ref}${displayed_ahead}" | 
        
          |  |  | 
        
          |  | 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:git:*' unstagedstr '●' | 
        
          |  | zstyle ':vcs_info:*' formats ' %u%c' | 
        
          |  | zstyle ':vcs_info:*' actionformats '%u%c' | 
        
          |  | vcs_info | 
        
          |  | echo -n "${vcs_info_msg_0_}" | 
        
          |  |  | 
        
          |  | # Displaying upstream dedicated segment | 
        
          |  | if [[ -n $remote ]]; then | 
        
          |  | if [ $behind -ne 0 ]; then | 
        
          |  | prompt_segment magenta white | 
        
          |  | else | 
        
          |  | prompt_segment cyan black | 
        
          |  | fi | 
        
          |  | echo -n " $remote (-$behind)" | 
        
          |  | fi | 
        
          |  | fi | 
        
          |  | } | 
        
          |  |  | 
        
          |  | prompt_hg() { | 
        
          |  | local rev status | 
        
          |  | if $(hg id >/dev/null 2>&1); then | 
        
          |  | if $(hg prompt >/dev/null 2>&1); then | 
        
          |  | if [[ $(hg prompt "{status|unknown}") = "?" ]]; then | 
        
          |  | # if files are not added | 
        
          |  | prompt_segment red white | 
        
          |  | st='±' | 
        
          |  | elif [[ -n $(hg prompt "{status|modified}") ]]; then | 
        
          |  | # if any modification | 
        
          |  | prompt_segment yellow black | 
        
          |  | st='±' | 
        
          |  | else | 
        
          |  | # if working copy is clean | 
        
          |  | prompt_segment green black | 
        
          |  | fi | 
        
          |  | echo -n $(hg prompt " {rev}@{branch}") $st | 
        
          |  | else | 
        
          |  | st="" | 
        
          |  | rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') | 
        
          |  | branch=$(hg id -b 2>/dev/null) | 
        
          |  | if `hg st | grep -Eq "^\?"`; then | 
        
          |  | prompt_segment red black | 
        
          |  | st='±' | 
        
          |  | elif `hg st | grep -Eq "^(M|A)"`; then | 
        
          |  | prompt_segment yellow black | 
        
          |  | st='±' | 
        
          |  | else | 
        
          |  | prompt_segment green black | 
        
          |  | fi | 
        
          |  | echo -n " $rev@$branch" $st | 
        
          |  | fi | 
        
          |  | fi | 
        
          |  | } | 
        
          |  |  | 
        
          |  | # Dir: current working directory | 
        
          |  | prompt_dir() { | 
        
          |  | prompt_segment blue white '%~' | 
        
          |  | } | 
        
          |  |  | 
        
          |  | # Virtualenv: current working virtualenv | 
        
          |  | prompt_virtualenv() { | 
        
          |  | local virtualenv_path="$VIRTUAL_ENV" | 
        
          |  | if [[ -n $virtualenv_path ]]; then | 
        
          |  | prompt_segment blue black "(`basename $virtualenv_path`)" | 
        
          |  | fi | 
        
          |  | } | 
        
          |  |  | 
        
          |  | # Status: | 
        
          |  | # - was there an error | 
        
          |  | # - am I root | 
        
          |  | # - are there background jobs? | 
        
          |  | prompt_status() { | 
        
          |  | local symbols | 
        
          |  | symbols=() | 
        
          |  | [[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘" | 
        
          |  | [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡" | 
        
          |  | [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" | 
        
          |  |  | 
        
          |  | [[ -n "$symbols" ]] && prompt_segment black default "$symbols" | 
        
          |  | } | 
        
          |  |  | 
        
          |  | function promt_ram { | 
        
          |  | free -m | awk '{if (NR==2) print $4}' | xargs -i echo 'scale=4;{}/1000' | bc | xargs -i printf "%.2f" {} | 
        
          |  | } | 
        
          |  |  | 
        
          |  | prompt_next_line() { | 
        
          |  | prompt_segment default yellow "%c>" | 
        
          |  | echo -n "%{%f%}" | 
        
          |  | } | 
        
          |  |  | 
        
          |  | function vi_mode_prompt_info() { | 
        
          |  | echo "${${KEYMAP/vicmd/-- NORMAL --}/(main|viins)/-- INSERT --}" | 
        
          |  | } | 
        
          |  |  | 
        
          |  | ## Main prompt | 
        
          |  | build_prompt() { | 
        
          |  | RETVAL=$? | 
        
          |  | prompt_status | 
        
          |  | prompt_virtualenv | 
        
          |  | prompt_context | 
        
          |  | prompt_dir | 
        
          |  | prompt_git | 
        
          |  | prompt_hg | 
        
          |  | prompt_end | 
        
          |  | } | 
        
          |  |  | 
        
          |  | PROMPT='%{%f%b%k%}$(build_prompt) | 
        
          |  | $(prompt_next_line) ' | 
  
A W E S O M E ! ! !