浏览代码

Merge remote-tracking branch 'upstream/master'

Conflicts:
	lib/aliases.zsh
Sébastien M-B 11 年之前
父节点
当前提交
2595484a97
共有 100 个文件被更改,包括 5616 次插入327 次删除
  1. 21 0
      MIT-LICENSE.txt
  2. 7 4
      README.textile
  3. 2 0
      lib/aliases.zsh
  4. 1 1
      lib/completion.zsh
  5. 2 7
      lib/directories.zsh
  6. 1 1
      lib/functions.zsh
  7. 46 10
      lib/git.zsh
  8. 3 1
      lib/misc.zsh
  9. 6 5
      lib/rvm.zsh
  10. 2 2
      lib/termsupport.zsh
  11. 7 2
      oh-my-zsh.sh
  12. 18 2
      plugins/archlinux/archlinux.plugin.zsh
  13. 6 2
      plugins/autojump/autojump.plugin.zsh
  14. 67 16
      plugins/battery/battery.plugin.zsh
  15. 2 1
      plugins/bundler/bundler.plugin.zsh
  16. 13 0
      plugins/bwana/bwana.plugin.zsh
  17. 0 21
      plugins/cap/cap.plugin.zsh
  18. 10 0
      plugins/capistrano/_capistrano
  19. 71 0
      plugins/coffee/_coffee
  20. 6 0
      plugins/colemak/colemak-less
  21. 22 0
      plugins/colemak/colemak.plugin.zsh
  22. 1 1
      plugins/command-not-found/command-not-found.plugin.zsh
  23. 29 0
      plugins/composer/composer.plugin.zsh
  24. 14 0
      plugins/cp/cp.plugin.zsh
  25. 8 6
      plugins/debian/debian.plugin.zsh
  26. 3 1
      plugins/encode64/encode64.plugin.zsh
  27. 6 0
      plugins/fasd/fasd.plugin.zsh
  28. 44 0
      plugins/forklift/forklift.plugin.zsh
  29. 285 0
      plugins/git-extras/git-extras.plugin.zsh
  30. 6 5
      plugins/git-flow/git-flow.plugin.zsh
  31. 348 0
      plugins/git-hubflow/git-hubflow.plugin.zsh
  32. 18 0
      plugins/git-remote-branch/git-remote-branch.plugin.zsh
  33. 28 4
      plugins/git/git.plugin.zsh
  34. 78 0
      plugins/gitfast/_git
  35. 2483 0
      plugins/gitfast/git-completion.bash
  36. 290 0
      plugins/gitfast/git-prompt.sh
  37. 7 0
      plugins/gitfast/gitfast.plugin.zsh
  38. 1 0
      plugins/github/github.plugin.zsh
  39. 1 0
      plugins/heroku/_heroku
  40. 8 0
      plugins/history/history.plugin.zsh
  41. 38 0
      plugins/jira/jira.plugin.zsh
  42. 5 1
      plugins/knife/_knife
  43. 40 0
      plugins/laravel/_artisan
  44. 3 0
      plugins/laravel/laravel.plugin.zsh
  45. 24 0
      plugins/last-working-dir/last-working-dir.plugin.zsh
  46. 14 0
      plugins/lein/lein.plugin.zsh
  47. 2 1
      plugins/lol/lol.plugin.zsh
  48. 6 0
      plugins/mercurial/mercurial.plugin.zsh
  49. 167 3
      plugins/mvn/mvn.plugin.zsh
  50. 44 0
      plugins/nanoc/_nanoc
  51. 9 0
      plugins/nanoc/nanoc.plugin.zsh
  52. 1 1
      plugins/node/node.plugin.zsh
  53. 60 3
      plugins/osx/osx.plugin.zsh
  54. 119 0
      plugins/pass/_pass
  55. 149 0
      plugins/per-directory-history/per-directory-history.plugin.zsh
  56. 6 2
      plugins/python/python.plugin.zsh
  57. 2 0
      plugins/rails/rails.plugin.zsh
  58. 1 1
      plugins/rbenv/rbenv.plugin.zsh
  59. 42 0
      plugins/rbfu/rbfu.plugin.zsh
  60. 4 0
      plugins/rsync/rsync.plugin.zsh
  61. 0 147
      plugins/rvm/_rvm
  62. 8 1
      plugins/rvm/rvm.plugin.zsh
  63. 1 1
      plugins/screen/screen.plugin.zsh
  64. 1 3
      plugins/sprunge/sprunge.plugin.zsh
  65. 19 1
      plugins/sublime/sublime.plugin.zsh
  66. 136 0
      plugins/supervisor/_supervisorctl
  67. 32 0
      plugins/supervisor/_supervisord
  68. 1 0
      plugins/supervisor/supervisor.plugin.zsh
  69. 25 5
      plugins/svn/svn.plugin.zsh
  70. 13 0
      plugins/symfony/symfony.plugin.zsh
  71. 7 1
      plugins/symfony2/symfony2.plugin.zsh
  72. 11 0
      plugins/systemd/systemd.plugin.zsh
  73. 35 7
      plugins/terminalapp/terminalapp.plugin.zsh
  74. 3 0
      plugins/themes/_theme
  75. 24 0
      plugins/themes/themes.plugin.zsh
  76. 36 0
      plugins/urltools/urltools.plugin.zsh
  77. 7 0
      plugins/vagrant/_vagrant
  78. 14 1
      plugins/vi-mode/vi-mode.plugin.zsh
  79. 35 41
      plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh
  80. 43 0
      plugins/zeus/README.md
  81. 61 0
      plugins/zeus/zeus.plugin.zsh
  82. 4 1
      templates/zshrc.zsh-template
  83. 7 0
      themes/3den.zsh-theme
  84. 26 0
      themes/adben.zsh-theme
  85. 36 0
      themes/af-magic.zsh-theme
  86. 115 0
      themes/agnoster.zsh-theme
  87. 13 3
      themes/blinks.zsh-theme
  88. 37 0
      themes/candy-kingdom.zsh-theme
  89. 5 1
      themes/cloud.zsh-theme
  90. 39 0
      themes/fino-time.zsh-theme
  91. 5 1
      themes/fishy.zsh-theme
  92. 14 2
      themes/frisk.zsh-theme
  93. 12 0
      themes/frontcube.zsh-theme
  94. 5 1
      themes/gentoo.zsh-theme
  95. 24 0
      themes/intheloop.zsh-theme
  96. 13 6
      themes/jnrowe.zsh-theme
  97. 2 0
      themes/jonathan.zsh-theme
  98. 34 0
      themes/junkfood.zsh-theme
  99. 6 0
      themes/kafeitu.zsh-theme
  100. 0 0
      themes/minimal.zsh-theme

+ 21 - 0
MIT-LICENSE.txt

