From ebeae4abe9b3ef2e626eb545e991bb5696c57de0 Mon Sep 17 00:00:00 2001 From: Sergey Lukin Date: Fri, 9 Nov 2012 23:53:22 +0200 Subject: [PATCH 01/53] Fix /bin/sh compatibility issue in install.sh --- tools/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/install.sh b/tools/install.sh index b080be3a1..0558c96ce 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -36,4 +36,4 @@ echo "\033[0;32m"' /____/ '"\033[0m echo "\n\n \033[0;32m....is now installed.\033[0m" /usr/bin/env zsh -source ~/.zshrc +. ~/.zshrc From 9ebdbec58979b077e4790387b5927c74ce7184ef Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Fri, 23 Aug 2013 21:58:29 -0500 Subject: [PATCH 02/53] gitfast: update to upstream v1.8.4 Signed-off-by: Felipe Contreras --- plugins/gitfast/_git | 163 +++++++++++-- plugins/gitfast/git-completion.bash | 301 ++++++++--------------- plugins/gitfast/git-prompt.sh | 362 ++++++++++++++++------------ 3 files changed, 449 insertions(+), 377 deletions(-) diff --git a/plugins/gitfast/_git b/plugins/gitfast/_git index cf8116d47..fac5e711e 100644 --- a/plugins/gitfast/_git +++ b/plugins/gitfast/_git @@ -2,18 +2,19 @@ # zsh completion wrapper for git # -# You need git's bash completion script installed somewhere, by default on the -# same directory as this script. +# Copyright (c) 2012-2013 Felipe Contreras # -# If your script is on ~/.git-completion.sh instead, you can configure it on -# your ~/.zshrc: +# You need git's bash completion script installed somewhere, by default it +# would be the location bash-completion uses. +# +# If your script is somewhere else, you can configure it on your ~/.zshrc: # # zstyle ':completion:*:*:git:*' script ~/.git-completion.sh # -# The recommended way to install this script is to copy to -# '~/.zsh/completion/_git', and then add the following to your ~/.zshrc file: +# The recommended way to install this script is to copy to '~/.zsh/_git', and +# then add the following to your ~/.zshrc file: # -# fpath=(~/.zsh/completion $fpath) +# fpath=(~/.zsh $fpath) complete () { @@ -21,8 +22,23 @@ complete () return 0 } +zstyle -T ':completion:*:*:git:*' tag-order && \ + zstyle ':completion:*:*:git:*' tag-order 'common-commands' + zstyle -s ":completion:*:*:git:*" script script -test -z "$script" && script="$(dirname ${funcsourcetrace[1]%:*})"/git-completion.bash +if [ -z "$script" ]; then + local -a locations + local e + locations=( + '/etc/bash_completion.d/git' # fedora, old debian + '/usr/share/bash-completion/completions/git' # arch, ubuntu, new debian + '/usr/share/bash-completion/git' # gentoo + $(dirname ${funcsourcetrace[1]%:*})/git-completion.bash + ) + for e in $locations; do + test -f $e && script="$e" && break + done +fi ZSH_VERSION='' . "$script" __gitcomp () @@ -69,18 +85,131 @@ __gitcomp_file () compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 } +__git_zsh_bash_func () +{ + emulate -L ksh + + local command=$1 + + local completion_func="_git_${command//-/_}" + declare -f $completion_func >/dev/null && $completion_func && return + + local expansion=$(__git_aliased_command "$command") + if [ -n "$expansion" ]; then + completion_func="_git_${expansion//-/_}" + declare -f $completion_func >/dev/null && $completion_func + fi +} + +__git_zsh_cmd_common () +{ + local -a list + list=( + add:'add file contents to the index' + bisect:'find by binary search the change that introduced a bug' + branch:'list, create, or delete branches' + checkout:'checkout a branch or paths to the working tree' + clone:'clone a repository into a new directory' + commit:'record changes to the repository' + diff:'show changes between commits, commit and working tree, etc' + fetch:'download objects and refs from another repository' + grep:'print lines matching a pattern' + init:'create an empty Git repository or reinitialize an existing one' + log:'show commit logs' + merge:'join two or more development histories together' + mv:'move or rename a file, a directory, or a symlink' + pull:'fetch from and merge with another repository or a local branch' + push:'update remote refs along with associated objects' + rebase:'forward-port local commits to the updated upstream head' + reset:'reset current HEAD to the specified state' + rm:'remove files from the working tree and from the index' + show:'show various types of objects' + status:'show the working tree status' + tag:'create, list, delete or verify a tag object signed with GPG') + _describe -t common-commands 'common commands' list && _ret=0 +} + +__git_zsh_cmd_alias () +{ + local -a list + list=(${${${(0)"$(git config -z --get-regexp '^alias\.')"}#alias.}%$'\n'*}) + _describe -t alias-commands 'aliases' list $* && _ret=0 +} + +__git_zsh_cmd_all () +{ + local -a list + emulate ksh -c __git_compute_all_commands + list=( ${=__git_all_commands} ) + _describe -t all-commands 'all commands' list && _ret=0 +} + +__git_zsh_main () +{ + local curcontext="$curcontext" state state_descr line + typeset -A opt_args + local -a orig_words + + orig_words=( ${words[@]} ) + + _arguments -C \ + '(-p --paginate --no-pager)'{-p,--paginate}'[pipe all output into ''less'']' \ + '(-p --paginate)--no-pager[do not pipe git output into a pager]' \ + '--git-dir=-[set the path to the repository]: :_directories' \ + '--bare[treat the repository as a bare repository]' \ + '(- :)--version[prints the git suite version]' \ + '--exec-path=-[path to where your core git programs are installed]:: :_directories' \ + '--html-path[print the path where git''s HTML documentation is installed]' \ + '--info-path[print the path where the Info files are installed]' \ + '--man-path[print the manpath (see `man(1)`) for the man pages]' \ + '--work-tree=-[set the path to the working tree]: :_directories' \ + '--namespace=-[set the git namespace]' \ + '--no-replace-objects[do not use replacement refs to replace git objects]' \ + '(- :)--help[prints the synopsis and a list of the most commonly used commands]: :->arg' \ + '(-): :->command' \ + '(-)*:: :->arg' && return + + case $state in + (command) + _alternative \ + 'alias-commands:alias:__git_zsh_cmd_alias' \ + 'common-commands:common:__git_zsh_cmd_common' \ + 'all-commands:all:__git_zsh_cmd_all' && _ret=0 + ;; + (arg) + local command="${words[1]}" __git_dir + + if (( $+opt_args[--bare] )); then + __git_dir='.' + else + __git_dir=${opt_args[--git-dir]} + fi + + (( $+opt_args[--help] )) && command='help' + + words=( ${orig_words[@]} ) + + __git_zsh_bash_func $command + ;; + esac +} + _git () { local _ret=1 - () { - emulate -L ksh - local cur cword prev - cur=${words[CURRENT-1]} - prev=${words[CURRENT-2]} - let cword=CURRENT-1 - __${service}_main - } - let _ret && _default -S '' && _ret=0 + local cur cword prev + + cur=${words[CURRENT]} + prev=${words[CURRENT-1]} + let cword=CURRENT-1 + + if (( $+functions[__${service}_zsh_main] )); then + __${service}_zsh_main + else + emulate ksh -c __${service}_main + fi + + let _ret && _default && _ret=0 return _ret } diff --git a/plugins/gitfast/git-completion.bash b/plugins/gitfast/git-completion.bash index 93eba4675..5da920ecd 100644 --- a/plugins/gitfast/git-completion.bash +++ b/plugins/gitfast/git-completion.bash @@ -33,8 +33,6 @@ esac # returns location of .git repo __gitdir () { - # Note: this function is duplicated in git-prompt.sh - # When updating it, make sure you update the other one to match. if [ -z "${1-}" ]; then if [ -n "${__git_dir-}" ]; then echo "$__git_dir" @@ -53,19 +51,6 @@ __gitdir () fi } -__gitcomp_1 () -{ - local c IFS=$' \t\n' - for c in $1; do - c="$c$2" - case $c in - --*=*|*.) ;; - *) c="$c " ;; - esac - printf '%s\n' "$c" - done -} - # The following function is based on code from: # # bash_completion - programmable completion functions for bash 3.2+ @@ -195,8 +180,18 @@ _get_comp_words_by_ref () } fi -# Generates completion reply with compgen, appending a space to possible -# completion words, if necessary. +__gitcompadd () +{ + local i=0 + for x in $1; do + if [[ "$x" == "$3"* ]]; then + COMPREPLY[i++]="$2$x$4" + fi + done +} + +# Generates completion reply, appending a space to possible completion words, +# if necessary. # It accepts 1 to 4 arguments: # 1: List of possible completion words. # 2: A prefix to be added to each possible completion word (optional). @@ -208,19 +203,25 @@ __gitcomp () case "$cur_" in --*=) - COMPREPLY=() ;; *) - local IFS=$'\n' - COMPREPLY=($(compgen -P "${2-}" \ - -W "$(__gitcomp_1 "${1-}" "${4-}")" \ - -- "$cur_")) + local c i=0 IFS=$' \t\n' + for c in $1; do + c="$c${4-}" + if [[ $c == "$cur_"* ]]; then + case $c in + --*=*|*.) ;; + *) c="$c " ;; + esac + COMPREPLY[i++]="${2-}$c" + fi + done ;; esac } -# Generates completion reply with compgen from newline-separated possible -# completion words by appending a space to all of them. +# Generates completion reply from newline-separated possible completion words +# by appending a space to all of them. # It accepts 1 to 4 arguments: # 1: List of possible completion words, separated by a single newline. # 2: A prefix to be added to each possible completion word (optional). @@ -231,7 +232,7 @@ __gitcomp () __gitcomp_nl () { local IFS=$'\n' - COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}")) + __gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }" } # Generates completion reply with compgen from newline-separated possible @@ -249,106 +250,50 @@ __gitcomp_file () # since tilde expansion is not applied. # This means that COMPREPLY will be empty and Bash default # completion will be used. - COMPREPLY=($(compgen -P "${2-}" -W "$1" -- "${3-$cur}")) + __gitcompadd "$1" "${2-}" "${3-$cur}" "" - # Tell Bash that compspec generates filenames. - compopt -o filenames 2>/dev/null + # use a hack to enable file mode in bash < 4 + compopt -o filenames +o nospace 2>/dev/null || + compgen -f /non-existing-dir/ > /dev/null } -__git_index_file_list_filter_compat () -{ - local path - - while read -r path; do - case "$path" in - ?*/*) echo "${path%%/*}/" ;; - *) echo "$path" ;; - esac - done -} - -__git_index_file_list_filter_bash () -{ - local path - - while read -r path; do - case "$path" in - ?*/*) - # XXX if we append a slash to directory names when using - # `compopt -o filenames`, Bash will append another slash. - # This is pretty stupid, and this the reason why we have to - # define a compatible version for this function. - echo "${path%%/*}" ;; - *) - echo "$path" ;; - esac - done -} - -# Process path list returned by "ls-files" and "diff-index --name-only" -# commands, in order to list only file names relative to a specified -# directory, and append a slash to directory names. -__git_index_file_list_filter () -{ - # Default to Bash >= 4.x - __git_index_file_list_filter_bash -} - -# Execute git ls-files, returning paths relative to the directory -# specified in the first argument, and using the options specified in -# the second argument. +# Execute 'git ls-files', unless the --committable option is specified, in +# which case it runs 'git diff-index' to find out the files that can be +# committed. It return paths relative to the directory specified in the first +# argument, and using the options specified in the second argument. __git_ls_files_helper () { ( test -n "${CDPATH+set}" && unset CDPATH - # NOTE: $2 is not quoted in order to support multiple options - cd "$1" && git ls-files --exclude-standard $2 + cd "$1" + if [ "$2" == "--committable" ]; then + git diff-index --name-only --relative HEAD + else + # NOTE: $2 is not quoted in order to support multiple options + git ls-files --exclude-standard $2 + fi ) 2>/dev/null } -# Execute git diff-index, returning paths relative to the directory -# specified in the first argument, and using the tree object id -# specified in the second argument. -__git_diff_index_helper () -{ - ( - test -n "${CDPATH+set}" && unset CDPATH - cd "$1" && git diff-index --name-only --relative "$2" - ) 2>/dev/null -} - # __git_index_files accepts 1 or 2 arguments: # 1: Options to pass to ls-files (required). -# Supported options are --cached, --modified, --deleted, --others, -# and --directory. # 2: A directory path (optional). # If provided, only files within the specified directory are listed. # Sub directories are never recursed. Path must have a trailing # slash. __git_index_files () { - local dir="$(__gitdir)" root="${2-.}" + local dir="$(__gitdir)" root="${2-.}" file if [ -d "$dir" ]; then - __git_ls_files_helper "$root" "$1" | __git_index_file_list_filter | - sort | uniq - fi -} - -# __git_diff_index_files accepts 1 or 2 arguments: -# 1) The id of a tree object. -# 2) A directory path (optional). -# If provided, only files within the specified directory are listed. -# Sub directories are never recursed. Path must have a trailing -# slash. -__git_diff_index_files () -{ - local dir="$(__gitdir)" root="${2-.}" - - if [ -d "$dir" ]; then - __git_diff_index_helper "$root" "$1" | __git_index_file_list_filter | - sort | uniq + __git_ls_files_helper "$root" "$1" | + while read -r file; do + case "$file" in + ?*/*) echo "${file%%/*}" ;; + *) echo "$file" ;; + esac + done | sort | uniq fi } @@ -424,14 +369,8 @@ __git_refs () done ;; *) - git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \ - while read -r hash i; do - case "$i" in - *^{}) ;; - refs/*) echo "${i#refs/*/}" ;; - *) echo "$i" ;; - esac - done + echo "HEAD" + git for-each-ref --format="%(refname:short)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##" ;; esac } @@ -549,44 +488,23 @@ __git_complete_revlist_file () } -# __git_complete_index_file requires 1 argument: the options to pass to -# ls-file +# __git_complete_index_file requires 1 argument: +# 1: the options to pass to ls-file +# +# The exception is --committable, which finds the files appropriate commit. __git_complete_index_file () { - local pfx cur_="$cur" + local pfx="" cur_="$cur" case "$cur_" in ?*/*) pfx="${cur_%/*}" cur_="${cur_##*/}" pfx="${pfx}/" - - __gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_" - ;; - *) - __gitcomp_file "$(__git_index_files "$1")" "" "$cur_" ;; esac -} -# __git_complete_diff_index_file requires 1 argument: the id of a tree -# object -__git_complete_diff_index_file () -{ - local pfx cur_="$cur" - - case "$cur_" in - ?*/*) - pfx="${cur_%/*}" - cur_="${cur_##*/}" - pfx="${pfx}/" - - __gitcomp_file "$(__git_diff_index_files "$1" "$pfx")" "$pfx" "$cur_" - ;; - *) - __gitcomp_file "$(__git_diff_index_files "$1")" "" "$cur_" - ;; - esac + __gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_" } __git_complete_file () @@ -614,7 +532,6 @@ __git_complete_remote_or_refspec () case "$cmd" in push) no_complete_refspec=1 ;; fetch) - COMPREPLY=() return ;; *) ;; @@ -630,7 +547,6 @@ __git_complete_remote_or_refspec () return fi if [ $no_complete_refspec = 1 ]; then - COMPREPLY=() return fi [ "$remote" = "." ] && remote= @@ -732,6 +648,7 @@ __git_list_porcelain_commands () cat-file) : plumbing;; check-attr) : plumbing;; check-ignore) : plumbing;; + check-mailmap) : plumbing;; check-ref-format) : plumbing;; checkout-index) : plumbing;; commit-tree) : plumbing;; @@ -951,7 +868,6 @@ _git_am () " return esac - COMPREPLY=() } _git_apply () @@ -971,7 +887,6 @@ _git_apply () " return esac - COMPREPLY=() } _git_add () @@ -1031,7 +946,6 @@ _git_bisect () __gitcomp_nl "$(__git_refs)" ;; *) - COMPREPLY=() ;; esac } @@ -1124,9 +1038,14 @@ _git_cherry () _git_cherry_pick () { + local dir="$(__gitdir)" + if [ -f "$dir"/CHERRY_PICK_HEAD ]; then + __gitcomp "--continue --quit --abort" + return + fi case "$cur" in --*) - __gitcomp "--edit --no-commit" + __gitcomp "--edit --no-commit --signoff --strategy= --mainline" ;; *) __gitcomp_nl "$(__git_refs)" @@ -1170,7 +1089,6 @@ _git_clone () return ;; esac - COMPREPLY=() } _git_commit () @@ -1182,13 +1100,6 @@ _git_commit () ;; esac - case "$prev" in - -c|-C) - __gitcomp_nl "$(__git_refs)" "" "${cur}" - return - ;; - esac - case "$cur" in --cleanup=*) __gitcomp "default strip verbatim whitespace @@ -1218,7 +1129,7 @@ _git_commit () esac if git rev-parse --verify --quiet HEAD >/dev/null; then - __git_complete_diff_index_file "HEAD" + __git_complete_index_file "--committable" else # This is the first commit __git_complete_index_file "--cached" @@ -1251,7 +1162,7 @@ __git_diff_common_options="--stat --numstat --shortstat --summary --no-prefix --src-prefix= --dst-prefix= --inter-hunk-context= --patience --histogram --minimal - --raw + --raw --word-diff --dirstat --dirstat= --dirstat-by-file --dirstat-by-file= --cumulative --diff-algorithm= @@ -1299,7 +1210,7 @@ _git_difftool () return ;; esac - __git_complete_file + __git_complete_revlist_file } __git_fetch_options=" @@ -1319,11 +1230,12 @@ _git_fetch () } __git_format_patch_options=" - --stdout --attach --no-attach --thread --thread= --output-directory + --stdout --attach --no-attach --thread --thread= --no-thread --numbered --start-number --numbered-files --keep-subject --signoff --signature --no-signature --in-reply-to= --cc= --full-index --binary --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix= --inline --suffix= --ignore-if-in-upstream --subject-prefix= + --output-directory --reroll-count --to= --quiet --notes " _git_format_patch () @@ -1354,7 +1266,6 @@ _git_fsck () return ;; esac - COMPREPLY=() } _git_gc () @@ -1365,7 +1276,6 @@ _git_gc () return ;; esac - COMPREPLY=() } _git_gitk () @@ -1442,7 +1352,6 @@ _git_init () return ;; esac - COMPREPLY=() } _git_ls_files () @@ -1578,7 +1487,6 @@ _git_mergetool () return ;; esac - COMPREPLY=() } _git_merge_base () @@ -1819,7 +1727,7 @@ __git_config_get_set_variables () _git_config () { case "$prev" in - branch.*.remote) + branch.*.remote|branch.*.pushremote) __gitcomp_nl "$(__git_remotes)" return ;; @@ -1827,11 +1735,19 @@ _git_config () __gitcomp_nl "$(__git_refs)" return ;; + branch.*.rebase) + __gitcomp "false true" + return + ;; + remote.pushdefault) + __gitcomp_nl "$(__git_remotes)" + return + ;; remote.*.fetch) local remote="${prev#remote.}" remote="${remote%.fetch}" if [ -z "$cur" ]; then - COMPREPLY=("refs/heads/") + __gitcomp_nl "refs/heads/" "" "" "" return fi __gitcomp_nl "$(__git_refs_remotes "$remote")" @@ -1866,6 +1782,10 @@ _git_config () " return ;; + diff.submodule) + __gitcomp "log short" + return + ;; help.format) __gitcomp "man info web html" return @@ -1891,7 +1811,6 @@ _git_config () return ;; *.*) - COMPREPLY=() return ;; esac @@ -1908,7 +1827,7 @@ _git_config () ;; branch.*.*) local pfx="${cur%.*}." cur_="${cur##*.}" - __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_" + __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_" return ;; branch.*) @@ -2039,7 +1958,6 @@ _git_config () core.fileMode core.fsyncobjectfiles core.gitProxy - core.ignoreCygwinFSTricks core.ignoreStat core.ignorecase core.logAllRefUpdates @@ -2061,13 +1979,14 @@ _git_config () core.whitespace core.worktree diff.autorefreshindex - diff.statGraphWidth diff.external diff.ignoreSubmodules diff.mnemonicprefix diff.noprefix diff.renameLimit diff.renames + diff.statGraphWidth + diff.submodule diff.suppressBlankEmpty diff.tool diff.wordRegex @@ -2202,6 +2121,7 @@ _git_config () receive.fsckObjects receive.unpackLimit receive.updateserverinfo + remote.pushdefault remotes. repack.usedeltabaseoffset rerere.autoupdate @@ -2272,7 +2192,6 @@ _git_remote () __gitcomp "$c" ;; *) - COMPREPLY=() ;; esac } @@ -2356,7 +2275,7 @@ _git_show () return ;; esac - __git_complete_file + __git_complete_revlist_file } _git_show_branch () @@ -2388,8 +2307,6 @@ _git_stash () *) if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then __gitcomp "$subcommands" - else - COMPREPLY=() fi ;; esac @@ -2402,14 +2319,12 @@ _git_stash () __gitcomp "--index --quiet" ;; show,--*|drop,--*|branch,--*) - COMPREPLY=() ;; show,*|apply,*|drop,*|pop,*|branch,*) __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ | sed -n -e 's/:.*//p')" ;; *) - COMPREPLY=() ;; esac fi @@ -2419,7 +2334,7 @@ _git_submodule () { __git_has_doubledash && return - local subcommands="add status init update summary foreach sync" + local subcommands="add status init deinit update summary foreach sync" if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then case "$cur" in --*) @@ -2451,7 +2366,7 @@ _git_svn () --no-metadata --use-svm-props --use-svnsync-props --log-window-size= --no-checkout --quiet --repack-flags --use-log-author --localtime - --ignore-paths= $remote_opts + --ignore-paths= --include-paths= $remote_opts " local init_opts=" --template= --shared= --trunk= --tags= @@ -2526,7 +2441,6 @@ _git_svn () __gitcomp "--revision= --parent" ;; *) - COMPREPLY=() ;; esac fi @@ -2551,13 +2465,10 @@ _git_tag () case "$prev" in -m|-F) - COMPREPLY=() ;; -*|tag) if [ $f = 1 ]; then __gitcomp_nl "$(__git_tags)" - else - COMPREPLY=() fi ;; *) @@ -2579,9 +2490,10 @@ __git_main () i="${words[c]}" case "$i" in --git-dir=*) __git_dir="${i#--git-dir=}" ;; + --git-dir) ((c++)) ; __git_dir="${words[c]}" ;; --bare) __git_dir="." ;; --help) command="help"; break ;; - -c) c=$((++c)) ;; + -c|--work-tree|--namespace) ((c++)) ;; -*) ;; *) command="$i"; break ;; esac @@ -2599,6 +2511,7 @@ __git_main () --exec-path --exec-path= --html-path + --man-path --info-path --work-tree= --namespace= @@ -2693,35 +2606,19 @@ if [[ -n ${ZSH_VERSION-} ]]; then compadd -Q -p "${2-}" -f -- ${=1} && _ret=0 } - __git_zsh_helper () - { - emulate -L ksh - local cur cword prev - cur=${words[CURRENT-1]} - prev=${words[CURRENT-2]} - let cword=CURRENT-1 - __${service}_main - } - _git () { - emulate -L zsh - local _ret=1 - __git_zsh_helper - let _ret && _default -S '' && _ret=0 + local _ret=1 cur cword prev + cur=${words[CURRENT]} + prev=${words[CURRENT-1]} + let cword=CURRENT-1 + emulate ksh -c __${service}_main + let _ret && _default && _ret=0 return _ret } compdef _git git gitk return -elif [[ -n ${BASH_VERSION-} ]]; then - if ((${BASH_VERSINFO[0]} < 4)); then - # compopt is not supported - __git_index_file_list_filter () - { - __git_index_file_list_filter_compat - } - fi fi __git_func_wrap () diff --git a/plugins/gitfast/git-prompt.sh b/plugins/gitfast/git-prompt.sh index 65f8368f1..a81ef5a48 100644 --- a/plugins/gitfast/git-prompt.sh +++ b/plugins/gitfast/git-prompt.sh @@ -3,7 +3,7 @@ # Copyright (C) 2006,2007 Shawn O. Pearce # Distributed under the GNU General Public License, version 2.0. # -# This script allows you to see the current branch in your prompt. +# This script allows you to see repository status in your prompt. # # To enable: # @@ -13,23 +13,27 @@ # 3a) Change your PS1 to call __git_ps1 as # command-substitution: # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' -# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' +# ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' # the optional argument will be used as format string. -# 3b) Alternatively, if you are using bash, __git_ps1 can be -# used for PROMPT_COMMAND with two parameters,
 and
-#        , which are strings you would put in $PS1 before
-#        and after the status string generated by the git-prompt
-#        machinery.  e.g.
-#           PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
-#        will show username, at-sign, host, colon, cwd, then
-#        various status string, followed by dollar and SP, as
-#        your prompt.
+#    3b) Alternatively, for a slightly faster prompt, __git_ps1 can
+#        be used for PROMPT_COMMAND in Bash or for precmd() in Zsh
+#        with two parameters, 
 and , which are strings
+#        you would put in $PS1 before and after the status string
+#        generated by the git-prompt machinery.  e.g.
+#        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
+#          will show username, at-sign, host, colon, cwd, then
+#          various status string, followed by dollar and SP, as
+#          your prompt.
+#        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
+#          will show username, pipe, then various status string,
+#          followed by colon, cwd, dollar and SP, as your prompt.
 #        Optionally, you can supply a third argument with a printf
 #        format string to finetune the output of the branch status
 #
-# The argument to __git_ps1 will be displayed only if you are currently
-# in a git repository.  The %s token will be the name of the current
-# branch.
+# The repository status will be displayed only if you are currently in a
+# git repository. The %s token is the placeholder for the shown status.
+#
+# The prompt status always includes the current branch name.
 #
 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
 # unstaged (*) and staged (+) changes will be shown next to the branch
@@ -77,31 +81,8 @@
 #
 # If you would like a colored hint about the current dirty state, set
 # GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
-# the colored output of "git status -sb".
-
-# __gitdir accepts 0 or 1 arguments (i.e., location)
-# returns location of .git repo
-__gitdir ()
-{
-	# Note: this function is duplicated in git-completion.bash
-	# When updating it, make sure you update the other one to match.
-	if [ -z "${1-}" ]; then
-		if [ -n "${__git_dir-}" ]; then
-			echo "$__git_dir"
-		elif [ -n "${GIT_DIR-}" ]; then
-			test -d "${GIT_DIR-}" || return 1
-			echo "$GIT_DIR"
-		elif [ -d .git ]; then
-			echo .git
-		else
-			git rev-parse --git-dir 2>/dev/null
-		fi
-	elif [ -d "$1/.git" ]; then
-		echo "$1/.git"
-	else
-		echo "$1"
-	fi
-}
+# the colored output of "git status -sb" and are available only when
+# using __git_ps1 for PROMPT_COMMAND or precmd.
 
 # stores the divergence from upstream in $p
 # used by GIT_PS1_SHOWUPSTREAM
@@ -124,7 +105,7 @@ __git_ps1_show_upstream ()
 			fi
 			;;
 		svn-remote.*.url)
-			svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
+			svn_remote[$((${#svn_remote[@]} + 1))]="$value"
 			svn_url_pattern+="\\|$value"
 			upstream=svn+git # default upstream is SVN if available, else git
 			;;
@@ -146,10 +127,11 @@ __git_ps1_show_upstream ()
 	svn*)
 		# get the upstream from the "git-svn-id: ..." in a commit message
 		# (git-svn uses essentially the same procedure internally)
-		local svn_upstream=($(git log --first-parent -1 \
+		local -a svn_upstream
+		svn_upstream=($(git log --first-parent -1 \
 					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
 		if [[ 0 -ne ${#svn_upstream[@]} ]]; then
-			svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
+			svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
 			svn_upstream=${svn_upstream%@*}
 			local n_stop="${#svn_remote[@]}"
 			for ((n=1; n <= n_stop; n++)); do
@@ -222,6 +204,51 @@ __git_ps1_show_upstream ()
 
 }
 
+# Helper function that is meant to be called from __git_ps1.  It
+# injects color codes into the appropriate gitstring variables used
+# to build a gitstring.
+__git_ps1_colorize_gitstring ()
+{
+	if [[ -n ${ZSH_VERSION-} ]]; then
+		local c_red='%F{red}'
+		local c_green='%F{green}'
+		local c_lblue='%F{blue}'
+		local c_clear='%f'
+	else
+		# Using \[ and \] around colors is necessary to prevent
+		# issues with command line editing/browsing/completion!
+		local c_red='\[\e[31m\]'
+		local c_green='\[\e[32m\]'
+		local c_lblue='\[\e[1;34m\]'
+		local c_clear='\[\e[0m\]'
+	fi
+	local bad_color=$c_red
+	local ok_color=$c_green
+	local flags_color="$c_lblue"
+
+	local branch_color=""
+	if [ $detached = no ]; then
+		branch_color="$ok_color"
+	else
+		branch_color="$bad_color"
+	fi
+	c="$branch_color$c"
+
+	z="$c_clear$z"
+	if [ "$w" = "*" ]; then
+		w="$bad_color$w"
+	fi
+	if [ -n "$i" ]; then
+		i="$ok_color$i"
+	fi
+	if [ -n "$s" ]; then
+		s="$flags_color$s"
+	fi
+	if [ -n "$u" ]; then
+		u="$bad_color$u"
+	fi
+	r="$c_clear$r"
+}
 
 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
 # when called from PS1 using command substitution
@@ -254,39 +281,83 @@ __git_ps1 ()
 		;;
 	esac
 
-	local g="$(__gitdir)"
-	if [ -z "$g" ]; then
+	local repo_info rev_parse_exit_code
+	repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
+		--is-bare-repository --is-inside-work-tree \
+		--short HEAD 2>/dev/null)"
+	rev_parse_exit_code="$?"
+
+	if [ -z "$repo_info" ]; then
 		if [ $pcmode = yes ]; then
 			#In PC mode PS1 always needs to be set
 			PS1="$ps1pc_start$ps1pc_end"
 		fi
-	else
-		local r=""
-		local b=""
+		return
+	fi
+
+	local short_sha
+	if [ "$rev_parse_exit_code" = "0" ]; then
+		short_sha="${repo_info##*$'\n'}"
+		repo_info="${repo_info%$'\n'*}"
+	fi
+	local inside_worktree="${repo_info##*$'\n'}"
+	repo_info="${repo_info%$'\n'*}"
+	local bare_repo="${repo_info##*$'\n'}"
+	repo_info="${repo_info%$'\n'*}"
+	local inside_gitdir="${repo_info##*$'\n'}"
+	local g="${repo_info%$'\n'*}"
+
+	local r=""
+	local b=""
+	local step=""
+	local total=""
+	if [ -d "$g/rebase-merge" ]; then
+		read b 2>/dev/null <"$g/rebase-merge/head-name"
+		read step 2>/dev/null <"$g/rebase-merge/msgnum"
+		read total 2>/dev/null <"$g/rebase-merge/end"
 		if [ -f "$g/rebase-merge/interactive" ]; then
 			r="|REBASE-i"
-			b="$(cat "$g/rebase-merge/head-name")"
-		elif [ -d "$g/rebase-merge" ]; then
-			r="|REBASE-m"
-			b="$(cat "$g/rebase-merge/head-name")"
 		else
-			if [ -d "$g/rebase-apply" ]; then
-				if [ -f "$g/rebase-apply/rebasing" ]; then
-					r="|REBASE"
-				elif [ -f "$g/rebase-apply/applying" ]; then
-					r="|AM"
-				else
-					r="|AM/REBASE"
-				fi
-			elif [ -f "$g/MERGE_HEAD" ]; then
-				r="|MERGING"
-			elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
-				r="|CHERRY-PICKING"
-			elif [ -f "$g/BISECT_LOG" ]; then
-				r="|BISECTING"
+			r="|REBASE-m"
+		fi
+	else
+		if [ -d "$g/rebase-apply" ]; then
+			read step 2>/dev/null <"$g/rebase-apply/next"
+			read total 2>/dev/null <"$g/rebase-apply/last"
+			if [ -f "$g/rebase-apply/rebasing" ]; then
+				read b 2>/dev/null <"$g/rebase-apply/head-name"
+				r="|REBASE"
+			elif [ -f "$g/rebase-apply/applying" ]; then
+				r="|AM"
+			else
+				r="|AM/REBASE"
 			fi
+		elif [ -f "$g/MERGE_HEAD" ]; then
+			r="|MERGING"
+		elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
+			r="|CHERRY-PICKING"
+		elif [ -f "$g/REVERT_HEAD" ]; then
+			r="|REVERTING"
+		elif [ -f "$g/BISECT_LOG" ]; then
+			r="|BISECTING"
+		fi
 
-			b="$(git symbolic-ref HEAD 2>/dev/null)" || {
+		if [ -n "$b" ]; then
+			:
+		elif [ -h "$g/HEAD" ]; then
+			# symlink symbolic ref
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		else
+			local head=""
+			if ! read head 2>/dev/null <"$g/HEAD"; then
+				if [ $pcmode = yes ]; then
+					PS1="$ps1pc_start$ps1pc_end"
+				fi
+				return
+			fi
+			# is it a symbolic ref?
+			b="${head#ref: }"
+			if [ "$head" = "$b" ]; then
 				detached=yes
 				b="$(
 				case "${GIT_PS1_DESCRIBE_STYLE-}" in
@@ -300,100 +371,75 @@ __git_ps1 ()
 					git describe --tags --exact-match HEAD ;;
 				esac 2>/dev/null)" ||
 
-				b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
-				b="unknown"
+				b="$short_sha..."
 				b="($b)"
-			}
-		fi
-
-		local w=""
-		local i=""
-		local s=""
-		local u=""
-		local c=""
-		local p=""
-
-		if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
-			if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
-				c="BARE:"
-			else
-				b="GIT_DIR!"
 			fi
-		elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
-			if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
-			   [ "$(git config --bool bash.showDirtyState)" != "false" ]
-			then
-				git diff --no-ext-diff --quiet --exit-code || w="*"
-				if git rev-parse --quiet --verify HEAD >/dev/null; then
-					git diff-index --cached --quiet HEAD -- || i="+"
-				else
-					i="#"
-				fi
-			fi
-			if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
-				git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
-			fi
-
-			if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
-			   [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
-			   [ -n "$(git ls-files --others --exclude-standard)" ]
-			then
-				u="%%"
-			fi
-
-			if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
-				__git_ps1_show_upstream
-			fi
-		fi
-
-		local f="$w$i$s$u"
-		if [ $pcmode = yes ]; then
-			local gitstring=
-			if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
-				local c_red='\e[31m'
-				local c_green='\e[32m'
-				local c_lblue='\e[1;34m'
-				local c_clear='\e[0m'
-				local bad_color=$c_red
-				local ok_color=$c_green
-				local branch_color="$c_clear"
-				local flags_color="$c_lblue"
-				local branchstring="$c${b##refs/heads/}"
-
-				if [ $detached = no ]; then
-					branch_color="$ok_color"
-				else
-					branch_color="$bad_color"
-				fi
-
-				# Setting gitstring directly with \[ and \] around colors
-				# is necessary to prevent wrapping issues!
-				gitstring="\[$branch_color\]$branchstring\[$c_clear\]"
-
-				if [ -n "$w$i$s$u$r$p" ]; then
-					gitstring="$gitstring "
-				fi
-				if [ "$w" = "*" ]; then
-					gitstring="$gitstring\[$bad_color\]$w"
-				fi
-				if [ -n "$i" ]; then
-					gitstring="$gitstring\[$ok_color\]$i"
-				fi
-				if [ -n "$s" ]; then
-					gitstring="$gitstring\[$flags_color\]$s"
-				fi
-				if [ -n "$u" ]; then
-					gitstring="$gitstring\[$bad_color\]$u"
-				fi
-				gitstring="$gitstring\[$c_clear\]$r$p"
-			else
-				gitstring="$c${b##refs/heads/}${f:+ $f}$r$p"
-			fi
-			gitstring=$(printf -- "$printf_format" "$gitstring")
-			PS1="$ps1pc_start$gitstring$ps1pc_end"
-		else
-			# NO color option unless in PROMPT_COMMAND mode
-			printf -- "$printf_format" "$c${b##refs/heads/}${f:+ $f}$r$p"
 		fi
 	fi
+
+	if [ -n "$step" ] && [ -n "$total" ]; then
+		r="$r $step/$total"
+	fi
+
+	local w=""
+	local i=""
+	local s=""
+	local u=""
+	local c=""
+	local p=""
+
+	if [ "true" = "$inside_gitdir" ]; then
+		if [ "true" = "$bare_repo" ]; then
+			c="BARE:"
+		else
+			b="GIT_DIR!"
+		fi
+	elif [ "true" = "$inside_worktree" ]; then
+		if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
+		   [ "$(git config --bool bash.showDirtyState)" != "false" ]
+		then
+			git diff --no-ext-diff --quiet --exit-code || w="*"
+			if [ -n "$short_sha" ]; then
+				git diff-index --cached --quiet HEAD -- || i="+"
+			else
+				i="#"
+			fi
+		fi
+		if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
+		   [ -r "$g/refs/stash" ]; then
+			s="$"
+		fi
+
+		if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
+		   [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
+		   git ls-files --others --exclude-standard --error-unmatch -- '*' >/dev/null 2>/dev/null
+		then
+			u="%${ZSH_VERSION+%}"
+		fi
+
+		if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
+			__git_ps1_show_upstream
+		fi
+	fi
+
+	local z="${GIT_PS1_STATESEPARATOR-" "}"
+
+	# NO color option unless in PROMPT_COMMAND mode
+	if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
+		__git_ps1_colorize_gitstring
+	fi
+
+	local f="$w$i$s$u"
+	local gitstring="$c${b##refs/heads/}${f:+$z$f}$r$p"
+
+	if [ $pcmode = yes ]; then
+		if [[ -n ${ZSH_VERSION-} ]]; then
+			gitstring=$(printf -- "$printf_format" "$gitstring")
+		else
+			printf -v gitstring -- "$printf_format" "$gitstring"
+		fi
+		PS1="$ps1pc_start$gitstring$ps1pc_end"
+	else
+		printf -- "$printf_format" "$gitstring"
+	fi
 }

From 3ca3c5a126a937dc6d6d3daba241f9a0f5a4c2f2 Mon Sep 17 00:00:00 2001
From: Wes Morgan 
Date: Mon, 14 Oct 2013 09:59:20 -0600
Subject: [PATCH 03/53] don't clobber existing RBENV_ROOT & follow Homebrew's
 default behavior

---
 plugins/rbenv/rbenv.plugin.zsh | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/plugins/rbenv/rbenv.plugin.zsh b/plugins/rbenv/rbenv.plugin.zsh
index 78f76c3a3..57ae2ca1f 100644
--- a/plugins/rbenv/rbenv.plugin.zsh
+++ b/plugins/rbenv/rbenv.plugin.zsh
@@ -10,12 +10,18 @@ FOUND_RBENV=0
 rbenvdirs=("$HOME/.rbenv" "/usr/local/rbenv" "/opt/rbenv")
 if _homebrew-installed && _rbenv-from-homebrew-installed ; then
     rbenvdirs=($(brew --prefix rbenv) "${rbenvdirs[@]}")
+    if [[ $RBENV_ROOT = '' ]]; then 
+      RBENV_ROOT="$HOME/.rbenv"
+    fi
 fi
 
 for rbenvdir in "${rbenvdirs[@]}" ; do
   if [ -d $rbenvdir/bin -a $FOUND_RBENV -eq 0 ] ; then
     FOUND_RBENV=1
-    export RBENV_ROOT=$rbenvdir
+    if [[ $RBENV_ROOT = '' ]]; then
+      RBENV_ROOT=$rbenvdir
+    fi
+    export RBENV_ROOT
     export PATH=${rbenvdir}/bin:$PATH
     eval "$(rbenv init --no-rehash - zsh)"
 

From c9f2c947e4bdc94676aeaf989ba16dbe35aa45ee Mon Sep 17 00:00:00 2001
From: Stefan Tatschner 
Date: Fri, 29 Nov 2013 14:24:14 +0100
Subject: [PATCH 04/53] Added/modified some useful aliases.

---
 lib/aliases.zsh | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/lib/aliases.zsh b/lib/aliases.zsh
index 9b3709172..517e4daf7 100644
--- a/lib/aliases.zsh
+++ b/lib/aliases.zsh
@@ -6,6 +6,11 @@ alias po='popd'
 alias ...='cd ../..'
 alias -- -='cd -'
 
+# Prevent headaches
+alias cp='cp -v'
+alias rm='rm -v'
+alias mv='mv -v'
+
 # Super user
 alias _='sudo'
 alias please='sudo'
@@ -17,9 +22,9 @@ alias history='fc -l 1'
 
 # List direcory contents
 alias lsa='ls -lah'
-alias l='ls -la'
-alias ll='ls -l'
-alias la='ls -lA'
+alias l='ls -lah'
+alias ll='ls -lh'
+alias la='ls -lAh'
 alias sl=ls # often screw this up
 
 alias afind='ack-grep -il'

From 0185d9920b7d6c380277a4a15c9e4818df41700a Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote 
Date: Mon, 9 Dec 2013 08:54:38 +0100
Subject: [PATCH 05/53] catimg plugin allow to print an image to the stdout
 using convert

---
 plugins/catimg/catimg.plugin.zsh |  16 ++++++
 plugins/catimg/catimg.sh         |  87 +++++++++++++++++++++++++++++++
 plugins/catimg/colors.png        | Bin 0 -> 353 bytes
 3 files changed, 103 insertions(+)
 create mode 100644 plugins/catimg/catimg.plugin.zsh
 create mode 100755 plugins/catimg/catimg.sh
 create mode 100644 plugins/catimg/colors.png

diff --git a/plugins/catimg/catimg.plugin.zsh b/plugins/catimg/catimg.plugin.zsh
new file mode 100644
index 000000000..01e81eca7
--- /dev/null
+++ b/plugins/catimg/catimg.plugin.zsh
@@ -0,0 +1,16 @@
+################################################################################
+# catimg script by Eduardo San Martin Morote aka Posva                         #
+# http://posva.net                                                             #
+#                                                                              #
+# Ouput the content of an image to the stdout using the 256 colors of the      #
+# terminal.                                                                    #
+# Github: https://github.com/posva/catimg                                      #
+################################################################################
+
+if [[ -x  `which convert` ]]; then
+  function catimg() {
+    source $(dirname $0)/catimg.sh $@
+  }
+else
+  echo "catimg need convert (ImageMagick) to work)"
+fi
diff --git a/plugins/catimg/catimg.sh b/plugins/catimg/catimg.sh
new file mode 100755
index 000000000..f9e067e34
--- /dev/null
+++ b/plugins/catimg/catimg.sh
@@ -0,0 +1,87 @@
+################################################################################
+# catimg script by Eduardo San Martin Morote aka Posva                         #
+# http://posva.net                                                             #
+#                                                                              #
+# Ouput the content of an image to the stdout using the 256 colors of the      #
+# terminal.                                                                    #
+# Github: https://github.com/posva/catimg                                      #
+################################################################################
+
+function help() {
+  echo "Usage catimg [-h] [-w width] [-c char] img"
+  echo "By default char is \"  \" and w is the terminal width"
+}
+
+# VARIABLES
+COLOR_FILE=$(dirname $0)/colors.png
+CHAR="  "
+
+WIDTH=""
+IMG=""
+
+while getopts qw:c:h opt; do
+  case "$opt" in
+    w) WIDTH="$OPTARG" ;;
+    c) CHAR="$OPTARG" ;;
+    h) help; exit ;;
+    *) help ; exit 1;;
+    esac
+  done
+
+while [ "$1" ]; do
+  IMG="$1"
+  shift
+done
+
+if [ "$IMG" = "" -o ! -f "$IMG" ]; then
+  help
+  exit 1
+fi
+
+if [ ! "$WIDTH" ]; then
+  COLS=$(expr $(tput cols) "/" $(echo -n "$CHAR" | wc -c))
+else
+  COLS=$(expr $WIDTH "/" $(echo -n "$CHAR" | wc -c))
+fi
+WIDTH=$(convert ${IMG} -print "%w\n" /dev/null)
+if [ "$WIDTH" -gt "$COLS" ]; then
+  WIDTH=$COLS
+fi
+
+REMAP=""
+if convert "$IMG" -resize $COLS\> +dither -remap $COLOR_FILE /dev/null ; then
+  REMAP="-remap $COLOR_FILE"
+else
+  echo "The version of convert is too old, don't expect good results :(" >&2
+  #convert "$IMG" -colors 256 PNG8:tmp.png
+  #IMG="tmp.png"
+fi
+
+# Display the image
+convert "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- |
+sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' |
+while read R G B f; do
+  if [ ! "$R" = "NO" ]; then
+    if [ "$R" -eq "$G" -a "$G" -eq "$B" ]; then
+      ((
+      I++,
+      IDX = 232 + R * 23 / 255
+      ))
+    else
+      ((
+      I++,
+      IDX = 16
+      + R * 5 / 255 * 36
+      + G * 5 / 255 * 6
+      + B * 5 / 255
+      ))
+    fi
+    #echo "$R,$G,$B: $IDX"
+    echo -ne "\e[48;5;${IDX}m${CHAR}"
+  else
+    (( I++ ))
+    echo -ne "\e[0m${CHAR}"
+  fi
+  # New lines
+  (( $I % $WIDTH )) || echo -e "\e[0m"
+done
diff --git a/plugins/catimg/colors.png b/plugins/catimg/colors.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f2c8126bc0d8911a9de5d3ffbd4e37372b41671
GIT binary patch
literal 353
zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7H9TD$Ln`8u|NQ@N&#bKc
z__8haA2${CI+9qz)+Cykjz%^8kLO5T$EmmJCv;@V^J`0Hz){|D6`T{v*^
z6Fo|~JSSz20pMs7lb)P$bvlIxs>gl00HWa4spqTy1`yO1G`^IBS)da#?K
zsxU|{fc^>bP0
Hl+XkKlf#Hs

literal 0
HcmV?d00001


From cbd63f220dff93ad6c9d00734949106443a5b03b Mon Sep 17 00:00:00 2001
From: Andy Fleming 
Date: Mon, 9 Dec 2013 19:38:27 +0000
Subject: [PATCH 06/53] Fix for virtualenv support - fixes #2328, fixes #2297,
 resolves #2319

---
 themes/af-magic.zsh-theme | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme
index 4cf282590..cd90b106e 100644
--- a/themes/af-magic.zsh-theme
+++ b/themes/af-magic.zsh-theme
@@ -27,7 +27,12 @@ eval my_gray='$FG[237]'
 eval my_orange='$FG[214]'
 
 # right prompt
-PROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
+if type "virtualenv_prompt" > /dev/null
+then
+	RPROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
+else
+	RPROMPT='$my_gray%n@%m%{$reset_color%}%'
+fi
 
 # git settings
 ZSH_THEME_GIT_PROMPT_PREFIX="$FG[075](branch:"

From 349fa15b187a1b2c411db90f2022013caf3479e8 Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote 
Date: Mon, 9 Dec 2013 22:07:19 +0100
Subject: [PATCH 07/53] Fixed a dirs bug for catimg

---
 plugins/catimg/catimg.plugin.zsh | 2 +-
 plugins/catimg/catimg.sh         | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/plugins/catimg/catimg.plugin.zsh b/plugins/catimg/catimg.plugin.zsh
index 01e81eca7..ee721cd03 100644
--- a/plugins/catimg/catimg.plugin.zsh
+++ b/plugins/catimg/catimg.plugin.zsh
@@ -9,7 +9,7 @@
 
 if [[ -x  `which convert` ]]; then
   function catimg() {
-    source $(dirname $0)/catimg.sh $@
+    source $ZSH/plugins/catimg/catimg.sh $@
   }
 else
   echo "catimg need convert (ImageMagick) to work)"
diff --git a/plugins/catimg/catimg.sh b/plugins/catimg/catimg.sh
index f9e067e34..c05fddcd4 100755
--- a/plugins/catimg/catimg.sh
+++ b/plugins/catimg/catimg.sh
@@ -43,7 +43,7 @@ if [ ! "$WIDTH" ]; then
 else
   COLS=$(expr $WIDTH "/" $(echo -n "$CHAR" | wc -c))
 fi
-WIDTH=$(convert ${IMG} -print "%w\n" /dev/null)
+WIDTH=$(convert "$IMG" -print "%w\n" /dev/null)
 if [ "$WIDTH" -gt "$COLS" ]; then
   WIDTH=$COLS
 fi
@@ -58,6 +58,7 @@ else
 fi
 
 # Display the image
+I=0
 convert "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- |
 sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' |
 while read R G B f; do

From 44b23ae194a1580a6af6d692e4ba268d61828929 Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote 
Date: Mon, 9 Dec 2013 22:18:20 +0100
Subject: [PATCH 08/53] catimg: fix exit without using source supresses errors
 from convert whilen converting, as they are usually just warnings

---
 plugins/catimg/catimg.plugin.zsh | 2 +-
 plugins/catimg/catimg.sh         | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/plugins/catimg/catimg.plugin.zsh b/plugins/catimg/catimg.plugin.zsh
index ee721cd03..70ef9a63c 100644
--- a/plugins/catimg/catimg.plugin.zsh
+++ b/plugins/catimg/catimg.plugin.zsh
@@ -9,7 +9,7 @@
 
 if [[ -x  `which convert` ]]; then
   function catimg() {
-    source $ZSH/plugins/catimg/catimg.sh $@
+    zsh $ZSH/plugins/catimg/catimg.sh $@
   }
 else
   echo "catimg need convert (ImageMagick) to work)"
diff --git a/plugins/catimg/catimg.sh b/plugins/catimg/catimg.sh
index c05fddcd4..cd0f2e333 100755
--- a/plugins/catimg/catimg.sh
+++ b/plugins/catimg/catimg.sh
@@ -59,7 +59,7 @@ fi
 
 # Display the image
 I=0
-convert "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- |
+convert "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- 2>/dev/null |
 sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' |
 while read R G B f; do
   if [ ! "$R" = "NO" ]; then

From c05a28a7d9c5ca86b66b0fdf2f509e07b2a7b616 Mon Sep 17 00:00:00 2001
From: Andy Fleming 
Date: Tue, 10 Dec 2013 00:11:22 +0000
Subject: [PATCH 09/53] typo fix

---
 themes/af-magic.zsh-theme | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme
index cd90b106e..f40aa284a 100644
--- a/themes/af-magic.zsh-theme
+++ b/themes/af-magic.zsh-theme
@@ -27,7 +27,7 @@ eval my_gray='$FG[237]'
 eval my_orange='$FG[214]'
 
 # right prompt
-if type "virtualenv_prompt" > /dev/null
+if type "virtualenv_prompt_info" > /dev/null
 then
 	RPROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
 else

From fdfc90705242841d7491bb945c35a3601d1c8996 Mon Sep 17 00:00:00 2001
From: Mikhail Nikalyukin 
Date: Fri, 6 Dec 2013 12:20:38 +0200
Subject: [PATCH 10/53] Add rdmtc alias for rails plugin.

---
 plugins/rails/rails.plugin.zsh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh
index 23d15a9a1..4a96754e4 100644
--- a/plugins/rails/rails.plugin.zsh
+++ b/plugins/rails/rails.plugin.zsh
@@ -51,6 +51,7 @@ alias rds='rake db:seed'
 alias rdd='rake db:drop'
 alias rdtc='rake db:test:clone'
 alias rdtp='rake db:test:prepare'
+alias rdmtc='rake db:migrate db:test:clone'
 
 alias rlc='rake log:clear'
 alias rn='rake notes'

From e41b6acd2a34bd2ad2a092b94629c95b1f932f82 Mon Sep 17 00:00:00 2001
From: chuancong 
Date: Thu, 19 Dec 2013 11:24:38 -0800
Subject: [PATCH 11/53] Add support to command "show"

---
 plugins/pip/_pip | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/plugins/pip/_pip b/plugins/pip/_pip
index 967da48ca..7c1238db7 100644
--- a/plugins/pip/_pip
+++ b/plugins/pip/_pip
@@ -20,6 +20,7 @@ _1st_arguments=(
   'bundle:create pybundles (archives containing multiple packages)'
   'freeze:output all currently installed packages (exact versions) to stdout'
   'help:show available commands'
+  'show:show information about installed packages'
   'install:install packages'
   'search:search PyPI'
   'uninstall:uninstall packages'
@@ -76,4 +77,7 @@ case "$words[1]" in
   uninstall)
     _pip_installed
     _wanted installed_pkgs expl 'installed packages' compadd -a installed_pkgs ;;
+  show)
+    _pip_installed
+    _wanted installed_pkgs expl 'installed packages' compadd -a installed_pkgs ;;
 esac

From bbbff94cca497103d0f9854f9d8a67b9049f59c9 Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 31 Dec 2013 00:35:57 +0100
Subject: [PATCH 12/53] Fixes rvm_prompt_info() in lib/rvm.zsh

---
 lib/rvm.zsh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/rvm.zsh b/lib/rvm.zsh
index e8744e61e..d14b45632 100644
--- a/lib/rvm.zsh
+++ b/lib/rvm.zsh
@@ -2,7 +2,7 @@
 function rvm_prompt_info() {
   [ -f $HOME/.rvm/bin/rvm-prompt ] || return
   local rvm_prompt
-  rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
+  rvm_prompt=$(eval "$HOME/.rvm/bin/rvm-prompt $ZSH_THEME_RVM_PROMPT_OPTIONS" 2>/dev/null)
   [[ "${rvm_prompt}x" == "x" ]] && return
   echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
 }

From 468b24a8d54f294ab9802cac3801ba580c5c4397 Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 31 Dec 2013 01:06:14 +0100
Subject: [PATCH 13/53] Returns false when rvm is not found.

---
 lib/rvm.zsh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/rvm.zsh b/lib/rvm.zsh
index d14b45632..04d116397 100644
--- a/lib/rvm.zsh
+++ b/lib/rvm.zsh
@@ -1,8 +1,8 @@
 # get the name of the ruby version
 function rvm_prompt_info() {
-  [ -f $HOME/.rvm/bin/rvm-prompt ] || return
+  [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
   local rvm_prompt
   rvm_prompt=$(eval "$HOME/.rvm/bin/rvm-prompt $ZSH_THEME_RVM_PROMPT_OPTIONS" 2>/dev/null)
-  [[ "${rvm_prompt}x" == "x" ]] && return
+  [[ "${rvm_prompt}x" == "x" ]] && return 1
   echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
 }

From ae6ded5ad795a7f4174bc10a5a02e1c0502e1352 Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 31 Dec 2013 01:15:35 +0100
Subject: [PATCH 14/53] Returns false when rbenv is not found.

---
 lib/rbenv.zsh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lib/rbenv.zsh b/lib/rbenv.zsh
index a8b6c323c..f58074b83 100644
--- a/lib/rbenv.zsh
+++ b/lib/rbenv.zsh
@@ -1,2 +1,4 @@
 # using the rbenv plugin will override this with a real implementation
-function rbenv_prompt_info() {}
+function rbenv_prompt_info() {
+  return 1
+}

From 7aa766168cead04f677b4828cc5c837f823f7cd7 Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 31 Dec 2013 01:44:51 +0100
Subject: [PATCH 15/53] Adds chruby_prompt_info dummy function.

---
 lib/chruby.zsh | 4 ++++
 1 file changed, 4 insertions(+)
 create mode 100644 lib/chruby.zsh

diff --git a/lib/chruby.zsh b/lib/chruby.zsh
new file mode 100644
index 000000000..b78d04f86
--- /dev/null
+++ b/lib/chruby.zsh
@@ -0,0 +1,4 @@
+# using the chruby plugin will override this with a real implementation
+function chruby_prompt_info() {
+  return 1
+}

From 8a887c505282b771193ac3ee6df05a1fa3f8426a Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 31 Dec 2013 02:11:02 +0100
Subject: [PATCH 16/53] Joins ruby prompt files and adds ruby_prompt_info.

---
 lib/chruby.zsh       |  4 ----
 lib/rbenv.zsh        |  4 ----
 lib/ruby_prompts.zsh | 22 ++++++++++++++++++++++
 lib/rvm.zsh          |  8 --------
 4 files changed, 22 insertions(+), 16 deletions(-)
 delete mode 100644 lib/chruby.zsh
 delete mode 100644 lib/rbenv.zsh
 create mode 100644 lib/ruby_prompts.zsh
 delete mode 100644 lib/rvm.zsh

diff --git a/lib/chruby.zsh b/lib/chruby.zsh
deleted file mode 100644
index b78d04f86..000000000
--- a/lib/chruby.zsh
+++ /dev/null
@@ -1,4 +0,0 @@
-# using the chruby plugin will override this with a real implementation
-function chruby_prompt_info() {
-  return 1
-}
diff --git a/lib/rbenv.zsh b/lib/rbenv.zsh
deleted file mode 100644
index f58074b83..000000000
--- a/lib/rbenv.zsh
+++ /dev/null
@@ -1,4 +0,0 @@
-# using the rbenv plugin will override this with a real implementation
-function rbenv_prompt_info() {
-  return 1
-}
diff --git a/lib/ruby_prompts.zsh b/lib/ruby_prompts.zsh
new file mode 100644
index 000000000..287b3ff0a
--- /dev/null
+++ b/lib/ruby_prompts.zsh
@@ -0,0 +1,22 @@
+# get the name of the rvm ruby version
+function rvm_prompt_info() {
+  [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
+  local rvm_prompt
+  rvm_prompt=$(eval "$HOME/.rvm/bin/rvm-prompt $ZSH_THEME_RVM_PROMPT_OPTIONS" 2>/dev/null)
+  [[ "${rvm_prompt}x" == "x" ]] && return 1
+  echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
+}
+
+# using the rbenv plugin will override this with a real implementation
+function rbenv_prompt_info() {
+  return 1
+}
+
+# using the chruby plugin will override this with a real implementation
+function chruby_prompt_info() {
+  return 1
+}
+
+function ruby_prompt_info() {
+  echo $(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)
+}
diff --git a/lib/rvm.zsh b/lib/rvm.zsh
deleted file mode 100644
index 04d116397..000000000
--- a/lib/rvm.zsh
+++ /dev/null
@@ -1,8 +0,0 @@
-# get the name of the ruby version
-function rvm_prompt_info() {
-  [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
-  local rvm_prompt
-  rvm_prompt=$(eval "$HOME/.rvm/bin/rvm-prompt $ZSH_THEME_RVM_PROMPT_OPTIONS" 2>/dev/null)
-  [[ "${rvm_prompt}x" == "x" ]] && return 1
-  echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
-}

From c6aacf611d51f7c00d216f77c3b32174cc3bed9c Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 31 Dec 2013 02:45:09 +0100
Subject: [PATCH 17/53] Refactors ruby_prompts.zsh

---
 lib/ruby_prompts.zsh | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/lib/ruby_prompts.zsh b/lib/ruby_prompts.zsh
index 287b3ff0a..2ef334d5f 100644
--- a/lib/ruby_prompts.zsh
+++ b/lib/ruby_prompts.zsh
@@ -7,13 +7,9 @@ function rvm_prompt_info() {
   echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
 }
 
-# using the rbenv plugin will override this with a real implementation
-function rbenv_prompt_info() {
-  return 1
-}
-
-# using the chruby plugin will override this with a real implementation
-function chruby_prompt_info() {
+# using the chruby and/or rbenv plugins will override
+# these with real implementations
+function chruby_prompt_info rbenv_prompt_info {
   return 1
 }
 

From 9ce1b6289aebc8e19b8bb25e4f7ac1cbc84e83de Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Sat, 4 Jan 2014 22:06:09 +0100
Subject: [PATCH 18/53] new faster SVN plugin

---
 .../svn-fast-info/svn-fast-info.plugin.zsh    | 64 +++++++++++++++++++
 1 file changed, 64 insertions(+)
 create mode 100644 plugins/svn-fast-info/svn-fast-info.plugin.zsh

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
new file mode 100644
index 000000000..d8fc53989
--- /dev/null
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -0,0 +1,64 @@
+# vim:ft=zsh ts=2 sw=2 sts=2
+#
+# Faster alternative to the current SVN plugin implementation.
+#
+# Works with svn 1.6, 1.7, 1.8.
+# Use `svn_prompt_info` method to enquire the svn data.
+# It's faster because his efficient use of svn (single svn call) done in the `parse_svn` function
+# Also changed prompt suffix *after* the svn dirty marker
+#
+# *** IMPORTANT *** DO NO USE with the simple svn plugin, this plugin acts as a replacement of it.
+
+function parse_svn() {
+    info=$(svn info 2> /dev/null) || return
+    in_svn=true
+	repo_need_upgrade="$(svn_repo_need_upgrade $info)"
+    svn_branch_name="$(svn_get_branch_name $info)"
+    svn_dirty="$(svn_dirty_choose)"
+    svn_repo_name="$(svn_get_repo_name $info)"
+    svn_rev="$(svn_get_revision $info)"
+}
+
+function svn_prompt_info() {
+    eval parse_svn
+
+    if [ ${in_svn} ]; then
+        echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
+$ZSH_THEME_REPO_NAME_COLOR${svn_branch_name}\
+$ZSH_PROMPT_BASE_COLOR${svn_dirty}\
+$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX\
+$ZSH_PROMPT_BASE_COLOR"
+    fi
+}
+
+
+function svn_repo_need_upgrade() {
+	info=$1
+	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
+	[ "${info}" = "E155036" ] && echo "upgrade repo with svn upgrade"
+}
+
+function svn_get_branch_name() {
+	info=$1
+	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
+    echo $info | grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' | egrep -o '[^/]+$' | read SVN_URL
+    echo $SVN_URL
+}
+
+function svn_get_repo_name() {
+	info=$1
+	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
+    echo $info | sed -n 's/Repository\ Root:\ .*\///p' | read SVN_ROOT
+    echo $info | sed -n "s/URL:\ .*$SVN_ROOT\///p"
+}
+
+function svn_get_revision() {
+	info=$1
+	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
+    echo $info 2> /dev/null | sed -n s/Revision:\ //p
+}
+
+function svn_dirty_choose() {
+    svn status | grep -E '^\s*[ACDIM!?L]' > /dev/null 2>/dev/null && echo $ZSH_THEME_SVN_PROMPT_DIRTY && return
+    echo $ZSH_THEME_SVN_PROMPT_CLEAN
+}
\ No newline at end of file

From 72392a2c27386706c78efe1ace9b84e602d9d1ff Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Mon, 6 Jan 2014 09:57:09 +0100
Subject: [PATCH 19/53] Adds all other dummy implementations.

---
 lib/ruby_prompts.zsh | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/lib/ruby_prompts.zsh b/lib/ruby_prompts.zsh
index 2ef334d5f..9ca6e1fc7 100644
--- a/lib/ruby_prompts.zsh
+++ b/lib/ruby_prompts.zsh
@@ -1,3 +1,10 @@
+function chruby_prompt_info hg_prompt_info pyenv_prompt_info \
+  rbenv_prompt_info svn_prompt_info vi_mode_prompt_info \
+  virtualenv_prompt_info {
+  return 1
+}
+
+# oh-my-zsh supports an rvm prompt by default
 # get the name of the rvm ruby version
 function rvm_prompt_info() {
   [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
@@ -7,12 +14,8 @@ function rvm_prompt_info() {
   echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
 }
 
-# using the chruby and/or rbenv plugins will override
-# these with real implementations
-function chruby_prompt_info rbenv_prompt_info {
-  return 1
-}
-
+# use this to enable users to see their ruby version, no matter which
+# version management system they use
 function ruby_prompt_info() {
   echo $(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)
 }

From 082607c165c6ae16b7b059e941c8bfa3eddabbb8 Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Mon, 6 Jan 2014 09:57:23 +0100
Subject: [PATCH 20/53] Adds documentation.

---
 lib/ruby_prompts.zsh | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/lib/ruby_prompts.zsh b/lib/ruby_prompts.zsh
index 9ca6e1fc7..1aaf9de17 100644
--- a/lib/ruby_prompts.zsh
+++ b/lib/ruby_prompts.zsh
@@ -1,3 +1,15 @@
+# *_prompt_info functions for usage in your prompt
+#
+# Plugin creators, please add your *_prompt_info function to the list
+# of dummy implementations to help theme creators not receiving errors
+# without the need of implementing conditional clauses.
+#
+# See also lib/bzr.zsh, lib/git.zsh and lib/nvm.zsh for
+# git_prompt_info, bzr_prompt_info and nvm_prompt_info
+
+# Dummy implementations that return false to prevent command_not_found
+# errors with themes, that implement these functions
+# Real implementations will be used when the respective plugins are loaded
 function chruby_prompt_info hg_prompt_info pyenv_prompt_info \
   rbenv_prompt_info svn_prompt_info vi_mode_prompt_info \
   virtualenv_prompt_info {

From 85fde31991dc04f34450390e7d20992a7334c90a Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Mon, 6 Jan 2014 09:58:40 +0100
Subject: [PATCH 21/53] Renames the file to prompt_info_functions.zsh

---
 lib/{ruby_prompts.zsh => prompt_info_functions.zsh} | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 rename lib/{ruby_prompts.zsh => prompt_info_functions.zsh} (100%)

diff --git a/lib/ruby_prompts.zsh b/lib/prompt_info_functions.zsh
similarity index 100%
rename from lib/ruby_prompts.zsh
rename to lib/prompt_info_functions.zsh

From 2d6d9d525fbf791affef71e2d7fd0a0f2cd0c30c Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Mon, 6 Jan 2014 09:59:50 +0100
Subject: [PATCH 22/53] Fixes RPROMPT in af-magic.zsh-theme

---
 themes/af-magic.zsh-theme | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme
index 4cf282590..f241efb6a 100644
--- a/themes/af-magic.zsh-theme
+++ b/themes/af-magic.zsh-theme
@@ -27,7 +27,7 @@ eval my_gray='$FG[237]'
 eval my_orange='$FG[214]'
 
 # right prompt
-PROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
+RPROMPT='$(virtualenv_prompt_info)$my_gray%n@%m%{$reset_color%}%'
 
 # git settings
 ZSH_THEME_GIT_PROMPT_PREFIX="$FG[075](branch:"

From 1304ed8d2521e452615bcf7563700018443f5470 Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Mon, 6 Jan 2014 14:09:40 +0100
Subject: [PATCH 23/53] Report the SVN need upgrade

This happen when subversion 1.7+ is used on a repository created with subversion up to 1.6
---
 plugins/svn-fast-info/svn-fast-info.plugin.zsh | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index d8fc53989..1027bcac2 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -10,7 +10,7 @@
 # *** IMPORTANT *** DO NO USE with the simple svn plugin, this plugin acts as a replacement of it.
 
 function parse_svn() {
-    info=$(svn info 2> /dev/null) || return
+	info=$(svn info 2>&1) || return; # capture stdout and stdout
     in_svn=true
 	repo_need_upgrade="$(svn_repo_need_upgrade $info)"
     svn_branch_name="$(svn_get_branch_name $info)"
@@ -22,7 +22,13 @@ function parse_svn() {
 function svn_prompt_info() {
     eval parse_svn
 
-    if [ ${in_svn} ]; then
+	if [ ! -z $repo_need_upgrade ]; then
+		echo $ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX$ZSH_PROMPT_BASE_COLOR\
+$repo_need_upgrade\
+$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR
+	fi
+
+    if [[ ${in_svn} == true && -z $repo_need_upgrade ]]; then
         echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
 $ZSH_THEME_REPO_NAME_COLOR${svn_branch_name}\
 $ZSH_PROMPT_BASE_COLOR${svn_dirty}\
@@ -34,8 +40,8 @@ $ZSH_PROMPT_BASE_COLOR"
 
 function svn_repo_need_upgrade() {
 	info=$1
-	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-	[ "${info}" = "E155036" ] && echo "upgrade repo with svn upgrade"
+	[ -z "${info}" ] && info=$(svn info 2>&1)
+	if grep -q "E155036" <<< $info; then echo "E155036: upgrade repo with svn upgrade"; fi
 }
 
 function svn_get_branch_name() {
@@ -61,4 +67,4 @@ function svn_get_revision() {
 function svn_dirty_choose() {
     svn status | grep -E '^\s*[ACDIM!?L]' > /dev/null 2>/dev/null && echo $ZSH_THEME_SVN_PROMPT_DIRTY && return
     echo $ZSH_THEME_SVN_PROMPT_CLEAN
-}
\ No newline at end of file
+}

From 642ae64bc50f93739ca280e8dcb1d6dbb5932f58 Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Tue, 7 Jan 2014 02:10:34 +0100
Subject: [PATCH 24/53] Inline `parse_svn` to avoid leaky state

As noted in review, `in_svn` is not properly reset to false. This is better anyway to not leak state.
---
 .../svn-fast-info/svn-fast-info.plugin.zsh    | 38 +++++++++----------
 1 file changed, 17 insertions(+), 21 deletions(-)

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index 1027bcac2..e75f21599 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -9,18 +9,14 @@
 #
 # *** IMPORTANT *** DO NO USE with the simple svn plugin, this plugin acts as a replacement of it.
 
-function parse_svn() {
-	info=$(svn info 2>&1) || return; # capture stdout and stdout
-    in_svn=true
-	repo_need_upgrade="$(svn_repo_need_upgrade $info)"
-    svn_branch_name="$(svn_get_branch_name $info)"
-    svn_dirty="$(svn_dirty_choose)"
-    svn_repo_name="$(svn_get_repo_name $info)"
-    svn_rev="$(svn_get_revision $info)"
-}
-
 function svn_prompt_info() {
-    eval parse_svn
+	info=$(svn info 2>&1) || return; # capture stdout and stdout
+	in_svn=true
+	repo_need_upgrade="$(svn_repo_need_upgrade $info)"
+	svn_branch_name="$(svn_get_branch_name $info)"
+	svn_dirty="$(svn_dirty_choose)"
+	svn_repo_name="$(svn_get_repo_name $info)"
+	svn_rev="$(svn_get_revision $info)"
 
 	if [ ! -z $repo_need_upgrade ]; then
 		echo $ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX$ZSH_PROMPT_BASE_COLOR\
@@ -28,13 +24,13 @@ $repo_need_upgrade\
 $ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR
 	fi
 
-    if [[ ${in_svn} == true && -z $repo_need_upgrade ]]; then
-        echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
+	if [[ ${in_svn} == true && -z $repo_need_upgrade ]]; then
+		echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
 $ZSH_THEME_REPO_NAME_COLOR${svn_branch_name}\
 $ZSH_PROMPT_BASE_COLOR${svn_dirty}\
 $ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX\
 $ZSH_PROMPT_BASE_COLOR"
-    fi
+	fi
 }
 
 
@@ -47,24 +43,24 @@ function svn_repo_need_upgrade() {
 function svn_get_branch_name() {
 	info=$1
 	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-    echo $info | grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' | egrep -o '[^/]+$' | read SVN_URL
-    echo $SVN_URL
+	echo $info | grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' | egrep -o '[^/]+$' | read SVN_URL
+	echo $SVN_URL
 }
 
 function svn_get_repo_name() {
 	info=$1
 	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-    echo $info | sed -n 's/Repository\ Root:\ .*\///p' | read SVN_ROOT
-    echo $info | sed -n "s/URL:\ .*$SVN_ROOT\///p"
+	echo $info | sed -n 's/Repository\ Root:\ .*\///p' | read SVN_ROOT
+	echo $info | sed -n "s/URL:\ .*$SVN_ROOT\///p"
 }
 
 function svn_get_revision() {
 	info=$1
 	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-    echo $info 2> /dev/null | sed -n s/Revision:\ //p
+	echo $info 2> /dev/null | sed -n s/Revision:\ //p
 }
 
 function svn_dirty_choose() {
-    svn status | grep -E '^\s*[ACDIM!?L]' > /dev/null 2>/dev/null && echo $ZSH_THEME_SVN_PROMPT_DIRTY && return
-    echo $ZSH_THEME_SVN_PROMPT_CLEAN
+	svn status | grep -E '^\s*[ACDIM!?L]' > /dev/null 2>/dev/null && echo $ZSH_THEME_SVN_PROMPT_DIRTY && return
+	echo $ZSH_THEME_SVN_PROMPT_CLEAN
 }

From 8bf8e1ecf9eeb4117b1196a5fd02d788979f05f7 Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 7 Jan 2014 10:07:02 +0100
Subject: [PATCH 25/53] Heavy refactor of svn-fast-info

---
 .../svn-fast-info/svn-fast-info.plugin.zsh    | 88 +++++++++++--------
 1 file changed, 50 insertions(+), 38 deletions(-)

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index e75f21599..2183010ba 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -1,4 +1,4 @@
-# vim:ft=zsh ts=2 sw=2 sts=2
+# vim:ft=zsh ts=2 sw=2 sts=2 et
 #
 # Faster alternative to the current SVN plugin implementation.
 #
@@ -10,57 +10,69 @@
 # *** IMPORTANT *** DO NO USE with the simple svn plugin, this plugin acts as a replacement of it.
 
 function svn_prompt_info() {
-	info=$(svn info 2>&1) || return; # capture stdout and stdout
-	in_svn=true
-	repo_need_upgrade="$(svn_repo_need_upgrade $info)"
-	svn_branch_name="$(svn_get_branch_name $info)"
-	svn_dirty="$(svn_dirty_choose)"
-	svn_repo_name="$(svn_get_repo_name $info)"
-	svn_rev="$(svn_get_revision $info)"
+  local info
+  info=$(svn info 2>&1) || return 1; # capture stdout and stderr
+  local repo_need_upgrade=$(svn_repo_need_upgrade $info)
 
-	if [ ! -z $repo_need_upgrade ]; then
-		echo $ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX$ZSH_PROMPT_BASE_COLOR\
-$repo_need_upgrade\
-$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR
-	fi
-
-	if [[ ${in_svn} == true && -z $repo_need_upgrade ]]; then
-		echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
-$ZSH_THEME_REPO_NAME_COLOR${svn_branch_name}\
-$ZSH_PROMPT_BASE_COLOR${svn_dirty}\
-$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX\
-$ZSH_PROMPT_BASE_COLOR"
-	fi
+  if [ -n $repo_need_upgrade ]; then
+    printf '%s%s%s%s%s%s%s\n' \
+      $ZSH_PROMPT_BASE_COLOR \
+      $ZSH_THEME_SVN_PROMPT_PREFIX \
+      $ZSH_PROMPT_BASE_COLOR \
+      $repo_need_upgrade \
+      $ZSH_PROMPT_BASE_COLOR \
+      $ZSH_THEME_SVN_PROMPT_SUFFIX \
+      $ZSH_PROMPT_BASE_COLOR \
+  else
+    # something left for you to fix -
+    # repo name and rev aren't used here, did you forget them?
+    # especially since you set a repo name color
+    # if the prompt is alright this way, leave it as is and just
+    # delete the comment. The functions itself could stay imo,
+    # gives others the chance to use them.
+    printf '%s%s%s%s%s%s%s%s%s\n' \
+      $ZSH_PROMPT_BASE_COLOR \
+      $ZSH_THEME_SVN_PROMPT_PREFIX \
+      $ZSH_THEME_REPO_NAME_COLOR \
+      $(svn_get_branch_name $info)
+      ${svn_branch_name}\
+      $ZSH_PROMPT_BASE_COLOR
+      $(svn_dirty_choose $info)
+      $ZSH_PROMPT_BASE_COLOR
+      $ZSH_THEME_SVN_PROMPT_SUFFIX\
+      $ZSH_PROMPT_BASE_COLOR
+  fi
 }
 
-
 function svn_repo_need_upgrade() {
-	info=$1
-	[ -z "${info}" ] && info=$(svn info 2>&1)
-	if grep -q "E155036" <<< $info; then echo "E155036: upgrade repo with svn upgrade"; fi
+  grep -q "E155036" <<< ${1:-$(svn info 2> /dev/null)} && \
+    echo "E155036: upgrade repo with svn upgrade"
 }
 
 function svn_get_branch_name() {
-	info=$1
-	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-	echo $info | grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' | egrep -o '[^/]+$' | read SVN_URL
-	echo $SVN_URL
+  echo ${1:-$(svn info 2> /dev/null)} |\
+    grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' |\
+    egrep -o '[^/]+$'
 }
 
 function svn_get_repo_name() {
-	info=$1
-	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-	echo $info | sed -n 's/Repository\ Root:\ .*\///p' | read SVN_ROOT
-	echo $info | sed -n "s/URL:\ .*$SVN_ROOT\///p"
+  # I think this can be further cleaned up as well, not sure how,
+  # as I can't test it
+  local svn_root
+  local info=${1:-$(svn info 2> /dev/null)}
+  echo $info | sed 's/Repository\ Root:\ .*\///p' | read svn_root
+  echo $info | sed "s/URL:\ .*$svn_root\///p"
 }
 
 function svn_get_revision() {
-	info=$1
-	[ -z "${info}" ] && info=$(svn info 2> /dev/null)
-	echo $info 2> /dev/null | sed -n s/Revision:\ //p
+  # does this work as it should?
+  echo ${1:-$(svn info 2> /dev/null)} | sed 's/Revision: //p'
 }
 
 function svn_dirty_choose() {
-	svn status | grep -E '^\s*[ACDIM!?L]' > /dev/null 2>/dev/null && echo $ZSH_THEME_SVN_PROMPT_DIRTY && return
-	echo $ZSH_THEME_SVN_PROMPT_CLEAN
+  if svn status | grep -E '^\s*[ACDIM!?L]' &> /dev/null; then
+    echo $ZSH_THEME_SVN_PROMPT_DIRTY
+  else
+    echo $ZSH_THEME_SVN_PROMPT_CLEAN
+  fi
 }

From b0b79e0abae5f1d228e16c36174bad2bf7ba5fee Mon Sep 17 00:00:00 2001
From: LFDM <1986gh@gmail.com>
Date: Tue, 7 Jan 2014 19:08:20 +0100
Subject: [PATCH 26/53] No need to eval in rvm_prompt_info!

Just activate word-splitting.
---
 lib/prompt_info_functions.zsh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/prompt_info_functions.zsh b/lib/prompt_info_functions.zsh
index 1aaf9de17..335c02a3d 100644
--- a/lib/prompt_info_functions.zsh
+++ b/lib/prompt_info_functions.zsh
@@ -21,7 +21,7 @@ function chruby_prompt_info hg_prompt_info pyenv_prompt_info \
 function rvm_prompt_info() {
   [ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
   local rvm_prompt
-  rvm_prompt=$(eval "$HOME/.rvm/bin/rvm-prompt $ZSH_THEME_RVM_PROMPT_OPTIONS" 2>/dev/null)
+  rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
   [[ "${rvm_prompt}x" == "x" ]] && return 1
   echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
 }

From 8ede6c6af3b3f11d9b688e4bf9c97be8a54c6c4d Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Wed, 8 Jan 2014 02:50:58 +0100
Subject: [PATCH 27/53] Added further cleanup and svn status information

---
 .../svn-fast-info/svn-fast-info.plugin.zsh    | 64 +++++++++----------
 1 file changed, 30 insertions(+), 34 deletions(-)

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index 2183010ba..2d43d365b 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -14,7 +14,7 @@ function svn_prompt_info() {
   info=$(svn info 2>&1) || return 1; # capture stdout and stderr
   local repo_need_upgrade=$(svn_repo_need_upgrade $info)
 
-  if [ -n $repo_need_upgrade ]; then
+  if [[ -n $repo_need_upgrade ]]; then
     printf '%s%s%s%s%s%s%s\n' \
       $ZSH_PROMPT_BASE_COLOR \
       $ZSH_THEME_SVN_PROMPT_PREFIX \
@@ -22,57 +22,53 @@ function svn_prompt_info() {
       $repo_need_upgrade \
       $ZSH_PROMPT_BASE_COLOR \
       $ZSH_THEME_SVN_PROMPT_SUFFIX \
-      $ZSH_PROMPT_BASE_COLOR \
+      $ZSH_PROMPT_BASE_COLOR
   else
-    # something left for you to fix -
-    # repo name and rev aren't used here, did you forget them?
-    # especially since you set a repo name color
-    # if the prompt is alright this way, leave it as is and just
-    # delete the comment. The functions itself could stay imo,
-    # gives others the chance to use them.
-    printf '%s%s%s%s%s%s%s%s%s\n' \
+    printf '%s%s%s %s%s:%s%s%s%s%s' \
       $ZSH_PROMPT_BASE_COLOR \
       $ZSH_THEME_SVN_PROMPT_PREFIX \
-      $ZSH_THEME_REPO_NAME_COLOR \
-      $(svn_get_branch_name $info)
-      ${svn_branch_name}\
-      $ZSH_PROMPT_BASE_COLOR
-      $(svn_dirty_choose $info)
-      $ZSH_PROMPT_BASE_COLOR
-      $ZSH_THEME_SVN_PROMPT_SUFFIX\
+      \
+      "$(svn_status_info $info)" \
+      $ZSH_PROMPT_BASE_COLOR \
+      \
+      $ZSH_THEME_BRANCH_NAME_COLOR \
+      $(svn_get_branch_name $info) \
+      $ZSH_PROMPT_BASE_COLOR \
+      \
+      $(svn_get_revision $info) \
+      $ZSH_PROMPT_BASE_COLOR \
+      \
+      $ZSH_THEME_SVN_PROMPT_SUFFIX \
       $ZSH_PROMPT_BASE_COLOR
   fi
 }
 
+
 function svn_repo_need_upgrade() {
   grep -q "E155036" <<< ${1:-$(svn info 2> /dev/null)} && \
     echo "E155036: upgrade repo with svn upgrade"
 }
 
 function svn_get_branch_name() {
-  echo ${1:-$(svn info 2> /dev/null)} |\
-    grep '^URL:' | egrep -o '(tags|branches)/[^/]+|trunk' |\
-    egrep -o '[^/]+$'
+  grep '^URL:' <<< "${1:-$(svn info 2> /dev/null)}" | egrep -o '(tags|branches)/[^/]+|trunk'	
 }
 
-function svn_get_repo_name() {
-  # I think this can be further cleaned up as well, not sure how,
-  # as I can't test it
-  local svn_root
-  local info=${1:-$(svn info 2> /dev/null)}
-  echo $info | sed 's/Repository\ Root:\ .*\///p' | read svn_root
-  echo $info | sed "s/URL:\ .*$svn_root\///p"
+function svn_get_repo_root_name() {
+  grep '^Repository\ Root:' <<< "${1:-$(svn info 2> /dev/null)}" | sed 's#.*/##'
 }
 
 function svn_get_revision() {
-  # does this work as it should?
-  echo ${1:-$(svn info 2> /dev/null)} | sed 's/Revision: //p'
+  echo "${1:-$(svn info 2> /dev/null)}" | sed -n 's/Revision: //p'
 }
 
-function svn_dirty_choose() {
-  if svn status | grep -E '^\s*[ACDIM!?L]' &> /dev/null; then
-    echo $ZSH_THEME_SVN_PROMPT_DIRTY
-  else
-    echo $ZSH_THEME_SVN_PROMPT_CLEAN
-  fi
+function svn_status_info() {
+  local svn_status_string="$ZSH_THEME_SVN_PROMPT_CLEAN"
+  local svn_status="$(svn status 2> /dev/null)";
+  if grep -E '^\s*A' &> /dev/null <<< $svn_status; then svn_status_string="$svn_status_string ${ZSH_THEME_SVN_PROMPT_ADDITIONS:-+}"; fi
+  if grep -E '^\s*D' &> /dev/null <<< $svn_status; then svn_status_string="$svn_status_string ${ZSH_THEME_SVN_PROMPT_DELETIONS:-✖}"; fi
+  if grep -E '^\s*M' &> /dev/null <<< $svn_status; then svn_status_string="$svn_status_string ${ZSH_THEME_SVN_PROMPT_MODIFICATIONS:-✎}"; fi
+  if grep -E '^\s*[R~]' &> /dev/null <<< $svn_status; then svn_status_string="$svn_status_string ${ZSH_THEME_SVN_PROMPT_REPLACEMENTS:-∿}"; fi
+  if grep -E '^\s*\?' &> /dev/null <<< $svn_status; then svn_status_string="$svn_status_string ${ZSH_THEME_SVN_PROMPT_UNTRACKED:-?}"; fi
+  if grep -E '^\s*[CI!L]' &> /dev/null <<< $svn_status; then svn_status_string="$svn_status_string ${ZSH_THEME_SVN_PROMPT_DIRTY:-'!'}"; fi
+  echo $svn_status_string
 }

From f66ab7f98f9be0486b3a55858d9466232fc97ef6 Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Wed, 8 Jan 2014 03:04:54 +0100
Subject: [PATCH 28/53] Renamed the methods of this script

---
 .../svn-fast-info/svn-fast-info.plugin.zsh    | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index 2d43d365b..a12007ec6 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -4,12 +4,10 @@
 #
 # Works with svn 1.6, 1.7, 1.8.
 # Use `svn_prompt_info` method to enquire the svn data.
-# It's faster because his efficient use of svn (single svn call) done in the `parse_svn` function
-# Also changed prompt suffix *after* the svn dirty marker
-#
-# *** IMPORTANT *** DO NO USE with the simple svn plugin, this plugin acts as a replacement of it.
+# It's faster because his efficient use of svn (single svn call) which saves a lot on a huge codebase
+# It displays the current status of the local files (added, deleted, modified, replaced, or else...)
 
-function svn_prompt_info() {
+function svn_fast_info() {
   local info
   info=$(svn info 2>&1) || return 1; # capture stdout and stderr
   local repo_need_upgrade=$(svn_repo_need_upgrade $info)
@@ -32,10 +30,10 @@ function svn_prompt_info() {
       $ZSH_PROMPT_BASE_COLOR \
       \
       $ZSH_THEME_BRANCH_NAME_COLOR \
-      $(svn_get_branch_name $info) \
+      $(svn_current_branch_name $info) \
       $ZSH_PROMPT_BASE_COLOR \
       \
-      $(svn_get_revision $info) \
+      $(svn_current_revision $info) \
       $ZSH_PROMPT_BASE_COLOR \
       \
       $ZSH_THEME_SVN_PROMPT_SUFFIX \
@@ -43,21 +41,20 @@ function svn_prompt_info() {
   fi
 }
 
-
 function svn_repo_need_upgrade() {
   grep -q "E155036" <<< ${1:-$(svn info 2> /dev/null)} && \
     echo "E155036: upgrade repo with svn upgrade"
 }
 
-function svn_get_branch_name() {
+function svn_current_branch_name() {
   grep '^URL:' <<< "${1:-$(svn info 2> /dev/null)}" | egrep -o '(tags|branches)/[^/]+|trunk'	
 }
 
-function svn_get_repo_root_name() {
+function svn_repo_root_name() {
   grep '^Repository\ Root:' <<< "${1:-$(svn info 2> /dev/null)}" | sed 's#.*/##'
 }
 
-function svn_get_revision() {
+function svn_current_revision() {
   echo "${1:-$(svn info 2> /dev/null)}" | sed -n 's/Revision: //p'
 }
 

From ca129bb55085cf93510346dcd70b1190b87d5bc0 Mon Sep 17 00:00:00 2001
From: Brice Dutheil 
Date: Fri, 10 Jan 2014 14:03:10 +0100
Subject: [PATCH 29/53] Renames main plugin function to `svn_prompt_info`

---
 plugins/svn-fast-info/svn-fast-info.plugin.zsh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/plugins/svn-fast-info/svn-fast-info.plugin.zsh b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
index a12007ec6..ea19bcea0 100644
--- a/plugins/svn-fast-info/svn-fast-info.plugin.zsh
+++ b/plugins/svn-fast-info/svn-fast-info.plugin.zsh
@@ -6,8 +6,10 @@
 # Use `svn_prompt_info` method to enquire the svn data.
 # It's faster because his efficient use of svn (single svn call) which saves a lot on a huge codebase
 # It displays the current status of the local files (added, deleted, modified, replaced, or else...)
+#
+# Use as a drop-in replacement of the svn plugin not as complementary plugin
 
-function svn_fast_info() {
+function svn_prompt_info() {
   local info
   info=$(svn info 2>&1) || return 1; # capture stdout and stderr
   local repo_need_upgrade=$(svn_repo_need_upgrade $info)

From 78ffa71cb6ecb40ec8ca97d5fb9682ceb74a05b7 Mon Sep 17 00:00:00 2001
From: mrbfrank 
Date: Tue, 28 Jan 2014 18:02:40 -0600
Subject: [PATCH 30/53] updated url to latest powerline-patched fonts

clearing up some confusion in issue#1906
---
 themes/agnoster.zsh-theme | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme
index 01cdc80e5..a0d60ea88 100644
--- a/themes/agnoster.zsh-theme
+++ b/themes/agnoster.zsh-theme
@@ -6,7 +6,7 @@
 # # README
 #
 # In order for this theme to render correctly, you will need a
-# [Powerline-patched font](https://gist.github.com/1595572).
+# [Powerline-patched font](https://github.com/Lokaltog/powerline-fonts).
 #
 # In addition, I recommend the
 # [Solarized theme](https://github.com/altercation/solarized/) and, if you're

From 7daaa188da6255ef89f3076ad70370dd31762437 Mon Sep 17 00:00:00 2001
From: mrbfrank 
Date: Tue, 28 Jan 2014 21:54:00 -0600
Subject: [PATCH 31/53] corrected branch character
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

changed ± to 
---
 themes/agnoster.zsh-theme | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme
index a0d60ea88..a5c47f9b5 100644
--- a/themes/agnoster.zsh-theme
+++ b/themes/agnoster.zsh-theme
@@ -90,7 +90,7 @@ prompt_git() {
     zstyle ':vcs_info:*' formats ' %u%c'
     zstyle ':vcs_info:*' actionformats '%u%c'
     vcs_info
-    echo -n "${ref/refs\/heads\//± }${vcs_info_msg_0_}"
+    echo -n "${ref/refs\/heads\// }${vcs_info_msg_0_}"
   fi
 }
 

From 685ea4a36162a0bca9b0176b268c25e45023e97e Mon Sep 17 00:00:00 2001
From: mrbfrank 
Date: Wed, 29 Jan 2014 13:35:21 -0600
Subject: [PATCH 32/53] theme agnoster: remove trailing space

re-implemented expired pull request https://github.com/robbyrussell/oh-my-zsh/pull/1759
---
 themes/agnoster.zsh-theme | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme
index a5c47f9b5..85b846cb5 100644
--- a/themes/agnoster.zsh-theme
+++ b/themes/agnoster.zsh-theme
@@ -88,9 +88,9 @@ prompt_git() {
     zstyle ':vcs_info:*' stagedstr '✚'
     zstyle ':vcs_info:git:*' unstagedstr '●'
     zstyle ':vcs_info:*' formats ' %u%c'
-    zstyle ':vcs_info:*' actionformats '%u%c'
+    zstyle ':vcs_info:*' actionformats ' %u%c'
     vcs_info
-    echo -n "${ref/refs\/heads\// }${vcs_info_msg_0_}"
+    echo -n "${ref/refs\/heads\// }${vcs_info_msg_0_%% }"
   fi
 }
 

From 4d83da770a85f4d2e6b0e0990cb83c925de128bd Mon Sep 17 00:00:00 2001
From: Felds Liscia 
Date: Thu, 30 Jan 2014 15:04:09 -0200
Subject: [PATCH 33/53] highlight the username when root

---
 themes/ys.zsh-theme | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/themes/ys.zsh-theme b/themes/ys.zsh-theme
index 43c101c2a..a44f295f4 100644
--- a/themes/ys.zsh-theme
+++ b/themes/ys.zsh-theme
@@ -32,3 +32,16 @@ PROMPT="
 ${git_info} \
 %{$fg[white]%}[%*]
 %{$terminfo[bold]$fg[red]%}$ %{$reset_color%}"
+
+if [[ "$(whoami)" == "root" ]]; then
+PROMPT="
+%{$terminfo[bold]$fg[blue]%}#%{$reset_color%} \
+%{$bg[yellow]%}%{$fg[cyan]%}%n%{$reset_color%} \
+%{$fg[white]%}at \
+%{$fg[green]%}$(box_name) \
+%{$fg[white]%}in \
+%{$terminfo[bold]$fg[yellow]%}${current_dir}%{$reset_color%}\
+${git_info} \
+%{$fg[white]%}[%*]
+%{$terminfo[bold]$fg[red]%}$ %{$reset_color%}"
+fi

From 2078e7d4deac2546deea6b707837b39c535eaa78 Mon Sep 17 00:00:00 2001
From: Luke Steensen 
Date: Wed, 12 Feb 2014 20:09:44 -0600
Subject: [PATCH 34/53] remove duplicate 'go' plugin, symlink to 'golang'

---
 plugins/go/go.plugin.zsh | 152 +--------------------------------------
 1 file changed, 1 insertion(+), 151 deletions(-)
 mode change 100644 => 120000 plugins/go/go.plugin.zsh

diff --git a/plugins/go/go.plugin.zsh b/plugins/go/go.plugin.zsh
deleted file mode 100644
index 23afa9656..000000000
--- a/plugins/go/go.plugin.zsh
+++ /dev/null
@@ -1,151 +0,0 @@
-# install in /etc/zsh/zshrc or your personal .zshrc
-
-# gc
-prefixes=(5 6 8)
-for p in $prefixes; do
-	compctl -g "*.${p}" ${p}l
-	compctl -g "*.go" ${p}g
-done
-
-# standard go tools
-compctl -g "*.go" gofmt
-
-# gccgo
-compctl -g "*.go" gccgo
-
-# go tool
-__go_tool_complete() {
-  typeset -a commands build_flags
-  commands+=(
-    'build[compile packages and dependencies]'
-    'clean[remove object files]'
-    'doc[run godoc on package sources]'
-    'fix[run go tool fix on packages]'
-    'fmt[run gofmt on package sources]'
-    'get[download and install packages and dependencies]'
-    'help[display help]'
-    'install[compile and install packages and dependencies]'
-    'list[list packages]'
-    'run[compile and run Go program]'
-    'test[test packages]'
-    'tool[run specified go tool]'
-    'version[print Go version]'
-    'vet[run go tool vet on packages]'
-  )
-  if (( CURRENT == 2 )); then
-    # explain go commands
-    _values 'go tool commands' ${commands[@]}
-    return
-  fi
-  build_flags=(
-    '-a[force reinstallation of packages that are already up-to-date]'
-    '-n[print the commands but do not run them]'
-    "-p[number of parallel builds]:number"
-    '-x[print the commands]'
-    "-work[print temporary directory name and keep it]"
-    "-gcflags[flags for 5g/6g/8g]:flags"
-    "-ldflags[flags for 5l/6l/8l]:flags"
-    "-gccgoflags[flags for gccgo]:flags"
-  )
-  __go_list() {
-      local expl importpaths
-      declare -a importpaths
-      importpaths=($(go list ${words[$CURRENT]}... 2>/dev/null))
-      _wanted importpaths expl 'import paths' compadd "$@" - "${importpaths[@]}"
-  }
-  case ${words[2]} in
-  clean|doc)
-      _arguments -s -w : '*:importpaths:__go_list'
-      ;;
-  fix|fmt|list|vet)
-      _alternative ':importpaths:__go_list' ':files:_path_files -g "*.go"'
-      ;;
-  install)
-      _arguments -s -w : ${build_flags[@]} \
-        "-v[show package names]" \
-	'*:importpaths:__go_list'
-      ;;
-  get)
-      _arguments -s -w : \
-        ${build_flags[@]}
-      ;;
-  build)
-      _arguments -s -w : \
-        ${build_flags[@]} \
-        "-v[show package names]" \
-        "-o[output file]:file:_files" \
-        "*:args:{ _alternative ':importpaths:__go_list' ':files:_path_files -g \"*.go\"' }"
-      ;;
-  test)
-      _arguments -s -w : \
-        ${build_flags[@]} \
-        "-c[do not run, compile the test binary]" \
-        "-i[do not run, install dependencies]" \
-        "-v[print test output]" \
-        "-x[print the commands]" \
-        "-short[use short mode]" \
-        "-parallel[number of parallel tests]:number" \
-        "-cpu[values of GOMAXPROCS to use]:number list" \
-        "-run[run tests and examples matching regexp]:regexp" \
-        "-bench[run benchmarks matching regexp]:regexp" \
-        "-benchtime[run each benchmark during n seconds]:duration" \
-        "-timeout[kill test after that duration]:duration" \
-        "-cpuprofile[write CPU profile to file]:file:_files" \
-        "-memprofile[write heap profile to file]:file:_files" \
-        "-memprofilerate[set heap profiling rate]:number" \
-        "*:args:{ _alternative ':importpaths:__go_list' ':files:_path_files -g \"*.go\"' }"
-      ;;
-  help)
-      _values "${commands[@]}" \
-        'gopath[GOPATH environment variable]' \
-        'importpath[description of import paths]' \
-        'remote[remote import path syntax]' \
-        'testflag[description of testing flags]' \
-        'testfunc[description of testing functions]'
-      ;;
-  run)
-      _arguments -s -w : \
-          ${build_flags[@]} \
-          '*:file:_path_files -g "*.go"'
-      ;;
-  tool)
-      if (( CURRENT == 3 )); then
-          _values "go tool" $(go tool)
-          return
-      fi
-      case ${words[3]} in
-      [568]g)
-          _arguments -s -w : \
-              '-I[search for packages in DIR]:includes:_path_files -/' \
-              '-L[show full path in file:line prints]' \
-              '-S[print the assembly language]' \
-              '-V[print the compiler version]' \
-              '-e[no limit on number of errors printed]' \
-              '-h[panic on an error]' \
-              '-l[disable inlining]' \
-              '-m[print optimization decisions]' \
-              '-o[file specify output file]:file' \
-              '-p[assumed import path for this code]:importpath' \
-              '-u[disable package unsafe]' \
-              "*:file:_files -g '*.go'"
-          ;;
-      [568]l)
-          local O=${words[3]%l}
-          _arguments -s -w : \
-              '-o[file specify output file]:file' \
-              '-L[search for packages in DIR]:includes:_path_files -/' \
-              "*:file:_files -g '*.[ao$O]'"
-          ;;
-      dist)
-          _values "dist tool" banner bootstrap clean env install version
-          ;;
-      *)
-          # use files by default
-          _files
-          ;;
-      esac
-      ;;
-  esac
-}
-
-compdef __go_tool_complete go
diff --git a/plugins/go/go.plugin.zsh b/plugins/go/go.plugin.zsh
new file mode 120000
index 000000000..cf943e2e1
--- /dev/null
+++ b/plugins/go/go.plugin.zsh
@@ -0,0 +1 @@
+../golang/golang.plugin.zsh
\ No newline at end of file

From aa9db3e8f9e03156f350b5d32fdf5dfde76a6038 Mon Sep 17 00:00:00 2001
From: Luke Steensen 
Date: Wed, 12 Feb 2014 20:13:00 -0600
Subject: [PATCH 35/53] update golang plugin to match official version

---
 plugins/golang/golang.plugin.zsh | 34 +++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh
index e60c4afe4..18bcaaff2 100644
--- a/plugins/golang/golang.plugin.zsh
+++ b/plugins/golang/golang.plugin.zsh
@@ -1,9 +1,10 @@
-# From : http://golang.org/misc/zsh/go?m=text
+# install in /etc/zsh/zshrc or your personal .zshrc
+
 # gc
 prefixes=(5 6 8)
 for p in $prefixes; do
-    compctl -g "*.${p}" ${p}l
-    compctl -g "*.go" ${p}g
+	compctl -g "*.${p}" ${p}l
+	compctl -g "*.go" ${p}g
 done
 
 # standard go tools
@@ -19,6 +20,7 @@ __go_tool_complete() {
     'build[compile packages and dependencies]'
     'clean[remove object files]'
     'doc[run godoc on package sources]'
+    'env[print Go environment information]'
     'fix[run go tool fix on packages]'
     'fmt[run gofmt on package sources]'
     'get[download and install packages and dependencies]'
@@ -39,12 +41,17 @@ __go_tool_complete() {
   build_flags=(
     '-a[force reinstallation of packages that are already up-to-date]'
     '-n[print the commands but do not run them]'
-    "-p[number of parallel builds]:number"
+    '-p[number of parallel builds]:number'
+    '-race[enable data race detection]'
     '-x[print the commands]'
-    "-work[print temporary directory name and keep it]"
-    "-gcflags[flags for 5g/6g/8g]:flags"
-    "-ldflags[flags for 5l/6l/8l]:flags"
-    "-gccgoflags[flags for gccgo]:flags"
+    '-work[print temporary directory name and keep it]'
+    '-ccflags[flags for 5c/6c/8c]:flags'
+    '-gcflags[flags for 5g/6g/8g]:flags'
+    '-ldflags[flags for 5l/6l/8l]:flags'
+    '-gccgoflags[flags for gccgo]:flags'
+    '-compiler[name of compiler to use]:name'
+    '-installsuffix[suffix to add to package directory]:suffix'
+    '-tags[list of build tags to consider satisfied]:tags'
   )
   __go_list() {
       local expl importpaths
@@ -62,7 +69,7 @@ __go_tool_complete() {
   install)
       _arguments -s -w : ${build_flags[@]} \
         "-v[show package names]" \
-    '*:importpaths:__go_list'
+        '*:importpaths:__go_list'
       ;;
   get)
       _arguments -s -w : \
@@ -87,7 +94,10 @@ __go_tool_complete() {
         "-cpu[values of GOMAXPROCS to use]:number list" \
         "-run[run tests and examples matching regexp]:regexp" \
         "-bench[run benchmarks matching regexp]:regexp" \
-        "-benchtime[run each benchmark during n seconds]:duration" \
+        "-benchmem[print memory allocation stats]" \
+        "-benchtime[run each benchmark until taking this long]:duration" \
+        "-blockprofile[write goroutine blocking profile to file]:file" \
+        "-blockprofilerate[set sampling rate of goroutine blocking profile]:number" \
         "-timeout[kill test after that duration]:duration" \
         "-cpuprofile[write CPU profile to file]:file:_files" \
         "-memprofile[write heap profile to file]:file:_files" \
@@ -97,7 +107,7 @@ __go_tool_complete() {
   help)
       _values "${commands[@]}" \
         'gopath[GOPATH environment variable]' \
-        'importpath[description of import paths]' \
+        'packages[description of package lists]' \
         'remote[remote import path syntax]' \
         'testflag[description of testing flags]' \
         'testfunc[description of testing functions]'
@@ -147,4 +157,4 @@ __go_tool_complete() {
   esac
 }
 
-compdef __go_tool_complete go
\ No newline at end of file
+compdef __go_tool_complete go

From f6f3e9301940dc21680aa50156355c8dba61b441 Mon Sep 17 00:00:00 2001
From: Emanuele Zattin 
Date: Thu, 13 Feb 2014 10:32:52 +0100
Subject: [PATCH 36/53] Improve oneline logs

Add decorate and color to the normal oneline and add a new alias for graph oneline logs.
---
 plugins/git/git.plugin.zsh | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh
index 1285a3247..2b5983f33 100644
--- a/plugins/git/git.plugin.zsh
+++ b/plugins/git/git.plugin.zsh
@@ -62,8 +62,10 @@ alias glgg='git log --graph --max-count=10'
 compdef _git glgg=git-log
 alias glgga='git log --graph --decorate --all'
 compdef _git glgga=git-log
-alias glo='git log --oneline'
+alias glo='git log --oneline --decorate --color'
 compdef _git glo=git-log
+alias glog='git log --oneline --decorate --color --graph'
+compdef _git glog=git-log
 alias gss='git status -s'
 compdef _git gss=git-status
 alias ga='git add'

From 354593e9b2b3a7ec3a0840eeadbc7d760cdd7263 Mon Sep 17 00:00:00 2001
From: Igor Timoshenko 
Date: Fri, 14 Feb 2014 14:54:28 +0000
Subject: [PATCH 37/53] Added Yii basic command completion

---
 plugins/yii/yii.plugin.zsh | 17 +++++++++++++++++
 1 file changed, 17 insertions(+)
 create mode 100644 plugins/yii/yii.plugin.zsh

diff --git a/plugins/yii/yii.plugin.zsh b/plugins/yii/yii.plugin.zsh
new file mode 100644
index 000000000..b816160f0
--- /dev/null
+++ b/plugins/yii/yii.plugin.zsh
@@ -0,0 +1,17 @@
+# Yii basic command completion
+
+_yii_get_command_list () {
+	protected/yiic | awk '/^ - [a-z]+/ { print $2 }'
+}
+
+_yii () {
+  if [ -f protected/yiic ]; then
+    compadd `_yii_get_command_list`
+  fi
+}
+
+compdef _yii protected/yiic
+compdef _yii yiic
+
+# Aliases
+alias yiic='protected/yiic'

From b0fbe0d11ac60074b4fdc20e332bc2db3e0c0066 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Cornell=C3=A0?= 
Date: Thu, 12 Dec 2013 23:27:22 +0100
Subject: [PATCH 38/53] Avoid evaluating special chars in $LINE on title
 command (fixes #2234)

---
 lib/termsupport.zsh | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index 80319e1a8..6eba8f69a 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -27,9 +27,8 @@ function omz_termsupport_preexec {
   emulate -L zsh
   setopt extended_glob
   local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
-  local LINE="${2:gs/$/\\$}"
-  LINE="${LINE:gs/%/%%}"
-  title "$CMD" "%100>...>$LINE%<<"
+  local LINE="${2}"
+  title "$CMD" '%100>...>$LINE%<<'
 }
 
 autoload -U add-zsh-hook

From b73ced397fc74618d92f748e2744e65f901b368f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Cornell=C3=A0?= 
Date: Sat, 14 Dec 2013 02:13:18 +0100
Subject: [PATCH 39/53] Use single quotes also in $LINE definiton

---
 lib/termsupport.zsh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index 6eba8f69a..d3d8c967f 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -27,7 +27,7 @@ function omz_termsupport_preexec {
   emulate -L zsh
   setopt extended_glob
   local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
-  local LINE="${2}"
+  local LINE='${2}'
   title "$CMD" '%100>...>$LINE%<<'
 }
 

From 3e5de21dc5b71e332a1526ae14beb662a66d6e26 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Cornell=C3=A0?= 
Date: Sat, 14 Dec 2013 04:30:29 +0100
Subject: [PATCH 40/53] Revert previous commit, escape %

---
 lib/termsupport.zsh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index d3d8c967f..623bf1f09 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -27,7 +27,7 @@ function omz_termsupport_preexec {
   emulate -L zsh
   setopt extended_glob
   local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
-  local LINE='${2}'
+  local LINE="${2:gs/%/%%}"
   title "$CMD" '%100>...>$LINE%<<'
 }
 

From a951600b4e81d73d71a098e48aa8d296be853bc9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Marc=20Cornell=C3=A0?= 
Date: Mon, 16 Dec 2013 09:24:24 +0100
Subject: [PATCH 41/53] Avoid 'title:parse error' with single quotes in $CMD
 Fixes #2182

---
 lib/termsupport.zsh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh
index 623bf1f09..5f2fe63d4 100644
--- a/lib/termsupport.zsh
+++ b/lib/termsupport.zsh
@@ -28,7 +28,7 @@ function omz_termsupport_preexec {
   setopt extended_glob
   local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
   local LINE="${2:gs/%/%%}"
-  title "$CMD" '%100>...>$LINE%<<'
+  title '$CMD' '%100>...>$LINE%<<'
 }
 
 autoload -U add-zsh-hook

From 7a546362d35d6c74f9c301aa477594fdf2cc1bfc Mon Sep 17 00:00:00 2001
From: Chris Jones 
Date: Fri, 21 Feb 2014 22:47:56 -0800
Subject: [PATCH 42/53] Much needed PEP8 love. Use spaces, not tabs.

---
 plugins/git-prompt/gitstatus.py | 88 +++++++++++++++++++--------------
 1 file changed, 51 insertions(+), 37 deletions(-)

diff --git a/plugins/git-prompt/gitstatus.py b/plugins/git-prompt/gitstatus.py
index ee6fab9bd..6d64e8277 100644
--- a/plugins/git-prompt/gitstatus.py
+++ b/plugins/git-prompt/gitstatus.py
@@ -1,20 +1,30 @@
 #!/usr/bin/env python
 # -*- coding: UTF-8 -*-
+from subprocess import Popen, PIPE
+import re
 
 # change those symbols to whatever you prefer
-symbols = {'ahead of': '↑', 'behind': '↓', 'staged':'♦', 'changed':'‣', 'untracked':'…', 'clean':'⚡', 'unmerged':'≠', 'sha1':':'}
+symbols = {
+    'ahead of': '↑',
+    'behind': '↓',
+    'staged': '♦',
+    'changed': '‣',
+    'untracked': '…',
+    'clean': '⚡',
+    'unmerged': '≠',
+    'sha1': ':'
+}
 
-from subprocess import Popen, PIPE
-
-output,error = Popen(['git','status'], stdout=PIPE, stderr=PIPE).communicate()
+output, error = Popen(
+    ['git', 'status'], stdout=PIPE, stderr=PIPE).communicate()
 
 if error:
-	import sys
-	sys.exit(0)
+    import sys
+    sys.exit(0)
 lines = output.splitlines()
 
-import re
-behead_re = re.compile(r"^# Your branch is (ahead of|behind) '(.*)' by (\d+) commit")
+behead_re = re.compile(
+    r"^# Your branch is (ahead of|behind) '(.*)' by (\d+) commit")
 diverge_re = re.compile(r"^# and have (\d+) and (\d+) different")
 
 status = ''
@@ -23,46 +33,50 @@ changed = re.compile(r'^# Changed but not updated:$', re.MULTILINE)
 untracked = re.compile(r'^# Untracked files:$', re.MULTILINE)
 unmerged = re.compile(r'^# Unmerged paths:$', re.MULTILINE)
 
+
 def execute(*command):
-	out, err = Popen(stdout=PIPE, stderr=PIPE, *command).communicate()
-	if not err:
-		nb = len(out.splitlines())
-	else:
-		nb = '?'
-	return nb
+    out, err = Popen(stdout=PIPE, stderr=PIPE, *command).communicate()
+    if not err:
+        nb = len(out.splitlines())
+    else:
+        nb = '?'
+    return nb
 
 if staged.search(output):
-	nb = execute(['git','diff','--staged','--name-only','--diff-filter=ACDMRT'])
-	status += '%s%s' % (symbols['staged'], nb)
+    nb = execute(
+        ['git', 'diff', '--staged', '--name-only', '--diff-filter=ACDMRT'])
+    status += '%s%s' % (symbols['staged'], nb)
 if unmerged.search(output):
-	nb = execute(['git','diff', '--staged','--name-only', '--diff-filter=U'])
-	status += '%s%s' % (symbols['unmerged'], nb)
+    nb = execute(['git', 'diff', '--staged', '--name-only', '--diff-filter=U'])
+    status += '%s%s' % (symbols['unmerged'], nb)
 if changed.search(output):
-	nb = execute(['git','diff','--name-only', '--diff-filter=ACDMRT'])
-	status += '%s%s' % (symbols['changed'], nb)
+    nb = execute(['git', 'diff', '--name-only', '--diff-filter=ACDMRT'])
+    status += '%s%s' % (symbols['changed'], nb)
 if untracked.search(output):
-## 		nb = len(Popen(['git','ls-files','--others','--exclude-standard'],stdout=PIPE).communicate()[0].splitlines())
-## 		status += "%s" % (symbols['untracked']*(nb//3 + 1), )
-	status += symbols['untracked']
+    status += symbols['untracked']
 if status == '':
-	status = symbols['clean']
+    status = symbols['clean']
 
 remote = ''
 
 bline = lines[0]
 if bline.find('Not currently on any branch') != -1:
-	branch = symbols['sha1']+ Popen(['git','rev-parse','--short','HEAD'], stdout=PIPE).communicate()[0][:-1]
+    branch = symbols['sha1'] + Popen([
+        'git',
+        'rev-parse',
+        '--short',
+        'HEAD'], stdout=PIPE).communicate()[0][:-1]
 else:
-	branch = bline.split(' ')[3]
-	bstatusline = lines[1]
-	match = behead_re.match(bstatusline)
-	if match:
-		remote = symbols[match.groups()[0]]
-		remote += match.groups()[2]
-	elif lines[2:]:
-		div_match = diverge_re.match(lines[2])
-	 	if div_match:
-			remote = "{behind}{1}{ahead of}{0}".format(*div_match.groups(), **symbols)
-
-print '\n'.join([branch,remote,status])
+    branch = bline.split(' ')[3]
+    bstatusline = lines[1]
+    match = behead_re.match(bstatusline)
+    if match:
+        remote = symbols[match.groups()[0]]
+        remote += match.groups()[2]
+    elif lines[2:]:
+        div_match = diverge_re.match(lines[2])
+        if div_match:
+            remote = "{behind}{1}{ahead of}{0}".format(
+                *div_match.groups(), **symbols)
 
+print('\n'.join([branch, remote, status]))

From c397000b3b0c1cf3bceb95dfc5fcdaf1844aa751 Mon Sep 17 00:00:00 2001
From: Chris Jones 
Date: Fri, 21 Feb 2014 22:48:38 -0800
Subject: [PATCH 43/53] grab last item in list which is the branch instead of
 relying on position.

---
 plugins/git-prompt/gitstatus.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/plugins/git-prompt/gitstatus.py b/plugins/git-prompt/gitstatus.py
index 6d64e8277..ef894bff2 100644
--- a/plugins/git-prompt/gitstatus.py
+++ b/plugins/git-prompt/gitstatus.py
@@ -67,7 +67,7 @@ if bline.find('Not currently on any branch') != -1:
         '--short',
         'HEAD'], stdout=PIPE).communicate()[0][:-1]
 else:
-    branch = bline.split(' ')[3]
+    branch = bline.split(' ')[-1]
     bstatusline = lines[1]
     match = behead_re.match(bstatusline)
     if match:

From 8309b0a19baa351d643194f897d59de7b3d3b3dd Mon Sep 17 00:00:00 2001
From: Eduardo San Martin Morote 
Date: Sun, 23 Feb 2014 10:07:26 +0100
Subject: [PATCH 44/53] Verification of convert inside the function

Depending on when the path is declared this solution would work in any case
---
 plugins/catimg/catimg.plugin.zsh | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/plugins/catimg/catimg.plugin.zsh b/plugins/catimg/catimg.plugin.zsh
index 70ef9a63c..cb92f5986 100644
--- a/plugins/catimg/catimg.plugin.zsh
+++ b/plugins/catimg/catimg.plugin.zsh
@@ -7,10 +7,11 @@
 # Github: https://github.com/posva/catimg                                      #
 ################################################################################
 
-if [[ -x  `which convert` ]]; then
-  function catimg() {
+
+function catimg() {
+  if [[ -x  `which convert` ]]; then
     zsh $ZSH/plugins/catimg/catimg.sh $@
-  }
-else
-  echo "catimg need convert (ImageMagick) to work)"
-fi
+  else
+    echo "catimg need convert (ImageMagick) to work)"
+  fi
+}

From f139401485ba389cbec5c83357e8827b1c53447b Mon Sep 17 00:00:00 2001
From: Josh Burns 
Date: Fri, 28 Feb 2014 01:26:17 +1100
Subject: [PATCH 45/53] add gem build alias

---
 plugins/gem/gem.plugin.zsh | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 plugins/gem/gem.plugin.zsh

diff --git a/plugins/gem/gem.plugin.zsh b/plugins/gem/gem.plugin.zsh
new file mode 100644
index 000000000..5b14fe7d0
--- /dev/null
+++ b/plugins/gem/gem.plugin.zsh
@@ -0,0 +1 @@
+alias gb="gem build *.gemspec"
\ No newline at end of file

From da573f635648efb07603d7172bb08c2f271e1164 Mon Sep 17 00:00:00 2001
From: Josh Burns 
Date: Fri, 28 Feb 2014 01:26:54 +1100
Subject: [PATCH 46/53] add gem push alias

---
 plugins/gem/gem.plugin.zsh | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/plugins/gem/gem.plugin.zsh b/plugins/gem/gem.plugin.zsh
index 5b14fe7d0..ca2900353 100644
--- a/plugins/gem/gem.plugin.zsh
+++ b/plugins/gem/gem.plugin.zsh
@@ -1 +1,2 @@
-alias gb="gem build *.gemspec"
\ No newline at end of file
+alias gemb="gem build *.gemspec"
+alias gemp="gem push *.gem"
\ No newline at end of file

From fdbf0cbe4687c32846764695fabdf4acdb63a62f Mon Sep 17 00:00:00 2001
From: Josh Burns 
Date: Fri, 28 Feb 2014 01:32:01 +1100
Subject: [PATCH 47/53] gem push alias and gem yank alias

---
 plugins/gem/gem.plugin.zsh | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/plugins/gem/gem.plugin.zsh b/plugins/gem/gem.plugin.zsh
index ca2900353..938f5c993 100644
--- a/plugins/gem/gem.plugin.zsh
+++ b/plugins/gem/gem.plugin.zsh
@@ -1,2 +1,7 @@
 alias gemb="gem build *.gemspec"
-alias gemp="gem push *.gem"
\ No newline at end of file
+alias gemp="gem push *.gem"
+
+# gemy GEM 0.0.0 = gem yank GEM -v 0.0.0
+function gemy {
+	gem yank $1 -v $2
+}
\ No newline at end of file

From 6dcdfe61e2005728ff7e1e48d452de4b38294799 Mon Sep 17 00:00:00 2001
From: Michael Nikitochkin 
Date: Thu, 27 Feb 2014 11:52:21 +0200
Subject: [PATCH 48/53] :panda_face: Added simulator alias for Xcode plugin

It is often required to start simulator without Xcode.
---
 plugins/xcode/xcode.plugin.zsh | 1 +
 1 file changed, 1 insertion(+)

diff --git a/plugins/xcode/xcode.plugin.zsh b/plugins/xcode/xcode.plugin.zsh
index f137253f3..4816ab0ed 100644
--- a/plugins/xcode/xcode.plugin.zsh
+++ b/plugins/xcode/xcode.plugin.zsh
@@ -16,3 +16,4 @@ function xcsel {
 
 alias xcb='xcodebuild'
 alias xcp='xcode-select --print-path'
+alias simulator='open $(xcode-select  -p)/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app'

From 5ba96e9a053514d6beb25e5c27cf4af746f142ef Mon Sep 17 00:00:00 2001
From: Kaiwen Xu 
Date: Sun, 2 Mar 2014 03:59:27 -0500
Subject: [PATCH 49/53] Fixed sublime plugin behaviors.

- Fixed subl search path order in Mac because Sublime Text 3 is named
  Sublime Text.app by default instead of Sublime Text 3.app and they are
  mostly likely to be placed in /Applications instead of
  $HOME/Applications.
- Fixed sublime text binary path in Linux. The sublime_text binary
  installed by Ubuntu installer is placed in /opt/sublime_text/sublime_text
  instead of /usr/bin/sublime_text.
- Use zsh's built-in process detach syntax instead of nohup.
---
 plugins/sublime/sublime.plugin.zsh | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/plugins/sublime/sublime.plugin.zsh b/plugins/sublime/sublime.plugin.zsh
index 566279183..6ca5892e5 100755
--- a/plugins/sublime/sublime.plugin.zsh
+++ b/plugins/sublime/sublime.plugin.zsh
@@ -3,19 +3,19 @@
 local _sublime_darwin_paths > /dev/null 2>&1
 _sublime_darwin_paths=(
     "/usr/local/bin/subl"
-    "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
-    "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
-    "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+    "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
     "/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
     "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
-    "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+    "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+    "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
+    "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
 )
 
 if [[ $('uname') == 'Linux' ]]; then
-    if [ -f '/usr/bin/sublime_text' ]; then
-        st_run() { nohup /usr/bin/sublime_text $@ > /dev/null & }
+    if [ -f '/opt/sublime_text/sublime_text' ]; then
+        st_run() { /opt/sublime_text/sublime_text $@ &| }
     else
-        st_run() { nohup /usr/bin/sublime-text $@ > /dev/null & }
+        st_run() { /usr/bin/sublime-text $@ &| }
     fi
     alias st=st_run
 

From 2691520d6f84fd0022fcb82a497042bb92c777b7 Mon Sep 17 00:00:00 2001
From: Kaiwen Xu 
Date: Sun, 2 Mar 2014 14:13:55 -0500
Subject: [PATCH 50/53] Integrate changes from #1841.

---
 plugins/sublime/sublime.plugin.zsh | 41 +++++++++++++++++-------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/plugins/sublime/sublime.plugin.zsh b/plugins/sublime/sublime.plugin.zsh
index 6ca5892e5..a2042343a 100755
--- a/plugins/sublime/sublime.plugin.zsh
+++ b/plugins/sublime/sublime.plugin.zsh
@@ -1,25 +1,32 @@
 # Sublime Text 2 Aliases
 
-local _sublime_darwin_paths > /dev/null 2>&1
-_sublime_darwin_paths=(
-    "/usr/local/bin/subl"
-    "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
-    "/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
-    "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
-    "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
-    "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
-    "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
-)
-
 if [[ $('uname') == 'Linux' ]]; then
-    if [ -f '/opt/sublime_text/sublime_text' ]; then
-        st_run() { /opt/sublime_text/sublime_text $@ &| }
-    else
-        st_run() { /usr/bin/sublime-text $@ &| }
-    fi
-    alias st=st_run
+    local _sublime_linux_paths > /dev/null 2>&1
+    _sublime_linux_paths=(
+        "$HOME/bin/sublime_text"
+        "/opt/sublime_text/sublime_text"
+        "/usr/bin/sublime_text"
+        "/usr/local/bin/sublime_text"
+    )
+    for _sublime_path in $_sublime_linux_paths; do
+        if [[ -a $_sublime_path ]]; then
+            st_run() { $_sublime_path $@ >/dev/null 2>&1 &| }
+            alias st=st_run
+            break
+        fi
+    done
 
 elif  [[ $('uname') == 'Darwin' ]]; then
+    local _sublime_darwin_paths > /dev/null 2>&1
+    _sublime_darwin_paths=(
+        "/usr/local/bin/subl"
+        "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+        "/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
+        "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
+        "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+        "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl"
+        "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
+    )
 
     for _sublime_path in $_sublime_darwin_paths; do
         if [[ -a $_sublime_path ]]; then

From d41ac7fe3e52783054610c2cc57bbbfcdb2202b0 Mon Sep 17 00:00:00 2001
From: Markus Faerevaag 
Date: Tue, 4 Mar 2014 20:25:54 +0100
Subject: [PATCH 51/53] Updated wd plugin to v0.3.0

---
 plugins/wd/_wd.sh        | 96 ++++++++++++++++++++++++----------------
 plugins/wd/wd.plugin.zsh |  4 +-
 plugins/wd/wd.sh         | 75 ++++++++++++++-----------------
 3 files changed, 95 insertions(+), 80 deletions(-)

diff --git a/plugins/wd/_wd.sh b/plugins/wd/_wd.sh
index 950564435..29df63520 100644
--- a/plugins/wd/_wd.sh
+++ b/plugins/wd/_wd.sh
@@ -1,48 +1,68 @@
-#compdef wd.sh
+#compdef wd
 
-zstyle ":completion:*:descriptions" format "%B%d%b"
+zstyle ':completion:*:descriptions' format '%B%d%b'
+zstyle ':completion::complete:wd:*:commands' group-name commands
+zstyle ':completion::complete:wd:*:warp_points' group-name warp_points
+zstyle ':completion::complete:wd::' list-grouped
 
-CONFIG=$HOME/.warprc
+# Call `_wd()` when when trying to complete the command `wd`
 
-local -a main_commands
-main_commands=(
-    add:'Adds the current working directory to your warp points'
-    #add'\!':'Overwrites existing warp point' # TODO: Fix
-    rm:'Removes the given warp point'
-    ls:'Outputs all stored warp points'
-    show:'Outputs warp points to current directory'
-)
+zmodload zsh/mapfile
+function _wd() {
+  local ret=1
+  local CONFIG=$HOME/.warprc
 
-local -a points
-while read line
-do
-    points+=$(awk "{ gsub(/\/Users\/$USER|\/home\/$USER/,\"~\"); print }" <<< $line)
-done < $CONFIG
+  # Stolen from
+  # http://stackoverflow.com/questions/9000698/completion-when-program-has-sub-commands
 
-_wd()
-{
-    # init variables
-    local curcontext="$curcontext" state line
-    typeset -A opt_args
+  # local curcontext="$curcontext" state line
+  # typeset -A opt_args
 
-    # init state
-    _arguments \
-        '1: :->command' \
-        '2: :->argument'
+  local -a commands
+  local -a warp_points
+  warp_points=( "${(f)mapfile[$CONFIG]}" )
+  # LIST="${mapfile[$FNAME]}" # Not required unless stuff uses it
 
-    case $state in
-        command)
-            compadd "$@" add rm ls show
-            _describe -t warp-points 'Warp points:' points && ret=0
-            ;;
-        argument)
-            case $words[2] in
-                rm|add!)
-                    _describe -t warp-points 'warp points' points && ret=0
-                    ;;
-                *)
-            esac
-    esac
+  commands=(
+    'add:Adds the current working directory to your warp points'
+    'add!:Overwrites existing warp point'
+    'rm:Removes the given warp point'
+    'ls:Outputs all stored warp points'
+    'show:Outputs all warp points that point to the current directory'
+    'help:Show this extremely helpful text'
+    '..:Go back to last directory'
+  )
+
+  _arguments -C \
+    '1: :->first_arg' \
+    '2: :->second_arg' && ret=0
+
+  case $state in
+    first_arg)
+      _describe -t warp_points "Warp points" warp_points && ret=0
+      _describe -t commands "Commands" commands && ret=0
+      ;;
+    second_arg)
+      case $words[2] in
+        add\!|rm)
+          _describe -t points "Warp points" warp_points && ret=0
+          ;;
+        add)
+          _message 'Write the name of your warp point' && ret=0
+          ;;
+      esac
+      ;;
+  esac
+
+  return $ret
 }
 
 _wd "$@"
+
+# Local Variables:
+# mode: Shell-Script
+# sh-indentation: 2
+# indent-tabs-mode: nil
+# sh-basic-offset: 2
+# End:
+# vim: ft=zsh sw=2 ts=2 et
diff --git a/plugins/wd/wd.plugin.zsh b/plugins/wd/wd.plugin.zsh
index bbec4a715..9800335fc 100755
--- a/plugins/wd/wd.plugin.zsh
+++ b/plugins/wd/wd.plugin.zsh
@@ -6,4 +6,6 @@
 #
 # @github.com/mfaerevaag/wd
 
-alias wd='. $ZSH/plugins/wd/wd.sh'
+wd() {
+    . $ZSH/plugins/wd/wd.sh
+}
diff --git a/plugins/wd/wd.sh b/plugins/wd/wd.sh
index 744f58bc2..96a3426fc 100755
--- a/plugins/wd/wd.sh
+++ b/plugins/wd/wd.sh
@@ -50,12 +50,12 @@ wd_warp()
             wd_print_msg $YELLOW "Warping to current directory?"
         else
             (( n = $#1 - 1 ))
-            wd_print_msg $BLUE "Warping..."
+            #wd_print_msg $BLUE "Warping..."
             cd -$n > /dev/null
         fi
     elif [[ ${points[$1]} != "" ]]
     then
-        wd_print_msg $BLUE "Warping..."
+        #wd_print_msg $BLUE "Warping..."
         cd ${points[$1]}
     else
         wd_print_msg $RED "Unkown warp point '$1'"
@@ -64,16 +64,16 @@ wd_warp()
 
 wd_add()
 {
-    if [[ $1 =~ "^\.+$" ]]
+    if [[ $2 =~ "^\.+$" || $2 =~ "^\s*$" ]]
     then
-        wd_print_msg $RED "Illeagal warp point (see README)."
-    elif [[ ${points[$1]} == "" ]] || $2
+        wd_print_msg $RED "Illegal warp point (see README)."
+    elif [[ ${points[$2]} == "" ]] || $1
     then
-        wd_remove $1 > /dev/null
-        print "$1:$PWD" >> $CONFIG
+        wd_remove $2 > /dev/null
+        print "$2:$PWD" >> $CONFIG
         wd_print_msg $GREEN "Warp point added"
     else
-        wd_print_msg $YELLOW "Warp point '$1' alredy exists. Use 'add!' to overwrite."
+        wd_print_msg $YELLOW "Warp point '$2' already exists. Use 'add!' to overwrite."
     fi
 }
 
@@ -83,7 +83,9 @@ wd_remove()
     then
         if wd_tmp=`sed "/^$1:/d" $CONFIG`
         then
-            echo $wd_tmp > $CONFIG
+            # `>!` forces overwrite
+            # we need this if people use `setopt NO_CLOBBER`
+            echo $wd_tmp >! $CONFIG
             wd_print_msg $GREEN "Warp point removed"
         else
             wd_print_msg $RED "Warp point unsuccessfully removed. Sorry!"
@@ -131,9 +133,9 @@ wd_print_usage()
     print "\nCommands:"
     print "\t add \t Adds the current working directory to your warp points"
     print "\t add! \t Overwrites existing warp point"
-    print "\t remove  Removes the given warp point"
+    print "\t rm \t  Removes the given warp point"
     print "\t show \t Outputs warp points to current directory"
-    print "\t list \t Outputs all stored warp points"
+    print "\t ls \t Outputs all stored warp points"
     print "\t help \t Show this extremely helpful text"
 }
 
@@ -141,7 +143,7 @@ wd_print_usage()
 ## run
 
 # get opts
-args=`getopt -o a:r:lhs -l add:,remove:,list,help,show -- $*`
+args=`getopt -o a:r:lhs -l add:,rm:,ls,help,show -- $*`
 
 # check if no arguments were given
 if [[ $? -ne 0 || $#* -eq 0 ]]
@@ -161,49 +163,40 @@ else
 
     for i
     do
-		    case "$i"
-		        in
-			      -a|--add|add)
-                wd_add $2 false
-				        shift
-                shift
+        case "$i"
+            in
+            -a|--add|add)
+                wd_add false $2
                 break
                 ;;
             -a!|--add!|add!)
-                wd_add $2 true
-				        shift
-                shift
+                wd_add true $2
                 break
                 ;;
-			      -r|--remove|rm)
-				        wd_remove $2
-                shift
-				        shift
+            -r|--remove|rm)
+                wd_remove $2
                 break
                 ;;
-			      -l|--list|ls)
-				        wd_list_all
-				        shift
+            -l|--list|ls)
+                wd_list_all
                 break
                 ;;
-			      -h|--help|help)
-				        wd_print_usage
-				        shift
+            -h|--help|help)
+                wd_print_usage
                 break
                 ;;
-			      -s|--show|show)
-				        wd_show
-				        shift
+            -s|--show|show)
+                wd_show
                 break
                 ;;
             *)
                 wd_warp $i
-                shift
                 break
                 ;;
-			      --)
-				        shift; break;;
-		    esac
+            --)
+                break
+                ;;
+        esac
     done
 fi
 
@@ -211,6 +204,6 @@ fi
 ## garbage collection
 # if not, next time warp will pick up variables from this run
 # remember, there's no sub shell
-points=""
-args=""
-unhash -d val &> /dev/null # fixes issue #1
+unset points
+unset args
+unset val &> /dev/null # fixes issue #1

From c3c8cc318de898257fd7c5be6f862098966fbbdf Mon Sep 17 00:00:00 2001
From: Ryan Marsh 
Date: Mon, 10 Mar 2014 18:36:51 -0500
Subject: [PATCH 52/53] Fixes #2467 tab completion scrolls back in terminal
 when using bureau theme

---
 themes/bureau.zsh-theme | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/themes/bureau.zsh-theme b/themes/bureau.zsh-theme
index 1d88f54d0..4d9cae0cc 100644
--- a/themes/bureau.zsh-theme
+++ b/themes/bureau.zsh-theme
@@ -101,12 +101,12 @@ _1RIGHT="[%*] "
 
 bureau_precmd () {
   _1SPACES=`get_space $_1LEFT $_1RIGHT`
-  echo
+  print 
+  print -rP "$_1LEFT$_1SPACES$_1RIGHT"
 }
 
 setopt prompt_subst
-PROMPT='$_1LEFT$_1SPACES$_1RIGHT
-> $_LIBERTY '
+PROMPT='> $_LIBERTY '
 RPROMPT='$(nvm_prompt_info) $(bureau_git_prompt)'
 
 autoload -U add-zsh-hook

From b6cbba9dfee5985232b473e94595c2fb1ab83715 Mon Sep 17 00:00:00 2001
From: Robby Russell 
Date: Wed, 12 Mar 2014 07:52:20 -0700
Subject: [PATCH 53/53] Updating README to show the new install URL, which
 redirects to the raw files on github.

---
 README.textile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.textile b/README.textile
index 810569486..b80294c60 100644
--- a/README.textile
+++ b/README.textile
@@ -14,11 +14,11 @@ You can install this via the command line with either `curl` or `wget`.
 
 h4. via `curl`
 
-@curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh@
+@curl -L http://install.ohmyz.sh | sh@
 
 h4. via `wget`
 
-@wget --no-check-certificate https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O - | sh@
+@wget --no-check-certificate http://install.ohmyz.sh -O - | sh@
 
 h3. The manual way