diff options
Diffstat (limited to 'plugins')
51 files changed, 4354 insertions, 215 deletions
| diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index 294dc5354..ae92a0b4c 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/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 +} diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh index 6f0edb062..fdce3a246 100644 --- a/plugins/autojump/autojump.plugin.zsh +++ b/plugins/autojump/autojump.plugin.zsh @@ -3,7 +3,9 @@ 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 /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 diff --git a/plugins/battery/battery.plugin.zsh b/plugins/battery/battery.plugin.zsh index bc75c5cf9..9f404088a 100644 --- a/plugins/battery/battery.plugin.zsh +++ b/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) -eq "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) -eq "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 diff --git a/plugins/bundler/bundler.plugin.zsh b/plugins/bundler/bundler.plugin.zsh index 39b76ecdf..2305c4979 100644 --- a/plugins/bundler/bundler.plugin.zsh +++ b/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 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)  ## Functions diff --git a/plugins/cap/cap.plugin.zsh b/plugins/cap/cap.plugin.zsh deleted file mode 100644 index 8336182d5..000000000 --- a/plugins/cap/cap.plugin.zsh +++ /dev/null @@ -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 diff --git a/plugins/capistrano/_capistrano b/plugins/capistrano/_capistrano new file mode 100644 index 000000000..cf6b50c7f --- /dev/null +++ b/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 diff --git a/plugins/coffee/_coffee b/plugins/coffee/_coffee new file mode 100644 index 000000000..5c8eb9a08 --- /dev/null +++ b/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 diff --git a/plugins/colemak/colemak-less b/plugins/colemak/colemak-less new file mode 100644 index 000000000..e4ca4facd --- /dev/null +++ b/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 diff --git a/plugins/colemak/colemak.plugin.zsh b/plugins/colemak/colemak.plugin.zsh new file mode 100644 index 000000000..34d42c280 --- /dev/null +++ b/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 diff --git a/plugins/command-not-found/command-not-found.plugin.zsh b/plugins/command-not-found/command-not-found.plugin.zsh index 5ab03d5a9..567da1b45 100644 --- a/plugins/command-not-found/command-not-found.plugin.zsh +++ b/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 diff --git a/plugins/composer/composer.plugin.zsh b/plugins/composer/composer.plugin.zsh new file mode 100644 index 000000000..c9b762d07 --- /dev/null +++ b/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'
\ No newline at end of file diff --git a/plugins/cp/cp.plugin.zsh b/plugins/cp/cp.plugin.zsh new file mode 100644 index 000000000..7355a9990 --- /dev/null +++ b/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 --" diff --git a/plugins/debian/debian.plugin.zsh b/plugins/debian/debian.plugin.zsh index 39d3ef36a..3f5cf2051 100644 --- a/plugins/debian/debian.plugin.zsh +++ b/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 @@ -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) \ diff --git a/plugins/forklift/forklift.plugin.zsh b/plugins/forklift/forklift.plugin.zsh new file mode 100644 index 000000000..056069d36 --- /dev/null +++ b/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 +} diff --git a/plugins/git-flow/git-flow.plugin.zsh b/plugins/git-flow/git-flow.plugin.zsh index d9d288b8e..4afb85b8b 100644 --- a/plugins/git-flow/git-flow.plugin.zsh +++ b/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' diff --git a/plugins/git-hubflow/git-hubflow.plugin.zsh b/plugins/git-hubflow/git-hubflow.plugin.zsh new file mode 100644 index 000000000..a09f88391 --- /dev/null +++ b/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' diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index d3d3f702a..0a19e0c1c 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -5,7 +5,7 @@ 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 @@ -38,6 +38,14 @@ 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' + +# 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' diff --git a/plugins/gitfast/_git b/plugins/gitfast/_git new file mode 100644 index 000000000..45775021f --- /dev/null +++ b/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 diff --git a/plugins/gitfast/git-completion.bash b/plugins/gitfast/git-completion.bash new file mode 100644 index 000000000..be800e09b --- /dev/null +++ b/plugins/gitfast/git-completion.bash @@ -0,0 +1,2483 @@ +#!bash +# +# bash/zsh completion support for core Git. +# +# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org> +# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). +# Distributed under the GNU General Public License, version 2.0. +# +# The contained completion routines provide support for completing: +# +#    *) local and remote branch names +#    *) local and remote tag names +#    *) .git/remotes file names +#    *) git 'subcommands' +#    *) tree paths within 'ref:path/to/file' expressions +#    *) common --long-options +# +# To use these routines: +# +#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh). +#    2) Add the following line to your .bashrc/.zshrc: +#        source ~/.git-completion.sh +#    3) Consider changing your PS1 to also show the current branch, +#       see git-prompt.sh for details. + +if [[ -n ${ZSH_VERSION-} ]]; then +	autoload -U +X bashcompinit && bashcompinit +fi + +case "$COMP_WORDBREAKS" in +*:*) : great ;; +*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:" +esac + +# __gitdir accepts 0 or 1 arguments (i.e., location) +# returns location of .git repo +__gitdir () +{ +	# Note: this function is duplicated in git-prompt.sh +	# When updating it, make sure you update the other one to match. +	if [ -z "${1-}" ]; then +		if [ -n "${__git_dir-}" ]; then +			echo "$__git_dir" +		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 +} + +__gitcomp_1 () +{ +	local c IFS=$' \t\n' +	for c in $1; do +		c="$c$2" +		case $c in +		--*=*|*.) ;; +		*) c="$c " ;; +		esac +		printf '%s\n' "$c" +	done +} + +# The following function is based on code from: +# +#   bash_completion - programmable completion functions for bash 3.2+ +# +#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org> +#             © 2009-2010, Bash Completion Maintainers +#                     <bash-completion-devel@lists.alioth.debian.org> +# +#   This program is free software; you can redistribute it and/or modify +#   it under the terms of the GNU General Public License as published by +#   the Free Software Foundation; either version 2, or (at your option) +#   any later version. +# +#   This program is distributed in the hope that it will be useful, +#   but WITHOUT ANY WARRANTY; without even the implied warranty of +#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#   GNU General Public License for more details. +# +#   You should have received a copy of the GNU General Public License +#   along with this program; if not, write to the Free Software Foundation, +#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +#   The latest version of this software can be obtained here: +# +#   http://bash-completion.alioth.debian.org/ +# +#   RELEASE: 2.x + +# This function can be used to access a tokenized list of words +# on the command line: +# +#	__git_reassemble_comp_words_by_ref '=:' +#	if test "${words_[cword_-1]}" = -w +#	then +#		... +#	fi +# +# The argument should be a collection of characters from the list of +# word completion separators (COMP_WORDBREAKS) to treat as ordinary +# characters. +# +# This is roughly equivalent to going back in time and setting +# COMP_WORDBREAKS to exclude those characters.  The intent is to +# make option types like --date=<type> and <rev>:<path> easy to +# recognize by treating each shell word as a single token. +# +# It is best not to set COMP_WORDBREAKS directly because the value is +# shared with other completion scripts.  By the time the completion +# function gets called, COMP_WORDS has already been populated so local +# changes to COMP_WORDBREAKS have no effect. +# +# Output: words_, cword_, cur_. + +__git_reassemble_comp_words_by_ref() +{ +	local exclude i j first +	# Which word separators to exclude? +	exclude="${1//[^$COMP_WORDBREAKS]}" +	cword_=$COMP_CWORD +	if [ -z "$exclude" ]; then +		words_=("${COMP_WORDS[@]}") +		return +	fi +	# List of word completion separators has shrunk; +	# re-assemble words to complete. +	for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do +		# Append each nonempty word consisting of just +		# word separator characters to the current word. +		first=t +		while +			[ $i -gt 0 ] && +			[ -n "${COMP_WORDS[$i]}" ] && +			# word consists of excluded word separators +			[ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ] +		do +			# Attach to the previous token, +			# unless the previous token is the command name. +			if [ $j -ge 2 ] && [ -n "$first" ]; then +				((j--)) +			fi +			first= +			words_[$j]=${words_[j]}${COMP_WORDS[i]} +			if [ $i = $COMP_CWORD ]; then +				cword_=$j +			fi +			if (($i < ${#COMP_WORDS[@]} - 1)); then +				((i++)) +			else +				# Done. +				return +			fi +		done +		words_[$j]=${words_[j]}${COMP_WORDS[i]} +		if [ $i = $COMP_CWORD ]; then +			cword_=$j +		fi +	done +} + +if ! type _get_comp_words_by_ref >/dev/null 2>&1; then +if [[ -z ${ZSH_VERSION:+set} ]]; then +_get_comp_words_by_ref () +{ +	local exclude cur_ words_ cword_ +	if [ "$1" = "-n" ]; then +		exclude=$2 +		shift 2 +	fi +	__git_reassemble_comp_words_by_ref "$exclude" +	cur_=${words_[cword_]} +	while [ $# -gt 0 ]; do +		case "$1" in +		cur) +			cur=$cur_ +			;; +		prev) +			prev=${words_[$cword_-1]} +			;; +		words) +			words=("${words_[@]}") +			;; +		cword) +			cword=$cword_ +			;; +		esac +		shift +	done +} +else +_get_comp_words_by_ref () +{ +	while [ $# -gt 0 ]; do +		case "$1" in +		cur) +			cur=${COMP_WORDS[COMP_CWORD]} +			;; +		prev) +			prev=${COMP_WORDS[COMP_CWORD-1]} +			;; +		words) +			words=("${COMP_WORDS[@]}") +			;; +		cword) +			cword=$COMP_CWORD +			;; +		-n) +			# assume COMP_WORDBREAKS is already set sanely +			shift +			;; +		esac +		shift +	done +} +fi +fi + +# Generates completion reply with compgen, appending a space to possible +# completion words, if necessary. +# It accepts 1 to 4 arguments: +# 1: List of possible completion words. +# 2: A prefix to be added to each possible completion word (optional). +# 3: Generate possible completion matches for this word (optional). +# 4: A suffix to be appended to each possible completion word (optional). +__gitcomp () +{ +	local cur_="${3-$cur}" + +	case "$cur_" in +	--*=) +		COMPREPLY=() +		;; +	*) +		local IFS=$'\n' +		COMPREPLY=($(compgen -P "${2-}" \ +			-W "$(__gitcomp_1 "${1-}" "${4-}")" \ +			-- "$cur_")) +		;; +	esac +} + +# Generates completion reply with compgen from newline-separated possible +# completion words by appending a space to all of them. +# It accepts 1 to 4 arguments: +# 1: List of possible completion words, separated by a single newline. +# 2: A prefix to be added to each possible completion word (optional). +# 3: Generate possible completion matches for this word (optional). +# 4: A suffix to be appended to each possible completion word instead of +#    the default space (optional).  If specified but empty, nothing is +#    appended. +__gitcomp_nl () +{ +	local IFS=$'\n' +	COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}")) +} + +__git_heads () +{ +	local dir="$(__gitdir)" +	if [ -d "$dir" ]; then +		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ +			refs/heads +		return +	fi +} + +__git_tags () +{ +	local dir="$(__gitdir)" +	if [ -d "$dir" ]; then +		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \ +			refs/tags +		return +	fi +} + +# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments +# presence of 2nd argument means use the guess heuristic employed +# by checkout for tracking branches +__git_refs () +{ +	local i hash dir="$(__gitdir "${1-}")" track="${2-}" +	local format refs +	if [ -d "$dir" ]; then +		case "$cur" in +		refs|refs/*) +			format="refname" +			refs="${cur%/*}" +			track="" +			;; +		*) +			for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do +				if [ -e "$dir/$i" ]; then echo $i; fi +			done +			format="refname:short" +			refs="refs/tags refs/heads refs/remotes" +			;; +		esac +		git --git-dir="$dir" for-each-ref --format="%($format)" \ +			$refs +		if [ -n "$track" ]; then +			# employ the heuristic used by git checkout +			# Try to find a remote branch that matches the completion word +			# but only output if the branch name is unique +			local ref entry +			git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \ +				"refs/remotes/" | \ +			while read -r entry; do +				eval "$entry" +				ref="${ref#*/}" +				if [[ "$ref" == "$cur"* ]]; then +					echo "$ref" +				fi +			done | uniq -u +		fi +		return +	fi +	case "$cur" in +	refs|refs/*) +		git ls-remote "$dir" "$cur*" 2>/dev/null | \ +		while read -r hash i; do +			case "$i" in +			*^{}) ;; +			*) echo "$i" ;; +			esac +		done +		;; +	*) +		git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \ +		while read -r hash i; do +			case "$i" in +			*^{}) ;; +			refs/*) echo "${i#refs/*/}" ;; +			*) echo "$i" ;; +			esac +		done +		;; +	esac +} + +# __git_refs2 requires 1 argument (to pass to __git_refs) +__git_refs2 () +{ +	local i +	for i in $(__git_refs "$1"); do +		echo "$i:$i" +	done +} + +# __git_refs_remotes requires 1 argument (to pass to ls-remote) +__git_refs_remotes () +{ +	local i hash +	git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \ +	while read -r hash i; do +		echo "$i:refs/remotes/$1/${i#refs/heads/}" +	done +} + +__git_remotes () +{ +	local i IFS=$'\n' d="$(__gitdir)" +	test -d "$d/remotes" && ls -1 "$d/remotes" +	for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do +		i="${i#remote.}" +		echo "${i/.url*/}" +	done +} + +__git_list_merge_strategies () +{ +	git merge -s help 2>&1 | +	sed -n -e '/[Aa]vailable strategies are: /,/^$/{ +		s/\.$// +		s/.*:// +		s/^[ 	]*// +		s/[ 	]*$// +		p +	}' +} + +__git_merge_strategies= +# 'git merge -s help' (and thus detection of the merge strategy +# list) fails, unfortunately, if run outside of any git working +# tree.  __git_merge_strategies is set to the empty string in +# that case, and the detection will be repeated the next time it +# is needed. +__git_compute_merge_strategies () +{ +	test -n "$__git_merge_strategies" || +	__git_merge_strategies=$(__git_list_merge_strategies) +} + +__git_complete_revlist_file () +{ +	local pfx ls ref cur_="$cur" +	case "$cur_" in +	*..?*:*) +		return +		;; +	?*:*) +		ref="${cur_%%:*}" +		cur_="${cur_#*:}" +		case "$cur_" in +		?*/*) +			pfx="${cur_%/*}" +			cur_="${cur_##*/}" +			ls="$ref:$pfx" +			pfx="$pfx/" +			;; +		*) +			ls="$ref" +			;; +		esac + +		case "$COMP_WORDBREAKS" in +		*:*) : great ;; +		*)   pfx="$ref:$pfx" ;; +		esac + +		__gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \ +				| sed '/^100... blob /{ +				           s,^.*	,, +				           s,$, , +				       } +				       /^120000 blob /{ +				           s,^.*	,, +				           s,$, , +				       } +				       /^040000 tree /{ +				           s,^.*	,, +				           s,$,/, +				       } +				       s/^.*	//')" \ +			"$pfx" "$cur_" "" +		;; +	*...*) +		pfx="${cur_%...*}..." +		cur_="${cur_#*...}" +		__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" +		;; +	*..*) +		pfx="${cur_%..*}.." +		cur_="${cur_#*..}" +		__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" +		;; +	*) +		__gitcomp_nl "$(__git_refs)" +		;; +	esac +} + + +__git_complete_file () +{ +	__git_complete_revlist_file +} + +__git_complete_revlist () +{ +	__git_complete_revlist_file +} + +__git_complete_remote_or_refspec () +{ +	local cur_="$cur" cmd="${words[1]}" +	local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0 +	if [ "$cmd" = "remote" ]; then +		((c++)) +	fi +	while [ $c -lt $cword ]; do +		i="${words[c]}" +		case "$i" in +		--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;; +		--all) +			case "$cmd" in +			push) no_complete_refspec=1 ;; +			fetch) +				COMPREPLY=() +				return +				;; +			*) ;; +			esac +			;; +		-*) ;; +		*) remote="$i"; break ;; +		esac +		((c++)) +	done +	if [ -z "$remote" ]; then +		__gitcomp_nl "$(__git_remotes)" +		return +	fi +	if [ $no_complete_refspec = 1 ]; then +		COMPREPLY=() +		return +	fi +	[ "$remote" = "." ] && remote= +	case "$cur_" in +	*:*) +		case "$COMP_WORDBREAKS" in +		*:*) : great ;; +		*)   pfx="${cur_%%:*}:" ;; +		esac +		cur_="${cur_#*:}" +		lhs=0 +		;; +	+*) +		pfx="+" +		cur_="${cur_#+}" +		;; +	esac +	case "$cmd" in +	fetch) +		if [ $lhs = 1 ]; then +			__gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_" +		else +			__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" +		fi +		;; +	pull|remote) +		if [ $lhs = 1 ]; then +			__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" +		else +			__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" +		fi +		;; +	push) +		if [ $lhs = 1 ]; then +			__gitcomp_nl "$(__git_refs)" "$pfx" "$cur_" +		else +			__gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_" +		fi +		;; +	esac +} + +__git_complete_strategy () +{ +	__git_compute_merge_strategies +	case "$prev" in +	-s|--strategy) +		__gitcomp "$__git_merge_strategies" +		return 0 +	esac +	case "$cur" in +	--strategy=*) +		__gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}" +		return 0 +		;; +	esac +	return 1 +} + +__git_list_all_commands () +{ +	local i IFS=" "$'\n' +	for i in $(git help -a|egrep '^  [a-zA-Z0-9]') +	do +		case $i in +		*--*)             : helper pattern;; +		*) echo $i;; +		esac +	done +} + +__git_all_commands= +__git_compute_all_commands () +{ +	test -n "$__git_all_commands" || +	__git_all_commands=$(__git_list_all_commands) +} + +__git_list_porcelain_commands () +{ +	local i IFS=" "$'\n' +	__git_compute_all_commands +	for i in "help" $__git_all_commands +	do +		case $i in +		*--*)             : helper pattern;; +		applymbox)        : ask gittus;; +		applypatch)       : ask gittus;; +		archimport)       : import;; +		cat-file)         : plumbing;; +		check-attr)       : plumbing;; +		check-ref-format) : plumbing;; +		checkout-index)   : plumbing;; +		commit-tree)      : plumbing;; +		count-objects)    : infrequent;; +		credential-cache) : credentials helper;; +		credential-store) : credentials helper;; +		cvsexportcommit)  : export;; +		cvsimport)        : import;; +		cvsserver)        : daemon;; +		daemon)           : daemon;; +		diff-files)       : plumbing;; +		diff-index)       : plumbing;; +		diff-tree)        : plumbing;; +		fast-import)      : import;; +		fast-export)      : export;; +		fsck-objects)     : plumbing;; +		fetch-pack)       : plumbing;; +		fmt-merge-msg)    : plumbing;; +		for-each-ref)     : plumbing;; +		hash-object)      : plumbing;; +		http-*)           : transport;; +		index-pack)       : plumbing;; +		init-db)          : deprecated;; +		local-fetch)      : plumbing;; +		lost-found)       : infrequent;; +		ls-files)         : plumbing;; +		ls-remote)        : plumbing;; +		ls-tree)          : plumbing;; +		mailinfo)         : plumbing;; +		mailsplit)        : plumbing;; +		merge-*)          : plumbing;; +		mktree)           : plumbing;; +		mktag)            : plumbing;; +		pack-objects)     : plumbing;; +		pack-redundant)   : plumbing;; +		pack-refs)        : plumbing;; +		parse-remote)     : plumbing;; +		patch-id)         : plumbing;; +		peek-remote)      : plumbing;; +		prune)            : plumbing;; +		prune-packed)     : plumbing;; +		quiltimport)      : import;; +		read-tree)        : plumbing;; +		receive-pack)     : plumbing;; +		remote-*)         : transport;; +		repo-config)      : deprecated;; +		rerere)           : plumbing;; +		rev-list)         : plumbing;; +		rev-parse)        : plumbing;; +		runstatus)        : plumbing;; +		sh-setup)         : internal;; +		shell)            : daemon;; +		show-ref)         : plumbing;; +		send-pack)        : plumbing;; +		show-index)       : plumbing;; +		ssh-*)            : transport;; +		stripspace)       : plumbing;; +		symbolic-ref)     : plumbing;; +		tar-tree)         : deprecated;; +		unpack-file)      : plumbing;; +		unpack-objects)   : plumbing;; +		update-index)     : plumbing;; +		update-ref)       : plumbing;; +		update-server-info) : daemon;; +		upload-archive)   : plumbing;; +		upload-pack)      : plumbing;; +		write-tree)       : plumbing;; +		var)              : infrequent;; +		verify-pack)      : infrequent;; +		verify-tag)       : plumbing;; +		*) echo $i;; +		esac +	done +} + +__git_porcelain_commands= +__git_compute_porcelain_commands () +{ +	__git_compute_all_commands +	test -n "$__git_porcelain_commands" || +	__git_porcelain_commands=$(__git_list_porcelain_commands) +} + +__git_pretty_aliases () +{ +	local i IFS=$'\n' +	for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do +		case "$i" in +		pretty.*) +			i="${i#pretty.}" +			echo "${i/ */}" +			;; +		esac +	done +} + +__git_aliases () +{ +	local i IFS=$'\n' +	for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do +		case "$i" in +		alias.*) +			i="${i#alias.}" +			echo "${i/ */}" +			;; +		esac +	done +} + +# __git_aliased_command requires 1 argument +__git_aliased_command () +{ +	local word cmdline=$(git --git-dir="$(__gitdir)" \ +		config --get "alias.$1") +	for word in $cmdline; do +		case "$word" in +		\!gitk|gitk) +			echo "gitk" +			return +			;; +		\!*)	: shell command alias ;; +		-*)	: option ;; +		*=*)	: setting env ;; +		git)	: git itself ;; +		*) +			echo "$word" +			return +		esac +	done +} + +# __git_find_on_cmdline requires 1 argument +__git_find_on_cmdline () +{ +	local word subcommand c=1 +	while [ $c -lt $cword ]; do +		word="${words[c]}" +		for subcommand in $1; do +			if [ "$subcommand" = "$word" ]; then +				echo "$subcommand" +				return +			fi +		done +		((c++)) +	done +} + +__git_has_doubledash () +{ +	local c=1 +	while [ $c -lt $cword ]; do +		if [ "--" = "${words[c]}" ]; then +			return 0 +		fi +		((c++)) +	done +	return 1 +} + +__git_whitespacelist="nowarn warn error error-all fix" + +_git_am () +{ +	local dir="$(__gitdir)" +	if [ -d "$dir"/rebase-apply ]; then +		__gitcomp "--skip --continue --resolved --abort" +		return +	fi +	case "$cur" in +	--whitespace=*) +		__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" +		return +		;; +	--*) +		__gitcomp " +			--3way --committer-date-is-author-date --ignore-date +			--ignore-whitespace --ignore-space-change +			--interactive --keep --no-utf8 --signoff --utf8 +			--whitespace= --scissors +			" +		return +	esac +	COMPREPLY=() +} + +_git_apply () +{ +	case "$cur" in +	--whitespace=*) +		__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" +		return +		;; +	--*) +		__gitcomp " +			--stat --numstat --summary --check --index +			--cached --index-info --reverse --reject --unidiff-zero +			--apply --no-add --exclude= +			--ignore-whitespace --ignore-space-change +			--whitespace= --inaccurate-eof --verbose +			" +		return +	esac +	COMPREPLY=() +} + +_git_add () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp " +			--interactive --refresh --patch --update --dry-run +			--ignore-errors --intent-to-add +			" +		return +	esac +	COMPREPLY=() +} + +_git_archive () +{ +	case "$cur" in +	--format=*) +		__gitcomp "$(git archive --list)" "" "${cur##--format=}" +		return +		;; +	--remote=*) +		__gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}" +		return +		;; +	--*) +		__gitcomp " +			--format= --list --verbose +			--prefix= --remote= --exec= +			" +		return +		;; +	esac +	__git_complete_file +} + +_git_bisect () +{ +	__git_has_doubledash && return + +	local subcommands="start bad good skip reset visualize replay log run" +	local subcommand="$(__git_find_on_cmdline "$subcommands")" +	if [ -z "$subcommand" ]; then +		if [ -f "$(__gitdir)"/BISECT_START ]; then +			__gitcomp "$subcommands" +		else +			__gitcomp "replay start" +		fi +		return +	fi + +	case "$subcommand" in +	bad|good|reset|skip|start) +		__gitcomp_nl "$(__git_refs)" +		;; +	*) +		COMPREPLY=() +		;; +	esac +} + +_git_branch () +{ +	local i c=1 only_local_ref="n" has_r="n" + +	while [ $c -lt $cword ]; do +		i="${words[c]}" +		case "$i" in +		-d|-m)	only_local_ref="y" ;; +		-r)	has_r="y" ;; +		esac +		((c++)) +	done + +	case "$cur" in +	--set-upstream-to=*) +		__gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}" +		;; +	--*) +		__gitcomp " +			--color --no-color --verbose --abbrev= --no-abbrev +			--track --no-track --contains --merged --no-merged +			--set-upstream-to= --edit-description --list +			--unset-upstream +			" +		;; +	*) +		if [ $only_local_ref = "y" -a $has_r = "n" ]; then +			__gitcomp_nl "$(__git_heads)" +		else +			__gitcomp_nl "$(__git_refs)" +		fi +		;; +	esac +} + +_git_bundle () +{ +	local cmd="${words[2]}" +	case "$cword" in +	2) +		__gitcomp "create list-heads verify unbundle" +		;; +	3) +		# looking for a file +		;; +	*) +		case "$cmd" in +			create) +				__git_complete_revlist +			;; +		esac +		;; +	esac +} + +_git_checkout () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--conflict=*) +		__gitcomp "diff3 merge" "" "${cur##--conflict=}" +		;; +	--*) +		__gitcomp " +			--quiet --ours --theirs --track --no-track --merge +			--conflict= --orphan --patch +			" +		;; +	*) +		# check if --track, --no-track, or --no-guess was specified +		# if so, disable DWIM mode +		local flags="--track --no-track --no-guess" track=1 +		if [ -n "$(__git_find_on_cmdline "$flags")" ]; then +			track='' +		fi +		__gitcomp_nl "$(__git_refs '' $track)" +		;; +	esac +} + +_git_cherry () +{ +	__gitcomp "$(__git_refs)" +} + +_git_cherry_pick () +{ +	case "$cur" in +	--*) +		__gitcomp "--edit --no-commit" +		;; +	*) +		__gitcomp_nl "$(__git_refs)" +		;; +	esac +} + +_git_clean () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp "--dry-run --quiet" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_clone () +{ +	case "$cur" in +	--*) +		__gitcomp " +			--local +			--no-hardlinks +			--shared +			--reference +			--quiet +			--no-checkout +			--bare +			--mirror +			--origin +			--upload-pack +			--template= +			--depth +			" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_commit () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--cleanup=*) +		__gitcomp "default strip verbatim whitespace +			" "" "${cur##--cleanup=}" +		return +		;; +	--reuse-message=*|--reedit-message=*|\ +	--fixup=*|--squash=*) +		__gitcomp_nl "$(__git_refs)" "" "${cur#*=}" +		return +		;; +	--untracked-files=*) +		__gitcomp "all no normal" "" "${cur##--untracked-files=}" +		return +		;; +	--*) +		__gitcomp " +			--all --author= --signoff --verify --no-verify +			--edit --no-edit +			--amend --include --only --interactive +			--dry-run --reuse-message= --reedit-message= +			--reset-author --file= --message= --template= +			--cleanup= --untracked-files --untracked-files= +			--verbose --quiet --fixup= --squash= +			" +		return +	esac +	COMPREPLY=() +} + +_git_describe () +{ +	case "$cur" in +	--*) +		__gitcomp " +			--all --tags --contains --abbrev= --candidates= +			--exact-match --debug --long --match --always +			" +		return +	esac +	__gitcomp_nl "$(__git_refs)" +} + +__git_diff_common_options="--stat --numstat --shortstat --summary +			--patch-with-stat --name-only --name-status --color +			--no-color --color-words --no-renames --check +			--full-index --binary --abbrev --diff-filter= +			--find-copies-harder +			--text --ignore-space-at-eol --ignore-space-change +			--ignore-all-space --exit-code --quiet --ext-diff +			--no-ext-diff +			--no-prefix --src-prefix= --dst-prefix= +			--inter-hunk-context= +			--patience +			--raw +			--dirstat --dirstat= --dirstat-by-file +			--dirstat-by-file= --cumulative +" + +_git_diff () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex +			--base --ours --theirs --no-index +			$__git_diff_common_options +			" +		return +		;; +	esac +	__git_complete_revlist_file +} + +__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff +			tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare +" + +_git_difftool () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--tool=*) +		__gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}" +		return +		;; +	--*) +		__gitcomp "--cached --staged --pickaxe-all --pickaxe-regex +			--base --ours --theirs +			--no-renames --diff-filter= --find-copies-harder +			--relative --ignore-submodules +			--tool=" +		return +		;; +	esac +	__git_complete_file +} + +__git_fetch_options=" +	--quiet --verbose --append --upload-pack --force --keep --depth= +	--tags --no-tags --all --prune --dry-run +" + +_git_fetch () +{ +	case "$cur" in +	--*) +		__gitcomp "$__git_fetch_options" +		return +		;; +	esac +	__git_complete_remote_or_refspec +} + +_git_format_patch () +{ +	case "$cur" in +	--thread=*) +		__gitcomp " +			deep shallow +			" "" "${cur##--thread=}" +		return +		;; +	--*) +		__gitcomp " +			--stdout --attach --no-attach --thread --thread= +			--output-directory +			--numbered --start-number +			--numbered-files +			--keep-subject +			--signoff --signature --no-signature +			--in-reply-to= --cc= +			--full-index --binary +			--not --all +			--cover-letter +			--no-prefix --src-prefix= --dst-prefix= +			--inline --suffix= --ignore-if-in-upstream +			--subject-prefix= +			" +		return +		;; +	esac +	__git_complete_revlist +} + +_git_fsck () +{ +	case "$cur" in +	--*) +		__gitcomp " +			--tags --root --unreachable --cache --no-reflogs --full +			--strict --verbose --lost-found +			" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_gc () +{ +	case "$cur" in +	--*) +		__gitcomp "--prune --aggressive" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_gitk () +{ +	_gitk +} + +__git_match_ctag() { +	awk "/^${1////\\/}/ { print \$1 }" "$2" +} + +_git_grep () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp " +			--cached +			--text --ignore-case --word-regexp --invert-match +			--full-name --line-number +			--extended-regexp --basic-regexp --fixed-strings +			--perl-regexp +			--files-with-matches --name-only +			--files-without-match +			--max-depth +			--count +			--and --or --not --all-match +			" +		return +		;; +	esac + +	case "$cword,$prev" in +	2,*|*,-*) +		if test -r tags; then +			__gitcomp_nl "$(__git_match_ctag "$cur" tags)" +			return +		fi +		;; +	esac + +	__gitcomp_nl "$(__git_refs)" +} + +_git_help () +{ +	case "$cur" in +	--*) +		__gitcomp "--all --info --man --web" +		return +		;; +	esac +	__git_compute_all_commands +	__gitcomp "$__git_all_commands $(__git_aliases) +		attributes cli core-tutorial cvs-migration +		diffcore gitk glossary hooks ignore modules +		namespaces repository-layout tutorial tutorial-2 +		workflows +		" +} + +_git_init () +{ +	case "$cur" in +	--shared=*) +		__gitcomp " +			false true umask group all world everybody +			" "" "${cur##--shared=}" +		return +		;; +	--*) +		__gitcomp "--quiet --bare --template= --shared --shared=" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_ls_files () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp "--cached --deleted --modified --others --ignored +			--stage --directory --no-empty-directory --unmerged +			--killed --exclude= --exclude-from= +			--exclude-per-directory= --exclude-standard +			--error-unmatch --with-tree= --full-name +			--abbrev --ignored --exclude-per-directory +			" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_ls_remote () +{ +	__gitcomp_nl "$(__git_remotes)" +} + +_git_ls_tree () +{ +	__git_complete_file +} + +# Options that go well for log, shortlog and gitk +__git_log_common_options=" +	--not --all +	--branches --tags --remotes +	--first-parent --merges --no-merges +	--max-count= +	--max-age= --since= --after= +	--min-age= --until= --before= +	--min-parents= --max-parents= +	--no-min-parents --no-max-parents +" +# Options that go well for log and gitk (not shortlog) +__git_log_gitk_options=" +	--dense --sparse --full-history +	--simplify-merges --simplify-by-decoration +	--left-right --notes --no-notes +" +# Options that go well for log and shortlog (not gitk) +__git_log_shortlog_options=" +	--author= --committer= --grep= +	--all-match +" + +__git_log_pretty_formats="oneline short medium full fuller email raw format:" +__git_log_date_formats="relative iso8601 rfc2822 short local default raw" + +_git_log () +{ +	__git_has_doubledash && return + +	local g="$(git rev-parse --git-dir 2>/dev/null)" +	local merge="" +	if [ -f "$g/MERGE_HEAD" ]; then +		merge="--merge" +	fi +	case "$cur" in +	--pretty=*|--format=*) +		__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) +			" "" "${cur#*=}" +		return +		;; +	--date=*) +		__gitcomp "$__git_log_date_formats" "" "${cur##--date=}" +		return +		;; +	--decorate=*) +		__gitcomp "long short" "" "${cur##--decorate=}" +		return +		;; +	--*) +		__gitcomp " +			$__git_log_common_options +			$__git_log_shortlog_options +			$__git_log_gitk_options +			--root --topo-order --date-order --reverse +			--follow --full-diff +			--abbrev-commit --abbrev= +			--relative-date --date= +			--pretty= --format= --oneline +			--cherry-pick +			--graph +			--decorate --decorate= +			--walk-reflogs +			--parents --children +			$merge +			$__git_diff_common_options +			--pickaxe-all --pickaxe-regex +			" +		return +		;; +	esac +	__git_complete_revlist +} + +__git_merge_options=" +	--no-commit --no-stat --log --no-log --squash --strategy +	--commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit +" + +_git_merge () +{ +	__git_complete_strategy && return + +	case "$cur" in +	--*) +		__gitcomp "$__git_merge_options" +		return +	esac +	__gitcomp_nl "$(__git_refs)" +} + +_git_mergetool () +{ +	case "$cur" in +	--tool=*) +		__gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}" +		return +		;; +	--*) +		__gitcomp "--tool=" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_merge_base () +{ +	__gitcomp_nl "$(__git_refs)" +} + +_git_mv () +{ +	case "$cur" in +	--*) +		__gitcomp "--dry-run" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_name_rev () +{ +	__gitcomp "--tags --all --stdin" +} + +_git_notes () +{ +	local subcommands='add append copy edit list prune remove show' +	local subcommand="$(__git_find_on_cmdline "$subcommands")" + +	case "$subcommand,$cur" in +	,--*) +		__gitcomp '--ref' +		;; +	,*) +		case "$prev" in +		--ref) +			__gitcomp_nl "$(__git_refs)" +			;; +		*) +			__gitcomp "$subcommands --ref" +			;; +		esac +		;; +	add,--reuse-message=*|append,--reuse-message=*|\ +	add,--reedit-message=*|append,--reedit-message=*) +		__gitcomp_nl "$(__git_refs)" "" "${cur#*=}" +		;; +	add,--*|append,--*) +		__gitcomp '--file= --message= --reedit-message= +				--reuse-message=' +		;; +	copy,--*) +		__gitcomp '--stdin' +		;; +	prune,--*) +		__gitcomp '--dry-run --verbose' +		;; +	prune,*) +		;; +	*) +		case "$prev" in +		-m|-F) +			;; +		*) +			__gitcomp_nl "$(__git_refs)" +			;; +		esac +		;; +	esac +} + +_git_pull () +{ +	__git_complete_strategy && return + +	case "$cur" in +	--*) +		__gitcomp " +			--rebase --no-rebase +			$__git_merge_options +			$__git_fetch_options +		" +		return +		;; +	esac +	__git_complete_remote_or_refspec +} + +_git_push () +{ +	case "$prev" in +	--repo) +		__gitcomp_nl "$(__git_remotes)" +		return +	esac +	case "$cur" in +	--repo=*) +		__gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}" +		return +		;; +	--*) +		__gitcomp " +			--all --mirror --tags --dry-run --force --verbose +			--receive-pack= --repo= --set-upstream +		" +		return +		;; +	esac +	__git_complete_remote_or_refspec +} + +_git_rebase () +{ +	local dir="$(__gitdir)" +	if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then +		__gitcomp "--continue --skip --abort" +		return +	fi +	__git_complete_strategy && return +	case "$cur" in +	--whitespace=*) +		__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}" +		return +		;; +	--*) +		__gitcomp " +			--onto --merge --strategy --interactive +			--preserve-merges --stat --no-stat +			--committer-date-is-author-date --ignore-date +			--ignore-whitespace --whitespace= +			--autosquash +			" + +		return +	esac +	__gitcomp_nl "$(__git_refs)" +} + +_git_reflog () +{ +	local subcommands="show delete expire" +	local subcommand="$(__git_find_on_cmdline "$subcommands")" + +	if [ -z "$subcommand" ]; then +		__gitcomp "$subcommands" +	else +		__gitcomp_nl "$(__git_refs)" +	fi +} + +__git_send_email_confirm_options="always never auto cc compose" +__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all" + +_git_send_email () +{ +	case "$cur" in +	--confirm=*) +		__gitcomp " +			$__git_send_email_confirm_options +			" "" "${cur##--confirm=}" +		return +		;; +	--suppress-cc=*) +		__gitcomp " +			$__git_send_email_suppresscc_options +			" "" "${cur##--suppress-cc=}" + +		return +		;; +	--smtp-encryption=*) +		__gitcomp "ssl tls" "" "${cur##--smtp-encryption=}" +		return +		;; +	--*) +		__gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to +			--compose --confirm= --dry-run --envelope-sender +			--from --identity +			--in-reply-to --no-chain-reply-to --no-signed-off-by-cc +			--no-suppress-from --no-thread --quiet +			--signed-off-by-cc --smtp-pass --smtp-server +			--smtp-server-port --smtp-encryption= --smtp-user +			--subject --suppress-cc= --suppress-from --thread --to +			--validate --no-validate" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_stage () +{ +	_git_add +} + +__git_config_get_set_variables () +{ +	local prevword word config_file= c=$cword +	while [ $c -gt 1 ]; do +		word="${words[c]}" +		case "$word" in +		--global|--system|--file=*) +			config_file="$word" +			break +			;; +		-f|--file) +			config_file="$word $prevword" +			break +			;; +		esac +		prevword=$word +		c=$((--c)) +	done + +	git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null | +	while read -r line +	do +		case "$line" in +		*.*=*) +			echo "${line/=*/}" +			;; +		esac +	done +} + +_git_config () +{ +	case "$prev" in +	branch.*.remote) +		__gitcomp_nl "$(__git_remotes)" +		return +		;; +	branch.*.merge) +		__gitcomp_nl "$(__git_refs)" +		return +		;; +	remote.*.fetch) +		local remote="${prev#remote.}" +		remote="${remote%.fetch}" +		if [ -z "$cur" ]; then +			COMPREPLY=("refs/heads/") +			return +		fi +		__gitcomp_nl "$(__git_refs_remotes "$remote")" +		return +		;; +	remote.*.push) +		local remote="${prev#remote.}" +		remote="${remote%.push}" +		__gitcomp_nl "$(git --git-dir="$(__gitdir)" \ +			for-each-ref --format='%(refname):%(refname)' \ +			refs/heads)" +		return +		;; +	pull.twohead|pull.octopus) +		__git_compute_merge_strategies +		__gitcomp "$__git_merge_strategies" +		return +		;; +	color.branch|color.diff|color.interactive|\ +	color.showbranch|color.status|color.ui) +		__gitcomp "always never auto" +		return +		;; +	color.pager) +		__gitcomp "false true" +		return +		;; +	color.*.*) +		__gitcomp " +			normal black red green yellow blue magenta cyan white +			bold dim ul blink reverse +			" +		return +		;; +	help.format) +		__gitcomp "man info web html" +		return +		;; +	log.date) +		__gitcomp "$__git_log_date_formats" +		return +		;; +	sendemail.aliasesfiletype) +		__gitcomp "mutt mailrc pine elm gnus" +		return +		;; +	sendemail.confirm) +		__gitcomp "$__git_send_email_confirm_options" +		return +		;; +	sendemail.suppresscc) +		__gitcomp "$__git_send_email_suppresscc_options" +		return +		;; +	--get|--get-all|--unset|--unset-all) +		__gitcomp_nl "$(__git_config_get_set_variables)" +		return +		;; +	*.*) +		COMPREPLY=() +		return +		;; +	esac +	case "$cur" in +	--*) +		__gitcomp " +			--global --system --file= +			--list --replace-all +			--get --get-all --get-regexp +			--add --unset --unset-all +			--remove-section --rename-section +			" +		return +		;; +	branch.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_" +		return +		;; +	branch.*) +		local pfx="${cur%.*}." cur_="${cur#*.}" +		__gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "." +		return +		;; +	guitool.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp " +			argprompt cmd confirm needsfile noconsole norescan +			prompt revprompt revunmerged title +			" "$pfx" "$cur_" +		return +		;; +	difftool.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp "cmd path" "$pfx" "$cur_" +		return +		;; +	man.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp "cmd path" "$pfx" "$cur_" +		return +		;; +	mergetool.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp "cmd path trustExitCode" "$pfx" "$cur_" +		return +		;; +	pager.*) +		local pfx="${cur%.*}." cur_="${cur#*.}" +		__git_compute_all_commands +		__gitcomp_nl "$__git_all_commands" "$pfx" "$cur_" +		return +		;; +	remote.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp " +			url proxy fetch push mirror skipDefaultUpdate +			receivepack uploadpack tagopt pushurl +			" "$pfx" "$cur_" +		return +		;; +	remote.*) +		local pfx="${cur%.*}." cur_="${cur#*.}" +		__gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "." +		return +		;; +	url.*.*) +		local pfx="${cur%.*}." cur_="${cur##*.}" +		__gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" +		return +		;; +	esac +	__gitcomp " +		add.ignoreErrors +		advice.commitBeforeMerge +		advice.detachedHead +		advice.implicitIdentity +		advice.pushNonFastForward +		advice.resolveConflict +		advice.statusHints +		alias. +		am.keepcr +		apply.ignorewhitespace +		apply.whitespace +		branch.autosetupmerge +		branch.autosetuprebase +		browser. +		clean.requireForce +		color.branch +		color.branch.current +		color.branch.local +		color.branch.plain +		color.branch.remote +		color.decorate.HEAD +		color.decorate.branch +		color.decorate.remoteBranch +		color.decorate.stash +		color.decorate.tag +		color.diff +		color.diff.commit +		color.diff.frag +		color.diff.func +		color.diff.meta +		color.diff.new +		color.diff.old +		color.diff.plain +		color.diff.whitespace +		color.grep +		color.grep.context +		color.grep.filename +		color.grep.function +		color.grep.linenumber +		color.grep.match +		color.grep.selected +		color.grep.separator +		color.interactive +		color.interactive.error +		color.interactive.header +		color.interactive.help +		color.interactive.prompt +		color.pager +		color.showbranch +		color.status +		color.status.added +		color.status.changed +		color.status.header +		color.status.nobranch +		color.status.untracked +		color.status.updated +		color.ui +		commit.status +		commit.template +		core.abbrev +		core.askpass +		core.attributesfile +		core.autocrlf +		core.bare +		core.bigFileThreshold +		core.compression +		core.createObject +		core.deltaBaseCacheLimit +		core.editor +		core.eol +		core.excludesfile +		core.fileMode +		core.fsyncobjectfiles +		core.gitProxy +		core.ignoreCygwinFSTricks +		core.ignoreStat +		core.ignorecase +		core.logAllRefUpdates +		core.loosecompression +		core.notesRef +		core.packedGitLimit +		core.packedGitWindowSize +		core.pager +		core.preferSymlinkRefs +		core.preloadindex +		core.quotepath +		core.repositoryFormatVersion +		core.safecrlf +		core.sharedRepository +		core.sparseCheckout +		core.symlinks +		core.trustctime +		core.warnAmbiguousRefs +		core.whitespace +		core.worktree +		diff.autorefreshindex +		diff.statGraphWidth +		diff.external +		diff.ignoreSubmodules +		diff.mnemonicprefix +		diff.noprefix +		diff.renameLimit +		diff.renames +		diff.suppressBlankEmpty +		diff.tool +		diff.wordRegex +		difftool. +		difftool.prompt +		fetch.recurseSubmodules +		fetch.unpackLimit +		format.attach +		format.cc +		format.headers +		format.numbered +		format.pretty +		format.signature +		format.signoff +		format.subjectprefix +		format.suffix +		format.thread +		format.to +		gc. +		gc.aggressiveWindow +		gc.auto +		gc.autopacklimit +		gc.packrefs +		gc.pruneexpire +		gc.reflogexpire +		gc.reflogexpireunreachable +		gc.rerereresolved +		gc.rerereunresolved +		gitcvs.allbinary +		gitcvs.commitmsgannotation +		gitcvs.dbTableNamePrefix +		gitcvs.dbdriver +		gitcvs.dbname +		gitcvs.dbpass +		gitcvs.dbuser +		gitcvs.enabled +		gitcvs.logfile +		gitcvs.usecrlfattr +		guitool. +		gui.blamehistoryctx +		gui.commitmsgwidth +		gui.copyblamethreshold +		gui.diffcontext +		gui.encoding +		gui.fastcopyblame +		gui.matchtrackingbranch +		gui.newbranchtemplate +		gui.pruneduringfetch +		gui.spellingdictionary +		gui.trustmtime +		help.autocorrect +		help.browser +		help.format +		http.lowSpeedLimit +		http.lowSpeedTime +		http.maxRequests +		http.minSessions +		http.noEPSV +		http.postBuffer +		http.proxy +		http.sslCAInfo +		http.sslCAPath +		http.sslCert +		http.sslCertPasswordProtected +		http.sslKey +		http.sslVerify +		http.useragent +		i18n.commitEncoding +		i18n.logOutputEncoding +		imap.authMethod +		imap.folder +		imap.host +		imap.pass +		imap.port +		imap.preformattedHTML +		imap.sslverify +		imap.tunnel +		imap.user +		init.templatedir +		instaweb.browser +		instaweb.httpd +		instaweb.local +		instaweb.modulepath +		instaweb.port +		interactive.singlekey +		log.date +		log.decorate +		log.showroot +		mailmap.file +		man. +		man.viewer +		merge. +		merge.conflictstyle +		merge.log +		merge.renameLimit +		merge.renormalize +		merge.stat +		merge.tool +		merge.verbosity +		mergetool. +		mergetool.keepBackup +		mergetool.keepTemporaries +		mergetool.prompt +		notes.displayRef +		notes.rewrite. +		notes.rewrite.amend +		notes.rewrite.rebase +		notes.rewriteMode +		notes.rewriteRef +		pack.compression +		pack.deltaCacheLimit +		pack.deltaCacheSize +		pack.depth +		pack.indexVersion +		pack.packSizeLimit +		pack.threads +		pack.window +		pack.windowMemory +		pager. +		pretty. +		pull.octopus +		pull.twohead +		push.default +		rebase.autosquash +		rebase.stat +		receive.autogc +		receive.denyCurrentBranch +		receive.denyDeleteCurrent +		receive.denyDeletes +		receive.denyNonFastForwards +		receive.fsckObjects +		receive.unpackLimit +		receive.updateserverinfo +		remotes. +		repack.usedeltabaseoffset +		rerere.autoupdate +		rerere.enabled +		sendemail. +		sendemail.aliasesfile +		sendemail.aliasfiletype +		sendemail.bcc +		sendemail.cc +		sendemail.cccmd +		sendemail.chainreplyto +		sendemail.confirm +		sendemail.envelopesender +		sendemail.from +		sendemail.identity +		sendemail.multiedit +		sendemail.signedoffbycc +		sendemail.smtpdomain +		sendemail.smtpencryption +		sendemail.smtppass +		sendemail.smtpserver +		sendemail.smtpserveroption +		sendemail.smtpserverport +		sendemail.smtpuser +		sendemail.suppresscc +		sendemail.suppressfrom +		sendemail.thread +		sendemail.to +		sendemail.validate +		showbranch.default +		status.relativePaths +		status.showUntrackedFiles +		status.submodulesummary +		submodule. +		tar.umask +		transfer.unpackLimit +		url. +		user.email +		user.name +		user.signingkey +		web.browser +		branch. remote. +	" +} + +_git_remote () +{ +	local subcommands="add rename remove set-head set-branches set-url show prune update" +	local subcommand="$(__git_find_on_cmdline "$subcommands")" +	if [ -z "$subcommand" ]; then +		__gitcomp "$subcommands" +		return +	fi + +	case "$subcommand" in +	rename|remove|set-url|show|prune) +		__gitcomp_nl "$(__git_remotes)" +		;; +	set-head|set-branches) +		__git_complete_remote_or_refspec +		;; +	update) +		local i c='' IFS=$'\n' +		for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do +			i="${i#remotes.}" +			c="$c ${i/ */}" +		done +		__gitcomp "$c" +		;; +	*) +		COMPREPLY=() +		;; +	esac +} + +_git_replace () +{ +	__gitcomp_nl "$(__git_refs)" +} + +_git_reset () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp "--merge --mixed --hard --soft --patch" +		return +		;; +	esac +	__gitcomp_nl "$(__git_refs)" +} + +_git_revert () +{ +	case "$cur" in +	--*) +		__gitcomp "--edit --mainline --no-edit --no-commit --signoff" +		return +		;; +	esac +	__gitcomp_nl "$(__git_refs)" +} + +_git_rm () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp "--cached --dry-run --ignore-unmatch --quiet" +		return +		;; +	esac +	COMPREPLY=() +} + +_git_shortlog () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--*) +		__gitcomp " +			$__git_log_common_options +			$__git_log_shortlog_options +			--numbered --summary +			" +		return +		;; +	esac +	__git_complete_revlist +} + +_git_show () +{ +	__git_has_doubledash && return + +	case "$cur" in +	--pretty=*|--format=*) +		__gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases) +			" "" "${cur#*=}" +		return +		;; +	--*) +		__gitcomp "--pretty= --format= --abbrev-commit --oneline +			$__git_diff_common_options +			" +		return +		;; +	esac +	__git_complete_file +} + +_git_show_branch () +{ +	case "$cur" in +	--*) +		__gitcomp " +			--all --remotes --topo-order --current --more= +			--list --independent --merge-base --no-name +			--color --no-color +			--sha1-name --sparse --topics --reflog +			" +		return +		;; +	esac +	__git_complete_revlist +} + +_git_stash () +{ +	local save_opts='--keep-index --no-keep-index --quiet --patch' +	local subcommands='save list show apply clear drop pop create branch' +	local subcommand="$(__git_find_on_cmdline "$subcommands")" +	if [ -z "$subcommand" ]; then +		case "$cur" in +		--*) +			__gitcomp "$save_opts" +			;; +		*) +			if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then +				__gitcomp "$subcommands" +			else +				COMPREPLY=() +			fi +			;; +		esac +	else +		case "$subcommand,$cur" in +		save,--*) +			__gitcomp "$save_opts" +			;; +		apply,--*|pop,--*) +			__gitcomp "--index --quiet" +			;; +		show,--*|drop,--*|branch,--*) +			COMPREPLY=() +			;; +		show,*|apply,*|drop,*|pop,*|branch,*) +			__gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \ +					| sed -n -e 's/:.*//p')" +			;; +		*) +			COMPREPLY=() +			;; +		esac +	fi +} + +_git_submodule () +{ +	__git_has_doubledash && return + +	local subcommands="add status init update summary foreach sync" +	if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then +		case "$cur" in +		--*) +			__gitcomp "--quiet --cached" +			;; +		*) +			__gitcomp "$subcommands" +			;; +		esac +		return +	fi +} + +_git_svn () +{ +	local subcommands=" +		init fetch clone rebase dcommit log find-rev +		set-tree commit-diff info create-ignore propget +		proplist show-ignore show-externals branch tag blame +		migrate mkdirs reset gc +		" +	local subcommand="$(__git_find_on_cmdline "$subcommands")" +	if [ -z "$subcommand" ]; then +		__gitcomp "$subcommands" +	else +		local remote_opts="--username= --config-dir= --no-auth-cache" +		local fc_opts=" +			--follow-parent --authors-file= --repack= +			--no-metadata --use-svm-props --use-svnsync-props +			--log-window-size= --no-checkout --quiet +			--repack-flags --use-log-author --localtime +			--ignore-paths= $remote_opts +			" +		local init_opts=" +			--template= --shared= --trunk= --tags= +			--branches= --stdlayout --minimize-url +			--no-metadata --use-svm-props --use-svnsync-props +			--rewrite-root= --prefix= --use-log-author +			--add-author-from $remote_opts +			" +		local cmt_opts=" +			--edit --rmdir --find-copies-harder --copy-similarity= +			" + +		case "$subcommand,$cur" in +		fetch,--*) +			__gitcomp "--revision= --fetch-all $fc_opts" +			;; +		clone,--*) +			__gitcomp "--revision= $fc_opts $init_opts" +			;; +		init,--*) +			__gitcomp "$init_opts" +			;; +		dcommit,--*) +			__gitcomp " +				--merge --strategy= --verbose --dry-run +				--fetch-all --no-rebase --commit-url +				--revision --interactive $cmt_opts $fc_opts +				" +			;; +		set-tree,--*) +			__gitcomp "--stdin $cmt_opts $fc_opts" +			;; +		create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\ +		show-externals,--*|mkdirs,--*) +			__gitcomp "--revision=" +			;; +		log,--*) +			__gitcomp " +				--limit= --revision= --verbose --incremental +				--oneline --show-commit --non-recursive +				--authors-file= --color +				" +			;; +		rebase,--*) +			__gitcomp " +				--merge --verbose --strategy= --local +				--fetch-all --dry-run $fc_opts +				" +			;; +		commit-diff,--*) +			__gitcomp "--message= --file= --revision= $cmt_opts" +			;; +		info,--*) +			__gitcomp "--url" +			;; +		branch,--*) +			__gitcomp "--dry-run --message --tag" +			;; +		tag,--*) +			__gitcomp "--dry-run --message" +			;; +		blame,--*) +			__gitcomp "--git-format" +			;; +		migrate,--*) +			__gitcomp " +				--config-dir= --ignore-paths= --minimize +				--no-auth-cache --username= +				" +			;; +		reset,--*) +			__gitcomp "--revision= --parent" +			;; +		*) +			COMPREPLY=() +			;; +		esac +	fi +} + +_git_tag () +{ +	local i c=1 f=0 +	while [ $c -lt $cword ]; do +		i="${words[c]}" +		case "$i" in +		-d|-v) +			__gitcomp_nl "$(__git_tags)" +			return +			;; +		-f) +			f=1 +			;; +		esac +		((c++)) +	done + +	case "$prev" in +	-m|-F) +		COMPREPLY=() +		;; +	-*|tag) +		if [ $f = 1 ]; then +			__gitcomp_nl "$(__git_tags)" +		else +			COMPREPLY=() +		fi +		;; +	*) +		__gitcomp_nl "$(__git_refs)" +		;; +	esac +} + +_git_whatchanged () +{ +	_git_log +} + +__git_main () +{ +	local i c=1 command __git_dir + +	while [ $c -lt $cword ]; do +		i="${words[c]}" +		case "$i" in +		--git-dir=*) __git_dir="${i#--git-dir=}" ;; +		--bare)      __git_dir="." ;; +		--help) command="help"; break ;; +		-c) c=$((++c)) ;; +		-*) ;; +		*) command="$i"; break ;; +		esac +		((c++)) +	done + +	if [ -z "$command" ]; then +		case "$cur" in +		--*)   __gitcomp " +			--paginate +			--no-pager +			--git-dir= +			--bare +			--version +			--exec-path +			--exec-path= +			--html-path +			--info-path +			--work-tree= +			--namespace= +			--no-replace-objects +			--help +			" +			;; +		*)     __git_compute_porcelain_commands +		       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;; +		esac +		return +	fi + +	local completion_func="_git_${command//-/_}" +	declare -f $completion_func >/dev/null && $completion_func && return + +	local expansion=$(__git_aliased_command "$command") +	if [ -n "$expansion" ]; then +		completion_func="_git_${expansion//-/_}" +		declare -f $completion_func >/dev/null && $completion_func +	fi +} + +__gitk_main () +{ +	__git_has_doubledash && return + +	local g="$(__gitdir)" +	local merge="" +	if [ -f "$g/MERGE_HEAD" ]; then +		merge="--merge" +	fi +	case "$cur" in +	--*) +		__gitcomp " +			$__git_log_common_options +			$__git_log_gitk_options +			$merge +			" +		return +		;; +	esac +	__git_complete_revlist +} + +__git_func_wrap () +{ +	if [[ -n ${ZSH_VERSION-} ]]; then +		emulate -L bash +		setopt KSH_TYPESET + +		# workaround zsh's bug that leaves 'words' as a special +		# variable in versions < 4.3.12 +		typeset -h words + +		# workaround zsh's bug that quotes spaces in the COMPREPLY +		# array if IFS doesn't contain spaces. +		typeset -h IFS +	fi +	local cur words cword prev +	_get_comp_words_by_ref -n =: cur words cword prev +	$1 +} + +# Setup completion for certain functions defined above by setting common +# variables and workarounds. +# This is NOT a public function; use at your own risk. +__git_complete () +{ +	local wrapper="__git_wrap${2}" +	eval "$wrapper () { __git_func_wrap $2 ; }" +	complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \ +		|| complete -o default -o nospace -F $wrapper $1 +} + +# wrapper for backwards compatibility +_git () +{ +	__git_wrap__git_main +} + +# wrapper for backwards compatibility +_gitk () +{ +	__git_wrap__gitk_main +} + +__git_complete git __git_main +__git_complete gitk __gitk_main + +# The following are necessary only for Cygwin, and only are needed +# when the user has tab-completed the executable name and consequently +# included the '.exe' suffix. +# +if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then +__git_complete git.exe __git_main +fi diff --git a/plugins/gitfast/git-prompt.sh b/plugins/gitfast/git-prompt.sh new file mode 100644 index 000000000..bf20491ec --- /dev/null +++ b/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 +} diff --git a/plugins/gitfast/gitfast.plugin.zsh b/plugins/gitfast/gitfast.plugin.zsh new file mode 100644 index 000000000..7e50cf721 --- /dev/null +++ b/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//\%/%%}" +} diff --git a/plugins/github/github.plugin.zsh b/plugins/github/github.plugin.zsh index 197e86a48..598b059c1 100644 --- a/plugins/github/github.plugin.zsh +++ b/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 diff --git a/plugins/heroku/_heroku b/plugins/heroku/_heroku index dc899e2b2..a95c38647 100644 --- a/plugins/heroku/_heroku +++ b/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 diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh new file mode 100644 index 000000000..de8d10529 --- /dev/null +++ b/plugins/jira/jira.plugin.zsh @@ -0,0 +1,22 @@ +# To use: add a .jira-url file in the base of your project +# 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 +    echo "There is no .jira-url file in the current directory..." +    return 0; +  else +    jira_url=$(cat .jira-url); +    if [ -z "$1" ]; then +      echo "Opening new issue"; +      `open $jira_url/secure/CreateIssue!default.jspa`; +    else +      echo "Opening issue #$1"; +      `open $jira_url/browse/$1`; +    fi +  fi +} + +alias jira='open_jira_issue' diff --git a/plugins/laravel/_artisan b/plugins/laravel/_artisan new file mode 100644 index 000000000..8637514cf --- /dev/null +++ b/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 diff --git a/plugins/laravel/laravel.plugin.zsh b/plugins/laravel/laravel.plugin.zsh new file mode 100644 index 000000000..ed932ee89 --- /dev/null +++ b/plugins/laravel/laravel.plugin.zsh @@ -0,0 +1,3 @@ +#!zsh +alias artisan='php artisan' +alias bob='php artisan bob::build' diff --git a/plugins/last-working-dir/last-working-dir.plugin.zsh b/plugins/last-working-dir/last-working-dir.plugin.zsh new file mode 100644 index 000000000..5b3121d11 --- /dev/null +++ b/plugins/last-working-dir/last-working-dir.plugin.zsh @@ -0,0 +1,23 @@ +#!/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 +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 diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh index e8af2f49d..f250c2a27 100644 --- a/plugins/mvn/mvn.plugin.zsh +++ b/plugins/mvn/mvn.plugin.zsh @@ -1,6 +1,59 @@ +# mvn-color based on https://gist.github.com/1027800 +export BOLD=`tput bold` +export UNDERLINE_ON=`tput smul` +export UNDERLINE_OFF=`tput rmul` +export TEXT_BLACK=`tput setaf 0` +export TEXT_RED=`tput setaf 1` +export TEXT_GREEN=`tput setaf 2` +export TEXT_YELLOW=`tput setaf 3` +export TEXT_BLUE=`tput setaf 4` +export TEXT_MAGENTA=`tput setaf 5` +export TEXT_CYAN=`tput setaf 6` +export TEXT_WHITE=`tput setaf 7` +export BACKGROUND_BLACK=`tput setab 0` +export BACKGROUND_RED=`tput setab 1` +export BACKGROUND_GREEN=`tput setab 2` +export BACKGROUND_YELLOW=`tput setab 3` +export BACKGROUND_BLUE=`tput setab 4` +export BACKGROUND_MAGENTA=`tput setab 5` +export BACKGROUND_CYAN=`tput setab 6` +export BACKGROUND_WHITE=`tput setab 7` +export RESET_FORMATTING=`tput sgr0` + +  +# Wrapper function for Maven's mvn command. +mvn-color() +{ +  # Filter mvn output using sed +  mvn $@ | sed -e "s/\(\[INFO\]\ \-.*\)/${TEXT_BLUE}${BOLD}\1/g" \ +               -e "s/\(\[INFO\]\ \[.*\)/${RESET_FORMATTING}${BOLD}\1${RESET_FORMATTING}/g" \ +               -e "s/\(\[INFO\]\ BUILD SUCCESSFUL\)/${BOLD}${TEXT_GREEN}\1${RESET_FORMATTING}/g" \ +               -e "s/\(\[WARNING\].*\)/${BOLD}${TEXT_YELLOW}\1${RESET_FORMATTING}/g" \ +               -e "s/\(\[ERROR\].*\)/${BOLD}${TEXT_RED}\1${RESET_FORMATTING}/g" \ +               -e "s/Tests run: \([^,]*\), Failures: \([^,]*\), Errors: \([^,]*\), Skipped: \([^,]*\)/${BOLD}${TEXT_GREEN}Tests run: \1${RESET_FORMATTING}, Failures: ${BOLD}${TEXT_RED}\2${RESET_FORMATTING}, Errors: ${BOLD}${TEXT_RED}\3${RESET_FORMATTING}, Skipped: ${BOLD}${TEXT_YELLOW}\4${RESET_FORMATTING}/g" +  +  # Make sure formatting is reset +  echo -ne ${RESET_FORMATTING} +} +  +# Override the mvn command with the colorized one. +#alias mvn="mvn-color" + +# aliases +alias mvncie='mvn clean install eclipse:eclipse' +alias mvnci='mvn clean install' +alias mvne='mvn eclipse:eclipse' +alias mvnce='mvn clean eclipse:clean eclipse:eclipse' +alias mvnd='mvn deploy' +alias mvnp='mvn package' +alias mvnc='mvn clean' +alias mvncom='mvn compile' +alias mvnt='mvn test' +alias mvnag='mvn archetype:generate' +  function listMavenCompletions {   	 reply=(  		cli:execute cli:execute-phase archetype:generate generate-sources compile clean install test test-compile deploy package cobertura:cobertura jetty:run gwt:run gwt:debug -DskipTests -Dmaven.test.skip=true -DarchetypeCatalog=http://tapestry.formos.com/maven-snapshot-repository -Dtest= `if [ -d ./src ] ; then find ./src -type f | grep -v svn | sed 's?.*/\([^/]*\)\..*?-Dtest=\1?' ; fi`);   } -compctl -K listMavenCompletions mvn
\ No newline at end of file +compctl -K listMavenCompletions mvn diff --git a/plugins/nanoc/_nanoc b/plugins/nanoc/_nanoc new file mode 100644 index 000000000..fde07c3fc --- /dev/null +++ b/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 diff --git a/plugins/nanoc/nanoc.plugin.zsh b/plugins/nanoc/nanoc.plugin.zsh new file mode 100644 index 000000000..5a5064613 --- /dev/null +++ b/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' diff --git a/plugins/node/node.plugin.zsh b/plugins/node/node.plugin.zsh index 519bc18da..3bbed6f04 100644 --- a/plugins/node/node.plugin.zsh +++ b/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"  } diff --git a/plugins/pass/_pass b/plugins/pass/_pass new file mode 100644 index 000000000..f6c1a6c4b --- /dev/null +++ b/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') +} diff --git a/plugins/per-directory-history/per-directory-history.plugin.zsh b/plugins/per-directory-history/per-directory-history.plugin.zsh new file mode 100644 index 000000000..61e8b5a62 --- /dev/null +++ b/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 diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 8be3cd863..852c8b919 100644 --- a/plugins/python/python.plugin.zsh +++ b/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"' diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh index 4aa7a05d6..cd232a6ae 100644 --- a/plugins/rails/rails.plugin.zsh +++ b/plugins/rails/rails.plugin.zsh @@ -5,6 +5,7 @@ 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 sc='ruby script/console'  alias sd='ruby script/server --debugger'  alias devlog='tail -f log/development.log' diff --git a/plugins/rsync/rsync.plugin.zsh b/plugins/rsync/rsync.plugin.zsh new file mode 100644 index 000000000..33a31a5c1 --- /dev/null +++ b/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" diff --git a/plugins/rvm/_rvm b/plugins/rvm/_rvm deleted file mode 100644 index bba5304a0..000000000 --- a/plugins/rvm/_rvm +++ /dev/null @@ -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 diff --git a/plugins/rvm/rvm.plugin.zsh b/plugins/rvm/rvm.plugin.zsh index 604c00713..27f29f2b3 100644 --- a/plugins/rvm/rvm.plugin.zsh +++ b/plugins/rvm/rvm.plugin.zsh @@ -1,3 +1,5 @@ +fpath=($rvm_path/scripts/zsh/Completion $fpath) +  alias rubies='rvm list rubies'  alias gemsets='rvm gemset list' diff --git a/plugins/screen/screen.plugin.zsh b/plugins/screen/screen.plugin.zsh index 98178e807..7009e7a91 100644 --- a/plugins/screen/screen.plugin.zsh +++ b/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 diff --git a/plugins/sublime/sublime.plugin.zsh b/plugins/sublime/sublime.plugin.zsh index 91b0279c5..171f00ef5 100755 --- a/plugins/sublime/sublime.plugin.zsh +++ b/plugins/sublime/sublime.plugin.zsh @@ -2,7 +2,11 @@  #unamestr = 'uname'  if [[ $('uname') == 'Linux' ]]; then -	alias st='/usr/bin/sublime_text&' +	if [ -f '/usr/bin/sublime_text' ]; then +		alias st='/usr/bin/sublime_text&' +	else +		alias st='/usr/bin/sublime-text&' +	fi  elif  [[ $('uname') == 'Darwin' ]]; then  	alias st='/Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl'  fi diff --git a/plugins/supervisor/_supervisorctl b/plugins/supervisor/_supervisorctl new file mode 100644 index 000000000..d159f20e0 --- /dev/null +++ b/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 "$@" diff --git a/plugins/supervisor/_supervisord b/plugins/supervisor/_supervisord new file mode 100644 index 000000000..34d27805d --- /dev/null +++ b/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 diff --git a/plugins/supervisor/supervisor.plugin.zsh b/plugins/supervisor/supervisor.plugin.zsh new file mode 100644 index 000000000..cf1997c5b --- /dev/null +++ b/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. diff --git a/plugins/svn/svn.plugin.zsh b/plugins/svn/svn.plugin.zsh index 4d5bfb8dd..e38e8920b 100644 --- a/plugins/svn/svn.plugin.zsh +++ b/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 diff --git a/plugins/symfony2/symfony2.plugin.zsh b/plugins/symfony2/symfony2.plugin.zsh index 644266841..223401298 100644 --- a/plugins/symfony2/symfony2.plugin.zsh +++ b/plugins/symfony2/symfony2.plugin.zsh @@ -10,4 +10,8 @@ _symfony2 () {    fi  } -compdef _symfony2 app/console
\ No newline at end of file +compdef _symfony2 app/console + +#Alias +alias sf2='php app/console' +alias sf2clear='php app/console cache:clear'
\ No newline at end of file diff --git a/plugins/systemd/systemd.plugin.zsh b/plugins/systemd/systemd.plugin.zsh new file mode 100644 index 000000000..7d3db0f8e --- /dev/null +++ b/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 diff --git a/plugins/terminalapp/terminalapp.plugin.zsh b/plugins/terminalapp/terminalapp.plugin.zsh index 4695ad055..2249b1e2f 100644 --- a/plugins/terminalapp/terminalapp.plugin.zsh +++ b/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
\ No newline at end of file +        # 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 diff --git a/plugins/urltools/urltools.plugin.zsh b/plugins/urltools/urltools.plugin.zsh new file mode 100644 index 000000000..3de74ae3d --- /dev/null +++ b/plugins/urltools/urltools.plugin.zsh @@ -0,0 +1,9 @@ +# 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/ + +alias urlencode='node -e "console.log(encodeURIComponent(process.argv[1]))"' + +alias urldecode='node -e "console.log(decodeURIComponent(process.argv[1]))"' diff --git a/plugins/vagrant/_vagrant b/plugins/vagrant/_vagrant index 483b29c53..9bed1e3c6 100644 --- a/plugins/vagrant/_vagrant +++ b/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 diff --git a/plugins/zeus/README.md b/plugins/zeus/README.md new file mode 100644 index 000000000..4409943fe --- /dev/null +++ b/plugins/zeus/README.md @@ -0,0 +1,41 @@ +## 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` + +* `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` diff --git a/plugins/zeus/zeus.plugin.zsh b/plugins/zeus/zeus.plugin.zsh new file mode 100644 index 000000000..2fc7e1ebf --- /dev/null +++ b/plugins/zeus/zeus.plugin.zsh @@ -0,0 +1,58 @@ +# 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' + +# 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' | 
