summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/cargo/.gitignore1
-rw-r--r--plugins/cargo/cargo.plugin.zsh24
-rw-r--r--plugins/deno/.gitignore1
-rw-r--r--plugins/deno/deno.plugin.zsh22
-rw-r--r--plugins/django/README.md38
-rw-r--r--plugins/django/django.plugin.zsh3
-rw-r--r--plugins/docker/_docker100
-rw-r--r--plugins/fnm/.gitignore2
-rw-r--r--plugins/fnm/fnm.plugin.zsh23
-rw-r--r--plugins/gh/.gitignore1
-rw-r--r--plugins/gh/gh.plugin.zsh23
-rw-r--r--plugins/golang/README.md2
-rw-r--r--plugins/golang/golang.plugin.zsh2
-rw-r--r--plugins/jsontools/README.md47
-rw-r--r--plugins/jsontools/jsontools.plugin.zsh137
-rw-r--r--plugins/kubectx/README.md2
-rw-r--r--plugins/lando/lando.plugin.zsh1
-rw-r--r--plugins/rustup/.gitignore1
-rw-r--r--plugins/rustup/rustup.plugin.zsh24
-rw-r--r--plugins/vi-mode/README.md20
-rw-r--r--plugins/vim-interaction/vim-interaction.plugin.zsh48
21 files changed, 388 insertions, 134 deletions
diff --git a/plugins/cargo/.gitignore b/plugins/cargo/.gitignore
deleted file mode 100644
index 42d7ecdd6..000000000
--- a/plugins/cargo/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_cargo
diff --git a/plugins/cargo/cargo.plugin.zsh b/plugins/cargo/cargo.plugin.zsh
index 92eae5359..7082d2d55 100644
--- a/plugins/cargo/cargo.plugin.zsh
+++ b/plugins/cargo/cargo.plugin.zsh
@@ -1,11 +1,23 @@
-# COMPLETION FUNCTION
if (( $+commands[rustup] && $+commands[cargo] )); then
- if [[ ! -f $ZSH_CACHE_DIR/cargo_version ]] \
- || [[ "$(cargo --version)" != "$(< "$ZSH_CACHE_DIR/cargo_version")" ]] \
- || [[ ! -f $ZSH/plugins/cargo/_cargo ]]; then
- rustup completions zsh cargo > $ZSH/plugins/cargo/_cargo
- cargo --version > $ZSH_CACHE_DIR/cargo_version
+ # remove old generated completion file
+ command rm -f "${0:A:h}/_cargo"
+
+ # generate new completion file
+ ver="$(cargo --version)"
+ ver_file="$ZSH_CACHE_DIR/cargo_version"
+ comp_file="$ZSH_CACHE_DIR/completions/_cargo"
+
+ mkdir -p "${comp_file:h}"
+ (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
+
+ if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
+ rustup completions zsh cargo >| "$comp_file"
+ echo "$ver" >| "$ver_file"
fi
+
+ declare -A _comps
autoload -Uz _cargo
_comps[cargo]=_cargo
+
+ unset ver ver_file comp_file
fi
diff --git a/plugins/deno/.gitignore b/plugins/deno/.gitignore
deleted file mode 100644
index cba5b03e8..000000000
--- a/plugins/deno/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_deno
diff --git a/plugins/deno/deno.plugin.zsh b/plugins/deno/deno.plugin.zsh
index a37b3bec4..34adddc37 100644
--- a/plugins/deno/deno.plugin.zsh
+++ b/plugins/deno/deno.plugin.zsh
@@ -12,12 +12,24 @@ alias dup='deno upgrade'
# COMPLETION FUNCTION
if (( $+commands[deno] )); then
- if [[ ! -f $ZSH_CACHE_DIR/deno_version ]] \
- || [[ "$(deno --version)" != "$(< "$ZSH_CACHE_DIR/deno_version")" ]] \
- || [[ ! -f $ZSH/plugins/deno/_deno ]]; then
- deno completions zsh > $ZSH/plugins/deno/_deno
- deno --version > $ZSH_CACHE_DIR/deno_version
+ # remove old generated completion file
+ command rm -f "${0:A:h}/_deno"
+
+ ver="$(deno --version)"
+ ver_file="$ZSH_CACHE_DIR/deno_version"
+ comp_file="$ZSH_CACHE_DIR/completions/_deno"
+
+ mkdir -p "${comp_file:h}"
+ (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
+
+ if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
+ deno completions zsh >| "$comp_file"
+ echo "$ver" >| "$ver_file"
fi
+
+ declare -A _comps
autoload -Uz _deno
_comps[deno]=_deno
+
+ unset ver ver_file comp_file
fi
diff --git a/plugins/django/README.md b/plugins/django/README.md
index 1740e55e5..cfab43980 100644
--- a/plugins/django/README.md
+++ b/plugins/django/README.md
@@ -1,36 +1,12 @@
# Django plugin
-This plugin adds completion and hints for the [Django Project](https://www.djangoproject.com/) `manage.py` commands
-and options.
+This plugin adds completion for the [Django Project](https://www.djangoproject.com/) commands
+(`manage.py`, `django-admin`, ...).
-To use it, add `django` to the plugins array in your zshrc file:
+## Deprecation (2021-09-22)
-```zsh
-plugins=(... django)
-```
+The plugin used to provide completion for `./manage.py` and `django-admin`, but Zsh already provides
+a better, more extensive completion for those, so this plugin is no longer needed.
-## Usage
-
-```zsh
-$> python manage.py (press <TAB> here)
-```
-
-Would result in:
-
-```zsh
-cleanup -- remove old data from the database
-compilemessages -- compile .po files to .mo for use with gettext
-createcachetable -- creates table for SQL cache backend
-createsuperuser -- create a superuser
-dbshell -- run command-line client for the current database
-diffsettings -- display differences between the current settings and Django defaults
-dumpdata -- output contents of database as a fixture
-flush -- execute 'sqlflush' on the current database
-inspectdb -- output Django model module for tables in database
-loaddata -- install the named fixture(s) in the database
-makemessages -- pull out all strings marked for translation
-reset -- executes 'sqlreset' for the given app(s)
-runfcgi -- run this project as a fastcgi
-runserver -- start a lightweight web server for development
-...
-```
+Right now a warning message is shown, but in the near future the plugin will stop working altogether.
+So you can remove it from your plugins and you'll automatically start using Zsh's django completion.
diff --git a/plugins/django/django.plugin.zsh b/plugins/django/django.plugin.zsh
index c2d00c171..a07a30889 100644
--- a/plugins/django/django.plugin.zsh
+++ b/plugins/django/django.plugin.zsh
@@ -402,3 +402,6 @@ compdef _managepy django
compdef _managepy django-admin
compdef _managepy django-admin.py
compdef _managepy django-manage
+
+print -P "%F{yellow}The django plugin is deprecated in favor of Zsh's Django completion.
+%BPlease remove it from your plugins to stop using it.%b%f"
diff --git a/plugins/docker/_docker b/plugins/docker/_docker
index 7fe204313..8ee35abcf 100644
--- a/plugins/docker/_docker
+++ b/plugins/docker/_docker
@@ -1343,7 +1343,7 @@ __docker_node_complete_ls_filters() {
;;
esac
else
- opts=('id' 'label' 'membership' 'name' 'role')
+ opts=('id' 'label' 'membership' 'name' 'node.label' 'role')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
@@ -2544,6 +2544,82 @@ __docker_volume_subcommand() {
# EO volume
+# BO context
+
+__docker_complete_contexts() {
+ [[ $PREFIX = -* ]] && return 1
+ integer ret=1
+ declare -a contexts
+
+ contexts=(${(f)${:-"$(_call_program commands docker $docker_options context ls -q)"$'\n'}})
+
+ _describe -t context-list "context" contexts && ret=0
+ return ret
+}
+
+__docker_context_commands() {
+ local -a _docker_context_subcommands
+ _docker_context_subcommands=(
+ "create:Create new context"
+ "inspect:Display detailed information on one or more contexts"
+ "list:List available contexts"
+ "rm:Remove one or more contexts"
+ "show:Print the current context"
+ "update:Update a context"
+ "use:Set the default context"
+ )
+ _describe -t docker-context-commands "docker context command" _docker_context_subcommands
+}
+
+__docker_context_subcommand() {
+ local -a _command_args opts_help
+ local expl help="--help"
+ integer ret=1
+
+ opts_help=("(: -)--help[Print usage]")
+
+ case "$words[1]" in
+ (create)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--default-stack-orchestrator=[Default orchestrator for stack operations to use with this context]:default-stack-orchestrator:(swarm kubernetes all)" \
+ "($help)--description=[Description of the context]:description:" \
+ "($help)--docker=[Set the docker endpoint]:docker:" \
+ "($help)--kubernetes=[Set the kubernetes endpoint]:kubernetes:" \
+ "($help)--from=[Create context from a named context]:from:__docker_complete_contexts" \
+ "($help -):name: " && ret=0
+ ;;
+ (use)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:context:__docker_complete_contexts" && ret=0
+ ;;
+ (inspect)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:context:__docker_complete_contexts" && ret=0
+ ;;
+ (rm)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -)1:context:__docker_complete_contexts" && ret=0
+ ;;
+ (update)
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help)--default-stack-orchestrator=[Default orchestrator for stack operations to use with this context]:default-stack-orchestrator:(swarm kubernetes all)" \
+ "($help)--description=[Description of the context]:description:" \
+ "($help)--docker=[Set the docker endpoint]:docker:" \
+ "($help)--kubernetes=[Set the kubernetes endpoint]:kubernetes:" \
+ "($help -):name:" && ret=0
+ ;;
+ esac
+
+ return ret
+}
+
+# EO context
+
__docker_caching_policy() {
oldp=( "$1"(Nmh+1) ) # 1 hour
(( $#oldp ))
@@ -2576,7 +2652,7 @@ __docker_commands() {
then
local -a lines
lines=(${(f)"$(_call_program commands docker 2>&1)"})
- _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/ ##/:})
+ _docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/\*# ##/:})
_docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command')
(( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands
fi
@@ -2631,6 +2707,23 @@ __docker_subcommand() {
;;
esac
;;
+ (context)
+ local curcontext="$curcontext" state
+ _arguments $(__docker_arguments) \
+ $opts_help \
+ "($help -): :->command" \
+ "($help -)*:: :->option-or-argument" && ret=0
+
+ case $state in
+ (command)
+ __docker_context_commands && ret=0
+ ;;
+ (option-or-argument)
+ curcontext=${curcontext%:*:*}:docker-${words[-1]}:
+ __docker_context_subcommand && ret=0
+ ;;
+ esac
+ ;;
(daemon)
_arguments $(__docker_arguments) \
$opts_help \
@@ -2698,7 +2791,8 @@ __docker_subcommand() {
"($help)--tlsverify[Use TLS and verify the remote]" \
"($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \
"($help)--userland-proxy[Use userland proxy for loopback traffic]" \
- "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" && ret=0
+ "($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" \
+ "($help)--validate[Validate daemon configuration and exit]" && ret=0
case $state in
(cluster-store)
diff --git a/plugins/fnm/.gitignore b/plugins/fnm/.gitignore
deleted file mode 100644
index 0b2bc9ab7..000000000
--- a/plugins/fnm/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-_fnm
-
diff --git a/plugins/fnm/fnm.plugin.zsh b/plugins/fnm/fnm.plugin.zsh
index 5ce558dcb..c161b27cd 100644
--- a/plugins/fnm/fnm.plugin.zsh
+++ b/plugins/fnm/fnm.plugin.zsh
@@ -1,12 +1,23 @@
-# COMPLETION FUNCTION
if (( $+commands[fnm] )); then
- if [[ ! -f $ZSH_CACHE_DIR/fnm_version ]] \
- || [[ "$(fnm --version)" != "$(< "$ZSH_CACHE_DIR/fnm_version")" ]] \
- || [[ ! -f $ZSH/plugins/fnm/_fnm ]]; then
- fnm completions --shell=zsh > $ZSH/plugins/fnm/_fnm
- fnm --version > $ZSH_CACHE_DIR/fnm_version
+ # remove old generated completion file
+ command rm -f "${0:A:h}/_fnm"
+
+ ver="$(fnm --version)"
+ ver_file="$ZSH_CACHE_DIR/fnm_version"
+ comp_file="$ZSH_CACHE_DIR/completions/_fnm"
+
+ mkdir -p "${comp_file:h}"
+ (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
+
+ if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
+ fnm completions --shell=zsh >| "$comp_file"
+ echo "$ver" >| "$ver_file"
fi
+
+ declare -A _comps
autoload -Uz _fnm
_comps[fnm]=_fnm
+
+ unset ver ver_file comp_file
fi
diff --git a/plugins/gh/.gitignore b/plugins/gh/.gitignore
deleted file mode 100644
index fa1244ab5..000000000
--- a/plugins/gh/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_gh
diff --git a/plugins/gh/gh.plugin.zsh b/plugins/gh/gh.plugin.zsh
index 8e055ec35..3e4cdee5e 100644
--- a/plugins/gh/gh.plugin.zsh
+++ b/plugins/gh/gh.plugin.zsh
@@ -1,13 +1,24 @@
# Autocompletion for the GitHub CLI (gh).
-
if (( $+commands[gh] )); then
- if [[ ! -r "$ZSH_CACHE_DIR/gh_version" \
- || "$(gh --version)" != "$(< "$ZSH_CACHE_DIR/gh_version")"
- || ! -f "$ZSH/plugins/gh/_gh" ]]; then
- gh completion --shell zsh > $ZSH/plugins/gh/_gh
- gh --version > $ZSH_CACHE_DIR/gh_version
+ # remove old generated completion file
+ command rm -f "${0:A:h}/_gh"
+
+ ver="$(gh --version)"
+ ver_file="$ZSH_CACHE_DIR/gh_version"
+ comp_file="$ZSH_CACHE_DIR/completions/_gh"
+
+ mkdir -p "${comp_file:h}"
+ (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
+
+ if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
+ gh completion --shell zsh >| "$comp_file"
+ echo "$ver" >| "$ver_file"
fi
+
+ declare -A _comps
autoload -Uz _gh
_comps[gh]=_gh
+
+ unset ver ver_file comp_file
fi
diff --git a/plugins/golang/README.md b/plugins/golang/README.md
index 0a1b43c30..af2c4dff9 100644
--- a/plugins/golang/README.md
+++ b/plugins/golang/README.md
@@ -19,6 +19,7 @@ plugins=(... golang)
| gof | `go fmt` | Gofmt formats (aligns and indents) Go programs. |
| gofa | `go fmt ./...` | Run go fmt for all packages in current directory, recursively |
| gog | `go get` | Downloads packages and then installs them to $GOPATH |
+| gog | `go get ./...` | Installs all dependencies in current directory, recursively |
| goi | `go install` | Compiles and installs packages to $GOPATH |
| gol | `go list` | Lists Go packages |
| gom | `go mod` | Access to operations on modules |
@@ -27,4 +28,5 @@ plugins=(... golang)
| gops | `cd $GOPATH/src` | Takes you to $GOPATH/src |
| gor | `go run` | Compiles and runs your code |
| got | `go test` | Runs tests |
+| gota | `go test ./...` | Runs tests in all subdirectories |
| gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh
index 398bd966f..fce663fd6 100644
--- a/plugins/golang/golang.plugin.zsh
+++ b/plugins/golang/golang.plugin.zsh
@@ -263,6 +263,7 @@ alias god='go doc'
alias gof='go fmt'
alias gofa='go fmt ./...'
alias gog='go get'
+alias goga='go get ./...'
alias goi='go install'
alias gol='go list'
alias gom='go mod'
@@ -271,4 +272,5 @@ alias gopb='cd $GOPATH/bin'
alias gops='cd $GOPATH/src'
alias gor='go run'
alias got='go test'
+alias gota='go test ./...'
alias gov='go vet'
diff --git a/plugins/jsontools/README.md b/plugins/jsontools/README.md
index 1fa2b8eed..6a2740014 100644
--- a/plugins/jsontools/README.md
+++ b/plugins/jsontools/README.md
@@ -17,32 +17,63 @@ Usage is simple... just take your json data and pipe it into the appropriate jso
- `urlencode_json`: returns a url encoded string for the given json.
- `urldecode_json`: returns decoded json for the given url encoded string.
+### Supports NDJSON (Newline Delimited JSON)
+
+The plugin also supports [NDJSON](http://ndjson.org/) input, which means all functions
+have an alternative function that reads and processes the input line by line. These
+functions have the same name except using `ndjson` instead of `json`:
+
+> `pp_ndjson`, `is_ndjson`, `urlencode_ndjson`, `urldecode_ndjson`.
+
### Examples
- **pp_json**:
-```sh
+```console
# curl json data and pretty print the results
curl https://coderwall.com/bobwilliams.json | pp_json
```
- **is_json**:
-```sh
-# Validate if file's content conforms to a valid JSON schema
-less data.json | is_json
+```console
+# validate if file's content conforms to a valid JSON schema
+$ is_json < data.json
+true
+# shows true / false and returns the proper exit code
+$ echo $?
+0
```
- **urlencode_json**:
-```sh
+```console
# json data directly from the command line
-echo '{"b":2, "a":1}' | urlencode_json
+$ echo '{"b":2, "a":1}' | urlencode_json
+%7B%22b%22:2,%20%22a%22:1%7D
```
- **urldecode_json**:
-```sh
+```console
# url encoded string to decode
-echo '%7B%22b%22:2,%20%22a%22:1%7D%0A' | urldecode_json
+$ echo '%7B%22b%22:2,%20%22a%22:1%7D' | urldecode_json
+{"b":2, "a":1}
+```
+
+- **pp_ndjson**:
+
+```console
+# echo two separate json objects and pretty print both
+$ echo '{"a": "b"}\n{"c": [1,2,3]}' | pp_ndjson
+{
+ "a": "b"
+}
+{
+ "c": [
+ 1,
+ 2,
+ 3
+ ]
+}
```
diff --git a/plugins/jsontools/jsontools.plugin.zsh b/plugins/jsontools/jsontools.plugin.zsh
index 912c83509..ed45cfa8e 100644
--- a/plugins/jsontools/jsontools.plugin.zsh
+++ b/plugins/jsontools/jsontools.plugin.zsh
@@ -1,42 +1,113 @@
# JSON Tools
# Adds command line aliases useful for dealing with JSON
-if [[ $(whence $JSONTOOLS_METHOD) = "" ]]; then
- JSONTOOLS_METHOD=""
+# Check that user-defined method is installed
+if [[ -n "$JSONTOOLS_METHOD" ]]; then
+ (( $+commands[$JSONTOOLS_METHOD] )) || unset JSONTOOLS_METHOD
fi
-if [[ $(whence node) != "" && ( "x$JSONTOOLS_METHOD" = "x" || "x$JSONTOOLS_METHOD" = "xnode" ) ]]; then
- alias pp_json='xargs -0 node -e "console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));"'
- alias is_json='xargs -0 node -e "try {json = JSON.parse(process.argv[1]);} catch (e) { console.log(false); json = null; } if(json) { console.log(true); }"'
- alias urlencode_json='xargs -0 node -e "console.log(encodeURIComponent(process.argv[1]))"'
- alias urldecode_json='xargs -0 node -e "console.log(decodeURIComponent(process.argv[1]))"'
-elif [[ $(whence python) != "" && ( "x$JSONTOOLS_METHOD" = "x" || "x$JSONTOOLS_METHOD" = "xpython" ) ]]; then
- alias pp_json='python -c "import sys; del sys.path[0]; import runpy; runpy._run_module_as_main(\"json.tool\")"'
- alias is_json='python -c "
+# If method undefined, find the first one that is installed
+if [[ ! -v JSONTOOLS_METHOD ]]; then
+ for JSONTOOLS_METHOD in node python ruby; do
+ # If method found, break out of loop
+ (( $+commands[$JSONTOOLS_METHOD] )) && break
+ # Otherwise unset the variable
+ unset JSONTOOLS_METHOD
+ done
+
+ # If no methods were found, exit the plugin
+ [[ -v JSONTOOLS_METHOD ]] || return 1
+fi
+
+# Define json tools for each method
+case "$JSONTOOLS_METHOD" in
+ node)
+ # node doesn't make it easy to deal with stdin, so we pass it as an argument with xargs -0
+ function pp_json() {
+ xargs -0 node -e 'console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));'
+ }
+ function is_json() {
+ xargs -0 node -e '
+ try {
+ json = JSON.parse(process.argv[1]);
+ console.log("true");
+ process.exit(0);
+ } catch (e) {
+ console.log("false");
+ process.exit(1);
+ }
+ '
+ }
+ function urlencode_json() {
+ xargs -0 node -e "console.log(encodeURIComponent(process.argv[1]))"
+ }
+ function urldecode_json() {
+ xargs -0 node -e "console.log(decodeURIComponent(process.argv[1]))"
+ }
+ ;;
+ python)
+ function pp_json() {
+ python -c 'import sys; del sys.path[0]; import runpy; runpy._run_module_as_main("json.tool")'
+ }
+ function is_json() {
+ python -c '
import sys; del sys.path[0];
-import json;
-try:
- json.loads(sys.stdin.read())
-except ValueError, e:
- print False
-else:
- print True
-sys.exit(0)"'
- alias urlencode_json='python -c "
+import json
+try:
+ json.loads(sys.stdin.read())
+ print("true"); sys.exit(0)
+except ValueError:
+ print("false"); sys.exit(1)
+ '
+ }
+ function urlencode_json() {
+ python -c '
import sys; del sys.path[0];
-import urllib, json;
-print urllib.quote_plus(sys.stdin.read())
-sys.exit(0)"'
- alias urldecode_json='python -c "
+from urllib.parse import quote_plus
+print(quote_plus(sys.stdin.read()))
+ '
+ }
+ function urldecode_json() {
+ python -c '
import sys; del sys.path[0];
-import urllib, json;
-print urllib.unquote_plus(sys.stdin.read())
-sys.exit(0)"'
-elif [[ $(whence ruby) != "" && ( "x$JSONTOOLS_METHOD" = "x" || "x$JSONTOOLS_METHOD" = "xruby" ) ]]; then
- alias pp_json='ruby -e "require \"json\"; require \"yaml\"; puts JSON.parse(STDIN.read).to_yaml"'
- alias is_json='ruby -e "require \"json\"; begin; JSON.parse(STDIN.read); puts true; rescue Exception => e; puts false; end"'
- alias urlencode_json='ruby -e "require \"uri\"; puts URI.escape(STDIN.read)"'
- alias urldecode_json='ruby -e "require \"uri\"; puts URI.unescape(STDIN.read)"'
-fi
-
+from urllib.parse import unquote_plus
+print(unquote_plus(sys.stdin.read()))
+ '
+ }
+ ;;
+ ruby)
+ function pp_json() {
+ ruby -e '
+ require "json"
+ require "yaml"
+ puts JSON.parse(STDIN.read).to_yaml
+ '
+ }
+ function is_json() {
+ ruby -e '
+ require "json"
+ begin
+ puts !!JSON.parse(STDIN.read); exit(0)
+ rescue JSON::ParserError
+ puts false; exit(1)
+ end
+ '
+ }
+ function urlencode_json() {
+ ruby -e 'require "cgi"; puts CGI.escape(STDIN.read)'
+ }
+ function urldecode_json() {
+ ruby -e 'require "cgi"; puts CGI.unescape(STDIN.read)'
+ }
+ ;;
+esac
unset JSONTOOLS_METHOD
+
+## Add NDJSON support
+
+function {pp,is,urlencode,urldecode}_ndjson() {
+ local json jsonfunc="${0//ndjson/json}"
+ while read -r json; do
+ $jsonfunc <<< "$json"
+ done
+}
diff --git a/plugins/kubectx/README.md b/plugins/kubectx/README.md
index 9a1df2617..98f1cf032 100644
--- a/plugins/kubectx/README.md
+++ b/plugins/kubectx/README.md
@@ -17,7 +17,7 @@ One can rename default context name for better readability.
_Example_. Add to **.zshrc**:
```
-kubectx_mapping[minikube] = "mini"
+kubectx_mapping[minikube]="mini"
kubectx_mapping[context_name_from_kubeconfig]="$emoji[wolf_face]"
kubectx_mapping[production_cluster]="%{$fg[yellow]%}prod!%{$reset_color%}"
```
diff --git a/plugins/lando/lando.plugin.zsh b/plugins/lando/lando.plugin.zsh
index aa74c9924..af53e7e5a 100644
--- a/plugins/lando/lando.plugin.zsh
+++ b/plugins/lando/lando.plugin.zsh
@@ -8,6 +8,7 @@ function artisan \
drush \
gulp \
npm \
+ php \
wp \
yarn {
if checkForLandoFile; then
diff --git a/plugins/rustup/.gitignore b/plugins/rustup/.gitignore
deleted file mode 100644
index ad38ae3bf..000000000
--- a/plugins/rustup/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-_rustup
diff --git a/plugins/rustup/rustup.plugin.zsh b/plugins/rustup/rustup.plugin.zsh
index c7a9b3060..c6efc1b13 100644
--- a/plugins/rustup/rustup.plugin.zsh
+++ b/plugins/rustup/rustup.plugin.zsh
@@ -1,12 +1,22 @@
-# COMPLETION FUNCTION
if (( $+commands[rustup] )); then
- if [[ ! -f $ZSH_CACHE_DIR/rustup_version ]] \
- || [[ "$(rustup --version 2> /dev/null)" \
- != "$(< "$ZSH_CACHE_DIR/rustup_version")" ]] \
- || [[ ! -f $ZSH/plugins/rustup/_rustup ]]; then
- rustup completions zsh > $ZSH/plugins/rustup/_rustup
- rustup --version 2> /dev/null > $ZSH_CACHE_DIR/rustup_version
+ # remove old generated completion file
+ command rm -f "${0:A:h}/_rustup"
+
+ ver="$(rustup --version 2>/dev/null)"
+ ver_file="$ZSH_CACHE_DIR/rustup_version"
+ comp_file="$ZSH_CACHE_DIR/completions/_rustup"
+
+ mkdir -p "${comp_file:h}"
+ (( ${fpath[(Ie)${comp_file:h}]} )) || fpath=("${comp_file:h}" $fpath)
+
+ if [[ ! -f "$comp_file" || ! -f "$ver_file" || "$ver" != "$(< "$ver_file")" ]]; then
+ rustup completions zsh >| "$comp_file"
+ echo "$ver" >| "$ver_file"
fi
+
+ declare -A _comps
autoload -Uz _rustup
_comps[rustup]=_rustup
+
+ unset ver ver_file comp_file
fi
diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md
index b59d5f279..46bb6d070 100644
--- a/plugins/vi-mode/README.md
+++ b/plugins/vi-mode/README.md
@@ -64,7 +64,7 @@ NOTE: some of these key bindings are set by zsh by default when using a vi-mode
- `vv` : Edit current command line in Vim
-NOTE: this used to be bound to `v`. That is now the default (`visual-mode`)
+NOTE: this used to be bound to `v`. That is now the default (`visual-mode`).
### Movement
@@ -107,3 +107,21 @@ NOTE: this used to be bound to `v`. That is now the default (`visual-mode`)
- `R` : Enter replace mode: Each character replaces existing one
- `x` : Delete `count` characters under and after the cursor
- `X` : Delete `count` characters before the cursor
+
+## Known issues
+
+### Low `$KEYTIMEOUT`
+
+A low `$KEYTIMEOUT` value (< 15) means that key bindings that need multiple characters,
+like `vv`, will be very difficult to trigger. `$KEYTIMEOUT` controls the number of
+milliseconds that must pass before a key press is read and the appropriate key binding
+is triggered. For multi-character key bindings, the key presses need to happen before
+the timeout is reached, so on low timeouts the key press happens too slow, and therefore
+another key binding is triggered.
+
+We recommend either setting `$KEYTIMEOUT` to a higher value, or remapping the key bindings
+that you want to trigger to a keyboard sequence. For example:
+
+```zsh
+bindkey -M vicmd 'V' edit-command-line # this remaps `vv` to `V` (but overrides `visual-mode`)
+```
diff --git a/plugins/vim-interaction/vim-interaction.plugin.zsh b/plugins/vim-interaction/vim-interaction.plugin.zsh
index 53ec453e8..b73f9b4da 100644
--- a/plugins/vim-interaction/vim-interaction.plugin.zsh
+++ b/plugins/vim-interaction/vim-interaction.plugin.zsh
@@ -4,8 +4,7 @@
# Derek Wyatt (derek@{myfirstnamemylastname}.org
#
-function callvim
-{
+function callvim {
if [[ $# == 0 ]]; then
cat <<EOH
usage: callvim [-b cmd] [-a cmd] [-n name] [file ... fileN]
@@ -19,11 +18,20 @@ EOH
return 0
fi
- local cmd=""
- local before="<esc>"
- local after=""
- # Look up the newest instance
+ # Look up the newest instance or start one
local name="$(gvim --serverlist | tail -n 1)"
+ [[ -n "$name" ]] || {
+ # run gvim or exit if it fails
+ gvim || return $?
+
+ # wait for gvim instance to fully load
+ while name=$(gvim --serverlist) && [[ -z "$name" ]]; do
+ sleep 0.1
+ done
+ }
+
+ local before="<esc>" files after cmd
+
while getopts ":b:a:n:" option
do
case $option in
@@ -36,22 +44,20 @@ EOH
esac
done
shift $((OPTIND-1))
- if [[ ${after#:} != $after && ${after%<cr>} == $after ]]; then
- after="$after<cr>"
- fi
- if [[ ${before#:} != $before && ${before%<cr>} == $before ]]; then
- before="$before<cr>"
- fi
- local files
- if [[ $# -gt 0 ]]; then
- # absolute path of files resolving symlinks (:A) and quoting special chars (:q)
- files=':args! '"${@:A:q}<cr>"
- fi
+
+ # If before or after commands begin with : and don't end with <cr>, append it
+ [[ ${after} = :* && ${after} != *\<cr\> ]] && after+="<cr>"
+ [[ ${before} = :* && ${before} != *\<cr\> ]] && before+="<cr>"
+ # Open files passed (:A means abs path resolving symlinks, :q means quoting special chars)
+ [[ $# -gt 0 ]] && files=':args! '"${@:A:q}<cr>"
+ # Pass the built vim command to gvim
cmd="$before$files$after"
- gvim --servername "$name" --remote-send "$cmd"
- if typeset -f postCallVim > /dev/null; then
- postCallVim
- fi
+
+ # Run the gvim command
+ gvim --servername "$name" --remote-send "$cmd" || return $?
+
+ # Run postCallVim if defined (maybe to bring focus to gvim, see README)
+ (( ! $+functions[postCallVim] )) || postCallVim
}
alias v=callvim