@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) 2009-2013 Robby Russell and contributors (see https://github.com/robbyrussell/oh-my-zsh/contributors)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 7 - 4
README.textile

@@ -26,17 +26,20 @@ h3. The manual way
 
   @git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh@
 
-2. Create a new zsh config by copying the zsh template we've provided.
+2. *OPTIONAL* Backup your existing ~/.zshrc file
 
-  *NOTE*: If you already have a ~/.zshrc file, you should back it up. @cp ~/.zshrc ~/.zshrc.orig@ in case you want to go back to your original settings.
+  @cp ~/.zshrc ~/.zshrc.orig@
+
+3. Create a new zsh config by copying the zsh template we've provided.
 
   @cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc@
 
-3. Set zsh as your default shell:
+
+4. Set zsh as your default shell:
 
   @chsh -s /bin/zsh@
 
-4. Start / restart zsh (open a new terminal is easy enough...)
+5. Start / restart zsh (open a new terminal is easy enough...)
 
 h3. Problems?
 

+ 2 - 0
lib/aliases.zsh

@@ -8,6 +8,7 @@ alias -- -='cd -'
 
 # Super user
 alias _='sudo'
+alias please='sudo'
 
 #alias g='grep -in'
 
@@ -18,6 +19,7 @@ alias history='fc -l 1'
 alias lsa='ls -lah'
 #alias l='ls -la'
 alias ll='ls -l'
+alias la='ls -lA'
 alias sl=ls # often screw this up
 
 alias afind='ack-grep -il'

+ 1 - 1
lib/completion.zsh

@@ -32,7 +32,7 @@ zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-dir
 cdpath=(.)
 
 # use /etc/hosts and known_hosts for hostname completion
-[ -r /etc/ssh/ssh_known_hosts ] && _global_ssh_hosts=(${${${${(f)"$(</etc/ssh/ssh_known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
+[ -r /etc/ssh/ssh_known_hosts ] && _global_ssh_hosts=(${${${${(f)"$(</etc/ssh/ssh_known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _global_ssh_hosts=()
 [ -r ~/.ssh/known_hosts ] && _ssh_hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[\|]*}%%\ *}%%,*}) || _ssh_hosts=()
 [ -r ~/.ssh/config ] && _ssh_config=($(cat ~/.ssh/config | sed -ne 's/Host[=\t ]//p')) || _ssh_config=()
 [ -r /etc/hosts ] && : ${(A)_etc_hosts:=${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##[:blank:]#[^[:blank:]]#}}} || _etc_hosts=()

+ 2 - 7
lib/directories.zsh

@@ -26,9 +26,9 @@ cd () {
   elif [[ "x$*" == "x...." ]]; then
     cd ../../..
   elif [[ "x$*" == "x....." ]]; then
-    cd ../../..
-  elif [[ "x$*" == "x......" ]]; then
     cd ../../../..
+  elif [[ "x$*" == "x......" ]]; then
+    cd ../../../../..
   else
     builtin cd "$@"
   fi
@@ -37,8 +37,3 @@ cd () {
 alias md='mkdir -p'
 alias rd=rmdir
 alias d='dirs -v | head -10'
-
-# mkdir & cd to it
-function mcd() { 
-  mkdir -p "$1" && cd "$1"; 
-}

+ 1 - 1
lib/functions.zsh

@@ -1,5 +1,5 @@
 function zsh_stats() {
-  history | awk '{print $2}' | sort | uniq -c | sort -rn | head
+  history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl |  head -n20
 }
 
 function uninstall_oh_my_zsh() {

+ 46 - 10
lib/git.zsh

@@ -1,6 +1,7 @@
 # get the name of the branch we are on
 function git_prompt_info() {
-  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
+  ref=$(git symbolic-ref HEAD 2> /dev/null) || \
+  ref=$(git rev-parse --short HEAD 2> /dev/null) || return
   echo "$ZSH_THEME_GIT_PROMPT_PREFIX${ref#refs/heads/}$(parse_git_dirty)$ZSH_THEME_GIT_PROMPT_SUFFIX"
 }
 
@@ -8,16 +9,37 @@ function git_prompt_info() {
 # Checks if working tree is dirty
 parse_git_dirty() {
   local SUBMODULE_SYNTAX=''
-  if [[ $POST_1_7_2_GIT -gt 0 ]]; then
-        SUBMODULE_SYNTAX="--ignore-submodules=dirty"
-  fi
-  if [[ -n $(git status -s ${SUBMODULE_SYNTAX}  2> /dev/null) ]]; then
-    echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
-  else
-    echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
+  if [[ "$(git config --get oh-my-zsh.hide-status)" != "1" ]]; then
+    if [[ $POST_1_7_2_GIT -gt 0 ]]; then
+          SUBMODULE_SYNTAX="--ignore-submodules=dirty"
+    fi
+    if [[ -n $(git status -s ${SUBMODULE_SYNTAX}  2> /dev/null) ]]; then
+      echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
+    else
+      echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
+    fi
   fi
 }
 
+# get the difference between the local and remote branches
+git_remote_status() {
+    remote=${$(git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/}
+    if [[ -n ${remote} ]] ; then
+        ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l)
+        behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l)
+
+        if [ $ahead -eq 0 ] && [ $behind -gt 0 ]
+        then
+            echo "$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE"
+        elif [ $ahead -gt 0 ] && [ $behind -eq 0 ]
+        then
+            echo "$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE"
+        elif [ $ahead -gt 0 ] && [ $behind -gt 0 ]
+        then
+            echo "$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE"
+        fi
+    fi
+}
 
 # Checks if there are commits ahead from remote
 function git_prompt_ahead() {
@@ -38,7 +60,7 @@ function git_prompt_long_sha() {
 
 # Get the status of the working tree
 git_prompt_status() {
-  INDEX=$(git status --porcelain 2> /dev/null)
+  INDEX=$(git status --porcelain -b 2> /dev/null)
   STATUS=""
   if $(echo "$INDEX" | grep '^?? ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_UNTRACKED$STATUS"
@@ -60,18 +82,32 @@ git_prompt_status() {
   fi
   if $(echo "$INDEX" | grep '^ D ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
+  elif $(echo "$INDEX" | grep '^D  ' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
   elif $(echo "$INDEX" | grep '^AD ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_DELETED$STATUS"
   fi
+  if $(git rev-parse --verify refs/stash >/dev/null 2>&1); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_STASHED$STATUS"
+  fi
   if $(echo "$INDEX" | grep '^UU ' &> /dev/null); then
     STATUS="$ZSH_THEME_GIT_PROMPT_UNMERGED$STATUS"
   fi
+  if $(echo "$INDEX" | grep '^## .*ahead' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_AHEAD$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^## .*behind' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_BEHIND$STATUS"
+  fi
+  if $(echo "$INDEX" | grep '^## .*diverged' &> /dev/null); then
+    STATUS="$ZSH_THEME_GIT_PROMPT_DIVERGED$STATUS"
+  fi
   echo $STATUS
 }
 
 #compare the provided version of git to the version installed and on path
 #prints 1 if input version <= installed version
-#prints -1 otherwise 
+#prints -1 otherwise
 function git_compare_version() {
   local INPUT_GIT_VERSION=$1;
   local INSTALLED_GIT_VERSION

+ 3 - 1
lib/misc.zsh

@@ -9,5 +9,7 @@ bindkey "^[m" copy-prev-shell-word
 setopt long_list_jobs
 
 ## pager
-export PAGER="less -R"
+export PAGER="less"
+export LESS="-R"
+
 export LC_CTYPE=$LANG

+ 6 - 5
lib/rvm.zsh

@@ -1,7 +1,8 @@
-# get the name of the branch we are on
+# get the name of the ruby version
 function rvm_prompt_info() {
-  ruby_version=$(~/.rvm/bin/rvm-prompt 2> /dev/null) || return
-  echo "($ruby_version)"
+  [ -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}x" == "x" ]] && return
+  echo "${ZSH_THEME_RVM_PROMPT_PREFIX:=(}${rvm_prompt}${ZSH_THEME_RVM_PROMPT_SUFFIX:=)}"
 }
-
-

+ 2 - 2
lib/termsupport.zsh

@@ -26,8 +26,8 @@ function omz_termsupport_precmd {
 function omz_termsupport_preexec {
   emulate -L zsh
   setopt extended_glob
-  local CMD=${1[(wr)^(*=*|sudo|ssh|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
-  title "$CMD" "%100>...>$2%<<"
+  local CMD=${1[(wr)^(*=*|sudo|ssh|rake|-*)]} #cmd name only, or if this is sudo or ssh, the next cmd
+  title "$CMD" "%100>...>${2:gs/%/%%}%<<"
 }
 
 autoload -U add-zsh-hook

+ 7 - 2
oh-my-zsh.sh

@@ -11,7 +11,9 @@ fpath=($ZSH/functions $ZSH/completions $fpath)
 
 # Load all of the config files in ~/oh-my-zsh that end in .zsh
 # TIP: Add files you don't want in git to .gitignore
-for config_file ($ZSH/lib/*.zsh) source $config_file
+for config_file ($ZSH/lib/*.zsh); do
+  source $config_file
+done
 
 # Set ZSH_CUSTOM to the path where your custom config files
 # and plugins exists, or else we will use the default custom/
@@ -51,7 +53,10 @@ for plugin ($plugins); do
 done
 
 # Load all of your custom configurations from custom/
-for config_file ($ZSH_CUSTOM/*.zsh(N)) source $config_file
+for config_file ($ZSH_CUSTOM/*.zsh(N)); do
+  source $config_file
+done
+unset config_file
 
 # Load the theme
 if [ "$ZSH_THEME" = "random" ]

+ 18 - 2
plugins/archlinux/archlinux.plugin.zsh

@@ -11,7 +11,7 @@ if [[ -x `which yaourt` ]]; then
   alias yaupg='yaourt -Syu'        # Synchronize with repositories before upgrading packages that are out of date on the local system.
   alias yasu='yaourt --sucre'      # Same as yaupg, but without confirmation
   alias yain='yaourt -S'           # Install specific package(s) from the repositories
-  alias yains='yaourt -U'          # Install specific package not from the repositories but from a file 
+  alias yains='yaourt -U'          # Install specific package not from the repositories but from a file
   alias yare='yaourt -R'           # Remove the specified package(s), retaining its configuration(s) and required dependencies
   alias yarem='yaourt -Rns'        # Remove the specified package(s), its configuration(s) and unneeded dependencies
   alias yarep='yaourt -Si'         # Display information about a given package in the repositories
@@ -35,7 +35,7 @@ fi
 # Pacman - https://wiki.archlinux.org/index.php/Pacman_Tips
 alias pacupg='sudo pacman -Syu'        # Synchronize with repositories before upgrading packages that are out of date on the local system.
 alias pacin='sudo pacman -S'           # Install specific package(s) from the repositories
-alias pacins='sudo pacman -U'          # Install specific package not from the repositories but from a file 
+alias pacins='sudo pacman -U'          # Install specific package not from the repositories but from a file
 alias pacre='sudo pacman -R'           # Remove the specified package(s), retaining its configuration(s) and required dependencies
 alias pacrem='sudo pacman -Rns'        # Remove the specified package(s), its configuration(s) and unneeded dependencies
 alias pacrep='pacman -Si'              # Display information about a given package in the repositories
@@ -75,3 +75,19 @@ pacdisowned() {
 
   comm -23 "$fs" "$db"
 }
+
+pacmanallkeys() {
+  # Get all keys for developers and trusted users
+  curl https://www.archlinux.org/{developers,trustedusers}/ |
+  awk -F\" '(/pgp.mit.edu/) {sub(/.*search=0x/,"");print $1}' |
+  xargs sudo pacman-key --recv-keys
+}
+
+pacmansignkeys() {
+  for key in $*; do
+    sudo pacman-key --recv-keys $key
+    sudo pacman-key --lsign-key $key
+    printf 'trust\n3\n' | sudo gpg --homedir /etc/pacman.d/gnupg \
+      --no-permission-warning --command-fd 0 --edit-key $key
+  done
+}

+ 6 - 2
plugins/autojump/autojump.plugin.zsh

@@ -3,7 +3,11 @@ if [ $commands[autojump] ]; then # check if autojump is installed
     . /usr/share/autojump/autojump.zsh
   elif [ -f /etc/profile.d/autojump.zsh ]; then # manual installation
     . /etc/profile.d/autojump.zsh
-  elif [ $commands[brew] -a -f `brew --prefix`/etc/autojump ]; then # mac os x with brew
-    . `brew --prefix`/etc/autojump
+  elif [ -f $HOME/.autojump/etc/profile.d/autojump.zsh ]; then # manual user-local installation
+    . $HOME/.autojump/etc/profile.d/autojump.zsh
+  elif [ -f /opt/local/etc/profile.d/autojump.zsh ]; then # mac os x with ports
+    . /opt/local/etc/profile.d/autojump.zsh
+  elif [ $commands[brew] -a -f `brew --prefix`/etc/autojump.zsh ]; then # mac os x with brew
+    . `brew --prefix`/etc/autojump.zsh
   fi
 fi

+ 67 - 16
plugins/battery/battery.plugin.zsh

@@ -1,20 +1,71 @@
-if [[ $(acpi 2&>/dev/null | grep -c '^Battery.*Discharging') -gt 0 ]] ; then
-  function battery_pct_remaining() { echo "$(acpi | cut -f2 -d ',' | tr -cd '[:digit:]')" }
-  function battery_time_remaining() { echo $(acpi | cut -f3 -d ',') }
-  function battery_pct_prompt() {
-    b=$(battery_pct_remaining)
-    if [ $b -gt 50 ] ; then
-      color='green'
-    elif [ $b -gt 20 ] ; then
-      color='yellow'
+###########################################
+# Battery plugin for oh-my-zsh            #
+# Original Author: Peter hoeg (peterhoeg) #
+# Email: peter@speartail.com              #
+###########################################
+# Author: Sean Jones (neuralsandwich)     #
+# Email: neuralsandwich@gmail.com         #
+# Modified to add support for Apple Mac   #
+###########################################
+
+if [[ $(uname) == "Darwin" ]] ; then
+
+  function battery_pct_remaining() {
+    if [[ $(ioreg -rc AppleSmartBattery | grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]] ; then
+      typeset -F maxcapacity=$(ioreg -rc "AppleSmartBattery"| grep '^.*"MaxCapacity"\ =\ ' | sed -e 's/^.*"MaxCapacity"\ =\ //')
+      typeset -F currentcapacity=$(ioreg -rc "AppleSmartBattery"| grep '^.*"CurrentCapacity"\ =\ ' | sed -e 's/^.*CurrentCapacity"\ =\ //')
+      integer i=$(((currentcapacity/maxcapacity) * 100))
+      echo $i
     else
-      color='red'
+      echo "External Power"
     fi
-    echo "%{$fg[$color]%}[$(battery_pct_remaining)%%]%{$reset_color%}"
   }
-else
-  error_msg='no battery'
-  function battery_pct_remaining() { echo $error_msg }
-  function battery_time_remaining() { echo $error_msg }
-  function battery_pct_prompt() { echo '' }
+
+  function battery_time_remaining() {
+    if [[ $(ioreg -rc AppleSmartBattery | grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]] ; then
+      timeremaining=$(ioreg -rc "AppleSmartBattery"| grep '^.*"AvgTimeToEmpty"\ =\ ' | sed -e 's/^.*"AvgTimeToEmpty"\ =\ //')
+      echo "~$((timeremaining / 60)):$((timeremaining % 60))"
+    else
+      echo "∞"
+    fi
+  }
+
+  function battery_pct_prompt () {
+    if [[ $(ioreg -rc AppleSmartBattery | grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]] ; then
+      b=$(battery_pct_remaining)
+      if [ $b -gt 50 ] ; then
+        color='green'
+      elif [ $b -gt 20 ] ; then
+        color='yellow'
+      else
+        color='red'
+      fi
+      echo "%{$fg[$color]%}[$(battery_pct_remaining)%%]%{$reset_color%}"
+    else
+      echo ""
+    fi
+  }
+
+elif [[ $(uname) == "Linux"  ]] ; then
+
+  if [[ $(acpi 2&>/dev/null | grep -c '^Battery.*Discharging') -gt 0 ]] ; then
+    function battery_pct_remaining() { echo "$(acpi | cut -f2 -d ',' | tr -cd '[:digit:]')" }
+    function battery_time_remaining() { echo $(acpi | cut -f3 -d ',') }
+    function battery_pct_prompt() {
+      b=$(battery_pct_remaining)
+      if [ $b -gt 50 ] ; then
+        color='green'
+      elif [ $b -gt 20 ] ; then
+        color='yellow'
+      else
+        color='red'
+      fi
+      echo "%{$fg[$color]%}[$(battery_pct_remaining)%%]%{$reset_color%}"
+    }
+  else
+    error_msg='no battery'
+    function battery_pct_remaining() { echo $error_msg }
+    function battery_time_remaining() { echo $error_msg }
+    function battery_pct_prompt() { echo '' }
+  fi
 fi

+ 2 - 1
plugins/bundler/bundler.plugin.zsh

@@ -6,7 +6,7 @@ alias bu="bundle update"
 
 # The following is based on https://github.com/gma/bundler-exec
 
-bundled_commands=(annotate cap capify cucumber foreman guard middleman nanoc rackup rainbows rails rake rspec ruby shotgun spec spork thin thor unicorn unicorn_rails)
+bundled_commands=(annotate cap capify cucumber foreman guard middleman nanoc rackup rainbows rake rspec ruby shotgun spec spork thin thor unicorn unicorn_rails puma zeus)
 
 ## Functions
 
@@ -33,6 +33,7 @@ _run-with-bundler() {
 
 ## Main program
 for cmd in $bundled_commands; do
+  eval "function unbundled_$cmd () { $cmd \$@ }"
   eval "function bundled_$cmd () { _run-with-bundler $cmd \$@}"
   alias $cmd=bundled_$cmd
 

+ 13 - 0
plugins/bwana/bwana.plugin.zsh

@@ -0,0 +1,13 @@
+#
+# Requires http://www.bruji.com/bwana/
+#
+if [[ -e /Applications/Bwana.app ]] ||
+    ( system_profiler -detailLevel mini SPApplicationsDataType | grep -q Bwana )
+then
+  function man() {
+    open "man:$1"
+  }
+else
+  echo "Bwana lets you read man files in Safari through a man: URI scheme" 
+  echo "To use it within Zsh, install it from http://www.bruji.com/bwana/"
+fi

+ 0 - 21
plugins/cap/cap.plugin.zsh

@@ -1,21 +0,0 @@
-function _cap_does_task_list_need_generating () {
-  if [ ! -f .cap_tasks~ ]; then return 0;
-  else
-    accurate=$(stat -f%m .cap_tasks~)
-    changed=$(stat -f%m config/deploy.rb)
-    return $(expr $accurate '>=' $changed)
-  fi
-}
-
-function _cap () {
-  if [ -f config/deploy.rb ]; then
-    if _cap_does_task_list_need_generating; then
-      echo "\nGenerating .cap_tasks~..." > /dev/stderr
-      cap show_tasks -q | cut -d " " -f 1 | sed -e '/^ *$/D' -e '1,2D'
-> .cap_tasks~
-    fi
-    compadd `cat .cap_tasks~`
-  fi
-}
-
-compctl -K _cap cap

+ 10 - 0
plugins/capistrano/_capistrano

@@ -0,0 +1,10 @@
+#compdef cap
+#autoload
+
+if [ -f config/deploy.rb ]; then
+  if [[ ! -f .cap_tasks~ || config/deploy.rb -nt .cap_tasks~ ]]; then
+    echo "\nGenerating .cap_tasks~..." > /dev/stderr
+    cap --tasks | grep '#' | cut -d " " -f 2 > .cap_tasks~
+  fi
+  compadd `cat .cap_tasks~`
+fi

+ 71 - 0
plugins/coffee/_coffee

@@ -0,0 +1,71 @@
+#compdef coffee
+# ------------------------------------------------------------------------------
+# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#     * Neither the name of the zsh-users nor the
+#       names of its contributors may be used to endorse or promote products
+#       derived from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+# ------------------------------------------------------------------------------
+# Description
+# -----------
+#
+#  Completion script for Coffee.js v0.6.11 (http://coffeejs.org)
+#
+# ------------------------------------------------------------------------------
+# Authors
+# -------
+#
+#  * Mario Fernandez (https://github.com/sirech)
+#
+# ------------------------------------------------------------------------------
+
+local curcontext="$curcontext" state line ret=1
+typeset -A opt_args
+
+_arguments -C \
+  '(- *)'{-h,--help}'[display this help message]' \
+  '(- *)'{-v,--version}'[display the version number]' \
+  '(-b --bare)'{-b,--bare}'[compile without a top-level function wrapper]' \
+  '(-e --eval)'{-e,--eval}'[pass a string from the command line as input]:Inline Script' \
+  '(-i --interactive)'{-i,--interactive}'[run an interactive CoffeeScript REPL]' \
+  '(-j --join)'{-j,--join}'[concatenate the source CoffeeScript before compiling]:Destination JS file:_files -g "*.js"' \
+  '(-l --lint)'{-l,--lint}'[pipe the compiled JavaScript through JavaScript Lint]' \
+  '(--nodejs)--nodejs[pass options directly to the "node" binary]' \
+  '(-c --compile)'{-c,--compile}'[compile to JavaScript and save as .js files]' \
+  '(-o --output)'{-o,--output}'[set the output directory for compiled JavaScript]:Output Directory:_files -/' \
+  '(-n -t -p)'{-n,--nodes}'[print out the parse tree that the parser produces]' \
+  '(-n -t -p)'{-p,--print}'[print out the compiled JavaScript]' \
+  '(-n -t -p)'{-t,--tokens}'[print out the tokens that the lexer/rewriter produce]' \
+  '(-r --require)'{-r,--require}'[require a library before executing your script]:library' \
+  '(-s --stdio)'{-s,--stdio}'[listen for and compile scripts over stdio]' \
+  '(-w --watch)'{-w,--watch}'[watch scripts for changes and rerun commands]' \
+  '*:script or directory:_files' && ret=0
+
+return ret
+
+# 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

+ 6 - 0
plugins/colemak/colemak-less

@@ -0,0 +1,6 @@
+n    forw-line
+e    back-line
+k    repeat-search
+\ek  repeat-search-all
+K    reverse-search
+\eK  reverse-search-all

+ 22 - 0
plugins/colemak/colemak.plugin.zsh

@@ -0,0 +1,22 @@
+# ctrl-j newline
+bindkey '^n' accept-line
+bindkey -a '^n' accept-line
+
+# another rotation to match qwerty
+bindkey -a 'n' down-line-or-history
+bindkey -a 'e' up-line-or-history
+bindkey -a 'i' vi-forward-char
+
+# make qwerty
+bindkey -a 'k' vi-repeat-search
+bindkey -a 'K' vi-rev-repeat-search
+bindkey -a 'u' vi-insert
+bindkey -a 'U' vi-insert-bol
+bindkey -a 'l' vi-undo-change
+bindkey -a 'N' vi-join
+
+# spare
+bindkey -a 'j' vi-forward-word-end
+bindkey -a 'J' vi-forward-blank-word-end
+
+lesskey $ZSH_CUSTOM/plugins/colemak/colemak-less

+ 1 - 1
plugins/command-not-found/command-not-found.plugin.zsh

@@ -2,4 +2,4 @@
 # as seen in http://www.porcheron.info/command-not-found-for-zsh/
 # this is installed in Ubuntu
 
-source /etc/zsh_command_not_found
+[[ -e /etc/zsh_command_not_found ]] && source /etc/zsh_command_not_found

+ 29 - 0
plugins/composer/composer.plugin.zsh

@@ -0,0 +1,29 @@
+# ------------------------------------------------------------------------------
+#          FILE:  composer.plugin.zsh
+#   DESCRIPTION:  oh-my-zsh composer plugin file.
+#        AUTHOR:  Daniel Gomes (me@danielcsgomes.com)
+#       VERSION:  1.0.0
+# ------------------------------------------------------------------------------
+
+# Composer basic command completion
+_composer_get_command_list () {
+	composer --no-ansi | sed "1,/Available commands/d" | awk '/^  [a-z]+/ { print $1 }'
+}
+
+_composer () {
+  if [ -f composer.json ]; then
+    compadd `_composer_get_command_list`
+  fi
+}
+
+compdef _composer composer
+
+# Aliases
+alias c='composer'
+alias csu='composer self-update'
+alias cu='composer update'
+alias ci='composer install'
+alias ccp='composer create-project'
+
+# install composer in the current directory
+alias cget='curl -s https://getcomposer.org/installer | php'

+ 14 - 0
plugins/cp/cp.plugin.zsh

@@ -0,0 +1,14 @@
+#Show progress while file is copying
+
+# Rsync options are:
+#  -p - preserve permissions
+#  -o - preserve owner
+#  -g - preserve group
+#  -h - output in human-readable format
+#  --progress - display progress
+#  -b - instead of just overwriting an existing file, save the original
+#  --backup-dir=/tmp/rsync - move backup copies to "/tmp/rsync"
+#  -e /dev/null - only work on local files
+#  -- - everything after this is an argument, even if it looks like an option
+
+alias cpv="rsync -poghb --backup-dir=/tmp/rsync -e /dev/null --progress --"

+ 8 - 6
plugins/debian/debian.plugin.zsh

@@ -6,14 +6,14 @@
 
 # Use aptitude if installed, or apt-get if not.
 # You can just set apt_pref='apt-get' to override it.
-if [[ -e $( which aptitude ) ]]; then
+if [[ -e $( which aptitude 2>&1 ) ]]; then
     apt_pref='aptitude'
 else
     apt_pref='apt-get'
 fi
 
 # Use sudo by default if it's installed
-if [[ -e $( which sudo ) ]]; then
+if [[ -e $( which sudo 2>&1 ) ]]; then
     use_sudo=1
 fi
 
@@ -21,7 +21,7 @@ fi
 # These are for more obscure uses of apt-get and aptitude that aren't covered
 # below.
 alias ag='apt-get'
-alias at='aptitude'
+alias ap='aptitude'
 
 # Some self-explanatory aliases
 alias acs="apt-cache search"
@@ -35,7 +35,7 @@ alias afs='apt-file search --regexp'
 
 # These are apt-get only
 alias asrc='apt-get source'
-alias ap='apt-cache policy'
+alias app='apt-cache policy'
 
 # superuser operations ######################################################
 if [[ $use_sudo -eq 1 ]]; then
@@ -61,7 +61,8 @@ if [[ $use_sudo -eq 1 ]]; then
     # Install all .deb files in the current directory.
     # Warning: you will need to put the glob in single quotes if you use:
     # glob_subst
-    alias di='sudo dpkg -i ./*.deb'
+    alias dia='sudo dpkg -i ./*.deb'
+    alias di='sudo dpkg -i'
 
     # Remove ALL kernel images and headers EXCEPT the one in use
     alias kclean='sudo aptitude remove -P ?and(~i~nlinux-(ima|hea) \
@@ -100,7 +101,8 @@ else
 
     # Install all .deb files in the current directory
     # Assumes glob_subst is off
-    alias di='su -lc "dpkg -i ./*.deb" root'
+    alias dia='su -lc "dpkg -i ./*.deb" root'
+    alias di='su -lc "dpkg -i" root'
 
     # Remove ALL kernel images and headers EXCEPT the one in use
     alias kclean='su -lc '\''aptitude remove -P ?and(~i~nlinux-(ima|hea) \

+ 3 - 1
plugins/encode64/encode64.plugin.zsh

@@ -1,2 +1,4 @@
 encode64(){ echo -n $1 | base64 }
-decode64(){ echo -n $1 | base64 -D }
+decode64(){ echo -n $1 | base64 -D }
+alias e64=encode64
+alias d64=decode64

+ 6 - 0
plugins/fasd/fasd.plugin.zsh

@@ -0,0 +1,6 @@
+if [ $commands[fasd] ]; then # check if fasd is installed
+  eval "$(fasd --init auto)"
+  alias v='f -e vim'
+  alias o='a -e open'
+fi
+

+ 44 - 0
plugins/forklift/forklift.plugin.zsh

@@ -0,0 +1,44 @@
+# Open folder in ForkLift.app from console
+# Author: Adam Strzelecki nanoant.com, modified by Bodo Tasche bitboxer.de
+#
+# Usage:
+#   fl [<folder>]
+#
+# Opens specified directory or current working directory in ForkLift.app
+#
+# Notes:
+# It assumes Shift+Cmd+G launches go to folder panel and Cmd+N opens new
+# app window.
+#
+# https://gist.github.com/3313481
+function fl {
+  if [ ! -z "$1" ]; then
+    DIR=$1
+    if [ ! -d "$DIR" ]; then
+      DIR=$(dirname $DIR)
+    fi
+    if [ "$DIR" != "." ]; then
+      PWD=`cd "$DIR";pwd`
+    fi
+  fi
+  osascript 2>&1 1>/dev/null <<END
+    tell application "ForkLift"
+      activate
+    end tell
+    tell application "System Events"
+      tell application process "ForkLift"
+        try
+          set topWindow to window 1
+        on error
+          keystroke "n" using command down
+          set topWindow to window 1
+        end try
+        keystroke "g" using {command down, shift down}
+        tell sheet 1 of topWindow
+          set value of text field 1 to "$PWD"
+        	keystroke return
+        end tell
+      end tell
+    end tell
+END
+}

+ 285 - 0
plugins/git-extras/git-extras.plugin.zsh

@@ -0,0 +1,285 @@
+#compdef git
+# ------------------------------------------------------------------------------
+# Description
+# -----------
+#
+#  Completion script for git-extras (http://github.com/visionmedia/git-extras).
+#
+# ------------------------------------------------------------------------------
+# Authors
+# -------
+#
+#  * Alexis GRIMALDI (https://github.com/agrimaldi)
+#
+# ------------------------------------------------------------------------------
+# Inspirations
+# -----------
+#
+#  * git-extras (http://github.com/visionmedia/git-extras)
+#  * git-flow-completion (http://github.com/bobthecow/git-flow-completion)
+#
+# ------------------------------------------------------------------------------
+
+
+__git_command_successful () {
+    if (( ${#pipestatus:#0} > 0 )); then
+        _message 'not a git repository'
+        return 1
+    fi
+    return 0
+}
+
+
+__git_tag_names() {
+    local expl
+    declare -a tag_names
+    tag_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/})
+    __git_command_successful || return
+    _wanted tag-names expl tag-name compadd $* - $tag_names
+}
+
+
+__git_branch_names() {
+    local expl
+    declare -a branch_names
+    branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
+    __git_command_successful || return
+    _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+
+__git_feature_branch_names() {
+    local expl
+    declare -a branch_names
+    branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/feature 2>/dev/null)"}#refs/heads/feature/})
+    __git_command_successful || return
+    _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+
+__git_refactor_branch_names() {
+    local expl
+    declare -a branch_names
+    branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/refactor 2>/dev/null)"}#refs/heads/refactor/})
+    __git_command_successful || return
+    _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+
+__git_bug_branch_names() {
+    local expl
+    declare -a branch_names
+    branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/bug 2>/dev/null)"}#refs/heads/bug/})
+    __git_command_successful || return
+    _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+
+__git_submodule_names() {
+    local expl
+    declare -a submodule_names
+    submodule_names=(${(f)"$(_call_program branchrefs git submodule status | awk '{print $2}')"})
+    __git_command_successful || return
+    _wanted submodule-names expl submodule-name compadd $* - $submodule_names
+}
+
+
+__git_author_names() {
+    local expl
+    declare -a author_names
+    author_names=(${(f)"$(_call_program branchrefs git log --format='%aN' | sort -u)"})
+    __git_command_successful || return
+    _wanted author-names expl author-name compadd $* - $author_names
+}
+
+
+_git-changelog() {
+    _arguments \
+        '(-l --list)'{-l,--list}'[list commits]' \
+}
+
+
+_git-effort() {
+    _arguments \
+        '--above[ignore file with less than x commits]' \
+}
+
+
+_git-contrib() {
+    _arguments \
+        ':author:__git_author_names'
+}
+
+
+_git-count() {
+    _arguments \
+        '--all[detailed commit count]'
+}
+
+
+_git-delete-branch() {
+    _arguments \
+        ':branch-name:__git_branch_names'
+}
+
+
+_git-delete-submodule() {
+    _arguments \
+        ':submodule-name:__git_submodule_names'
+}
+
+
+_git-delete-tag() {
+    _arguments \
+        ':tag-name:__git_tag_names'
+}
+
+
+_git-extras() {
+    local curcontext=$curcontext state line ret=1
+    declare -A opt_args
+
+    _arguments -C \
+        ': :->command' \
+        '*:: :->option-or-argument' && ret=0
+
+    case $state in
+        (command)
+            declare -a commands
+            commands=(
+                'update:update git-extras'
+            )
+            _describe -t commands command commands && ret=0
+            ;;
+    esac
+
+    _arguments \
+        '(-v --version)'{-v,--version}'[show current version]' \
+}
+
+
+_git-graft() {
+    _arguments \
+        ':src-branch-name:__git_branch_names' \
+        ':dest-branch-name:__git_branch_names'
+}
+
+
+_git-squash() {
+    _arguments \
+        ':branch-name:__git_branch_names'
+}
+
+
+_git-feature() {
+    local curcontext=$curcontext state line ret=1
+    declare -A opt_args
+
+    _arguments -C \
+        ': :->command' \
+        '*:: :->option-or-argument' && ret=0
+
+    case $state in
+        (command)
+            declare -a commands
+            commands=(
+                'finish:merge feature into the current branch'
+            )
+            _describe -t commands command commands && ret=0
+            ;;
+        (option-or-argument)
+            curcontext=${curcontext%:*}-$line[1]:
+            case $line[1] in
+                (finish)
+                    _arguments -C \
+                        ':branch-name:__git_feature_branch_names'
+                    ;;
+            esac
+    esac
+}
+
+
+_git-refactor() {
+    local curcontext=$curcontext state line ret=1
+    declare -A opt_args
+
+    _arguments -C \
+        ': :->command' \
+        '*:: :->option-or-argument' && ret=0
+
+    case $state in
+        (command)
+            declare -a commands
+            commands=(
+                'finish:merge refactor into the current branch'
+            )
+            _describe -t commands command commands && ret=0
+            ;;
+        (option-or-argument)
+            curcontext=${curcontext%:*}-$line[1]:
+            case $line[1] in
+                (finish)
+                    _arguments -C \
+                        ':branch-name:__git_refactor_branch_names'
+                    ;;
+            esac
+    esac
+}
+
+
+_git-bug() {
+    local curcontext=$curcontext state line ret=1
+    declare -A opt_args
+
+    _arguments -C \
+        ': :->command' \
+        '*:: :->option-or-argument' && ret=0
+
+    case $state in
+        (command)
+            declare -a commands
+            commands=(
+                'finish:merge bug into the current branch'
+            )
+            _describe -t commands command commands && ret=0
+            ;;
+        (option-or-argument)
+            curcontext=${curcontext%:*}-$line[1]:
+            case $line[1] in
+                (finish)
+                    _arguments -C \
+                        ':branch-name:__git_bug_branch_names'
+                    ;;
+            esac
+    esac
+}
+
+
+zstyle ':completion:*:*:git:*' user-commands \
+    changelog:'populate changelog file with commits since the previous tag' \
+    contrib:'display author contributions' \
+    count:'count commits' \
+    delete-branch:'delete local and remote branch' \
+    delete-submodule:'delete submodule' \
+    delete-tag:'delete local and remote tag' \
+    extras:'git-extras' \
+    graft:'merge commits from source branch to destination branch' \
+    squash:'merge commits from source branch into the current one as a single commit' \
+    feature:'create a feature branch' \
+    refactor:'create a refactor branch' \
+    bug:'create a bug branch' \
+    summary:'repository summary' \
+    effort:'display effort statistics' \
+    repl:'read-eval-print-loop' \
+    commits-since:'list commits since a given date' \
+    release:'release commit with the given tag' \
+    alias:'define, search and show aliases' \
+    ignore:'add patterns to .gitignore' \
+    info:'show info about the repository' \
+    create-branch:'create local and remote branch' \
+    fresh-branch:'create empty local branch' \
+    undo:'remove the latest commit' \
+    setup:'setup a git repository' \
+    touch:'one step creation of new files' \
+    obliterate:'Completely remove a file from the repository, including past commits and tags' \
+    local-commits:'list unpushed commits on the local branch' \

+ 6 - 5
plugins/git-flow/git-flow.plugin.zsh

@@ -195,7 +195,7 @@ __git-flow-feature ()
 				'start:Start a new feature branch.'
 				'finish:Finish a feature branch.'
 				'list:List all your feature branches. (Alias to `git flow feature`)'
-				'publish: public'
+				'publish: publish'
 				'track: track'
 				'diff: diff'
 				'rebase: rebase'
@@ -221,6 +221,7 @@ __git-flow-feature ()
 					_arguments \
 						-F'[Fetch from origin before performing finish]' \
 						-r'[Rebase instead of merge]'\
+						-k'[Keep branch after performing finish]'\
 						':feature:__git_flow_feature_list'
 				;;
 
@@ -236,13 +237,13 @@ __git-flow-feature ()
 
 				(diff)
 					_arguments \
-						':branch:__git_branch_names'\
+						':branch:__git_flow_feature_list'\
 				;;
 
 				(rebase)
 					_arguments \
 						-i'[Do an interactive rebase]' \
-						':branch:__git_branch_names'
+						':branch:__git_flow_feature_list'
 				;;
 
 				(checkout)
@@ -253,7 +254,7 @@ __git-flow-feature ()
 				(pull)
 					_arguments \
 						':remote:__git_remotes'\
-						':branch:__git_branch_names'
+						':branch:__git_flow_feature_list'
 				;;
 
 				*)
@@ -333,4 +334,4 @@ __git_command_successful () {
 	return 0
 }
 
-zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'
+zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'

+ 348 - 0
plugins/git-hubflow/git-hubflow.plugin.zsh

@@ -0,0 +1,348 @@
+#!zsh
+#
+# Installation
+# ------------
+#
+# To achieve git-hubflow completion nirvana:
+#
+#  0. Update your zsh's git-completion module to the newest verion.
+#     From here. http://zsh.git.sourceforge.net/git/gitweb.cgi?p=zsh/zsh;a=blob_plain;f=Completion/Unix/Command/_git;hb=HEAD
+#
+#  1. Install this file. Either:
+#
+#     a. Place it in your .zshrc:
+#
+#     b. Or, copy it somewhere (e.g. ~/.git-hubflow-completion.zsh) and put the following line in
+#        your .zshrc:
+#
+#            source ~/.git-hubflow-completion.zsh
+#
+#     c. Or, use this file as a oh-my-zsh plugin.
+#
+
+_git-hf ()
+{
+    local curcontext="$curcontext" state line
+    typeset -A opt_args
+
+    _arguments -C \
+        ':command:->command' \
+        '*::options:->options'
+
+    case $state in
+        (command)
+
+            local -a subcommands
+            subcommands=(
+                'init:Initialize a new git repo with support for the branching model.'
+                'feature:Manage your feature branches.'
+                'release:Manage your release branches.'
+                'hotfix:Manage your hotfix branches.'
+                'support:Manage your support branches.'
+                'update:Pull upstream changes down into your master and develop branches.'
+                'version:Shows version information.'
+            )
+            _describe -t commands 'git hf' subcommands
+        ;;
+
+        (options)
+            case $line[1] in
+
+                (init)
+                    _arguments \
+                        -f'[Force setting of gitflow branches, even if already configured]'
+                ;;
+
+                (version)
+                ;;
+
+                (hotfix)
+                    __git-hf-hotfix
+                ;;
+
+                (release)
+                    __git-hf-release
+                ;;
+
+                (feature)
+                    __git-hf-feature
+                ;;
+            esac
+        ;;
+    esac
+}
+
+__git-hf-release ()
+{
+    local curcontext="$curcontext" state line
+    typeset -A opt_args
+
+    _arguments -C \
+        ':command:->command' \
+        '*::options:->options'
+
+    case $state in
+        (command)
+
+            local -a subcommands
+            subcommands=(
+                'start:Start a new release branch.'
+                'finish:Finish a release branch.'
+                'list:List all your release branches. (Alias to `git hf release`)'
+                'cancel:Cancel release'
+                'push:Push release to github'
+                'pull:Pull release from github'
+                'track:Track release'
+            )
+            _describe -t commands 'git hf release' subcommands
+            _arguments \
+                -v'[Verbose (more) output]'
+        ;;
+
+        (options)
+            case $line[1] in
+
+                (start)
+                    _arguments \
+                        -F'[Fetch from origin before performing finish]'\
+                        ':version:__git_hf_version_list'
+                ;;
+
+                (finish)
+                    _arguments \
+                        -F'[Fetch from origin before performing finish]' \
+                        -s'[Sign the release tag cryptographically]'\
+                        -u'[Use the given GPG-key for the digital signature (implies -s)]'\
+                        -m'[Use the given tag message]'\
+                        -p'[Push to $ORIGIN after performing finish]'\
+                        -k'[Keep branch after performing finish]'\
+                        -n"[Don't tag this release]"\
+                        ':version:__git_hf_version_list'
+                ;;
+
+                *)
+                    _arguments \
+                        -v'[Verbose (more) output]'
+                ;;
+            esac
+        ;;
+    esac
+}
+
+__git-hf-hotfix ()
+{
+    local curcontext="$curcontext" state line
+    typeset -A opt_args
+
+    _arguments -C \
+        ':command:->command' \
+        '*::options:->options'
+
+    case $state in
+        (command)
+
+            local -a subcommands
+            subcommands=(
+                'start:Start a new hotfix branch.'
+                'finish:Finish a hotfix branch.'
+                'list:List all your hotfix branches. (Alias to `git hf hotfix`)'
+                'publish:Publish the hotfix branch.'
+                'track:Track the hotfix branch.'
+                'pull:Pull the hotfix from github.'
+                'push:Push the hotfix to github.'
+                'cancel:Cancel the hotfix.'
+            )
+            _describe -t commands 'git hf hotfix' subcommands
+            _arguments \
+                -v'[Verbose (more) output]'
+        ;;
+
+        (options)
+            case $line[1] in
+
+                (start)
+                    _arguments \
+                        -F'[Fetch from origin before performing finish]'\
+                        ':hotfix:__git_hf_version_list'\
+                        ':branch-name:__git_branch_names'
+                ;;
+
+                (finish)
+                    _arguments \
+                        -F'[Fetch from origin before performing finish]' \
+                        -s'[Sign the release tag cryptographically]'\
+                        -u'[Use the given GPG-key for the digital signature (implies -s)]'\
+                        -m'[Use the given tag message]'\
+                        -p'[Push to $ORIGIN after performing finish]'\
+                        -k'[Keep branch after performing finish]'\
+                        -n"[Don't tag this release]"\
+                        ':hotfix:__git_hf_hotfix_list'
+                ;;
+
+                *)
+                    _arguments \
+                        -v'[Verbose (more) output]'
+                ;;
+            esac
+        ;;
+    esac
+}
+
+__git-hf-feature ()
+{
+    local curcontext="$curcontext" state line
+    typeset -A opt_args
+
+    _arguments -C \
+        ':command:->command' \
+        '*::options:->options'
+
+    case $state in
+        (command)
+
+            local -a subcommands
+            subcommands=(
+                'list:List all your feature branches. (Alias to `git hf feature`)'
+                'start:Start a new feature branch'
+                'finish:Finish a feature branch'
+                'submit:submit'
+                'track:track'
+                'diff:Diff'
+                'rebase:Rebase feature branch against develop'
+                'checkout:Checkout feature'
+                'pull:Pull feature branch from github'
+                'push:Push feature branch to github'
+                'cancel:Cancel feature'
+            )
+            _describe -t commands 'git hf feature' subcommands
+            _arguments \
+                -v'[Verbose (more) output]'
+        ;;
+
+        (options)
+            case $line[1] in
+
+                (start)
+                    _arguments \
+                        -F'[Fetch from origin before performing finish]'\
+                        ':feature:__git_hf_feature_list'\
+                        ':branch-name:__git_branch_names'
+                ;;
+
+                (finish)
+                    _arguments \
+                        -F'[Fetch from origin before performing finish]' \
+                        -r'[Rebase instead of merge]'\
+                        ':feature:__git_hf_feature_list'
+                ;;
+
+                (publish)
+                    _arguments \
+                        ':feature:__git_hf_feature_list'\
+                ;;
+
+                (track)
+                    _arguments \
+                        ':feature:__git_hf_feature_list'\
+                ;;
+
+                (diff)
+                    _arguments \
+                        ':branch:__git_branch_names'\
+                ;;
+
+                (rebase)
+                    _arguments \
+                        -i'[Do an interactive rebase]' \
+                        ':branch:__git_branch_names'
+                ;;
+
+                (checkout)
+                    _arguments \
+                        ':branch:__git_hf_feature_list'\
+                ;;
+
+                (pull)
+                    _arguments \
+                        ':remote:__git_remotes'\
+                        ':branch:__git_branch_names'
+                ;;
+
+                *)
+                    _arguments \
+                        -v'[Verbose (more) output]'
+                ;;
+            esac
+        ;;
+    esac
+}
+
+__git_hf_version_list ()
+{
+    local expl
+    declare -a versions
+
+    versions=(${${(f)"$(_call_program versions git hf release list 2> /dev/null | tr -d ' |*')"}})
+    __git_command_successful || return
+
+    _wanted versions expl 'version' compadd $versions
+}
+
+__git_hf_feature_list ()
+{
+    local expl
+    declare -a features
+
+    features=(${${(f)"$(_call_program features git hf feature list 2> /dev/null | tr -d ' |*')"}})
+    __git_command_successful || return
+
+    _wanted features expl 'feature' compadd $features
+}
+
+__git_remotes () {
+    local expl gitdir remotes
+
+    gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
+    __git_command_successful || return
+
+    remotes=(${${(f)"$(_call_program remotes git config --get-regexp '"^remote\..*\.url$"')"}//#(#b)remote.(*).url */$match[1]})
+    __git_command_successful || return
+
+    # TODO: Should combine the two instead of either or.
+    if (( $#remotes > 0 )); then
+        _wanted remotes expl remote compadd $* - $remotes
+    else
+        _wanted remotes expl remote _files $* - -W "($gitdir/remotes)" -g "$gitdir/remotes/*"
+    fi
+}
+
+__git_hf_hotfix_list ()
+{
+    local expl
+    declare -a hotfixes
+
+    hotfixes=(${${(f)"$(_call_program hotfixes git hf hotfix list 2> /dev/null | tr -d ' |*')"}})
+    __git_command_successful || return
+
+    _wanted hotfixes expl 'hotfix' compadd $hotfixes
+}
+
+__git_branch_names () {
+    local expl
+    declare -a branch_names
+
+    branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
+    __git_command_successful || return
+
+    _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+__git_command_successful () {
+    if (( ${#pipestatus:#0} > 0 )); then
+        _message 'not a git repository'
+        return 1
+    fi
+    return 0
+}
+
+zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'

+ 18 - 0
plugins/git-remote-branch/git-remote-branch.plugin.zsh

@@ -0,0 +1,18 @@
+_git_remote_branch() {
+  ref=$(git symbolic-ref HEAD 2> /dev/null)
+  if [[ -n $ref ]]; then
+    if (( CURRENT == 2 )); then
+      # first arg: operation
+      compadd create publish rename delete track
+    elif (( CURRENT == 3 )); then
+      # second arg: remote branch name
+      compadd `git branch -r | grep -v HEAD | sed "s/.*\///" | sed "s/ //g"`
+    elif (( CURRENT == 4 )); then
+      # third arg: remote name
+      compadd `git remote`
+    fi
+  else;
+    _files
+  fi
+}
+compdef _git_remote_branch grb

+ 28 - 4
plugins/git/git.plugin.zsh

@@ -5,10 +5,11 @@ alias gst='git status'
 compdef _git gst=git-status
 alias gl='git pull'
 compdef _git gl=git-pull
-alias gup='git fetch && git rebase'
+alias gup='git pull --rebase'
 compdef _git gup=git-fetch
 alias gp='git push'
 compdef _git gp=git-push
+alias gd='git diff'
 gdv() { git diff -w "$@" | view - }
 compdef _git gdv=git-diff
 alias gc='git commit -v'
@@ -18,18 +19,33 @@ compdef _git gca=git-commit
 alias gco='git checkout'
 compdef _git gco=git-checkout
 alias gcm='git checkout master'
+alias gr='git remote'
+compdef _git gr=git-remote
+alias grv='git remote -v'
+compdef _git grv=git-remote
+alias grmv='git remote rename'
+compdef _git grmv=git-remote
+alias grrm='git remote remove'
+compdef _git grrm=git-remote
+alias grset='git remote set-url'
+compdef _git grset=git-remote
+alias grup='git remote update'
+compdef _git grset=git-remote
 alias gb='git branch'
 compdef _git gb=git-branch
 alias gba='git branch -a'
 compdef _git gba=git-branch
 alias gcount='git shortlog -sn'
 compdef gcount=git
+alias gcl='git config --list'
 alias gcp='git cherry-pick'
 compdef _git gcp=git-cherry-pick
 alias glg='git log --stat --max-count=5'
 compdef _git glg=git-log
 alias glgg='git log --graph --max-count=5'
 compdef _git glgg=git-log
+alias glgga='git log --graph --decorate --all'
+compdef _git glgga=git-log
 alias gss='git status -s'
 compdef _git gss=git-status
 alias ga='git add'
@@ -38,6 +54,13 @@ alias gm='git merge'
 compdef _git gm=git-merge
 alias grh='git reset HEAD'
 alias grhh='git reset HEAD --hard'
+alias gwc='git whatchanged -p --abbrev-commit --pretty=medium'
+alias gf='git ls-files | grep'
+alias gpoat='git push origin --all && git push origin --tags'
+
+# Will cd into the top of the current repository
+# or submodule.
+alias grt='cd $(git rev-parse --show-toplevel || echo ".")'
 
 # Git and svn mix
 alias git-svn-dcommit-push='git svn dcommit && git push github master:svntrunk'
@@ -50,13 +73,14 @@ alias gsd='git svn dcommit'
 # Usage example: git pull origin $(current_branch)
 #
 function current_branch() {
-  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
+  ref=$(git symbolic-ref HEAD 2> /dev/null) || \
+  ref=$(git rev-parse --short HEAD 2> /dev/null) || return
   echo ${ref#refs/heads/}
 }
 
 function current_repository() {
-
-  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
+  ref=$(git symbolic-ref HEAD 2> /dev/null) || \
+  ref=$(git rev-parse --short HEAD 2> /dev/null) || return
   echo $(git remote -v | cut -d':' -f 2)
 }
 

+ 78 - 0
plugins/gitfast/_git

@@ -0,0 +1,78 @@
+#compdef git gitk
+
+# zsh completion wrapper for git
+#
+# You need git's bash completion script installed somewhere, by default on the
+# same directory as this script.
+#
+# If your script is on ~/.git-completion.sh instead, 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:
+#
+#  fpath=(~/.zsh/completion $fpath)
+
+complete ()
+{
+	# do nothing
+	return 0
+}
+
+zstyle -s ":completion:*:*:git:*" script script
+test -z "$script" && script="$(dirname ${funcsourcetrace[1]%:*})"/git-completion.bash
+ZSH_VERSION='' . "$script"
+
+__gitcomp ()
+{
+	emulate -L zsh
+
+	local cur_="${3-$cur}"
+
+	case "$cur_" in
+	--*=)
+		;;
+	*)
+		local c IFS=$' \t\n'
+		local -a array
+		for c in ${=1}; do
+			c="$c${4-}"
+			case $c in
+			--*=*|*.) ;;
+			*) c="$c " ;;
+			esac
+			array+=("$c")
+		done
+		compset -P '*[=:]'
+		compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
+		;;
+	esac
+}
+
+__gitcomp_nl ()
+{
+	emulate -L zsh
+
+	local IFS=$'\n'
+	compset -P '*[=:]'
+	compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
+}
+
+_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
+	return _ret
+}
+
+_git

文件差异内容过多而无法显示
+ 2483 - 0
plugins/gitfast/git-completion.bash


+ 290 - 0
plugins/gitfast/git-prompt.sh

@@ -0,0 +1,290 @@
+# bash/zsh git prompt support
+#
+# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
+# Distributed under the GNU General Public License, version 2.0.
+#
+# This script allows you to see the current branch in your prompt.
+#
+# To enable:
+#
+#    1) Copy this file to somewhere (e.g. ~/.git-prompt.sh).
+#    2) Add the following line to your .bashrc/.zshrc:
+#        source ~/.git-prompt.sh
+#    3) Change your PS1 to also show the current branch:
+#         Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
+#         ZSH:  PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
+#
+# 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.
+#
+# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
+# unstaged (*) and staged (+) changes will be shown next to the branch
+# name.  You can configure this per-repository with the
+# bash.showDirtyState variable, which defaults to true once
+# GIT_PS1_SHOWDIRTYSTATE is enabled.
+#
+# You can also see if currently something is stashed, by setting
+# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
+# then a '$' will be shown next to the branch name.
+#
+# If you would like to see if there're untracked files, then you can set
+# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
+# files, then a '%' will be shown next to the branch name.
+#
+# If you would like to see the difference between HEAD and its upstream,
+# set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates you are behind, ">"
+# indicates you are ahead, "<>" indicates you have diverged and "="
+# indicates that there is no difference. You can further control
+# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
+# of values:
+#
+#     verbose       show number of commits ahead/behind (+/-) upstream
+#     legacy        don't use the '--count' option available in recent
+#                   versions of git-rev-list
+#     git           always compare HEAD to @{upstream}
+#     svn           always compare HEAD to your SVN upstream
+#
+# By default, __git_ps1 will compare HEAD to your SVN upstream if it can
+# find one, or @{upstream} otherwise.  Once you have set
+# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
+# setting the bash.showUpstream config variable.
+
+# __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
+}
+
+# stores the divergence from upstream in $p
+# used by GIT_PS1_SHOWUPSTREAM
+__git_ps1_show_upstream ()
+{
+	local key value
+	local svn_remote svn_url_pattern count n
+	local upstream=git legacy="" verbose=""
+
+	svn_remote=()
+	# get some config options from git-config
+	local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
+	while read -r key value; do
+		case "$key" in
+		bash.showupstream)
+			GIT_PS1_SHOWUPSTREAM="$value"
+			if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
+				p=""
+				return
+			fi
+			;;
+		svn-remote.*.url)
+			svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
+			svn_url_pattern+="\\|$value"
+			upstream=svn+git # default upstream is SVN if available, else git
+			;;
+		esac
+	done <<< "$output"
+
+	# parse configuration values
+	for option in ${GIT_PS1_SHOWUPSTREAM}; do
+		case "$option" in
+		git|svn) upstream="$option" ;;
+		verbose) verbose=1 ;;
+		legacy)  legacy=1  ;;
+		esac
+	done
+
+	# Find our upstream
+	case "$upstream" in
+	git)    upstream="@{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 \
+					--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%@*}
+			local n_stop="${#svn_remote[@]}"
+			for ((n=1; n <= n_stop; n++)); do
+				svn_upstream=${svn_upstream#${svn_remote[$n]}}
+			done
+
+			if [[ -z "$svn_upstream" ]]; then
+				# default branch name for checkouts with no layout:
+				upstream=${GIT_SVN_ID:-git-svn}
+			else
+				upstream=${svn_upstream#/}
+			fi
+		elif [[ "svn+git" = "$upstream" ]]; then
+			upstream="@{upstream}"
+		fi
+		;;
+	esac
+
+	# Find how many commits we are ahead/behind our upstream
+	if [[ -z "$legacy" ]]; then
+		count="$(git rev-list --count --left-right \
+				"$upstream"...HEAD 2>/dev/null)"
+	else
+		# produce equivalent output to --count for older versions of git
+		local commits
+		if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
+		then
+			local commit behind=0 ahead=0
+			for commit in $commits
+			do
+				case "$commit" in
+				"<"*) ((behind++)) ;;
+				*)    ((ahead++))  ;;
+				esac
+			done
+			count="$behind	$ahead"
+		else
+			count=""
+		fi
+	fi
+
+	# calculate the result
+	if [[ -z "$verbose" ]]; then
+		case "$count" in
+		"") # no upstream
+			p="" ;;
+		"0	0") # equal to upstream
+			p="=" ;;
+		"0	"*) # ahead of upstream
+			p=">" ;;
+		*"	0") # behind upstream
+			p="<" ;;
+		*)	    # diverged from upstream
+			p="<>" ;;
+		esac
+	else
+		case "$count" in
+		"") # no upstream
+			p="" ;;
+		"0	0") # equal to upstream
+			p=" u=" ;;
+		"0	"*) # ahead of upstream
+			p=" u+${count#0	}" ;;
+		*"	0") # behind upstream
+			p=" u-${count%	0}" ;;
+		*)	    # diverged from upstream
+			p=" u+${count#*	}-${count%	*}" ;;
+		esac
+	fi
+
+}
+
+
+# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
+# returns text to add to bash PS1 prompt (includes branch name)
+__git_ps1 ()
+{
+	local g="$(__gitdir)"
+	if [ -n "$g" ]; then
+		local r=""
+		local b=""
+		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"
+			fi
+
+			b="$(git symbolic-ref HEAD 2>/dev/null)" || {
+
+				b="$(
+				case "${GIT_PS1_DESCRIBE_STYLE-}" in
+				(contains)
+					git describe --contains HEAD ;;
+				(branch)
+					git describe --contains --all HEAD ;;
+				(describe)
+					git describe HEAD ;;
+				(* | default)
+					git describe --tags --exact-match HEAD ;;
+				esac 2>/dev/null)" ||
+
+				b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
+				b="unknown"
+				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-}" ]; then
+				if [ "$(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
+			fi
+			if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
+				git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
+			fi
+
+			if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
+				if [ -n "$(git ls-files --others --exclude-standard)" ]; then
+					u="%"
+				fi
+			fi
+
+			if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
+				__git_ps1_show_upstream
+			fi
+		fi
+
+		local f="$w$i$s$u"
+		printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
+	fi
+}

+ 7 - 0
plugins/gitfast/gitfast.plugin.zsh

@@ -0,0 +1,7 @@
+dir=$(dirname $0)
+source $dir/../git/git.plugin.zsh
+source $dir/git-prompt.sh
+
+function git_prompt_info() {
+  __git_ps1 "${ZSH_THEME_GIT_PROMPT_PREFIX//\%/%%}%s${ZSH_THEME_GIT_PROMPT_SUFFIX//\%/%%}"
+}

+ 1 - 0
plugins/github/github.plugin.zsh

@@ -61,6 +61,7 @@ exist_gh() { # [DIRECTORY]
     cd "$1"
     name=$( git config user.name )
     ghuser=$( git config github.user )
+    repo=$1
 
     git remote add origin git@github.com:${ghuser}/${repo}.git
     git push -u origin master

+ 1 - 0
plugins/heroku/_heroku

@@ -154,5 +154,6 @@ case "$words[1]" in
 _arguments \
   $_command_args \
   '(--app)--app[the app name]' \
+  '(--remote)--remote[the remote name]' \
   &&  return 0
 

+ 8 - 0
plugins/history/history.plugin.zsh

@@ -0,0 +1,8 @@
+alias h='history'
+
+function hs
+{
+    history | grep $*
+}
+
+alias hsi='hs -i'

+ 38 - 0
plugins/jira/jira.plugin.zsh

@@ -0,0 +1,38 @@
+# To use: add a .jira-url file in the base of your project
+#         You can also set JIRA_URL in your .zshrc or put .jira-url in your home directory
+#         .jira-url in the current directory takes precedence
+#
+# If you use Rapid Board, set:
+#JIRA_RAPID_BOARD="yes"
+# in you .zshrc
+#
+# Setup: cd to/my/project
+#        echo "https://name.jira.com" >> .jira-url
+# Usage: jira           # opens a new issue
+#        jira ABC-123   # Opens an existing issue
+open_jira_issue () {
+  if [ -f .jira-url ]; then
+    jira_url=$(cat .jira-url)
+  elif [ -f ~/.jira-url ]; then
+    jira_url=$(cat ~/.jira-url)
+  elif [[ "x$JIRA_URL" != "x" ]]; then
+    jira_url=$JIRA_URL
+  else
+    echo "JIRA url is not specified anywhere."
+    return 0
+  fi
+
+  if [ -z "$1" ]; then
+    echo "Opening new issue"
+    `open $jira_url/secure/CreateIssue!default.jspa`
+  else
+    echo "Opening issue #$1"
+    if [[ "x$JIRA_RAPID_BOARD" = "yes" ]]; then
+      `open $jira_url/issues/$1`
+    else
+      `open $jira_url/browse/$1`
+    fi
+  fi
+}
+
+alias jira='open_jira_issue'

+ 5 - 1
plugins/knife/_knife

@@ -170,7 +170,11 @@ _chef_environments_remote() {
 
 # The chef_x_local functions use the knife config to find the paths of relevant objects x to be uploaded to the server
 _chef_cookbooks_local() {
- (for i in $( grep cookbook_path $HOME/.chef/knife.rb | awk 'BEGIN {FS = "[" }; {print $2}' | sed 's/\,//g' | sed "s/'//g" | sed 's/\(.*\)]/\1/' ); do ls $i; done)
+ local knife_rb="$HOME/.chef/knife.rb"
+ if [ -f ./.chef/knife.rb ]; then
+  knife_rb="./.chef/knife.rb"
+ fi
+ (for i in $( grep cookbook_path $knife_rb | awk 'BEGIN {FS = "[" }; {print $2}' | sed 's/\,//g' | sed "s/'//g" | sed 's/\(.*\)]/\1/' ); do ls $i; done)
 }
 
 # This function extracts the available cookbook versions on the chef server

+ 40 - 0
plugins/laravel/_artisan

@@ -0,0 +1,40 @@
+#compdef artisan
+
+# Laravel autocompletion
+# Author: John Hamelink <john@johnhamelink.com>
+#
+# This plugin does the following:
+#  - Adds aliases and autocompletion for artisan
+#  - Adds aliases and autocompletion for bob
+
+local curcontext="$curcontext" state line _opts _bundles ret=1
+_arguments -C \
+    '1: :->cmds' \
+    '*:: :->args' && ret=0
+
+case $state in
+    cmds)
+
+    _values "Artisan command" \
+        'session\:install[Create a session table]' \
+        'migrate[Manage Migrations]' \
+        'test[Run a test]' \
+        'route\:\:call[Call a route in the CLI]' \
+        'key\:\:generate[Generate a key]'
+        ret=0
+        ;;
+    args)
+        case $line[1] in
+            migrate)
+                _values \
+                    'install[Create the Laravel migration table' \
+                    'make[Create a migration]' \
+                    'rollback[Roll back to the last migration operation]' \
+                    'reset[Roll back all migrations that have ever run]'
+                ret=0
+                ;;
+        esac
+        ;;
+esac
+
+return ret

+ 3 - 0
plugins/laravel/laravel.plugin.zsh

@@ -0,0 +1,3 @@
+#!zsh
+alias artisan='php artisan'
+alias bob='php artisan bob::build'

+ 24 - 0
plugins/last-working-dir/last-working-dir.plugin.zsh

@@ -0,0 +1,24 @@
+#!/usr/bin/env zsh
+# Keeps track of the last used working directory and automatically jumps
+# into it for new shells.
+
+# Flag indicating if we've previously jumped to last directory.
+typeset -g ZSH_LAST_WORKING_DIRECTORY
+mkdir -p "$ZSH/cache"
+local cache_file="$ZSH/cache/last-working-dir"
+
+# Updates the last directory once directory is changed.
+function chpwd() {
+	echo "$PWD" > "$cache_file"
+}
+
+# Changes directory to the last working directory.
+function lwd() {
+	[[ ! -r "$cache_file" ]] || cd `cat "$cache_file"`
+}
+
+# Automatically jump to last working directory unless this isn't the first time
+# this plugin has been loaded.
+if [[ -z "$ZSH_LAST_WORKING_DIRECTORY" ]]; then
+	lwd 2>/dev/null && ZSH_LAST_WORKING_DIRECTORY=1 || true
+fi

+ 14 - 0
plugins/lein/lein.plugin.zsh

@@ -5,15 +5,29 @@ function _lein_commands() {
     case $state in
       subcommand)
         subcommands=(
+          "classpath:print the classpath of the current project"
           "clean:remove compiled files and dependencies from project"
           "compile:ahead-of-time compile the project"
+          "deploy:build jar and deploy to remote repository"
           "deps:download and install all dependencies"
           "help:display a list of tasks or help for a given task"
           "install:install the project and its dependencies in your local repository"
+          "int:enter an interactive task shell"
+          "interactive:enter an interactive task shell"
+          "jack-in:jack in to a clojure slime session from emacs."
           "jar:create a jar file containing the compiled .class files"
+          "javac:compile java source files"
           "new:create a new project skeleton"
+          "plugin:manage user-level plugins"
           "pom:write a pom.xml file to disk for maven interop"
+          "repl:start a repl session either with the current project or standalone"
+          "retest:run only the test namespaces which failed last time around"
+          "run:run the project's -main function"
+          "search:search remote maven repositories for matching jars"
+          "swank:launch swank server for Emacs to connect"
           "test:run the project's tests"
+          "test!:run a project's tests after cleaning and fetching dependencies"
+          "trampoline:run a task without nesting the project's JVM inside Leiningen's."
           "uberjar:Create a jar including the contents of each of deps"
           "upgrade:upgrade leiningen to the latest stable release"
           "version:print leiningen's version"

+ 2 - 1
plugins/lol/lol.plugin.zsh

@@ -5,6 +5,7 @@ alias wtf='dmesg'
 alias onoz='cat /var/log/errors.log'
 alias rtfm='man'
 
+alias :3='echo'
 alias visible='echo'
 alias invisible='cat'
 alias moar='more'
@@ -29,7 +30,7 @@ alias iminurbase='finger'
 alias btw='nice'
 alias obtw='nohup'
 
-alias nomz='ps -aux'
+alias nomz='ps aux'
 alias nomnom='killall'
 
 alias byes='exit'

+ 6 - 0
plugins/mercurial/mercurial.plugin.zsh

@@ -12,3 +12,9 @@ alias hgp='hg push'
 alias hgs='hg status'
 # this is the 'git commit --amend' equivalent
 alias hgca='hg qimport -r tip ; hg qrefresh -e ; hg qfinish tip'
+
+function hg_current_branch() {
+  if [ -d .hg ]; then
+    echo hg:$(hg branch)
+  fi
+}

文件差异内容过多而无法显示
+ 167 - 3
plugins/mvn/mvn.plugin.zsh


+ 44 - 0
plugins/nanoc/_nanoc

@@ -0,0 +1,44 @@
+#compdef nanoc
+#autoload
+
+# nanoc zsh completion - based on the homebrew zsh completion
+# requires the 'nanoc' gem to be installed
+
+local -a _1st_arguments
+_1st_arguments=(
+  'autocompile:start the autocompiler'
+  'compile:compile items of this site'
+  'create-item:create an item'
+  'create-layout:create a layout'
+  'create-site:create a site'
+  'deploy:deploy the compiled site'
+  'help:show help'
+  'prune:remove files not managed by nanoc from the output directory'
+  'show-data:show data in this site'
+  'show-plugins:show all available plugins'
+  'show-rules:describe the rules for each item'
+  'update:update the data stored by the data source to a newer version'
+  'validate-css:validate the site’s CSS'
+  'validate-html:validate the site’s HTML'
+  'validate-links:validate links in site'
+  'view:start the web server that serves static files'
+  'watch:start the watcher'
+)
+
+local expl
+local -a pkgs installed_pkgs
+
+_arguments \
+  '(--color)--color[enable color]' \
+  '(--debug)--debug[enable debugging]' \
+  '(--help)--help[show the help message and quit]' \
+  '(--no-color)--no-color[disable color]' \
+  '(--verbose)--verbose[make nanoc output more detailed]' \
+  '(--version)--version[show version information and quit]' \
+  '(--warn)--warn[enable warnings]' \
+  '*:: :->subcmds' && return 0
+
+if (( CURRENT == 1 )); then
+  _describe -t commands "nanoc subcommand" _1st_arguments
+  return
+fi

+ 9 - 0
plugins/nanoc/nanoc.plugin.zsh

@@ -0,0 +1,9 @@
+alias n='nanoc'
+alias na='nanoc autocompile'
+alias nco='nanoc compile'
+alias nci='nanoc create_item'
+alias ncl='nanoc create_layout'
+alias ncs='nanoc create_site'
+alias nd='nanoc deploy'
+alias nv='nanoc view'
+alias nw='nanoc watch'

+ 1 - 1
plugins/node/node.plugin.zsh

@@ -1,5 +1,5 @@
 # Open the node api for your current version to the optional section.
 # TODO: Make the section part easier to use.
 function node-docs {
-	open "http://nodejs.org/docs/$(node --version)/api/all.html#$1"
+	open "http://nodejs.org/docs/$(node --version)/api/all.html#all_$1"
 }

+ 60 - 3
plugins/osx/osx.plugin.zsh

@@ -2,10 +2,9 @@
 #          FILE:  osx.plugin.zsh
 #   DESCRIPTION:  oh-my-zsh plugin file.
 #        AUTHOR:  Sorin Ionescu (sorin.ionescu@gmail.com)
-#       VERSION:  1.0.1
+#       VERSION:  1.1.0
 # ------------------------------------------------------------------------------
 
-
 function tab() {
   local command="cd \\\"$PWD\\\""
   (( $# > 0 )) && command="${command}; $*"
@@ -35,9 +34,67 @@ EOF
           launch session "Default Session"
           set current_session to current session
           tell current_session
-            write text "${command}"
+            write text "${command}; clear;"
+          end tell
+        end tell
+      end tell
+EOF
+  }
+}
+
+function vsplit_tab() {
+  local command="cd \\\"$PWD\\\""
+  (( $# > 0 )) && command="${command}; $*"
+
+  the_app=$(
+    osascript 2>/dev/null <<EOF
+      tell application "System Events"
+        name of first item of (every process whose frontmost is true)
+      end tell
+EOF
+  )
+
+  [[ "$the_app" == 'iTerm' ]] && {
+    osascript 2>/dev/null <<EOF
+      tell application "iTerm" to activate
+
+      tell application "System Events"
+        tell process "iTerm"
+          tell menu item "Split Vertically With Current Profile" of menu "Shell" of menu bar item "Shell" of menu bar 1
+            click
+          end tell
+        end tell
+        keystroke "${command}; clear;"
+        keystroke return
+      end tell
+EOF
+  }
+}
+
+function split_tab() {
+  local command="cd \\\"$PWD\\\""
+  (( $# > 0 )) && command="${command}; $*"
+
+  the_app=$(
+    osascript 2>/dev/null <<EOF
+      tell application "System Events"
+        name of first item of (every process whose frontmost is true)
+      end tell
+EOF
+  )
+
+  [[ "$the_app" == 'iTerm' ]] && {
+    osascript 2>/dev/null <<EOF
+      tell application "iTerm" to activate
+
+      tell application "System Events"
+        tell process "iTerm"
+          tell menu item "Split Horizontally With Current Profile" of menu "Shell" of menu bar item "Shell" of menu bar 1
+            click
           end tell
         end tell
+        keystroke "${command}; clear;"
+        keystroke return
       end tell
 EOF
   }

+ 119 - 0
plugins/pass/_pass

@@ -0,0 +1,119 @@
+#compdef pass
+#autoload
+
+# Copyright (C) 2012:
+#    Johan Venant <jvenant@invicem.pro>
+#    Brian Mattern <rephorm@rephorm.com>
+#    Jason A. Donenfeld <Jason@zx2c4.com>.
+#    Santiago Borrazás <sanbor@gmail.com>
+# All Rights Reserved.
+# This file is licensed under the GPLv2+. Please see COPYING for more information.
+
+
+_pass () {
+	local cmd
+	if (( CURRENT > 2)); then
+		cmd=${words[2]}
+		# Set the context for the subcommand.
+		curcontext="${curcontext%:*:*}:pass-$cmd"
+		# Narrow the range of words we are looking at to exclude `pass'
+		(( CURRENT-- ))
+		shift words
+		# Run the completion for the subcommand
+		case "${cmd}" in
+			init)
+				_arguments : \
+					"-r[re-encrypt existing passwords]" \
+					"--reencrypt[re-encrypt existing passwords]"
+				_pass_complete_keys
+				;;
+			ls|list|edit)
+				_pass_complete_entries_with_subdirs
+				;;
+			insert)
+				_arguments : \
+					"-e[echo password to console]" \
+					"--echo[echo password to console]" \
+					"-m[multiline]" \
+					"--multiline[multiline]"
+				_pass_complete_entries_with_subdirs
+				;;
+			generate)
+				_arguments : \
+					"-n[don't include symbols in password]" \
+					"--no-symbols[don't include symbols in password]" \
+					"-c[copy password to the clipboard]" \
+					"--clip[copy password to the clipboard]"
+				_pass_complete_entries_with_subdirs
+				;;
+			rm)
+				_arguments : \
+					"-f[force deletion]" \
+					"--force[force deletion]" \
+					"-r[recursively delete]" \
+					"--recursive[recursively delete]"
+					_pass_complete_entries_with_subdirs
+				;;
+			git)
+				local -a subcommands
+				subcommands=(
+					"init:Initialize git repository"
+					"push:Push to remote repository"
+					"pull:Pull from remote repository"
+					"config:Show git config"
+					"log:Show git log"
+					"reflog:Show git reflog"
+				)
+				_describe -t commands 'pass git' subcommands
+				;;
+			show|*)
+				_pass_cmd_show
+				;;
+		esac
+	else
+		local -a subcommands
+		subcommands=(
+			"init:Initialize new password storage"
+			"ls:List passwords"
+			"show:Decrypt and print a password"
+			"insert:Insert a new password"
+			"generate:Generate a new password using pwgen"
+			"edit:Edit a password with \$EDITOR"
+			"rm:Remove the password"
+			"git:Call git on the password store"
+			"version:Output version information"
+			"help:Output help message"
+		)
+		_describe -t commands 'pass' subcommands
+		_arguments : \
+			"--version[Output version information]" \
+			"--help[Output help message]"
+		_pass_cmd_show
+	fi
+}
+
+_pass_cmd_show () {
+	_arguments : \
+		"-c[put it on the clipboard]" \
+		"--clip[put it on the clipboard]"
+	_pass_complete_entries
+}
+_pass_complete_entries_helper () {
+	local IFS=$'\n'
+	local prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}"
+	_values -C 'passwords' $(find "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print | sed -e "s#${prefix}.##" -e 's#\.gpg##' | sort)
+}
+
+_pass_complete_entries_with_subdirs () {
+	_pass_complete_entries_helper
+}
+
+_pass_complete_entries () {
+	_pass_complete_entries_helper -type f
+}
+
+_pass_complete_keys () {
+	local IFS=$'\n'
+	# Extract names and email addresses from gpg --list-keys
+	_values 'gpg keys' $(gpg2 --list-secret-keys --with-colons | cut -d : -f 10 | sort -u | sed '/^$/d')
+}

+ 149 - 0
plugins/per-directory-history/per-directory-history.plugin.zsh

@@ -0,0 +1,149 @@
+#!/usr/bin/env zsh
+#
+# This is a implementation of per directory history for zsh, some 
+# implementations of which exist in bash[1,2].  It also implements 
+# a per-directory-history-toggle-history function to change from using the 
+# directory history to using the global history.  In both cases the history is 
+# always saved to both the global history and the directory history, so the 
+# toggle state will not effect the saved histories.  Being able to switch 
+# between global and directory histories on the fly is a novel feature as far 
+# as I am aware.
+#
+#-------------------------------------------------------------------------------
+# Configuration
+#-------------------------------------------------------------------------------
+#
+# HISTORY_BASE a global variable that defines the base directory in which the 
+# directory histories are stored
+#
+#-------------------------------------------------------------------------------
+# History
+#-------------------------------------------------------------------------------
+#
+# The idea/inspiration for a per directory history is from Stewart MacArthur[1] 
+# and Dieter[2], the implementation idea is from Bart Schaefer on the the zsh 
+# mailing list[3].  The implementation is by Jim Hester in September 2012.
+#
+# [1]: http://www.compbiome.com/2010/07/bash-per-directory-bash-history.html
+# [2]: http://dieter.plaetinck.be/per_directory_bash
+# [3]: http://www.zsh.org/mla/users/1997/msg00226.html
+#
+################################################################################
+#
+# Copyright (c) 2012 Jim Hester
+#
+# This software is provided 'as-is', without any express or implied warranty.  
+# In no event will the authors be held liable for any damages arising from the 
+# use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose, 
+# including commercial applications, and to alter it and redistribute it 
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not claim 
+# that you wrote the original software. If you use this software in a product, 
+# an acknowledgment in the product documentation would be appreciated but is 
+# not required.
+#
+# 2. Altered source versions must be plainly marked as such, and must not be 
+# misrepresented as being the original software.
+#
+# 3. This notice may not be removed or altered from any source distribution..
+#
+################################################################################
+
+#-------------------------------------------------------------------------------
+# configuration, the base under which the directory histories are stored
+#-------------------------------------------------------------------------------
+
+[[ -z $HISTORY_BASE ]] && HISTORY_BASE="$HOME/.directory_history"
+
+#-------------------------------------------------------------------------------
+# toggle global/directory history used for searching - ctrl-G by default
+#-------------------------------------------------------------------------------
+
+function per-directory-history-toggle-history() {
+  if [[ $_per_directory_history_is_global == true ]]; then
+    _per-directory-history-set-directory-history
+    print "\nusing local history\n"
+  else
+    _per-directory-history-set-global-history
+    print "\nusing global history\n"
+  fi
+  zle .push-line
+  zle .accept-line
+}
+
+autoload per-directory-history-toggle-history
+zle -N per-directory-history-toggle-history
+bindkey '^G' per-directory-history-toggle-history
+
+#-------------------------------------------------------------------------------
+# implementation details
+#-------------------------------------------------------------------------------
+
+_per_directory_history_directory="$HISTORY_BASE${PWD:A}/history"
+
+function _per-directory-history-change-directory() {
+  _per_directory_history_directory="$HISTORY_BASE${PWD:A}/history"
+  mkdir -p ${_per_directory_history_directory:h}
+  if [[ $_per_directory_history_is_global == false ]]; then
+    #save to the global history
+    fc -AI $HISTFILE
+    #save history to previous file
+    local prev="$HISTORY_BASE${OLDPWD:A}/history"
+    mkdir -p ${prev:h}
+    fc -AI $prev
+
+    #discard previous directory's history
+    local original_histsize=$HISTSIZE
+    HISTSIZE=0
+    HISTSIZE=$original_histsize
+    
+    #read history in new file
+    if [[ -e $_per_directory_history_directory ]]; then
+      fc -R $_per_directory_history_directory
+    fi
+  fi
+}
+
+function _per-directory-history-addhistory() {
+  print -sr -- ${1%%$'\n'}
+  fc -p $_per_directory_history_directory
+}
+
+
+function _per-directory-history-set-directory-history() {
+  if [[ $_per_directory_history_is_global == true ]]; then
+    fc -AI $HISTFILE
+    local original_histsize=$HISTSIZE
+    HISTSIZE=0
+    HISTSIZE=$original_histsize
+    if [[ -e "$_per_directory_history_directory" ]]; then
+      fc -R "$_per_directory_history_directory"
+    fi
+  fi
+  _per_directory_history_is_global=false
+}
+function _per-directory-history-set-global-history() {
+  if [[ $_per_directory_history_is_global == false ]]; then
+    fc -AI $_per_directory_history_directory
+    local original_histsize=$HISTSIZE
+    HISTSIZE=0
+    HISTSIZE=$original_histsize
+    if [[ -e "$HISTFILE" ]]; then
+      fc -R "$HISTFILE"
+    fi
+  fi
+  _per_directory_history_is_global=true
+}
+
+
+#add functions to the exec list for chpwd and zshaddhistory
+chpwd_functions=(${chpwd_functions[@]} "_per-directory-history-change-directory")
+zshaddhistory_functions=(${zshaddhistory_functions[@]} "_per-directory-history-addhistory")
+
+#start in directory mode
+mkdir -p ${_per_directory_history_directory:h}
+_per_directory_history_is_global=true
+_per-directory-history-set-directory-history

+ 6 - 2
plugins/python/python.plugin.zsh

@@ -1,8 +1,12 @@
 # Find python file
 alias pyfind='find . -name "*.py"'
 
-# Remove python compiled byte-code
-alias pyclean='find . -type f -name "*.py[co]" -delete'
+# Remove python compiled byte-code in either current directory or in a
+# list of specified directories
+function pyclean() {
+    ZSH_PYCLEAN_PLACES=${*:-'.'}
+    find ${ZSH_PYCLEAN_PLACES} -type f -name "*.py[co]" -delete
+}
 
 # Grep among .py files
 alias pygrep='grep --include="*.py"'

+ 2 - 0
plugins/rails/rails.plugin.zsh

@@ -5,6 +5,8 @@ alias sp='ruby script/plugin'
 alias sr='ruby script/runner'
 alias ssp='ruby script/spec'
 alias rdbm='rake db:migrate'
+alias rdbtp='rake db:test:prepare'
+alias migrate='rake db:migrate && rake db:test:prepare'
 alias sc='ruby script/console'
 alias sd='ruby script/server --debugger'
 alias devlog='tail -f log/development.log'

+ 1 - 1
plugins/rbenv/rbenv.plugin.zsh

@@ -17,7 +17,7 @@ for rbenvdir in "${rbenvdirs[@]}" ; do
     FOUND_RBENV=1
     export RBENV_ROOT=$rbenvdir
     export PATH=${rbenvdir}/bin:$PATH
-    eval "$(rbenv init -)"
+    eval "$(rbenv init - zsh)"
 
     alias rubies="rbenv versions"
     alias gemsets="rbenv gemset list"

+ 42 - 0
plugins/rbfu/rbfu.plugin.zsh

@@ -0,0 +1,42 @@
+# Enables rbfu with --auto option, if available.
+#
+# Also provides a command to list all installed/available
+# rubies. To ensure compatibility with themes, creates the
+# rvm_prompt_info function to return the $RBFU_RUBY_VERSION
+# version.
+
+command -v rbfu &>/dev/null
+
+if [[ $? -eq 0 ]]; then
+  eval "$(rbfu --init --auto)"
+
+  # Internal: Print ruby version details, if it's currently
+  # active etc.
+  function _rbfu_rubies_print() {
+    local rb rb_out
+    rb=$(basename $1)
+    rb_out="$rb"
+    [[ -h $1 ]] && rb_out="$rb_out${fg[green]}@${reset_color}"
+    [[ "x$rb" == "x$2" ]] && rb_out="${fg[red]}$rb_out ${fg[red]}*${reset_color}"
+    echo $rb_out
+  }
+
+  # Public: Provide a list with all available rubies, this basically depends
+  # on `ls -1` and .rfbu/rubies. Highlights the currently active ruby version
+  # and aliases.
+  function rbfu-rubies() {
+    local rbfu_dir active_rb
+    rbfu_dir=$RBFU_RUBIES
+    active_rb=$RBFU_RUBY_VERSION
+    [[ -z "$rbfu_dir" ]] && rbfu_dir="${HOME}/.rbfu/rubies"
+    [[ -z "$active_rb" ]] && active_rb="system"
+    _rbfu_rubies_print "${rbfu_dir}/system" $active_rb
+    for rb in $(ls -1 $rbfu_dir); do
+      _rbfu_rubies_print "${rbfu_dir}/${rb}" $active_rb
+    done
+  }
+
+  # Public: Create rvm_prompt_info command for themes compatibility, unless
+  # it has already been defined.
+  [ ! -x rvm_prompt_info ] && function rvm_prompt_info() { echo "${RBFU_RUBY_VERSION:=system}" }
+fi

+ 4 - 0
plugins/rsync/rsync.plugin.zsh

@@ -0,0 +1,4 @@
+alias rsync-copy="rsync -av --progress -h"
+alias rsync-move="rsync -av --progress -h --remove-source-files"
+alias rsync-update="rsync -avu --progress -h"
+alias rsync-synchronize="rsync -avu --delete --progress -h"

+ 0 - 147
plugins/rvm/_rvm

@@ -1,147 +0,0 @@
-#compdef rvm
-
-local curcontext="$curcontext" state line cmds ret=1
-
-_arguments -C \
-	'(- 1 *)'{-v,--version}'[display version information]' \
-	'(-l|--level)'{-l,--level}'+[patch level to use with rvm use / install]:number' \
-	'(--prefix)--prefix[path for all rvm files (~/.rvm/), with trailing slash!]:path:_files' \
-	'(--bin)--bin[path for binaries to be placed (~/.rvm/bin/)]:path:_files' \
-	'(--source)--source[src directory to use (~/.rvm/src/)]:path:_files' \
-	'(--archives)--archives[directory for downladed files (~/.rvm/archives/)]:path:_files' \
-	'-S[Specify a script file to attempt to load and run (rubydo)]:file:_files' \
-	'-e[Execute code from the command line]:code' \
-	'(-G)-G[root gem path to use]:path:_files' \
-	'(--gems)--gems[Used to set the gems_flag, use with remove to remove gems]' \
-	'(--archive)--archive[Used to set the archive_flag, use with remove to remove archive]' \
-	'(--patch)--patch[With MRI Rubies you may specify one or more full paths to patches]' \
-	'(-C|--configure)'{-C,--configure}'=[custom configure options]' \
-	'(--nice)--nice[process niceness (for slow computers, default 0)]:number' \
-	'(--ree)--ree-options[Options passed directly to ree ./installer on the command line]:options' \
-	'(--head)--head[with update, updates rvm to git head version]' \
-	'(--rubygems)--rubygems[with update, updates rubygems for selected ruby]' \
-	'(--default)--default[with ruby select, sets a default ruby for new shells]' \
-	'(--debug)--debug[Toggle debug mode on for very verbose output]' \
-	'(--trace)--trace[Toggle trace mode on to see EVERYTHING rvm is doing]' \
-	'(--force)--force[Force install, removes old install & source before install]' \
-	'(--summary)--summary[Used with rubydo to print out a summary of the commands run]' \
-	'(--latest)--latest[with gemset --dump skips version strings for latest gem]' \
-	'(--gems)--gems[with uninstall/remove removes gems with the interpreter]' \
-	'(--docs)--docs[with install, attempt to generate ri after installation]' \
-	'(--reconfigure)--reconfigure[Force ./configure on install even if Makefile already exists]' \
-	'1: :->cmds' \
-	'*: :->args' && ret=0
-
-case $state in
-	cmds)
-		cmds=( 
-            "version:show the rvm version installed in rvm_path"
-            "use:setup current shell to use a specific ruby version"
-            "reload:reload rvm source itself (useful after changing rvm source)"
-            "implode:(seppuku) removes the rvm installation completely. This means everything in $rvm_path (~/.rvm)."
-            "update:upgrades rvm to the latest version."
-            "reset:remove current and stored default & system settings."
-            "info :show the *current* environment information for current ruby"
-            "current:print the *current* ruby version and the name of any gemset being used."
-            "debug:show info plus additional information for common issues"
-            "install:install one or many ruby versions"
-            "uninstall:uninstall one or many ruby versions, leaves their sources"
-            "remove:uninstall one or many ruby versions and remove their sources"
-            "migrate:Lets you migrate all gemsets from one ruby to another."
-            "upgrade:Lets you upgrade from one version of a ruby to another, including migrating your gemsets semi-automatically."
-            "wrapper:generates a set of wrapper executables for a given ruby with the specified ruby and gemset combination. Used under the hood for passenger support and the like."
-            "cleanup:Lets you remove stale source folders / archives and other miscellaneous data associated with rvm."
-            "repair:Lets you repair parts of your environment e.g. wrappers, env files and and similar files (e.g. general maintenance)."
-            "snapshot:Lets your backup / restore an rvm installation in a lightweight manner."
-            "disk-usage:Tells you how much disk space rvm install is using."
-            "tools:Provides general information about the ruby environment, primarily useful when scripting rvm."
-            "docs:Tools to make installing ri and rdoc documentation easier."
-            "rvmrc:Tools related to managing rvmrc trust and loading."
-            "exec:runs an arbitrary command as a set operation."
-            "ruby:runs a named ruby file against specified and/or all rubies"
-            "gem:runs a gem command using selected ruby's 'gem'"
-            "rake:runs a rake task against specified and/or all rubies"
-            "tests:runs 'rake test' across selected ruby versions"
-            "specs:runs 'rake spec' across selected ruby versions"
-            "monitor:Monitor cwd for testing, run rake {spec,test} on changes."
-            "gemset:gemsets: http://rvm.beginrescueend.com/gemsets/"
-            "rubygems:Switches the installed version of rubygems for the current ruby."
-            "gemdir:display the path to the current gem directory (GEM_HOME)."
-            "srcdir:display the path to rvm source directory (may be yanked)"
-            "fetch:Performs an archive / src fetch only of the selected ruby."
-            "list:show currently installed rubies, interactive output."
-            "package:Install a dependency package {readline,iconv,zlib,openssl}"
-            "notes:Display notes, with operating system specifics."
-            "export:Temporarily set an environment variable in the current shell."
-            "unexport:Undo changes made to the environment by 'rvm export'."
-        )
-		_describe -t commands 'rvm command' cmds && ret=0
-		;;
-	args)
-		case $line[1] in
-			(use|uninstall|remove|list)
-				_values -S , 'rubies' $(rvm list strings | sed -e 's/ruby-\([^) ]*\)-\([^) ]*\)/ruby-\1-\2 \1-\2 \1/g') default system && ret=0
-				;;
-			(install|fetch)
-				_values -S , 'rubies' $(rvm list known_strings) && ret=0
-				;;
-			gemset)
-				if (( CURRENT == 3 )); then
-					_values 'gemset_commands' \
-                        'import' \
-                        'export' \
-                        'create' \
-                        'copy' \
-                        'rename' \
-                        'empty' \
-                        'delete' \
-                        'name' \
-                        'dir' \
-                        'list' \
-                        'list_all' \
-                        'gemdir' \
-                        'install' \
-                        'pristine' \
-                        'clear' \
-                        'use' \
-                        'update' \
-                        'unpack' \
-                        'globalcache'
-				else
-					_values -S , 'gemsets' $(rvm gemset list | grep -v gemset 2>/dev/null)
-				fi
-				ret=0
-				;;
-			package)
-				if (( CURRENT == 3 )); then
-					_values 'package_commands' \
-                        'install' \
-                        'uninstall'  
-				else
-					_values 'packages' \
-                        'readline' \
-                        'iconv' \
-                        'curl' \
-                        'openssl' \
-                        'zlib' \
-                        'autoconf' \
-                        'ncurses' \
-                        'pkgconfig' \
-                        'gettext' \
-                        'glib' \
-                        'mono' \
-                        'llvm' \
-                        'libxml2' \
-                        'libxslt' \
-                        'libyaml'
-				fi
-				ret=0
-				;;
-			*)
-				(( ret )) && _message 'no more arguments'
-				;;
-		esac
-		;;
-esac
-
-return ret

+ 8 - 1
plugins/rvm/rvm.plugin.zsh

@@ -1,8 +1,10 @@
+fpath=($rvm_path/scripts/zsh/Completion $fpath)
+
 alias rubies='rvm list rubies'
 alias gemsets='rvm gemset list'
 
 local ruby18='ruby-1.8.7-p334'
-local ruby19='ruby-1.9.2-p180'
+local ruby19='ruby-1.9.3-p194'
 
 function rb18 {
 	if [ -z "$1" ]; then
@@ -42,3 +44,8 @@ function gems {
 		-Ee "s/$current_ruby@global/$fg[yellow]&$reset_color/g" \
 		-Ee "s/$current_ruby$current_gemset$/$fg[green]&$reset_color/g"
 }
+
+function _rvm_completion {
+  source $rvm_path"/scripts/zsh/Completion/_rvm"
+}
+compdef _rvm_completion rvm

+ 1 - 1
plugins/screen/screen.plugin.zsh

@@ -1,6 +1,6 @@
 # if using GNU screen, let the zsh tell screen what the title and hardstatus
 # of the tab window should be.
-if [[ $TERM == "screen" ]]; then
+if [[ "$TERM" == screen* ]]; then
   if [[ $_GET_PATH == '' ]]; then
     _GET_PATH='echo $PWD | sed "s/^\/Users\//~/;s/^\/home\//~/;s/^~$USER/~/"'
   fi

+ 1 - 3
plugins/sprunge/sprunge.plugin.zsh

@@ -57,8 +57,6 @@ sprunge() {
 	  fi
 	else
 	  echo Using input from a pipe or STDIN redirection... >&2
-	  while read -r line ; do
-		echo $line
-	  done | curl -F 'sprunge=<-' http://sprunge.us
+	  curl -F 'sprunge=<-' http://sprunge.us
 	fi
 }

+ 19 - 1
plugins/sublime/sublime.plugin.zsh

@@ -1,3 +1,21 @@
 # Sublime Text 2 Aliases
-alias st='/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'
+#unamestr = 'uname'
+
+local _sublime_darwin_subl=/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 & }
+	else
+		st_run() { nohup /usr/bin/sublime-text $@ > /dev/null & }
+	fi
+alias st=st_run
+elif  [[ $('uname') == 'Darwin' ]]; then
+	# Check if Sublime is installed in user's home application directory
+	if [[ -a $HOME/${_sublime_darwin_subl} ]]; then
+		alias st='$HOME/${_sublime_darwin_subl}'
+	else
+		alias st='${_sublime_darwin_subl}'
+	fi
+fi
 alias stt='st .'

+ 136 - 0
plugins/supervisor/_supervisorctl

@@ -0,0 +1,136 @@
+#compdef supervisorctl
+
+typeset -A opt_args
+local context state line
+
+_supervisorctl() {
+    _arguments -s -S \
+        {--configuration,-c}"[configuration file path (default /etc/supervisor.conf)]:FILENAME:_files" \
+        {--help,-h}"[print usage message and exit]:" \
+        {--interactive,-i}"[start an interactive shell after executing commands]" \
+        {--serverurl,-s}"[URL on which supervisord server is listening (default "http://localhost:9001").]" \
+        {--username,-u}"[username to use for authentication with server]:USERNAME:_users" \
+        {--password,-p}"[password to use for authentication with server]:PASSWORD:" \
+        {--history-file,-r}"[keep a readline history (if readline is available)]:FILENAME:_files" \
+        "*::supervisorctl commands:_supervisorctl_command"
+}
+
+(( $+functions[_supervisorctl_command] )) ||
+_supervisorctl_command() {
+    local cmd ret=1
+
+    (( $+supervisorctl_cmds )) || _supervisorctl_cmds=(
+        "add:Activates any updates in config for process/group" \
+        "avail:Display all configured processes" \
+        "clear:Clear process/multiple-process/all-process log files" \
+        "exit:Exit the supervisor shell." \
+        "fg:Connect to a process in foreground mode" \
+        "maintail:tail of supervisor main log file" \
+        "open:Connect to a remote supervisord process. (for UNIX domain socket, use unix:///socket/path)" \
+        "pid:Get the PID of supervisord." \
+        "quit:Exit the supervisor shell." \
+        "reload:Restart the remote supervisord." \
+        "remove:Removes process/group from active config" \
+        "reread:Reload the daemon's configuration files" \
+        "restart:Restart process or group." \
+        "shutdown:Shut the remote supervisord down." \
+        "start:Start process or groups." \
+        "status:Get process status info." \
+        "stop:Stop process or group." \
+        "tail:tail of process stdout" \
+        "update:Reload config and add/remove as necessary" \
+        "version:Show the version of the remote supervisord process" \
+        "help:Show help" \
+        )
+
+    if (( CURRENT == 1 )); then
+        _describe -t commands 'supervisorctl subcommand' _supervisorctl_cmds \
+            || compadd "$@" - ${(s.:.)${(j.:.)_supervisorctl_syns}}
+    else
+        local curcontext="$curcontext"
+
+        cmd="${${_supervisorctl_cmds[(r)$words[1]:*]%%:*}:-${(k)_supervisorctl_syns[(r)(*:|)$words[1](:*|)]}}"
+        if (( $#cmd )); then
+            curcontext="${curcontext%:*:*}:supervisorctl-${cmd}:"
+            _call_function ret _supervisorctl_$cmd || _message 'no more arguments'
+        else
+            _message "unknown supervisorctl command: $words[1]"
+        fi
+        return ret
+    fi
+}
+
+# get supervisor contoroll processes
+(( $+functions[_get_supervisor_procs] )) ||
+_get_supervisor_procs() {
+    local cache_policy
+    zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
+    if [[ -z "$cache_policy" ]]; then
+        zstyle ":completion:${curcontext}:" cache-policy _supervisor_procs_caching_policy
+    fi
+
+    if ( [[ ${+_supervisor_procs} -eq 0 ]] || _cache_invalid supervisor_procs ) \
+        && ! _retrieve_cache supervisor_procs; then
+
+        _supervisor_procs=(${${(f)"$(supervisorctl status >/dev/null 2>&1 | awk -F' ' '{print $1}')"}})
+        _store_cache supervisor_procs _supervisor_procs
+    fi
+
+    local expl
+    _wanted supervisor_procs expl 'supervisor processes' compadd -a _supervisor_procs
+}
+
+_supervisor_procs_caching_policy() {
+    local -a oldp
+    oldp=( "$1"(Nmw+1) )
+    (( $#oldp ))
+}
+
+(( $+functions[_supervisorctl_add] )) ||
+_supervisorctl_add() {
+    _arguments -s \
+        "--help[use help system]" \
+        "*::supervisorctl commands:_supervisorctl"
+}
+
+(( $+functions[_supervisorctl_help] )) ||
+_supervisorctl_help() {
+    _arguments -s \
+        "*:supervisorctl commands:_supervisorctl"
+}
+
+(( $+functions[_supervisorctl_maintail] )) ||
+_supervisorctl_maintail() {
+    _arguments -s \
+        '-f[Continuous tail of supervisor main log file (Ctrl-C to exit)]'
+}
+
+(( $+functions[_supervisorctl_start] )) ||
+_supervisorctl_start() {
+    # TODO: add 'all'
+    _arguments -s \
+        '*::supvervisor process:_get_supervisor_procs'
+}
+
+(( $+functions[_supervisorctl_status] )) ||
+_supervisorctl_status() {
+    _arguments \
+        '*::supvervisor process:_get_supervisor_procs'
+}
+
+(( $+functions[_supervisorctl_stop] )) ||
+_supervisorctl_stop() {
+    # TODO: add 'all'
+    _arguments -s \
+        '*::supvervisor process:_get_supervisor_procs'
+}
+
+(( $+functions[_supervisorctl_tail] )) ||
+_supervisorctl_tail() {
+    # TODO: add 'stderr'
+    _arguments -s \
+        '-f[Continuous tail of named process stdout Ctrl-C to exit.]' \
+        '*::supvervisor process:_get_supervisor_procs'
+}
+
+_supervisorctl "$@"

+ 32 - 0
plugins/supervisor/_supervisord

@@ -0,0 +1,32 @@
+#compdef supervisord
+
+typeset -A opt_args
+local context state line
+
+_arguments \
+    {--configuration,-c}"[configuration file]:FILENAME:_files" \
+    {--nodaemon,-n}"[run in the foreground (same as 'nodaemon true' in config file)]" \
+    {--help,-h}"[print this usage message and exit]:" \
+    {--user,-u}"[run supervisord as this user]:USER:_users" \
+    {--umask,-m}"[use this umask for daemon subprocess (default is 022)]" \
+    {--directory,-d}"[directory to chdir to when daemonized]" \
+    {--logfile,-l}"[use FILENAME as logfile path]:FILENAME:_files" \
+    {--logfile_maxbytes,-y}"[use BYTES to limit the max size of logfile]" \
+    {--logfile_backups,-z}"[number of backups to keep when max bytes reached]" \
+    {--loglevel,-e}"[use LEVEL as log level (debug,info,warn,error,critical)]:level:->levels" \
+    {--pidfile,-j}"[write a pid file for the daemon process to FILENAME]:FILENAME:_files" \
+    {--identifier,-i}"[identifier used for this instance of supervisord]" \
+    {--childlogdir,-q}"[the log directory for child process logs]:child log directory:_files -/" \
+    {--nocleanup,-k}"[prevent the process from performing cleanup (removal of old automatic child log files) at startup.]" \
+    {--minfds,-a}"[the minimum number of file descriptors for start success]" \
+    {--strip_ansi,-t}"[strip ansi escape codes from process output]" \
+    "--minprocs[the minimum number of processes available for start success]" \
+    "--profile_options[run supervisord under profiler and output results based on OPTIONS, which is a comma-sep'd list of 'cumulative', 'calls', and/or 'callers', e.g. 'cumulative,callers')]" \
+    "*::args:_gnu_generic"
+
+case $state in
+levels)
+    levels=("debug" "info" "warn" "error" "critical")
+    _describe -t levels 'supervisord levels' levels && return 0
+    ;;
+esac

+ 1 - 0
plugins/supervisor/supervisor.plugin.zsh

@@ -0,0 +1 @@
+# DECLARION: This plugin was created by hhatto. What I did is just making a portal from https://bitbucket.org/hhatto/zshcompfunc4supervisor.

+ 25 - 5
plugins/svn/svn.plugin.zsh

@@ -1,7 +1,15 @@
+
 function svn_prompt_info {
     if [ $(in_svn) ]; then
+        if [ "x$SVN_SHOW_BRANCH" = "xtrue" ]; then
+            unset SVN_SHOW_BRANCH
+            _DISPLAY=$(svn_get_branch_name)
+        else
+            _DISPLAY=$(svn_get_repo_name)
+        fi
         echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_PREFIX\
-$ZSH_THEME_REPO_NAME_COLOR$(svn_get_repo_name)$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR$(svn_dirty)$ZSH_PROMPT_BASE_COLOR"
+$ZSH_THEME_REPO_NAME_COLOR$_DISPLAY$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_SVN_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR$(svn_dirty)$ZSH_PROMPT_BASE_COLOR"
+        unset _DISPLAY
     fi
 }
 
@@ -15,11 +23,21 @@ function in_svn() {
 function svn_get_repo_name {
     if [ $(in_svn) ]; then
         svn info | sed -n 's/Repository\ Root:\ .*\///p' | read SVN_ROOT
-    
+
         svn info | sed -n "s/URL:\ .*$SVN_ROOT\///p"
     fi
 }
 
+function svn_get_branch_name {
+    _DISPLAY=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }')
+    if [ "x$_DISPLAY" = "x" ]; then
+        svn_get_repo_name
+    else
+        echo $_DISPLAY
+    fi
+    unset _DISPLAY
+}
+
 function svn_get_rev_nr {
     if [ $(in_svn) ]; then
         svn info 2> /dev/null | sed -n s/Revision:\ //p
@@ -28,10 +46,12 @@ function svn_get_rev_nr {
 
 function svn_dirty_choose {
     if [ $(in_svn) ]; then
-        s=$(svn status|grep -E '^\s*[ACDIM!?L]' 2>/dev/null)
-        if [ $s ]; then 
+        svn status 2> /dev/null | grep -Eq '^\s*[ACDIM!?L]'
+        if [ $pipestatus[-1] -eq 0 ]; then
+            # Grep exits with 0 when "One or more lines were selected", return "dirty".
             echo $1
-        else 
+        else
+            # Otherwise, no lines were found, or an error occurred. Return clean.
             echo $2
         fi
     fi

+ 13 - 0
plugins/symfony/symfony.plugin.zsh

@@ -0,0 +1,13 @@
+# symfony basic command completion
+
+_symfony_get_command_list () {
+    ./symfony | sed "1,/Available tasks/d" | awk 'BEGIN { cat=null; } /^[A-Za-z]+$/ { cat = $1; } /^  :[a-z]+/ { print cat $1; }'
+}
+
+_symfony () {
+  if [ -f symfony ]; then
+    compadd `_symfony_get_command_list`
+  fi
+}
+
+compdef _symfony symfony

+ 7 - 1
plugins/symfony2/symfony2.plugin.zsh

@@ -10,4 +10,10 @@ _symfony2 () {
   fi
 }
 
-compdef _symfony2 app/console
+compdef _symfony2 app/console
+compdef _symfony2 sf
+
+#Alias
+alias sf2='php app/console'
+alias sf2clear='php app/console cache:clear'
+

+ 11 - 0
plugins/systemd/systemd.plugin.zsh

@@ -0,0 +1,11 @@
+user_commands=(
+  list-units is-active status show help list-unit-files
+  is-enabled list-jobs show-environment)
+
+sudo_commands=(
+  start stop reload restart try-restart isolate kill
+  reset-failed enable disable reenable preset mask unmask
+  link load cancel set-environment unset-environment)
+
+for c in $user_commands; do; alias sc-$c="systemctl $c"; done
+for c in $sudo_commands; do; alias sc-$c="sudo systemctl $c"; done

+ 35 - 7
plugins/terminalapp/terminalapp.plugin.zsh

@@ -1,11 +1,39 @@
 # Set Apple Terminal.app resume directory
 # based on this answer: http://superuser.com/a/315029
+# 2012-10-26: (javageek) Changed code using the updated answer
 
-function chpwd {
-  local SEARCH=' '
-  local REPLACE='%20'
-  local PWD_URL="file://$HOSTNAME${PWD//$SEARCH/$REPLACE}"
-  printf '\e]7;%s\a' "$PWD_URL"
-}
+# Tell the terminal about the working directory whenever it changes.
+if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then
+  update_terminal_cwd() {
+        # Identify the directory using a "file:" scheme URL, including
+        # the host name to disambiguate local vs. remote paths.
 
-chpwd
+        # Percent-encode the pathname.
+        local URL_PATH=''
+        {
+            # Use LANG=C to process text byte-by-byte.
+            local i ch hexch LANG=C
+            for ((i = 1; i <= ${#PWD}; ++i)); do
+                ch="$PWD[i]"
+                if [[ "$ch" =~ [/._~A-Za-z0-9-] ]]; then
+                    URL_PATH+="$ch"
+                else
+                    hexch=$(printf "%02X" "'$ch")
+                    URL_PATH+="%$hexch"
+                fi
+            done
+        }
+
+        local PWD_URL="file://$HOST$URL_PATH"
+        #echo "$PWD_URL"        # testing
+        printf '\e]7;%s\a' "$PWD_URL"
+    }
+
+    # Register the function so it is called whenever the working
+    # directory changes.
+    autoload add-zsh-hook
+    add-zsh-hook chpwd update_terminal_cwd
+
+    # Tell the terminal about the initial directory.
+    update_terminal_cwd
+fi

+ 3 - 0
plugins/themes/_theme

@@ -0,0 +1,3 @@
+#compdef theme
+
+_arguments "1: :($(lstheme | tr "\n" " "))"

+ 24 - 0
plugins/themes/themes.plugin.zsh

@@ -0,0 +1,24 @@
+function theme
+{
+    if [ "$1" = "random" ]; then
+	themes=($ZSH/themes/*zsh-theme)
+	N=${#themes[@]}
+	((N=(RANDOM%N)+1))
+	RANDOM_THEME=${themes[$N]}
+	source "$RANDOM_THEME"
+	echo "[oh-my-zsh] Random theme '$RANDOM_THEME' loaded..."
+    else
+	if [ -f "$ZSH_CUSTOM/$1.zsh-theme" ]
+	then
+	    source "$ZSH_CUSTOM/$1.zsh-theme"
+	else
+	    source "$ZSH/themes/$1.zsh-theme"
+	fi
+    fi
+}
+
+function lstheme
+{
+    cd $ZSH/themes
+    ls *zsh-theme | sed 's,\.zsh-theme$,,'
+}

+ 36 - 0
plugins/urltools/urltools.plugin.zsh

@@ -0,0 +1,36 @@
+# URL Tools
+# Adds handy command line aliases useful for dealing with URLs
+#
+# Taken from:
+# http://ruslanspivak.com/2010/06/02/urlencode-and-urldecode-from-a-command-line/
+
+if [[ $(whence $URLTOOLS_METHOD) = "" ]]; then
+    URLTOOLS_METHOD=""
+fi
+
+if [[ $(whence node) != "" && ( "x$URLTOOLS_METHOD" = "x"  || "x$URLTOOLS_METHOD" = "xnode" ) ]]; then
+    alias urlencode='node -e "console.log(encodeURIComponent(process.argv[1]))"'
+    alias urldecode='node -e "console.log(decodeURIComponent(process.argv[1]))"'
+elif [[ $(whence python) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xpython" ) ]]; then
+    alias urlencode='python -c "import sys, urllib as ul; print ul.quote_plus(sys.argv[1])"'
+    alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"'
+elif [[ $(whence ruby) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xruby" ) ]]; then
+    alias urlencode='ruby -r cgi -e "puts CGI.escape(ARGV[0])"'
+    alias urldecode='ruby -r cgi -e "puts CGI.unescape(ARGV[0])"'
+elif [[ $(whence php) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xphp" ) ]]; then
+    alias urlencode='php -r "echo rawurlencode(\$argv[1]); echo \"\n\";"'
+    alias urldecode='php -r "echo rawurldecode(\$argv[1]); echo \"\\n\";"'
+elif [[ $(whence perl) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xperl" ) ]]; then
+    if perl -MURI::Encode -e 1&> /dev/null; then
+        alias urlencode='perl -MURI::Encode -ep "uri_encode($ARGV[0]);"'
+        alias urldecode='perl -MURI::Encode -ep "uri_decode($ARGV[0]);"'
+    elif perl -MURI::Escape -e 1 &> /dev/null; then
+        alias urlencode='perl -MURI::Escape -ep "uri_escape($ARGV[0]);"'
+        alias urldecode='perl -MURI::Escape -ep "uri_unescape($ARGV[0]);"'
+    else
+        alias urlencode="perl -e '\$new=\$ARGV[0]; \$new =~ s/([^A-Za-z0-9])/sprintf(\"%%%02X\", ord(\$1))/seg; print \"\$new\n\";'"
+        alias urldecode="perl -e '\$new=\$ARGV[0]; \$new =~ s/\%([A-Fa-f0-9]{2})/pack(\"C\", hex(\$1))/seg; print \"\$new\n\";'"
+    fi
+fi
+
+unset URLTOOLS_METHOD

+ 7 - 0
plugins/vagrant/_vagrant

@@ -46,6 +46,11 @@ __box_list ()
     _wanted application expl 'command' compadd $(command ls -1 $HOME/.vagrant/boxes 2>/dev/null| sed -e 's/ /\\ /g')
 }
 
+__vm_list ()
+{
+    _wanted application expl 'command' compadd $(command grep Vagrantfile -oe '^[^#]*\.vm\.define *:\([a-zA-Z0-9]\+\)' 2>/dev/null | cut -d: -f2)
+}
+
 __vagrant-box ()
 {
     local curcontext="$curcontext" state line
@@ -99,6 +104,8 @@ case $state in
       (box)
           __vagrant-box
       ;;
+      (up|provision|package|destroy|reload|ssh|halt|resume|status)
+	_arguments ':feature:__vm_list'
     esac
   ;;
 esac

+ 14 - 1
plugins/vi-mode/vi-mode.plugin.zsh

@@ -1,8 +1,21 @@
-function zle-line-init zle-keymap-select {
+# Ensures that $terminfo values are valid and updates editor information when
+# the keymap changes.
+function zle-keymap-select zle-line-init zle-line-finish {
+  # The terminal must be in application mode when ZLE is active for $terminfo
+  # values to be valid.
+  if (( ${+terminfo[smkx]} )); then
+    printf '%s' ${terminfo[smkx]}
+  fi
+  if (( ${+terminfo[rmkx]} )); then
+    printf '%s' ${terminfo[rmkx]}
+  fi
+
   zle reset-prompt
+  zle -R
 }
 
 zle -N zle-line-init
+zle -N zle-line-finish
 zle -N zle-keymap-select
 
 bindkey -v

+ 35 - 41
plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh

@@ -1,46 +1,40 @@
-WRAPPER_FOUND=0
-for wrapsource in "/usr/local/bin/virtualenvwrapper.sh" "/etc/bash_completion.d/virtualenvwrapper" ; do
-  if [[ -e $wrapsource ]] ; then
-    WRAPPER_FOUND=1
-    source $wrapsource
+wrapsource=`which virtualenvwrapper_lazy.sh`
 
-    if [[ ! $DISABLE_VENV_CD -eq 1 ]]; then
-      # Automatically activate Git projects' virtual environments based on the
-      # directory name of the project. Virtual environment name can be overridden
-      # by placing a .venv file in the project root with a virtualenv name in it
-      function workon_cwd {
-          # Check that this is a Git repo
-          PROJECT_ROOT=`git rev-parse --show-toplevel 2> /dev/null`
-          if (( $? == 0 )); then
-              # Check for virtualenv name override
-              ENV_NAME=`basename "$PROJECT_ROOT"`
-              if [[ -f "$PROJECT_ROOT/.venv" ]]; then
-                  ENV_NAME=`cat "$PROJECT_ROOT/.venv"`
-              fi
-              # Activate the environment only if it is not already active
-              if [[ "$VIRTUAL_ENV" != "$WORKON_HOME/$ENV_NAME" ]]; then
-                  if [[ -e "$WORKON_HOME/$ENV_NAME/bin/activate" ]]; then
-                      workon "$ENV_NAME" && export CD_VIRTUAL_ENV="$ENV_NAME"
-                  fi
-              fi
-          elif [ $CD_VIRTUAL_ENV ]; then
-              # We've just left the repo, deactivate the environment
-              # Note: this only happens if the virtualenv was activated automatically
-              deactivate && unset CD_VIRTUAL_ENV
-          fi
-          unset PROJECT_ROOT
-      }
+if [[ -f "$wrapsource" ]]; then
+  source $wrapsource
 
-      # New cd function that does the virtualenv magic
-      function cd {
-          builtin cd "$@" && workon_cwd
-      }
-    fi
+  if [[ ! $DISABLE_VENV_CD -eq 1 ]]; then
+    # Automatically activate Git projects' virtual environments based on the
+    # directory name of the project. Virtual environment name can be overridden
+    # by placing a .venv file in the project root with a virtualenv name in it
+    function workon_cwd {
+        # Check that this is a Git repo
+        PROJECT_ROOT=`git rev-parse --show-toplevel 2> /dev/null`
+        if (( $? == 0 )); then
+            # Check for virtualenv name override
+            ENV_NAME=`basename "$PROJECT_ROOT"`
+            if [[ -f "$PROJECT_ROOT/.venv" ]]; then
+                ENV_NAME=`cat "$PROJECT_ROOT/.venv"`
+            fi
+            # Activate the environment only if it is not already active
+            if [[ "$VIRTUAL_ENV" != "$WORKON_HOME/$ENV_NAME" ]]; then
+                if [[ -e "$WORKON_HOME/$ENV_NAME/bin/activate" ]]; then
+                    workon "$ENV_NAME" && export CD_VIRTUAL_ENV="$ENV_NAME"
+                fi
+            fi
+        elif [ $CD_VIRTUAL_ENV ]; then
+            # We've just left the repo, deactivate the environment
+            # Note: this only happens if the virtualenv was activated automatically
+            deactivate && unset CD_VIRTUAL_ENV
+        fi
+        unset PROJECT_ROOT
+    }
 
-    break
+    # New cd function that does the virtualenv magic
+    function cd {
+        builtin cd "$@" && workon_cwd
+    }
   fi
-done
-
-if [ $WRAPPER_FOUND -eq 0 ] ; then
-  print "zsh virtualenvwrapper plugin: Couldn't activate virtualenvwrapper. Please run \`pip install virtualenvwrapper\`."
+else
+  print "zsh virtualenvwrapper plugin: Cannot find virtualenvwrapper_lazy.sh. Please install with \`pip install virtualenvwrapper\`."
 fi

+ 43 - 0
plugins/zeus/README.md

@@ -0,0 +1,43 @@
+## zeus
+**Maintainer:** [b4mboo](https://github.com/b4mboo)
+
+* `zi` aliases `zeus init`
+* `zinit` aliases `zeus init`
+
+* `zs` aliases `zeus start`
+* `ztart` aliases `zeus start`
+
+* `zc` aliases `zeus console`
+* `zonsole` aliases `zeus console`
+
+* `zsr` aliases `zeus server`
+* `zerver` aliases `zeus server`
+
+* `zr` aliases `zeus rake`
+* `zake` aliases `zeus rake`
+
+* `zg` aliases `zeus generate`
+* `zenerate` aliases `zeus generate`
+
+* `zrn` aliases `zeus runner`
+* `zunner` aliases `zeus runner`
+
+* `zcu` aliases `zeus cucumber`
+* `zucumber` aliases `zeus cucumber`
+
+* `zspec` aliases `zeus rspec`
+
+* `zt` aliases `zeus test`
+* `zest` aliases `zeus test`
+
+* `zu` aliases `zeus test test/unit/*`
+* `zunits` aliases `zeus test test/unit/*`
+
+* `zf` aliases `zeus test test/functional/*`
+* `zunctional` aliases `zeus test test/functional/*`
+
+* `za` aliases `zeus test test/unit/*; zeus test test/functional/; zeus cucumber`
+* `zall` aliases `zeus test test/unit/*; zeus test test/functional/; zeus cucumber`
+
+* `zsw` aliases `rm .zeus.sock`
+* `zweep` aliases `rm .zeus.sock`

+ 61 - 0
plugins/zeus/zeus.plugin.zsh

@@ -0,0 +1,61 @@
+# Some aliases for zeus. (See: https://github.com/burke/zeus)
+# Zeus preloads your Rails environment and forks that process whenever
+# needed. This effectively speeds up Rails' boot process to under 1 sec.
+
+# Always use bundler.
+# Rails depends on bundler, so we can be pretty sure, that there are no
+# problems with this command. For all the other aliases I provided an
+# alternative, in case people have conflicts with other plugins (e.g. suse).
+alias zeus='bundle exec zeus'
+
+# Init
+alias zi='zeus init'
+alias zinit='zeus init'
+
+# Start
+alias zs='zeus start'
+alias ztart='zeus start'
+
+# Console
+alias zc='zeus console'
+alias zonsole='zeus console'
+
+# Server
+alias zsr='zeus server'
+alias zerver='zeus server'
+
+# Rake
+alias zr='zeus rake'
+alias zake='zeus rake'
+
+# Generate
+alias zg='zeus generate'
+alias zenerate='zeus generate'
+
+# Runner
+alias zrn='zeus runner'
+alias zunner='zeus runner'
+
+# Cucumber
+alias zcu='zeus cucumber'
+alias zucumber='zeus cucumber'
+
+# Rspec
+alias zspec='zeus rspec'
+
+# Test
+alias zt='zeus test'
+alias zest='zeus test'
+
+alias zu='zeus test test/unit/*'
+alias zunits='zeus test test/unit/*'
+
+alias zf='zeus test test/functional/*'
+alias zunctional='zeus test test/functional/*'
+
+alias za='zeus test test/unit/*; zeus test test/functional/; zeus cucumber'
+alias zall='zeus test test/unit/*; zeus test test/functional/; zeus cucumber'
+
+# Clean up crashed zeus instances.
+alias zsw='rm .zeus.sock'
+alias zweep='rm .zeus.sock'

+ 4 - 1
templates/zshrc.zsh-template

@@ -14,9 +14,12 @@ ZSH_THEME="robbyrussell"
 # Set to this to use case-sensitive completion
 # CASE_SENSITIVE="true"
 
-# Comment this out to disable weekly auto-update checks
+# Comment this out to disable bi-weekly auto-update checks
 # DISABLE_AUTO_UPDATE="true"
 
+# Uncomment to change how many often would you like to wait before auto-updates occur? (in days)
+# export UPDATE_ZSH_DAYS=13
+
 # Uncomment following line if you want to disable colors in ls
 # DISABLE_LS_COLORS="true"
 

+ 7 - 0
themes/3den.zsh-theme

@@ -0,0 +1,7 @@
+PROMPT=$'%{$fg[white]%}$(~/.rvm/bin/rvm-prompt) %{$fg_bold[cyan]%}%~%{$reset_color%}$(git_prompt_info) %{$fg[cyan]%}%D{[%I:%M:%S]}\
+%{$fg_bold[green]%}%n$%{$reset_color%} '
+
+ZSH_THEME_GIT_PROMPT_PREFIX=" %{$fg[white]%}("
+ZSH_THEME_GIT_PROMPT_SUFFIX=")%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="*"
+ZSH_THEME_GIT_PROMPT_CLEAN=""

+ 26 - 0
themes/adben.zsh-theme

@@ -0,0 +1,26 @@
+#!/usr/bin/env zsh
+local USER_HOST='%{$terminfo[bold]$fg[yellow]%}%n@%m%{$reset_color%}'
+local RETURN_CODE="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
+local GIT_BRANCH='%{$terminfo[bold]$fg[red]%}$(git_prompt_info)%{$reset_color%}'
+local CURRENT_DIR='%{$terminfo[bold]$fg[green]%} %~%{$reset_color%}'
+local RUBY_RVM='%{$fg[gray]%}‹$(rvm-prompt i v g)›%{$reset_color%}'
+local COMMAND_TIP='%{$terminfo[bold]$fg[blue]%}$(wget -qO - http://www.commandlinefu.com/commands/random/plaintext | sed 1d | sed '/^$/d' | sed 's/^/║/g')%{$reset_color%}'
+######### PROMPT #########
+PROMPT="%{$terminfo[bold]$fg[blue]%}╔═ %{$reset_color%}${USER_HOST} ${CURRENT_DIR} ${RUBY_RVM} ${GIT_BRANCH}
+${COMMAND_TIP}
+%{$terminfo[bold]$fg[blue]%}╚═ %{$reset_color%}%B%{$terminfo[bold]$fg[white]%}$%b%{$reset_color%} "
+RPS1='${RETURN_CODE}'
+RPROMPT='%{$fg[green]%}[%*]%{$reset_color%}'
+######### PROMPT #########
+########## GIT ###########
+ZSH_THEME_GIT_PROMPT_PREFIX="‹"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$GIT_PROMPT_INFO%}›"
+ZSH_THEME_GIT_PROMPT_DIRTY=" %{$GIT_DIRTY_COLOR%}✘"
+ZSH_THEME_GIT_PROMPT_CLEAN=" %{$GIT_CLEAN_COLOR%}✔"
+ZSH_THEME_GIT_PROMPT_ADDED="%{$FG[082]%}✚%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_MODIFIED="%{$FG[166]%}✹%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DELETED="%{$FG[160]%}✖%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_RENAMED="%{$FG[220]%}➜%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_UNMERGED="%{$FG[082]%}═%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$FG[190]%}✭%{$reset_color%}"
+########## GIT ###########

+ 36 - 0
themes/af-magic.zsh-theme

@@ -0,0 +1,36 @@
+# af-magic.zsh-theme
+#
+# Author: Andy Fleming
+# URL: http://andyfleming.com/
+# Repo: https://github.com/andyfleming/oh-my-zsh
+# Direct Link: https://github.com/andyfleming/oh-my-zsh/blob/master/themes/af-magic.zsh-theme
+#
+# Created on:		June 19, 2012
+# Last modified on:	June 20, 2012
+
+
+
+if [ $UID -eq 0 ]; then NCOLOR="red"; else NCOLOR="green"; fi
+local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})"
+
+# primary prompt
+PROMPT='$FG[237]------------------------------------------------------------%{$reset_color%}
+$FG[032]%~\
+$(git_prompt_info) \
+$FG[105]%(!.#.»)%{$reset_color%} '
+PROMPT2='%{$fg[red]%}\ %{$reset_color%}'
+RPS1='${return_code}'
+
+
+# color vars
+eval my_gray='$FG[237]'
+eval my_orange='$FG[214]'
+
+# right prompt
+RPROMPT='$my_gray%n@%m%{$reset_color%}%'
+
+# git settings
+ZSH_THEME_GIT_PROMPT_PREFIX="$FG[075](branch:"
+ZSH_THEME_GIT_PROMPT_CLEAN=""
+ZSH_THEME_GIT_PROMPT_DIRTY="$my_orange*%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="$FG[075])%{$reset_color%}"

+ 115 - 0
themes/agnoster.zsh-theme

@@ -0,0 +1,115 @@
+# vim:ft=zsh ts=2 sw=2 sts=2
+#
+# agnoster's Theme - https://gist.github.com/3712874
+# A Powerline-inspired theme for ZSH
+#
+# # README
+#
+# In order for this theme to render correctly, you will need a
+# [Powerline-patched font](https://gist.github.com/1595572).
+#
+# In addition, I recommend the
+# [Solarized theme](https://github.com/altercation/solarized/) and, if you're
+# using it on Mac OS X, [iTerm 2](http://www.iterm2.com/) over Terminal.app -
+# it has significantly better color fidelity.
+#
+# # Goals
+#
+# The aim of this theme is to only show you *relevant* information. Like most
+# prompts, it will only show git information when in a git working directory.
+# However, it goes a step further: everything from the current user and
+# hostname to whether the last call exited with an error to whether background
+# jobs are running in this shell will all be displayed automatically when
+# appropriate.
+
+### Segment drawing
+# A few utility functions to make it easy and re-usable to draw segmented prompts
+
+CURRENT_BG='NONE'
+SEGMENT_SEPARATOR='⮀'
+
+# Begin a segment
+# Takes two arguments, background and foreground. Both can be omitted,
+# rendering default background/foreground.
+prompt_segment() {
+  local bg fg
+  [[ -n $1 ]] && bg="%K{$1}" || bg="%k"
+  [[ -n $2 ]] && fg="%F{$2}" || fg="%f"
+  if [[ $CURRENT_BG != 'NONE' && $1 != $CURRENT_BG ]]; then
+    echo -n " %{$bg%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR%{$fg%} "
+  else
+    echo -n "%{$bg%}%{$fg%} "
+  fi
+  CURRENT_BG=$1
+  [[ -n $3 ]] && echo -n $3
+}
+
+# End the prompt, closing any open segments
+prompt_end() {
+  if [[ -n $CURRENT_BG ]]; then
+    echo -n " %{%k%F{$CURRENT_BG}%}$SEGMENT_SEPARATOR"
+  else
+    echo -n "%{%k%}"
+  fi
+  echo -n "%{%f%}"
+  CURRENT_BG=''
+}
+
+### Prompt components
+# Each component will draw itself, and hide itself if no information needs to be shown
+
+# Context: user@hostname (who am I and where am I)
+prompt_context() {
+  local user=`whoami`
+
+  if [[ "$user" != "$DEFAULT_USER" || -n "$SSH_CLIENT" ]]; then
+    prompt_segment black default "%(!.%{%F{yellow}%}.)$user@%m"
+  fi
+}
+
+# Git: branch/detached head, dirty status
+prompt_git() {
+  local ref dirty
+  if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
+    ZSH_THEME_GIT_PROMPT_DIRTY='±'
+    dirty=$(parse_git_dirty)
+    ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git show-ref --head -s --abbrev |head -n1 2> /dev/null)"
+    if [[ -n $dirty ]]; then
+      prompt_segment yellow black
+    else
+      prompt_segment green black
+    fi
+    echo -n "${ref/refs\/heads\//⭠ }$dirty"
+  fi
+}
+
+# Dir: current working directory
+prompt_dir() {
+  prompt_segment blue black '%~'
+}
+
+# Status:
+# - was there an error
+# - am I root
+# - are there background jobs?
+prompt_status() {
+  local symbols
+  symbols=()
+  [[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘"
+  [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡"
+  [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙"
+
+  [[ -n "$symbols" ]] && prompt_segment black default "$symbols"
+}
+
+## Main prompt
+build_prompt() {
+  RETVAL=$?
+  prompt_status
+  prompt_context
+  prompt_dir
+  prompt_git
+  prompt_end
+}
+
+PROMPT='%{%f%b%k%}$(build_prompt) '

+ 13 - 3
themes/blinks.zsh-theme

@@ -8,13 +8,23 @@ function _prompt_char() {
   fi
 }
 
+# This theme works with both the "dark" and "light" variants of the
+# Solarized color schema.  Set the SOLARIZED_THEME variable to one of
+# these two values to choose.  If you don't specify, we'll assume you're
+# using the "dark" variant.
+
+case ${SOLARIZED_THEME:-dark} in
+    light) bkg=white;;
+    *)     bkg=black;;
+esac
+
 ZSH_THEME_GIT_PROMPT_PREFIX=" [%{%B%F{blue}%}"
-ZSH_THEME_GIT_PROMPT_SUFFIX="%{%f%k%b%K{black}%B%F{green}%}]"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{%f%k%b%K{${bkg}}%B%F{green}%}]"
 ZSH_THEME_GIT_PROMPT_DIRTY=" %{%F{red}%}*%{%f%k%b%}"
 ZSH_THEME_GIT_PROMPT_CLEAN=""
 
 PROMPT='%{%f%k%b%}
-%{%K{black}%B%F{green}%}%n%{%B%F{blue}%}@%{%B%F{cyan}%}%m%{%B%F{green}%} %{%b%F{yellow}%K{black}%}%~%{%B%F{green}%}$(git_prompt_info)%E%{%f%k%b%}
-%{%K{black}%}$(_prompt_char)%{%K{black}%} %#%{%f%k%b%} '
+%{%K{${bkg}}%B%F{green}%}%n%{%B%F{blue}%}@%{%B%F{cyan}%}%m%{%B%F{green}%} %{%b%F{yellow}%K{${bkg}}%}%~%{%B%F{green}%}$(git_prompt_info)%E%{%f%k%b%}
+%{%K{${bkg}}%}$(_prompt_char)%{%K{${bkg}}%} %#%{%f%k%b%} '
 
 RPROMPT='!%{%B%F{cyan}%}%!%{%f%k%b%}'

+ 37 - 0
themes/candy-kingdom.zsh-theme

@@ -0,0 +1,37 @@
+# neuralsanwich.zsh-theme
+#
+# Author: Sean Jones
+# URL: http://www.neuralsandwich.com
+# Repo: 
+# Direct link:
+# Create:
+# Modified: 
+
+if [ "x$OH_MY_ZSH_HG" = "x" ]; then
+    OH_MY_ZSH_HG="hg"
+fi
+
+function hg_prompt_info {
+    $OH_MY_ZSH_HG prompt --angle-brackets "\
+< on %{$fg[magenta]%}<branch>%{$reset_color%}>\
+< at %{$fg[yellow]%}<tags|%{$reset_color%}, %{$fg[yellow]%}>%{$reset_color%}>\
+%{$fg[green]%}<status|modified|unknown><update>%{$reset_color%}<
+patches: <patches|join( → )|pre_applied(%{$fg[yellow]%})|post_applied(%{$reset_color%})|pre_unapplied(%{$fg_bold[black]%})|post_unapplied(%{$reset_color%})>>" 2>/dev/null
+}
+
+function box_name {
+    [ -f ~/.box-name ] && cat ~/.box-name || hostname -s
+}
+
+PROMPT='
+%{$fg[magenta]%}%n%{$reset_color%}@%{$fg[yellow]%}$(box_name)%{$reset_color%}:%{$fg_bold[green]%}${PWD/#$HOME/~}%{$reset_color%}$(hg_prompt_info)$(git_prompt_info)
+%(?,,%{${fg_bold[white]}%}[%?]%{$reset_color%} )$ '
+
+ZSH_THEME_GIT_PROMPT_PREFIX=" (%{$fg[magenta]%}branch: "
+ZSH_THEME_GIT_PROMPT_CLEAN=""
+ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[red]%}?"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[orange]%}!"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%})"
+
+local return_status="%{$fg[red]%}%(?..✘)%{$reset_color%}"
+RPROMPT='${return_status}$(battery_time_remaining) $(battery_pct_prompt)%{$reset_color%}'

+ 5 - 1
themes/cloud.zsh-theme

@@ -1,4 +1,8 @@
-PROMPT='%{$fg_bold[cyan]%}☁ %{$fg_bold[green]%}%p %{$fg[green]%}%c %{$fg_bold[cyan]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
+if [[ -z $ZSH_THEME_CLOUD_PREFIX ]]; then
+    ZSH_THEME_CLOUD_PREFIX='☁'
+fi
+
+PROMPT='%{$fg_bold[cyan]%}$ZSH_THEME_CLOUD_PREFIX %{$fg_bold[green]%}%p %{$fg[green]%}%c %{$fg_bold[cyan]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
 
 ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[green]%}[%{$fg[cyan]%}"
 ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"

+ 39 - 0
themes/fino-time.zsh-theme

@@ -0,0 +1,39 @@
+# Fino-time theme by Aexander Berezovsky (http://berezovsky.me) based on Fino by Max Masnick (http://max.masnick.me)
+
+# Use with a dark background and 256-color terminal!
+# Meant for people with RVM and git. Tested only on OS X 10.7.
+
+# You can set your computer name in the ~/.box-name file if you want.
+
+# Borrowing shamelessly from these oh-my-zsh themes:
+#   bira
+#   robbyrussell
+#
+# Also borrowing from http://stevelosh.com/blog/2010/02/my-extravagant-zsh-prompt/
+
+function virtualenv_info {
+    [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') '
+}
+
+function prompt_char {
+    git branch >/dev/null 2>/dev/null && echo '⠠⠵' && return
+    echo '○'
+}
+
+function box_name {
+    [ -f ~/.box-name ] && cat ~/.box-name || hostname -s
+}
+
+
+local rvm_ruby='‹$(rvm-prompt i v g)›%{$reset_color%}'
+local current_dir='${PWD/#$HOME/~}'
+local git_info='$(git_prompt_info)'
+
+
+PROMPT="╭─%{$FG[040]%}%n%{$reset_color%} %{$FG[239]%}at%{$reset_color%} %{$FG[033]%}$(box_name)%{$reset_color%} %{$FG[239]%}in%{$reset_color%} %{$terminfo[bold]$FG[226]%}${current_dir}%{$reset_color%}${git_info} %{$FG[239]%}using%{$FG[243]%} ${rvm_ruby} %D - %*
+╰─$(virtualenv_info)$(prompt_char) "
+
+ZSH_THEME_GIT_PROMPT_PREFIX=" %{$FG[239]%}on%{$reset_color%} %{$fg[255]%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$FG[202]%}✘✘✘"
+ZSH_THEME_GIT_PROMPT_CLEAN="%{$FG[040]%}✔"

+ 5 - 1
themes/fishy.zsh-theme

@@ -1,7 +1,11 @@
 # ZSH Theme emulating the Fish shell's default prompt.
 
+_fishy_collapsed_wd() {
+  echo $(pwd | perl -pe "s|^$HOME|~|g; s|/([^/])[^/]*(?=/)|/\$1|g")
+}
+
 local user_color='green'; [ $UID -eq 0 ] && user_color='red'
-PROMPT='%n@%m %{$fg[$user_color]%}%~%{$reset_color%}%(!.#.>) '
+PROMPT='%n@%m %{$fg[$user_color]%}$(_fishy_collapsed_wd)%{$reset_color%}%(!.#.>) '
 PROMPT2='%{$fg[red]%}\ %{$reset_color%}'
 
 local return_status="%{$fg_bold[red]%}%(?..%?)%{$reset_color%}"

+ 14 - 2
themes/frisk.zsh-theme

@@ -1,10 +1,22 @@
 PROMPT=$'
-%{$fg[blue]%}%/%{$reset_color%} $(git_prompt_info)%{$fg[white]%}[%n@%m]%{$reset_color%} %{$fg[white]%}[%T]%{$reset_color%}
+%{$fg[blue]%}%/%{$reset_color%} $(git_prompt_info)$(bzr_prompt_info)%{$fg[white]%}[%n@%m]%{$reset_color%} %{$fg[white]%}[%T]%{$reset_color%}
 %{$fg_bold[black]%}>%{$reset_color%} '
 
 PROMPT2="%{$fg_blod[black]%}%_> %{$reset_color%}"
 
-ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[green]%}["
+GIT_CB="git::"
+ZSH_THEME_SCM_PROMPT_PREFIX="%{$fg[green]%}["
+ZSH_THEME_GIT_PROMPT_PREFIX=$ZSH_THEME_SCM_PROMPT_PREFIX$GIT_CB
 ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%} "
 ZSH_THEME_GIT_PROMPT_DIRTY=" %{$fg[red]%}*%{$fg[green]%}"
 ZSH_THEME_GIT_PROMPT_CLEAN=""
+
+## Bazaar integration
+bzr_prompt_info() {
+	BZR_CB=`bzr nick 2> /dev/null | grep -v "ERROR" | cut -d ":" -f2 | awk -F / '{print "bzr::"$1}'`
+	if [ -n "$BZR_CB" ]; then
+		BZR_DIRTY=""
+		[[ -n `bzr status` ]] && BZR_DIRTY="%{$fg[red]%} *%{$reset_color%}"
+		echo "$ZSH_THEME_SCM_PROMPT_PREFIX$BZR_CB$BZR_DIRTY$ZSH_THEME_GIT_PROMPT_SUFFIX"
+	fi
+}

+ 12 - 0
themes/frontcube.zsh-theme

@@ -0,0 +1,12 @@
+local rvm="%{$fg[green]%}[$(rvm-prompt i v g)]%{$reset_color%}"
+
+PROMPT='
+%{$fg_bold[gray]%}%~%{$fg_bold[blue]%}%{$fg_bold[blue]%} % %{$reset_color%}
+%{$fg[green]%}➞  %{$reset_color%'
+
+RPROMPT='$(git_prompt_info) $(rvm)'
+
+ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}[git:"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}] %{$fg[red]%}✖ %{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%}] %{$fg[green]%}✔%{$reset_color%}"

+ 5 - 1
themes/gentoo.zsh-theme

@@ -1,4 +1,8 @@
-PROMPT='%(!.%{$fg_bold[red]%}.%{$fg_bold[green]%}%n@)%m %{$fg_bold[blue]%}%(!.%1~.%~) $(git_prompt_info)%#%{$reset_color%} '
+function prompt_char {
+	if [ $UID -eq 0 ]; then echo "#"; else echo $; fi
+}
+
+PROMPT='%(!.%{$fg_bold[red]%}.%{$fg_bold[green]%}%n@)%m %{$fg_bold[blue]%}%(!.%1~.%~) $(git_prompt_info)%_$(prompt_char)%{$reset_color%} '
 
 ZSH_THEME_GIT_PROMPT_PREFIX="("
 ZSH_THEME_GIT_PROMPT_SUFFIX=") "

+ 24 - 0
themes/intheloop.zsh-theme

@@ -0,0 +1,24 @@
+# ZSH theme by James Smith (http://loopj.com)
+# A multiline prompt with username, hostname, full path, return status, git branch, git dirty status, git remote status
+
+local return_status="%{$fg[red]%}%(?..⏎)%{$reset_color%}"
+
+local host_color="green"
+if [ -n "$SSH_CLIENT" ]; then
+  local host_color="red"
+fi
+
+PROMPT='
+%{$fg_bold[grey]%}[%{$reset_color%}%{$fg_bold[${host_color}]%}%n@%m%{$reset_color%}%{$fg_bold[grey]%}]%{$reset_color%} %{$fg_bold[blue]%}%10c%{$reset_color%} $(git_prompt_info) $(git_remote_status)
+%{$fg_bold[cyan]%}❯%{$reset_color%} '
+
+
+RPROMPT='${return_status}%{$reset_color%}'
+
+ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[grey]%}(%{$fg[red]%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[grey]%}) %{$fg[yellow]%}⚡%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[grey]%})"
+ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE="%{$fg_bold[magenta]%}↓%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE="%{$fg_bold[magenta]%}↑%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE="%{$fg_bold[magenta]%}↕%{$reset_color%}"

+ 13 - 6
themes/jnrowe.zsh-theme

@@ -2,15 +2,14 @@ autoload -U add-zsh-hook
 autoload -Uz vcs_info
 
 zstyle ':vcs_info:*' actionformats \
-    '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
-zstyle ':vcs_info:*' formats \
-    '%F{2}%s%F{7}:%F{2}(%F{1}%b%F{2})%f '
+       '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
+zstyle ':vcs_info:*' formats '%F{2}%s%F{7}:%F{2}(%F{1}%b%F{2})%f '
 zstyle ':vcs_info:(sv[nk]|bzr):*' branchformat '%b%F{1}:%F{3}%r'
 zstyle ':vcs_info:*' enable git
 
-add-zsh-hook precmd prompt_jnrowe_precmd
+add-zsh-hook precmd prompt_vcs
 
-prompt_jnrowe_precmd () {
+prompt_vcs () {
     vcs_info
 
     if [ "${vcs_info_msg_0_}" = "" ]; then
@@ -24,8 +23,16 @@ prompt_jnrowe_precmd () {
     fi
 }
 
+function {
+    if [[ -n "$SSH_CLIENT" ]]; then
+        PROMPT_HOST=" ($HOST)"
+    else
+        PROMPT_HOST=''
+    fi
+}
+
 local ret_status="%(?:%{$fg_bold[green]%}Ξ:%{$fg_bold[red]%}%S↑%s%?)"
 
-PROMPT='${ret_status}%{$fg_bold[green]%}%p %{$fg_bold[yellow]%}%2~ ${vcs_info_msg_0_}${dir_status}%{$reset_color%} '
+PROMPT='${ret_status}%{$fg[blue]%}${PROMPT_HOST}%{$fg_bold[green]%}%p %{$fg_bold[yellow]%}%2~ ${vcs_info_msg_0_}${dir_status}%{$reset_color%} '
 
 #  vim: set ft=zsh ts=4 sw=4 et:

+ 2 - 0
themes/jonathan.zsh-theme

@@ -1,3 +1,5 @@
+functions rbenv_prompt_info >& /dev/null || rbenv_prompt_info(){}
+
 function theme_precmd {
     local TERMWIDTH
     (( TERMWIDTH = ${COLUMNS} - 1 ))

+ 34 - 0
themes/junkfood.zsh-theme

@@ -0,0 +1,34 @@
+# ------------------------------------------------------------------------
+# Tyler Cipriani 
+# oh-my-zsh theme
+# Totally ripped off Dallas theme
+# ------------------------------------------------------------------------
+
+# Grab the current date (%W) and time (%t):
+JUNKFOOD_TIME_="%{$fg_bold[red]%}#%{$fg_bold[white]%}( %{$fg_bold[yellow]%}%W%{$reset_color%}@%{$fg_bold[white]%}%t )( %{$reset_color%}"
+
+# Grab the current machine name 
+JUNKFOOD_MACHINE_="%{$fg_bold[blue]%}%m%{$fg[white]%} ):%{$reset_color%}"
+
+# Grab the current username 
+JUNKFOOD_CURRENT_USER_="%{$fg_bold[green]%}%n%{$reset_color%}"
+
+# Grab the current filepath, use shortcuts: ~/Desktop
+# Append the current git branch, if in a git repository: ~aw@master
+JUNKFOOD_LOCA_="%{$fg[cyan]%}%~\$(git_prompt_info)%{$reset_color%}"
+
+# For the git prompt, use a white @ and blue text for the branch name
+ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[white]%}@%{$fg_bold[white]%}"
+
+# Close it all off by resetting the color and styles.
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
+
+# Do nothing if the branch is clean (no changes).
+ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}✔"
+
+# Add 3 cyan ✗s if this branch is diiirrrty! Dirty branch!
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg_bold[red]%}✗✗✗"
+
+# Put it all together!
+PROMPT="$JUNKFOOD_TIME_$JUNKFOOD_CURRENT_USER_@$JUNKFOOD_MACHINE_$JUNKFOOD_LOCA_
+   "

+ 6 - 0
themes/kafeitu.zsh-theme

@@ -0,0 +1,6 @@
+PROMPT='%{$fg_bold[red]%}➜ %{$fg_bold[green]%}%n%{$fg[cyan]%}@%{$fg_bold[green]%}%m %{$fg_bold[green]%}%p %{$fg[cyan]%}%~ %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'
+
+ZSH_THEME_GIT_PROMPT_PREFIX="git:(%{$fg[red]%}"
+ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗%{$reset_color%}"
+ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"

+ 0 - 0
themes/minimal.zsh-theme


部分文件因为文件数量过多而无法显示