summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/autojump/autojump.plugin.zsh2
-rw-r--r--plugins/bundler/bundler.plugin.zsh2
-rw-r--r--plugins/celery/_celery129
-rw-r--r--plugins/debian/debian.plugin.zsh4
-rw-r--r--plugins/fasd/fasd.plugin.zsh7
-rw-r--r--plugins/gpg-agent/gpg-agent.plugin.zsh26
-rw-r--r--plugins/jira/jira.plugin.zsh11
-rw-r--r--plugins/osx/osx.plugin.zsh4
-rw-r--r--plugins/postgres/postgres.plugin.zsh6
-rwxr-xr-xplugins/sublime/sublime.plugin.zsh5
-rw-r--r--plugins/tmux/tmux.plugin.zsh8
-rw-r--r--plugins/virtualenv/virtualenv.plugin.zsh7
-rw-r--r--plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh61
-rw-r--r--plugins/web-search/web-search.plugin.zsh43
14 files changed, 266 insertions, 49 deletions
diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh
index 3894ccd2f..f856f2f01 100644
--- a/plugins/autojump/autojump.plugin.zsh
+++ b/plugins/autojump/autojump.plugin.zsh
@@ -3,6 +3,8 @@ if [ $commands[autojump] ]; then # check if autojump is installed
. /usr/share/autojump/autojump.zsh
elif [ -f /etc/profile.d/autojump.zsh ]; then # manual installation
. /etc/profile.d/autojump.zsh
+ elif [ -f /etc/profile.d/autojump.sh ]; then # gentoo installation
+ . /etc/profile.d/autojump.sh
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/bundler/bundler.plugin.zsh b/plugins/bundler/bundler.plugin.zsh
index 9446aafab..c01241409 100644
--- a/plugins/bundler/bundler.plugin.zsh
+++ b/plugins/bundler/bundler.plugin.zsh
@@ -7,7 +7,7 @@ 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 thin thor unicorn unicorn_rails puma)
## Functions
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/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/fasd/fasd.plugin.zsh b/plugins/fasd/fasd.plugin.zsh
index d42584f1a..8ad43fc23 100644
--- a/plugins/fasd/fasd.plugin.zsh
+++ b/plugins/fasd/fasd.plugin.zsh
@@ -1,5 +1,10 @@
if [ $commands[fasd] ]; then # check if fasd is installed
- eval "$(fasd --init auto)"
+ fasd_cache="$HOME/.fasd-init-cache"
+ if [ "$(command -v fasd)" -nt "$fasd_cache" -o ! -s "$fasd_cache" ]; then
+ fasd --init auto >| "$fasd_cache"
+ fi
+ source "$fasd_cache"
+ unset fasd_cache
alias v='f -e vim'
alias o='a -e open'
fi
diff --git a/plugins/gpg-agent/gpg-agent.plugin.zsh b/plugins/gpg-agent/gpg-agent.plugin.zsh
index 109af44c8..4071334cb 100644
--- a/plugins/gpg-agent/gpg-agent.plugin.zsh
+++ b/plugins/gpg-agent/gpg-agent.plugin.zsh
@@ -14,16 +14,24 @@ 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
+ 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/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh
index b91f93c95..bea726a54 100644
--- a/plugins/jira/jira.plugin.zsh
+++ b/plugins/jira/jira.plugin.zsh
@@ -11,6 +11,13 @@
# Usage: jira # opens a new issue
# jira ABC-123 # Opens an existing issue
open_jira_issue () {
+ local open_cmd
+ if [[ $(uname -s) == 'Darwin' ]]; then
+ open_cmd='open'
+ else
+ open_cmd='xdg-open'
+ fi
+
if [ -f .jira-url ]; then
jira_url=$(cat .jira-url)
elif [ -f ~/.jira-url ]; then
@@ -28,9 +35,9 @@ open_jira_issue () {
else
echo "Opening issue #$1"
if [[ "x$JIRA_RAPID_BOARD" = "yes" ]]; then
- `open $jira_url/issues/$1`
+ $open_cmd "$jira_url/issues/$1"
else
- `open $jira_url/browse/$1`
+ $open_cmd "$jira_url/browse/$1"
fi
fi
}
diff --git a/plugins/osx/osx.plugin.zsh b/plugins/osx/osx.plugin.zsh
index 51cd7c143..dd785f911 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
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/sublime/sublime.plugin.zsh b/plugins/sublime/sublime.plugin.zsh
index e74695de0..82faf87c9 100755
--- a/plugins/sublime/sublime.plugin.zsh
+++ b/plugins/sublime/sublime.plugin.zsh
@@ -2,10 +2,11 @@
local _sublime_darwin_paths > /dev/null 2>&1
_sublime_darwin_paths=(
- "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+ "/usr/local/bin/subl"
"$HOME/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
- "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
+ "$HOME/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
"/Applications/Sublime Text 2.app/Contents/SharedSupport/bin/subl"
+ "/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl"
)
if [[ $('uname') == 'Linux' ]]; then
diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh
index 465f5b053..049ceb30f 100644
--- a/plugins/tmux/tmux.plugin.zsh
+++ b/plugins/tmux/tmux.plugin.zsh
@@ -14,6 +14,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 +38,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 +57,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/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 0ed2565b4..670c287bd 100644
--- a/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh
+++ b/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh
@@ -1,40 +1,55 @@
-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 {
- # Check that this is a Git repo
- PROJECT_ROOT=`git rev-parse --show-toplevel 2> /dev/null`
- if (( $? == 0 )); then
+ if [ ! $WORKON_CWD ]; then
+ WORKON_CWD=1
+ # Check if this is a Git repo
+ PROJECT_ROOT=`git rev-parse --show-toplevel 2> /dev/null`
+ if (( $? != 0 )); then
+ PROJECT_ROOT="."
+ fi
# Check for virtualenv name override
- ENV_NAME=`basename "$PROJECT_ROOT"`
if [[ -f "$PROJECT_ROOT/.venv" ]]; then
ENV_NAME=`cat "$PROJECT_ROOT/.venv"`
+ elif [[ "$PROJECT_ROOT" != "." ]]; then
+ ENV_NAME=`basename "$PROJECT_ROOT"`
+ else
+ ENV_NAME=""
fi
- # Activate the environment only if it is not already active
- if [[ "$VIRTUAL_ENV" != "$WORKON_HOME/$ENV_NAME" ]]; then
- if [[ -e "$WORKON_HOME/$ENV_NAME/bin/activate" ]]; then
- workon "$ENV_NAME" && export CD_VIRTUAL_ENV="$ENV_NAME"
+ if [[ "$ENV_NAME" != "" ]]; then
+ # Activate the environment only if it is not already active
+ if [[ "$VIRTUAL_ENV" != "$WORKON_HOME/$ENV_NAME" ]]; then
+ if [[ -e "$WORKON_HOME/$ENV_NAME/bin/activate" ]]; then
+ workon "$ENV_NAME" && export CD_VIRTUAL_ENV="$ENV_NAME"
+ fi
fi
+ elif [ $CD_VIRTUAL_ENV ]; then
+ # We've just left the repo, deactivate the environment
+ # Note: this only happens if the virtualenv was activated automatically
+ deactivate && unset CD_VIRTUAL_ENV
fi
- elif [ $CD_VIRTUAL_ENV ]; then
- # We've just left the repo, deactivate the environment
- # Note: this only happens if the virtualenv was activated automatically
- deactivate && unset CD_VIRTUAL_ENV
+ unset PROJECT_ROOT
+ unset WORKON_CWD
fi
- unset PROJECT_ROOT
}
- # 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/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh
new file mode 100644
index 000000000..6b6de2b15
--- /dev/null
+++ b/plugins/web-search/web-search.plugin.zsh
@@ -0,0 +1,43 @@
+# web_search from terminal
+
+function web_search() {
+
+ # get the open command
+ local open_cmd
+ if [[ $(uname -s) == 'Darwin' ]]; then
+ open_cmd='open'
+ else
+ open_cmd='xdg-open'
+ fi
+
+ # check whether the search engine is supported
+ if [[ ! $1 =~ '(google|bing|yahoo)' ]];
+ then
+ echo "Search engine $1 not supported."
+ return 1
+ fi
+
+ local url="http://www.$1.com"
+
+ # no keyword provided, simply open the search engine homepage
+ if [[ $# -le 1 ]]; then
+ $open_cmd "$url"
+ return
+ fi
+
+ url="${url}/search?q="
+ shift # shift out $1
+
+ while [[ $# -gt 0 ]]; do
+ url="${url}$1+"
+ shift
+ done
+
+ url="${url%?}" # remove the last '+'
+
+ $open_cmd "$url"
+}
+
+alias bing='web_search bing'
+alias google='web_search google'
+alias yahoo='web_search yahoo'