diff options
Diffstat (limited to 'plugins')
79 files changed, 3455 insertions, 204 deletions
diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh index f856f2f01..0aa14959d 100644 --- a/plugins/autojump/autojump.plugin.zsh +++ b/plugins/autojump/autojump.plugin.zsh @@ -5,6 +5,8 @@ if [ $commands[autojump] ]; then # check if autojump is installed . /etc/profile.d/autojump.zsh elif [ -f /etc/profile.d/autojump.sh ]; then # gentoo installation . /etc/profile.d/autojump.sh + elif [ -f /usr/local/share/autojump/autojump.zsh ]; then # freebsd installation + . /usr/local/share/autojump/autojump.zsh elif [ -f $HOME/.autojump/etc/profile.d/autojump.zsh ]; then # manual user-local installation . $HOME/.autojump/etc/profile.d/autojump.zsh elif [ -f /opt/local/etc/profile.d/autojump.zsh ]; then # mac os x with ports diff --git a/plugins/battery/battery.plugin.zsh b/plugins/battery/battery.plugin.zsh index 66bf46d13..9f053383a 100644 --- a/plugins/battery/battery.plugin.zsh +++ b/plugins/battery/battery.plugin.zsh @@ -79,4 +79,14 @@ elif [[ $(uname) == "Linux" ]] ; then echo "∞" fi } +else + # Empty functions so we don't cause errors in prompts + function battery_pct_remaining() { + } + + function battery_time_remaining() { + } + + function battery_pct_prompt() { + } fi diff --git a/plugins/bower/bower.plugin.zsh b/plugins/bower/bower.plugin.zsh index ed9c04840..68a67a3cc 100644 --- a/plugins/bower/bower.plugin.zsh +++ b/plugins/bower/bower.plugin.zsh @@ -2,37 +2,80 @@ alias bi="bower install" alias bl="bower list" alias bs="bower search" -bower_package_list='' - +_bower_installed_packages () { + bower_package_list=$(bower ls --no-color 2>/dev/null| awk 'NR>3{print p}{p=$0}'| cut -d ' ' -f 2|sed 's/#.*//') +} _bower () { - local curcontext="$curcontext" state line - typeset -A opt_args - - _arguments -C \ - ':command:->command' \ - '*::options:->options' - - case $state in - (command) - - local -a subcommands - subcommands=(${=$(bower help | grep help | sed -e 's/,//g')}) - _describe -t commands 'bower' subcommands - ;; - - (options) - case $line[1] in - - (install) - if [ -z "$bower_package_list" ];then - bower_package_list=$(bower search | awk 'NR > 2' | cut -d '-' -f 2 | cut -d ' ' -f 2 | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g") - fi - compadd "$@" $(echo $bower_package_list) - ;; - esac - ;; - esac + local -a _1st_arguments _no_color _dopts _save_dev _force_lastest _production + local expl + typeset -A opt_args + + _no_color=('--no-color[Do not print colors (available in all commands)]') + + _dopts=( + '(--save)--save[Save installed packages into the project"s bower.json dependencies]' + '(--force)--force[Force fetching remote resources even if a local copy exists on disk]' + ) + + _save_dev=('(--save-dev)--save-dev[Save installed packages into the project"s bower.json devDependencies]') + + _force_lastest=('(--force-latest)--force-latest[Force latest version on conflict]') + + _production=('(--production)--production[Do not install project devDependencies]') + + _1st_arguments=( + 'cache-clean:Clean the Bower cache, or the specified package caches' \ + 'help:Display help information about Bower' \ + 'info:Version info and description of a particular package' \ + 'init:Interactively create a bower.json file' \ + 'install:Install a package locally' \ + 'link:Symlink a package folder' \ + 'lookup:Look up a package URL by name' \ + 'register:Register a package' \ + 'search:Search for a package by name' \ + 'uninstall:Remove a package' \ + 'update:Update a package' \ + {ls,list}:'[List all installed packages]' + ) + _arguments \ + $_no_color \ + '*:: :->subcmds' && return 0 + + if (( CURRENT == 1 )); then + _describe -t commands "bower subcommand" _1st_arguments + return + fi + + case "$words[1]" in + install) + _arguments \ + $_dopts \ + $_save_dev \ + $_force_lastest \ + $_no_color \ + $_production + ;; + update) + _arguments \ + $_dopts \ + $_no_color \ + $_force_lastest + _bower_installed_packages + compadd "$@" $(echo $bower_package_list) + ;; + uninstall) + _arguments \ + $_no_color \ + $_dopts + _bower_installed_packages + compadd "$@" $(echo $bower_package_list) + ;; + *) + $_no_color \ + ;; + esac + } compdef _bower bower diff --git a/plugins/brew/_brew b/plugins/brew/_brew index e43ba2900..a25caf40c 100644 --- a/plugins/brew/_brew +++ b/plugins/brew/_brew @@ -26,8 +26,10 @@ _1st_arguments=( 'list:list files in a formula or not-installed formulae' 'log:git commit log for a formula' 'missing:check all installed formuale for missing dependencies.' + 'options:display install options specific to formula.' 'outdated:list formulas for which a newer version is available' 'prune:remove dead links' + 'reinstall:reinstall a formula' 'remove:remove a formula' 'search:search for a formula (/regex/ or string)' 'server:start a local web app that lets you browse formulae (requires Sinatra)' @@ -75,7 +77,7 @@ case "$words[1]" in install|home|homepage|log|info|abv|uses|cat|deps|edit|options|versions) _brew_all_formulae _wanted formulae expl 'all formulae' compadd -a formulae ;; - remove|rm|uninstall|unlink|cleanup|link|ln) + reinstall|remove|rm|uninstall|unlink|cleanup|link|ln) _brew_installed_formulae _wanted installed_formulae expl 'installed formulae' compadd -a installed_formulae ;; esac diff --git a/plugins/bundler/bundler.plugin.zsh b/plugins/bundler/bundler.plugin.zsh index 9446aafab..4c3580cac 100644 --- a/plugins/bundler/bundler.plugin.zsh +++ b/plugins/bundler/bundler.plugin.zsh @@ -1,5 +1,4 @@ alias be="bundle exec" -alias bi="bundle install" alias bl="bundle list" alias bp="bundle package" alias bo="bundle open" @@ -7,10 +6,29 @@ alias bu="bundle update" # The following is based on https://github.com/gma/bundler-exec -bundled_commands=(annotate cap capify cucumber foreman guard jekyll middleman nanoc rackup rainbows rake rspec ruby shotgun spec spin spork thin thor unicorn unicorn_rails puma) +bundled_commands=(annotate berks cap capify cucumber foodcritic foreman guard jekyll kitchen knife middleman nanoc rackup rainbows rake rspec ruby shotgun spec spin spork strainer tailor taps thin thor unicorn unicorn_rails puma) ## Functions +bi() { + if _bundler-installed && _within-bundled-project; then + local bundler_version=`bundle version | cut -d' ' -f3` + if [[ $bundler_version > '1.4.0' || $bundler_version = '1.4.0' ]]; then + if [[ "$(uname)" == 'Darwin' ]] + then + local cores_num="$(sysctl hw.ncpu | awk '{print $2}')" + else + local cores_num="$(nproc)" + fi + bundle install --jobs=$cores_num $@ + else + bundle install $@ + fi + else + echo "Can't 'bundle install' outside a bundled project" + fi +} + _bundler-installed() { which bundle > /dev/null 2>&1 } @@ -42,3 +60,4 @@ for cmd in $bundled_commands; do compdef _$cmd bundled_$cmd=$cmd fi done + diff --git a/plugins/cabal/cabal.plugin.zsh b/plugins/cabal/cabal.plugin.zsh new file mode 100644 index 000000000..8d3c64587 --- /dev/null +++ b/plugins/cabal/cabal.plugin.zsh @@ -0,0 +1,36 @@ +function _cabal_commands() { + local ret=1 state + _arguments ':subcommand:->subcommand' && ret=0 + + case $state in + subcommand) + subcommands=( + "bench:Run the benchmark, if any (configure with UserHooks)" + "build:Make this package ready for installation" + "check:Check the package for common mistakes" + "clean:Clean up after a build" + "copy:Copy teh files into the install locations" + "configure:Prepare to build the package" + "fetch:Downloads packages for later installation" + "haddock:Generate HAddock HTML documentation" + "help:Help about commands" + "hscolour:Generate HsColour colourised code, in HTML format" + "info:Display detailed information about a particular package" + "init:Interactively create a .cabal file" + "install:Installs a list of packages" + "list:List packages matching a search string" + "register:Register this package with the compiler" + "report:Upload build reports to a remote server" + "sdist:Generate a source distribution file (.tar.gz)" + "test:Run the test suite, if any (configure with UserHooks)" + "unpack:Unpacks packages for user inspection" + "update:Updates list of known packages" + "upload:Uploads source packages to Hackage" + ) + _describe -t subcommands 'cabal subcommands' subcommands && ret=0 + esac + + return ret +} + +compdef _cabal_commands cabal diff --git a/plugins/capistrano/_capistrano b/plugins/capistrano/_capistrano index 1002dad96..3cadf3d54 100644 --- a/plugins/capistrano/_capistrano +++ b/plugins/capistrano/_capistrano @@ -4,7 +4,7 @@ if [[ -f config/deploy.rb || -f Capfile ]]; 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~ + cap -v --tasks | grep '#' | cut -d " " -f 2 > .cap_tasks~ fi compadd `cat .cap_tasks~` fi diff --git a/plugins/celery/_celery b/plugins/celery/_celery new file mode 100644 index 000000000..63af9fad5 --- /dev/null +++ b/plugins/celery/_celery @@ -0,0 +1,129 @@ +#compdef celery +#autoload + +#celery zsh completion + +_celery () { +local -a _1st_arguments ifargs dopts controlargs + +typeset -A opt_args + +_1st_arguments=('worker' 'events' 'beat' 'shell' 'multi' 'amqp' 'status' 'inspect' \ + 'control' 'purge' 'list' 'migrate' 'call' 'result' 'report') +ifargs=('--app=' '--broker=' '--loader=' '--config=' '--version') +dopts=('--detach' '--umask=' '--gid=' '--uid=' '--pidfile=' '--logfile=' '--loglevel=') +controlargs=('--timeout' '--destination') +_arguments \ + '(-A --app=)'{-A,--app}'[app instance to use (e.g. module.attr_name):APP]' \ + '(-b --broker=)'{-b,--broker}'[url to broker. default is "amqp://guest@localhost//":BROKER]' \ + '(--loader)--loader[name of custom loader class to use.:LOADER]' \ + '(--config)--config[Name of the configuration module:CONFIG]' \ + '(--workdir)--workdir[Optional directory to change to after detaching.:WORKING_DIRECTORY]' \ + '(-q --quiet)'{-q,--quiet}'[Don"t show as much output.]' \ + '(-C --no-color)'{-C,--no-color}'[Don"t display colors.]' \ + '(--version)--version[show program"s version number and exit]' \ + '(- : *)'{-h,--help}'[show this help message and exit]' \ + '*:: :->subcmds' && return 0 + +if (( CURRENT == 1 )); then + _describe -t commands "celery subcommand" _1st_arguments + return +fi + +case "$words[1]" in + worker) + _arguments \ + '(-C --concurrency=)'{-C,--concurrency=}'[Number of child processes processing the queue. The default is the number of CPUs.]' \ + '(--pool)--pool=:::(processes eventlet gevent threads solo)' \ + '(--purge --discard)'{--discard,--purge}'[Purges all waiting tasks before the daemon is started.]' \ + '(-f --logfile=)'{-f,--logfile=}'[Path to log file. If no logfile is specified, stderr is used.]' \ + '(--loglevel=)--loglevel=:::(critical error warning info debug)' \ + '(-N --hostname=)'{-N,--hostname=}'[Set custom hostname, e.g. "foo.example.com".]' \ + '(-B --beat)'{-B,--beat}'[Also run the celerybeat periodic task scheduler.]' \ + '(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database if running with the -B option. Defaults to celerybeat-schedule.]' \ + '(-S --statedb=)'{-S,--statedb=}'[Path to the state database.Default: None]' \ + '(-E --events)'{-E,--events}'[Send events that can be captured by monitors like celeryev, celerymon, and others.]' \ + '(--time-limit=)--time-limit=[nables a hard time limit (in seconds int/float) for tasks]' \ + '(--soft-time-limit=)--soft-time-limit=[Enables a soft time limit (in seconds int/float) for tasks]' \ + '(--maxtasksperchild=)--maxtasksperchild=[Maximum number of tasks a pool worker can execute before it"s terminated and replaced by a new worker.]' \ + '(-Q --queues=)'{-Q,--queues=}'[List of queues to enable for this worker, separated by comma. By default all configured queues are enabled.]' \ + '(-I --include=)'{-I,--include=}'[Comma separated list of additional modules to import.]' \ + '(--pidfile=)--pidfile=[Optional file used to store the process pid.]' \ + '(--autoscale=)--autoscale=[Enable autoscaling by providing max_concurrency, min_concurrency.]' \ + '(--autoreload)--autoreload[Enable autoreloading.]' \ + '(--no-execv)--no-execv[Don"t do execv after multiprocessing child fork.]' + compadd -a ifargs + ;; + inspect) + _values -s \ + 'active[dump active tasks (being processed)]' \ + 'active_queues[dump queues being consumed from]' \ + 'ping[ping worker(s)]' \ + 'registered[dump of registered tasks]' \ + 'report[get bugreport info]' \ + 'reserved[dump reserved tasks (waiting to be processed)]' \ + 'revoked[dump of revoked task ids]' \ + 'scheduled[dump scheduled tasks (eta/countdown/retry)]' \ + 'stats[dump worker statistics]' + compadd -a controlargs ifargs + ;; + control) + _values -s \ + 'add_consumer[tell worker(s) to start consuming a queue]' \ + 'autoscale[change autoscale settings]' \ + 'cancel_consumer[tell worker(s) to stop consuming a queue]' \ + 'disable_events[tell worker(s) to disable events]' \ + 'enable_events[tell worker(s) to enable events]' \ + 'pool_grow[start more pool processes]' \ + 'pool_shrink[use less pool processes]' \ + 'rate_limit[tell worker(s) to modify the rate limit for a task type]' \ + 'time_limit[tell worker(s) to modify the time limit for a task type.]' + compadd -a controlargs ifargs + ;; + multi) + _values -s \ + '--nosplash[Don"t display program info.]' \ + '--verbose[Show more output.]' \ + '--no-color[Don"t display colors.]' \ + '--quiet[Don"t show as much output.]' \ + 'start' 'restart' 'stopwait' 'stop' 'show' \ + 'names' 'expand' 'get' 'kill' + compadd -a ifargs + ;; + amqp) + _values -s \ + 'queue.declare' 'queue.purge' 'exchange.delete' 'basic.publish' \ + 'exchange.declare' 'queue.delete' 'queue.bind' 'basic.get' + ;; + list) + _values -s, 'bindings' + ;; + shell) + _values -s \ + '--ipython[force iPython.]' \ + '--bpython[force bpython.]' \ + '--python[force default Python shell.]' \ + '--without-tasks[don"t add tasks to locals.]' \ + '--eventlet[use eventlet.]' \ + '--gevent[use gevent.]' + compadd -a ifargs + ;; + beat) + _arguments \ + '(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database. Defaults to celerybeat-schedule.]' \ + '(-S --scheduler=)'{-S,--scheduler=}'[Scheduler class to use. Default is celery.beat.PersistentScheduler.]' \ + '(--max-interval)--max-interval[]' + compadd -a dopts fargs + ;; + events) + _arguments \ + '(-d --dump)'{-d,--dump}'[Dump events to stdout.]' \ + '(-c --camera=)'{-c,--camera=}'[Take snapshots of events using this camera.]' \ + '(-F --frequency=)'{-F,--frequency=}'[Camera: Shutter frequency. Default is every 1.0 seconds.]' \ + '(-r --maxrate=)'{-r,--maxrate=}'[Camera: Optional shutter rate limit (e.g. 10/m).]' + compadd -a dopts fargs + ;; + *) + ;; + esac +} diff --git a/plugins/chruby/chruby.plugin.zsh b/plugins/chruby/chruby.plugin.zsh new file mode 100644 index 000000000..2a2c80cf6 --- /dev/null +++ b/plugins/chruby/chruby.plugin.zsh @@ -0,0 +1,99 @@ +# +# INSTRUCTIONS +# +# With either a manual or brew installed chruby things should just work. +# +# If you'd prefer to specify an explicit path to load chruby from +# you can set variables like so: +# +# zstyle :omz:plugins:chruby path /local/path/to/chruby.sh +# zstyle :omz:plugins:chruby auto /local/path/to/auto.sh +# +# TODO +# - autodetermine correct source path on non OS X systems +# - completion if ruby-install exists + +# rvm and rbenv plugins also provide this alias +alias rubies='chruby' + +local _chruby_path +local _chruby_auto + +_homebrew-installed() { + whence brew &> /dev/null +} + +_chruby-from-homebrew-installed() { + brew --prefix chruby &> /dev/null +} + +_ruby-build_installed() { + whence ruby-build &> /dev/null +} + +_ruby-install-installed() { + whence ruby-install &> /dev/null +} + +# Simple definition completer for ruby-build +if _ruby-build_installed; then + _ruby-build() { compadd $(ruby-build --definitions) } + compdef _ruby-build ruby-build +fi + +_source_from_omz_settings() { + zstyle -s :omz:plugins:chruby path _chruby_path + zstyle -s :omz:plugins:chruby auto _chruby_auto + + if _chruby_path && [[ -r _chruby_path ]]; then + source ${_chruby_path} + fi + + if _chruby_auto && [[ -r _chruby_auto ]]; then + source ${_chruby_auto} + fi +} + +_chruby_dirs() { + chrubydirs=($HOME/.rubies/ $PREFIX/opt/rubies) + for dir in chrubydirs; do + if [[ -d $dir ]]; then + RUBIES+=$dir + fi + done +} + +if _homebrew-installed && _chruby-from-homebrew-installed ; then + source $(brew --prefix chruby)/share/chruby/chruby.sh + source $(brew --prefix chruby)/share/chruby/auto.sh + _chruby_dirs +elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then + source /usr/local/share/chruby/chruby.sh + source /usr/local/share/chruby/auto.sh + _chruby_dirs +else + _source_from_omz_settings + _chruby_dirs +fi + +function ensure_chruby() { + $(whence chruby) +} + +function current_ruby() { + local _ruby + _ruby="$(chruby |grep \* |tr -d '* ')" + if [[ $(chruby |grep -c \*) -eq 1 ]]; then + echo ${_ruby} + else + echo "system" + fi +} + +function chruby_prompt_info() { + echo "$(current_ruby)" +} + +# complete on installed rubies +_chruby() { compadd $(chruby | tr -d '* ') } +compdef _chruby chruby diff --git a/plugins/coffee/_coffee b/plugins/coffee/_coffee index 5c8eb9a08..10b6b8164 100644 --- a/plugins/coffee/_coffee +++ b/plugins/coffee/_coffee @@ -35,27 +35,37 @@ # ------- # # * Mario Fernandez (https://github.com/sirech) +# * Dong Weiming (https://github.com/dongweiming) # # ------------------------------------------------------------------------------ -local curcontext="$curcontext" state line ret=1 +local curcontext="$curcontext" state line ret=1 version opts first second third typeset -A opt_args +version=(${(f)"$(_call_program version $words[1] --version)"}) +version=${${(z)${version[1]}}[3]} +first=$(echo $version|cut -d '.' -f 1) +second=$(echo $version|cut -d '.' -f 2) +third=$(echo $version|cut -d '.' -f 3) +if (( $first < 2 )) && (( $second < 7 )) && (( $third < 3 ));then + opts+=('(-l --lint)'{-l,--lint}'[pipe the compiled JavaScript through JavaScript Lint]' + '(-r --require)'{-r,--require}'[require a library before executing your script]:library') +fi + _arguments -C \ '(- *)'{-h,--help}'[display this help message]' \ '(- *)'{-v,--version}'[display the version number]' \ + $opts \ '(-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 diff --git a/plugins/composer/composer.plugin.zsh b/plugins/composer/composer.plugin.zsh index 2d1557541..9975aaca4 100644 --- a/plugins/composer/composer.plugin.zsh +++ b/plugins/composer/composer.plugin.zsh @@ -10,9 +10,25 @@ _composer_get_command_list () { composer --no-ansi | sed "1,/Available commands/d" | awk '/^ [a-z]+/ { print $1 }' } +_composer_get_required_list () { + composer show -s --no-ansi | sed '1,/requires/d' | awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }' +} + _composer () { + local curcontext="$curcontext" state line + typeset -A opt_args + _arguments \ + '1: :->command'\ + '*: :->args' if [ -f composer.json ]; then - compadd `_composer_get_command_list` + case $state in + command) + compadd `_composer_get_command_list` + ;; + *) + compadd `_composer_get_required_list` + ;; + esac else compadd create-project init search selfupdate show fi diff --git a/plugins/debian/debian.plugin.zsh b/plugins/debian/debian.plugin.zsh index 55b90e379..b51d0cd37 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 2>&1 ) ]]; then +if [[ -e $( which -p 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 2>&1 ) ]]; then +if [[ -e $( which -p sudo 2>&1 ) ]]; then use_sudo=1 fi diff --git a/plugins/docker/README.md b/plugins/docker/README.md new file mode 100644 index 000000000..231a6dcf5 --- /dev/null +++ b/plugins/docker/README.md @@ -0,0 +1,19 @@ +## Docker autocomplete plugin + +- Adds autocomplete options for all docker commands. +- Will also show containerIDs and Image names where applicable + +####Shows help for all commands +![General Help](http://i.imgur.com/tUBO9jh.png "Help for all commands") + + +####Shows your downloaded images where applicable +![Images](http://i.imgur.com/R8ZsWO1.png "Images") + + +####Shows your running containers where applicable +![Containers](http://i.imgur.com/WQtbheg.png "Containers") + + + +Maintainer : Ahmed Azaan ([@aeonazaan](https://twitter.com/aeonazaan)) diff --git a/plugins/docker/_docker b/plugins/docker/_docker new file mode 100644 index 000000000..f13f876cf --- /dev/null +++ b/plugins/docker/_docker @@ -0,0 +1,290 @@ +#compdef docker + +# Docker autocompletion for oh-my-zsh +# Requires: Docker installed +# Author : Azaan (@aeonazaan) + + +# ----- Helper functions +# Output a selectable list of all running docker containers +__docker_containers() { + declare -a cont_cmd + cont_cmd=($(docker ps | awk 'NR>1{print $1":[CON("$1")"$2"("$3")]"}')) + _describe 'containers' cont_cmd +} + +# output a selectable list of all docker images +__docker_images() { + declare -a img_cmd + img_cmd=($(docker images | awk 'NR>1{print $1}')) + _describe 'images' img_cmd +} + +# ----- Commands +# Seperate function for each command, makes extension easier later +# --------------------------- +__attach() { + __docker_containers +} + +__build() { + _arguments \ + '-q=false[Suppress verbose build output]' \ + '-t="[fuck to be applied to the resulting image in case of success]' \ + '*:files:_files' +} + +__commit() { + _arguments \ + '-author="[Author]' \ + '-m="[Commit message]' \ + '-run="[Config automatically applied when the image is run.\n]' + __docker_containers +} + +__diff() { + __docker_containers +} + +__export() { + __docker_containers +} + + +__history() { + __docker_images +} + +__images() { + _arguments \ + '-a[show all images]' \ + '-notrunc[dont truncate output]' \ + '-q[only show numeric IDs]' \ + '-viz[output graph in graphviz format]' + __docker_images +} + +__import() { + _arguments '*:files:_files' +} + +__info() { + # no arguments +} + +__insert() { + __docker_images + _arguments '*:files:_files' +} + +__inspect() { + __docker_images + __docker_containers +} + +__kill() { + __docker_containers +} + +__login() { + _arguments \ + '-e="[email]' \ + '-p="[password]' \ + '-u="[username]' \ +} + +__logs() { + __docker_containers +} + +__port() { + __docker_containers +} + +__top() { + __docker_containers +} + +__ps() { + _arguments \ + '-a[Show all containers. Only running containers are shown by default.]' \ + '-beforeId="[Show only container created before Id, include non-running ones.]' \ + '-l[Show only the latest created container, include non-running ones.]' \ + '-n=[Show n last created containers, include non-running ones.]' \ + '-notrurrrrnc[Dont truncate output]' \ + '-q[Only display numeric IDs]' \ + '-s[Display sizes]' \ + '-sinceId="[Show only containers created since Id, include non-running ones.]' +} + +__pull() { + _arguments '-t="[Download tagged image in repository]' +} + +__push() { + +} + +__restart() { + _arguments '-t=[number of seconds to try to stop before killing]' + __docker_containers +} + +__rm() { + _arguments '-v[Remove the volumes associated to the container]' + __docker_containers +} + +__rmi() { + __docker_images +} + +__run() { + _arguments \ + '-a=[Attach to stdin, stdout or stderr.]' \ + '-c=[CPU shares (relative weight)]' \ + '-d[Detached mode: leave the container running in the background]' \ + '-dns=[Set custom dns servers]' \ + '-e=[Set environment variables]' \ + '-entrypoint="[Overwrite the default entrypoint of the image]' \ + '-h="[Container host name]' \ + '-i[Keep stdin open even if not attached]' \ + '-m=[Memory limit (in bytes)]' \ + '-p=[Expose a containers port to the host (use docker port to see the actual mapping)]' \ + '-t[Allocate a pseudo-tty]' \ + '-u="[Username or UID]' \ + '-v=[Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)]' \ + '-volumes-from="[Mount volumes from the specified container]' + __docker_images +} + +__search() { + _arguments '-notrunc[Dont truncate output]' +} + +__start() { + __docker_containers +} + +__stop() { + _arguments '-t=[number of seconds to try to stop before killing]' + __docker_containers +} + +__tag() { + _arguments '-f[Force]' + __docker_images +} + +__version() { + +} + +__wait() { + __docker_containers +} + +# end commands --------- +# ---------------------- + +local -a _1st_arguments +_1st_arguments=( + "attach":"Attach to a running container" + "build":"Build a container from a Dockerfile" + "commit":"Create a new image from a container's changes" + "diff":"Inspect changes on a container's filesystem" + "export":"Stream the contents of a container as a tar archive" + "history":"Show the history of an image" + "images":"List images" + "import":"Create a new filesystem image from the contents of a tarball" + "info":"Display system-wide information" + "insert":"Insert a file in an image" + "inspect":"Return low-level information on a container" + "kill":"Kill a running container" + "login":"Register or Login to the docker registry server" + "logs":"Fetch the logs of a container" + "port":"Lookup the public-facing port which is NAT-ed to PRIVATE_PORT" + "top":"Lookup the running processes of a container" + "ps":"List containers" + "pull":"Pull an image or a repository from the docker registry server" + "push":"Push an image or a repository to the docker registry server" + "restart":"Restart a running container" + "rm":"Remove one or more containers" + "rmi":"Remove one or more images" + "run":"Run a command in a new container" + "search":"Search for an image in the docker index" + "start":"Start a stopped container" + "stop":"Stop a running container" + "tag":"Tag an image into a repository" + "version":"Show the docker version information" + "wait":"Block until a container stops, then print its exit code" +) + +_arguments '*:: :->command' + +if (( CURRENT == 1 )); then + _describe -t commands "docker command" _1st_arguments + return +fi + +local -a _command_args +case "$words[1]" in + attach) + __docker_containers ;; + build) + __build ;; + commit) + __commit ;; + diff) + __diff ;; + export) + __export ;; + history) + __history ;; + images) + __images ;; + import) + __import ;; + info) + __info ;; + insert) + __insert ;; + inspect) + __inspect ;; + kill) + __kill ;; + login) + __login ;; + logs) + __logs ;; + port) + __port ;; + top) + __top ;; + ps) + __ps ;; + pull) + __pull ;; + push) + __push ;; + restart) + __restart ;; + rm) + __rm ;; + rmi) + __rmi ;; + run) + __run ;; + search) + __search ;; + start) + __start ;; + stop) + __stop ;; + tag) + __tag ;; + version) + __version ;; + wait) + __wait ;; +esac diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 23e86c593..7352e5bad 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -52,7 +52,7 @@ function extract() { (*.xz) unxz "$1" ;; (*.lzma) unlzma "$1" ;; (*.Z) uncompress "$1" ;; - (*.zip) unzip "$1" -d $extract_dir ;; + (*.zip|*.war|*.jar) unzip "$1" -d $extract_dir ;; (*.rar) unrar x -ad "$1" ;; (*.7z) 7za x "$1" ;; (*.deb) diff --git a/plugins/forklift/forklift.plugin.zsh b/plugins/forklift/forklift.plugin.zsh index 056069d36..b0e60a434 100644 --- a/plugins/forklift/forklift.plugin.zsh +++ b/plugins/forklift/forklift.plugin.zsh @@ -1,5 +1,6 @@ -# Open folder in ForkLift.app from console +# Open folder in ForkLift.app of ForkLift2.app from console # Author: Adam Strzelecki nanoant.com, modified by Bodo Tasche bitboxer.de +# Updated to support ForkLift2 by Johan Kaving # # Usage: # fl [<folder>] @@ -22,9 +23,33 @@ function fl { fi fi osascript 2>&1 1>/dev/null <<END - tell application "ForkLift" - activate - end tell + + try + tell application "Finder" + set appName to name of application file id "com.binarynights.ForkLift2" + end tell + on error err_msg number err_num + tell application "Finder" + set appName to name of application file id "com.binarynights.ForkLift" + end tell + end try + + if application appName is running + tell application appName + activate + end tell + else + tell application appName + activate + end tell + repeat until application appName is running + delay 1 + end repeat + tell application appName + activate + end tell + end if + tell application "System Events" tell application process "ForkLift" try @@ -36,7 +61,7 @@ function fl { keystroke "g" using {command down, shift down} tell sheet 1 of topWindow set value of text field 1 to "$PWD" - keystroke return + keystroke return end tell end tell end tell diff --git a/plugins/gem/_gem b/plugins/gem/_gem index 83cba40d1..66c77b7d1 100644 --- a/plugins/gem/_gem +++ b/plugins/gem/_gem @@ -4,13 +4,15 @@ # gem zsh completion, based on homebrew completion _gem_installed() { - installed_gems=(`gem list --local --no-versions`) + installed_gems=(${(f)"$(gem list --local --no-versions)"}) } local -a _1st_arguments + _1st_arguments=( + 'build:Build a gem from a gemspec' 'cert:Manage RubyGems certificates and signing settings' - 'check:Check installed gems' + 'check:Check a gem repository for added or missing files' 'cleanup:Clean up old versions of installed gems in the local repository' 'contents:Display the contents of the installed gems' 'dependency:Show the dependencies of an installed gem' @@ -21,7 +23,7 @@ _1st_arguments=( 'install:Install a gem into the local repository' 'list:Display gems whose name starts with STRING' 'lock:Generate a lockdown list of gems' - 'mirror:Mirror a gem repository' + 'mirror:Mirror all gem files (requires rubygems-mirror)' 'outdated:Display all gems that need updates' 'owner:Manage gem owners on RubyGems.org.' 'pristine:Restores installed gems to pristine condition from files located in the gem cache' @@ -35,8 +37,9 @@ _1st_arguments=( 'stale:List gems along with access times' 'uninstall:Uninstall gems from the local repository' 'unpack:Unpack an installed gem to the current directory' - 'update:Update the named gems (or all installed gems) in the local repository' + 'update:Update installed gems to the latest version' 'which:Find the location of a library file you can require' + 'yank:Remove a specific gem version release from RubyGems.org' ) local expl diff --git a/plugins/git-flow/git-flow.plugin.zsh b/plugins/git-flow/git-flow.plugin.zsh index ab9c0c848..b9ea06844 100644 --- a/plugins/git-flow/git-flow.plugin.zsh +++ b/plugins/git-flow/git-flow.plugin.zsh @@ -20,6 +20,12 @@ # c. Or, use this file as a oh-my-zsh plugin. # +#Alias +alias gf='git flow' +alias gcd='git checkout develop' +alias gch='git checkout hotfix' +alias gcr='git checkout release' + _git-flow () { local curcontext="$curcontext" state line diff --git a/plugins/git-prompt/git-prompt.plugin.zsh b/plugins/git-prompt/git-prompt.plugin.zsh new file mode 100644 index 000000000..01b8a88d9 --- /dev/null +++ b/plugins/git-prompt/git-prompt.plugin.zsh @@ -0,0 +1,60 @@ +# ZSH Git Prompt Plugin from: +# http://github.com/olivierverdier/zsh-git-prompt +# +export __GIT_PROMPT_DIR=$ZSH/plugins/git-prompt +# Initialize colors. +autoload -U colors +colors + +# Allow for functions in the prompt. +setopt PROMPT_SUBST + +## Enable auto-execution of functions. +typeset -ga preexec_functions +typeset -ga precmd_functions +typeset -ga chpwd_functions + +# Append git functions needed for prompt. +preexec_functions+='preexec_update_git_vars' +precmd_functions+='precmd_update_git_vars' +chpwd_functions+='chpwd_update_git_vars' + +## Function definitions +function preexec_update_git_vars() { + case "$2" in + git*) + __EXECUTED_GIT_COMMAND=1 + ;; + esac +} + +function precmd_update_git_vars() { + if [ -n "$__EXECUTED_GIT_COMMAND" ]; then + update_current_git_vars + unset __EXECUTED_GIT_COMMAND + fi +} + +function chpwd_update_git_vars() { + update_current_git_vars +} + +function update_current_git_vars() { + unset __CURRENT_GIT_STATUS + + local gitstatus="$__GIT_PROMPT_DIR/gitstatus.py" + _GIT_STATUS=`python ${gitstatus}` + __CURRENT_GIT_STATUS=("${(f)_GIT_STATUS}") +} + +function prompt_git_info() { + if [ -n "$__CURRENT_GIT_STATUS" ]; then + echo "(%{${fg[red]}%}$__CURRENT_GIT_STATUS[1]%{${fg[default]}%}$__CURRENT_GIT_STATUS[2]%{${fg[magenta]}%}$__CURRENT_GIT_STATUS[3]%{${fg[default]}%})" + fi +} + +# Set the prompt. +#PROMPT='%B%m%~%b$(prompt_git_info) %# ' +# for a right prompt: +#RPROMPT='%b$(prompt_git_info)' +RPROMPT='$(prompt_git_info)' diff --git a/plugins/git-prompt/gitstatus.py b/plugins/git-prompt/gitstatus.py new file mode 100644 index 000000000..ee6fab9bd --- /dev/null +++ b/plugins/git-prompt/gitstatus.py @@ -0,0 +1,68 @@ +#!/usr/bin/env python +# -*- coding: UTF-8 -*- + +# change those symbols to whatever you prefer +symbols = {'ahead of': '↑', 'behind': '↓', 'staged':'♦', 'changed':'‣', 'untracked':'…', 'clean':'⚡', 'unmerged':'≠', 'sha1':':'} + +from subprocess import Popen, PIPE + +output,error = Popen(['git','status'], stdout=PIPE, stderr=PIPE).communicate() + +if error: + import sys + sys.exit(0) +lines = output.splitlines() + +import re +behead_re = re.compile(r"^# Your branch is (ahead of|behind) '(.*)' by (\d+) commit") +diverge_re = re.compile(r"^# and have (\d+) and (\d+) different") + +status = '' +staged = re.compile(r'^# Changes to be committed:$', re.MULTILINE) +changed = re.compile(r'^# Changed but not updated:$', re.MULTILINE) +untracked = re.compile(r'^# Untracked files:$', re.MULTILINE) +unmerged = re.compile(r'^# Unmerged paths:$', re.MULTILINE) + +def execute(*command): + out, err = Popen(stdout=PIPE, stderr=PIPE, *command).communicate() + if not err: + nb = len(out.splitlines()) + else: + nb = '?' + return nb + +if staged.search(output): + nb = execute(['git','diff','--staged','--name-only','--diff-filter=ACDMRT']) + status += '%s%s' % (symbols['staged'], nb) +if unmerged.search(output): + nb = execute(['git','diff', '--staged','--name-only', '--diff-filter=U']) + status += '%s%s' % (symbols['unmerged'], nb) +if changed.search(output): + nb = execute(['git','diff','--name-only', '--diff-filter=ACDMRT']) + status += '%s%s' % (symbols['changed'], nb) +if untracked.search(output): +## nb = len(Popen(['git','ls-files','--others','--exclude-standard'],stdout=PIPE).communicate()[0].splitlines()) +## status += "%s" % (symbols['untracked']*(nb//3 + 1), ) + status += symbols['untracked'] +if status == '': + status = symbols['clean'] + +remote = '' + +bline = lines[0] +if bline.find('Not currently on any branch') != -1: + branch = symbols['sha1']+ Popen(['git','rev-parse','--short','HEAD'], stdout=PIPE).communicate()[0][:-1] +else: + branch = bline.split(' ')[3] + bstatusline = lines[1] + match = behead_re.match(bstatusline) + if match: + remote = symbols[match.groups()[0]] + remote += match.groups()[2] + elif lines[2:]: + div_match = diverge_re.match(lines[2]) + if div_match: + remote = "{behind}{1}{ahead of}{0}".format(*div_match.groups(), **symbols) + +print '\n'.join([branch,remote,status]) + diff --git a/plugins/git/README.md b/plugins/git/README.md new file mode 100644 index 000000000..8462dda1c --- /dev/null +++ b/plugins/git/README.md @@ -0,0 +1,4 @@ +## git +**Maintainer:** [Stibbons](https://github.com/Stibbons) + +This plugin adds several git aliases and increase the completion function provided by zsh diff --git a/plugins/git/_git-branch b/plugins/git/_git-branch new file mode 100644 index 000000000..6b9c1a483 --- /dev/null +++ b/plugins/git/_git-branch @@ -0,0 +1,83 @@ +#compdef git-branch + +_git-branch () +{ + declare l c m d + + l='--color --no-color -r -a --all -v --verbose --abbrev --no-abbrev' + c='-l -f --force -t --track --no-track --set-upstream --contains --merged --no-merged' + m='-m -M' + d='-d -D' + + declare -a dependent_creation_args + if (( words[(I)-r] == 0 )); then + dependent_creation_args=( + "($l $m $d): :__git_branch_names" + "::start-point:__git_revisions") + fi + + declare -a dependent_deletion_args + if (( words[(I)-d] || words[(I)-D] )); then + dependent_creation_args= + dependent_deletion_args=( + '-r[delete only remote-tracking branches]') + if (( words[(I)-r] )); then + dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_remote_branch_names' + else + dependent_deletion_args+='*: :__git_ignore_line_inside_arguments __git_branch_names' + fi + fi + + declare -a dependent_modification_args + if (( words[(I)-m] || words[(I)-M] )); then + dependent_creation_args= + dependent_modification_args=( + ':old or new branch name:__git_branch_names' + '::new branch name:__git_branch_names') + fi + + _arguments -w -S -s \ + "($c $m $d --no-color :)--color=-[turn on branch coloring]:: :__git_color_whens" \ + "($c $m $d : --color)--no-color[turn off branch coloring]" \ + "($c $m -a --all)-r[list or delete only remote-tracking branches]" \ + "($c $m $d : -r)"{-a,--all}"[list both remote-tracking branches and local branches]" \ + "($c $m $d : -v --verbose)"{-v,--verbose}'[show SHA1 and commit subject line for each head]' \ + "($c $m $d :)--abbrev=[set minimum SHA1 display-length]: :__git_guard_number length" \ + "($c $m $d :)--no-abbrev[do not abbreviate sha1s]" \ + "($l $m $d)-l[create the branch's reflog]" \ + "($l $m $d -f --force)"{-f,--force}"[force the creation of a new branch]" \ + "($l $m $d -t --track)"{-t,--track}"[set up configuration so that pull merges from the start point]" \ + "($l $m $d)--no-track[override the branch.autosetupmerge configuration variable]" \ + "($l $m $d)--set-upstream[set up configuration so that pull merges]" \ + "($l $m $d)--contains=[only list branches which contain the specified commit]: :__git_committishs" \ + "($l $m $d)--merged=[only list branches which are fully contained by HEAD]: :__git_committishs" \ + "($l $m $d)--no-merged=[do not list branches which are fully contained by HEAD]: :__git_committishs" \ + $dependent_creation_args \ + "($l $c $d -M)-m[rename a branch and the corresponding reflog]" \ + "($l $c $d -m)-M[rename a branch even if the new branch-name already exists]" \ + $dependent_modification_args \ + "($l $c $m -D)-d[delete a fully merged branch]" \ + "($l $c $m -d)-D[delete a branch]" \ + $dependent_deletion_args +} + +(( $+functions[__git_ignore_line] )) || +__git_ignore_line () { + declare -a ignored + ignored=() + ((CURRENT > 1)) && + ignored+=(${line[1,CURRENT-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) + ((CURRENT < $#line)) && + ignored+=(${line[CURRENT+1,-1]//(#m)[\[\]()\\*?#<>~\^]/\\$MATCH}) + $* -F ignored +} + +(( $+functions[__git_ignore_line_inside_arguments] )) || +__git_ignore_line_inside_arguments () { + declare -a compadd_opts + + zparseopts -D -E -a compadd_opts V: J: 1 2 n f X: M: P: S: r: R: q F: + + __git_ignore_line $* $compadd_opts +} + diff --git a/plugins/git/_git-remote b/plugins/git/_git-remote new file mode 100644 index 000000000..4ba62a357 --- /dev/null +++ b/plugins/git/_git-remote @@ -0,0 +1,74 @@ +#compdef git-remote + +# NOTE: --track is undocumented. +# TODO: --track, -t, --master, and -m should take remote branches, I guess. +# NOTE: --master is undocumented. +# NOTE: --fetch is undocumented. +_git-remote () { + local curcontext=$curcontext state line + declare -A opt_args + + _arguments -C \ + ':command:->command' \ + '*::options:->options' && ret=0 + + case $state in + (command) + declare -a commands + + commands=( + 'add:add a new remote' + 'show:show information about a given remote' + 'prune:delete all stale tracking branches for a given remote' + 'update:fetch updates for a set of remotes' + 'rm:remove a remote from .git/config and all associated tracking branches' + 'rename:rename a remote from .git/config and update all associated tracking branches' + 'set-head:sets or deletes the default branch' + 'set-branches:changes the list of branches tracked by the named remote.' + 'set-url:changes URL remote points to.' + ) + + _describe -t commands 'sub-command' commands && ret=0 + ;; + (options) + case $line[1] in + (add) + _arguments \ + '*'{--track,-t}'[track given branch instead of default glob refspec]:branch:__git_branch_names' \ + '(--master -m)'{--master,-m}'[set the remote'\''s HEAD to point to given master branch]:branch:__git_branch_names' \ + '(--fetch -f)'{--fetch,-f}'[run git-fetch on the new remote after it has been created]' \ + ':branch name:__git_remotes' \ + ':url:_urls' && ret=0 + ;; + (show) + _arguments \ + '-n[do not contact the remote for a list of branches]' \ + ':remote:__git_remotes' && ret=0 + ;; + (prune) + _arguments \ + '(--dry-run -n)'{-n,--dry-run}'[do not actually prune, only list what would be done]' \ + ':remote:__git_remotes' && ret=0 + ;; + (update) + __git_remote-groups && ret=0 + ;; + (rm) + __git_remotes && ret=0 + ;; + (rename) + __git_remotes && ret=0 + ;; + (set-url) + _arguments \ + '*--push[manipulate push URLs]' \ + '(--add)--add[add URL]' \ + '(--delete)--delete[delete URLs]' \ + ':branch name:__git_remotes' \ + ':url:_urls' && ret=0 + ;; + + esac + ;; + esac +} diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 6c016aa6b..7b3cec27d 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -5,6 +5,8 @@ alias gst='git status' compdef _git gst=git-status alias gd='git diff' compdef _git gd=git-diff +alias gdc='git diff --cached' +compdef _git gdc=git-diff alias gl='git pull' compdef _git gl=git-pull alias gup='git pull --rebase' @@ -22,6 +24,8 @@ alias gca='git commit -v -a' compdef _git gc=git-commit alias gca!='git commit -v -a --amend' compdef _git gca!=git-commit +alias gcmsg='git commit -m' +compdef _git gcmsg=git-commit alias gco='git checkout' compdef _git gco=git-checkout alias gcm='git checkout master' @@ -37,6 +41,12 @@ alias grset='git remote set-url' compdef _git grset=git-remote alias grup='git remote update' compdef _git grset=git-remote +alias grbi='git rebase -i' +compdef _git grbi=git-rebase +alias grbc='git rebase --continue' +compdef _git grbc=git-rebase +alias grba='git rebase --abort' +compdef _git grba=git-rebase alias gb='git branch' compdef _git gb=git-branch alias gba='git branch -a' @@ -46,9 +56,9 @@ compdef gcount=git alias gcl='git config --list' alias gcp='git cherry-pick' compdef _git gcp=git-cherry-pick -alias glg='git log --stat --max-count=5' +alias glg='git log --stat --max-count=10' compdef _git glg=git-log -alias glgg='git log --graph --max-count=5' +alias glgg='git log --graph --max-count=10' compdef _git glgg=git-log alias glgga='git log --graph --decorate --all' compdef _git glgga=git-log @@ -62,9 +72,24 @@ alias gm='git merge' compdef _git gm=git-merge alias grh='git reset HEAD' alias grhh='git reset HEAD --hard' +alias gclean='git reset --hard && git clean -dfx' alias gwc='git whatchanged -p --abbrev-commit --pretty=medium' -alias gf='git ls-files | grep' + +#remove the gf alias +#alias gf='git ls-files | grep' + alias gpoat='git push origin --all && git push origin --tags' +alias gmt='git mergetool --no-prompt' +compdef _git gm=git-mergetool + +alias gg='git gui citool' +alias gga='git gui citool --amend' +alias gk='gitk --all --branches' + +alias gsts='git stash show --text' +alias gsta='git stash' +alias gstp='git stash pop' +alias gstd='git stash drop' # Will cd into the top of the current repository # or submodule. @@ -95,6 +120,8 @@ function current_repository() { # these aliases take advantage of the previous function alias ggpull='git pull origin $(current_branch)' compdef ggpull=git +alias ggpur='git pull --rebase origin $(current_branch)' +compdef ggpur=git alias ggpush='git push origin $(current_branch)' compdef ggpush=git alias ggpnp='git pull origin $(current_branch) && git push origin $(current_branch)' @@ -108,3 +135,17 @@ function _git_log_prettily(){ } alias glp="_git_log_prettily" compdef _git glp=git-log + +# Work In Progress (wip) +# These features allow to pause a branch development and switch to another one (wip) +# When you want to go back to work, just unwip it +# +# This function return a warning if the current branch is a wip +function work_in_progress() { + if $(git log -n 1 2>/dev/null | grep -q -c wip); then + echo "WIP!!" + fi +} +# these alias commit and uncomit wip branches +alias gwip='git add -A; git ls-files --deleted -z | xargs -0 git rm; git commit -m "wip"' +alias gunwip='git log -n 1 | grep -q -c wip && git reset HEAD~1' diff --git a/plugins/gitignore/gitignore.plugin.zsh b/plugins/gitignore/gitignore.plugin.zsh new file mode 100644 index 000000000..332497cec --- /dev/null +++ b/plugins/gitignore/gitignore.plugin.zsh @@ -0,0 +1,12 @@ +function gi() { curl http://gitignore.io/api/$@ ;} + +_gitignireio_get_command_list() { + curl -s http://gitignore.io/api/list | tr "," "\n" +} + +_gitignireio () { + compset -P '*,' + compadd -S '' `_gitignireio_get_command_list` +} + +compdef _gitignireio gi
\ No newline at end of file diff --git a/plugins/gpg-agent/gpg-agent.plugin.zsh b/plugins/gpg-agent/gpg-agent.plugin.zsh index 109af44c8..3e6a34f42 100644 --- a/plugins/gpg-agent/gpg-agent.plugin.zsh +++ b/plugins/gpg-agent/gpg-agent.plugin.zsh @@ -14,16 +14,27 @@ function start_agent_withssh { export SSH_AGENT_PID } -# source settings of old agent, if applicable -if [ -f "${GPG_ENV}" ]; then - . ${GPG_ENV} > /dev/null -fi +# check if another agent is running +if ! gpg-connect-agent --quiet /bye > /dev/null 2> /dev/null; then + # source settings of old agent, if applicable + if [ -f "${GPG_ENV}" ]; then + . ${GPG_ENV} > /dev/null + export GPG_AGENT_INFO + export SSH_AUTH_SOCK + export SSH_AGENT_PID + fi -# check for existing ssh-agent -if ssh-add -l > /dev/null 2> /dev/null; then - start_agent_nossh; -else - start_agent_withssh; + # check again if another agent is running using the newly sourced settings + if ! gpg-connect-agent --quiet /bye > /dev/null 2> /dev/null; then + # check for existing ssh-agent + if ssh-add -l > /dev/null 2> /dev/null; then + # ssh-agent running, start gpg-agent without ssh support + start_agent_nossh; + else + # otherwise start gpg-agent with ssh support + start_agent_withssh; + fi + fi fi GPG_TTY=$(tty) diff --git a/plugins/heroku/_heroku b/plugins/heroku/_heroku index a95c38647..46663303a 100644 --- a/plugins/heroku/_heroku +++ b/plugins/heroku/_heroku @@ -23,8 +23,10 @@ _1st_arguments=( "auth\:login":"log in with your heroku credentials" "auth\:logout":"clear local authentication credentials" "config":"display the config vars for an app" - "config\:add":"add one or more config vars" - "config\:remove":"remove a config var" + "config\:pull":"pull heroku config vars down to the local environment" + "config\:push":"push local config vars to heroku" + "config\:set":"set one or more config vars" + "config\:unset":"unset one or more config vars" "db\:push":"push local data up to your app" "db\:pull":"pull heroku data down into your local database" "domains":"list custom domains for an app" diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index bea726a54..739ee7142 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -3,7 +3,7 @@ # .jira-url in the current directory takes precedence # # If you use Rapid Board, set: -#JIRA_RAPID_BOARD="yes" +#JIRA_RAPID_BOARD="true" # in you .zshrc # # Setup: cd to/my/project @@ -31,10 +31,10 @@ open_jira_issue () { if [ -z "$1" ]; then echo "Opening new issue" - `open $jira_url/secure/CreateIssue!default.jspa` + $open_cmd "$jira_url/secure/CreateIssue!default.jspa" else echo "Opening issue #$1" - if [[ "x$JIRA_RAPID_BOARD" = "yes" ]]; then + if [[ "x$JIRA_RAPID_BOARD" = "xtrue" ]]; then $open_cmd "$jira_url/issues/$1" else $open_cmd "$jira_url/browse/$1" diff --git a/plugins/jump/jump.plugin.zsh b/plugins/jump/jump.plugin.zsh new file mode 100644 index 000000000..5096879d8 --- /dev/null +++ b/plugins/jump/jump.plugin.zsh @@ -0,0 +1,58 @@ +# Easily jump around the file system by manually adding marks +# marks are stored as symbolic links in the directory $MARKPATH (default $HOME/.marks) +# +# jump FOO: jump to a mark named FOO +# mark FOO: create a mark named FOO +# unmark FOO: delete a mark +# marks: lists all marks +# +export MARKPATH=$HOME/.marks + +jump() { + cd -P "$MARKPATH/$1" 2>/dev/null || echo "No such mark: $1" +} + +mark() { + if (( $# == 0 )); then + MARK=$(basename "$(pwd)") + else + MARK="$1" + fi + if read -q \?"Mark $(pwd) as ${MARK}? (y/n) "; then + mkdir -p "$MARKPATH"; ln -s "$(pwd)" "$MARKPATH/$MARK" + fi +} + +unmark() { + rm -i "$MARKPATH/$1" +} + +autoload colors +marks() { + for link in $MARKPATH/*(@); do + local markname="$fg[cyan]${link:t}$reset_color" + local markpath="$fg[blue]$(readlink $link)$reset_color" + printf "%s\t" $markname + printf "-> %s \t\n" $markpath + done +} + +_completemarks() { + if [[ $(ls "${MARKPATH}" | wc -l) -gt 1 ]]; then + reply=($(ls $MARKPATH/**/*(-) | grep : | sed -E 's/(.*)\/([_\da-zA-Z\-]*):$/\2/g')) + else + if readlink -e "${MARKPATH}"/* &>/dev/null; then + reply=($(ls "${MARKPATH}")) + fi + fi +} +compctl -K _completemarks jump +compctl -K _completemarks unmark + +_mark_expansion() { + setopt extendedglob + autoload -U modify-current-argument + modify-current-argument '$(readlink "$MARKPATH/$ARG")' +} +zle -N _mark_expansion +bindkey "^g" _mark_expansion diff --git a/plugins/knife_ssh/knife_ssh.plugin.zsh b/plugins/knife_ssh/knife_ssh.plugin.zsh new file mode 100644 index 000000000..7fdd42a1e --- /dev/null +++ b/plugins/knife_ssh/knife_ssh.plugin.zsh @@ -0,0 +1,18 @@ +function knife_ssh() { + grep -q $1 ~/.knife_comp~ 2> /dev/null || rm -f ~/.knife_comp~; + ssh $(knife node show $1 | awk '/IP:/{print $2}') +} + +_knife_ssh() { + if hash knife 2>/dev/null; then + if [[ ! -f ~/.knife_comp~ ]]; then + echo "\nGenerating ~/.knife_comp~..." >/dev/stderr + knife node list > ~/.knife_comp~ + fi + compadd $(<~/.knife_comp~) + else + echo "Could not find knife" > /dev/stderr; + fi +} + +compdef _knife_ssh knife_ssh diff --git a/plugins/mercurial/mercurial.plugin.zsh b/plugins/mercurial/mercurial.plugin.zsh index 9aa2d167a..d2db89d04 100644 --- a/plugins/mercurial/mercurial.plugin.zsh +++ b/plugins/mercurial/mercurial.plugin.zsh @@ -1,4 +1,3 @@ - # Mercurial alias hgc='hg commit' alias hgb='hg branch' @@ -14,11 +13,52 @@ alias hglr='hg pull --rebase' alias hgo='hg outgoing' alias hgp='hg push' alias hgs='hg status' +alias hgsl='log --limit 20 --template "{node|short} | {date|isodatesec} | {author|user}: {desc|strip|firstline}\n" ' # this is the 'git commit --amend' equivalent alias hgca='hg qimport -r tip ; hg qrefresh -e ; hg qfinish tip' -function hg_current_branch() { - if [ -d .hg ]; then - echo hg:$(hg branch) +function in_hg() { + if [[ -d .hg ]] || $(hg summary > /dev/null 2>&1); then + echo 1 + fi +} + +function hg_get_branch_name() { + if [ $(in_hg) ]; then + echo $(hg branch) + fi +} + +function hg_prompt_info { + if [ $(in_hg) ]; then + _DISPLAY=$(hg_get_branch_name) + echo "$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_HG_PROMPT_PREFIX\ +$ZSH_THEME_REPO_NAME_COLOR$_DISPLAY$ZSH_PROMPT_BASE_COLOR$ZSH_THEME_HG_PROMPT_SUFFIX$ZSH_PROMPT_BASE_COLOR$(hg_dirty)$ZSH_PROMPT_BASE_COLOR" + unset _DISPLAY + fi +} + +function hg_dirty_choose { + if [ $(in_hg) ]; then + hg 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 + # Otherwise, no lines were found, or an error occurred. Return clean. + echo $2 + fi fi } + +function hg_dirty { + hg_dirty_choose $ZSH_THEME_HG_PROMPT_DIRTY $ZSH_THEME_HG_PROMPT_CLEAN +} + +function hgic() { + hg incoming "$@" | grep "changeset" | wc -l +} + +function hgoc() { + hg outgoing "$@" | grep "changeset" | wc -l +} diff --git a/plugins/mix/_mix b/plugins/mix/_mix new file mode 100644 index 000000000..602f5ffa0 --- /dev/null +++ b/plugins/mix/_mix @@ -0,0 +1,63 @@ +#compdef mix +#autoload + +# Elixir mix zsh completion + +local -a _1st_arguments +_1st_arguments=( + 'archive:Archive this project into a .ez file' + 'clean:Clean generated application files' + 'compile:Compile source files' + 'deps:List dependencies and their status' + "deps.clean:Remove dependencies' files" + 'deps.compile:Compile dependencies' + 'deps.get:Get all out of date dependencies' + 'deps.unlock:Unlock the given dependencies' + 'deps.update:Update dependencies' + 'do:Executes the commands separated by comma' + 'escriptize:Generates an escript for the project' + 'help:Print help information for tasks' + 'local:List local tasks' + 'local.install:Install a task or an archive locally' + 'local.rebar:Install rebar locally' + 'local.uninstall:Uninstall local tasks or archives' + 'new:Creates a new Elixir project' + 'run:Run the given file or expression' + "test:Run a project's tests" + '--help:Describe available tasks' + '--version:Prints the Elixir version information' +) + +__task_list () +{ + local expl + declare -a tasks + + tasks=(archive clean compile deps deps.clean deps.compile deps.get deps.unlock deps.update do escriptize help local local.install local.rebar local.uninstall new run test) + + _wanted tasks expl 'help' compadd $tasks +} + +local expl + +local curcontext="$curcontext" state line +typeset -A opt_args + +_arguments -C \ + ':command:->command' \ + '*::options:->options' + +case $state in + (command) + _describe -t commands "mix subcommand" _1st_arguments + return + ;; + + (options) + case $line[1] in + (help) + _arguments ':feature:__task_list' + esac + ;; +esac + diff --git a/plugins/mosh/mosh.plugin.zsh b/plugins/mosh/mosh.plugin.zsh new file mode 100644 index 000000000..ea36b7ee9 --- /dev/null +++ b/plugins/mosh/mosh.plugin.zsh @@ -0,0 +1,2 @@ +# Allow SSH tab completion for mosh hostnames +compdef mosh=ssh diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh index 799f6fc8c..0c9141907 100644 --- a/plugins/mvn/mvn.plugin.zsh +++ b/plugins/mvn/mvn.plugin.zsh @@ -24,16 +24,18 @@ 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" \ + ( + # Filter mvn output using sed. Before filtering set the locale to C, so invalid characters won't break some sed implementations + unset LANG + LC_CTYPE=C mvn $@ | sed -e "s/\(\[INFO\]\)\(.*\)/${TEXT_BLUE}${BOLD}\1${RESET_FORMATTING}\2/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/\(\[WARNING\]\)\(.*\)/${BOLD}${TEXT_YELLOW}\1${RESET_FORMATTING}\2/g" \ + -e "s/\(\[ERROR\]\)\(.*\)/${BOLD}${TEXT_RED}\1${RESET_FORMATTING}\2/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. diff --git a/plugins/node/node.plugin.zsh b/plugins/node/node.plugin.zsh index 3bbed6f04..2d78f2b4c 100644 --- a/plugins/node/node.plugin.zsh +++ b/plugins/node/node.plugin.zsh @@ -1,5 +1,13 @@ # 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#all_$1" + # get the open command + local open_cmd + if [[ $(uname -s) == 'Darwin' ]]; then + open_cmd='open' + else + open_cmd='xdg-open' + fi + + $open_cmd "http://nodejs.org/docs/$(node --version)/api/all.html#all_$1" } diff --git a/plugins/nvm/_nvm b/plugins/nvm/_nvm new file mode 100644 index 000000000..a95c9e375 --- /dev/null +++ b/plugins/nvm/_nvm @@ -0,0 +1,26 @@ +#compdef nvm +#autoload + +[[ -s ~/.nvm/nvm.sh ]] || return 0 + +local -a _1st_arguments +_1st_arguments=( + 'help:show help' + 'install:download and install a version' + 'uninstall:uninstall a version' + 'use:modify PATH to use version' + 'run:run version with given arguments' + 'ls:list installed versions or versions matching a given description' + 'ls-remote:list remote versions available for install' + 'deactivate:undo effects of NVM on current shell' + 'alias:show or set aliases' + 'unalias:deletes an alias' + 'copy-packages:install global NPM packages to current version' +) + +_arguments -C '*:: :->subcmds' && return 0 + +if (( CURRENT == 1 )); then + _describe -t commands "nvm subcommand" _1st_arguments + return +fi
\ No newline at end of file diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh new file mode 100644 index 000000000..9709719fe --- /dev/null +++ b/plugins/nvm/nvm.plugin.zsh @@ -0,0 +1,3 @@ +# The addition 'nvm install' attempts in ~/.profile + +[[ -s ~/.nvm/nvm.sh ]] && . ~/.nvm/nvm.sh diff --git a/plugins/osx/osx.plugin.zsh b/plugins/osx/osx.plugin.zsh index 51cd7c143..608ec3789 100644 --- a/plugins/osx/osx.plugin.zsh +++ b/plugins/osx/osx.plugin.zsh @@ -6,7 +6,7 @@ # ------------------------------------------------------------------------------ function tab() { - local command="cd \\\"$PWD\\\"" + local command="cd \\\"$PWD\\\"; clear; " (( $# > 0 )) && command="${command}; $*" the_app=$( @@ -34,7 +34,7 @@ EOF launch session "Default Session" set current_session to current session tell current_session - write text "${command}; clear;" + write text "${command}" end tell end tell end tell @@ -157,3 +157,37 @@ function trash() { function vncviewer() { open vnc://$@ } + +# iTunes control function +function itunes() { + local opt=$1 + shift + case "$opt" in + launch|play|pause|stop|rewind|resume|quit) + ;; + mute) + opt="set mute to true" + ;; + unmute) + opt="set mute to false" + ;; + next|previous) + opt="$opt track" + ;; + ""|-h|--help) + echo "Usage: itunes <option>" + echo "option:" + echo "\tlaunch|play|pause|stop|rewind|resume|quit" + echo "\tmute|unmute\tcontrol volume set" + echo "\tnext|previous\tplay next or previous track" + echo "\thelp\tshow this message and exit" + return 0 + ;; + *) + print "Unkonwn option: $opt" + return 1 + ;; + esac + osascript -e "tell application \"iTunes\" to $opt" +} + diff --git a/plugins/pass/_pass b/plugins/pass/_pass index f6c1a6c4b..d8ec38828 100644 --- a/plugins/pass/_pass +++ b/plugins/pass/_pass @@ -101,7 +101,7 @@ _pass_cmd_show () { _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) + _values -C 'passwords' $(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print | sed -e "s#${prefix}.##" -e 's#\.gpg##' | sort) } _pass_complete_entries_with_subdirs () { diff --git a/plugins/pip/_pip b/plugins/pip/_pip index df53ba5ce..967da48ca 100644 --- a/plugins/pip/_pip +++ b/plugins/pip/_pip @@ -6,8 +6,8 @@ _pip_all() { # we cache the list of packages (originally from the macports plugin) if (( ! $+piplist )); then - echo -n " (caching package index...)" - piplist=($(pip search * | cut -d ' ' -f 1 | tr '[A-Z]' '[a-z]')) + zsh-pip-cache-packages + piplist=($(cat $ZSH_PIP_CACHE_FILE)) fi } @@ -62,8 +62,13 @@ case "$words[1]" in '(--no-install)--no-install[only download packages]' \ '(--no-download)--no-download[only install downloaded packages]' \ '(--install-option)--install-option[extra arguments to be supplied to the setup.py]' \ + '(--single-version-externally-managed)--single-version-externally-managed[do not download/install dependencies. requires --record or --root]'\ + '(--root)--root[treat this path as a fake chroot, installing into it. implies --single-version-externally-managed]'\ + '(--record)--record[file to record all installed files to.]'\ + '(-r --requirement)'{-r,--requirement}'[requirements file]: :_files'\ + '(-e --editable)'{-e,--editable}'[path of or url to source to link to instead of installing.]: :_files -/'\ '1: :->packages' && return 0 - + if [[ "$state" == packages ]]; then _pip_all _wanted piplist expl 'packages' compadd -a piplist diff --git a/plugins/pip/pip.plugin.zsh b/plugins/pip/pip.plugin.zsh new file mode 100644 index 000000000..b5433ae9d --- /dev/null +++ b/plugins/pip/pip.plugin.zsh @@ -0,0 +1,78 @@ +# Usage: +# Just add pip to your installed plugins. + +# If you would like to change the cheeseshops used for autocomplete set +# ZSH_PIP_INDEXES in your zshrc. If one of your indexes are bogus you won't get +# any kind of error message, pip will just not autocomplete from them. Double +# check! +# +# If you would like to clear your cache, go ahead and do a +# "zsh-pip-clear-cache". + +ZSH_PIP_CACHE_FILE=~/.pip/zsh-cache +ZSH_PIP_INDEXES=(https://pypi.python.org/simple/) + +zsh-pip-clear-cache() { + rm $ZSH_PIP_CACHE_FILE + unset piplist +} + +zsh-pip-clean-packages() { + sed -n '/<a href/ s/.*>\([^<]\{1,\}\).*/\1/p' +} + +zsh-pip-cache-packages() { + if [[ ! -d ${ZSH_PIP_CACHE_FILE:h} ]]; then + mkdir -p ${ZSH_PIP_CACHE_FILE:h} + fi + + if [[ ! -f $ZSH_PIP_CACHE_FILE ]]; then + echo -n "(...caching package index...)" + tmp_cache=/tmp/zsh_tmp_cache + for index in $ZSH_PIP_INDEXES ; do + # well... I've already got two problems + curl $index 2>/dev/null | \ + zsh-pip-clean-packages \ + >> $tmp_cache + done + sort $tmp_cache | uniq | tr '\n' ' ' > $ZSH_PIP_CACHE_FILE + rm $tmp_cache + fi +} + +# A test function that validates the regex against known forms of the simple +# index. If you modify the regex to make it work for you, you should add a test +# case in here and make sure that your changes don't break things for someone +# else. +zsh-pip-test-clean-packages() { + local expected + local actual + expected="0x10c-asm +1009558_nester" + + actual=$(echo -n "<html><head><title>Simple Index</title><meta name=\"api-version\" value=\"2\" /></head><body> +<a href='0x10c-asm'>0x10c-asm</a><br/> +<a href='1009558_nester'>1009558_nester</a><br/> +</body></html>" | zsh-pip-clean-packages) + + if [[ $actual != $expected ]] ; then + echo -e "python's simple index is broken:\n$actual\n !=\n$expected" + else + echo "python's simple index is fine" + fi + + actual=$(echo -n '<html> + <head> + <title>Simple Package Index</title> + </head> + <body> + <a href="0x10c-asm">0x10c-asm</a><br/> + <a href="1009558_nester">1009558_nester</a><br/> +</body></html>' | zsh-pip-clean-packages) + + if [[ $actual != $expected ]] ; then + echo -e "the djangopypi2 index is broken:\n$actual\n !=\n$expected" + else + echo "the djangopypi2 index is fine" + fi +} diff --git a/plugins/pod/_pod b/plugins/pod/_pod new file mode 100644 index 000000000..8c0f4460f --- /dev/null +++ b/plugins/pod/_pod @@ -0,0 +1,389 @@ +#compdef pod +#autoload + +# ----------------------------------------------------------------------------- +# FILE: _pod +# DESCRIPTION: Cocoapods (0.27.1) autocomplete plugin for Oh-My-Zsh +# http://cocoapods.org +# AUTHOR: Alexandre Joly (alexandre.joly@mekanics.ch) +# GITHUB: https://github.com/mekanics +# TWITTER: @jolyAlexandre +# VERSION: 0.0.3 +# LICENSE: MIT +# ----------------------------------------------------------------------------- + +local -a _1st_arguments +_1st_arguments=( + 'help:Show help for the given command' + 'init:Generate a Podfile for the current directory' + 'install:Install project dependencies' + 'ipc:Inter-process communication' + 'list:List pods' + 'outdated:Show outdated project dependencies' + 'podfile-info:Shows information on installed Pods' + 'push:Push new specifications to a spec-repo' + 'repo:Manage spec-repositories' + 'search:Searches for pods' + 'setup:Setup the CocoaPods environment' + 'spec:Manage pod specs' + 'update:Update outdated project dependencies' +) + +local -a _repo_arguments +_repo_arguments=( + 'add:Add a spec repo' + 'lint:Validates all specs in a repo' + 'remove:Remove a spec repo.' + 'update:Update a spec repo' +) + +local -a _spec_arguments +_spec_arguments=( + 'cat:Prints a spec file' + 'create:Create spec file stub' + 'edit:Edit a spec file' + 'lint:Validates a spec file' + 'which:Prints the path of the given spec' +) + +local -a _ipc_arguments +_ipc_arguments=( + 'list:Lists the specifications know to CocoaPods' + 'podfile:Converts a Podfile to YAML' + 'repl:The repl listens to commands on standard input' + 'spec:Converts a podspec to YAML' + 'update-search-index:Updates the search index' +) + +local -a _list_arguments +_list_arguments=( + 'new:Lists pods introduced in the master spec-repo since the last check' +) + +local -a _inherited_options +_inherited_options=( + '(--silent)--silent[Show nothing]' \ + '(--version)--version[Show the version of CocoaPods]' \ + '(--no-color)--no-color[Show output without color]' \ + '(--verbose)--verbose[Show more debugging information]' \ + '(--help)--help[Show help banner of specified command]' +) + +local -a _install_options +_install_options=( + '(--no-clean)--no-clean[Leave SCM dirs like `.git` and `.svn` intact after downloading]' \ + '(--no-integrate)--no-integrate[Skip integration of the Pods libraries in the Xcode project(s)]' \ + '(--no-repo-update)--no-repo-update[Skip running `pod repo update` before install]' +) + +local -a _update_options +_update_options=( + '(--no-clean)--no-clean[Leave SCM dirs like `.git` and `.svn intact after downloading]' \ + '(--no-integrate)--no-integrate[Skip integration of the Pods libraries in the Xcode project(s)]' \ + '(--no-repo-update)--no-repo-update[Skip running `pod repo update before install]' +) + +local -a _outdated_options +_outdated_options=( + '(--no-repo-update)--no-repo-update[Skip running `pod repo update` before install]' +) + +local -a _search_options +_search_options=( + '(--full)--full[Search by name, summary, and description]' \ + '(--stats)--stats[Show additional stats (like GitHub watchers and forks)]' \ + '(--ios)--ios[Restricts the search to Pods supported on iOS]' \ + '(--osx)--osx[Restricts the search to Pods supported on OS X]' +) + +local -a _list_options +_list_options=( + '(--update)--update[Run `pod repo update` before listing]' +) + +local -a _podfile_info_options +_podfile_info_options=( + '(--all)--all[Show information about all Pods with dependencies that are used in a project]' \ + '(--md)--md[Output information in Markdown format]' \ + '*:script or directory:_files' +) + +local -a _push_options +_push_options=( + '(--allow-warnings)--allow-warnings[Allows pushing even if there are warnings]' \ + '(--local-only)--local-only[Does not perform the step of pushing REPO to its remote]' \ + '*:script or directory:_files' +) + +local -a _repo_lint_options +_repo_lint_options=( + '(--only-errors)--only-errors[Lint presents only the errors]' +) + +local -a _setup_options +_setup_options=( + '(--push)--push[Use this option to enable push access once granted]' +) + +local -a _spec_lint_options +_spec_lint_options=( + '(--quick)--quick[Lint skips checks that would require to download and build the spec]' \ + '(--only-errors)--only-errors[Lint validates even if warnings are present]' \ + '(--no-clean)--no-clean[Lint leaves the build directory intact for inspection]' \ + '*:script or directory:_files' +) + +local -a _spec_cat_options +_spec_cat_options=( + '(--show-all)--show-all[Pick from all versions of the given podspec]' +) + +local -a _spec_which_options +_spec_which_options=( + '(--show-all)--show-all[Print all versions of the given podspec]' +) + +local -a _spec_edit_options +_spec_edit_options=( + '(--show-all)--show-all[Pick which spec to edit from all available versions of the given podspec]' +) + + +__first_command_list () +{ + local expl + declare -a tasks + + tasks=(install ipc list outdated podfile-info push repo search setup spec update) + + _wanted tasks expl 'help' compadd $tasks +} + +__repo_list() { + _wanted application expl 'repo' compadd $(command ls -1 ~/.cocoapods/repos 2>/dev/null | sed -e 's/ /\\ /g') +} + +__pod-repo() { + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C \ + ':command:->command' \ + '*::options:->options' + + case $state in + (command) + _describe -t commands "pod repo" _repo_arguments + return + ;; + + (options) + case $line[1] in + (lint) + _arguments \ + $_inherited_options \ + $_repo_lint_options \ + ':feature:__repo_list' + ;; + + (update) + _arguments \ + $_inherited_options \ + ':feature:__repo_list' + ;; + + (add) + _arguments \ + $_inherited_options + + (remove) + _arguments \ + $_inherited_options \ + ':feature:__repo_list' + ;; + esac + ;; + esac +} + +__pod-spec() { + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C \ + ':command:->command' \ + '*::options:->options' + + case $state in + (command) + _describe -t commands "pod spec" _spec_arguments + return + ;; + + (options) + case $line[1] in + (create) + _arguments \ + $_inherited_options + ;; + + (lint) + _arguments \ + $_inherited_options \ + $_spec_lint_options + ;; + + (cat) + _arguments \ + $_inherited_options \ + $_spec_cat_options + ;; + + (which) + _arguments \ + $_inherited_options \ + $_spec_which_options + ;; + + (edit) + _arguments \ + $_inherited_options \ + $_spec_edit_options + ;; + esac + return + ;; + esac +} + +__pod-ipc() { + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C \ + ':command:->command' \ + '*::options:->options' + + case $state in + (command) + _describe -t commands "pod ipc" _ipc_arguments + return + ;; + + (options) + _arguments -C \ + $_inherited_options + return + ;; + esac +} + +__pod-list() { + local curcontext="$curcontext" state line + typeset -A opt_args + + _arguments -C \ + $_inherited_options \ + $_list_options \ + ':command:->command' \ + '*::options:->options' + + case $state in + (command) + _describe -t commands "pod list" _list_arguments + return + ;; + + (options) + _arguments -C \ + $_inherited_options \ + $_list_options + return + ;; + esac +} + +local curcontext="$curcontext" state line +typeset -A opt_args + +_arguments -C \ + $_inherited_options \ + ':command:->command' \ + '*::options:->options' + +case $state in + (command) + _describe -t commands "pod" _1st_arguments + return + ;; + + (options) + case $line[1] in + (help) + _arguments \ + $_inherited_options \ + ':help:__first_command_list' + ;; + + (push) + _arguments \ + $_inherited_options \ + $_push_options \ + ':repo:__repo_list' + ;; + + (repo) + __pod-repo + ;; + + (spec) + __pod-spec + ;; + + (ipc) + __pod-ipc + ;; + + (list) + __pod-list + ;; + + (install) + _arguments \ + $_inherited_options \ + $_install_options + ;; + + (update) + _arguments \ + $_inherited_options \ + $_update_options + ;; + + (outdated) + _arguments \ + $_inherited_options \ + $_outdated_options + ;; + + (search) + _arguments \ + $_inherited_options \ + $_search_options + ;; + + (podfile-info) + _arguments \ + $_inherited_options \ + $_podfile_info_options + ;; + + (setup) + _arguments \ + $_inherited_options \ + $_setup_options + ;; + + esac + ;; +esac diff --git a/plugins/postgres/postgres.plugin.zsh b/plugins/postgres/postgres.plugin.zsh new file mode 100644 index 000000000..cdd142e92 --- /dev/null +++ b/plugins/postgres/postgres.plugin.zsh @@ -0,0 +1,6 @@ +# Aliases to stop, start and restart Postgres +# Paths noted below are for Postgress installed via Homebrew on OSX + +alias startpost='pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start' +alias stoppost='pg_ctl -D /usr/local/var/postgres stop -s -m fast' +alias restartpost='stoppost && sleep 1 && startpost'
\ No newline at end of file diff --git a/plugins/powify/_powify b/plugins/powify/_powify index d23c46513..9507f400e 100644 --- a/plugins/powify/_powify +++ b/plugins/powify/_powify @@ -1,7 +1,7 @@ #compdef powify _powify_all_servers() { - all_servers=(`ls $HOME/.pow/`) + all_servers=(`ls $HOME/.pow/ 2>/dev/null`) } local -a all_servers @@ -30,7 +30,7 @@ fi case "$words[1]" in server) - _values \ + _values , \ 'install[install pow server]' \ 'reinstall[reinstall pow server]' \ 'update[update pow server]' \ @@ -45,7 +45,7 @@ case "$words[1]" in 'config[print the current server configuration]' \ 'logs[tails the pow server logs]' ;; utils) - _values \ + _values , \ 'install[install powify.dev server management tool]' \ 'reinstall[reinstall powify.dev server management tool]' \ 'uninstall[uninstall powify.dev server management tool]' ;; diff --git a/plugins/pyenv/pyenv.plugin.zsh b/plugins/pyenv/pyenv.plugin.zsh new file mode 100644 index 000000000..b3dc7aa17 --- /dev/null +++ b/plugins/pyenv/pyenv.plugin.zsh @@ -0,0 +1,31 @@ +_homebrew-installed() { + type brew &> /dev/null +} + +_pyenv-from-homebrew-installed() { + brew --prefix pyenv &> /dev/null +} + +FOUND_PYENV=0 +pyenvdirs=("$HOME/.pyenv" "/usr/local/pyenv" "/opt/pyenv") +if _homebrew-installed && _pyenv-from-homebrew-installed ; then + pyenvdirs=($(brew --prefix pyenv) "${pyenvdirs[@]}") +fi + +for pyenvdir in "${pyenvdirs[@]}" ; do + if [ -d $pyenvdir/bin -a $FOUND_PYENV -eq 0 ] ; then + FOUND_PYENV=1 + export PYENV_ROOT=$pyenvdir + export PATH=${pyenvdir}/bin:$PATH + eval "$(pyenv init --no-rehash - zsh)" + + function pyenv_prompt_info() { + echo "$(pyenv version-name)" + } + fi +done +unset pyenvdir + +if [ $FOUND_PYENV -eq 0 ] ; then + function pyenv_prompt_info() { echo "system: $(python -V 2>&1 | cut -f 2 -d ' ')" } +fi diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 852c8b919..a8f9760ad 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -6,6 +6,7 @@ alias pyfind='find . -name "*.py"' function pyclean() { ZSH_PYCLEAN_PLACES=${*:-'.'} find ${ZSH_PYCLEAN_PLACES} -type f -name "*.py[co]" -delete + find ${ZSH_PYCLEAN_PLACES} -type d -name "__pycache__" -delete } # Grep among .py files diff --git a/plugins/rails/_rails b/plugins/rails/_rails new file mode 100644 index 000000000..96f57ce64 --- /dev/null +++ b/plugins/rails/_rails @@ -0,0 +1,63 @@ +#compdef rails +#autoload + +local -a _1st_arguments +_1st_arguments=( + 'generate:Generate new code (short-cut alias: "g")' + 'console:Start the Rails console (short-cut alias: "c")' + 'server:Start the Rails server (short-cut alias: "s")' + 'dbconsole:Start a console for the database specified in config/database.yml (short-cut alias: "db")' + 'new:Create a new Rails application. "rails new my_app" creates a new application called MyApp in "./my_app"' + 'application:Generate the Rails application code' + 'destroy:Undo code generated with "generate"' + + 'benchmarker:See how fast a piece of code runs' + 'profiler:Get profile information from a piece of code' + 'plugin:Install a plugin' + + 'plugin new:Generates skeleton for developing a Rails plugin' + 'runner:Run a piece of code in the application environment (short-cut alias: "r")' +) + +_rails_generate_arguments() { + generate_arguments=( + assets + controller + decorator + generator + helper + integration_test + mailer + migration + model + observer + performance_test + plugin + resource + scaffold + scaffold_controller + session_migration + stylesheets + task + ) +} + + +_arguments \ + '(--version)--version[show version]' \ + '(--help)--help[show help]' \ + '*:: :->subcmds' && return 0 + +if (( CURRENT == 1 )); then + _describe -t commands "rails subcommand" _1st_arguments + return +fi + +case "$words[1]" in + g|generate) + _rails_generate_arguments + _wanted generate_arguments expl 'all generate' compadd -a generate_arguments ;; + d|destroy) + _rails_generate_arguments + _wanted generate_arguments expl 'all generate' compadd -a generate_arguments ;; +esac diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh index 0139d22c3..23d15a9a1 100644 --- a/plugins/rails/rails.plugin.zsh +++ b/plugins/rails/rails.plugin.zsh @@ -1,18 +1,70 @@ +function _rails_command () { + if [ -e "script/server" ]; then + ruby script/$@ + elif [ -e "script/rails" ]; then + ruby script/rails $@ + elif [ -e "bin/rails" ]; then + bin/rails $@ + else + rails $@ + fi +} + +function _rake_command () { + if [ -e "bin/rake" ]; then + bin/rake $@ + else + rake $@ + fi +} + +alias rails='_rails_command' +compdef _rails_command=rails + +alias rake='_rake_command' +compdef _rake_command=rake + +alias devlog='tail -f log/development.log' +alias prodlog='tail -f log/production.log' +alias testlog='tail -f log/test.log' + +alias -g RED='RAILS_ENV=development' +alias -g REP='RAILS_ENV=production' +alias -g RET='RAILS_ENV=test' + +# Rails aliases +alias rc='rails console' +alias rd='rails destroy' +alias rdb='rails dbconsole' +alias rg='rails generate' +alias rgm='rails generate migration' +alias rp='rails plugin' +alias ru='rails runner' +alias rs='rails server' +alias rsd='rails server --debugger' + +# Rake aliases +alias rdm='rake db:migrate' +alias rdr='rake db:rollback' +alias rdc='rake db:create' +alias rds='rake db:seed' +alias rdd='rake db:drop' +alias rdtc='rake db:test:clone' +alias rdtp='rake db:test:prepare' + +alias rlc='rake log:clear' +alias rn='rake notes' +alias rr='rake routes' + +# legacy stuff alias ss='thin --stats "/thin/stats" start' alias sg='ruby script/generate' alias sd='ruby script/destroy' alias sp='ruby script/plugin' alias sr='ruby script/runner' alias ssp='ruby script/spec' -alias rdbm='rake db:migrate' -alias rdbtp='rake db:test:prepare' -alias migrate='rake db:migrate && rake db:test:prepare' alias sc='ruby script/console' alias sd='ruby script/server --debugger' -alias devlog='tail -f log/development.log' -alias -g RET='RAILS_ENV=test' -alias -g REP='RAILS_ENV=production' -alias -g RED='RAILS_ENV=development' function remote_console() { /usr/bin/env ssh $1 "( cd $2 && ruby script/console production )" diff --git a/plugins/rails3/rails3.plugin.zsh b/plugins/rails3/rails3.plugin.zsh index a2697872a..261b92108 100644 --- a/plugins/rails3/rails3.plugin.zsh +++ b/plugins/rails3/rails3.plugin.zsh @@ -1,26 +1,4 @@ -# Rails 3 aliases, backwards-compatible with Rails 2. - -function _rails_command () { - if [ -e "script/server" ]; then - ruby script/$@ - else - ruby script/rails $@ - fi -} - -alias rc='_rails_command console' -alias rd='_rails_command destroy' -alias rdb='_rails_command dbconsole' -alias rdbm='rake db:migrate db:test:clone' -alias rg='_rails_command generate' -alias rgm='_rails_command generate migration' -alias rp='_rails_command plugin' -alias ru='_rails_command runner' -alias rs='_rails_command server' -alias rsd='_rails_command server --debugger' -alias devlog='tail -f log/development.log' -alias rdm='rake db:migrate' -alias rdr='rake db:rollback' -alias -g RET='RAILS_ENV=test' -alias -g REP='RAILS_ENV=production' -alias -g RED='RAILS_ENV=development' +echo "It looks like you have been using the 'rails3' plugin," +echo "which has been deprecated in favor of a newly consolidated 'rails' plugin." +echo "You will want to modify your ~/.zshrc configuration to begin using it." +echo "Learn more at https://github.com/robbyrussell/oh-my-zsh/pull/2240" diff --git a/plugins/rails4/rails4.plugin.zsh b/plugins/rails4/rails4.plugin.zsh index fce827ee3..5452c242c 100644 --- a/plugins/rails4/rails4.plugin.zsh +++ b/plugins/rails4/rails4.plugin.zsh @@ -1,30 +1,4 @@ -# Rails 4 aliases - -function _rails_command () { - if [ -e "script/server" ]; then - ruby script/$@ - elif [ -e "script/rails" ]; then - ruby script/rails $@ - else - ruby bin/rails $@ - fi -} - -alias rc='_rails_command console' -alias rd='_rails_command destroy' -alias rdb='_rails_command dbconsole' -alias rdbm='rake db:migrate db:test:clone' -alias rg='_rails_command generate' -alias rgm='_rails_command generate migration' -alias rp='_rails_command plugin' -alias ru='_rails_command runner' -alias rs='_rails_command server' -alias rsd='_rails_command server --debugger' -alias devlog='tail -f log/development.log' -alias rdm='rake db:migrate' -alias rdc='rake db:create' -alias rdr='rake db:rollback' -alias rds='rake db:seed' -alias rlc='rake log:clear' -alias rn='rake notes' -alias rr='rake routes' +echo "It looks like you have been using the 'rails4' plugin," +echo "which has been deprecated in favor of a newly consolidated 'rails' plugin." +echo "You will want to modify your ~/.zshrc configuration to begin using it." +echo "Learn more at https://github.com/robbyrussell/oh-my-zsh/pull/2240" diff --git a/plugins/rand-quote/rand-quote.plugin.zsh b/plugins/rand-quote/rand-quote.plugin.zsh new file mode 100644 index 000000000..5544ca565 --- /dev/null +++ b/plugins/rand-quote/rand-quote.plugin.zsh @@ -0,0 +1,17 @@ +# Get a random quote fron the site http://www.quotationspage.com/random.php3 +# Created by Eduardo San Martin Morote aka Posva +# http://posva.github.io +# Sun Jun 09 10:59:36 CEST 2013 +# Don't remove this header, thank you +# Usage: quote + +if [[ -x `which curl` ]]; then + function quote() + { + Q=$(curl -s --connect-timeout 2 "http://www.quotationspage.com/random.php3" | grep -m 1 "dt ") + TXT=$(echo "$Q" | sed -e 's/<\/dt>.*//g' -e 's/.*html//g' -e 's/^[^a-zA-Z]*//' -e 's/<\/a..*$//g') + W=$(echo "$Q" | sed -e 's/.*\/quotes\///g' -e 's/<.*//g' -e 's/.*">//g') + echo "\e[0;33m${W}\e[0;30m: \e[0;35m“${TXT}”\e[m" + } + #quote +fi diff --git a/plugins/repo/README.md b/plugins/repo/README.md new file mode 100644 index 000000000..0b77e6d48 --- /dev/null +++ b/plugins/repo/README.md @@ -0,0 +1,7 @@ +## repo +**Maintainer:** [Stibbons](https://github.com/Stibbons) + +This plugin mainly add support automatic completion for the repo command line tool: +http://code.google.com/p/git-repo/ + +* `r` aliases `repo` diff --git a/plugins/repo/_repo b/plugins/repo/_repo new file mode 100644 index 000000000..59e39c954 --- /dev/null +++ b/plugins/repo/_repo @@ -0,0 +1,272 @@ +#compdef repo + + +__git_apply_whitespace_strategies () +{ + declare -a strategies + + strategies=( + 'nowarn:turn off the trailing-whitespace warning' + 'warn:output trailing-whitespace warning, but apply patch' + 'fix:output trailing-whitespace warning and strip trailing whitespace' + 'error:output trailing-whitespace warning and refuse to apply patch' + 'error-all:same as "error", but output warnings for all files') + + _describe -t strategies 'trailing-whitespace resolution strategy' strategies $* +} + + +_repo() +{ + local context state state_descr line curcontext="$curcontext" + typeset -A opt_args + + local ret=1 + + _arguments -C \ + '(- 1 *)--help[show usage]'\ + '1:command:->command'\ + '*::args:->args' && ret=0 + + case $state in + (command) + repo list 2> /dev/null > /dev/null + if [[ $? == 0 ]]; then + local commands; + commands=( + 'abandon:Permanently abandon a development branch' + 'branch:View current topic branches' + 'branches:View current topic branches' + 'checkout:Checkout a branch for development' + 'cherry-pick:Cherry-pick a change.' + 'diff:Show changes between commit and working tree' + 'download:Download and checkout a change' + 'forall:execute command on several project' + 'grep:Print lines matching a pattern' + 'help:Display detailed help on a command' + 'init:Initialize repo in the current directory' + 'list:List projects and their associated directories' + 'manifest:Manifest inspection utility' + 'overview:Display overview of unmerged project branches' + 'prune:Prune (delete) already merged topics' + 'rebase:Rebase local branches on upstream branch' + 'selfupdate:Update repo to the latest version' + 'smartsync:Update working tree to the latest known good revision' + 'stage:Stage file(s) for commit' + 'start:Start a new branch for development' + 'status:Show the working tree status' + 'sync:Update working tree to the latest revision' + 'upload:Upload changes for code review' + 'version:Display the version of repo' + ) + _describe -t commands 'command' commands && ret=0 + else + local commands; + commands=( + 'init:Install repo in the current working directory' + 'help:Display detailed help on a command' + ) + _describe -t commands 'command' commands && ret=0 + fi + ;; + (args) + case $words[1] in + (branch | branches) + # TODO : list available projects and add them in list to feed compadd with + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + ': :__repo_projects' \ + && ret=0 + ;; + (abandon) + # TODO : list available projects and add them in list to feed compadd with + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + ':branch name:__repo_branch' \ + ': :__repo_projects'\ + && ret=0 + ;; + (checkout) + # TODO : list available projects and add them in list to feed compadd with + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + ':branch name:__repo_branch' \ + ': :__repo_projects'\ + && ret=0 + ;; + (init) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(-q --quiet)"{-q,--quiet}"[be quiet]" \ + "(-u --manifest-url)"{-u,--manifest-url=}"[manifest repository location]":url:__repo_url_prompt \ + "(-b --manifest-branch)"{-b,--manifest-branch=}"[manifest branch or revision]":branch:__repo_branch\ + "(-m --manifest-name)"{-m,--manifest-name=}"[initial manifest file]":manifest_name:__repo_manifest_name\ + "(--mirror)--mirror[mirror the forrest]"\ + "(--reference)--reference=[location of mirror directory]":dir:_dirs\ + "(--depth)--depth=[create a shallow clone with given depth; see git clone]":depth:__repo_depth_prompt\ + "(-g --group=)"{-g,--group=}"[restrict manifest projects to ones with a specified group]":group:_group\ + "(-p --platform=)"{-p,--platform=}"[restrict manifest projects to ones with a specified platform group(auto|all|none|linux|darwin|...)]":platform:"(auto all none linux darwin)"\ + "(--repo-url)--repo-url=[repo repository location]":url:__repo_url_prompt\ + "(--repo-branch)--repo-branch[repo branch or revision]":branch_or_rev:__repo__repo_branch_or_rev\ + "(--no-repo-verify)--no-repo-verify[do not verify repo source code]"\ + "(--config-name)--config-name[Always prompt for name/e-mail]"\ + && ret=0 + ;; + (start) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(--all)--all=[begin branch in all projects]"\ + ':branch name:__repo_new__repo_branch_name' \ + ':projects:__repo_projects_or_all' \ + && ret=0 + ;; + (rebase) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(-i --interactive)"{-i,--interactive}"[interactive rebase (single project only)]: :__repo_projects" \ + "(-f --force-rebase)"{-f,--force-rebase}"[Pass --force-rebase to git rebase]" \ + "(--no-ff)--no-ff=[Pass --no-ff to git rebase]"\ + "(-q --quiet)"{-q,--quiet}"[Pass --quiet to git rebase]" \ + "(--autosquash)--no-ff[Pass --autosquash to git rebase]"\ + "(--whitespace=)--whitespace=[Pass --whitespace to git rebase]: :__git_apply_whitespace_strategies"\ + "(--auto-stash)--auto-stash[Stash local modifications before starting]"\ + && ret=0 + ;; + (checkout) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + ':branch name:__git_branch_names' \ + ':projects:__repo_projects' \ + && ret=0 + ;; + (list) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + && ret=0 + ;; + (status) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(-j --jobs)"{-j,--jobs}"[number of projects to check simultaneously]" \ + ':projects:__repo_projects' \ + && ret=0 + ;; + (sync) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(--no-force-broken)--no-force-broken[stop sync if a project fails to sync (probably because of permissions)]" \ + "(-l --local-only)"{-l,--local-only}"[only update working tree, don't fetch]" \ + "(-n --network-only)"{-n,--network-branch}"[fetch only, don't update working tree]" \ + "(-d --detach)"{-d,--detach}"[detach projects back to manifest revision]" \ + "(-c --current-branch)"{-c,--current-branch}"[fetch only current branch from server]" \ + "(-q --quiet)"{-q,--quiet}"[be more quiet]" \ + "(-j --jobs=)"{-j,--jobs=}"[projects to fetch simultaneously (default 1) (limited to 5)]:projects to fetch simultaneously (default 1) (limited to 5)" \ + "(-m --manifest-name=)"{-m,--manifest-name=}"[temporary manifest to use for this sync]:manifest xml file:_files -g *.xml" \ + "(--no-clone-bundle)--no-clone-bundle[disable use of /clone.bundle on HTTP/HTTPS]" \ + "(-s --smart-sync)"{-s,--smart-sync=}"[smart sync using manifest from a known tag]:tag:" \ + '(--no-repo-verify)--no-repo-verify[do not verify repo source code]' \ + ': :__repo_projects' \ + && ret=0 + ;; + (upload) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(-t)-t[Send local branch name to Gerrit Code Review]" \ + "(--re= --reviewers=)"{--re=,--reviewers=}"[Request reviews from these people]:Request reviews from these people:" \ + "(--cc=)--cc=[Also send email to these email addresses.]:email addresses:_email_addresses" \ + "(--br=)--br=[Branch to upload.]:branch:__repo_branch" \ + "(--cbr --current-branch)"{--cbr,--current-branch}"[Upload current git branch]" \ + "(-d --draft)"{-d,--draft}"[If specified, upload as a draft.]" \ + "(--verify --no-verify)--no-verify[Do not run the upload hook.]" \ + '(--verify --no-verify)--verify[Run the upload hook without prompting]' \ + ': :__repo_projects' \ + && ret=0 + ;; + (forall) + _arguments : \ + "(-h --help)"{-h,--help}"[Show help]" \ + "(-v --verbose)"{-v,--verbose}"[Show command error messages]" \ + '(-p)-p[Show project headers before output]' \ + ': :__repo_projects_mandatory' \ + "(-c --command -h --help -v --verbose -p)"{-c,--command}"[Command (and arguments) to execute]" \ + && ret=0 + ;; + *) + ret=0 + esac + ;; + esac + + return $ret +} + +__repo_reviewers() +{ + # _message -e url 'reviewers' +} + +__repo_url_prompt() +{ + _message -e url 'url' +} + +__repo_manifest_name() +{ + _message -e manifest_name 'manifest name' +} + +_group() +{ + _message -e group 'group' +} + +__repo_branch() +{ + #_message -e branch 'Repo branch' + branches=($(repo branches| cut -c4- | grep '|' | cut -d' ' -f1)) + _describe -t branches 'Select repo branch' branches +} + +__repo__repo_branch_or_rev() +{ + _message -e branch_or_rev 'repo branch or revision' +} + +__repo_depth_prompt() +{ + _message -e depth 'depth' +} + +__repo_projects() +{ + _message -e depth 'Optional option : <projects>...' + projects=($(repo list | cut -d' ' -f1)) + _describe -t projects 'Select projects (keep empty for selecting all projects)' projects +} + +__repo_projects_mandatory() +{ + projects=($(repo list | cut -d' ' -f1)) + #_describe -t projects 'Select projects to apply commands' projects + _values -s ' ' "Select projects to apply commands" $projects +} + +__repo_new__repo_branch_name() +{ + branches=($(repo branches| cut -c4- | grep '|' | cut -d' ' -f1)) + _describe "" branches + _message -e "branch name" 'Enter new branch name or select an existing repo branch' +} + +__repo_projects_or_all() +{ + #_message -e depth '[--all | <project>...]' + + projects=(--all $(repo list | cut -d' ' -f1)) + _describe -t projects 'Select projects or --all' projects + _describe -t --all 'All projects' +} + +_repo "$@" +return $? + diff --git a/plugins/repo/repo.plugin.zsh b/plugins/repo/repo.plugin.zsh new file mode 100644 index 000000000..9cc336959 --- /dev/null +++ b/plugins/repo/repo.plugin.zsh @@ -0,0 +1,2 @@ +# Aliases +alias r='repo' diff --git a/plugins/rvm/rvm.plugin.zsh b/plugins/rvm/rvm.plugin.zsh index cdd0a7847..3bde154df 100644 --- a/plugins/rvm/rvm.plugin.zsh +++ b/plugins/rvm/rvm.plugin.zsh @@ -3,9 +3,9 @@ fpath=($rvm_path/scripts/zsh/Completion $fpath) alias rubies='rvm list rubies' alias gemsets='rvm gemset list' -local ruby18='ruby-1.8.7-p371' -local ruby19='ruby-1.9.3-p392' -local ruby20='ruby-2.0.0-p0' +local ruby18='ruby-1.8.7' +local ruby19='ruby-1.9.3' +local ruby20='ruby-2.0.0' function rb18 { if [ -z "$1" ]; then @@ -31,7 +31,7 @@ compdef _rb19 rb19 function rb20 { if [ -z "$1" ]; then - rvm use "$ruby" + rvm use "$ruby20" else rvm use "$ruby20@$1" fi @@ -42,7 +42,6 @@ compdef _rb20 rb20 function rvm-update { rvm get head - rvm reload # TODO: Reload rvm completion? } # TODO: Make this usable w/o rvm. diff --git a/plugins/sfffe/sfffe.plugin.zsh b/plugins/sfffe/sfffe.plugin.zsh new file mode 100644 index 000000000..a0f034908 --- /dev/null +++ b/plugins/sfffe/sfffe.plugin.zsh @@ -0,0 +1,28 @@ +# ------------------------------------------------------------------------------ +# FILE: sfffe.plugin.zsh +# DESCRIPTION: search file for FE +# AUTHOR: yleo77 (ylep77@gmail.com) +# VERSION: 0.1 +# REQUIRE: ack +# ------------------------------------------------------------------------------ + +if [ ! -x $(which ack) ]; then + echo \'ack\' is not installed! + exit -1 +fi + +ajs() { + ack "$@" --type js +} + +acss() { + ack "$@" --type css +} + +fjs() { + find ./ -name "$@*" -type f | grep '\.js' +} + +fcss() { + find ./ -name "$@*" -type f | grep '\.css' +} diff --git a/plugins/ssh-agent/ssh-agent.plugin.zsh b/plugins/ssh-agent/ssh-agent.plugin.zsh index 7468749f8..a1e64ad0f 100644 --- a/plugins/ssh-agent/ssh-agent.plugin.zsh +++ b/plugins/ssh-agent/ssh-agent.plugin.zsh @@ -9,7 +9,7 @@ # To load multiple identities use the identities style, For # example: # -# zstyle :omz:plugins:ssh-agent id_rsa id_rsa2 id_github +# zstyle :omz:plugins:ssh-agent identities id_rsa id_rsa2 id_github # # To set the maximum lifetime of the identities, use the # lifetime style. The lifetime may be specified in seconds @@ -57,7 +57,7 @@ if [[ ${_plugin__forwarding} == "yes" && -n "$SSH_AUTH_SOCK" ]]; then elif [ -f "${_plugin__ssh_env}" ]; then # Source SSH settings, if applicable . ${_plugin__ssh_env} > /dev/null - ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { + ps x | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null || { _plugin__start_agent; } else diff --git a/plugins/sublime/sublime.plugin.zsh b/plugins/sublime/sublime.plugin.zsh index 82faf87c9..566279183 100755 --- a/plugins/sublime/sublime.plugin.zsh +++ b/plugins/sublime/sublime.plugin.zsh @@ -2,29 +2,32 @@ local _sublime_darwin_paths > /dev/null 2>&1 _sublime_darwin_paths=( - "/usr/local/bin/subl" - "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" - "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" - "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" - "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" + "/usr/local/bin/subl" + "$HOME/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl" + "$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" + "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" + "/Applications/Sublime Text 3.app/Contents/SharedSupport/bin/subl" + "/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl" + "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl" ) if [[ $('uname') == 'Linux' ]]; then - if [ -f '/usr/bin/sublime_text' ]; then - st_run() { nohup /usr/bin/sublime_text $@ > /dev/null & } - else - st_run() { nohup /usr/bin/sublime-text $@ > /dev/null & } - fi - alias st=st_run + if [ -f '/usr/bin/sublime_text' ]; then + st_run() { nohup /usr/bin/sublime_text $@ > /dev/null & } + else + st_run() { nohup /usr/bin/sublime-text $@ > /dev/null & } + fi + alias st=st_run elif [[ $('uname') == 'Darwin' ]]; then - for _sublime_path in $_sublime_darwin_paths; do - if [[ -a $_sublime_path ]]; then - alias st="'$_sublime_path'" - break - fi - done + for _sublime_path in $_sublime_darwin_paths; do + if [[ -a $_sublime_path ]]; then + alias subl="'$_sublime_path'" + alias st=subl + break + fi + done fi alias stt='st .' diff --git a/plugins/sudo/sudo.zsh b/plugins/sudo/sudo.zsh new file mode 100644 index 000000000..d12e06853 --- /dev/null +++ b/plugins/sudo/sudo.zsh @@ -0,0 +1,22 @@ +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# sudo will be inserted before the command +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Dongweiming <ciici123@gmail.com> +# +# ------------------------------------------------------------------------------ + +sudo-command-line() { +[[ -z $BUFFER ]] && zle up-history +[[ $BUFFER != sudo\ * ]] && BUFFER="sudo $BUFFER" +zle end-of-line +} +zle -N sudo-command-line +# Defined shortcut keys: [Esc] [Esc] +bindkey "\e\e" sudo-command-line diff --git a/plugins/supervisor/_supervisord b/plugins/supervisor/_supervisord index 34d27805d..e0cb670e1 100644 --- a/plugins/supervisor/_supervisord +++ b/plugins/supervisor/_supervisord @@ -7,6 +7,7 @@ _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]:" \ + {--version,-v}"[print supervisord version number 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]" \ diff --git a/plugins/suse/suse.plugin.zsh b/plugins/suse/suse.plugin.zsh index d46286948..afd8ecabd 100644 --- a/plugins/suse/suse.plugin.zsh +++ b/plugins/suse/suse.plugin.zsh @@ -1,7 +1,61 @@ -alias zi='sudo zypper install' -alias zrf='sudo zypper refresh' -alias zs='zypper search' -alias zup='sudo zypper dist-upgrade' -alias zrm='sudo zypper remove' -alias zp='sudo zypper patch' -alias zps='sudo zypper ps' +#Alias for Zypper according to the offical Zypper's alias + +#Main commands +alias z='sudo zypper' #call zypper +alias zh='sudo zypper -h' #print help +alias zhse='sudo zypper -h se' #print help for the search command +alias zlicenses='sudo zypper licenses' #prints a report about licenses and EULAs of installed packages +alias zps='sudo zypper ps' #list process using deleted files +alias zshell='sudo zypper shell' #open a zypper shell session +alias zsource-download='sudo zypper source-download' #download source rpms for all installed packages +alias ztos='sudo zypper tos' #shows the ID string of the target operating system +alias zvcmp='sudo zypper vcmp' #tell whether version1 is older or newer than version2 + +#Packages commands +alias zin='sudo zypper in' #install packages +alias zinr='sudo zypper inr' #install newly added packages recommended by already installed ones +alias zrm='sudo zypper rm' #remove packages +alias zsi='sudo zypper si' #install source of a package +alias zve='sudo zypper ve' #verify dependencies of installed packages + +#Updates commands +alias zdup='sudo zypper dup' #upgrade packages +alias zlp='sudo zypper lp' #list necessary patchs +alias zlu='sudo zypper lu' #list updates +alias zpchk='sudo zypper pchk' #check for patches +alias zup='sudo zypper up' #update packages +alias zpatch='sudo zypper patch' #install patches + +#Request commands +alias zif='sudo zypper if' #display info about packages +alias zpa='sudo zypper pa' #list packages +alias zpatch-info='sudo zypper patch-info' #display info about patches +alias zpattern-info='sudo zypper patch-info' #display info about patterns +alias zproduct-info='sudo zypper patch-info' #display info about products +alias zpch='sudo zypper pch' #list all patches +alias zpd='sudo zypper pd' #list products +alias zpt='sudo zypper pt' #list patterns +alias zse='sudo zypper se' #search for packages +alias zwp='sudo zypper wp' #list all packages providing the specified capability + +#Repositories commands +alias zar='sudo zypper ar' #add a repository +alias zcl='sudo zypper clean' #clean cache +alias zlr='sudo zypper lr' #list repositories +alias zmr='sudo zypper mr' #modify repositories +alias znr='sudo zypper nr' #rename repositories (for the alias only) +alias zref='sudo zypper ref' #refresh repositories +alias zrr='sudo zypper rr' #remove repositories + +#Services commands +alias zas='sudo zypper as' #adds a service specified by URI to the system +alias zms='sudo zypper ms' #modify properties of specified services +alias zrefs='sudo zypper refs' #refreshing a service mean executing the service's special task +alias zrs='sudo zypper rs' #remove specified repository index service from the sytem +alias zls='sudo zypper ls' #list services defined on the system + +#Package Locks Management commands +alias zal='sudo zypper al' #add a package lock +alias zcl='sudo zypper cl' #Remove unused locks +alias zll='sudo zypper ll' #list currently active package locks +alias zrl='sudo zypper rl' #remove specified package lock diff --git a/plugins/symfony/symfony.plugin.zsh b/plugins/symfony/symfony.plugin.zsh index 9de767548..f070e9e47 100644 --- a/plugins/symfony/symfony.plugin.zsh +++ b/plugins/symfony/symfony.plugin.zsh @@ -1,7 +1,7 @@ # symfony basic command completion _symfony_get_command_list () { - ./symfony | sed "1,/Available tasks/d" | awk 'BEGIN { cat=null; } /^[A-Za-z]+$/ { cat = $1; } /^ :[a-z]+/ { print cat $1; }' + php symfony | sed "1,/Available tasks/d" | awk 'BEGIN { cat=null; } /^[A-Za-z]+$/ { cat = $1; } /^ :[a-z]+/ { print cat $1; }' } _symfony () { diff --git a/plugins/systemadmin/systemadmin.zsh b/plugins/systemadmin/systemadmin.zsh new file mode 100644 index 000000000..f5e44c66f --- /dev/null +++ b/plugins/systemadmin/systemadmin.zsh @@ -0,0 +1,159 @@ +# ------------------------------------------------------------------------------ +# Description +# ----------- +# +# This is one for the system administrator, operation and maintenance. +# Some of which come from http://justinlilly.com/dotfiles/zsh.html +# +# ------------------------------------------------------------------------------ +# Authors +# ------- +# +# * Dongweiming <ciici123@gmail.com> +# +# ------------------------------------------------------------------------------ + +function retval() { + if [[ -z $1 ]];then + echo '.' + else + echo $1 + fi +} + +function retlog() { + if [[ -z $1 ]];then + echo '/var/log/nginx/access.log' + else + echo $1 + fi +} + +alias ping='ping -c 5' +alias clr='clear;echo "Currently logged in on $(tty), as $(whoami) in directory $(pwd)."' +alias path='echo -e ${PATH//:/\\n}' +alias mkdir='mkdir -pv' +# get top process eating memory +alias psmem='ps -e -orss=,args= | sort -b -k1,1n' +alias psmem10='ps -e -orss=,args= | sort -b -k1,1n| head -10' +# get top process eating cpu if not work try excute : export LC_ALL='C' +alias pscpu='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1 -nr' +alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1 -nr | head -10' +# top10 of the history +alias hist10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10' + +# directory LS +dls () { + ls -l | grep "^d" | awk '{ print $9 }' | tr -d "/" +} +psgrep() { + ps aux | grep "$(retval $1)" | grep -v grep +} +# Kills any process that matches a regexp passed to it +killit() { + ps aux | grep -v "grep" | grep "$@" | awk '{print $2}' | xargs sudo kill +} + +# list contents of directories in a tree-like format +if [ -z "\${which tree}" ]; then + tree () { + find $@ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' + } +fi + +# Sort connection state +sortcons() { + netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn +} + +# View all 80 Port Connections +con80() { + netstat -nat|grep -i ":80"|wc -l +} + +# On the connected IP sorted by the number of connections +sortconip() { + netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n +} + +# top20 of Find the number of requests on 80 port +req20() { + netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20 +} + +# top20 of Using tcpdump port 80 access to view +http20() { + sudo tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20 +} + +# top20 of Find time_wait connection +timewait20() { + netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20 +} + +# top20 of Find SYN connection +syn20() { + netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr|head -n20 +} + +# Printing process according to the port number +port_pro() { + netstat -ntlp | grep "$(retval $1)" | awk '{print $7}' | cut -d/ -f1 +} + +# top10 of gain access to the ip address +accessip10() { + awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}' "$(retlog)" +} + +# top20 of Most Visited file or page +visitpage20() { + awk '{print $11}' "$(retlog)"|sort|uniq -c|sort -nr|head -20 +} + +# top100 of Page lists the most time-consuming (more than 60 seconds) as well as the corresponding page number of occurrences +consume100() { + awk '($NF > 60 && $7~/\.php/){print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -100 + # if django website or other webiste make by no suffix language + # awk '{print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -100 +} + +# Website traffic statistics (G) +webtraffic() { + awk "{sum+=$10} END {print sum/1024/1024/1024}" "$(retlog)" +} + +# Statistical connections 404 +c404() { + awk '($9 ~/404/)' "$(retlog)" | awk '{print $9,$7}' | sort +} + +# Statistical http status. +httpstatus() { + awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' "$(retlog)" +} + +# Delete 0 byte file +d0() { + find "$(retval $1)" -type f -size 0 -exec rm -rf {} \; +} + +# gather external ip address +geteip() { + curl http://ifconfig.me +} + +# determine local IP address +getip() { + ifconfig | grep 'inet addr:'| grep -v '127.0.0.1' | cut -d: -f2 | awk '{ print $1}' +} + +# Clear zombie processes +clrz() { + ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9 +} + +# Second concurrent +conssec() { + awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' "$(retlog)"|sort -k 2 -nr|head -n10 +} diff --git a/plugins/terminalapp/terminalapp.plugin.zsh b/plugins/terminalapp/terminalapp.plugin.zsh index 2249b1e2f..6e47ee188 100644 --- a/plugins/terminalapp/terminalapp.plugin.zsh +++ b/plugins/terminalapp/terminalapp.plugin.zsh @@ -32,7 +32,7 @@ if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then # Register the function so it is called whenever the working # directory changes. autoload add-zsh-hook - add-zsh-hook chpwd update_terminal_cwd + add-zsh-hook precmd update_terminal_cwd # Tell the terminal about the initial directory. update_terminal_cwd diff --git a/plugins/themes/themes.plugin.zsh b/plugins/themes/themes.plugin.zsh index 8bab257ea..7519b0253 100644 --- a/plugins/themes/themes.plugin.zsh +++ b/plugins/themes/themes.plugin.zsh @@ -1,6 +1,6 @@ function theme { - if [ "$1" = "random" ]; then + if [ -z "$1" ] || [ "$1" = "random" ]; then themes=($ZSH/themes/*zsh-theme) N=${#themes[@]} ((N=(RANDOM%N)+1)) diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 465f5b053..626c41f3d 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -1,3 +1,11 @@ +# +# Aliases +# + +alias ta='tmux attach -t' +alias ts='tmux new-session -s' +alias tl='tmux list-sessions' + # Only run if tmux is actually installed if which tmux &> /dev/null then @@ -14,6 +22,8 @@ if which tmux &> /dev/null [[ -n "$ZSH_TMUX_AUTOQUIT" ]] || ZSH_TMUX_AUTOQUIT=$ZSH_TMUX_AUTOSTART # Set term to screen or screen-256color based on current terminal support [[ -n "$ZSH_TMUX_FIXTERM" ]] || ZSH_TMUX_FIXTERM=true + # Set '-CC' option for iTerm2 tmux integration + [[ -n "$ZSH_TMUX_ITERM2" ]] || ZSH_TMUX_ITERM2=false # The TERM to use for non-256 color terminals. # Tmux states this should be screen, but you may need to change it on # systems without the proper terminfo @@ -36,7 +46,7 @@ if which tmux &> /dev/null fi # Set the correct local config file to use. - if [[ -f $HOME/.tmux.conf || -h $HOME/.tmux.conf ]] + if [[ "$ZSH_TMUX_ITERM2" == "false" ]] && [[ -f $HOME/.tmux.conf || -h $HOME/.tmux.conf ]] then #use this when they have a ~/.tmux.conf export _ZSH_TMUX_FIXED_CONFIG="$zsh_tmux_plugin_path/tmux.extra.conf" @@ -55,11 +65,11 @@ if which tmux &> /dev/null # Try to connect to an existing session. elif [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] then - \tmux attach || \tmux `[[ "$ZSH_TMUX_FIXTERM" == "true" ]] && echo '-f '$_ZSH_TMUX_FIXED_CONFIG` new-session + \tmux `[[ "$ZSH_TMUX_ITERM2" == "true" ]] && echo '-CC '` attach || \tmux `[[ "$ZSH_TMUX_ITERM2" == "true" ]] && echo '-CC '` `[[ "$ZSH_TMUX_FIXTERM" == "true" ]] && echo '-f '$_ZSH_TMUX_FIXED_CONFIG` new-session [[ "$ZSH_TMUX_AUTOQUIT" == "true" ]] && exit # Just run tmux, fixing the TERM variable if requested. else - \tmux `[[ "$ZSH_TMUX_FIXTERM" == "true" ]] && echo '-f '$_ZSH_TMUX_FIXED_CONFIG` + \tmux `[[ "$ZSH_TMUX_ITERM2" == "true" ]] && echo '-CC '` `[[ "$ZSH_TMUX_FIXTERM" == "true" ]] && echo '-f '$_ZSH_TMUX_FIXED_CONFIG` [[ "$ZSH_TMUX_AUTOQUIT" == "true" ]] && exit fi } diff --git a/plugins/urltools/urltools.plugin.zsh b/plugins/urltools/urltools.plugin.zsh index 4ddfff8ce..22327334d 100644 --- a/plugins/urltools/urltools.plugin.zsh +++ b/plugins/urltools/urltools.plugin.zsh @@ -14,6 +14,9 @@ if [[ $(whence node) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD elif [[ $(whence python) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xpython" ) ]]; then alias urlencode='python -c "import sys, urllib as ul; print ul.quote_plus(sys.argv[1])"' alias urldecode='python -c "import sys, urllib as ul; print ul.unquote_plus(sys.argv[1])"' +elif [[ $(whence xxd) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xshell" ) ]]; then + function urlencode() {echo $@ | tr -d "\n" | xxd -plain | sed "s/\(..\)/%\1/g"} + function urldecode() {printf $(echo -n $@ | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g')"\n"} elif [[ $(whence ruby) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHOD" = "xruby" ) ]]; then alias urlencode='ruby -r cgi -e "puts CGI.escape(ARGV[0])"' alias urldecode='ruby -r cgi -e "puts CGI.unescape(ARGV[0])"' @@ -33,4 +36,4 @@ elif [[ $(whence perl) != "" && ( "x$URLTOOLS_METHOD" = "x" || "x$URLTOOLS_METHO fi fi -unset URLTOOLS_METHOD
\ No newline at end of file +unset URLTOOLS_METHOD diff --git a/plugins/virtualenv/virtualenv.plugin.zsh b/plugins/virtualenv/virtualenv.plugin.zsh index e8458389f..8e06450b1 100644 --- a/plugins/virtualenv/virtualenv.plugin.zsh +++ b/plugins/virtualenv/virtualenv.plugin.zsh @@ -1,9 +1,8 @@ function virtualenv_prompt_info(){ - local virtualenv_path="$VIRTUAL_ENV" - if [[ -n $virtualenv_path ]]; then - local virtualenv_name=`basename $virtualenv_path` - printf "%s[%s] " "%{${fg[yellow]}%}" $virtualenv_name + if [[ -n $VIRTUAL_ENV ]]; then + printf "%s[%s] " "%{${fg[yellow]}%}" ${${VIRTUAL_ENV}:t} fi } +# disables prompt mangling in virtual_env/bin/activate export VIRTUAL_ENV_DISABLE_PROMPT=1 diff --git a/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh b/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh index 35de50874..670c287bd 100644 --- a/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh +++ b/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh @@ -1,10 +1,9 @@ -wrapsource=`which virtualenvwrapper_lazy.sh` - -if [[ -f "$wrapsource" ]]; then - source $wrapsource +virtualenvwrapper='virtualenvwrapper_lazy.sh' +if (( $+commands[$virtualenvwrapper] )); then + source ${${virtualenvwrapper}:c} if [[ ! $DISABLE_VENV_CD -eq 1 ]]; then - # Automatically activate Git projects' virtual environments based on the + # Automatically activate Git projects's virtual environments based on the # directory name of the project. Virtual environment name can be overridden # by placing a .venv file in the project root with a virtualenv name in it function workon_cwd { @@ -40,11 +39,17 @@ if [[ -f "$wrapsource" ]]; then fi } - # New cd function that does the virtualenv magic - function cd { - builtin cd "$@" && workon_cwd - } + # Append workon_cwd to the chpwd_functions array, so it will be called on cd + # http://zsh.sourceforge.net/Doc/Release/Functions.html + # TODO: replace with 'add-zsh-hook chpwd workon_cwd' when oh-my-zsh min version is raised above 4.3.4 + if (( ${+chpwd_functions} )); then + if (( $chpwd_functions[(I)workon_cwd] == 0 )); then + set -A chpwd_functions $chpwd_functions workon_cwd + fi + else + set -A chpwd_functions workon_cwd + fi fi else - print "zsh virtualenvwrapper plugin: Cannot find virtualenvwrapper_lazy.sh. Please install with \`pip install virtualenvwrapper\`." + print "zsh virtualenvwrapper plugin: Cannot find ${virtualenvwrapper}. Please install with \`pip install virtualenvwrapper\`." fi diff --git a/plugins/wd2/wd2/wd.plugin.zsh b/plugins/wd2/wd2/wd.plugin.zsh new file mode 100755 index 000000000..e0846ffd9 --- /dev/null +++ b/plugins/wd2/wd2/wd.plugin.zsh @@ -0,0 +1,9 @@ +#!/bin/zsh + +# WARP +# ==== +# oh-my-zsh plugin +# +# @github.com/mfaerevaag/wd + +alias wd='. ~/.oh-my-zsh/plugins/wd/wd.sh' diff --git a/plugins/wd2/wd2/wd.sh b/plugins/wd2/wd2/wd.sh new file mode 100755 index 000000000..7852028c0 --- /dev/null +++ b/plugins/wd2/wd2/wd.sh @@ -0,0 +1,201 @@ +#!/bin/zsh + +# WARP +# ==== +# Jump to custom directories in terminal +# because `cd` takes too long... +# +# @github.com/mfaerevaag/wd + + +## variables +CONFIG=$HOME/.warprc + +## colors +BLUE="\033[96m" +GREEN="\033[92m" +YELLOW="\033[93m" +RED="\033[91m" +NOC="\033[m" + + +## load warp points +typeset -A points +while read line +do + arr=(${(s,:,)line}) + key=${arr[1]} + val=${arr[2]} + + points[$key]=$val +done < $CONFIG + + +## functions +# prepended wd_ to not conflict with your environment (no sub shell) + +wd_warp() +{ + if [[ $1 =~ "^\.+$" ]] + then + if [[ $#1 < 2 ]] + then + wd_print_msg $YELLOW "Warping to current directory?" + else + (( n = $#1 - 1 )) + wd_print_msg $BLUE "Warping..." + cd -$n > /dev/null + fi + elif [[ ${points[$1]} != "" ]] + then + wd_print_msg $BLUE "Warping..." + cd ${points[$1]} + else + wd_print_msg $RED "Unkown warp point '$1'" + fi +} + +wd_add() +{ + if [[ $1 =~ "^\.+$" ]] + then + wd_print_msg $RED "Illeagal warp point (see README)." + elif [[ ${points[$1]} == "" ]] || $2 + then + wd_remove $1 > /dev/null + print "$1:$PWD" >> $CONFIG + wd_print_msg $GREEN "Warp point added" + else + wd_print_msg $YELLOW "Warp point '$1' alredy exists. Use 'add!' to overwrite." + fi +} + +wd_remove() +{ + if [[ ${points[$1]} != "" ]] + then + if wd_tmp=`sed "/^$1:/d" $CONFIG` + then + echo $wd_tmp > $CONFIG + wd_print_msg $GREEN "Warp point removed" + else + wd_print_msg $RED "Warp point unsuccessfully removed. Sorry!" + fi + else + wd_print_msg $RED "Warp point was not found" + fi +} + +wd_show() +{ + wd_print_msg $BLUE "Warp points to current directory:" + wd_list_all | grep $PWD$ +} + +wd_list_all() +{ + wd_print_msg $BLUE "All warp points:" + while read line + do + if [[ $line != "" ]] + then + arr=(${(s,:,)line}) + key=${arr[1]} + val=${arr[2]} + + print "\t" $key "\t -> \t" $val + fi + done < $CONFIG +} + +wd_print_msg() +{ + if [[ $1 == "" || $2 == "" ]] + then + print " $RED*$NOC Could not print message. Sorry!" + else + print " $1*$NOC $2" + fi +} + +wd_print_usage() +{ + print "Usage: wd [add|-a|--add] [rm|-r|--remove] [ls|-l|--list] <point>" + print "\nCommands:" + print "\t add \t Adds the current working directory to your warp points" + print "\t add! \t Overwrites existing warp point" + print "\t remove Removes the given warp point" + print "\t list \t Outputs all stored warp points" + print "\t help \t Show this extremely helpful text" +} + + +## run + +# get opts +args=`getopt -o a:r:lhs -l add:,remove:,list,help,show -- $*` + +if [[ $? -ne 0 || $#* -eq 0 ]] +then + wd_print_usage +else + # can't exit, as this would exit the excecuting shell + # e.i. your terminal + + #set -- $args # WTF + + for i + do + case "$i" + in + -a|--add|add) + wd_add $2 false + shift + shift + break + ;; + -a!|--add!|add!) + wd_add $2 true + shift + shift + break + ;; + -r|--remove|rm) + wd_remove $2 + shift + shift + break + ;; + -l|--list|ls) + wd_list_all + shift + break + ;; + -h|--help|help) + wd_print_usage + shift + break + ;; + -s|--show|show) + wd_show + shift + break + ;; + *) + wd_warp $i + shift + break + ;; + --) + shift; break;; + esac + done +fi + + +## garbage collection +# if not, next time warp will pick up variables from this run +# remember, there's no sub shell +points="" +args="" +unhash -d val &> /dev/null # fixes issue #1 diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index 6b6de2b15..8eedb90ee 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -11,7 +11,7 @@ function web_search() { fi # check whether the search engine is supported - if [[ ! $1 =~ '(google|bing|yahoo)' ]]; + if [[ ! $1 =~ '(google|bing|yahoo|duckduckgo)' ]]; then echo "Search engine $1 not supported." return 1 @@ -24,8 +24,12 @@ function web_search() { $open_cmd "$url" return fi - - url="${url}/search?q=" + if [[ $1 == 'duckduckgo' ]]; then + #slightly different search syntax for DDG + url="${url}/?q=" + else + url="${url}/search?q=" + fi shift # shift out $1 while [[ $# -gt 0 ]]; do @@ -34,10 +38,19 @@ function web_search() { done url="${url%?}" # remove the last '+' - + $open_cmd "$url" } + alias bing='web_search bing' alias google='web_search google' alias yahoo='web_search yahoo' +alias ddg='web_search duckduckgo' +#add your own !bang searches here +alias wiki='web_search duckduckgo \!w' +alias news='web_search duckduckgo \!n' +alias youtube='web_search duckduckgo \!yt' +alias map='web_search duckduckgo \!m' +alias image='web_search duckduckgo \!i' +alias ducky='web_search duckduckgo \!' diff --git a/plugins/z/Makefile b/plugins/z/Makefile new file mode 100644 index 000000000..dcf433d40 --- /dev/null +++ b/plugins/z/Makefile @@ -0,0 +1,4 @@ +readme: + @groff -man -Tascii z.1 | col -bx + +.PHONY: readme diff --git a/plugins/z/README b/plugins/z/README new file mode 100644 index 000000000..ec5abc6f5 --- /dev/null +++ b/plugins/z/README @@ -0,0 +1,135 @@ +Z(1) User Commands Z(1) + + + +NAME + z - jump around + +SYNOPSIS + z [-chlrt] [regex1 regex2 ... regexn] + +AVAILABILITY + bash, zsh + +DESCRIPTION + Tracks your most used directories, based on 'frecency'. + + After a short learning phase, z will take you to the most 'frecent' + directory that matches ALL of the regexes given on the command line. + +OPTIONS + -c restrict matches to subdirectories of the current directory. + + -h show a brief help message + + -l list only + + -r match by rank only + + -t match by recent access only + +EXAMPLES + z foo cd to most frecent dir matching foo + + z foo bar cd to most frecent dir matching foo and bar + + z -r foo cd to highest ranked dir matching foo + + z -t foo cd to most recently accessed dir matching foo + + z -l foo list all dirs matching foo (by frecency) + +NOTES + Installation: + Put something like this in your $HOME/.bashrc or $HOME/.zshrc: + + . /path/to/z.sh + + cd around for a while to build up the db. + + PROFIT!! + + Optionally: + Set $_Z_CMD to change the command name (default z). + Set $_Z_DATA to change the datafile (default $HOME/.z). + Set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution. + Set $_Z_NO_PROMPT_COMMAND to handle PROMPT_COMMAND/precmd your- + self. + Set $_Z_EXCLUDE_DIRS to an array of directories to exclude. + (These settings should go in .bashrc/.zshrc before the lines + added above.) + Install the provided man page z.1 somewhere like + /usr/local/man/man1. + + Aging: + The rank of directories maintained by z undergoes aging based on a sim- + ple formula. The rank of each entry is incremented every time it is + accessed. When the sum of ranks is greater than 6000, all ranks are + multiplied by 0.99. Entries with a rank lower than 1 are forgotten. + + Frecency: + Frecency is a portmantaeu of 'recent' and 'frequency'. It is a weighted + rank that depends on how often and how recently something occured. As + far as I know, Mozilla came up with the term. + + To z, a directory that has low ranking but has been accessed recently + will quickly have higher rank than a directory accessed frequently a + long time ago. + + Frecency is determined at runtime. + + Common: + When multiple directories match all queries, and they all have a common + prefix, z will cd to the shortest matching directory, without regard to + priority. This has been in effect, if undocumented, for quite some + time, but should probably be configurable or reconsidered. + + Tab Completion: + z supports tab completion. After any number of arguments, press TAB to + complete on directories that match each argument. Due to limitations of + the completion implementations, only the last argument will be com- + pleted in the shell. + + Internally, z decides you've requested a completion if the last argu- + ment passed is an absolute path to an existing directory. This may + cause unexpected behavior if the last argument to z begins with /. + +ENVIRONMENT + A function _z() is defined. + + The contents of the variable $_Z_CMD is aliased to _z 2>&1. If not set, + $_Z_CMD defaults to z. + + The environment variable $_Z_DATA can be used to control the datafile + location. If it is not defined, the location defaults to $HOME/.z. + + The environment variable $_Z_NO_RESOLVE_SYMLINKS can be set to prevent + resolving of symlinks. If it is not set, symbolic links will be + resolved when added to the datafile. + + In bash, z prepends a command to the PROMPT_COMMAND environment vari- + able to maintain its database. In zsh, z appends a function _z_precmd + to the precmd_functions array. + + The environment variable $_Z_NO_PROMPT_COMMAND can be set if you want + to handle PROMPT_COMMAND or precmd yourself. + + The environment variable $_Z_EXCLUDE_DIRS can be set to an array of + directories to exclude from tracking. $HOME is always excluded. Direc- + tories must be full paths without trailing slashes. + +FILES + Data is stored in $HOME/.z. This can be overridden by setting the + $_Z_DATA environment variable. When initialized, z will raise an error + if this path is a directory, and not function correctly. + + A man page (z.1) is provided. + +SEE ALSO + regex(7), pushd, popd, autojump, cdargs + + Please file bugs at https://github.com/rupa/z/ + + + +z January 2013 Z(1) diff --git a/plugins/z/z.1 b/plugins/z/z.1 new file mode 100644 index 000000000..022a4b35d --- /dev/null +++ b/plugins/z/z.1 @@ -0,0 +1,155 @@ +.TH "Z" "1" "January 2013" "z" "User Commands" +.SH +NAME +z \- jump around +.SH +SYNOPSIS +z [\-chlrt] [regex1 regex2 ... regexn] +.SH +AVAILABILITY +bash, zsh +.SH +DESCRIPTION +Tracks your most used directories, based on 'frecency'. +.P +After a short learning phase, \fBz\fR will take you to the most 'frecent' +directory that matches ALL of the regexes given on the command line. +.SH +OPTIONS +.TP +\fB\-c\fR +restrict matches to subdirectories of the current directory. +.TP +\fB\-h\fR +show a brief help message +.TP +\fB\-l\fR +list only +.TP +\fB\-r\fR +match by rank only +.TP +\fB\-t\fR +match by recent access only +.SH EXAMPLES +.TP 14 +\fBz foo\fR +cd to most frecent dir matching foo +.TP 14 +\fBz foo bar\fR +cd to most frecent dir matching foo and bar +.TP 14 +\fBz -r foo\fR +cd to highest ranked dir matching foo +.TP 14 +\fBz -t foo\fR +cd to most recently accessed dir matching foo +.TP 14 +\fBz -l foo\fR +list all dirs matching foo (by frecency) +.SH +NOTES +.SS +Installation: +.P +Put something like this in your \fB$HOME/.bashrc\fR or \fB$HOME/.zshrc\fR: +.RS +.P +\fB. /path/to/z.sh\fR +.RE +.P +\fBcd\fR around for a while to build up the db. +.P +PROFIT!! +.P +Optionally: +.RS +Set \fB$_Z_CMD\fR to change the command name (default \fBz\fR). +.RE +.RS +Set \fB$_Z_DATA\fR to change the datafile (default \fB$HOME/.z\fR). +.RE +.RS +Set \fB$_Z_NO_RESOLVE_SYMLINKS\fR to prevent symlink resolution. +.RE +.RS +Set \fB$_Z_NO_PROMPT_COMMAND\fR to handle \fBPROMPT_COMMAND/precmd\fR yourself. +.RE +.RS +Set \fB$_Z_EXCLUDE_DIRS\fR to an array of directories to exclude. +.RE +.RS +(These settings should go in .bashrc/.zshrc before the lines added above.) +.RE +.RS +Install the provided man page \fBz.1\fR somewhere like \fB/usr/local/man/man1\fR. +.RE +.SS +Aging: +The rank of directories maintained by \fBz\fR undergoes aging based on a simple +formula. The rank of each entry is incremented every time it is accessed. When +the sum of ranks is greater than 6000, all ranks are multiplied by 0.99. Entries +with a rank lower than 1 are forgotten. +.SS +Frecency: +Frecency is a portmantaeu of 'recent' and 'frequency'. It is a weighted rank +that depends on how often and how recently something occured. As far as I +know, Mozilla came up with the term. +.P +To \fBz\fR, a directory that has low ranking but has been accessed recently +will quickly have higher rank than a directory accessed frequently a long time +ago. +.P +Frecency is determined at runtime. +.SS +Common: +When multiple directories match all queries, and they all have a common prefix, +\fBz\fR will cd to the shortest matching directory, without regard to priority. +This has been in effect, if undocumented, for quite some time, but should +probably be configurable or reconsidered. +.SS +Tab Completion: +\fBz\fR supports tab completion. After any number of arguments, press TAB to +complete on directories that match each argument. Due to limitations of the +completion implementations, only the last argument will be completed in the +shell. +.P +Internally, \fBz\fR decides you've requested a completion if the last argument +passed is an absolute path to an existing directory. This may cause unexpected +behavior if the last argument to \fBz\fR begins with \fB/\fR. +.SH +ENVIRONMENT +A function \fB_z()\fR is defined. +.P +The contents of the variable \fB$_Z_CMD\fR is aliased to \fB_z 2>&1\fR. If not +set, \fB$_Z_CMD\fR defaults to \fBz\fR. +.P +The environment variable \fB$_Z_DATA\fR can be used to control the datafile +location. If it is not defined, the location defaults to \fB$HOME/.z\fR. +.P +The environment variable \fB$_Z_NO_RESOLVE_SYMLINKS\fR can be set to prevent +resolving of symlinks. If it is not set, symbolic links will be resolved when +added to the datafile. +.P +In bash, \fBz\fR prepends a command to the \fBPROMPT_COMMAND\fR environment +variable to maintain its database. In zsh, \fBz\fR appends a function +\fB_z_precmd\fR to the \fBprecmd_functions\fR array. +.P +The environment variable \fB$_Z_NO_PROMPT_COMMAND\fR can be set if you want to +handle \fBPROMPT_COMMAND\fR or \fBprecmd\fR yourself. +.P +The environment variable \fB$_Z_EXCLUDE_DIRS\fR can be set to an array of +directories to exclude from tracking. \fB$HOME\fR is always excluded. +Directories must be full paths without trailing slashes. +.SH +FILES +Data is stored in \fB$HOME/.z\fR. This can be overridden by setting the +\fB$_Z_DATA\fR environment variable. When initialized, \fBz\fR will raise an +error if this path is a directory, and not function correctly. +.P +A man page (\fBz.1\fR) is provided. +.SH +SEE ALSO +regex(7), pushd, popd, autojump, cdargs +.P +Please file bugs at https://github.com/rupa/z/ diff --git a/plugins/z/z.plugin.zsh b/plugins/z/z.plugin.zsh new file mode 100644 index 000000000..196b88b12 --- /dev/null +++ b/plugins/z/z.plugin.zsh @@ -0,0 +1,6 @@ +_load_z() { + source $1/z.sh +} + +[[ -f $ZSH_CUSTOM/plugins/z/z.plugin.zsh ]] && _load_z $ZSH_CUSTOM/plugins/z +[[ -f $ZSH/plugins/z/z.plugin.zsh ]] && _load_z $ZSH/plugins/z diff --git a/plugins/z/z.sh b/plugins/z/z.sh new file mode 100644 index 000000000..7e444ef46 --- /dev/null +++ b/plugins/z/z.sh @@ -0,0 +1,228 @@ +# Copyright (c) 2009 rupa deadwyler under the WTFPL license + +# maintains a jump-list of the directories you actually use +# +# INSTALL: +# * put something like this in your .bashrc/.zshrc: +# . /path/to/z.sh +# * cd around for a while to build up the db +# * PROFIT!! +# * optionally: +# set $_Z_CMD in .bashrc/.zshrc to change the command (default z). +# set $_Z_DATA in .bashrc/.zshrc to change the datafile (default ~/.z). +# set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution. +# set $_Z_NO_PROMPT_COMMAND if you're handling PROMPT_COMMAND yourself. +# set $_Z_EXCLUDE_DIRS to an array of directories to exclude. +# +# USE: +# * z foo # cd to most frecent dir matching foo +# * z foo bar # cd to most frecent dir matching foo and bar +# * z -r foo # cd to highest ranked dir matching foo +# * z -t foo # cd to most recently accessed dir matching foo +# * z -l foo # list matches instead of cd +# * z -c foo # restrict matches to subdirs of $PWD + +case $- in + *i*) ;; + *) echo 'ERROR: z.sh is meant to be sourced, not directly executed.' +esac + +[ -d "${_Z_DATA:-$HOME/.z}" ] && { + echo "ERROR: z.sh's datafile (${_Z_DATA:-$HOME/.z}) is a directory." +} + +_z() { + + local datafile="${_Z_DATA:-$HOME/.z}" + + # bail out if we don't own ~/.z (we're another user but our ENV is still set) + [ -f "$datafile" -a ! -O "$datafile" ] && return + + # add entries + if [ "$1" = "--add" ]; then + shift + + # $HOME isn't worth matching + [ "$*" = "$HOME" ] && return + + # don't track excluded dirs + local exclude + for exclude in "${_Z_EXCLUDE_DIRS[@]}"; do + [ "$*" = "$exclude" ] && return + done + + # maintain the file + local tempfile + tempfile="$(mktemp "$datafile.XXXXXX")" || return + while read line; do + [ -d "${line%%\|*}" ] && echo $line + done < "$datafile" | awk -v path="$*" -v now="$(date +%s)" -F"|" ' + BEGIN { + rank[path] = 1 + time[path] = now + } + $2 >= 1 { + if( $1 == path ) { + rank[$1] = $2 + 1 + time[$1] = now + } else { + rank[$1] = $2 + time[$1] = $3 + } + count += $2 + } + END { + if( count > 6000 ) { + for( i in rank ) print i "|" 0.99*rank[i] "|" time[i] # aging + } else for( i in rank ) print i "|" rank[i] "|" time[i] + } + ' 2>/dev/null >| "$tempfile" + if [ $? -ne 0 -a -f "$datafile" ]; then + env rm -f "$tempfile" + else + env mv -f "$tempfile" "$datafile" + fi + + # tab completion + elif [ "$1" = "--complete" ]; then + while read line; do + [ -d "${line%%\|*}" ] && echo $line + done < "$datafile" | awk -v q="$2" -F"|" ' + BEGIN { + if( q == tolower(q) ) nocase = 1 + split(substr(q,3),fnd," ") + } + { + if( nocase ) { + for( i in fnd ) tolower($1) !~ tolower(fnd[i]) && $1 = "" + } else { + for( i in fnd ) $1 !~ fnd[i] && $1 = "" + } + if( $1 ) print $1 + } + ' 2>/dev/null + + else + # list/go + while [ "$1" ]; do case "$1" in + --) while [ "$1" ]; do shift; local fnd="$fnd $1";done;; + -*) local opt=${1:1}; while [ "$opt" ]; do case ${opt:0:1} in + c) local fnd="^$PWD $fnd";; + h) echo "${_Z_CMD:-z} [-chlrt] args" >&2; return;; + l) local list=1;; + r) local typ="rank";; + t) local typ="recent";; + esac; opt=${opt:1}; done;; + *) local fnd="$fnd $1";; + esac; local last=$1; shift; done + [ "$fnd" -a "$fnd" != "^$PWD " ] || local list=1 + + # if we hit enter on a completion just go there + case "$last" in + # completions will always start with / + /*) [ -z "$list" -a -d "$last" ] && cd "$last" && return;; + esac + + # no file yet + [ -f "$datafile" ] || return + + local cd + cd="$(while read line; do + [ -d "${line%%\|*}" ] && echo $line + done < "$datafile" | awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" ' + function frecent(rank, time) { + dx = t-time + if( dx < 3600 ) return rank*4 + if( dx < 86400 ) return rank*2 + if( dx < 604800 ) return rank/2 + return rank/4 + } + function output(files, toopen, override) { + if( list ) { + cmd = "sort -n >&2" + for( i in files ) if( files[i] ) printf "%-10s %s\n", files[i], i | cmd + if( override ) printf "%-10s %s\n", "common:", override > "/dev/stderr" + } else { + if( override ) toopen = override + print toopen + } + } + function common(matches) { + # shortest match + for( i in matches ) { + if( matches[i] && (!short || length(i) < length(short)) ) short = i + } + if( short == "/" ) return + # shortest match must be common to each match. escape special characters in + # a copy when testing, so we can return the original. + clean_short = short + gsub(/[\(\)\[\]\|]/, "\\\\&", clean_short) + for( i in matches ) if( matches[i] && i !~ clean_short ) return + return short + } + BEGIN { split(q, a, " "); oldf = noldf = -9999999999 } + { + if( typ == "rank" ) { + f = $2 + } else if( typ == "recent" ) { + f = $3-t + } else f = frecent($2, $3) + wcase[$1] = nocase[$1] = f + for( i in a ) { + if( $1 !~ a[i] ) delete wcase[$1] + if( tolower($1) !~ tolower(a[i]) ) delete nocase[$1] + } + if( wcase[$1] && wcase[$1] > oldf ) { + cx = $1 + oldf = wcase[$1] + } else if( nocase[$1] && nocase[$1] > noldf ) { + ncx = $1 + noldf = nocase[$1] + } + } + END { + if( cx ) { + output(wcase, cx, common(wcase)) + } else if( ncx ) output(nocase, ncx, common(nocase)) + } + ')" + [ $? -gt 0 ] && return + [ "$cd" ] && cd "$cd" + fi +} + +alias ${_Z_CMD:-z}='_z 2>&1' + +[ "$_Z_NO_RESOLVE_SYMLINKS" ] || _Z_RESOLVE_SYMLINKS="-P" + +if compctl &> /dev/null; then + [ "$_Z_NO_PROMPT_COMMAND" ] || { + # zsh populate directory list, avoid clobbering any other precmds + if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then + _z_precmd() { + _z --add "${PWD:a}" + } + else + _z_precmd() { + _z --add "${PWD:A}" + } + fi + precmd_functions+=(_z_precmd) + } + # zsh tab completion + _z_zsh_tab_completion() { + local compl + read -l compl + reply=(${(f)"$(_z --complete "$compl")"}) + } + compctl -U -K _z_zsh_tab_completion _z +elif complete &> /dev/null; then + # bash tab completion + complete -o filenames -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z} + [ "$_Z_NO_PROMPT_COMMAND" ] || { + # bash populate directory list. avoid clobbering other PROMPT_COMMANDs. + echo $PROMPT_COMMAND | grep -q "_z --add" || { + PROMPT_COMMAND='_z --add "$(pwd '$_Z_RESOLVE_SYMLINKS' 2>/dev/null)" 2>/dev/null;'"$PROMPT_COMMAND" + } + } +fi diff --git a/plugins/zeus/README.md b/plugins/zeus/README.md index d7c2aef80..8964eaaec 100644 --- a/plugins/zeus/README.md +++ b/plugins/zeus/README.md @@ -41,3 +41,13 @@ * `zsw` aliases `rm .zeus.sock` * `zweep` aliases `rm .zeus.sock` + +`zdbr` aliases `zeus rake db:reset db:test:prepare` +`zdbreset` aliases `zeus rake db:reset db:test:prepare` + +`zdbm` aliases `zeus rake db:migrate db:test:prepare` +`zdbmigrate` aliases `zeus rake db:migrate db:test:prepare` + +`zdbc` aliases `zeus rake db:create` + +`zdbcm` aliases `zeus rake db:create db:migrate db:test:prepare` diff --git a/plugins/zeus/zeus.plugin.zsh b/plugins/zeus/zeus.plugin.zsh index eddfb4f94..5ec9fa579 100644 --- a/plugins/zeus/zeus.plugin.zsh +++ b/plugins/zeus/zeus.plugin.zsh @@ -53,3 +53,17 @@ 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' + +# Reset database +alias zdbr='zeus rake db:reset db:test:prepare' +alias zdbreset='zeus rake db:reset db:test:prepare' + +# Migrate and prepare database +alias zdbm='zeus rake db:migrate db:test:prepare' +alias zdbmigrate='zeus rake db:migrate db:test:prepare' + +# Create database +alias zdbc='zeus rake db:create' + +# Create, migrate and prepare database +alias zdbcm='zeus rake db:create db:migrate db:test:prepare'
\ No newline at end of file |