From b70977b25657c193a3a6c0445b63325a420da646 Mon Sep 17 00:00:00 2001 From: Isaac Levy Date: Mon, 14 Nov 2022 11:36:19 -0500 Subject: [PATCH 001/321] perf(pyenv): do not check if it's disabled (#11338) --- plugins/pyenv/pyenv.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/pyenv/pyenv.plugin.zsh b/plugins/pyenv/pyenv.plugin.zsh index 7fbd1589..48c8ffaf 100644 --- a/plugins/pyenv/pyenv.plugin.zsh +++ b/plugins/pyenv/pyenv.plugin.zsh @@ -78,7 +78,7 @@ if [[ $FOUND_PYENV -eq 1 ]]; then eval "$(pyenv init - --no-rehash zsh)" # If pyenv-virtualenv exists, load it - if [[ "$(pyenv commands)" =~ "virtualenv-init" && "$ZSH_PYENV_VIRTUALENV" != false ]]; then + if [[ "$ZSH_PYENV_VIRTUALENV" != false && "$(pyenv commands)" =~ "virtualenv-init" ]]; then eval "$(pyenv virtualenv-init - zsh)" fi From a482a02915f361e56669ee9884ebee0eb6f2d8d5 Mon Sep 17 00:00:00 2001 From: Lennart Ochel Date: Mon, 14 Nov 2022 17:38:44 +0100 Subject: [PATCH 002/321] feat(git-prompt): add option to show upstream branch (#11336) --- plugins/git-prompt/README.md | 2 ++ plugins/git-prompt/git-prompt.plugin.zsh | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/git-prompt/README.md b/plugins/git-prompt/README.md index 8775af89..05208d72 100644 --- a/plugins/git-prompt/README.md +++ b/plugins/git-prompt/README.md @@ -45,6 +45,7 @@ The symbols are as follows: | ●n | there are `n` staged files | | ✖n | there are `n` unmerged files | | ✚n | there are `n` unstaged files | +| -n | there are `n` deleted files | | ⚑n | there are `n` stashed changes | | … | there are some untracked files | @@ -59,6 +60,7 @@ The symbols are as follows: ## Customisation - Set the variable `ZSH_THEME_GIT_PROMPT_CACHE` to any value in order to enable caching. +- Set the variable `ZSH_THEME_GIT_SHOW_UPSTREAM` to any value to display the upstream branch. - You may also change a number of variables (whose name start with `ZSH_THEME_GIT_PROMPT_`) to change the appearance of the prompt. Take a look at the bottom of the [plugin file](git-prompt.plugin.zsh)` to see what variables are available. diff --git a/plugins/git-prompt/git-prompt.plugin.zsh b/plugins/git-prompt/git-prompt.plugin.zsh index dcda418c..48733202 100644 --- a/plugins/git-prompt/git-prompt.plugin.zsh +++ b/plugins/git-prompt/git-prompt.plugin.zsh @@ -48,12 +48,18 @@ function update_current_git_vars() { GIT_STASHED=$__CURRENT_GIT_STATUS[8] GIT_CLEAN=$__CURRENT_GIT_STATUS[9] GIT_DELETED=$__CURRENT_GIT_STATUS[10] + + if [ -z ${ZSH_THEME_GIT_SHOW_UPSTREAM+x} ]; then + GIT_UPSTREAM= + else + GIT_UPSTREAM=$(git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}" 2>/dev/null) && GIT_UPSTREAM="${ZSH_THEME_GIT_PROMPT_UPSTREAM_SEPARATOR}${GIT_UPSTREAM}" + fi } git_super_status() { precmd_update_git_vars if [ -n "$__CURRENT_GIT_STATUS" ]; then - STATUS="$ZSH_THEME_GIT_PROMPT_PREFIX$ZSH_THEME_GIT_PROMPT_BRANCH$GIT_BRANCH%{${reset_color}%}" + STATUS="$ZSH_THEME_GIT_PROMPT_PREFIX$ZSH_THEME_GIT_PROMPT_BRANCH$GIT_BRANCH$GIT_UPSTREAM%{${reset_color}%}" if [ "$GIT_BEHIND" -ne "0" ]; then STATUS="$STATUS$ZSH_THEME_GIT_PROMPT_BEHIND$GIT_BEHIND%{${reset_color}%}" fi @@ -101,6 +107,7 @@ ZSH_THEME_GIT_PROMPT_AHEAD="%{↑%G%}" ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[cyan]%}%{…%G%}" ZSH_THEME_GIT_PROMPT_STASHED="%{$fg_bold[blue]%}%{⚑%G%}" ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg_bold[green]%}%{✔%G%}" +ZSH_THEME_GIT_PROMPT_UPSTREAM_SEPARATOR="->" # Set the prompt. RPROMPT='$(git_super_status)' From 37d9e1aee9289025373d3f840ead74897206d73f Mon Sep 17 00:00:00 2001 From: milinches Date: Sat, 7 May 2022 06:12:22 +0100 Subject: [PATCH 003/321] feat(golang): add `goe`, `gove` aliases Closes #10914 --- plugins/golang/README.md | 4 +++- plugins/golang/golang.plugin.zsh | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/golang/README.md b/plugins/golang/README.md index 3b7d1e19..128cc7fb 100644 --- a/plugins/golang/README.md +++ b/plugins/golang/README.md @@ -16,11 +16,12 @@ plugins=(... golang) | gob | `go build` | Build your code | | goc | `go clean` | Removes object files from package source directories | | god | `go doc` | Prints documentation comments | +| goe | `go env` | Prints Go environment information | | gof | `go fmt` | Gofmt formats (aligns and indents) Go programs. | | gofa | `go fmt ./...` | Run go fmt for all packages in current directory, recursively | | gofx | `go fix` | Update packages to use a new API | | gog | `go get` | Downloads packages and then installs them to $GOPATH | -| gog | `go get ./...` | Installs all dependencies in current directory, recursively | +| goga | `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 | @@ -35,4 +36,5 @@ plugins=(... golang) | gotod | `go tool dist` | Utility to bootstrap, build and test go runtime | | gotofx | `go tool fix` | Fixes an application to use newer features | | gov | `go vet` | Vet examines Go source code and reports suspicious constructs | +| gove | `go version` | Prints Go version | | gow | `go work` | Work provides access to operations on workspaces | diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh index 0dbaab06..45ccd3a1 100644 --- a/plugins/golang/golang.plugin.zsh +++ b/plugins/golang/golang.plugin.zsh @@ -13,6 +13,7 @@ unset p alias gob='go build' alias goc='go clean' alias god='go doc' +alias goe='go env' alias gof='go fmt' alias gofa='go fmt ./...' alias gofx='go fix' @@ -32,4 +33,5 @@ alias gotoc='go tool compile' alias gotod='go tool dist' alias gotofx='go tool fix' alias gov='go vet' +alias gove='go version' alias gow='go work' From aafc7443f07b841b4c008951087bfad282f3341f Mon Sep 17 00:00:00 2001 From: Steven Conaway Date: Tue, 15 Nov 2022 10:19:37 -0800 Subject: [PATCH 004/321] feat(fzf): support macOS ARM brew install dir (#10944) --- plugins/fzf/fzf.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 60ae0c76..9c8dd864 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -9,6 +9,7 @@ function fzf_setup_using_base_dir() { "${HOME}/.nix-profile/share/fzf" "${XDG_DATA_HOME:-$HOME/.local/share}/fzf" "/usr/local/opt/fzf" + "/opt/homebrew/bin/fzf" "/usr/share/fzf" "/usr/local/share/examples/fzf" ) From 94584e2a7337e0a7f5af45e2c97ca6d0770e67a1 Mon Sep 17 00:00:00 2001 From: Bill Haofei Gong Date: Wed, 16 Nov 2022 05:25:22 +1100 Subject: [PATCH 005/321] feat(cakephp3): add compatibility with CakePHP 3.7+ (#11080) --- plugins/cakephp3/cakephp3.plugin.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/cakephp3/cakephp3.plugin.zsh b/plugins/cakephp3/cakephp3.plugin.zsh index dbfbeba3..a1a289fd 100644 --- a/plugins/cakephp3/cakephp3.plugin.zsh +++ b/plugins/cakephp3/cakephp3.plugin.zsh @@ -1,10 +1,10 @@ # CakePHP 3 basic command completion _cakephp3_get_command_list () { - bin/cake Completion commands + bin/cake completion commands } _cakephp3_get_sub_command_list () { - bin/cake Completion subcommands ${words[2]} + bin/cake completion subcommands ${words[2]} } _cakephp3_get_3rd_argument () { @@ -34,5 +34,5 @@ compdef _cakephp3 cake #Alias alias c3='bin/cake' -alias c3cache='bin/cake orm_cache clear' +alias c3cache='bin/cake schema_cache clear' alias c3migrate='bin/cake migrations migrate' From 4392d3a923eddd4e9d0f9b17a1e995cc9aa5cc96 Mon Sep 17 00:00:00 2001 From: Ben Iofel Date: Tue, 15 Nov 2022 18:29:48 +0000 Subject: [PATCH 006/321] feat(systemadmin): color `ip` if shell is interactive (#11107) --- plugins/systemadmin/systemadmin.plugin.zsh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh index 8e5e0af7..9b5159ff 100644 --- a/plugins/systemadmin/systemadmin.plugin.zsh +++ b/plugins/systemadmin/systemadmin.plugin.zsh @@ -33,6 +33,14 @@ alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr | head # top10 of the history alias hist10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10' +function ip() { + if [ -t 1 ]; then + command ip -color "$@" + else + command ip "$@" + fi +} + # directory LS function dls() { print -l *(/) From 6d5ba2d6c489d56fb34788ec128f98609e60b7be Mon Sep 17 00:00:00 2001 From: Carlo Date: Tue, 15 Nov 2022 20:23:09 +0100 Subject: [PATCH 007/321] feat(nvm)!: settings now are zstyle-based (#11335) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- plugins/nvm/README.md | 40 +++++++++++++++++++++++--------- plugins/nvm/nvm.plugin.zsh | 47 ++++++++++++++++++++++++++++++-------- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index 1acf1205..4c6312e6 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -1,7 +1,7 @@ # nvm plugin -This plugin adds autocompletions for [nvm](https://github.com/nvm-sh/nvm) — a Node.js version manager. -It also automatically sources nvm, so you don't need to do it manually in your `.zshrc`. +This plugin adds autocompletions for [nvm](https://github.com/nvm-sh/nvm) — a Node.js version manager. It also +automatically sources nvm, so you don't need to do it manually in your `.zshrc`. To use it, add `nvm` to the plugins array of your zshrc file: @@ -21,14 +21,32 @@ These settings should go in your zshrc file, before Oh My Zsh is sourced: [Homebrew is installed in `/opt/homebrew`](https://docs.brew.sh/Installation). To get the directory where nvm has been installed, regardless of chip architecture, use `NVM_HOMEBREW=$(brew --prefix nvm)`. -- **`NVM_LAZY`**: if you want the plugin to defer the load of nvm to speed-up the start of your zsh session, - set `NVM_LAZY` to `1`. This will source nvm script only when using it, and will create a function for `node`, - `npm`, `pnpm`, `yarn`, and the command(s) specified by `NVM_LAZY_CMD`, so when you call either of them, - nvm will be loaded and run with default version. +## Customization -- **`NVM_LAZY_CMD`**: if you want additional command(s) to trigger lazy loading of nvm, set `NVM_LAZY_CMD` to - the command or an array of the commands. +#### Lazy startup -- **`NVM_AUTOLOAD`**: if `NVM_AUTOLOAD` is set to `1`, the plugin will automatically load a node version when - if finds a [`.nvmrc` file](https://github.com/nvm-sh/nvm#nvmrc) in the current working directory indicating - which node version to load. +This option will help you to defer nvm's load until you use it to speed-up your zsh startup. This will source +nvm script only when using it, and will create a function for `node`, `npm`, `pnpm`, `yarn`, and the +command(s) specified by `lazy-cmd` option, so when you call either of them, nvm will be loaded and run with +default version. To enable it, you can add this snippet to your zshrc, before Oh My Zsh is sourced: + +```zsh +zstyle ':omz:plugins:nvm' lazy yes +``` + +Then, to define extra commands that will also trigger nvm load, you can use a similar syntax, adding as many +as you want: + +```zsh +zstyle ':omz:plugins:nvm' lazy-cmd eslint prettier typescript ... +``` + +#### `.nvmrc` autoload + +If set, the plugin will automatically load a node version when if finds a +[`.nvmrc` file](https://github.com/nvm-sh/nvm#nvmrc) in the current working directory indicating which node +version to load. This can be done, similar as previous options, adding: + +```zsh +zstyle ':omz:plugins:nvm' autoload true +``` diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 1fb4d238..ec583cc2 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -16,14 +16,41 @@ fi # Note: nvm is a function so we need to use `which` which nvm &>/dev/null && return -if (( $+NVM_LAZY )); then - # Call nvm when first using nvm, node, npm, pnpm, yarn or $NVM_LAZY_CMD - function nvm node npm pnpm yarn $NVM_LAZY_CMD { - unfunction nvm node npm pnpm yarn $NVM_LAZY_CMD - # Load nvm if it exists in $NVM_DIR - [[ -f "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh" - "$0" "$@" - } +# TODO: 2022-11-11: Remove soft-deprecate options +if (( ${+NVM_LAZY} + ${+NVM_LAZY_CMD} + ${+NVM_AUTOLOAD} )); then + # Get list of NVM_* variable settings defined + local -a used_vars + used_vars=(${(o)parameters[(I)NVM_(AUTOLOAD|LAZY|LAZY_CMD)]}) + # Nicely print the list in the style `var1, var2 and var3` + echo "${fg[yellow]}[nvm plugin] Variable-style settings are deprecated. Instead of ${(j:, :)used_vars[1,-2]}${used_vars[-2]+ and }${used_vars[-1]}, use:\n" + if (( $+NVM_AUTOLOAD )); then + echo " zstyle ':omz:plugins:nvm' autoload true" + zstyle ':omz:plugins:nvm' autoload yes + fi + if (( $+NVM_LAZY )); then + echo " zstyle ':omz:plugins:nvm' lazy true" + zstyle ':omz:plugins:nvm' lazy yes + fi + if (( $+NVM_LAZY_CMD )); then + echo " zstyle ':omz:plugins:nvm' lazy-cmd $NVM_LAZY_CMD" + zstyle ':omz:plugins:nvm' lazy-cmd $NVM_LAZY_CMD + fi + echo "$reset_color" + unset used_vars NVM_AUTOLOAD NVM_LAZY NVM_LAZY_CMD +fi + +if zstyle -t ':omz:plugins:nvm' lazy; then + # Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd + zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd + eval " + function nvm node npm pnpm yarn $nvm_lazy_cmd { + unfunction nvm node npm pnpm yarn $nvm_lazy_cmd + # Load nvm if it exists in \$NVM_DIR + [[ -f \"\$NVM_DIR/nvm.sh\" ]] && source \"\$NVM_DIR/nvm.sh\" + \"\$0\" \"\$@\" + } + " + unset nvm_lazy_cmd elif [[ -f "$NVM_DIR/nvm.sh" ]]; then # Load nvm if it exists in $NVM_DIR source "$NVM_DIR/nvm.sh" @@ -33,7 +60,7 @@ fi # Autoload nvm when finding a .nvmrc file in the current directory # Adapted from: https://github.com/nvm-sh/nvm#zsh -if (( $+NVM_AUTOLOAD )); then +if zstyle -t ':omz:plugins:nvm' autoload; then load-nvmrc() { local node_version="$(nvm version)" local nvmrc_path="$(nvm_find_nvmrc)" @@ -70,4 +97,4 @@ for nvm_completion in "$NVM_DIR/bash_completion" "$NVM_HOMEBREW/etc/bash_complet fi done -unset NVM_HOMEBREW NVM_LAZY NVM_AUTOLOAD nvm_completion +unset NVM_HOMEBREW nvm_completion From 5bce72ef57255ab1c23d8fb753417859afe6e0f0 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 15 Nov 2022 20:27:12 +0100 Subject: [PATCH 008/321] docs(yarn): follow omz `zstyle` bools standard --- plugins/yarn/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/yarn/README.md b/plugins/yarn/README.md index 9c16ff2c..cdda2026 100644 --- a/plugins/yarn/README.md +++ b/plugins/yarn/README.md @@ -15,7 +15,7 @@ It also adds `yarn` global scripts dir (commonly `~/.yarn/bin`) to the `$PATH`. To disable this feature, set the following style in your `.zshrc`: ```zsh -zstyle ':omz:plugins:yarn' global-path false +zstyle ':omz:plugins:yarn' global-path no ``` ## Aliases From 5ab517361a4215d2f777023fc1e772fe79496713 Mon Sep 17 00:00:00 2001 From: Ruslan Tursunov Date: Thu, 17 Nov 2022 13:54:01 +0300 Subject: [PATCH 009/321] feat(git): add `gcn` alias (#10836) --- plugins/git/README.md | 1 + plugins/git/git.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index f1c8b81c..3beb0890 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -35,6 +35,7 @@ plugins=(... git) | gbss | git bisect start | | gc | git commit -v | | gc! | git commit -v --amend | +| gcn | git commit -v --no-edit | | gcn! | git commit -v --no-edit --amend | | gca | git commit -v -a | | gca! | git commit -v -a --amend | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 26f4beeb..69745730 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -84,6 +84,7 @@ alias gbss='git bisect start' alias gc='git commit -v' alias gc!='git commit -v --amend' +alias gcn='git commit -v --no-edit' alias gcn!='git commit -v --no-edit --amend' alias gca='git commit -v -a' alias gca!='git commit -v -a --amend' From d93f3174504f8a0c21aef6998714e3b67ba82606 Mon Sep 17 00:00:00 2001 From: Carlo Date: Sun, 20 Nov 2022 08:36:20 +0100 Subject: [PATCH 010/321] fix(init): prevent multiple compdump compilations (#11345) Closes #11341 --- oh-my-zsh.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index 29d39ca2..e94c2f41 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -143,7 +143,10 @@ fi unset zcompdump_revision zcompdump_fpath zcompdump_refresh # zcompile the completion dump file if the .zwc is older or missing. -zrecompile -q -p "$ZSH_COMPDUMP" && command rm -f "$ZSH_COMPDUMP.zwc.old" +if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then + zrecompile -q -p "$ZSH_COMPDUMP" + command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock" +fi # Load all of the config files in ~/oh-my-zsh that end in .zsh # TIP: Add files you don't want in git to .gitignore From 96976736166998a980cc3d9570db4c0b594460e3 Mon Sep 17 00:00:00 2001 From: Brenex Date: Mon, 21 Nov 2022 05:23:16 -0500 Subject: [PATCH 011/321] docs(aliases): fix typos (#11348) Co-authored-by: Carlo Sala --- plugins/aliases/README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md index 66fd8458..4e77f67b 100644 --- a/plugins/aliases/README.md +++ b/plugins/aliases/README.md @@ -15,14 +15,14 @@ Requirements: Python needs to be installed. ## Usage -- `acs`: show all aliases by group. +- `acs`: show all aliases by group -- `acs -h/--help`: print help mesage. +- `acs -h/--help`: print help mesage -- `acs `: filter aliases by `` and highlight. +- `acs `: filter aliases by `` and highlight -- `acs -g /--group `. Multiple uses of the flag show all groups, +- `acs -g /--group `: show only aliases for group ``. Multiple uses of the flag show all groups -- `acs --groups-only`: show only group names +- `acs --groups`: show only group names ![screenshot](https://cloud.githubusercontent.com/assets/3602957/11581913/cb54fb8a-9a82-11e5-846b-5a67f67ad9ad.png) From fe83581a20ab12010e9168977dc633c9da2924e1 Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Mon, 21 Nov 2022 05:24:10 -0500 Subject: [PATCH 012/321] fix(last-working-dir): use builtin `pwd` (#11346) --- plugins/last-working-dir/last-working-dir.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/last-working-dir/last-working-dir.plugin.zsh b/plugins/last-working-dir/last-working-dir.plugin.zsh index 905a02a7..684972cc 100644 --- a/plugins/last-working-dir/last-working-dir.plugin.zsh +++ b/plugins/last-working-dir/last-working-dir.plugin.zsh @@ -9,7 +9,7 @@ chpwd_last_working_dir() { [[ "$ZSH_SUBSHELL" -eq 0 ]] || return 0 # Add ".$SSH_USER" suffix to cache file if $SSH_USER is set and non-empty local cache_file="$ZSH_CACHE_DIR/last-working-dir${SSH_USER:+.$SSH_USER}" - pwd >| "$cache_file" + builtin pwd >| "$cache_file" } # Changes directory to the last working directory From 8ef9abc9621321c41e89c578bc6f12176696f36c Mon Sep 17 00:00:00 2001 From: Markus Hofbauer Date: Wed, 23 Nov 2022 10:23:11 +0100 Subject: [PATCH 013/321] feat(pre-commit) add aliases (#10707) --- plugins/pre-commit/README.md | 19 +++++++++++++++++++ plugins/pre-commit/pre-commit.plugin.zsh | 8 ++++++++ 2 files changed, 27 insertions(+) create mode 100644 plugins/pre-commit/README.md create mode 100644 plugins/pre-commit/pre-commit.plugin.zsh diff --git a/plugins/pre-commit/README.md b/plugins/pre-commit/README.md new file mode 100644 index 00000000..e6d80d36 --- /dev/null +++ b/plugins/pre-commit/README.md @@ -0,0 +1,19 @@ +# Pre-commit plugin + +This plugin adds aliases for common commands of [pre-commit](https://pre-commit.com/). + +To use this plugin, add it to the plugins array in your zshrc file: + +```zsh +plugins=(... pre-commit) +``` + +## Aliases + +| Alias | Command | Description | +| ------- | -------------------------------------- | ------------------------------------------------------ | +| prc | `pre-commit` | The `pre-commit` command | +| prcau | `pre-commit autoupdate` | Update hooks automatically | +| prcr | `pre-commit run` | The `pre-commit run` command | +| prcra | `pre-commit run --all-files` | Run pre-commit hooks on all files | +| prcrf | `pre-commit run --files` | Run pre-commit hooks on a given list of files | diff --git a/plugins/pre-commit/pre-commit.plugin.zsh b/plugins/pre-commit/pre-commit.plugin.zsh new file mode 100644 index 00000000..c3d0c629 --- /dev/null +++ b/plugins/pre-commit/pre-commit.plugin.zsh @@ -0,0 +1,8 @@ +# Aliases for pre-commit +alias prc='pre-commit' + +alias prcau='pre-commit autoupdate' + +alias prcr='pre-commit run' +alias prcra='pre-commit run --all-files' +alias prcrf='pre-commit run --files' From 5485d70df2cefa9374c477425d2c1c84646a7d49 Mon Sep 17 00:00:00 2001 From: Luis Serra <74016165+serrovsky@users.noreply.github.com> Date: Wed, 23 Nov 2022 17:24:08 +0000 Subject: [PATCH 014/321] feat(fluxcd): add completion for flux (#11350) --- plugins/fluxcd/README.md | 9 +++++++++ plugins/fluxcd/fluxcd.plugin.zsh | 14 ++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 plugins/fluxcd/README.md create mode 100644 plugins/fluxcd/fluxcd.plugin.zsh diff --git a/plugins/fluxcd/README.md b/plugins/fluxcd/README.md new file mode 100644 index 00000000..9723fcc6 --- /dev/null +++ b/plugins/fluxcd/README.md @@ -0,0 +1,9 @@ +# FluxCD plugin + +This plugin adds completion for [FluxCD](https://fluxcd.io), an open and extensible continuous delivery solution for Kubernetes. Powered by GitOps Toolkit. + +To use it, add `fluxcd` to the plugins array in your zshrc file: + +```zsh +plugins=(... fluxcd) +``` diff --git a/plugins/fluxcd/fluxcd.plugin.zsh b/plugins/fluxcd/fluxcd.plugin.zsh new file mode 100644 index 00000000..d30866a0 --- /dev/null +++ b/plugins/fluxcd/fluxcd.plugin.zsh @@ -0,0 +1,14 @@ +# Autocompletion for the FluxCD CLI (flux). +if (( ! $+commands[flux] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `flux`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_flux" ]]; then + typeset -g -A _comps + autoload -Uz _flux + _comps[flux]=_flux +fi + +flux completion zsh >| "$ZSH_CACHE_DIR/completions/_flux" &| From a473c0cb4ad325de211f37388b0ff6ae435b6df4 Mon Sep 17 00:00:00 2001 From: Luis Serra <74016165+serrovsky@users.noreply.github.com> Date: Wed, 23 Nov 2022 17:24:46 +0000 Subject: [PATCH 015/321] feat(mongo-atlas): add completion for atlas (#11349) --- plugins/mongo-atlas/README.md | 10 ++++++++++ plugins/mongo-atlas/mongo-atlas.plugin.zsh | 14 ++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 plugins/mongo-atlas/README.md create mode 100644 plugins/mongo-atlas/mongo-atlas.plugin.zsh diff --git a/plugins/mongo-atlas/README.md b/plugins/mongo-atlas/README.md new file mode 100644 index 00000000..ef1b5e0d --- /dev/null +++ b/plugins/mongo-atlas/README.md @@ -0,0 +1,10 @@ +# MongoDB Atlas plugin + +This plugin adds completion for [Atlas](https://www.mongodb.com/docs/atlas/cli/stable/) a command line interface built specifically for +MongoDB Atlas. + +To use it, add `mongo-atlas` to the plugins array in your zshrc file: + +```zsh +plugins=(... mongo-atlas) +``` diff --git a/plugins/mongo-atlas/mongo-atlas.plugin.zsh b/plugins/mongo-atlas/mongo-atlas.plugin.zsh new file mode 100644 index 00000000..6762c909 --- /dev/null +++ b/plugins/mongo-atlas/mongo-atlas.plugin.zsh @@ -0,0 +1,14 @@ +# Autocompletion for the Mongo Atlas CLI (atlas). +if (( ! $+commands[atlas] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `atlas`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_atlas" ]]; then + typeset -g -A _comps + autoload -Uz _atlas + _comps[atlas]=_atlas +fi + +atlas completion zsh >| "$ZSH_CACHE_DIR/completions/atlas" &| From da7ea13ba928a36c0b41cb520b0cc192f6389143 Mon Sep 17 00:00:00 2001 From: Mathieu Fenniak Date: Wed, 23 Nov 2022 10:56:26 -0700 Subject: [PATCH 016/321] fix(avit): replace deprecated GREP_COLOR (#11168) --- themes/avit.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/avit.zsh-theme b/themes/avit.zsh-theme index f90ba331..1279ea91 100644 --- a/themes/avit.zsh-theme +++ b/themes/avit.zsh-theme @@ -82,4 +82,4 @@ ZSH_THEME_GIT_TIME_SINCE_COMMIT_NEUTRAL="%{$fg[white]%}" # LS colors, made with https://geoff.greer.fm/lscolors/ export LSCOLORS="exfxcxdxbxegedabagacad" export LS_COLORS='di=34;40:ln=35;40:so=32;40:pi=33;40:ex=31;40:bd=34;46:cd=34;43:su=0;41:sg=0;46:tw=0;42:ow=0;43:' -export GREP_COLOR='1;33' +export GREP_COLORS='mt=1;33' From a4392cfc16ce6f1ddf1fd085819913ee26dc6189 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 15 Nov 2022 19:40:06 +0100 Subject: [PATCH 017/321] feat(docker): update completion Taken from https://github.com/docker/cli/blob/79dca7a38e9969f9d0694d85adbaf13394d893ac/contrib/completion/zsh/_docker Closes #10826 --- plugins/docker/_docker | 54 +++++++++++++----------------------------- 1 file changed, 17 insertions(+), 37 deletions(-) diff --git a/plugins/docker/_docker b/plugins/docker/_docker index 8ee35abc..e6a12d77 100644 --- a/plugins/docker/_docker +++ b/plugins/docker/_docker @@ -567,7 +567,7 @@ __docker_container_commands() { "cp:Copy files/folders between a container and the local filesystem" "create:Create a new container" "diff:Inspect changes on a container's filesystem" - "exec:Run a command in a running container" + "exec:Execute a command in a running container" "export:Export a container's filesystem as a tar archive" "inspect:Display detailed information on one or more containers" "kill:Kill one or more running containers" @@ -579,7 +579,7 @@ __docker_container_commands() { "rename:Rename a container" "restart:Restart one or more containers" "rm:Remove one or more containers" - "run:Run a command in a new container" + "run:Create and run a new container from an image" "start:Start one or more stopped containers" "stats:Display a live stream of container(s) resource usage statistics" "stop:Stop one or more running containers" @@ -650,6 +650,7 @@ __docker_container_subcommand() { "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports" "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid" "($help)--privileged[Give extended privileges to this container]" + "($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]" "($help)--read-only[Mount the container's root filesystem as read only]" "($help)*--security-opt=[Security options]:security option: " "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " @@ -802,7 +803,7 @@ __docker_container_subcommand() { "($help -a --all)"{-a,--all}"[Show all containers]" \ "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \ - "($help)--format=[Pretty-print containers using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \ "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \ "($help)--no-trunc[Do not truncate output]" \ @@ -907,7 +908,7 @@ __docker_container_subcommand() { _arguments $(__docker_arguments) \ $opts_help \ "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \ - "($help)--format=[Pretty-print images using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help)--no-stream[Disable streaming stats and only pull the first result]" \ "($help)--no-trunc[Do not truncate output]" \ "($help -)*:containers:__docker_complete_running_containers" && ret=0 @@ -973,8 +974,8 @@ __docker_image_commands() { "load:Load an image from a tar archive or STDIN" "ls:List images" "prune:Remove unused images" - "pull:Pull an image or a repository from a registry" - "push:Push an image or a repository to a registry" + "pull:Download an image from a registry" + "push:Upload an image to a registry" "rm:Remove one or more images" "save:Save one or more images to a tar archive (streamed to STDOUT by default)" "tag:Tag an image into a repository" @@ -1060,7 +1061,7 @@ __docker_image_subcommand() { "($help -a --all)"{-a,--all}"[Show all images]" \ "($help)--digests[Show digests]" \ "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \ - "($help)--format=[Pretty-print images using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help)--no-trunc[Do not truncate output]" \ "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ "($help -): :__docker_complete_repositories" && ret=0 @@ -1082,7 +1083,7 @@ __docker_image_subcommand() { (push) _arguments $(__docker_arguments) \ $opts_help \ - "($help -a --all-tags)"{-a,--all-tags}"[Push all tagged images in the repository]" \ + "($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \ "($help)--disable-content-trust[Skip image signing]" \ "($help -): :__docker_complete_images" && ret=0 ;; @@ -1292,7 +1293,7 @@ __docker_network_subcommand() { $opts_help \ "($help)--no-trunc[Do not truncate the output]" \ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \ - "($help)--format=[Pretty-print networks using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0 ;; (prune) @@ -2050,7 +2051,7 @@ __docker_service_subcommand() { _arguments $(__docker_arguments) \ $opts_help \ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \ - "($help)--format=[Pretty-print services using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 ;; (rm|remove) @@ -2253,7 +2254,7 @@ __docker_stack_subcommand() { _arguments $(__docker_arguments) \ $opts_help \ "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ - "($help)--format=[Pretty-print services using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ "($help -):stack:__docker_complete_stacks" && ret=0 ;; @@ -2520,7 +2521,7 @@ __docker_volume_subcommand() { _arguments $(__docker_arguments) \ $opts_help \ "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \ - "($help)--format=[Pretty-print volumes using a Go template]:template: " \ + "($help)--format=[Format the output using the given Go template]:template: " \ "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 ;; (prune) @@ -2582,10 +2583,8 @@ __docker_context_subcommand() { (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 ;; @@ -2607,10 +2606,8 @@ __docker_context_subcommand() { (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 @@ -2734,9 +2731,6 @@ __docker_subcommand() { "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ "($help)--bip=[Network bridge IP]:IP address: " \ "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ - "($help)--cluster-advertise=[Address or interface name to advertise]:Instance to advertise (host\:port): " \ - "($help)--cluster-store=[URL of the distributed storage backend]:Cluster Store:->cluster-store" \ - "($help)*--cluster-store-opt=[Cluster store options]:Cluster options:->cluster-store-options" \ "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ "($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \ @@ -2778,7 +2772,7 @@ __docker_subcommand() { "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ "($help)--raw-logs[Full timestamps without ANSI coloring]" \ - "($help)*--registry-mirror=[Preferred Docker registry mirror]:registry mirror: " \ + "($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \ "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \ "($help)--selinux-enabled[Enable selinux support]" \ @@ -2795,22 +2789,6 @@ __docker_subcommand() { "($help)--validate[Validate daemon configuration and exit]" && ret=0 case $state in - (cluster-store) - if compset -P '*://'; then - _message 'host:port' && ret=0 - else - store=('consul' 'etcd' 'zk') - _describe -t cluster-store "Cluster Store" store -qS "://" && ret=0 - fi - ;; - (cluster-store-options) - if compset -P '*='; then - _files && ret=0 - else - opts=('discovery.heartbeat' 'discovery.ttl' 'kv.cacertfile' 'kv.certfile' 'kv.keyfile' 'kv.path') - _describe -t cluster-store-opts "Cluster Store Options" opts -qS "=" && ret=0 - fi - ;; (users-groups) if compset -P '*:'; then _groups && ret=0 @@ -3095,6 +3073,7 @@ _docker() { _arguments $(__docker_arguments) -C \ "(: -)"{-h,--help}"[Print usage]" \ "($help)--config[Location of client config files]:path:_directories" \ + "($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \ "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ @@ -3110,7 +3089,8 @@ _docker() { local host=${opt_args[-H]}${opt_args[--host]} local config=${opt_args[--config]} - local docker_options="${host:+--host $host} ${config:+--config $config}" + local context=${opt_args[-c]}${opt_args[--context]} + local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} " case $state in (command) From 1c06ea24fb2176e28facf34b7c2ed2bfb3c79eaa Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 15 Nov 2022 20:05:13 +0100 Subject: [PATCH 018/321] chore(docker): sort and reorganize aliases --- plugins/docker/README.md | 86 +++++++++++++++----------------- plugins/docker/docker.plugin.zsh | 32 +++++------- 2 files changed, 52 insertions(+), 66 deletions(-) diff --git a/plugins/docker/README.md b/plugins/docker/README.md index 606690f1..b865d53e 100644 --- a/plugins/docker/README.md +++ b/plugins/docker/README.md @@ -13,18 +13,15 @@ https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker ## Settings -By default, the completion doesn't allow option-stacking, meaning if you try to -complete `docker run -it ` it won't work, because you're _stacking_ the -`-i` and `-t` options. +By default, the completion doesn't allow option-stacking, meaning if you try to complete +`docker run -it ` it won't work, because you're _stacking_ the `-i` and `-t` options. -[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding -the lines below to your zshrc file**, but be aware of the side effects: +[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding the lines below to your zshrc +file**, but be aware of the side effects: -> This enables Zsh to understand commands like `docker run -it -> ubuntu`. However, by enabling this, this also makes Zsh complete -> `docker run -u` with `docker run -uapprox` which is not valid. The -> users have to put the space or the equal sign themselves before trying -> to complete. +> This enables Zsh to understand commands like `docker run -it ubuntu`. However, by enabling this, this also +> makes Zsh complete `docker run -u` with `docker run -uapprox` which is not valid. The users have to put +> the space or the equal sign themselves before trying to complete. > > Therefore, this behavior is disabled by default. To enable it: > @@ -35,39 +32,36 @@ the lines below to your zshrc file**, but be aware of the side effects: ## Aliases -| Alias | Command | Description | -| :------ | :-------------------------- | :--------------------------------------------------------------------------------------- | -| dbl | `docker build` | Build an image from a Dockerfile | -| dcin | `docker container inspect` | Display detailed information on one or more containers | -| dlo | `docker container logs` | Fetch the logs of a docker container | -| dcls | `docker container ls` | List all the running docker containers | -| dclsa | `docker container ls -a` | List all running and stopped containers | -| dpo | `docker container port` | List port mappings or a specific mapping for the container | -| dpu | `docker pull` | Pull an image or a repository from a registry | -| dr | `docker container run` | Create a new container and start it using the specified command | -| drit | `docker container run -it` | Create a new container and start it in an interactive shell | -| drm | `docker container rm` | Remove the specified container(s) | -| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | -| dst | `docker container start` | Start one or more stopped containers | -| dstp | `docker container stop` | Stop one or more running containers | -| dtop | `docker top` | Display the running processes of a container | -| dxc | `docker container exec` | Run a new command in a running container | -| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell | -| | | **Docker Images** | -| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) | -| dii | `docker image inspect` | Display detailed information on one or more images | -| dils | `docker image ls` | List docker images | -| dipu | `docker image push` | Push an image or repository to a remote registry | -| dirm | `docker image rm` | Remove one or more images | -| dit | `docker image tag` | Add a name and tag to a particular image | -| | | **Docker Network** | -| dnc | `docker network create` | Create a new network | -| dncn | `docker network connect` | Connect a container to a network | -| dndcn | `docker network disconnect` | Disconnect a container from a network | -| dni | `docker network inspect` | Return information about one or more networks | -| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts | -| dnrm | `docker network rm` | Remove one or more networks | -| | | **Docker Volume** | -| dvi | `docker volume inspect` | Display detailed information about one or more volumes | -| dvls | `docker volume ls` | List all the volumes known to docker | -| dvprune | `docker volume prune` | Cleanup dangling volumes | +| Alias | Command | Description | +| :------ | :---------------------------- | :--------------------------------------------------------------------------------------- | +| dbl | `docker build` | Build an image from a Dockerfile | +| dcin | `docker container inspect` | Display detailed information on one or more containers | +| dcls | `docker container ls` | List all the running docker containers | +| dclsa | `docker container ls -a` | List all running and stopped containers | +| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) | +| dii | `docker image inspect` | Display detailed information on one or more images | +| dils | `docker image ls` | List docker images | +| dipu | `docker image push` | Push an image or repository to a remote registry | +| dirm | `docker image rm` | Remove one or more images | +| dit | `docker image tag` | Add a name and tag to a particular image | +| dlo | `docker container logs` | Fetch the logs of a docker container | +| dnc | `docker network create` | Create a new network | +| dncn | `docker network connect` | Connect a container to a network | +| dndcn | `docker network disconnect` | Disconnect a container from a network | +| dni | `docker network inspect` | Return information about one or more networks | +| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts | +| dnrm | `docker network rm` | Remove one or more networks | +| dpo | `docker container port` | List port mappings or a specific mapping for the container | +| dpu | `docker pull` | Pull an image or a repository from a registry | +| dr | `docker container run` | Create a new container and start it using the specified command | +| drit | `docker container run -it` | Create a new container and start it in an interactive shell | +| drm | `docker container rm` | Remove the specified container(s) | +| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | +| dst | `docker container start` | Start one or more stopped containers | +| dstp | `docker container stop` | Stop one or more running containers | +| dtop | `docker top` | Display the running processes of a container | +| dvi | `docker volume inspect` | Display detailed information about one or more volumes | +| dvls | `docker volume ls` | List all the volumes known to docker | +| dvprune | `docker volume prune` | Cleanup dangling volumes | +| dxc | `docker container exec` | Run a new command in a running container | +| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell | diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 9c8ad8a2..483b3b97 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -1,39 +1,31 @@ alias dbl='docker build' -alias dpu='docker pull' -alias dtop='docker top' - -# docker containers alias dcin='docker container inspect' -alias dlo='docker container logs' alias dcls='docker container ls' alias dclsa='docker container ls -a' -alias dpo='docker container port' -alias dr='docker container run' -alias drit='docker container run -it' -alias drm='docker container rm' -alias 'drm!'='docker container rm -f' -alias dst='docker container start' -alias dstp='docker container stop' -alias dxc='docker container exec' -alias dxcit='docker container exec -it' - -# docker images alias dib='docker image build' alias dii='docker image inspect' alias dils='docker image ls' alias dipu='docker image push' alias dirm='docker image rm' alias dit='docker image tag' - -# docker network +alias dlo='docker container logs' alias dnc='docker network create' alias dncn='docker network connect' alias dndcn='docker network disconnect' alias dni='docker network inspect' alias dnls='docker network ls' alias dnrm='docker network rm' - -# docker volume +alias dpo='docker container port' +alias dpu='docker pull' +alias dr='docker container run' +alias drit='docker container run -it' +alias drm='docker container rm' +alias 'drm!'='docker container rm -f' +alias dst='docker container start' +alias dstp='docker container stop' +alias dtop='docker top' alias dvi='docker volume inspect' alias dvls='docker volume ls' alias dvprune='docker volume prune' +alias dxc='docker container exec' +alias dxcit='docker container exec -it' From c35ca17258dd870f1724eeb92e9077177d2e3bed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Bernard=20Ara=C3=BAjo?= Date: Tue, 15 Nov 2022 20:05:33 +0100 Subject: [PATCH 019/321] feat(docker): add `dsta` alias Closes #11089 --- plugins/docker/README.md | 1 + plugins/docker/docker.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/docker/README.md b/plugins/docker/README.md index b865d53e..040a168d 100644 --- a/plugins/docker/README.md +++ b/plugins/docker/README.md @@ -58,6 +58,7 @@ file**, but be aware of the side effects: | drm | `docker container rm` | Remove the specified container(s) | | drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | | dst | `docker container start` | Start one or more stopped containers | +| dsta | `docker stop $(docker ps -q)` | Stop all running containers | | dstp | `docker container stop` | Stop one or more running containers | | dtop | `docker top` | Display the running processes of a container | | dvi | `docker volume inspect` | Display detailed information about one or more volumes | diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 483b3b97..73780365 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -22,6 +22,7 @@ alias drit='docker container run -it' alias drm='docker container rm' alias 'drm!'='docker container rm -f' alias dst='docker container start' +alias dsta='docker stop $(docker ps -q)' alias dstp='docker container stop' alias dtop='docker top' alias dvi='docker volume inspect' From 1aa58d42a52b8fa39f16ad169fc405f276c36ae5 Mon Sep 17 00:00:00 2001 From: jzhang046 <25826821+jzhang046@users.noreply.github.com> Date: Sun, 27 Nov 2022 17:54:24 +0800 Subject: [PATCH 020/321] fix(changelog): generate correct commit link in markdown (#11356) --- tools/changelog.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index 6489a3cb..a5cc468f 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -209,7 +209,7 @@ function display-release { case "$output" in raw) printf '%s' "$hash" ;; text) printf '\e[33m%s\e[0m' "$hash" ;; # red - md) printf '[`%s`](https://github.com/ohmyzsh/ohmyzsh/commit/%s)' "$hash" ;; + md) printf '[`%s`](https://github.com/ohmyzsh/ohmyzsh/commit/%s)' "$hash" "$hash" ;; esac } From 66addc8b45c93f7661a5d8bba93b7b4afcbc23de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Lopes?= <85288424+agnlopes@users.noreply.github.com> Date: Tue, 29 Nov 2022 13:35:57 +0100 Subject: [PATCH 021/321] feat(skaffold): add completion (#11357) --- plugins/skaffold/README.md | 9 +++++++++ plugins/skaffold/skaffold.plugin.zsh | 14 ++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 plugins/skaffold/README.md create mode 100644 plugins/skaffold/skaffold.plugin.zsh diff --git a/plugins/skaffold/README.md b/plugins/skaffold/README.md new file mode 100644 index 00000000..4ee12c66 --- /dev/null +++ b/plugins/skaffold/README.md @@ -0,0 +1,9 @@ +# Skaffold plugin (Autocompletion) + +This plugin adds completion for [Skaffold](https://skaffold.dev) + +To use it, add `skaffold` to the plugins array in your zshrc file: + +```zsh +plugins=(... skaffold) +``` diff --git a/plugins/skaffold/skaffold.plugin.zsh b/plugins/skaffold/skaffold.plugin.zsh new file mode 100644 index 00000000..8296c450 --- /dev/null +++ b/plugins/skaffold/skaffold.plugin.zsh @@ -0,0 +1,14 @@ +# Autocompletion for skaffold +if (( ! $+commands[skaffold] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `skaffold`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_skaffold" ]]; then + typeset -g -A _comps + autoload -Uz _skaffold + _comps[skaffold]=_skaffold +fi + +skaffold completion zsh >| "$ZSH_CACHE_DIR/completions/_skaffold" &| From a051eb04b88cb0a876d1f3d68559d228a14dccf0 Mon Sep 17 00:00:00 2001 From: Marco Collovati Date: Thu, 1 Dec 2022 12:34:38 +0100 Subject: [PATCH 022/321] feat(mvn): add completion for Vaadin (#11362) --- plugins/mvn/mvn.plugin.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh index 1b9141f2..151fbd2a 100644 --- a/plugins/mvn/mvn.plugin.zsh +++ b/plugins/mvn/mvn.plugin.zsh @@ -283,6 +283,8 @@ function listMavenCompletions { toolchain:toolchain #liberty liberty:clean-server liberty:compile-jsp liberty:configure-arquillian liberty:create-server liberty:debug liberty:debug-server liberty:deploy liberty:dev liberty:display-url liberty:dump-server liberty:install-apps liberty:install-feature liberty:install-server liberty:java-dump-server liberty:package-server liberty:run liberty:run-server liberty:server-status liberty:start liberty:start-server liberty:status liberty:stop liberty:stop-server liberty:test-start-server liberty:test-stop-server liberty:undeploy liberty:uninstall-feature + # vaadin + vaadin:prepare-frontend vaadin:build-frontend vaadin:clean-frontend vaadin:dance # options "-Dmaven.test.skip=true" -DskipTests -DskipITs -Dmaven.surefire.debug -DenableCiProfile "-Dpmd.skip=true" "-Dcheckstyle.skip=true" "-Dtycho.mode=maven" "-Dmaven.test.failure.ignore=true" "-DgroupId=" "-DartifactId=" "-Dversion=" "-Dpackaging=jar" "-Dfile=" From 64bc22aee4d32eb64ee918fc9e63318b68979070 Mon Sep 17 00:00:00 2001 From: Carlo Date: Thu, 1 Dec 2022 19:44:48 +0100 Subject: [PATCH 023/321] feat(nvm): add `silent-autoload` setting (#11363) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Michał Regulski Closes #10942 --- plugins/nvm/README.md | 10 +++++++++- plugins/nvm/nvm.plugin.zsh | 12 +++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index 4c6312e6..d3fd980b 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -48,5 +48,13 @@ If set, the plugin will automatically load a node version when if finds a version to load. This can be done, similar as previous options, adding: ```zsh -zstyle ':omz:plugins:nvm' autoload true +zstyle ':omz:plugins:nvm' autoload yes ``` + +To remove the output generated by NVM when autoloading, you can set the following option: + +```zsh +zstyle ':omz:plugins:nvm' silent-autoload yes +``` + +Note: _this will not remove regular `nvm` output_ diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index ec583cc2..c5799c88 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -24,11 +24,11 @@ if (( ${+NVM_LAZY} + ${+NVM_LAZY_CMD} + ${+NVM_AUTOLOAD} )); then # Nicely print the list in the style `var1, var2 and var3` echo "${fg[yellow]}[nvm plugin] Variable-style settings are deprecated. Instead of ${(j:, :)used_vars[1,-2]}${used_vars[-2]+ and }${used_vars[-1]}, use:\n" if (( $+NVM_AUTOLOAD )); then - echo " zstyle ':omz:plugins:nvm' autoload true" + echo " zstyle ':omz:plugins:nvm' autoload yes" zstyle ':omz:plugins:nvm' autoload yes fi if (( $+NVM_LAZY )); then - echo " zstyle ':omz:plugins:nvm' lazy true" + echo " zstyle ':omz:plugins:nvm' lazy yes" zstyle ':omz:plugins:nvm' lazy yes fi if (( $+NVM_LAZY_CMD )); then @@ -61,9 +61,11 @@ fi # Autoload nvm when finding a .nvmrc file in the current directory # Adapted from: https://github.com/nvm-sh/nvm#zsh if zstyle -t ':omz:plugins:nvm' autoload; then - load-nvmrc() { + function load-nvmrc { local node_version="$(nvm version)" local nvmrc_path="$(nvm_find_nvmrc)" + local nvm_silent="" + zstyle -t ':omz:plugins:nvm' silent-autoload && _nvm_silent="--silent" if [[ -n "$nvmrc_path" ]]; then local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")") @@ -71,11 +73,11 @@ if zstyle -t ':omz:plugins:nvm' autoload; then if [[ "$nvmrc_node_version" = "N/A" ]]; then nvm install elif [[ "$nvmrc_node_version" != "$node_version" ]]; then - nvm use + nvm use $nvm_silent fi elif [[ "$node_version" != "$(nvm version default)" ]]; then echo "Reverting to nvm default version" - nvm use default + nvm use default $nvm_silent fi } From fc44c49cca9d5e499097392d3f42b1375d0253ba Mon Sep 17 00:00:00 2001 From: Zeragamba Date: Thu, 1 Dec 2022 13:49:41 -0500 Subject: [PATCH 024/321] fix(nvm): trim non-printable chars from .nvmrc (#10997) --- plugins/nvm/nvm.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index c5799c88..a4ff29cf 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -68,7 +68,7 @@ if zstyle -t ':omz:plugins:nvm' autoload; then zstyle -t ':omz:plugins:nvm' silent-autoload && _nvm_silent="--silent" if [[ -n "$nvmrc_path" ]]; then - local nvmrc_node_version=$(nvm version "$(cat "${nvmrc_path}")") + local nvmrc_node_version=$(nvm version $(cat "$nvmrc_path" | tr -dc '[:print:]')) if [[ "$nvmrc_node_version" = "N/A" ]]; then nvm install From 7ea8a93bb8fb04a070960048aa0b5dca639456a8 Mon Sep 17 00:00:00 2001 From: Mohammad Parvin Date: Fri, 2 Dec 2022 16:19:00 +0330 Subject: [PATCH 025/321] feat(helm): add aliases (#11361) Co-authored-by: Carlo Sala --- plugins/helm/README.md | 11 ++++++++++- plugins/helm/helm.plugin.zsh | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/helm/README.md b/plugins/helm/README.md index 49844c78..8be024bf 100644 --- a/plugins/helm/README.md +++ b/plugins/helm/README.md @@ -1,9 +1,18 @@ # Helm plugin -This plugin adds completion for [Helm](https://helm.sh/), the Kubernetes package manager. +This plugin adds completion and aliases for [Helm](https://helm.sh/), the Kubernetes package manager. To use it, add `helm` to the plugins array in your zshrc file: ```zsh plugins=(... helm) ``` + +## Aliases + +| Alias | Full command | +| ----- | ------------ | +| h | helm | +| hin | helm install | +| hse | helm search | +| hup | helm upgrade | diff --git a/plugins/helm/helm.plugin.zsh b/plugins/helm/helm.plugin.zsh index 151c43d8..7fc05be9 100644 --- a/plugins/helm/helm.plugin.zsh +++ b/plugins/helm/helm.plugin.zsh @@ -11,3 +11,8 @@ else source "$ZSH_CACHE_DIR/completions/_helm" helm completion zsh | tee "$ZSH_CACHE_DIR/completions/_helm" >/dev/null &| fi + +alias h='helm' +alias hin='helm install' +alias hse='helm search' +alias hup='helm upgrade' From 3a9322b9a0698a3861277890f791b43e727cccc5 Mon Sep 17 00:00:00 2001 From: Noam Okman Date: Mon, 5 Dec 2022 15:18:18 +0200 Subject: [PATCH 026/321] feat(yarn): add format alias (#11368) --- plugins/yarn/README.md | 1 + plugins/yarn/yarn.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/yarn/README.md b/plugins/yarn/README.md index cdda2026..270bf6b7 100644 --- a/plugins/yarn/README.md +++ b/plugins/yarn/README.md @@ -29,6 +29,7 @@ zstyle ':omz:plugins:yarn' global-path no | yb | `yarn build` | Run the build script defined in `package.json` | | ycc | `yarn cache clean` | Clean yarn's global cache of packages | | yd | `yarn dev` | Run the dev script defined in `package.json` | +| yf | `yarn format` | Run the dev script defined in `package.json` | | yga | `yarn global add` | Install packages globally on your operating system | | ygls | `yarn global list` | Lists global installed packages | | ygrm | `yarn global remove` | Remove global installed packages from your OS | diff --git a/plugins/yarn/yarn.plugin.zsh b/plugins/yarn/yarn.plugin.zsh index bcb8661c..7ba710df 100644 --- a/plugins/yarn/yarn.plugin.zsh +++ b/plugins/yarn/yarn.plugin.zsh @@ -17,6 +17,7 @@ alias yap="yarn add --peer" alias yb="yarn build" alias ycc="yarn cache clean" alias yd="yarn dev" +alias yf="yarn format" alias yga="yarn global add" alias ygls="yarn global list" alias ygrm="yarn global remove" From 585e7138b556db89715eb2a850f8959fdf527384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Regulski?= Date: Tue, 6 Dec 2022 18:22:13 +0100 Subject: [PATCH 027/321] fix(nvm): omit message when silent-autoload is enabled (#11371) --- plugins/nvm/nvm.plugin.zsh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index a4ff29cf..20697d67 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -65,7 +65,7 @@ if zstyle -t ':omz:plugins:nvm' autoload; then local node_version="$(nvm version)" local nvmrc_path="$(nvm_find_nvmrc)" local nvm_silent="" - zstyle -t ':omz:plugins:nvm' silent-autoload && _nvm_silent="--silent" + zstyle -t ':omz:plugins:nvm' silent-autoload && nvm_silent="--silent" if [[ -n "$nvmrc_path" ]]; then local nvmrc_node_version=$(nvm version $(cat "$nvmrc_path" | tr -dc '[:print:]')) @@ -76,7 +76,10 @@ if zstyle -t ':omz:plugins:nvm' autoload; then nvm use $nvm_silent fi elif [[ "$node_version" != "$(nvm version default)" ]]; then - echo "Reverting to nvm default version" + if [[ -z $nvm_silent ]]; then + echo "Reverting to nvm default version" + fi + nvm use default $nvm_silent fi } From 658eb01d82c01d82b4263b3dc59e15232cb4cdaf Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 6 Dec 2022 22:51:52 +0100 Subject: [PATCH 028/321] refactor(kubectl): standarize completion generation --- plugins/kubectl/kubectl.plugin.zsh | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh index 095d2b32..b415d1ad 100644 --- a/plugins/kubectl/kubectl.plugin.zsh +++ b/plugins/kubectl/kubectl.plugin.zsh @@ -1,15 +1,17 @@ -if (( $+commands[kubectl] )); then - # If the completion file does not exist, generate it and then source it - # Otherwise, source it and regenerate in the background - if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then - kubectl completion zsh | tee "$ZSH_CACHE_DIR/completions/_kubectl" >/dev/null - source "$ZSH_CACHE_DIR/completions/_kubectl" - else - source "$ZSH_CACHE_DIR/completions/_kubectl" - kubectl completion zsh | tee "$ZSH_CACHE_DIR/completions/_kubectl" >/dev/null &| - fi +if (( ! $+commands[kubectl] )); then + return fi +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `kubectl`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then + typeset -g -A _comps + autoload -Uz _kubectl + _comps[kubectl]=_kubectl +fi + +kubectl completion zsh >| "$ZSH_CACHE_DIR/completions/_kubectl" &| + # This command is used a LOT both below and in daily life alias k=kubectl From b692ff2e1597816563cbdaeeedf0966ad9babeca Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 7 Dec 2022 12:18:51 +0100 Subject: [PATCH 029/321] fix(kubectl): redirect stderr in completion generation Fixes #11364 --- plugins/kubectl/kubectl.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh index b415d1ad..315d3ce9 100644 --- a/plugins/kubectl/kubectl.plugin.zsh +++ b/plugins/kubectl/kubectl.plugin.zsh @@ -10,7 +10,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then _comps[kubectl]=_kubectl fi -kubectl completion zsh >| "$ZSH_CACHE_DIR/completions/_kubectl" &| +kubectl completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_kubectl" &| # This command is used a LOT both below and in daily life alias k=kubectl From f4dc8c5be365668810783ced01a86ff8f251bfd7 Mon Sep 17 00:00:00 2001 From: fedor <60283525+izumrudik@users.noreply.github.com> Date: Thu, 8 Dec 2022 14:38:13 +0300 Subject: [PATCH 030/321] fix(tmux): use `$...SESSION_NAME` while attaching (#10946) --- plugins/tmux/tmux.plugin.zsh | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index b9bb66d5..311c2e6a 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -73,7 +73,11 @@ function _zsh_tmux_plugin_run() { [[ "$ZSH_TMUX_UNICODE" == "true" ]] && tmux_cmd+=(-u) # Try to connect to an existing session. - [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach + if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach -t $ZSH_TMUX_DEFAULT_SESSION_NAME + else + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach + fi # If failed, just run tmux, fixing the TERM variable if requested. if [[ $? -ne 0 ]]; then @@ -83,9 +87,9 @@ function _zsh_tmux_plugin_run() { tmux_cmd+=(-f "$ZSH_TMUX_CONFIG") fi if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then - $tmux_cmd new-session -s $ZSH_TMUX_DEFAULT_SESSION_NAME + $tmux_cmd new-session -s $ZSH_TMUX_DEFAULT_SESSION_NAME else - $tmux_cmd new-session + $tmux_cmd new-session fi fi From cc5100d1e9e3d843ab93a12a5b0bac71ae0425f3 Mon Sep 17 00:00:00 2001 From: Neil Girdhar Date: Fri, 9 Dec 2022 04:07:52 -0500 Subject: [PATCH 031/321] feat(pip): add several aliases (#10647) --- plugins/pip/README.md | 8 ++++++++ plugins/pip/pip.plugin.zsh | 26 +++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/plugins/pip/README.md b/plugins/pip/README.md index 88d88227..70d40c79 100644 --- a/plugins/pip/README.md +++ b/plugins/pip/README.md @@ -22,6 +22,14 @@ the next time you autocomplete `pip install`. | Alias | Description | | :------- | :-------------------------------------------- | +| pipi | Install packages | +| pipig | Install package from GitHub repository | +| pipigb | Install package from GitHub branch | +| pipigp | Install package from GitHub pull request | +| pipu | Upgrade packages | +| pipun | Uninstall packages | +| pipgi | Grep through installed packages | +| piplo | List outdated packages | | pipreq | Create requirements file | | pipir | Install packages from `requirements.txt` file | | pipupall | Update all installed packages | diff --git a/plugins/pip/pip.plugin.zsh b/plugins/pip/pip.plugin.zsh index 90e39e11..bf1aafd4 100644 --- a/plugins/pip/pip.plugin.zsh +++ b/plugins/pip/pip.plugin.zsh @@ -88,6 +88,12 @@ else alias pip="noglob pip" fi +alias pipi="pip install" +alias pipu="pip install --upgrade" +alias pipun="pip uninstall" +alias pipgi="pip freeze | grep" +alias piplo="pip list -o" + # Create requirements file alias pipreq="pip freeze > requirements.txt" @@ -102,10 +108,28 @@ function pipupall { pip list --outdated | awk 'NR > 2 { print $1 }' | ${=xargs} pip install --upgrade } -# Uninstalled all installed packages +# Uninstall all installed packages function pipunall { # non-GNU xargs does not support nor need `--no-run-if-empty` local xargs="xargs --no-run-if-empty" xargs --version 2>/dev/null | grep -q GNU || xargs="xargs" pip list --format freeze | cut -d= -f1 | ${=xargs} pip uninstall } + +# Install from GitHub repository +function pipig { + pip install "git+https://github.com/$1.git" +} +compdef _pip pipig + +# Install from GitHub branch +function pipigb { + pip install "git+https://github.com/$1.git@$2" +} +compdef _pip pipigb + +# Install from GitHub pull request +function pipigp { + pip install "git+https://github.com/$1.git@refs/pull/$2/head" +} +compdef _pip pipigp From c189e8b40c2a9ed15850d5bb5a68e6789be5fc70 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 9 Dec 2022 18:10:04 +0000 Subject: [PATCH 032/321] feat(agnoster): add remote-tracking status to prompt (#7209) --- themes/agnoster.zsh-theme | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index 5f4efe81..88854ecc 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -116,6 +116,17 @@ prompt_git() { prompt_segment green $CURRENT_FG fi + local ahead behind + ahead=$(git log --oneline @{upstream}.. 2>/dev/null) + behind=$(git log --oneline ..@{upstream} 2>/dev/null) + if [[ -n "$ahead" ]] && [[ -n "$behind" ]]; then + PL_BRANCH_CHAR=$'\u21c5' + elif [[ -n "$ahead" ]]; then + PL_BRANCH_CHAR=$'\u21b1' + elif [[ -n "$behind" ]]; then + PL_BRANCH_CHAR=$'\u21b0' + fi + if [[ -e "${repo_path}/BISECT_LOG" ]]; then mode=" " elif [[ -e "${repo_path}/MERGE_HEAD" ]]; then From 82c0db41bcfd3fd97d6170dcb7575f98e38fc68d Mon Sep 17 00:00:00 2001 From: Basil Sh Date: Sat, 10 Dec 2022 00:11:16 +0600 Subject: [PATCH 033/321] docs(term_tab): rewrite README in markdown (#11381) --- plugins/term_tab/README | 16 ---------------- plugins/term_tab/README.md | 16 ++++++++++++++++ 2 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 plugins/term_tab/README create mode 100644 plugins/term_tab/README.md diff --git a/plugins/term_tab/README b/plugins/term_tab/README deleted file mode 100644 index 316062e7..00000000 --- a/plugins/term_tab/README +++ /dev/null @@ -1,16 +0,0 @@ - -term_tab - 'cwd' for all open zsh sessions -****************************************** - -What it does: -************* -This plugin allows to complete the 'cwd' of other Zsh sessions. Sounds -complicated but is rather simple. E.g. if you have three zsh sessions open, in -each session you are in a different folder, you can hit Ctrl+v in one session -to show you the current working directory of the other open zsh sessions. - -How it works: -************* -* It uses 'pidof zsh' to determine all zsh PIDs -* It reads procfs to get the current working directory of this session -* Everything is fed into zsh's completion magic diff --git a/plugins/term_tab/README.md b/plugins/term_tab/README.md new file mode 100644 index 00000000..7548fe6a --- /dev/null +++ b/plugins/term_tab/README.md @@ -0,0 +1,16 @@ +# term_tab plugin + +term_tab - `cwd` for all open zsh sessions + +## What it does: + +This plugin allows to complete the `cwd` of other Zsh sessions. Sounds +complicated but is rather simple. E.g. if you have three zsh sessions open, in +each session you are in a different folder, you can hit `Ctrl+V` in one session +to show you the current working directory of the other open zsh sessions. + +## How it works: + +* It uses `pidof zsh` to determine all zsh PIDs +* It reads procfs to get the current working directory of this session +* Everything is fed into zsh's completion magic From 29cf199b5d84eb4897f2e0e421a344174568eb9f Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Mon, 12 Dec 2022 03:18:29 -0500 Subject: [PATCH 034/321] docs(term_tab): plugin can only be used with linux and solaris (#11385) --- plugins/term_tab/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/term_tab/README.md b/plugins/term_tab/README.md index 7548fe6a..59462a82 100644 --- a/plugins/term_tab/README.md +++ b/plugins/term_tab/README.md @@ -1,5 +1,7 @@ # term_tab plugin +This plugin only works for Solaris and linux. + term_tab - `cwd` for all open zsh sessions ## What it does: From 3705edf557922f286a5054523d6d7208e2ed6f5e Mon Sep 17 00:00:00 2001 From: kormosi <53222723+kormosi@users.noreply.github.com> Date: Thu, 15 Dec 2022 11:47:10 +0100 Subject: [PATCH 035/321] feat(docker): add `drs` alias (#11393) --- plugins/docker/README.md | 1 + plugins/docker/docker.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/docker/README.md b/plugins/docker/README.md index 040a168d..512b5d17 100644 --- a/plugins/docker/README.md +++ b/plugins/docker/README.md @@ -58,6 +58,7 @@ file**, but be aware of the side effects: | drm | `docker container rm` | Remove the specified container(s) | | drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | | dst | `docker container start` | Start one or more stopped containers | +| drs | `docker container restart` | Restart one or more containers | dsta | `docker stop $(docker ps -q)` | Stop all running containers | | dstp | `docker container stop` | Stop one or more running containers | | dtop | `docker top` | Display the running processes of a container | diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 73780365..8684a978 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -22,6 +22,7 @@ alias drit='docker container run -it' alias drm='docker container rm' alias 'drm!'='docker container rm -f' alias dst='docker container start' +alias drs='docker container restart' alias dsta='docker stop $(docker ps -q)' alias dstp='docker container stop' alias dtop='docker top' From 13082bb159361d1c0807eb7e5577f4c670cb0f88 Mon Sep 17 00:00:00 2001 From: Till Backhaus Date: Fri, 16 Dec 2022 12:46:34 +0100 Subject: [PATCH 036/321] feat(watson): add completion (#10886) Co-authored-by: Carlo Sala --- plugins/watson/README.md | 9 +++++++++ plugins/watson/_watson | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 plugins/watson/README.md create mode 100644 plugins/watson/_watson diff --git a/plugins/watson/README.md b/plugins/watson/README.md new file mode 100644 index 00000000..ef734ec6 --- /dev/null +++ b/plugins/watson/README.md @@ -0,0 +1,9 @@ +# Watson + +This plugin provides completion for [Watson](https://tailordev.github.io/Watson/). + +To use it add `watson` to the plugins array in your zshrc file. + +```zsh +plugins=(... watson) +``` diff --git a/plugins/watson/_watson b/plugins/watson/_watson new file mode 100644 index 00000000..0f599bd6 --- /dev/null +++ b/plugins/watson/_watson @@ -0,0 +1,34 @@ +#compdef watson + +_watson_completion() { + local -a completions + local -a completions_with_descriptions + local -a response + (( ! $+commands[watson] )) && return 1 + + response=("${(@f)$(env COMP_WORDS="${words[*]}" COMP_CWORD=$((CURRENT-1)) _WATSON_COMPLETE=zsh_complete watson)}") + + for type key descr in ${response}; do + if [[ "$type" == "plain" ]]; then + if [[ "$descr" == "_" ]]; then + completions+=("$key") + else + completions_with_descriptions+=("$key":"$descr") + fi + elif [[ "$type" == "dir" ]]; then + _path_files -/ + elif [[ "$type" == "file" ]]; then + _path_files -f + fi + done + + if [ -n "$completions_with_descriptions" ]; then + _describe -V unsorted completions_with_descriptions -U + fi + + if [ -n "$completions" ]; then + compadd -U -V unsorted -a completions + fi +} + +compdef _watson_completion watson; From 2bc42d223cfe3e21aef06648fb971bd9fb00828e Mon Sep 17 00:00:00 2001 From: Renjith Date: Sat, 17 Dec 2022 22:23:48 +0530 Subject: [PATCH 037/321] feat(docker-compose): add `dcupdb` alias (#10235) --- plugins/docker-compose/README.md | 39 ++++++++++--------- .../docker-compose/docker-compose.plugin.zsh | 1 + 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/plugins/docker-compose/README.md b/plugins/docker-compose/README.md index 13f3c2ce..bbcff2e0 100644 --- a/plugins/docker-compose/README.md +++ b/plugins/docker-compose/README.md @@ -11,22 +11,23 @@ plugins=(... docker-compose) ## Aliases -| Alias | Command | Description | -|-----------|--------------------------------|------------------------------------------------------------------| -| dco | `docker-compose` | Docker-compose main command | -| dcb | `docker-compose build` | Build containers | -| dce | `docker-compose exec` | Execute command inside a container | -| dcps | `docker-compose ps` | List containers | -| dcrestart | `docker-compose restart` | Restart container | -| dcrm | `docker-compose rm` | Remove container | -| dcr | `docker-compose run` | Run a command in container | -| dcstop | `docker-compose stop` | Stop a container | -| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service | -| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers | -| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon | -| dcdn | `docker-compose down` | Stop and remove containers | -| dcl | `docker-compose logs` | Show logs of container | -| dclf | `docker-compose logs -f` | Show logs and follow output | -| dcpull | `docker-compose pull` | Pull image of a service | -| dcstart | `docker-compose start` | Start a container | -| dck | `docker-compose kill` | Kills containers | +| Alias | Command | Description | +|-----------|--------------------------------|----------------------------------------------------------------------------------| +| dco | `docker-compose` | Docker-compose main command | +| dcb | `docker-compose build` | Build containers | +| dce | `docker-compose exec` | Execute command inside a container | +| dcps | `docker-compose ps` | List containers | +| dcrestart | `docker-compose restart` | Restart container | +| dcrm | `docker-compose rm` | Remove container | +| dcr | `docker-compose run` | Run a command in container | +| dcstop | `docker-compose stop` | Stop a container | +| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service | +| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers | +| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon | +| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon | +| dcdn | `docker-compose down` | Stop and remove containers | +| dcl | `docker-compose logs` | Show logs of container | +| dclf | `docker-compose logs -f` | Show logs and follow output | +| dcpull | `docker-compose pull` | Pull image of a service | +| dcstart | `docker-compose start` | Start a container | +| dck | `docker-compose kill` | Kills containers | diff --git a/plugins/docker-compose/docker-compose.plugin.zsh b/plugins/docker-compose/docker-compose.plugin.zsh index b8a4b067..7a8bf4a0 100644 --- a/plugins/docker-compose/docker-compose.plugin.zsh +++ b/plugins/docker-compose/docker-compose.plugin.zsh @@ -12,6 +12,7 @@ alias dcstop="$dccmd stop" alias dcup="$dccmd up" alias dcupb="$dccmd up --build" alias dcupd="$dccmd up -d" +alias dcupdb="$dccmd up -d --build" alias dcdn="$dccmd down" alias dcl="$dccmd logs" alias dclf="$dccmd logs -f" From 9c2d1af8afa02b5439e8ccc81a160e62e1e59617 Mon Sep 17 00:00:00 2001 From: Andrew Starr-Bochicchio Date: Tue, 20 Dec 2022 14:56:30 -0500 Subject: [PATCH 038/321] fix(doctl): actually load completions (#11402) --- plugins/doctl/doctl.plugin.zsh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/doctl/doctl.plugin.zsh b/plugins/doctl/doctl.plugin.zsh index d23ed085..7b3a384a 100644 --- a/plugins/doctl/doctl.plugin.zsh +++ b/plugins/doctl/doctl.plugin.zsh @@ -4,6 +4,14 @@ # # Author: https://github.com/HalisCz -if [ $commands[doctl] ]; then - source <(doctl completion zsh) +if (( ! $+commands[doctl] )); then + return fi + +if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then + typeset -g -A _comps + autoload -Uz _doctl + _comps[doctl]=_doctl +fi + +doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &| From a3c579bf27b34942d4c6ad64e7cfd75788b05ea3 Mon Sep 17 00:00:00 2001 From: Nur Rony <2513341+nurrony@users.noreply.github.com> Date: Mon, 26 Dec 2022 14:41:30 +0600 Subject: [PATCH 039/321] feat(maven): add `quarkus` command support (#11405) --- plugins/mvn/mvn.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh index 151fbd2a..da51f74d 100644 --- a/plugins/mvn/mvn.plugin.zsh +++ b/plugins/mvn/mvn.plugin.zsh @@ -196,7 +196,7 @@ function listMavenCompletions { # spring-boot spring-boot:run spring-boot:repackage # quarkus - quarkus:dev quarkus:list-extensions quarkus:add-extension quarkus:add-extensions quarkus:generate-config quarkus:help + quarkus:dev quarkus:list-extensions quarkus:add-extension quarkus:add-extensions quarkus:remove-extension quarkus:remove-extensions quarkus:generate-config quarkus:help # exec exec:exec exec:java # versions @@ -287,7 +287,7 @@ function listMavenCompletions { vaadin:prepare-frontend vaadin:build-frontend vaadin:clean-frontend vaadin:dance # options - "-Dmaven.test.skip=true" -DskipTests -DskipITs -Dmaven.surefire.debug -DenableCiProfile "-Dpmd.skip=true" "-Dcheckstyle.skip=true" "-Dtycho.mode=maven" "-Dmaven.test.failure.ignore=true" "-DgroupId=" "-DartifactId=" "-Dversion=" "-Dpackaging=jar" "-Dfile=" + "-Dmaven.test.skip=true" -DskipTests -DskipITs -Dmaven.surefire.debug -DenableCiProfile "-Dpmd.skip=true" "-Dcheckstyle.skip=true" "-Dtycho.mode=maven" "-Dmaven.test.failure.ignore=true" "-DgroupId=" "-DartifactId=" "-Dversion=" "-Dpackaging=jar" "-Dfile=" "-Dextensions=" # arguments -am --also-make From 55e4e6c73b2bb067974c6d49ba9da2ba1ee3295c Mon Sep 17 00:00:00 2001 From: "the.brain.w" Date: Fri, 30 Dec 2022 11:52:18 +0100 Subject: [PATCH 040/321] feat(systemd): add support for user units in prompt (#11417) --- plugins/systemd/systemd.plugin.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/systemd/systemd.plugin.zsh b/plugins/systemd/systemd.plugin.zsh index 7afd2be5..1270bea0 100644 --- a/plugins/systemd/systemd.plugin.zsh +++ b/plugins/systemd/systemd.plugin.zsh @@ -107,6 +107,8 @@ function systemd_prompt_info { if systemctl is-active "$unit" &>/dev/null; then echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE" + elif systemctl --user is-active "$unit" &>/dev/null; then + echo -n "$ZSH_THEME_SYSTEMD_PROMPT_ACTIVE" else echo -n "$ZSH_THEME_SYSTEMD_PROMPT_NOTACTIVE" fi From 6710fd588aec2c0cb90e70c02db0837c3646af99 Mon Sep 17 00:00:00 2001 From: Ennio Mara Date: Mon, 2 Jan 2023 21:32:45 +0100 Subject: [PATCH 041/321] fix(autojump): fix autojump sourcing in nix (-darwin) (#11422) * fix(autojump): fix autojump sourcing in nix (-darwin) This plugin expects to source an sh/zsh file which sets up autojump, but that is not done when running Nix on macos using nix-darwin. Looking at the old value (/etc/profiles/per-user/$USER/bin/autojump), it points to a binary file instead of the setup script. * Use zsh file instead of sh --- plugins/autojump/autojump.plugin.zsh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh index e11f231b..9bc190bd 100644 --- a/plugins/autojump/autojump.plugin.zsh +++ b/plugins/autojump/autojump.plugin.zsh @@ -1,18 +1,18 @@ declare -a autojump_paths autojump_paths=( - $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation - $HOME/.autojump/share/autojump/autojump.zsh # manual installation - $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation - /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation - /usr/share/autojump/autojump.zsh # Debian and Ubuntu package - /etc/profile.d/autojump.zsh # manual installation - /etc/profile.d/autojump.sh # Gentoo installation - /usr/local/share/autojump/autojump.zsh # FreeBSD installation - /usr/pkg/share/autojump/autojump.zsh # NetBSD installation - /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts - /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default) - /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) - /etc/profiles/per-user/$USER/bin/autojump # macOS Nix, Home Manager and flakes + $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation + $HOME/.autojump/share/autojump/autojump.zsh # manual installation + $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation + /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation + /usr/share/autojump/autojump.zsh # Debian and Ubuntu package + /etc/profile.d/autojump.zsh # manual installation + /etc/profile.d/autojump.sh # Gentoo installation + /usr/local/share/autojump/autojump.zsh # FreeBSD installation + /usr/pkg/share/autojump/autojump.zsh # NetBSD installation + /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts + /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default) + /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) + /etc/profiles/per-user/$USER/etc/profile.d/autojump.zsh # macOS Nix, Home Manager and flakes ) for file in $autojump_paths; do From 36f1055eeea0f455676381539fcb3e6e0a4da731 Mon Sep 17 00:00:00 2001 From: Ennio Mara Date: Mon, 2 Jan 2023 21:55:47 +0100 Subject: [PATCH 042/321] fix(autojump): use sh file instead of zsh in NixOS (#11425) --- plugins/autojump/autojump.plugin.zsh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh index 9bc190bd..1b868ee8 100644 --- a/plugins/autojump/autojump.plugin.zsh +++ b/plugins/autojump/autojump.plugin.zsh @@ -1,18 +1,18 @@ declare -a autojump_paths autojump_paths=( - $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation - $HOME/.autojump/share/autojump/autojump.zsh # manual installation - $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation - /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation - /usr/share/autojump/autojump.zsh # Debian and Ubuntu package - /etc/profile.d/autojump.zsh # manual installation - /etc/profile.d/autojump.sh # Gentoo installation - /usr/local/share/autojump/autojump.zsh # FreeBSD installation - /usr/pkg/share/autojump/autojump.zsh # NetBSD installation - /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts - /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default) - /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) - /etc/profiles/per-user/$USER/etc/profile.d/autojump.zsh # macOS Nix, Home Manager and flakes + $HOME/.autojump/etc/profile.d/autojump.zsh # manual installation + $HOME/.autojump/share/autojump/autojump.zsh # manual installation + $HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation + /run/current-system/sw/share/autojump/autojump.zsh # NixOS installation + /usr/share/autojump/autojump.zsh # Debian and Ubuntu package + /etc/profile.d/autojump.zsh # manual installation + /etc/profile.d/autojump.sh # Gentoo installation + /usr/local/share/autojump/autojump.zsh # FreeBSD installation + /usr/pkg/share/autojump/autojump.zsh # NetBSD installation + /opt/local/etc/profile.d/autojump.sh # macOS with MacPorts + /usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default) + /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) + /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes ) for file in $autojump_paths; do From 00c37b6991895aac0398a24d7d8b78cda63dec05 Mon Sep 17 00:00:00 2001 From: Alastair Rankine Date: Tue, 3 Jan 2023 03:44:53 -0500 Subject: [PATCH 043/321] feat(pipenv): standarize completion generation (#11424) Co-authored-by: Carlo Sala Closes #11423 --- plugins/pipenv/pipenv.plugin.zsh | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/pipenv/pipenv.plugin.zsh b/plugins/pipenv/pipenv.plugin.zsh index 4be61a92..244bd6b7 100644 --- a/plugins/pipenv/pipenv.plugin.zsh +++ b/plugins/pipenv/pipenv.plugin.zsh @@ -1,8 +1,16 @@ -# Pipenv completion -_pipenv() { - eval $(env COMMANDLINE="${words[1,$CURRENT]}" _PIPENV_COMPLETE=complete-zsh pipenv) -} -compdef _pipenv pipenv +if (( ! $+commands[pipenv] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `pipenv`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_pipenv" ]]; then + typeset -g -A _comps + autoload -Uz _pipenv + _comps[pipenv]=_pipenv +fi + +_PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &| # Automatic pipenv shell activation/deactivation _togglePipenvShell() { From 3fca9c8933afc5c118a73cedb171a3c7b8e92730 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 3 Jan 2023 10:02:03 +0100 Subject: [PATCH 044/321] fix(upgrade): check if git is available and working macOS seems to break dev tools when updating the system. This should prevent the previous issues. See #11309 Closes #11420 --- tools/check_for_upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index cc527e72..3a6bb655 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -24,7 +24,7 @@ zstyle -s ':omz:update' mode update_mode || { # - git is unavailable on the system. if [[ "$update_mode" = disabled ]] \ || [[ ! -w "$ZSH" || ! -O "$ZSH" ]] \ - || ! command -v git &>/dev/null; then + || ! command git --version 2>&1 >/dev/null; then unset update_mode return fi From 280c99dae691e468d12c94f64c97964b88cdad4e Mon Sep 17 00:00:00 2001 From: ZigZagT Date: Thu, 5 Jan 2023 15:03:12 -0800 Subject: [PATCH 045/321] feat(git): accept `default` and `mainline` as main branches (#11431) --- plugins/git/git.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 69745730..76e58a12 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -31,7 +31,7 @@ function work_in_progress() { function git_main_branch() { command git rev-parse --git-dir &>/dev/null || return local ref - for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk}; do + for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default}; do if command git show-ref -q --verify $ref; then echo ${ref:t} return From 71ca38652b039c41ef9b415d0fc05926c37a0bfb Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 6 Jan 2023 00:14:33 +0100 Subject: [PATCH 046/321] fix(git-extras): type properly `__gitex_command_successful` calls Closes #11430 --- plugins/git-extras/git-extras.plugin.zsh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/git-extras/git-extras.plugin.zsh b/plugins/git-extras/git-extras.plugin.zsh index b86d7c5b..6b96e12a 100644 --- a/plugins/git-extras/git-extras.plugin.zsh +++ b/plugins/git-extras/git-extras.plugin.zsh @@ -51,7 +51,7 @@ __gitex_remote_names() { local expl declare -a remote_names remote_names=(${(f)"$(_call_program remotes git remote 2>/dev/null)"}) - __git_command_successful || return + __gitex_command_successful || return _wanted remote-names expl remote-name compadd $* - $remote_names } @@ -59,7 +59,7 @@ __gitex_tag_names() { local expl declare -a tag_names tag_names=(${${(f)"$(_call_program tags git for-each-ref --format='"%(refname)"' refs/tags 2>/dev/null)"}#refs/tags/}) - __git_command_successful || return + __gitex_command_successful || return _wanted tag-names expl tag-name compadd $* - $tag_names } @@ -68,7 +68,7 @@ __gitex_branch_names() { local expl declare -a branch_names branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/}) - __git_command_successful || return + __gitex_command_successful || return _wanted branch-names expl branch-name compadd $* - $branch_names } @@ -76,7 +76,7 @@ __gitex_specific_branch_names() { local expl declare -a branch_names branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads/"$1" 2>/dev/null)"}#refs/heads/$1/}) - __git_command_successful || return + __gitex_command_successful || return _wanted branch-names expl branch-name compadd - $branch_names } @@ -100,7 +100,7 @@ __gitex_submodule_names() { local expl declare -a submodule_names submodule_names=(${(f)"$(_call_program branchrefs git submodule status | awk '{print $2}')"}) # ' - __git_command_successful || return + __gitex_command_successful || return _wanted submodule-names expl submodule-name compadd $* - $submodule_names } @@ -109,7 +109,7 @@ __gitex_author_names() { local expl declare -a author_names author_names=(${(f)"$(_call_program branchrefs git log --format='%aN' | sort -u)"}) - __git_command_successful || return + __gitex_command_successful || return _wanted author-names expl author-name compadd $* - $author_names } From 69dfd7758033b3e771dcd184c1b143d166a85481 Mon Sep 17 00:00:00 2001 From: Maksym Date: Fri, 6 Jan 2023 14:39:45 +0000 Subject: [PATCH 047/321] chore: remove maksyms as maintainer of aws plugin (#11432) I'm afraid I no longer use `ohmyzsh` or even `zsh` in favour of `fish`. Hence, it doesn't make sense for me to continue being the code owner for the plugin. Good luck with an amazing tool! --- .github/CODEOWNERS | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c6b3e8ce..6668cd7c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1,5 @@ # Plugin owners plugins/archlinux/ @ratijas -plugins/aws/ @maksyms plugins/genpass/ @atoponce plugins/git-lfs/ @hellovietduc plugins/gitfast/ @felipec From 08c3ce8882ea0bbbfb0a734f1f8870a72ba21f8a Mon Sep 17 00:00:00 2001 From: Lee Stetson Date: Mon, 9 Jan 2023 13:59:02 -0500 Subject: [PATCH 048/321] feat(bridgetown): Add plugin for Ruby bridgetown site generator (#10496) --- plugins/bridgetown/README.md | 26 ++++++++++++++++++++++++ plugins/bridgetown/bridgetown.plugin.zsh | 12 +++++++++++ 2 files changed, 38 insertions(+) create mode 100644 plugins/bridgetown/README.md create mode 100644 plugins/bridgetown/bridgetown.plugin.zsh diff --git a/plugins/bridgetown/README.md b/plugins/bridgetown/README.md new file mode 100644 index 00000000..0a41814e --- /dev/null +++ b/plugins/bridgetown/README.md @@ -0,0 +1,26 @@ +# Bridgetown plugin + +This plugin adds some aliases and autocompletion for common [Bridgetown](https://bridgetownrb.com/) commands. + +To use it, add `bridgetown` to the plugins array in your zshrc file: + +```zsh +plugins=(... bridgetown) +``` + +## Aliases + +| Alias | Command | +|-------|----------------------------| +| br | `bridgetown` | +| bra | `bin/bridgetown apply` | +| brb | `bin/bridgetown build` | +| brc | `bin/bridgetown console` | +| brclean | `bin/bridgetown clean` | +| brd | `bin/bridgetown deploy` | +| brdoc | `bin/bridgetown doctor` | +| brh | `bin/bridgetown help` | +| brn | `bridgetown new` | +| brp | `bridgetown plugins` | +| brpl | `bridgetown plugins list` | +| brs | `bin/bridgetown start` | diff --git a/plugins/bridgetown/bridgetown.plugin.zsh b/plugins/bridgetown/bridgetown.plugin.zsh new file mode 100644 index 00000000..502e9dfe --- /dev/null +++ b/plugins/bridgetown/bridgetown.plugin.zsh @@ -0,0 +1,12 @@ +alias br='bridgetown' +alias bra='bin/bridgetown apply' +alias brb='bin/bridgetown build' +alias brc='bin/bridgetown console' +alias brclean='bin/bridgetown clean' +alias brd='bin/bridgetown deploy' +alias brdoc='bin/bridgetown doctor' +alias brh='bin/bridgetown help' +alias brn='bridgetown new' +alias brp='bridgetown plugins' +alias brpl='bridgetown plugins list' +alias brs='bin/bridgetown start' From 746424f1614a70a8c318979f5cf348babe603d54 Mon Sep 17 00:00:00 2001 From: Sung kyung Park <44727001+sungkpark@users.noreply.github.com> Date: Mon, 9 Jan 2023 20:02:44 +0100 Subject: [PATCH 049/321] feat(homebrew): Adding new alias for brew uninstall --zap as buz closes #10329 (#10331) * Adding new alias for brew uninstall --zap as buz * Closes #10329 * add buz * closes #10329 * Fix typo * Closes ohmyzsh#10329 * Closes ohmyzsh#10329 Co-authored-by: Sung Co-authored-by: Robby Russell --- plugins/brew/README.md | 3 +++ plugins/brew/brew.plugin.zsh | 2 ++ 2 files changed, 5 insertions(+) diff --git a/plugins/brew/README.md b/plugins/brew/README.md index 9ce2c5bb..cfaedccd 100644 --- a/plugins/brew/README.md +++ b/plugins/brew/README.md @@ -21,6 +21,7 @@ defined for convenience. | -------- | ------------------------------------- | ------------------------------------------------------------------- | | `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | | `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. | +| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | | `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. | | `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. | | `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. | @@ -28,6 +29,8 @@ defined for convenience. | `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. | | `bubu` | `bubo && bubc` | Do the last two operations above. | | `buf` | `brew upgrade --formula` | Upgrade only formulas (not casks). | +| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. | + ## Completion diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index ea890082..808c5090 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -27,12 +27,14 @@ fi alias bcubc='brew upgrade --cask && brew cleanup' alias bcubo='brew update && brew outdated --cask' +alias bcubc='brew upgrade --cask && brew cleanup' alias brewp='brew pin' alias brewsp='brew list --pinned' alias bubc='brew upgrade && brew cleanup' alias bubo='brew update && brew outdated' alias bubu='bubo && bubc' alias buf='brew upgrade --formula' +alias buz='brew uninstall --zap' function brews() { local formulae="$(brew leaves | xargs brew deps --installed --for-each)" From fc86a16255a92fad36882666e093750c1aba4b21 Mon Sep 17 00:00:00 2001 From: "F. Javier Campa L" Date: Mon, 9 Jan 2023 20:07:41 +0100 Subject: [PATCH 050/321] feat(homebrew): Brew greedy upgrade aliases (#9623) * Added 'greedy' brew upgrade aliases' * Added a description of the new 'greedy' upgrade aliases Co-authored-by: Robby Russell --- plugins/brew/README.md | 2 +- plugins/brew/brew.plugin.zsh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/brew/README.md b/plugins/brew/README.md index cfaedccd..4a42b3d7 100644 --- a/plugins/brew/README.md +++ b/plugins/brew/README.md @@ -26,12 +26,12 @@ defined for convenience. | `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. | | `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. | | `bubc` | `brew upgrade && brew cleanup` | Upgrade outdated formulae and casks, then run cleanup. | +| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. | | `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. | | `bubu` | `bubo && bubc` | Do the last two operations above. | | `buf` | `brew upgrade --formula` | Upgrade only formulas (not casks). | | `buz` | `brew uninstall --zap` | Remove all files associated with a cask. | - ## Completion With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index 808c5090..8275454a 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -31,8 +31,10 @@ alias bcubc='brew upgrade --cask && brew cleanup' alias brewp='brew pin' alias brewsp='brew list --pinned' alias bubc='brew upgrade && brew cleanup' +alias bugbc='brew upgrade --greedy && brew cleanup' alias bubo='brew update && brew outdated' alias bubu='bubo && bubc' +alias bubug='bubo && bugbc' alias buf='brew upgrade --formula' alias buz='brew uninstall --zap' From 6eefaf56afae27739c31e21be477688634a6b5fa Mon Sep 17 00:00:00 2001 From: Kenneth Tan Date: Tue, 10 Jan 2023 03:14:35 +0800 Subject: [PATCH 051/321] fix(brew): renamed buf alias to bfu (#11195) * chore(plugins/brew): rename buf alias to bfu The alias `buf` collides with the protobuf tooling (buf)[https://buf.build/]. This commit renames the `buf` alias to `bfu` (`brew upgrade --formula`) so its semantically more aligned with `bcu` (`brew upgrade --cask`) as well as to avoid command collision especially with existing scripts that refers to `buf` as the tool and not the alias. * chore(brew): updated README.md Updated README to reflect renamed alias (`buf` -> `bfu`) Co-authored-by: Robby Russell From bc36043e8f004e130df7dc2f4708e2313e400bff Mon Sep 17 00:00:00 2001 From: A2n Date: Mon, 9 Jan 2023 20:23:31 +0100 Subject: [PATCH 052/321] feature(heroku-cli): Add heroku cli alias (#9073) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ feat(alias): import alias from local repo * 📝 feat(alias): import doc form local repo --- plugins/heroku-alias/README.md | 127 +++++++++++++++++++++++++++ plugins/heroku-alias/heroku.alias.sh | 92 +++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 plugins/heroku-alias/README.md create mode 100644 plugins/heroku-alias/heroku.alias.sh diff --git a/plugins/heroku-alias/README.md b/plugins/heroku-alias/README.md new file mode 100644 index 00000000..4b7b953f --- /dev/null +++ b/plugins/heroku-alias/README.md @@ -0,0 +1,127 @@ +# heroku-alias +🧬 Full alias for heroku cli + +|🚀 last maj|📡 source| +|---|---| +|02/06/2020|[heroku cli doc](https://devcenter.heroku.com/articles/heroku-cli-commands)| + +# Alias list + +## general +| Alias | Command | +| ------------- | ------------- | +| h | heroku | +| hauto | heroku autocomplete $(echo $SHELL) | +| hl | heroku local | + +## config +| Alias | Command | +| ------------- | ------------- | +| hc | heroku config | +| hca | heroku config -a | +| hcr | heroku config -r | +| hcs | heroku config:set | +| hcu | heroku config:unset | +| hcfile | function hcfile bellow | + +```sh +hcfile() { + echo " Which platform [-r/a name] ? " + read platform + echo " Which file ? " + read file + while read line; + do heroku config:set "$platform" "$line"; + done < "$file" +} +``` + +## apps and favorites +| Alias | Command | +| ------------- | ------------- | +| ha | heroku apps | +| hpop | heroku create | +| hkill | heroku apps:destroy | +| hlog | heroku apps:errors | +| hfav | heroku apps:favorites | +| hfava | heroku apps:favorites:add | +| hfavr | heroku apps:favorites:remove | +| hai | heroku apps:info | +| hair | heroku apps:info -r | +| haia | heroku apps:info -a | + +# auth +| Alias | Command | +| ------------- | ------------- | +| h2fa | heroku auth:2fa | +| h2far | heroku auth:2fa:disable | + +# access +| Alias | Command | +| ------------- | ------------- | +| hac | heroku access | +| hacr | heroku access -r | +| haca | heroku access -a | +| hadd | heroku access:add | +| hdel | heroku access:remove | +| hup | heroku access:update | + +## addons +| Alias | Command | +| ------------- | ------------- | +| hads | heroku addons -A | +| hada | heroku addons -a | +| hadr | heroku addons -r | +| hadat | heroku addons:attach | +| hadc | heroku addons:create | +| hadel | heroku addons:destroy | +| hadde | heroku addons:detach | +| hadoc | heroku addons:docs | + +## login +| Alias | Command | +| ------------- | ------------- | +| hin | heroku login | +| hout | heroku logout | +| hi | heroku login -i | +| hwho | heroku auth:whoami | + +## authorizations +| Alias | Command | +| ------------- | ------------- | +| hth | heroku authorizations | +| hthadd | heroku authorizations:create | +| hthif | heroku authorizations:info | +| hthdel | heroku authorizations:revoke | +| hthrot | heroku authorizations:rotate | +| hthup | heroku authorizations:update | + +## plugins +| Alias | Command | +| ------------- | ------------- | +| hp | heroku plugins | + +# log +| Alias | Command | +| ------------- | ------------- | +|hg | heroku logs| +| hgt | heroku log tail | + +# database +| Alias | Command | +| ------------- | ------------- | +| hpg | heroku pg | +| hpsql | heroku pg:psql | +| hpb | heroku pg:backups | +| hpbc | heroku pg:backups:capture | +| hpbd | heroku pg:backups:download | +| hpbr | heroku pg:backups:restore | + +# certs +| Alias | Command | +| ------------- | ------------- | +| hssl | heroku certs | +| hssli | heroku certs:info | +| hssla | heroku certs:add | +| hsslu | heroku certs:update | +| hsslr | heroku certs:remove | diff --git a/plugins/heroku-alias/heroku.alias.sh b/plugins/heroku-alias/heroku.alias.sh new file mode 100644 index 00000000..7daf715b --- /dev/null +++ b/plugins/heroku-alias/heroku.alias.sh @@ -0,0 +1,92 @@ +# general +alias h='heroku' +alias hauto='heroku autocomplete $(echo $SHELL)' +alias hl='heroku local' + +# log +alias hg='heroku logs' +alias hgt='heroku log tail' + +# database +alias hpg='heroku pg' +alias hpsql='heroku pg:psql' +alias hpb='heroku pg:backups' +alias hpbc='heroku pg:backups:capture' +alias hpbd='heroku pg:backups:download' +alias hpbr='heroku pg:backups:restore' + +# config +alias hc='heroku config' +alias hca='heroku config -a' +alias hcr='heroku config -r' +alias hcs='heroku config:set' +alias hcu='heroku config:unset' + +# this function allow to load multi env set in a file +hcfile() { + echo 'Which platform [-r/a name] ?' + read platform + echo 'Which file ?' + read file + while read line; + do heroku config:set "$platform" "$line"; + done < "$file" +} + +# apps and favorites +alias ha='heroku apps' +alias hpop='heroku create' +alias hkill='heroku apps:destroy' +alias hlog='heroku apps:errors' +alias hfav='heroku apps:favorites' +alias hfava='heroku apps:favorites:add' +alias hfavr='heroku apps:favorites:remove' +alias hai='heroku apps:info' +alias hair='heroku apps:info -r' +alias haia='heroku apps:info -a' + +# auth +alias h2fa='heroku auth:2fa' +alias h2far='heroku auth:2fa:disable' + +# access +alias hac='heroku access' +alias hacr='heroku access -r' +alias haca='heroku access -a' +alias hadd='heroku access:add' +alias hdel='heroku access:remove' +alias hup='heroku access:update' + +# addons +alias hads='heroku addons -A' +alias hada='heroku addons -a' +alias hadr='heroku addons -r' +alias hadat='heroku addons:attach' +alias hadc='heroku addons:create' +alias hadel='heroku addons:destroy' +alias hadde='heroku addons:detach' +alias hadoc='heroku addons:docs' + +# login +alias hin='heroku login' +alias hout='heroku logout' +alias hi='heroku login -i' +alias hwho='heroku auth:whoami' + +# authorizations +alias hth='heroku authorizations' +alias hthadd='heroku authorizations:create' +alias hthif='heroku authorizations:info' +alias hthdel='heroku authorizations:revoke' +alias hthrot='heroku authorizations:rotate' +alias hthup='heroku authorizations:update' + +# plugins +alias hp='heroku plugins' + +# cert +alias hssl='heroku certs' +alias hssli='heroku certs:info' +alias hssla='heroku certs:add' +alias hsslu='heroku certs:update' +alias hsslr='heroku certs:remove' From 9f31951019401449e057a236886d133f58c5cc64 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 9 Jan 2023 13:30:08 -0600 Subject: [PATCH 053/321] fix(jira): Make prefix check on "jira branch" command case-insensitive (#8799) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Make prefix check on "jira branch" command case-insensitive * Update plugins/jira/jira.plugin.zsh Co-authored-by: Marc Cornellà * Fixing tabs to spaces Co-authored-by: Robby Russell Co-authored-by: Marc Cornellà --- plugins/jira/README.md | 5 +++++ plugins/jira/jira.plugin.zsh | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/jira/README.md b/plugins/jira/README.md index a5633af7..f8751aaa 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -27,6 +27,11 @@ jira branch # opens an existing issue matching the current branch name # The branch name may have prefixes ending in "/": "feature/MP-1234", # and also suffixes starting with "_": "MP-1234_fix_dashboard" # In both these cases, the issue opened will be "MP-1234" + # This is also checks if the prefix is in the name, and adds it if not, so: + # "MP-1234" opens the issue "MP-1234", + # "mp-1234" opens the issue "mp-1234", + # and "1234" opens the issue "MP-1234". +# NOTE: since jira is case insensitive, the first two examples open the same issue jira ABC-123 # opens an existing issue jira ABC-123 m # opens an existing issue for adding a comment ``` diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index 22807e0a..37d7b6a2 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -75,7 +75,7 @@ function jira() { # Strip suffixes starting with _ issue_arg=(${(s:_:)issue_arg}) issue_arg=${issue_arg[1]} - if [[ "$issue_arg" = ${jira_prefix}* ]]; then + if [[ "${issue_arg:l}" = ${jira_prefix:l}* ]]; then issue="${issue_arg}" else issue="${jira_prefix}${issue_arg}" From fc722807f815bd170849f92d215ce2afa62e55b6 Mon Sep 17 00:00:00 2001 From: August Feng <46177585+augustfengd@users.noreply.github.com> Date: Mon, 9 Jan 2023 14:43:42 -0500 Subject: [PATCH 054/321] refactor(jira)!: rename myissues to mine and add completion (#10931) --- plugins/jira/README.md | 2 +- plugins/jira/_jira | 1 + plugins/jira/jira.plugin.zsh | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/jira/README.md b/plugins/jira/README.md index f8751aaa..a7cfe6d9 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -18,11 +18,11 @@ This plugin supplies one command, `jira`, through which all its features are exp jira # performs the default action jira new # opens a new issue +jira mine # queries for your own issues jira dashboard # opens your JIRA dashboard jira tempo # opens your JIRA Tempo jira reported [username] # queries for issues reported by a user jira assigned [username] # queries for issues assigned to a user -jira myissues # queries for you own issues jira branch # opens an existing issue matching the current branch name # The branch name may have prefixes ending in "/": "feature/MP-1234", # and also suffixes starting with "_": "MP-1234_fix_dashboard" diff --git a/plugins/jira/_jira b/plugins/jira/_jira index 1ac3eeda..0e37b7e9 100644 --- a/plugins/jira/_jira +++ b/plugins/jira/_jira @@ -4,6 +4,7 @@ local -a _1st_arguments _1st_arguments=( 'new:create a new issue' + 'mine:open my issues' 'dashboard:open the dashboard' 'tempo:open the tempo' 'reported:search for issues reported by a user' diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index 37d7b6a2..0add040d 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -44,7 +44,7 @@ function jira() { open_command "${jira_url}/secure/CreateIssue!default.jspa" elif [[ "$action" == "assigned" || "$action" == "reported" ]]; then _jira_query ${@:-$action} - elif [[ "$action" == "myissues" ]]; then + elif [[ "$action" == "mine" ]]; then echo "Opening my issues" open_command "${jira_url}/issues/?filter=-1" elif [[ "$action" == "dashboard" ]]; then From 585084354e7ecf3b93c6eedb2ece70e914ee28b9 Mon Sep 17 00:00:00 2001 From: Vladimir Date: Mon, 9 Jan 2023 21:45:20 +0200 Subject: [PATCH 055/321] feat(jira): add optional plugin "tempo" path (#11121) CHANGE: added new environment variable JIRA_TEMPO_PATH to allow set an optional path Co-authored-by: Vladimir Antoscenco --- plugins/jira/README.md | 1 + plugins/jira/jira.plugin.zsh | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/jira/README.md b/plugins/jira/README.md index a7cfe6d9..3d6d323a 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -68,6 +68,7 @@ echo "https://jira.atlassian.com" >> .jira-url * `$JIRA_PREFIX` - Prefix added to issue ID arguments * `$JIRA_RAPID_BOARD` - Set to `true` if you use Rapid Board * `$JIRA_DEFAULT_ACTION` - Action to do when `jira` is called with no arguments; defaults to "new" +* `$JIRA_TEMPO_PATH` - Your JIRA tempo url path; defaults to "/secure/Tempo.jspa" ### Browser ### diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index 0add040d..71224bdf 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -56,13 +56,18 @@ function jira() { fi elif [[ "$action" == "tempo" ]]; then echo "Opening tempo" - open_command "${jira_url}/secure/Tempo.jspa" + if [[ -n "$JIRA_TEMPO_PATH" ]]; then + open_command "${jira_url}${JIRA_TEMPO_PATH}" + else + open_command "${jira_url}/secure/Tempo.jspa" + fi elif [[ "$action" == "dumpconfig" ]]; then echo "JIRA_URL=$jira_url" echo "JIRA_PREFIX=$jira_prefix" echo "JIRA_NAME=$JIRA_NAME" echo "JIRA_RAPID_BOARD=$JIRA_RAPID_BOARD" echo "JIRA_DEFAULT_ACTION=$JIRA_DEFAULT_ACTION" + echo "JIRA_TEMPO_PATH=$JIRA_TEMPO_PATH" else # Anything that doesn't match a special action is considered an issue name # but `branch` is a special case that will parse the current git branch From e0d0dfb845a8f1eb35bce8ca5afcd76cb2ffbb35 Mon Sep 17 00:00:00 2001 From: Arnaud Zheng Date: Mon, 9 Jan 2023 20:53:32 +0100 Subject: [PATCH 056/321] feat(jira): support rapid view on rapid board mode (#9459) * feat(jira): support rapid view on rapid board mode * Update README to clarify how the rapid board/view works Co-authored-by: Robby Russell --- plugins/jira/README.md | 3 ++- plugins/jira/jira.plugin.zsh | 13 ++++++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/plugins/jira/README.md b/plugins/jira/README.md index 3d6d323a..5dc5bfc9 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -18,8 +18,8 @@ This plugin supplies one command, `jira`, through which all its features are exp jira # performs the default action jira new # opens a new issue +jira dashboard [rapid_view] # opens your JIRA dashboard jira mine # queries for your own issues -jira dashboard # opens your JIRA dashboard jira tempo # opens your JIRA Tempo jira reported [username] # queries for issues reported by a user jira assigned [username] # queries for issues assigned to a user @@ -67,6 +67,7 @@ echo "https://jira.atlassian.com" >> .jira-url * `$JIRA_NAME` - Your JIRA username; used as the default user for `assigned`/`reported` searches * `$JIRA_PREFIX` - Prefix added to issue ID arguments * `$JIRA_RAPID_BOARD` - Set to `true` if you use Rapid Board +* `$JIRA_RAPID_VIEW` - Set the default rapid view; it doesn't work if `$JIRA_RAPID_BOARD` is set to false * `$JIRA_DEFAULT_ACTION` - Action to do when `jira` is called with no arguments; defaults to "new" * `$JIRA_TEMPO_PATH` - Your JIRA tempo url path; defaults to "/secure/Tempo.jspa" diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index 71224bdf..e789fce9 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -50,7 +50,7 @@ function jira() { elif [[ "$action" == "dashboard" ]]; then echo "Opening dashboard" if [[ "$JIRA_RAPID_BOARD" == "true" ]]; then - open_command "${jira_url}/secure/RapidBoard.jspa" + _jira_rapid_board ${@} else open_command "${jira_url}/secure/Dashboard.jspa" fi @@ -65,6 +65,7 @@ function jira() { echo "JIRA_URL=$jira_url" echo "JIRA_PREFIX=$jira_prefix" echo "JIRA_NAME=$JIRA_NAME" + echo "JIRA_RAPID_VIEW=$JIRA_RAPID_VIEW" echo "JIRA_RAPID_BOARD=$JIRA_RAPID_BOARD" echo "JIRA_DEFAULT_ACTION=$JIRA_DEFAULT_ACTION" echo "JIRA_TEMPO_PATH=$JIRA_TEMPO_PATH" @@ -112,6 +113,16 @@ Valid options, in order of precedence: EOF } +function _jira_rapid_board() { + rapid_view=${2:=$JIRA_RAPID_VIEW} + + if [[ -z $rapid_view ]]; then + open_command "${jira_url}/secure/RapidBoard.jspa" + else + open_command "${jira_url}/secure/RapidBoard.jspa?rapidView=$rapid_view" + fi +} + function _jira_query() { emulate -L zsh local verb="$1" From 2c2187b09d6dc488bb67968748ec07f7235a0238 Mon Sep 17 00:00:00 2001 From: cxy004 Date: Tue, 10 Jan 2023 04:02:51 +0800 Subject: [PATCH 057/321] fix(macos): fix `man-preview` for macOS Ventura (#11324) --- plugins/macos/macos.plugin.zsh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/macos/macos.plugin.zsh b/plugins/macos/macos.plugin.zsh index b540eecb..e4d759dc 100644 --- a/plugins/macos/macos.plugin.zsh +++ b/plugins/macos/macos.plugin.zsh @@ -224,8 +224,9 @@ function quick-look() { } function man-preview() { + local location # Don't let Preview.app steal focus if the man page doesn't exist - man -w "$@" &>/dev/null && man -t "$@" | open -f -a Preview || man "$@" + location=$(man -w "$@") && mandoc -Tpdf $location | open -f -a Preview } compdef _man man-preview From 046f0ca5571e28aa328566d5f81a338e074cf174 Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Mon, 9 Jan 2023 20:25:08 +0000 Subject: [PATCH 058/321] fix(jira): Update README examples to a table format --- plugins/jira/README.md | 44 +++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/plugins/jira/README.md b/plugins/jira/README.md index 5dc5bfc9..d78ea15a 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -14,27 +14,31 @@ In this document, "JIRA" refers to the JIRA issue tracking server, and `jira` re This plugin supplies one command, `jira`, through which all its features are exposed. Most forms of this command open a JIRA page in your web browser. -``` -jira # performs the default action +## Commands + +| Command | Description | +| :------------ | :-------------------------------------------------------- | +| `jira` | Performs the default action | +| `jira new` | Opens a new Jira issue dialogue | +| `jira ABC-123` | Opens an existing issue | +| `jira ABC-123 m` | Opens an existing issue for adding a comment | +| `jira dashboard [rapid_view]` | # opens your JIRA dashboard | +| `jira mine` | Queries for your own issues | +| `jira tempo` | Opens your JIRA Tempo | +| `jira reported [username]` | Queries for issues reported by a user | +| `jira assigned [username]` | Queries for issues assigned to a user | +| `jira branch` | Opens an existing issue matching the current branch name | + + +### Jira Branch usage notes + +The branch name may have prefixes ending in "/": "feature/MP-1234", and also suffixes +starting with "_": "MP-1234_fix_dashboard". In both these cases, the issue opened will be "MP-1234" + +This is also checks if the prefix is in the name, and adds it if not, so: "MP-1234" opens the issue "MP-1234", +"mp-1234" opens the issue "mp-1234", and "1234" opens the issue "MP-1234". + -jira new # opens a new issue -jira dashboard [rapid_view] # opens your JIRA dashboard -jira mine # queries for your own issues -jira tempo # opens your JIRA Tempo -jira reported [username] # queries for issues reported by a user -jira assigned [username] # queries for issues assigned to a user -jira branch # opens an existing issue matching the current branch name - # The branch name may have prefixes ending in "/": "feature/MP-1234", - # and also suffixes starting with "_": "MP-1234_fix_dashboard" - # In both these cases, the issue opened will be "MP-1234" - # This is also checks if the prefix is in the name, and adds it if not, so: - # "MP-1234" opens the issue "MP-1234", - # "mp-1234" opens the issue "mp-1234", - # and "1234" opens the issue "MP-1234". -# NOTE: since jira is case insensitive, the first two examples open the same issue -jira ABC-123 # opens an existing issue -jira ABC-123 m # opens an existing issue for adding a comment -``` #### Debugging usage #### From e583648195a33afb6ec4ebddb1926570a9a5e475 Mon Sep 17 00:00:00 2001 From: Celestino Gomes Date: Mon, 9 Jan 2023 17:46:54 -0300 Subject: [PATCH 059/321] feat(qrcode): new plugin to generate qrcode via https://qrcode.show (#10247) * feat(qrcode): new plugin to generate qrcode via https://qrcode.show * code fix suggested by @JuniorJPDJ * Update docs to clarify how to interact with it Co-authored-by: Robby Russell --- plugins/qrcode/README.md | 8 ++++++++ plugins/qrcode/qrcode.plugin.zsh | 17 +++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 plugins/qrcode/README.md create mode 100644 plugins/qrcode/qrcode.plugin.zsh diff --git a/plugins/qrcode/README.md b/plugins/qrcode/README.md new file mode 100644 index 00000000..bcc87054 --- /dev/null +++ b/plugins/qrcode/README.md @@ -0,0 +1,8 @@ +# QRCode plugin + +Generate a QR Code from the command line. Uses [QRcode.show](https://qrcode.show) via curl. + +alias | command +--------------- | -------- +`qrcode [text]` | `curl -d "text" qrcode.show` +`qrsvg [text]` | `curl -d "text" qrcode.show -H "Accepct: image.svg"` diff --git a/plugins/qrcode/qrcode.plugin.zsh b/plugins/qrcode/qrcode.plugin.zsh new file mode 100644 index 00000000..d757e135 --- /dev/null +++ b/plugins/qrcode/qrcode.plugin.zsh @@ -0,0 +1,17 @@ +# Imported and improved from https://qrcode.show/, section SHELL FUNCTIONS + +_qrcode_show_message() { + echo "Type or paste your text, add a new blank line, and press ^d" +} + +qrcode () { + local input="$*" + [ -z "$input" ] && _qrcode_show_message && local input="@/dev/stdin" + curl -d "$input" https://qrcode.show +} + +qrsvg () { + local input="$*" + [ -z "$input" ] && _qrcode_show_message && local input="@/dev/stdin" + curl -d "$input" https://qrcode.show -H "Accept: image/svg+xml" +} From 4181e8a2cc936bc7b7a89d674bf261023159ed35 Mon Sep 17 00:00:00 2001 From: Dmndz <46868530+d14mndz@users.noreply.github.com> Date: Mon, 9 Jan 2023 21:51:50 +0100 Subject: [PATCH 060/321] feat(yarn): add alias for `yarn why` (#10773) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(yarn): add `yarn why` * docs(yarn): update readme Co-authored-by: Basia Józefowska Co-authored-by: Robby Russell --- plugins/yarn/README.md | 1 + plugins/yarn/yarn.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/yarn/README.md b/plugins/yarn/README.md index 270bf6b7..5c7c7f32 100644 --- a/plugins/yarn/README.md +++ b/plugins/yarn/README.md @@ -55,3 +55,4 @@ zstyle ':omz:plugins:yarn' global-path no | yv | `yarn version` | Update the version of your package | | yw | `yarn workspace` | Run a command within a single workspace. | | yws | `yarn workspaces` | Run a command within all defined workspaces. | +| yy | `yarn why` | Show why a package has been installed, detailing which other packages depend on it | diff --git a/plugins/yarn/yarn.plugin.zsh b/plugins/yarn/yarn.plugin.zsh index 7ba710df..157044d7 100644 --- a/plugins/yarn/yarn.plugin.zsh +++ b/plugins/yarn/yarn.plugin.zsh @@ -43,3 +43,4 @@ alias yup="yarn upgrade" alias yv="yarn version" alias yw="yarn workspace" alias yws="yarn workspaces" +alias yy="yarn why" From 3dd83a22a160249a71631a51490fd3b89d1b3975 Mon Sep 17 00:00:00 2001 From: Lawton Nichols Date: Wed, 11 Jan 2023 10:44:29 -0800 Subject: [PATCH 061/321] fix(lib): send carriage return after `title` to fix #11314 (#11315) Window and tab titles are changed by emitting an unprintable escape sequence to the terminal. These escape sequences do not play nicely with the TAB character on multiple terminal emulators--they create un-deletable characters on the first line after command execution. Sending "\r" after changing the window and tab titles allows all characters on the first line to be deleted. Fixes #11314 --- lib/termsupport.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 80ca7ef7..fc1cde55 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -36,6 +36,8 @@ function title { fi ;; esac + + print -Pn "\r" # move the cursor to the beginning of the line } ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD From 0f71cfd3c1b82cbc6b2ddd8782e193f38cf343f9 Mon Sep 17 00:00:00 2001 From: Rafael Laurindo Date: Wed, 11 Jan 2023 15:54:53 -0300 Subject: [PATCH 062/321] docs(qrsvg): fix command example (#11436) --- plugins/qrcode/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/qrcode/README.md b/plugins/qrcode/README.md index bcc87054..44283894 100644 --- a/plugins/qrcode/README.md +++ b/plugins/qrcode/README.md @@ -5,4 +5,4 @@ Generate a QR Code from the command line. Uses [QRcode.show](https://qrcode.show alias | command --------------- | -------- `qrcode [text]` | `curl -d "text" qrcode.show` -`qrsvg [text]` | `curl -d "text" qrcode.show -H "Accepct: image.svg"` +`qrsvg [text]` | `curl -d "text" qrcode.show -H "Accept: image/svg+xml"` From 17ea97332b2f2285e3c2e1a00f6745fb1fe1cec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 12 Jan 2023 08:29:00 +0100 Subject: [PATCH 063/321] Revert "fix(lib): send carriage return after `title` to fix #11314 (#11315)" This reverts commit 3dd83a22a160249a71631a51490fd3b89d1b3975. See https://github.com/ohmyzsh/ohmyzsh/issues/11314#issuecomment-1379492472 --- lib/termsupport.zsh | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index fc1cde55..80ca7ef7 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -36,8 +36,6 @@ function title { fi ;; esac - - print -Pn "\r" # move the cursor to the beginning of the line } ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD From 35454190f6aeae9b9f16acdbdd0cf72c32610ee8 Mon Sep 17 00:00:00 2001 From: Jack DeVries Date: Thu, 12 Jan 2023 13:41:47 +0100 Subject: [PATCH 064/321] feat(git): use verbose flags in aliases Closes #11244 Closes #11246 Closes #10101 Closes #11380 --- plugins/git/README.md | 366 ++++++++++++++++++------------------- plugins/git/git.plugin.zsh | 75 ++++---- 2 files changed, 219 insertions(+), 222 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 3beb0890..8cb4215a 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -10,191 +10,189 @@ plugins=(... git) ## Aliases -| Alias | Command | -|:---------------------|:---------------------------------------------------------------------------------------------------------------------------------| -| g | git | -| ga | git add | -| gaa | git add --all | -| gapa | git add --patch | -| gau | git add --update | -| gav | git add --verbose | -| gap | git apply | -| gapt | git apply --3way | -| gb | git branch | -| gba | git branch -a | -| gbd | git branch -d | -| gbda | git branch --no-color --merged \| grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| xargs git branch -d 2>/dev/null | -| gbD | git branch -D | -| gbl | git blame -b -w | -| gbnm | git branch --no-merged | -| gbr | git branch --remote | -| gbs | git bisect | -| gbsb | git bisect bad | -| gbsg | git bisect good | -| gbsr | git bisect reset | -| gbss | git bisect start | -| gc | git commit -v | -| gc! | git commit -v --amend | -| gcn | git commit -v --no-edit | -| gcn! | git commit -v --no-edit --amend | -| gca | git commit -v -a | -| gca! | git commit -v -a --amend | -| gcan! | git commit -v -a --no-edit --amend | -| gcans! | git commit -v -a -s --no-edit --amend | -| gcam | git commit -a -m | -| gcas | git commit -a -s | -| gcasm | git commit -a -s -m | -| gcsm | git commit -s -m | -| gcb | git checkout -b | -| gcf | git config --list | -| gcl | git clone --recurse-submodules | -| gccd | git clone --recurse-submodules "$@" && cd "$(basename $_ .git)" | -| gclean | git clean -id | -| gpristine | git reset --hard && git clean -dffx | -| gcm | git checkout $(git_main_branch) | -| gcd | git checkout $(git_develop_branch) | -| gcmsg | git commit -m | -| gco | git checkout | -| gcor | git checkout --recurse-submodules | -| gcount | git shortlog -sn | -| gcp | git cherry-pick | -| gcpa | git cherry-pick --abort | -| gcpc | git cherry-pick --continue | -| gcs | git commit -S | -| gd | git diff | -| gdca | git diff --cached | -| gdcw | git diff --cached --word-diff | -| gdct | git describe --tags $(git rev-list --tags --max-count=1) | -| gds | git diff --staged | -| gdt | git diff-tree --no-commit-id --name-only -r | -| gdnolock | git diff $@ ":(exclude)package-lock.json" ":(exclude)*.lock" | -| gdup | git diff @{upstream} | -| gdv | git diff -w $@ \| view - | -| gdw | git diff --word-diff | -| gf | git fetch | -| gfa | git fetch --all --prune | -| gfg | git ls-files \| grep | -| gfo | git fetch origin | -| gg | git gui citool | -| gga | git gui citool --amend | -| ggf | git push --force origin $(current_branch) | -| ggfl | git push --force-with-lease origin $(current_branch) | -| ggl | git pull origin $(current_branch) | -| ggp | git push origin $(current_branch) | -| ggpnp | ggl && ggp | -| ggpull | git pull origin "$(git_current_branch)" | -| ggpur | ggu | -| ggpush | git push origin "$(git_current_branch)" | -| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | -| ggu | git pull --rebase origin $(current_branch) | -| gpsup | git push --set-upstream origin $(git_current_branch) | -| ghh | git help | -| gignore | git update-index --assume-unchanged | -| gignored | git ls-files -v \| grep "^[[:lower:]]" | -| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk | -| gk | gitk --all --branches &! | -| gke | gitk --all $(git log -g --pretty=%h) &! | -| gl | git pull | -| glg | git log --stat | -| glgp | git log --stat -p | -| glgg | git log --graph | -| glgga | git log --graph --decorate --all | -| glgm | git log --graph --max-count=10 | -| glo | git log --oneline --decorate | -| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' | -| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat | -| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' | -| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short | -| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all | -| glog | git log --oneline --decorate --graph | -| gloga | git log --oneline --decorate --graph --all | -| glp | git log --pretty=\ | -| gm | git merge | -| gmom | git merge origin/$(git_main_branch) | -| gmtl | git mergetool --no-prompt | -| gmtlvim | git mergetool --no-prompt --tool=vimdiff | -| gmum | git merge upstream/$(git_main_branch) | -| gma | git merge --abort | -| gp | git push | -| gpd | git push --dry-run | -| gpf | git push --force-with-lease | -| gpf! | git push --force | -| gpoat | git push origin --all && git push origin --tags | -| gpr | git pull --rebase | -| gpu | git push upstream | -| gpv | git push -v | -| gr | git remote | -| gra | git remote add | -| grb | git rebase | -| grba | git rebase --abort | -| grbc | git rebase --continue | -| grbd | git rebase $(git_develop_branch) | -| grbi | git rebase -i | -| grbm | git rebase $(git_main_branch) | -| grbom | git rebase origin/$(git_main_branch) | -| grbo | git rebase --onto | -| grbs | git rebase --skip | -| grev | git revert | -| grh | git reset | -| grhh | git reset --hard | -| groh | git reset origin/$(git_current_branch) --hard | -| grm | git rm | -| grmc | git rm --cached | -| grmv | git remote rename | -| grrm | git remote remove | -| grs | git restore | -| grset | git remote set-url | -| grss | git restore --source | -| grst | git restore --staged | -| grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" | -| gru | git reset -- | -| grup | git remote update | -| grv | git remote -v | -| gsb | git status -sb | -| gsd | git svn dcommit | -| gsh | git show | -| gsi | git submodule init | -| gsps | git show --pretty=short --show-signature | -| gsr | git svn rebase | -| gss | git status -s | -| gst | git status | -| gsta | git stash push | -| gsta | git stash save | -| gstaa | git stash apply | -| gstc | git stash clear | -| gstd | git stash drop | -| gstl | git stash list | -| gstp | git stash pop | -| gsts | git stash show --text | -| gstu | git stash --include-untracked | -| gstall | git stash --all | -| gsu | git submodule update | -| gsw | git switch | -| gswc | git switch -c | -| gswm | git switch $(git_main_branch) | -| gswd | git switch $(git_develop_branch) | -| gts | git tag -s | -| gtv | git tag \| sort -V | -| gtl | gtl(){ git tag --sort=-v:refname -n -l ${1}* }; noglob gtl | -| gunignore | git update-index --no-assume-unchanged | -| gunwip | git log -n 1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 | -| gup | git pull --rebase | -| gupv | git pull --rebase -v | -| gupa | git pull --rebase --autostash | -| gupav | git pull --rebase --autostash -v | -| gupom | git pull --rebase origin $(git_main_branch) | -| gupomi | git pull --rebase=interactive origin $(git_main_branch) | -| glum | git pull upstream $(git_main_branch) | -| gluc | git pull upstream $(git_current_branch) | -| gwch | git whatchanged -p --abbrev-commit --pretty=medium | -| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]" | -| gam | git am | -| gamc | git am --continue | -| gams | git am --skip | -| gama | git am --abort | -| gamscp | git am --show-current-patch | +| Alias | Command | +| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| g | git | +| ga | git add | +| gaa | git add --all | +| gapa | git add --patch | +| gau | git add --update | +| gav | git add --verbose | +| gap | git apply | +| gapt | git apply --3way | +| gb | git branch | +| gba | git branch --all | +| gbd | git branch --delete | +| gbda | git branch --no-color --merged \| grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| xargs git branch --delete 2>/dev/null | +| gbD | git branch --delete --force | +| gbl | git blame -b -w | +| gbnm | git branch --no-merged | +| gbr | git branch --remote | +| gbs | git bisect | +| gbsb | git bisect bad | +| gbsg | git bisect good | +| gbsr | git bisect reset | +| gbss | git bisect start | +| gc | git commit --verbose | +| gc! | git commit --verbose --amend | +| gcn! | git commit --verbose --no-edit --amend | +| gca | git commit --verbose --all | +| gca! | git commit --verbose --all --amend | +| gcan! | git commit --verbose --all --no-edit --amend | +| gcans! | git commit --verbose --all --signoff --no-edit --amend | +| gcam | git commit --all --message | +| gcas | git commit --all --signoff | +| gcasm | git commit --all --signoff --message | +| gcsm | git commit --signoff --message | +| gcb | git checkout -b | +| gcf | git config --list | +| gcl | git clone --recurse-submodules | +| gccd | git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)" | +| gclean | git clean --interactive -d | +| gpristine | git reset --hard && git clean -dffx | +| gcm | git checkout $(git_main_branch) | +| gcd | git checkout $(git_develop_branch) | +| gcmsg | git commit --message | +| gco | git checkout | +| gcor | git checkout --recurse-submodules | +| gcount | git shortlog --summary -n | +| gcp | git cherry-pick | +| gcpa | git cherry-pick --abort | +| gcpc | git cherry-pick --continue | +| gcs | git commit -S | +| gd | git diff | +| gdca | git diff --cached | +| gdcw | git diff --cached --word-diff | +| gdct | git describe --tags $(git rev-list --tags --max-count=1) | +| gds | git diff --staged | +| gdt | git diff-tree --no-commit-id --name-only -r | +| gdnolock | git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock" | +| gdup | git diff @{upstream} | +| gdv | git diff -w $@ \| view - | +| gdw | git diff --word-diff | +| gf | git fetch | +| gfa | git fetch --all --prune | +| gfg | git ls-files \| grep | +| gfo | git fetch origin | +| gg | git gui citool | +| gga | git gui citool --amend | +| ggf | git push --force origin $(current_branch) | +| ggfl | git push --force-with-lease origin $(current_branch) | +| ggl | git pull origin $(current_branch) | +| ggp | git push origin $(current_branch) | +| ggpnp | ggl && ggp | +| ggpull | git pull origin "$(git_current_branch)" | +| ggpur | ggu | +| ggpush | git push origin "$(git_current_branch)" | +| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | +| ggu | git pull --rebase origin $(current_branch) | +| gpsup | git push --set-upstream origin $(git_current_branch) | +| ghh | git help | +| gignore | git update-index --assume-unchanged | +| gignored | git ls-files -v \| grep "^[[:lower:]]" | +| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk | +| gk | gitk --all --branches &! | +| gke | gitk --all $(git log --walk-reflogs --pretty=%h) &! | +| gl | git pull | +| glg | git log --stat | +| glgp | git log --stat --patch | +| glgg | git log --graph | +| glgga | git log --graph --decorate --all | +| glgm | git log --graph --max-count=10 | +| glo | git log --oneline --decorate | +| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' | +| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat | +| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' | +| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short | +| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all | +| glog | git log --oneline --decorate --graph | +| gloga | git log --oneline --decorate --graph --all | +| glp | git log --pretty=\ | +| gm | git merge | +| gmom | git merge origin/$(git_main_branch) | +| gmtl | git mergetool --no-prompt | +| gmtlvim | git mergetool --no-prompt --tool=vimdiff | +| gmum | git merge upstream/$(git_main_branch) | +| gma | git merge --abort | +| gp | git push | +| gpd | git push --dry-run | +| gpf | git push --force-with-lease | +| gpf! | git push --force | +| gpoat | git push origin --all && git push origin --tags | +| gpr | git pull --rebase | +| gpu | git push upstream | +| gpv | git push --verbose | +| gr | git remote | +| gra | git remote add | +| grb | git rebase | +| grba | git rebase --abort | +| grbc | git rebase --continue | +| grbd | git rebase $(git_develop_branch) | +| grbi | git rebase --interactive | +| grbm | git rebase $(git_main_branch) | +| grbom | git rebase origin/$(git_main_branch) | +| grbo | git rebase --onto | +| grbs | git rebase --skip | +| grev | git revert | +| grh | git reset | +| grhh | git reset --hard | +| groh | git reset origin/$(git_current_branch) --hard | +| grm | git rm | +| grmc | git rm --cached | +| grmv | git remote rename | +| grrm | git remote remove | +| grs | git restore | +| grset | git remote set-url | +| grss | git restore --source | +| grst | git restore --staged | +| grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" | +| gru | git reset -- | +| grup | git remote update | +| grv | git remote --verbose | +| gsb | git status --short -b | +| gsd | git svn dcommit | +| gsh | git show | +| gsi | git submodule init | +| gsps | git show --pretty=short --show-signature | +| gsr | git svn rebase | +| gss | git status --short | +| gst | git status | +| gsta | git stash push | +| gsta | git stash save | +| gstaa | git stash apply | +| gstc | git stash clear | +| gstd | git stash drop | +| gstl | git stash list | +| gstp | git stash pop | +| gsts | git stash show --text | +| gstu | git stash --include-untracked | +| gstall | git stash --all | +| gsu | git submodule update | +| gsw | git switch | +| gswc | git switch -c | +| gswm | git switch $(git_main_branch) | +| gswd | git switch $(git_develop_branch) | +| gts | git tag -s | +| gtv | git tag \| sort -V | +| gtl | gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl | +| gunignore | git update-index --no-assume-unchanged | +| gunwip | git log --max-count=1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 | +| gup | git pull --rebase | +| gupv | git pull --rebase --verbose | +| gupa | git pull --rebase --autostash | +| gupav | git pull --rebase --autostash --verbose | +| gupom | git pull --rebase origin $(git_main_branch) | +| gupomi | git pull --rebase=interactive origin $(git_main_branch) | +| glum | git pull upstream $(git_main_branch) | +| gluc | git pull upstream $(git_current_branch) | +| gwch | git whatchanged -p --abbrev-commit --pretty=medium | +| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]" | +| gam | git am | +| gamc | git am --continue | +| gams | git am --skip | +| gama | git am --abort | +| gamscp | git am --show-current-patch | | gwt | git worktree | -| gwta | git worktree add | | gwtls | git worktree list | | gwtmv | git worktree move | | gwtrm | git worktree remove | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 76e58a12..7544ca44 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -69,10 +69,10 @@ alias gap='git apply' alias gapt='git apply --3way' alias gb='git branch' -alias gba='git branch -a' -alias gbd='git branch -d' -alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch -d 2>/dev/null' -alias gbD='git branch -D' +alias gba='git branch --all' +alias gbd='git branch --delete' +alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' +alias gbD='git branch --delete --force' alias gbl='git blame -b -w' alias gbnm='git branch --no-merged' alias gbr='git branch --remote' @@ -82,18 +82,17 @@ alias gbsg='git bisect good' alias gbsr='git bisect reset' alias gbss='git bisect start' -alias gc='git commit -v' -alias gc!='git commit -v --amend' -alias gcn='git commit -v --no-edit' -alias gcn!='git commit -v --no-edit --amend' -alias gca='git commit -v -a' -alias gca!='git commit -v -a --amend' -alias gcan!='git commit -v -a --no-edit --amend' -alias gcans!='git commit -v -a -s --no-edit --amend' -alias gcam='git commit -a -m' -alias gcsm='git commit -s -m' -alias gcas='git commit -a -s' -alias gcasm='git commit -a -s -m' +alias gc='git commit --verbose' +alias gc!='git commit --verbose --amend' +alias gcn!='git commit --verbose --no-edit --amend' +alias gca='git commit --verbose --all' +alias gca!='git commit --verbose --all --amend' +alias gcan!='git commit --verbose --all --no-edit --amend' +alias gcans!='git commit --verbose --all --signoff --no-edit --amend' +alias gcam='git commit --all --message' +alias gcsm='git commit --signoff --message' +alias gcas='git commit --all --signoff' +alias gcasm='git commit --all --signoff --message' alias gcb='git checkout -b' alias gcf='git config --list' @@ -104,20 +103,20 @@ function gccd() { compdef _git gccd=git-clone alias gcl='git clone --recurse-submodules' -alias gclean='git clean -id' -alias gpristine='git reset --hard && git clean -dffx' +alias gclean='git clean --interactive -d' +alias gpristine='git reset --hard && git clean --force -dx' alias gcm='git checkout $(git_main_branch)' alias gcd='git checkout $(git_develop_branch)' -alias gcmsg='git commit -m' +alias gcmsg='git commit --message' alias gco='git checkout' alias gcor='git checkout --recurse-submodules' -alias gcount='git shortlog -sn' +alias gcount='git shortlog --summary --numbered' alias gcp='git cherry-pick' alias gcpa='git cherry-pick --abort' alias gcpc='git cherry-pick --continue' -alias gcs='git commit -S' -alias gcss='git commit -S -s' -alias gcssm='git commit -S -s -m' +alias gcs='git commit --gpg-sign' +alias gcss='git commit --gpg-sign --signoff' +alias gcssm='git commit --gpg-sign --signoff --message' alias gd='git diff' alias gdca='git diff --cached' @@ -208,11 +207,11 @@ alias gignored='git ls-files -v | grep "^[[:lower:]]"' alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk' alias gk='\gitk --all --branches &!' -alias gke='\gitk --all $(git log -g --pretty=%h) &!' +alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!' alias gl='git pull' alias glg='git log --stat' -alias glgp='git log --stat -p' +alias glgp='git log --stat --patch' alias glgg='git log --graph' alias glgga='git log --graph --decorate --all' alias glgm='git log --graph --max-count=10' @@ -240,7 +239,7 @@ alias gpf!='git push --force' alias gpoat='git push origin --all && git push origin --tags' alias gpr='git pull --rebase' alias gpu='git push upstream' -alias gpv='git push -v' +alias gpv='git push --verbose' alias gr='git remote' alias gra='git remote add' @@ -248,7 +247,7 @@ alias grb='git rebase' alias grba='git rebase --abort' alias grbc='git rebase --continue' alias grbd='git rebase $(git_develop_branch)' -alias grbi='git rebase -i' +alias grbi='git rebase --interactive' alias grbm='git rebase $(git_main_branch)' alias grbom='git rebase origin/$(git_main_branch)' alias grbo='git rebase --onto' @@ -268,15 +267,15 @@ alias grst='git restore --staged' alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' alias gru='git reset --' alias grup='git remote update' -alias grv='git remote -v' +alias grv='git remote --verbose' -alias gsb='git status -sb' +alias gsb='git status --short --branch' alias gsd='git svn dcommit' alias gsh='git show' alias gsi='git submodule init' alias gsps='git show --pretty=short --show-signature' alias gsr='git svn rebase' -alias gss='git status -s' +alias gss='git status --short' alias gst='git status' # use the default stash push on git 2.13 and newer @@ -294,27 +293,27 @@ alias gstu='gsta --include-untracked' alias gstall='git stash --all' alias gsu='git submodule update' alias gsw='git switch' -alias gswc='git switch -c' +alias gswc='git switch --create' alias gswm='git switch $(git_main_branch)' alias gswd='git switch $(git_develop_branch)' -alias gts='git tag -s' +alias gts='git tag --sign' alias gtv='git tag | sort -V' -alias gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl' +alias gtl='gtl(){ git tag --sort=-v:refname -n --list "${1}*" }; noglob gtl' alias gunignore='git update-index --no-assume-unchanged' -alias gunwip='git log -n 1 | grep -q -c "\--wip--" && git reset HEAD~1' +alias gunwip='git log --max-count=1 | grep -q -c "\--wip--" && git reset HEAD~1' alias gup='git pull --rebase' -alias gupv='git pull --rebase -v' +alias gupv='git pull --rebase --verbose' alias gupa='git pull --rebase --autostash' -alias gupav='git pull --rebase --autostash -v' +alias gupav='git pull --rebase --autostash --verbose' alias gupom='git pull --rebase origin $(git_main_branch)' alias gupomi='git pull --rebase=interactive origin $(git_main_branch)' alias glum='git pull upstream $(git_main_branch)' alias gluc='git pull upstream $(git_current_branch)' alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' -alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"' +alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"' alias gwt='git worktree' alias gwta='git worktree add' @@ -342,4 +341,4 @@ function grename() { fi } -unset git_version +unset git_version \ No newline at end of file From 6dc6646d529a7dc6a1d8e1a2c1507dff7e528c8d Mon Sep 17 00:00:00 2001 From: Romain Janvier Date: Thu, 12 Jan 2023 13:56:26 +0100 Subject: [PATCH 065/321] docs(git): add missing entries and run formatter --- plugins/git/README.md | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 8cb4215a..d455e0ef 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -60,6 +60,8 @@ plugins=(... git) | gcpa | git cherry-pick --abort | | gcpc | git cherry-pick --continue | | gcs | git commit -S | +| gcss | git commit -S -s | +| gcssm | git commit -S -s -m | | gd | git diff | | gdca | git diff --cached | | gdcw | git diff --cached --word-diff | @@ -157,8 +159,8 @@ plugins=(... git) | gsr | git svn rebase | | gss | git status --short | | gst | git status | -| gsta | git stash push | -| gsta | git stash save | +| gsta | git stash push (git version >= 2.13) | +| gsta | git stash save (git version < 2.13) | | gstaa | git stash apply | | gstc | git stash clear | | gstd | git stash drop | @@ -176,7 +178,7 @@ plugins=(... git) | gtv | git tag \| sort -V | | gtl | gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl | | gunignore | git update-index --no-assume-unchanged | -| gunwip | git log --max-count=1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 | +| gunwip | git log --max-count=1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 | | gup | git pull --rebase | | gupv | git pull --rebase --verbose | | gupa | git pull --rebase --autostash | @@ -192,10 +194,10 @@ plugins=(... git) | gams | git am --skip | | gama | git am --abort | | gamscp | git am --show-current-patch | -| gwt | git worktree | -| gwtls | git worktree list | -| gwtmv | git worktree move | -| gwtrm | git worktree remove | +| gwt | git worktree | +| gwtls | git worktree list | +| gwtmv | git worktree move | +| gwtrm | git worktree remove | ### Main branch preference @@ -227,7 +229,7 @@ These are aliases that have been removed, renamed, or otherwise modified in a wa ### Current | Command | Description | -|:-----------------------|:---------------------------------------------------------------------------------------------------------| +| :--------------------- | :------------------------------------------------------------------------------------------------------- | | `grename ` | Rename `old` branch to `new`, including in origin remote | | current_branch | Return the name of the current branch | | git_current_user_name | Returns the `user.name` config value | @@ -240,13 +242,13 @@ These are aliases that have been removed, renamed, or otherwise modified in a wa These features allow to pause a branch development and switch to another one (_"Work in Progress"_, or wip). When you want to go back to work, just unwip it. | Command | Description | -|:-----------------|:------------------------------------------------| +| :--------------- | :---------------------------------------------- | | work_in_progress | Echoes a warning if the current branch is a wip | | gwip | Commit wip branch | | gunwip | Uncommit wip branch | ### Deprecated functions -| Command | Description | Reason | -|:-----------------------|:----------------------------------------|:----------------------------------------------------------------| -| current_repository | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias) | +| Command | Description | Reason | +| :----------------- | :-------------------------------------- | :-------------------------------------------------------------- | +| current_repository | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias) | From ec0003f2faaf45e8e11660c5b66e98d10d462ee5 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 13 Jan 2023 12:40:47 +0100 Subject: [PATCH 066/321] ci: update to `checkout@v3` to avoid warnings --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 57a1e383..8ee2df3d 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -7,7 +7,7 @@ on: branches: - master push: - branches: + branches: - master concurrency: @@ -27,7 +27,7 @@ jobs: os: [ubuntu-latest, macos-latest] steps: - name: Set up git repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Install zsh if: runner.os == 'Linux' run: sudo apt-get update; sudo apt-get install zsh From eb2147c7159cf1ed14b1e5b6784d7d07c3662b52 Mon Sep 17 00:00:00 2001 From: Noam Cohen Date: Fri, 13 Jan 2023 15:35:30 +0200 Subject: [PATCH 067/321] feat(aws): load profiles from credentials file (#11196) Fixes #8472 --- plugins/aws/aws.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 2167f552..865e82f1 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -146,6 +146,7 @@ function aws_change_access_key() { } function aws_profiles() { + aws --no-cli-pager configure list-profiles 2> /dev/null && return [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1 grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g' } From ca0acf31ef163fd2a6bf562c9b9d6077975b41f8 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 13 Jan 2023 14:42:11 +0100 Subject: [PATCH 068/321] fix(emacs): make `alternate-editor` work for emacs >28 Closes #11441 --- plugins/emacs/README.md | 2 +- plugins/emacs/emacs.plugin.zsh | 2 +- plugins/emacs/emacsclient.sh | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/emacs/README.md b/plugins/emacs/README.md index c8e33b5a..8ed4a147 100644 --- a/plugins/emacs/README.md +++ b/plugins/emacs/README.md @@ -25,6 +25,6 @@ The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that | e | `emacs` | Same as emacs alias | | te | `$EMACS_LAUNCHER -nw` | Open terminal emacsclient | | eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs | -| eframe | `emacsclient --alternate-editor "" --create-frame` | Create new X frame | +| eframe | `emacsclient --alternate-editor="" --create-frame` | Create new X frame | | efile | - | Print the path to the file open in the current buffer | | ecd | - | Print the directory of the file open in the the current buffer | diff --git a/plugins/emacs/emacs.plugin.zsh b/plugins/emacs/emacs.plugin.zsh index fede5b0c..4747f035 100644 --- a/plugins/emacs/emacs.plugin.zsh +++ b/plugins/emacs/emacs.plugin.zsh @@ -32,7 +32,7 @@ alias te="$EMACS_PLUGIN_LAUNCHER -nw" # same than M-x eval but from outside Emacs. alias eeval="$EMACS_PLUGIN_LAUNCHER --eval" # create a new X frame -alias eframe='emacsclient --alternate-editor "" --create-frame' +alias eframe='emacsclient --alternate-editor="" --create-frame' # Emacs ANSI Term tracking if [[ -n "$INSIDE_EMACS" ]]; then diff --git a/plugins/emacs/emacsclient.sh b/plugins/emacs/emacsclient.sh index 96893c93..172c0ae9 100755 --- a/plugins/emacs/emacsclient.sh +++ b/plugins/emacs/emacsclient.sh @@ -15,11 +15,11 @@ emacsfun() { # Only create another X frame if there isn't one present if [ -z "$frames" -o "$frames" = nil ]; then - emacsclient --alternate-editor "" --create-frame "$@" + emacsclient --alternate-editor="" --create-frame "$@" return $? fi - emacsclient --alternate-editor "" "$@" + emacsclient --alternate-editor="" "$@" } # Adapted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh From df658350a38aa73920fdefa5b255f8d7a58d31dc Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sun, 15 Jan 2023 17:11:29 +0100 Subject: [PATCH 069/321] fix(clipboard): move wsl detection to higher priority (#11440) Closes #8827 --- lib/clipboard.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/clipboard.zsh b/lib/clipboard.zsh index ad83fc4b..2f3b6bca 100644 --- a/lib/clipboard.zsh +++ b/lib/clipboard.zsh @@ -57,6 +57,9 @@ function detect-clipboard() { elif [[ "${OSTYPE}" == (cygwin|msys)* ]]; then function clipcopy() { cat "${1:-/dev/stdin}" > /dev/clipboard; } function clippaste() { cat /dev/clipboard; } + elif (( $+commands[clip.exe] )) && (( $+commands[powershell.exe] )); then + function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; } + function clippaste() { powershell.exe -noprofile -command Get-Clipboard; } elif [ -n "${WAYLAND_DISPLAY:-}" ] && (( ${+commands[wl-copy]} )) && (( ${+commands[wl-paste]} )); then function clipcopy() { cat "${1:-/dev/stdin}" | wl-copy &>/dev/null &|; } function clippaste() { wl-paste; } @@ -81,9 +84,6 @@ function detect-clipboard() { elif [ -n "${TMUX:-}" ] && (( ${+commands[tmux]} )); then function clipcopy() { tmux load-buffer "${1:--}"; } function clippaste() { tmux save-buffer -; } - elif [[ $(uname -r) = *icrosoft* ]]; then - function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; } - function clippaste() { powershell.exe -noprofile -command Get-Clipboard; } else function _retry_clipboard_detection_or_fail() { local clipcmd="${1}"; shift From 4b5076b5ec450d30270f31a68d0299392ada042d Mon Sep 17 00:00:00 2001 From: xiagw Date: Mon, 16 Jan 2023 20:19:01 +0800 Subject: [PATCH 070/321] feat(extract): add `pbzip2` and `pixz` (#11435) --- plugins/extract/extract.plugin.zsh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 1112dd52..563d88c7 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -30,12 +30,15 @@ EOF local extract_dir="${1:t:r}" local file="$1" full_path="${1:A}" case "${file:l}" in - (*.tar.gz|*.tgz) (( $+commands[pigz] )) && { pigz -dc "$file" | tar xv } || tar zxvf "$file" ;; - (*.tar.bz2|*.tbz|*.tbz2) tar xvjf "$file" ;; + (*.tar.gz|*.tgz) + (( $+commands[pigz] )) && { tar -I pigz -xvf "$file" } || tar zxvf "$file" ;; + (*.tar.bz2|*.tbz|*.tbz2) + (( $+commands[pbzip2] )) && { tar -I pbzip2 -xvf "$file" } || tar xvjf "$file" ;; (*.tar.xz|*.txz) + (( $+commands[pixz] )) && { tar -I pixz -xvf "$file" } || { tar --xz --help &> /dev/null \ && tar --xz -xvf "$file" \ - || xzcat "$file" | tar xvf - ;; + || xzcat "$file" | tar xvf - } ;; (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \ && tar --lzma -xvf "$file" \ From 8f0e296dbf27026ea0515ebae0d3cc41f236ecdc Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 16 Jan 2023 20:16:00 +0100 Subject: [PATCH 071/321] feat(nsc): add completion plugin --- plugins/nsc/README.md | 11 +++++++++++ plugins/nsc/nsc.plugin.zsh | 13 +++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 plugins/nsc/README.md create mode 100644 plugins/nsc/nsc.plugin.zsh diff --git a/plugins/nsc/README.md b/plugins/nsc/README.md new file mode 100644 index 00000000..ce0d2c15 --- /dev/null +++ b/plugins/nsc/README.md @@ -0,0 +1,11 @@ +# NSC plugin + +This plugin adds completion for the [NSC](https://github.com/nats-io/nsc). + +To use it, add `nsc` to the plugins array in your zshrc file: + +```zsh +plugins=(... nsc) +``` + +This plugin does not add any aliases. diff --git a/plugins/nsc/nsc.plugin.zsh b/plugins/nsc/nsc.plugin.zsh new file mode 100644 index 00000000..daa599e8 --- /dev/null +++ b/plugins/nsc/nsc.plugin.zsh @@ -0,0 +1,13 @@ +if (( ! $+commands[nsc] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `nsc`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_nsc" ]]; then + typeset -g -A _comps + autoload -Uz _nsc + _comps[nsc]=_nsc +fi + +nsc completion zsh >| "$ZSH_CACHE_DIR/completions/_nsc" &| From 5b9de6a5304ad5f74ccb5862122a23b9ba06f6e3 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 19 Dec 2022 23:32:24 +0100 Subject: [PATCH 072/321] fix(init): remove duplicated check It was added due to #9039. See https://github.com/ohmyzsh/ohmyzsh/pull/11400#pullrequestreview-1223587420 --- oh-my-zsh.sh | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index e94c2f41..98bda8c8 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -57,9 +57,7 @@ mkdir -p "$ZSH_CACHE_DIR/completions" (( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath) # Check for updates on initial load... -if [[ "$DISABLE_AUTO_UPDATE" != true ]]; then - source "$ZSH/tools/check_for_upgrade.sh" -fi +source "$ZSH/tools/check_for_upgrade.sh" # Initializes Oh My Zsh From fe0dd8226d6f58ea98f9f84b279e6c3859993fb9 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 19 Dec 2022 23:33:55 +0100 Subject: [PATCH 073/321] fix(upgrade): do not upgrade if not called from tty Fixes #11390 --- .prettierrc | 4 ++++ tools/check_for_upgrade.sh | 2 ++ 2 files changed, 6 insertions(+) create mode 100644 .prettierrc diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..a8f5a14b --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "printWidth": 110, + "proseWrap": "always" +} diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index 3a6bb655..734714c9 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -21,9 +21,11 @@ zstyle -s ':omz:update' mode update_mode || { # Cancel update if: # - the automatic update is disabled. # - the current user doesn't have write permissions nor owns the $ZSH directory. +# - is not run from a tty # - git is unavailable on the system. if [[ "$update_mode" = disabled ]] \ || [[ ! -w "$ZSH" || ! -O "$ZSH" ]] \ + || [[ ! -t 1 ]] \ || ! command git --version 2>&1 >/dev/null; then unset update_mode return From 61dd3682e69aa990a8a3589c5c61ea2e1edf8312 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 17 Jan 2023 13:18:43 +0100 Subject: [PATCH 074/321] feat(nats)!: rename `nsc` plugin to `nats` --- plugins/nats/README.md | 14 ++++++++++++++ plugins/nats/nats.plugin.zsh | 23 +++++++++++++++++++++++ plugins/nsc/README.md | 11 ----------- plugins/nsc/nsc.plugin.zsh | 13 ------------- 4 files changed, 37 insertions(+), 24 deletions(-) create mode 100644 plugins/nats/README.md create mode 100644 plugins/nats/nats.plugin.zsh delete mode 100644 plugins/nsc/README.md delete mode 100644 plugins/nsc/nsc.plugin.zsh diff --git a/plugins/nats/README.md b/plugins/nats/README.md new file mode 100644 index 00000000..0ea26fca --- /dev/null +++ b/plugins/nats/README.md @@ -0,0 +1,14 @@ +# NATS plugin + +This plugin adds completion for several tools from [NATS](https://nats.io/). + +- [`nsc`](https://github.com/nats-io/nsc) +- [`natscli`](https://github.com/nats-io/natscli) + +To use it, add `nats` to the plugins array in your zshrc file: + +```zsh +plugins=(... nats) +``` + +This plugin does not add any aliases. diff --git a/plugins/nats/nats.plugin.zsh b/plugins/nats/nats.plugin.zsh new file mode 100644 index 00000000..8b95b07c --- /dev/null +++ b/plugins/nats/nats.plugin.zsh @@ -0,0 +1,23 @@ +if (( $+commands[nsc] )); then + # If the completion file doesn't exist yet, we need to autoload it and + # bind it to `nsc`. Otherwise, compinit will have already done that. + if [[ ! -f "$ZSH_CACHE_DIR/completions/_nsc" ]]; then + typeset -g -A _comps + autoload -Uz _nsc + _comps[nsc]=_nsc + fi + + nsc completion zsh >| "$ZSH_CACHE_DIR/completions/_nsc" &| +fi + +if (( $+commands[nats] )); then + # If the completion file doesn't exist yet, we need to autoload it and + # bind it to `nats`. Otherwise, compinit will have already done that. + if [[ ! -f "$ZSH_CACHE_DIR/completions/_nats" ]]; then + typeset -g -A _comps + autoload -Uz _nats + _comps[nats]=_nats + fi + + nats --completion-script-zsh >| "$ZSH_CACHE_DIR/completions/_nats" &| +fi diff --git a/plugins/nsc/README.md b/plugins/nsc/README.md deleted file mode 100644 index ce0d2c15..00000000 --- a/plugins/nsc/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# NSC plugin - -This plugin adds completion for the [NSC](https://github.com/nats-io/nsc). - -To use it, add `nsc` to the plugins array in your zshrc file: - -```zsh -plugins=(... nsc) -``` - -This plugin does not add any aliases. diff --git a/plugins/nsc/nsc.plugin.zsh b/plugins/nsc/nsc.plugin.zsh deleted file mode 100644 index daa599e8..00000000 --- a/plugins/nsc/nsc.plugin.zsh +++ /dev/null @@ -1,13 +0,0 @@ -if (( ! $+commands[nsc] )); then - return -fi - -# If the completion file doesn't exist yet, we need to autoload it and -# bind it to `nsc`. Otherwise, compinit will have already done that. -if [[ ! -f "$ZSH_CACHE_DIR/completions/_nsc" ]]; then - typeset -g -A _comps - autoload -Uz _nsc - _comps[nsc]=_nsc -fi - -nsc completion zsh >| "$ZSH_CACHE_DIR/completions/_nsc" &| From f1a800067f46fa990a11ea0055459560ce63a7ae Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 19 Jan 2023 12:20:44 +0100 Subject: [PATCH 075/321] fix(brew)!: rename `buf` alias to `bfu` BREAKING CHANGE: rename `buf` alias to `bfu` to avoid conflicts with protobuf tool --- plugins/brew/README.md | 28 ++++++++++++++-------------- plugins/brew/brew.plugin.zsh | 2 +- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/plugins/brew/README.md b/plugins/brew/README.md index 4a42b3d7..d0c15023 100644 --- a/plugins/brew/README.md +++ b/plugins/brew/README.md @@ -17,20 +17,20 @@ defined for convenience. ## Aliases -| Alias | Command | Description | -| -------- | ------------------------------------- | ------------------------------------------------------------------- | -| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | -| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. | -| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | -| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. | -| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. | -| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. | -| `bubc` | `brew upgrade && brew cleanup` | Upgrade outdated formulae and casks, then run cleanup. | -| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. | -| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. | -| `bubu` | `bubo && bubc` | Do the last two operations above. | -| `buf` | `brew upgrade --formula` | Upgrade only formulas (not casks). | -| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. | +| Alias | Command | Description | +| -------- | --------------------------------------- | ------------------------------------------------------------------- | +| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | +| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. | +| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | +| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. | +| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. | +| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. | +| `bubc` | `brew upgrade && brew cleanup` | Upgrade outdated formulae and casks, then run cleanup. | +| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. | +| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. | +| `bubu` | `bubo && bubc` | Do the last two operations above. | +| `bfu` | `brew upgrade --formula` | Upgrade only formulas (not casks). | +| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. | ## Completion diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index 8275454a..f6abe087 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -35,7 +35,7 @@ alias bugbc='brew upgrade --greedy && brew cleanup' alias bubo='brew update && brew outdated' alias bubu='bubo && bubc' alias bubug='bubo && bugbc' -alias buf='brew upgrade --formula' +alias bfu='brew upgrade --formula' alias buz='brew uninstall --zap' function brews() { From bf57b4ff3d53726a1317459b0f48853e90d7a6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Marc=C3=A8=20i=20Igual?= Date: Fri, 20 Jan 2023 19:45:14 +0100 Subject: [PATCH 076/321] feat(functions/take): make `.tgz` behave as `.tar.gz` (#11446) --- lib/functions.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/functions.zsh b/lib/functions.zsh index dfcc4d96..6e1faa6a 100644 --- a/lib/functions.zsh +++ b/lib/functions.zsh @@ -56,7 +56,7 @@ function takegit() { } function take() { - if [[ $1 =~ ^(https?|ftp).*\.tar\.(gz|bz2|xz)$ ]]; then + if [[ $1 =~ ^(https?|ftp).*\.(tar\.(gz|bz2|xz)|tgz)$ ]]; then takeurl "$1" elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]; then takegit "$1" From ba8777fc3013a3c682d8144586e16457cbe12586 Mon Sep 17 00:00:00 2001 From: Yuxin Wu Date: Sat, 21 Jan 2023 02:36:07 -0800 Subject: [PATCH 077/321] perf(fzf): speed up startup on debian (#11122) --- plugins/fzf/fzf.plugin.zsh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 9c8dd864..85a0bf27 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -60,8 +60,8 @@ function fzf_setup_using_base_dir() { function fzf_setup_using_debian() { - if (( ! $+commands[dpkg] )) || ! dpkg -s fzf &>/dev/null; then - # Either not a debian based distro, or no fzf installed + if (( ! $+commands[dpkg] )); then + # Not a debian based distro return 1 fi @@ -72,11 +72,19 @@ function fzf_setup_using_debian() { case $PREFIX in *com.termux*) + if [[ ! -f "${PREFIX}/bin/fzf" ]]; then + # fzf not installed + return 1 + fi # Support Termux package completions="${PREFIX}/share/fzf/completion.zsh" key_bindings="${PREFIX}/share/fzf/key-bindings.zsh" ;; *) + if [[ ! -f /usr/bin/fzf ]]; then + # fzf not installed + return 1 + fi # Determine completion file path: first bullseye/sid, then buster/stretch completions="/usr/share/doc/fzf/examples/completion.zsh" [[ -f "$completions" ]] || completions="/usr/share/zsh/vendor-completions/_fzf" From a1c54e03f98b594a6fcc368c2c113d469ffaa368 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sun, 22 Jan 2023 23:36:57 +0100 Subject: [PATCH 078/321] feat(fzf): add `skip-dpkg` flag to avoid some regressions See https://github.com/ohmyzsh/ohmyzsh/pull/11122#issuecomment-1399607430 --- plugins/fzf/README.md | 9 +++++++++ plugins/fzf/fzf.plugin.zsh | 4 ++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/fzf/README.md b/plugins/fzf/README.md index beedf469..7e3e3e5b 100644 --- a/plugins/fzf/README.md +++ b/plugins/fzf/README.md @@ -50,3 +50,12 @@ Set whether to disable key bindings (CTRL-T, CTRL-R, ALT-C): ```zsh DISABLE_FZF_KEY_BINDINGS="true" ``` + +### Skip `dpkg` loading + +If you have `dpkg` available in your `$PATH` but you don't want to load `fzf` from there, and facing some +issues, you can define this option before loading `oh-my-zsh` in order to skip that loading: + +```zsh +zstyle ':omz:plugins:fzf' skip-dpkg yes +``` diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 85a0bf27..c07d3849 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -60,8 +60,8 @@ function fzf_setup_using_base_dir() { function fzf_setup_using_debian() { - if (( ! $+commands[dpkg] )); then - # Not a debian based distro + if (( ! $+commands[dpkg] )) || zstyle -t ':omz:plugins:fzf' skip-dpkg; then + # Not a debian based distro return 1 fi From 7de55844b26394688221b1cd12ef4053b3c7f6c7 Mon Sep 17 00:00:00 2001 From: Bartek Pacia Date: Mon, 23 Jan 2023 19:40:42 +0100 Subject: [PATCH 079/321] feat(mlh): add separate prompt symbol for root user (#11451) --- themes/mlh.zsh-theme | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/themes/mlh.zsh-theme b/themes/mlh.zsh-theme index baff3fb6..c059bf85 100644 --- a/themes/mlh.zsh-theme +++ b/themes/mlh.zsh-theme @@ -47,6 +47,10 @@ if [ -z "$MLH_SHELL_SYMBOL" ]; then MLH_SHELL_SYMBOL="$ " fi +if [ -z "$MLH_SHELL_SYMBOL_ROOT" ]; then + MLH_SHELL_SYMBOL_ROOT="# " +fi + # colors USER_COLOR="%F{001}" DEVICE_COLOR="%F{033}" @@ -83,7 +87,11 @@ exit_code() { } prompt_end() { - printf "\n$MLH_SHELL_SYMBOL" + if [ "$UID" -eq 0 ]; then + printf "\n$MLH_SHELL_SYMBOL_ROOT" + else + printf "\n$MLH_SHELL_SYMBOL" + fi } # Set git_prompt_info text From 657ad0523d5a29e0bdc8af0cd63c23ac597406e8 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 25 Jan 2023 08:50:06 +0100 Subject: [PATCH 080/321] fix(theme-and-appearance): fix `diff` completion in macOS Closes #11416 Closes #11454 --- lib/theme-and-appearance.zsh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index 00947f72..9b908bef 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -41,7 +41,11 @@ fi # enable diff color if possible. if command diff --color /dev/null /dev/null &>/dev/null; then - alias diff='diff --color' + function color-diff { + diff --color $@ + } + alias diff="color-diff" + compdef _diff color-diff # compdef is already loaded by this point fi setopt auto_cd From e55e3f0f56ab4df21eb33e19569c295e7e5e71a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 26 Jan 2023 20:45:48 +0100 Subject: [PATCH 081/321] fix(systemadmin): handle error for no IPv6 route in `geteip` (#11458) --- plugins/systemadmin/systemadmin.plugin.zsh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh index 9b5159ff..7ce62bac 100644 --- a/plugins/systemadmin/systemadmin.plugin.zsh +++ b/plugins/systemadmin/systemadmin.plugin.zsh @@ -140,7 +140,13 @@ function d0() { # gather external ip address function geteip() { curl -s -S -4 https://icanhazip.com - curl -s -S -6 https://icanhazip.com + + # handle case when there is no IPv6 external IP, which shows error + # curl: (7) Couldn't connect to server + curl -s -S -6 https://icanhazip.com 2>/dev/null + local ret=$? + (( ret == 7 )) && print -P -u2 "%F{red}error: no IPv6 route to host%f" + return $ret } # determine local IP address(es) From b0bffcaf865434711d98b63eddd0aa52be0fbeb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 27 Jan 2023 16:22:27 +0100 Subject: [PATCH 082/321] fix(fzf): fix check for true Debian-like in debian setup function (#11460) Check for `apt` and `apt-get` in debian setup function. Look for exact directory in debian-like setup function. Fixes #11459 --- plugins/fzf/README.md | 9 --------- plugins/fzf/fzf.plugin.zsh | 4 ++-- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/plugins/fzf/README.md b/plugins/fzf/README.md index 7e3e3e5b..beedf469 100644 --- a/plugins/fzf/README.md +++ b/plugins/fzf/README.md @@ -50,12 +50,3 @@ Set whether to disable key bindings (CTRL-T, CTRL-R, ALT-C): ```zsh DISABLE_FZF_KEY_BINDINGS="true" ``` - -### Skip `dpkg` loading - -If you have `dpkg` available in your `$PATH` but you don't want to load `fzf` from there, and facing some -issues, you can define this option before loading `oh-my-zsh` in order to skip that loading: - -```zsh -zstyle ':omz:plugins:fzf' skip-dpkg yes -``` diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index c07d3849..7bb6667d 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -60,7 +60,7 @@ function fzf_setup_using_base_dir() { function fzf_setup_using_debian() { - if (( ! $+commands[dpkg] )) || zstyle -t ':omz:plugins:fzf' skip-dpkg; then + if (( ! $+commands[apt] && ! $+commands[apt-get] )); then # Not a debian based distro return 1 fi @@ -81,7 +81,7 @@ function fzf_setup_using_debian() { key_bindings="${PREFIX}/share/fzf/key-bindings.zsh" ;; *) - if [[ ! -f /usr/bin/fzf ]]; then + if [[ ! -d /usr/share/doc/fzf/examples ]]; then # fzf not installed return 1 fi From 39525e5ec36052a83fadd47f377a26d33df851bd Mon Sep 17 00:00:00 2001 From: Taehyun Hwang Date: Sun, 29 Jan 2023 02:45:23 +0900 Subject: [PATCH 083/321] feat(git): add `gpsupf` alias (#11268) --- plugins/git/README.md | 1 + plugins/git/git.plugin.zsh | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index d455e0ef..d5eaaa53 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -89,6 +89,7 @@ plugins=(... git) | ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | | ggu | git pull --rebase origin $(current_branch) | | gpsup | git push --set-upstream origin $(git_current_branch) | +| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease | | ghh | git help | | gignore | git update-index --assume-unchanged | | gignored | git ls-files -v \| grep "^[[:lower:]]" | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 7544ca44..fc2c08cc 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -199,6 +199,7 @@ alias ggpush='git push origin "$(git_current_branch)"' alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' alias gpsup='git push --set-upstream origin $(git_current_branch)' +alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease' alias ghh='git help' @@ -341,4 +342,4 @@ function grename() { fi } -unset git_version \ No newline at end of file +unset git_version From b2313ec7493dc127c9712f20654579221d0bcce6 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 22 Oct 2020 21:57:23 -0400 Subject: [PATCH 084/321] feat(installer): respect and install in `$ZDOTDIR` if set (#9376) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #9001 Fixes #10479 Closes #9376 Co-authored-by: Marc Cornellà --- tools/install.sh | 45 ++++++++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/tools/install.sh b/tools/install.sh index a6538f9d..4582ed03 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -16,6 +16,9 @@ # ZSH=~/.zsh sh install.sh # # Respects the following environment variables: +# ZDOTDIR - path to Zsh dotfiles directory (default: unset). See [1][2] +# [1] https://zsh.sourceforge.io/Doc/Release/Parameters.html#index-ZDOTDIR +# [2] https://zsh.sourceforge.io/Doc/Release/Files.html#index-ZDOTDIR_002c-use-of # ZSH - path to the Oh My Zsh repository folder (default: $HOME/.oh-my-zsh) # REPO - name of the GitHub repo to install from (default: ohmyzsh/ohmyzsh) # REMOTE - full remote URL of the git repo to install (default: GitHub via HTTPS) @@ -53,8 +56,17 @@ HOME="${HOME:-$(eval echo ~$USER)}" # Track if $ZSH was provided custom_zsh=${ZSH:+yes} -# Default settings +# Use $zdot to keep track of where the directory is for zsh dotfiles +# To check if $ZDOTDIR was provided, explicitly check for $ZDOTDIR +zdot="${ZDOTDIR:-$HOME}" + +# Default value for $ZSH +# a) if $ZDOTDIR is supplied: $ZDOTDIR/ohmyzsh +# b) otherwise, $HOME/.oh-my-zsh +ZSH="${ZSH:-${ZDOTDIR:+$ZDOTDIR/ohmyzsh}}" ZSH="${ZSH:-$HOME/.oh-my-zsh}" + +# Default settings REPO=${REPO:-ohmyzsh/ohmyzsh} REMOTE=${REMOTE:-https://github.com/${REPO}.git} BRANCH=${BRANCH:-master} @@ -311,11 +323,11 @@ setup_zshrc() { echo "${FMT_BLUE}Looking for an existing zsh config...${FMT_RESET}" # Must use this exact name so uninstall.sh can find it - OLD_ZSHRC=~/.zshrc.pre-oh-my-zsh - if [ -f ~/.zshrc ] || [ -h ~/.zshrc ]; then + OLD_ZSHRC="$zdot/.zshrc.pre-oh-my-zsh" + if [ -f "$zdot/.zshrc" ] || [ -h "$zdot/.zshrc" ]; then # Skip this if the user doesn't want to replace an existing .zshrc if [ "$KEEP_ZSHRC" = yes ]; then - echo "${FMT_YELLOW}Found ~/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}" + echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}" return fi if [ -e "$OLD_ZSHRC" ]; then @@ -327,19 +339,22 @@ setup_zshrc() { fi mv "$OLD_ZSHRC" "${OLD_OLD_ZSHRC}" - echo "${FMT_YELLOW}Found old ~/.zshrc.pre-oh-my-zsh." \ + echo "${FMT_YELLOW}Found old .zshrc.pre-oh-my-zsh." \ "${FMT_GREEN}Backing up to ${OLD_OLD_ZSHRC}${FMT_RESET}" fi - echo "${FMT_YELLOW}Found ~/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}" - mv ~/.zshrc "$OLD_ZSHRC" + echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}" + mv "$zdot/.zshrc" "$OLD_ZSHRC" fi - echo "${FMT_GREEN}Using the Oh My Zsh template file and adding it to ~/.zshrc.${FMT_RESET}" + echo "${FMT_GREEN}Using the Oh My Zsh template file and adding it to $zdot/.zshrc.${FMT_RESET}" - # Replace $HOME path with '$HOME' in $ZSH variable in .zshrc file - omz=$(echo "$ZSH" | sed "s|^$HOME/|\$HOME/|") - sed "s|^export ZSH=.*$|export ZSH=\"${omz}\"|" "$ZSH/templates/zshrc.zsh-template" > ~/.zshrc-omztemp - mv -f ~/.zshrc-omztemp ~/.zshrc + # Modify $ZSH variable in .zshrc directory to use the literal $ZDOTDIR or $HOME + omz="$ZSH" + [ -z "$ZDOTDIR" ] || omz=$(echo "$omz" | sed "s|^$ZDOTDIR/|\$ZDOTDIR/|") + omz=$(echo "$omz" | sed "s|^$HOME/|\$HOME/|") + + sed "s|^export ZSH=.*$|export ZSH=\"${omz}\"|" "$ZSH/templates/zshrc.zsh-template" > "$zdot/.zshrc-omztemp" + mv -f "$zdot/.zshrc-omztemp" "$zdot/.zshrc" echo } @@ -407,9 +422,9 @@ EOF # We're going to change the default shell, so back up the current one if [ -n "$SHELL" ]; then - echo "$SHELL" > ~/.shell.pre-oh-my-zsh + echo "$SHELL" > "$zdot/.shell.pre-oh-my-zsh" else - grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > ~/.shell.pre-oh-my-zsh + grep "^$USER:" /etc/passwd | awk -F: '{print $7}' > "$zdot/.shell.pre-oh-my-zsh" fi echo "Changing your shell to $zsh..." @@ -451,7 +466,7 @@ print_success() { printf '\n' printf '\n' printf "%s %s %s\n" "Before you scream ${FMT_BOLD}${FMT_YELLOW}Oh My Zsh!${FMT_RESET} look over the" \ - "$(fmt_code "$(fmt_link ".zshrc" "file://$HOME/.zshrc" --text)")" \ + "$(fmt_code "$(fmt_link ".zshrc" "file://$zdot/.zshrc" --text)")" \ "file to select plugins, themes, and options." printf '\n' printf '%s\n' "• Follow us on Twitter: $(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)" From 27f31799df369ffdd825014bbbb853ad6a1ee520 Mon Sep 17 00:00:00 2001 From: Stoyan Dimov Date: Wed, 1 Feb 2023 10:51:31 +0100 Subject: [PATCH 085/321] feat(dotnet): add `dwt` alias (#11470) --- plugins/dotnet/README.md | 1 + plugins/dotnet/dotnet.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/dotnet/README.md b/plugins/dotnet/README.md index 87dfd8f8..a15e8057 100644 --- a/plugins/dotnet/README.md +++ b/plugins/dotnet/README.md @@ -17,6 +17,7 @@ plugins=(... dotnet) | dt | dotnet test | Run unit tests using the test runner specified in a .NET project. | | dw | dotnet watch | Watch for source file changes and restart the dotnet command. | | dwr | dotnet watch run | Watch for source file changes and restart the `run` command. | +| dwt | dotnet watch test| Watch for source file changes and restart the `test` command. | | ds | dotnet sln | Modify Visual Studio solution files. | | da | dotnet add | Add a package or reference to a .NET project. | | dp | dotnet pack | Create a NuGet package. | diff --git a/plugins/dotnet/dotnet.plugin.zsh b/plugins/dotnet/dotnet.plugin.zsh index 8ea31cdb..89d46467 100644 --- a/plugins/dotnet/dotnet.plugin.zsh +++ b/plugins/dotnet/dotnet.plugin.zsh @@ -26,6 +26,7 @@ alias dr='dotnet run' alias dt='dotnet test' alias dw='dotnet watch' alias dwr='dotnet watch run' +alias dwt='dotnet watch test' alias ds='dotnet sln' alias da='dotnet add' alias dp='dotnet pack' From 5c9a3d2f4f5cecc019b49d8fa3c151e547f8b139 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 1 Feb 2023 21:19:55 +0100 Subject: [PATCH 086/321] fix(installer): don't use `$ZDOTDIR` in zshrc file if same as `$HOME` Fixes #11471 --- tools/install.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tools/install.sh b/tools/install.sh index 4582ed03..3ea12f8d 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -61,9 +61,9 @@ custom_zsh=${ZSH:+yes} zdot="${ZDOTDIR:-$HOME}" # Default value for $ZSH -# a) if $ZDOTDIR is supplied: $ZDOTDIR/ohmyzsh +# a) if $ZDOTDIR is supplied and not $HOME: $ZDOTDIR/ohmyzsh # b) otherwise, $HOME/.oh-my-zsh -ZSH="${ZSH:-${ZDOTDIR:+$ZDOTDIR/ohmyzsh}}" +[ "$ZDOTDIR" = "$HOME" ] || ZSH="${ZSH:-${ZDOTDIR:+$ZDOTDIR/ohmyzsh}}" ZSH="${ZSH:-$HOME/.oh-my-zsh}" # Default settings @@ -350,7 +350,9 @@ setup_zshrc() { # Modify $ZSH variable in .zshrc directory to use the literal $ZDOTDIR or $HOME omz="$ZSH" - [ -z "$ZDOTDIR" ] || omz=$(echo "$omz" | sed "s|^$ZDOTDIR/|\$ZDOTDIR/|") + if [ -n "$ZDOTDIR" ] && [ "$ZDOTDIR" != "$HOME" ]; then + omz=$(echo "$omz" | sed "s|^$ZDOTDIR/|\$ZDOTDIR/|") + fi omz=$(echo "$omz" | sed "s|^$HOME/|\$HOME/|") sed "s|^export ZSH=.*$|export ZSH=\"${omz}\"|" "$ZSH/templates/zshrc.zsh-template" > "$zdot/.zshrc-omztemp" From 6c3cf658f6f341f7c716d6ff16714465cb651725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 2 Feb 2023 08:49:08 +0100 Subject: [PATCH 087/321] fix(installer): automatically create ZDOTDIR path if it doesn't exist --- tools/install.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/install.sh b/tools/install.sh index 3ea12f8d..f4ef16a0 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -523,6 +523,11 @@ EOF exit 1 fi + # Create ZDOTDIR folder structure if it doesn't exist + if [ -n "$ZDOTDIR" ]; then + mkdir -p "$ZDOTDIR" + fi + setup_ohmyzsh setup_zshrc setup_shell From b256c12d2e96d0fbe63910df82b9709cca4b38df Mon Sep 17 00:00:00 2001 From: David Yang Date: Thu, 2 Feb 2023 16:03:41 +0800 Subject: [PATCH 088/321] docs(fasd): recommend fork over original fasd (#11474) --- plugins/fasd/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/fasd/README.md b/plugins/fasd/README.md index a5c74e5b..7c44ac84 100644 --- a/plugins/fasd/README.md +++ b/plugins/fasd/README.md @@ -10,7 +10,7 @@ plugins=(... fasd) ## Installation -Please find detailed installation guide [`here`](https://github.com/clvv/fasd#install) +Please find detailed installation guide [`here`](https://github.com/whjvenyl/fasd#install) ## Aliases From ea4854dba3ef72e18df2c7cc79db2806d92322eb Mon Sep 17 00:00:00 2001 From: Hazael Sanchez Date: Thu, 2 Feb 2023 02:30:34 -0800 Subject: [PATCH 089/321] feat(directories): add config to skip aliases (#11469) Co-authored-by: Carlo Sala --- README.md | 10 ++++++++++ lib/directories.zsh | 2 ++ 2 files changed, 12 insertions(+) diff --git a/README.md b/README.md index 1e4b7ff7..7f4a26ca 100644 --- a/README.md +++ b/README.md @@ -276,6 +276,16 @@ If you have many functions that go well together, you can put them as a `XYZ.plu If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. +### Remove directories aliases + +If you want to skip ohmyzsh default +[directories aliases](https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/directories.zsh) you can add the +following snippet to your `zshrc`, before loading `oh-my-zsh.sh` script: + +```zsh +zstyle ':omz:directories' aliases no +``` + ## Getting Updates By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**: diff --git a/lib/directories.zsh b/lib/directories.zsh index c62f5646..5aa1b3d5 100644 --- a/lib/directories.zsh +++ b/lib/directories.zsh @@ -3,6 +3,8 @@ setopt auto_pushd setopt pushd_ignore_dups setopt pushdminus +zstyle -T ':omz:directories' aliases || return + alias -g ...='../..' alias -g ....='../../..' alias -g .....='../../../..' From f8bf8f0029a475831ebfba0799975ede20e08742 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 15 Dec 2022 23:06:06 +0100 Subject: [PATCH 090/321] fix(sudo): only call redisplay if zle is enabled Fixes #11322 --- plugins/sudo/sudo.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/sudo/sudo.plugin.zsh b/plugins/sudo/sudo.plugin.zsh index 2a0b3bfc..66b253fe 100644 --- a/plugins/sudo/sudo.plugin.zsh +++ b/plugins/sudo/sudo.plugin.zsh @@ -96,7 +96,7 @@ sudo-command-line() { LBUFFER="${WHITESPACE}${LBUFFER}" # Redisplay edit buffer (compatibility with zsh-syntax-highlighting) - zle redisplay + zle && zle redisplay # only run redisplay if zle is enabled } } From 9b91e8256011240cbf65ba65fbe55c5fd9dbae07 Mon Sep 17 00:00:00 2001 From: david Date: Sun, 5 Feb 2023 11:32:49 +0400 Subject: [PATCH 091/321] feat(extract): add `zpaq` support (#11478) --- plugins/extract/README.md | 1 + plugins/extract/_extract | 2 +- plugins/extract/extract.plugin.zsh | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/extract/README.md b/plugins/extract/README.md index 44f0b05a..f67b5361 100644 --- a/plugins/extract/README.md +++ b/plugins/extract/README.md @@ -55,6 +55,7 @@ plugins=(... extract) | `xz` | LZMA2 archive | | `zip` | Zip archive | | `zst` | Zstandard file (zstd) | +| `zpaq` | Zpaq file | See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information regarding archive formats. diff --git a/plugins/extract/_extract b/plugins/extract/_extract index 27b099c9..64678fed 100644 --- a/plugins/extract/_extract +++ b/plugins/extract/_extract @@ -3,5 +3,5 @@ _arguments \ '(-r --remove)'{-r,--remove}'[Remove archive.]' \ - "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst)(-.)'" \ + "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst|zpaq)(-.)'" \ && return 0 diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 563d88c7..4c84ef88 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -73,6 +73,7 @@ EOF (*.zst) unzstd "$file" ;; (*.cab) cabextract -d "$extract_dir" "$file" ;; (*.cpio) cpio -idmvF "$file" ;; + (*.zpaq) zpaq x "$file" ;; (*) echo "extract: '$file' cannot be extracted" >&2 success=1 ;; From d48cbb82b1a44d646c6b12b6bfb13c5fd366e1ae Mon Sep 17 00:00:00 2001 From: Unnit Metaliya Date: Mon, 6 Feb 2023 06:07:40 -0500 Subject: [PATCH 092/321] feat(git)!: add `force-if-includes` flag (#11481) Co-authored-by: Carlo Sala Closes #11388 BREAKING CHANGE: `gpf` and `gpsupf` now have the `--force-if-includes` flag if git version is greater than 2.30. It will make force pushes more safer. See https://stackoverflow.com/questions/65837109/when-should-i-use-git-push-force-if-includes --- plugins/git/README.md | 5 ++++- plugins/git/git.plugin.zsh | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index d5eaaa53..cd018d43 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -89,7 +89,8 @@ plugins=(... git) | ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | | ggu | git pull --rebase origin $(current_branch) | | gpsup | git push --set-upstream origin $(git_current_branch) | -| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease | +| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes (git version >= 2.30) | +| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease (git version < 2.30) | | ghh | git help | | gignore | git update-index --assume-unchanged | | gignored | git ls-files -v \| grep "^[[:lower:]]" | @@ -120,6 +121,8 @@ plugins=(... git) | gp | git push | | gpd | git push --dry-run | | gpf | git push --force-with-lease | +| gpf | git push --force-with-lease --force-if-includes (git version >= 2.30) | +| gpf | git push --force-with-lease (git version < 2.30) | | gpf! | git push --force | | gpoat | git push origin --all && git push origin --tags | | gpr | git pull --rebase | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index fc2c08cc..7541ccff 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -199,7 +199,9 @@ alias ggpush='git push origin "$(git_current_branch)"' alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' alias gpsup='git push --set-upstream origin $(git_current_branch)' -alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease' +is-at-least 2.30 "$git_version" \ + && alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes' \ + || alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease' alias ghh='git help' @@ -235,7 +237,9 @@ alias gma='git merge --abort' alias gp='git push' alias gpd='git push --dry-run' -alias gpf='git push --force-with-lease' +is-at-least 2.30 "$git_version" \ + && alias gpf='git push --force-with-lease --force-if-includes' \ + || alias gpf='git push --force-with-lease' alias gpf!='git push --force' alias gpoat='git push origin --all && git push origin --tags' alias gpr='git pull --rebase' From 3fd63fdf01344bb5f5f13a9c33eb0b7a72fe4771 Mon Sep 17 00:00:00 2001 From: Andrew Stone <61954919+adrwstone@users.noreply.github.com> Date: Mon, 6 Feb 2023 07:39:37 -0330 Subject: [PATCH 093/321] feat(zsh-interactive-cd): sync version with upstream (#11024) --- plugins/zsh-interactive-cd/LICENSE | 375 ++++++++++++++++++ plugins/zsh-interactive-cd/README.md | 22 +- plugins/zsh-interactive-cd/demo.gif | Bin 0 -> 1497944 bytes .../zsh-interactive-cd.plugin.zsh | 54 ++- 4 files changed, 425 insertions(+), 26 deletions(-) create mode 100644 plugins/zsh-interactive-cd/LICENSE create mode 100644 plugins/zsh-interactive-cd/demo.gif diff --git a/plugins/zsh-interactive-cd/LICENSE b/plugins/zsh-interactive-cd/LICENSE new file mode 100644 index 00000000..40b3f8d7 --- /dev/null +++ b/plugins/zsh-interactive-cd/LICENSE @@ -0,0 +1,375 @@ +Copyright 2017-2018 Henry Chang + +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/plugins/zsh-interactive-cd/README.md b/plugins/zsh-interactive-cd/README.md index c8337fbc..4bffbf04 100644 --- a/plugins/zsh-interactive-cd/README.md +++ b/plugins/zsh-interactive-cd/README.md @@ -1,23 +1,15 @@ # zsh-interactive-cd -This plugin adds a fish-like interactive tab completion for the `cd` command. +## Demo -To use it, add `zsh-interactive-cd` to the plugins array of your zshrc file: -```zsh -plugins=(... zsh-interactive-cd) -``` +![demo](demo.gif) -![demo](https://user-images.githubusercontent.com/1441704/74360670-cb202900-4dc5-11ea-9734-f60caf726e85.gif) +## Installation + +1. Install [fzf](https://github.com/junegunn/fzf) by following its [installation instruction](https://github.com/junegunn/fzf#installation). + +2. Source `zsh-interactive-cd.plugin.zsh` in `.zshrc`. ## Usage Press tab for completion as usual, it'll launch fzf automatically. Check fzf’s [readme](https://github.com/junegunn/fzf#search-syntax) for more search syntax usage. - -## Requirements - -This plugin requires [fzf](https://github.com/junegunn/fzf). Install it by following -its [installation instructions](https://github.com/junegunn/fzf#installation). - -## Author - -[Henry Chang](https://github.com/changyuheng) diff --git a/plugins/zsh-interactive-cd/demo.gif b/plugins/zsh-interactive-cd/demo.gif new file mode 100644 index 0000000000000000000000000000000000000000..3568ecf954a3c2049908e97d355f6f187236be2e GIT binary patch literal 1497944 zcmeEt^;cBi_x_z=X6Qyhx|;!!6c|DrQo2OC1q75@#=~QTwAu{ z0WZ844v$;J1AJzDI5Xhd7;T38U*GGxS?l7pL;T|6b(d=!V(WEjC8E)I+!Y>oZ48)s z;mo|yX06wU|HC4-UR}3d6TqX<02*h;_diP4WjRjmS0sxMYAh%aCIF88fd)^>N-DYVDWl?oxN5(?m8`tW?t9buc5CATwU++ z=qmtybsZr7I>!IM{XfnCH<8@nuBnNJn&Dk(2_yt`4bOc6g^~b7KT&jO zpcmhValE<(dY#Q1syH~^3$x7Wy8KXMI% z=*PG?9?1YmFwj9MPcU_P?F&TmWx21%3w6CJM2Qt3R}s>_f!~6ed}L8E494u)xb7>EWv$}MpC!$}f&x1-S#1{Z&sbz4M1qSV3t_0ZB{GqrxTtJhSAi%5gNkf1 zLZ&wBTP*K0w;Y&&p&^VaR4dSlJS70tAD2e5){l@$8Ht7=+=-#f08pg3^rG3*9)O4$ zkZ4vF^3z0?WPc+QDI7_u0Kp_?{ycJ%wzrQYDWt-Hp718cLn=@8-wgre*(f{mVgaNB zm>^J79|$%=iBZAb-3hPKs|{91ZZm1e`;6LX)jE(a~afjdY^7gnUJU>{Dr z6C4rhTD|g4Y5se$9VMPJ}3DZ%d4V;siNK;Bd!RAY#6kSaILph$-r5+Arzt-So?!Wsa%r8KagZ=bb0G`H?Z&b1#PBK1_mBy4+yM*=oRh3 z@1IEku9Wm4vzrk#J-XKAf=~12xAk0BW(^i8s z2ka{jx%!}QVlxT))AE)c(Jy7D3ruhgzPtHh(vTg~Zz_hnMJ+U~Z{(Lj7dEFNerY5p zIFj#Vp80OX(nv#^i)ZubhtQVSK2&NZ=TN}pZVTy(VMylZQnvgorJ1e1#VB`@u^Sc^DQ=@+1GPpBrXYb|Y_=58#Q|W#P7hD|;K>P(% z1sH@?W!4J*kiEJk^bRdDe2dU7GmV8fk6ZrCqZS~dD!i!L*QdDO={`iDINr3{` zel$5pIkKvclR|p*jV#~{u0VqCaB>}OGF%?CrRWPaBJp=!x1z$YcNBNm|88vRXLCV# zu!y>f8-`F?%1A}=fBEHBLTsTZxsp|A2|(*0M*3+5Oc_}W36P}pfiW+^iM zn)g*Y$6o&r$RzxMhPUR;ApmA-p&h4hB)8*?xj~~QVshdLyxpGUrjhIgc&H(PzO_zN zTmUH1ysZt!Rh{2tN)HB0&W_uE6k?E0X#G$o5ifY&7T?S}v!t2);O68h8j~r^2AFs0 z0MlzEY-2C;EHMDx4-AYUTM)(&D+$DHLBx9{z`RW?w796I@XY59?2pPr7bjsS9wcJ)2zIwWAZD6RMDW?e z1Dl@-QEQzecX`#-OxQC7SiW4;hcIsWPUvl0i7&)cvHn1iDdfb7;1w9W`SxW5Mw`9S z*~Ym)dc9)#>1I8QQdxjU7qwN-FV55{E>XFNX%Nfeloprc%4qiR+v=oQsrVFT-uAn- znuo@BpdGl9z#b2n)ksi?$Y}w>zW$*~?2@K$U^**l0zOhjD-oLg8tUf$!K2BAqAww2n^k=*3%y?-Vit0)_Dz4D%~yIu1rRXxE# zVNA?Z#sg%~R(Xd;^?skA!LNi2q4kY;$`slE4zMK1Q6}onk$VRIL!QR(_=)#B$1EoO zrAP0r@FG0M-3(50Ki^Txz1o`ynmj4^dq;(nvnWqd`>71m^KGsBiZicl-&AmZ-O+iW zI9q7&yUODEuKASWe7nT&db_Vbt>H=weFkTZub%I@-d9>)kT`2A{JQV?Lh19W!Jm$W z=LdmPN-KXP{`9VXJq(54StS~r6AIa-ZIv#9I;;Saqg@};s4EEH{fl&imE+9RJDYM1 z7n61?CppBo+Zy*nCsS8W%i+qq77ds4g)6_SBYO6n?uX4!t(?7ip?nb3@ONc(NXs}>Y08BG&LwvjS8bfA- z0U_k$E*GZ$JL@L?J4)@l+PY7?{7n4se5&uiKU2j2{t}4*GX^Y=fm&iWCCsj1)VM zlwgiR%123CM#%(6$!15%cSI>JM%_7&Qelop$w#YOMr#H~Yh_2HJECztesG-3p&;zF4i?W)@?D?>pb=m^9xV;7d}ES z0?;pf<6Z=2zX-C7Wmy9l4X^zGlu$r`07S-t5QONY?dTNZVjS)~E}c34rF?vrWqfvU zd~SApen))4Vtmngys|r(nJbQ@F{ap*lY=G>=4%{wo)F5M_iSSEi8PM*(BUhGI-UQGUS zp1i`GvKB0dSOZlsgJ^&78ucga1SR!bCLOvb9c`za%BP+QrJggVURtJJjHLbzP9-j; z-j)I};9^#SKobanyAiVD2CSdsz9Z7;Skf32(wMB$m_yQ7bJEyyB3q!KuUh~u$rBC$ zL^7QKOG~FNPN(WmM|?{c@t{Rsq>IMW-U`W(CFW#ES7+Sr%urd%KrN-;5q_zv{ZdUk z<8J)Rdn_5c+8J6GFLg*W^@KAGSTfBOGA*n!Eju%I-L?YG+w_WH~6j zbgRztAkDHJ&3e3(<<9cTiS*TzkXL~@ulz?dM%{7PY}_&L9OZk2sABs(@f63P;P zlQ}XuCtK}2Tf8GX&MF5Nl9R=fvVlmC%uZ2lP7qv5d1XNpq>)Q*lv|pUTh*Ccxs+RR zk&EBSZ6eL9)y`|S%4^BV>*&mDU&?E{$m`n4>nF{BtDQe!l|Pu1->nc55|BTjjg!og zjEn-sn$U0%z`1Vu%hmalov+8WL41vO1c|?2PtbzDFTJJ)UVqtny&a!_uvBm~T5#N1 zaC%X2;!*gUrSKx8@G^(CLmL+!kBeaj$00z`IXT%mMTp#FdYt(7ji{H}k(A3|%K>oY ztUg2v1h;|U>rvcR0w-$r@at%rLW9*QBJB>`2=4X5?YzX zSK*Rd9z<3^&y!nLUH+;<&zGnJO0cfP97s;zM$mMS(;` zpcFLV%}9Q73_wqSSVn^TJ%O*z5-8;Z=|_rzk}cex$ZgNkF2#Cz7m`?$xmh* z5*NYbhQ`*Orm&-0!Y)V?Xym{lzlO?j(nyLGH5y|Dice}ZWudYJ?pJPrx^ErtGx&dlcy3));rUXl-rv?MmN$PD z-WZ6!G1GlxScCjnf|Nlr)OdJ-kBBtwxVY6B!{2c2VkzUk6qG1yh^? z8ibhmV<8j|WS!0yiUH|rbi5$r6JiM&Wl&`20yFp)nCHE*2zV8Bu^jJN)XfDE zqm(9Diby+gX4y5Uzb(7urSy$za2l{c*u(c@&3>hNDY@vcp+Nu7H?JK*W2a3)QPwv_ zAxZ?`o3*jUEyy=(Q8pcL{JI<*5Xyu$A+A7UyPzGnrlh9Z8{41-V^Q|CTCLwT{txWm z&^3|#0@FN_yB@z6J4@QsxF-CB305;l1d@3RMlu3p#t-gR_c{d@^W zPK=3sI&Y(_vSPs#>tUPF;S9IokfdSPuHo=6!`&%UYe$_=;!LU4gw$CBE{fXMh>x3@FyU($GwZhiIyG3a!*5&im8#uUX8!Q(P@ z1JWQSnnoEMXYS2p_%t}V<+kL}2LisBJLx7tq`|14TO0#U$!)xm-_k285KI4FwMCCX zM-|zvM}4zNQ$Xmg7=%~<`Z99!3>2S^0bltV2f%>1;d}P&Srdrx4P7WR4frc-vUXjc zNz0JtS4ty!+>S+4)O-01y=8V6ashRA|2=x|>(wP#e;lWA~sqQ0UtYl_PD ziHb-ZF9-6IAiq56>=(+@?&qQ(#I(S&Vmw|>6-)pWAX3h7X4Lc87c7c%D{F$~lnVO0 zfx0-gT-`X>r;3>gh&Wff*!M14{#*d4OC5;OjcW7OqS+gppydM}PsA)H^P8smovw&9c58jMs(N>uS9Y5Wel{3vz3JWL z*?%SQ+(Rh2<{rnM_GI$HTy645$&U3nul#zlP^}4XF-m1`KxKbMVjn>O=f}6I3@}$J z@3bmZR+1h(V>?*2J-`beMCcuC`5bUf9PF+f{Ny-1QaL=dJ^UVixRY{-@jAR%Is99H zxc%Q@#1#+N?g%7#@I9;6();Lu>d0)8b2jYYui7D%Ji)FFXp~q z+!4Rn3x9DwKIU!s#YcV2FL^B9cPvCa79lnq3-)qvJ}UZDa57haa;NV^W%UGgKi=nA zg6{|BCv01|lvAC;Q@y@ZgVj?*;;Av`Z&TIZ=61g=BYs;K{D9J>tx>@XV|4%xCq?mw4uX|2OZ$8H`nW6w7HS@#I4zKb&AMak4frQKyQ z^+oC9%i7e-hK9>(yQ7v+9BIya2u& zT}`fDO%tzXIRAZ8{Wov-Z!zNEa^b%(M9F_V`ZFsFKfj;+WM&HyA+OqMDBq#3j!+Ew zdHCPn6!$M;)&BkJU&Q~8?TDv^#BFLCfCFIWrXloWN$6QkgK@=b(NInaHs+?{yK(gF z#$SZezTZt|7WMQ(q?e*o>D-=*vCM3svxSW&pXD^We27!HRZtr;D=_*()abHobhhe4 zfl?aB?aoggCRIA6@AJoucg^sYb*>v-bB{h&TKAi?i^_T|G`q9p+Jm^&u?TXlBrd4| zjTo>9GxOT#_CwOX2*?S^oetl%!EkzV**l8_$AJ`X)hwINUoJygx17vtJ8!wY&$}DJ z!Jd2SF)*rUY{DHrZ{Xrw|K6PB#+zLT6Y|O zpDGtDTzMP(ba$yv!!6}`SioV*4U~}KH!wLpi9S*Yz+TTwj^LAW=+*G&SATwQZS}22 zL;ys3Bnk|dX+%M(O_6G_8w|enr+m4O$|FVCu0Q+nolN>zaIUpBiCg9rU|>lH3g7yj64Cu zAwQlBsX$1c8mf`&AKi!0@)MsLX-K^!#KFqqo*HY5mY*8ymK&mGISzQ$xbCVx$4rqT z*%&pL=x9(;X599_=gb{41I(=5p3lu$KY3$jVH=d0iJ{{1wTD7aWn}L=r<%!HxxNZ$ zvvM!Yl(qJ(eA8y_)i5Xfz^DCp+XLS|MmZb*;oI#tp27sooww7X2ndX;3b=olviz|` z7>k#XT{z3{cDrXp#^8Py9h)f-Nr5}+n<%TV{WtBK;g$~CH+}3KNLZ^PK{SkFY1Asx zzTADZrqhHuDua10mzQR)Aug|+d_r8aJ;ImF@?6Xnwz5nP2w3Lhq{I7Uak9%Jr7yHX zJ<9VWa(60U8z_3>E8B>yyEWzSLm$<3*XRCh=$TaXY95xox!3YeE6n@NXNkQ1_RInd z7;5TEF44Jd+#l6`WO}Xif)LMqqY#{N(QFhnZ++iWKYr#n%zGoWh@E0h=qMH$apy_0 zOzIu}DQ>10I;0T}J`G*|qN6GOkL^fB?g#)gR1q#wzAAKlw4~M$ zrG5vL-&t`{gyK1|KRgEK%yfi-uSB63R0x0w5=4T^R%h_ri=hr)gL)%0E^DJ>spYY7 zflXxGKf^d0lk5Q+fhLiB0+zIO>PGK$G(%Fg{Yeu6WWU*x`??lFw~e|~Eb1rErAU;C zLcy7ju&0?#1_HX@86D2B&bW87DSp?VCT5_2i}z3|yQz^BKfaJDpf%`> z)8d`^c-TYGXo=&r^dx6qQ3Y*XW8;jRAAADJA=-vM#~CFQE`quWIwm5`K0%4I2r&B6Glj=VxF;QRHd$c zMe9+VHZ%~rE7DNvMgqK|vW7~?UINAlKs_-aCVSxS&QC_DSCKp;9~U5tz`|pNdlDp2 zB&;&1F%=-HXDOy+Q)9J`p;0w^^L~X?`Hr5qwMqVpY30JMT?pBl1aN9-d+N9xE`|YZ z`JDtX920bWxWLqL_EC{1RS0G-8gga;!a+bGDEv(sE#GJ=U|y4%*(;>_WI9>S;Yro_ zu0=}w_<&_RoN552k^(?zzpa^cTBp|qW@_Hs*oEC&vxs+`Yk=8%TK@6xz)N!xq4Yoc zt^b`Uj@KbucsD!|Iztn1jBK6HguSJbE^cTy!0xvcf$~R!HN!8!)^DFV{HbLj6=PE{ zLsWJ}ux?W{?Npo@Qq7xQ9-?|wtSZn^N0wUDLM2v|EzOK#x_yq7tDjB|AOpeh4+L3I zC@`$3f0PRcqJA0V%85|B@u&?$(|YP+nJ)=DN3^%T)9<_3kPQF#v+Y0ddEZ}lUks_3 zJ(Sb3ALiP~WpR`1Oh{C=z@pS1&nd2}xn%E3W-e5HZjXh9Zz*P<`ey$3{^xxd- z$mchYdqH~XGIDz<-<1S)@9qcSArG~ws2@jF*UdXB=T3fwWXTMfVn;d2)= z7RnaSF(XPYfd;R?dbz7USpHbi*0$MJe|*)z#l5H&f><0zEE`5WX_5q5cL}9T(1sV@ zYh=nak&Me0EfRM`Nj_+UsHci*_&@DIWQ1@LsVF>b`+#UhVp}|vj%t+9LpwsMGXXn1Ja)DUEGD|G7f;CX$!d&BM_ z<$s@Jg8zAX((6vsqMvbDKh$@{ke%5OT$2!nW5^kp&fEz>RND|z4~@j{4iuPqW7fq#`7JGh*0Pv zse!*@+QWlSwW|N5iyFu;sb1DP^Mn!3&~3_je~5u@@0Q-x3{+Tn*z#(CAcvd^x-ZrAntL(BI!EEQ(luM5$0CVDd`^ z7S~FH!P3ZMDf3%(ss(j~o4({=B)6lKeX)XFb%cHzBfr~r+Oj5j1xo#xOc74RHkO+l zOO3mo><@5U6&T%WfFMD*84R0}`a@7wW&-AWwX9IStZJSZWa%ia-%BqQ-BrsBsp^vkMDZD?AB&WD?zBJ2Jka4JnSL+keaY1U0zY2(lie_!6=l~#>H@i}obIE)B&_xi9h(%oueifWyzV(27J_T(vSE2RKEA!Hc8V)NpoCe3-rf{zgC6A=^bd%> z)f@ky_u-4)1oTzG`T)Wz^^B`XS5FDsEfO2XUggPU>^vb;mPi-*ioQtU4hx8bS&AHk zuk$QkofhG2X{THlAd)o#L+bM1KNRUC7Tv@&=;q7M9&3CetD&@3NdLm!jIU7{2US^% zqN6p**YQ2o;yq+jo1aAMBekD>$Ih7|7(Py{J-g4>lsGFb`qfL~P0Iw#Um?~V5A4vy zlkx!Nil7a}XqNY*#@)X3(I`|myE+&3`TJ~^QYws`MHeW0NyJSrhjqGM)}OIgm-pOL zyj!W^RJx((d~~PnV?TBCm?GBilq1`y{r)jgAen*u&q`_ibE2sHZ%@ zKY#9+)LUnkDE-_xplc?^omApELN-%5aO}0a=XfquttqKhKMnKUYNnn7tJO_S#w}?# znkj8CR5!PPJj@}qYWpgKebLY%#4*6-C zP{YiR829Il9s!IV4>LV8%{^b6du^C|@6Y?ZnfE4Hcr3o)H8C%lekXirIACr#+<74= zz#{myMM&L3V2=ecH;+3R+0~fXyOeQ}&4%R%kz=%DXes+FMeNq4{MN<#%f;f><@(lt2dxS>tS%Qpv~fZ;F;)0? z)-@B$H7=m~f6H~059-)I*ONSGzWtzq@iP~%S=(*1cJBur&p&&0$`U~$K2By+r9cmf zvB}JX9!g`j*Lli29|`<6gBuS9*=^o2mc3)NdH?*&fHGg-Yn!pVSz~h<<8?OUWRr=7MJ*|Zm}cNFV&6rXgISXp;bTaj>1m3%7K;J;d}@QoqG zmMCrr`b)7!+^~}mcTzaBQw;pBnDSkzz)5Mv>CUE;@_`fTzwcLb3lT#%Nn6Ot#xpW+ zDtLU$m``7%ZH&ArZz*};s9W!>*Xyi5>1?p_!@u~mSIcJ_0WNvBw{Z{=md#(V2w@7?xeV> zW^JJ=+|=6Ko)x$~uitv!yA?j^7Ea}^Ch(&>9#BwQ*W|!P?TL7XX9f0x=!zrZuC+v; z`fcxC_ryu}q!st%_gRn4sig$)^CJ&*6xTjEg7IAnMOL&&lZ>Lh>eZw~*d_1u*_lR&$Aj_`0e)n1@J1_FA z4cx73^Q`N%tq;6e7rWa~ag&kDK3sY2QemmISFcUhv%}}->(ED?DL*MI9(9noOhX;s zihmt_!j;m$lau1%8-^ideZ=~9h34d~RDbIynV}S>opk|j(0Kjy{y|h9aaiRc)?UIer)={5#)saOqC9MWg%P2*VWFVRF+9NV3hDj!%?q{#WcQ5r@h8zeXhkP^U>zHREdsj;z~`}L6r zDVzX0Qt%~bq)-+m>ElOIATdkuKW@Z#l`INFK(3oqCJ{14*sGLKD zEZb*?$}8aC=i010#XAzr>|cJ5c=9eiNdNtyQROB{KZe!gLMOfvg`&Je?l@*m#Fpg`$kTmVubiIhyS(@YG7FDp^_uvEtG=5rF= z9iK=h;}bTy?>s?YMACpyNq$O&{$(MoBylBtoIl&Gs7X-(JsNz2bD!IdZ;*q9Uv;Bx zbcfa*`1$_i@3MC%_DkP8429*%-BrK3wkL)}$wsfpos=hin;CRMQs@Za*5llwCr?Y# z{M8<>imM(E-#)pW`jpfioLmi--+H3_;uoJ_?r-@$hr?0}!NB{HfwC{Ck$sZLd+9X3 zw~QUW(42cK9D0dZJW;&yQ^oCAx$<|h=&9eUUkdO?{`b$G3L+z88>3Y0p@8YPEZ~BP z6-n(&mJM3X!d#tsuSv8z{@UmK^T$!!=Q`sqd03he42NN`Uk*S#WjZ*QWrB=g=%)X` zk)WcOU@T|cm2E2BBH^k6BN26e=UZ?D@knA2Y;P9{z=3_Oi^n-wdUr4>4&a-n4|l_y zp6&0*28X{o$QR7YxOZekyPR)sTqJ%0cRzoj>f;sf3yZ_jxLriswf!?Vn3+GI5%MDg zo{*DkK5xG$336;{KM?%!CqF3E=VSZoBw!H4m9QDK_uo>{^8tybnAnbQ|0KXD9ka2sF<3)nhRG)1nwRiL;fzr&%GSLSch)=eg8F@8M5s?x#J!PYd0a z7^%DfC?z%SmaUf+AZ z6_WowPd(U~{AaX;%6)ZFlo|R66s$}eM(_SNY9S+IDx~(+KV^jry3~IQ5r@t2$9crR z%GKJ)pj&v!EKk*Q36ls$|MP#bm;WSWnB5P0;fQOs^iGlCQBi+1Lf9T-STsPwB%lQ# z``3!Ga58DVU@kQ<22R0@9x39|x<|@)3yH$mLt#*EEuL)Ty3;5<0!Ugs{|F_aSHe42 z%|P9UNg2{5o)@(`p-F^ara)1kt$R0g{F?K*Z*7ieFsZU;(nJYT0Mr-am)JR9^kAE zyY*lC*=GhUHcOV#eSfLUKaM4bGkOR)SaLm9>ss&2x5c}?o1z2(D>c8{qM`u;RXan%jQLzg6RVP0yz6~*}+#l55MW- znxJm9D6K&DQ|#+u1^|X`5H=T zD4Dqz{Z`6SZA|fS#SNoaeXOf7g#Z|C19ONuH+sTU?fTvKN_mq9!UAO4Yis$vdKj`j zIzs=5Jwz6)P5%B*7Bursc2=Mg3yNs!;+K3;7z@iXFU$&-vXAt#WE?irtrC}~dt$n4 zR%+;MyKQT9!+OXiSu7xHAkO%|7z`PWrXdExlVlGfT2AJt^*aV&ov)Z zkqKKyLh}WFR9lctVER$Fk{F^YA)OetRKyM*rv{WQ?^O0(E<q~<)I!XIH4=m) zfe49cVbSI{;kR)n!3fGG-uT4(bIzz z!1ji?_HpFjh8k^wpN~kJxpl?sO6FWXzM)il2Q;mwBw%do)B_}Ki@`-rZ9v$a*#g~G znf&&4D(AX-D5p$q-#74EVr{J}Ns>58yDP3%{R~fbNOALhB4+duzgGh-8Ca8^A?1GC z3U8X9LylQ6*5Sr_Rz5cmcS+RLT7BZ-dQ?x3^nE&SmH1Fb?dB65nKwnbhE1ebj5Q*Q zhmmmENhjV`$xn^Tub++$jCoDhf;hbnDD)$gYu+@RG2dQWt6&<;+l}lxYdDiA7S+~e zzIkhs@IK*ZH~rDXpD{YIw8!rv!amSIZ=m>S?+V&jW1Y;xg)ATs&410iiCVogfn?S# z+|WfUV|LRitu+fHm2SIm{AOToHM%!77GQi&CWKX^fuZUTT_V#cqhu`$pV2c$vmxg+ zC#L?&k3r9K>JCBdalj+PDXOAj`$=nN}2@9MhrVSBH zdx@`8;G#c~+kCgw%(Pd6P#3r1cd0&+J;2aKN|_add|3?q@W{-6Xn=I^JEymA_S-ZH zIEbJ58;IWdR|A_g_rcWAl@~(W zYy!qpz`G|7Hf8Q<965(l)xr+RMd_%Y9(?f%6ssgPl^kajPys3TQrfVVAvIP%<)KHb zhqgkj6df3TQ4y-zSV7b>4kKn}IKf6T+q*7BNY>zUrjoRz%V~|*R!hg}hN8L8I;lbA zn)-UXCt2957-G_FcRcw@I*9)_5|>k!%pz&^j@A^GG4Yon^j+qwRH`)Q(GF}(n8&h9o z8-lSSPhm^esxFM+PA@%)n=)<_6}P8IpVpdqFMUzYG?$N@(>L9@wCb^LmrH6+v|Q63 z*bSzmJNi&o?5e@sX&X})*~O*H$&$0`tZ^&UO8jAX_X1+Qt*g!~SvE{3OPP0JlI6n> z(G~S2sH;677W}D1^p?jDDrpJZyOjQ4?S1Z&c6w$4u3y-Mi+|)2ARgVM}zcZ0A^fY-OSDOgr6;x^&=o9mxf{ zw>OtY%mGvqR!;COyL+oa;cf*qCx3KJ#yHuao{QIzrq||$OvyK>T};cu$53nY^i!^S zSo{OV6jqbNei7K0V{^KSGgE?&EMCWBM1w~te+Q z<8wfD`}yVqNdyvAxff+#DSr%joR)n%x+OZ*@~-kUdVUDMSJ-RHn~J)LJKab-cxWCw z@#Y6-sKwn)FWGN~(ANc(?g%P6(CH*GsH)HcGG2Uvm zeD-PYcs_r(YhEiU)lwHb`$UJ?eyQWT<|nsotnHUY1aD?6HBi~0r$ukiedoTagfDR}tI?BTKcX7dmJ*jY^r?vcR11_H-p zi+O8Dd%=uciu8yBuX?f6%XXjJ<{u1RyM`&}bt7$A72IZ$o z$kkH)H+j!iYCxWAF)yV)FYR|LO+ER$S+(c?RI(6u3gVW>eRk15^U^pX2x#DlBl-nPe zV$YAi7a%Y#-~E-g=`B-8>bkc7)tpF4O(MX> zP6`#DTlpt$^`F#gL_qX@XVK}$G;*Fb(lNVhZMt^D4if?gR%T@GuI_&&a#86=W5u{? zJ1v~OHTM)=*boq|b89X#_Vnu{Sucl4J&Wi!(+>C(9y%u+*KslXbCSm{pZ~TK*XHtm zN&o!m>OLj+-(S(kKUUx(?<^@eZ)9>&XvS07uB8XSf5q5iZj;GslgU|)$tk>_n8@U} zHsg0K;rHYb^eGVxy+J%EPGa6rXR`&zG5vyla-@+g#Mqq*=_=h2tp%G8Hq4}aou8FCLi-|zFsr81bt&5ofzd47Cg>1PgN4a@yxkvk!y>=!O1bSOzuiGOgAl>a$G~dr;{%lqoB3jN z6AFw1pa=j;gK|=Fbylx%3M4pdRk$b$xTvFCbzEI+H{Cpm0K?T#7_A7LNAt$m z@)BR#v4ofYwsen`rd3#`<1nj&HkZZuY{$h`nH6ov1#TxKxSw|lCHcE2wYeuu3MH}@ zpH~rXKg^K5>)2$(V~8)e@Gl2Nn;7$Kr5W(2dlKIp>+nOIqaR4{TT=;VYE|Q`Ju(f1 zvwW(v3bH`?gml+xS7r>{FgmMX#{|Zon;@J=C2;qLuAw>B?u`HSRn?3U`_%e6eqjYUcgcFScwD?AC; zzo>%vcEP7f-tz+Z0zAG#q^2HU)3)oUpy^`_jj@MH3lymzFZeR?0bfvhdm?_|n)(Dy z&zBkSX!^Vu{zi$PkEI_ODb_U0*0icTYO%(^gHeLNJnM5aKvjfvubQ?qr?i7?H7e0J z1&>;dMJasULKRWny`mulk037vL(GZ&0epOx6$DNITw)0Hij33lxkZBA;r1wal4rj( zp(zwYhNz7M3qjEYc#?>l$R5ZY7@*p&3I||F05*au6#?23fD!d7EVv5HMy(glH@@Pm z*X1=H%J*Ti_QU+%__EiBmD;CC=f(>@T*U_q0q} z>jbi->y;qUWWku3$&p#6irGN%g>dir0XK`~p{7W0GXo$e*2BhHnAE<;B(^SVfIpYR z^Se8!`O{U56ucsDb-q`3}}GVDNp0APzli_Cq9J@On61632QwCMBsN`5bObMP12c+<_#QtYdK?1xPpf0~kHOG<6%`2uJ8z!VnN7_xj+c_V>T zuMy7W(w<8I-9w)60Hi+%c{q=XBm(&}VQ^UDoA4c~w}+n!n8@P@fo1g|q_lV00cm41 zRU>Lnx;E^gHzFUv82X|$o97i{5Mh`tfnPv`$1+vpR<1{+45ft9#$0-Jd!QtRe2d9{ z&G97V%OpyJ0q;Ew5ic!DeU$fXPDCz`1P%RUeG3*u6a}KC zPo*(r$ZFRgv~1!_lPfjYDTpqg(P*YFmjkHe@r+>Ig=Z7!{|J@@ z0u(|5TB4}W#wCx z%x7a%djV=an(!ttz(Dr!zZ5{^-s9op=(5G^9P7vbdLK6(9D6*^+(+%qxgIqYWc@M5 zPz5)j3IY_o>G>vKnP{vd3hmSW+l6csnqpl}wGJiVXBPLGE#Ymj8sZzbKfLDM7XKw2 z{j)~d+U0u7^Ff4ksQ?01M}R_qgTe(Sr0daJ9W`oZY*1)F<?+zM^)#l5+XO(*T2n9VAm;~2_Z^=avy&~Xs5pa17^?5jXFqZy2Vi;`z^Kbn9 zBQ-MdF_r7`%#%O1fi0jX=pO_s!tXiR6X5ZSaxZww$6bY>pJFd&KV?0ctCt?M{rU0e z7(r;!kUcgL@Q>@ZFcUof?K8~(xC3tYXg9p$K?*=Jb#m)I5oH$ixaD1Nivl0A)Tbq_ zF0Jd;K?8pr~cKrTZUGgPCB9F^OzMK!7uSTXxVRFXUrB+Oz*eWNq$O>JQz106{#=n|(9S znrAka{a4Z4sj)s(l3W!4qK^J$?ITi=`9{!ucG-pu;!j`Kwq{jnlIRwvxX$c*VXcC3 zj`>AzhHvvzZVkvbfW83tz35@6+g9(}{yLy2YXrj%>cBz-I+;ZZw`bmeFn+NFPKF?Q zW;wrs(TC5PqAs_dO8yF8kqaf?3ndqVJ@v{NYad7vInAnl?iLgks`GwxEBMu~K{7AF z=RzDelsUJgW^VRyiawv=RGwAsnZ5UKrbUYD9)ZMpR+jeo{;rvt;12Y@Pwr>=L7nE$ zw$1UGhnkjwaX}}jvQ|T!zvoMjrL#8~?ajpSIi=ZP#c}CR)`}Diiq_UT0{7D2)c+p< zi9mM0vq;^zHXlAB!$75=b0hO|nNP5{o|XqRxzsL~lxl|H-~W%_7{Ch*RFEfcDxdRe zt2Ufc@I*9uDYtVxkEsYqL{Jv9x#x4=M;A}vkDUf|U*@^obp1Y$fS>k33M76*8?*te zE>3$Y1RQ_~jQXK!lMF<(HYK{~p7dghu?Uc~=Kg0iM}K}UfO?C10(8Ivbbw5o01bpL zr|L8WG}WxjI{d%C{Kr51$LcUHSFQeT1A{AD0|WyA6aYN%paO#m4+sF476xW`Fi_CtKnpiUVi*BngiV|}Nni*uuwX%m z3w}NbYV^T~2O4XJPzu08LJ~8jB0V}H zr-!K+4ScP5Gbv5EFHgdJ*>S`{p9Ps#yy_P52p$;P8W3nS=i#S_VPLq@z(Ip2m^E|W z{JHby%%2rF@M7{PR;+>oHF1$TDN?05WN3h(p#yH)8VK0#kikI68wqk_@K8Hg8{u403{t6t>Kmrv^kU<0;JP^VKACxe{1}mJP zjy>)e>aWEPn{2Pk2HWhk(O!FOwcBR< z?6>6(+dTwSDDi>_7J!R{z+8k8-be-S$O9HIKq-V1&_rs!Ukmc}amHhWyw?$OU;w;= z;7uvV2M|Dt^1ww0UGm6pG++l493NcE;7ngV^vO$yUG~>0zkPPxUk^NX+ez2FcGe?@ zFLvU8U%m0s0mz^S37UW2`RJjaUjKUO8Bo1<2CtL4*Sq0AGCa#}EJf^3gY+ z{q@~fAO7^^Z$Eze)As<}{KM6s|NZ^%AAtW8U;qg?Km!)ASL1>}0nU}Kn}mP?415=d zLcoIYUGM-C{1Al(5-bJwZj0L{HQ7nHd2()`hm9S*xD`^?aTF%mzxy0ozW!cMH`cju}tJ~cokhi^=#cyd`3iuwAtTmGF zd;KEhG!0ozYF^Wt*~I2Hwb@N>e$$)b1ScQeLoNm?@_{>$AO$EA9tN4ff*81@2DkXd zdV&$3_ta+>^U2SB+S8u_1?WKgNzi{56rl%Is6Z3S(1jY*p%Jx^7)^vC6|v}V6i^7X z)_8zux^bN16lq9FI#QFC6s0FsX-ZkT(v>2zfs1S;1Rkjo4~$@i_NnA0$M>#a{t~D^ z6)G=-O4OkO)2K;B>i<%U%G9Ga6{=5_s#2p$)u}qws#!fD1?+}5z40xXFtPwbnn|o@ zu5STvbZJZ3x>mQg6|QfUYh39%SG!hAf#-A}03f(d_rPT;Cd3asdAgGKKoqeJP3%Jz z+gQdvR-%rLEMyluS<6-yvy#m$Wi{Jb&H{*{WDLm}GYTvQ;Ln+DM4wvg+S|Ur*vg z1QAxA!=>kCJ^xGK&l(uPn@w*~(d_a$fZd02A=`uoRYXg~>c-Gm9C`7e2F^(_H2@ zui4FPmh)sYTtoyhQFu!WXio?F)1e0Ss6{Pm{OWa)AyDTdJ&R zwaJCNkT+q>Sn*7v>loo{~s+p~2ZEr;2? zZi5#b;RjcEvYEYG{%+gb5r_E1yG`+LOT6M4zqrLQzHv}?SKOS&^TJ7c@}eKz=th01Gex4-fzokO0L7 z|0RJN3 z`YzA{V-N;sPzHU7ToP%o=F^HqP;QXWELh+Ja_@80kPz3f5Dzi*q!0l9r3$+c3?I=EBk>C*(F-dP z5=C$Y?@ad)krNHk6Fbqq4)59a&<^vk6!{PpPf-;~krgBE@-mOyK=Bi2Q5I_vwiHp- z8gUYL(Gn@~5_^#se^D5Ham~a~^JoznZBZGM@uhCC%h<*ES}_%+aTQIG8vn1+8nba4 zp{oHgZ`?YK8JAHU!;u`ZDFaij^xO^@*Krtwkr>?(9@+67H>n!@1F83&5|$o(*CM40{?tUE4z{~zj81Q z(<={CF`103i0SLbZ7lmzGW~Kg1@9d9OC9G@Gv$&q{OFCSF<-!4i^ipGeMI$MYA}E(>RlJ9_Ao#T!L#6Qwgc%ac5(>@xXED8uYHLlZgQ z(>>#}J?FConbS1&(meC?JoPihs8cYpb340}I|GzJ0n|V*O*c=IKlhVC7qqs5Qy1wI zJ|$E>m9s)8)Iyu`=R_+nbFx7{)ImWMxBL;t5U)T7^gsnvMgLE9MN@RzZqgygGel=p zL}`?p(lZw`6GM0OLVJ`#e>6jbv@S_A=z`5dZL~&{6iJs31BUM(P1HrB6h)`BMU_WN zs}xIdDM9g5NxO7Oy;RW5spW*zM}@RZdGtqj2uRV?OhIHMj}%P5R8HeGfc*1HSrkw2 z)Fn%ZlJt~H^OS48^D)J9P75{NXut!M$WW2)CtGek+Z0mSR8r-0AQAuv5>>F)^h`Gu zw21UR;dD{yG}K6d0%!mSE>%x zm0FvXV8O71Zo*yvLRt^jVdc|4g^o-8m15y*OmH9pWT#@4ZCp#VT+vlt(^X`T4>qJ} zUPl&Jw-i+Im1X%XaB#wSHn!N1HA1J=W*@d- X;3jbPW_>hb&1gGZ#0+KDXh|$) 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

bogU9f46#s7|g*9DnHc#ZX1%PZw8X9rcNx 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

c0G|jOehxcrJE#~+^<4CICh<+|*h~U(_|?L& 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 z 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 z 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

vjvr*3acwQ*9%t#^SG7aLPlLPpi(q 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%0DF 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

3S3oM_iLYf& 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 cgAjFS{v{$R|C|/dev/null \ - | cut -b $(( ${length} + 2 ))- | sed '/^$/d' | while read -r line; do + | cut -b $(( ${length} + 2 ))- | command sed '/^$/d' | while read -r line; do if [[ "${line[1]}" == "." ]]; then continue fi @@ -32,13 +38,19 @@ __zic_matched_subdir_list() { seg=$(basename -- "$1") starts_with_dir=$( \ find -L "$dir" -mindepth 1 -maxdepth 1 -type d \ - 2>/dev/null | cut -b $(( ${length} + 2 ))- | sed '/^$/d' \ + 2>/dev/null | cut -b $(( ${length} + 2 ))- | command sed '/^$/d' \ | while read -r line; do if [[ "${seg[1]}" != "." && "${line[1]}" == "." ]]; then continue fi - if [[ "$line" == "$seg"* ]]; then - echo "$line" + if [ "$zic_case_insensitive" = "true" ]; then + if [[ "$line:u" == "$seg:u"* ]]; then + echo "$line" + fi + else + if [[ "$line" == "$seg"* ]]; then + echo "$line" + fi fi done ) @@ -46,19 +58,36 @@ __zic_matched_subdir_list() { echo "$starts_with_dir" else find -L "$dir" -mindepth 1 -maxdepth 1 -type d \ - 2>/dev/null | cut -b $(( ${length} + 2 ))- | sed '/^$/d' \ + 2>/dev/null | cut -b $(( ${length} + 2 ))- | command sed '/^$/d' \ | while read -r line; do if [[ "${seg[1]}" != "." && "${line[1]}" == "." ]]; then continue fi - if [[ "$line" == *"$seg"* ]]; then - echo "$line" + if [ "$zic_case_insensitive" = "true" ]; then + if [[ "$line:u" == *"$seg:u"* ]]; then + echo "$line" + fi + else + if [[ "$line" == *"$seg"* ]]; then + echo "$line" + fi fi done fi fi } +__zic_fzf_bindings() { + autoload is-at-least + fzf=$(__zic_fzf_prog) + + if $(is-at-least '0.21.0' $(${=fzf} --version)); then + echo 'shift-tab:up,tab:down,bspace:backward-delete-char/eof' + else + echo 'shift-tab:up,tab:down' + fi +} + _zic_list_generator() { __zic_matched_subdir_list "${(Q)@[-1]}" | sort } @@ -75,6 +104,7 @@ _zic_complete() { fi fzf=$(__zic_fzf_prog) + fzf_bindings=$(__zic_fzf_bindings) if [ $(echo $l | wc -l) -eq 1 ]; then matches=${(q)l} @@ -82,7 +112,7 @@ _zic_complete() { matches=$(echo $l \ | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} \ --reverse $FZF_DEFAULT_OPTS $FZF_COMPLETION_OPTS \ - --bind 'shift-tab:up,tab:down'" ${=fzf} \ + --bind '${fzf_bindings}'" ${=fzf} \ | while read -r item; do echo -n "${(q)item} " done) @@ -144,5 +174,7 @@ zic-completion() { } zle -N zic-completion -bindkey -M emacs '^I' zic-completion -bindkey -M viins '^I' zic-completion +if [ -z $zic_custom_binding ]; then + zic_custom_binding='^I' +fi +bindkey "${zic_custom_binding}" zic-completion From 379fe0fe131cff7a480f7975b32b0ea6fc7c2370 Mon Sep 17 00:00:00 2001 From: Julien Rottenberg Date: Tue, 7 Feb 2023 03:33:59 -0800 Subject: [PATCH 094/321] feat(azure): add `azure` plugin (#8848) Co-authored-by: hagridaaron Co-authored-by: Terry Closes #8847 --- lib/prompt_info_functions.zsh | 1 + plugins/azure/README.md | 49 +++++++++++++++++++++++++++ plugins/azure/azure.plugin.zsh | 60 ++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) create mode 100644 plugins/azure/README.md create mode 100644 plugins/azure/azure.plugin.zsh diff --git a/lib/prompt_info_functions.zsh b/lib/prompt_info_functions.zsh index e5535848..3dc9b6d1 100644 --- a/lib/prompt_info_functions.zsh +++ b/lib/prompt_info_functions.zsh @@ -18,6 +18,7 @@ function chruby_prompt_info \ vi_mode_prompt_info \ virtualenv_prompt_info \ jenv_prompt_info \ + azure_prompt_info \ tf_prompt_info \ { return 1 diff --git a/plugins/azure/README.md b/plugins/azure/README.md new file mode 100644 index 00000000..f3993085 --- /dev/null +++ b/plugins/azure/README.md @@ -0,0 +1,49 @@ +# azure + +This plugin provides completion support for [azure cli](https://docs.microsoft.com/en-us/cli/azure/) +and a few utilities to manage azure subscriptions and display them in the prompt. + +To use it, add `azure` to the plugins array in your zshrc file. + +```zsh +plugins=(... azure) +``` + +## Plugin commands + + +* `az_subscriptions`: lists the available subscriptions in the `AZURE_CONFIG_DIR` (default: `~/.azure/`). + Used to provide completion for the `azss` function. + +* `azgs`: gets the current value of `$azure_subscription`. + +* `azss []`: sets the `$azure_subscription`. + + +NOTE : because azure keeps the state of active subscription in ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}, the prompt command requires `jq` to be enabled to parse the file. If jq is not in the path the prompt will show nothing + +## Theme + +The plugin creates an `azure_prompt_info` function that you can use in your theme, which displays +the current `$azure_subscription`. It uses two variables to control how that is shown: + +- ZSH_THEME_AZURE_PREFIX: sets the prefix of the azure_subscription. Defaults to ``. + + +``` +RPROMPT='$(azure_prompt_info)' +``` + +## Develop + +On ubuntu get a working environment with : + +` docker run -it -v $(pwd):/mnt -w /mnt ubuntu bash` + +``` +apt install -y curl jq zsh git vim +sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" +curl -sL https://aka.ms/InstallAzureCLIDeb | bash +``` \ No newline at end of file diff --git a/plugins/azure/azure.plugin.zsh b/plugins/azure/azure.plugin.zsh new file mode 100644 index 00000000..7bb173a5 --- /dev/null +++ b/plugins/azure/azure.plugin.zsh @@ -0,0 +1,60 @@ +# AZ Get Subscritions +function azgs() { + az account show --output tsv --query 'name' 2>/dev/null +} + +# AZ Subscription Selection +alias azss="az account set --subscription" + + +function az_subscriptions() { + az account list --all --output tsv --query '[*].name' 2> /dev/null +} + +function _az_subscriptions() { + reply=($(az_subscriptions)) +} +compctl -K _az_subscriptions azss + +# Azure prompt +function azure_prompt_info() { + [[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}" ]] && return + # azgs is too expensive, if we have jq, we enable the prompt + (( $+commands[jq] )) || return 1 + azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}) + echo "${ZSH_THEME_AZURE_PREFIX:=}" +} + + +# Load az completions +function _az-homebrew-installed() { + # check if Homebrew is installed + (( $+commands[brew] )) || return 1 + + # speculatively check default brew prefix + if [ -h /usr/local/opt/az ]; then + _brew_prefix=/usr/local/opt/az + else + # ok, it is not in the default prefix + # this call to brew is expensive (about 400 ms), so at least let's make it only once + _brew_prefix=$(brew --prefix azure-cli) + fi +} + + +# get az.completion.sh location from $PATH +_az_zsh_completer_path="$commands[az_zsh_completer.sh]" + +# otherwise check common locations +if [[ -z $_az_zsh_completer_path ]]; then + # Homebrew + if _az-homebrew-installed; then + _az_zsh_completer_path=$_brew_prefix/libexec/bin/az.completion.sh + # Linux + else + _az_zsh_completer_path=/etc/bash_completion.d/azure-cli + fi +fi + +[[ -r $_az_zsh_completer_path ]] && source $_az_zsh_completer_path +unset _az_zsh_completer_path _brew_prefix From 87f1941d27df2e9a3390e5d1cddf6c264ba7311d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 7 Feb 2023 16:17:07 +0100 Subject: [PATCH 095/321] docs(git): remove duplicated line --- plugins/git/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index cd018d43..1c3f8acf 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -120,7 +120,6 @@ plugins=(... git) | gma | git merge --abort | | gp | git push | | gpd | git push --dry-run | -| gpf | git push --force-with-lease | | gpf | git push --force-with-lease --force-if-includes (git version >= 2.30) | | gpf | git push --force-with-lease (git version < 2.30) | | gpf! | git push --force | From 45571bfa03934359a49f7043cbcf50abccdf448c Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 8 Feb 2023 11:35:48 +0100 Subject: [PATCH 096/321] fix(git): `gpristine` requires two `--force` flags Fixes #11483 --- plugins/git/git.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 7541ccff..70e6b443 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -104,7 +104,7 @@ compdef _git gccd=git-clone alias gcl='git clone --recurse-submodules' alias gclean='git clean --interactive -d' -alias gpristine='git reset --hard && git clean --force -dx' +alias gpristine='git reset --hard && git clean --force -dfx' alias gcm='git checkout $(git_main_branch)' alias gcd='git checkout $(git_develop_branch)' alias gcmsg='git commit --message' From 0e9e5360c400cda5a80c9394583b9acbf7cfe711 Mon Sep 17 00:00:00 2001 From: Bartek Pacia Date: Thu, 9 Feb 2023 12:24:39 +0100 Subject: [PATCH 097/321] feat(gradle): update completion from upstream (#11485) --- plugins/gradle/_gradle | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/plugins/gradle/_gradle b/plugins/gradle/_gradle index 770723d8..1da5aebe 100644 --- a/plugins/gradle/_gradle +++ b/plugins/gradle/_gradle @@ -1,4 +1,3 @@ -#compdef gradle gradlew gw # # Taken from https://github.com/gradle/gradle-completion # Copyright (c) 2017 Eric Wendelin @@ -22,6 +21,8 @@ # SOFTWARE. # Terms +#compdef gradle gradlew gw + __gradle-set-project-root-dir() { local dir=`pwd` project_root_dir=`pwd` @@ -96,7 +97,7 @@ __gradle-generate-script-cache() { zle -R "Generating Gradle build script cache" # Cache all Gradle scripts local -a gradle_build_scripts - gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | grep -E -v "$script_exclude_pattern") ) + gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | egrep -v "$script_exclude_pattern") ) printf "%s\n" "${gradle_build_scripts[@]}" >| $cache_dir/$cache_name fi } @@ -116,9 +117,9 @@ __gradle-generate-tasks-cache() { # Reuse Gradle Daemon if IDLE but don't start a new one. local gradle_tasks_output if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then - gradle_tasks_output="$($gradle_cmd --daemon --build-file $gradle_build_file --console plain -q tasks --all 2>/dev/null)" + gradle_tasks_output="$($gradle_cmd --daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)" else - gradle_tasks_output="$($gradle_cmd --no-daemon --build-file $gradle_build_file --console plain -q tasks --all 2>/dev/null)" + gradle_tasks_output="$($gradle_cmd --no-daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)" fi local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line local -a match @@ -180,7 +181,7 @@ __gradle_tasks() { local cached_checksum="$(cat $cache_dir/$cache_name.md5)" local -a cached_tasks if [[ -z $cur ]]; then - cached_tasks=(${(f)"$(cat $cache_dir/$cached_checksum)"}) + cached_tasks=(${(f)"$(grep -v "^\\\:" $cache_dir/$cached_checksum)"}) else cached_tasks=(${(f)"$(grep "^${cur//:/\\\\:}" $cache_dir/$cached_checksum)"}) fi @@ -191,7 +192,7 @@ __gradle_tasks() { # Regenerate tasks cache in the background if [[ $gradle_files_checksum != "$(cat $cache_dir/$cache_name.md5)" || ! -f $cache_dir/$gradle_files_checksum || $(wc -c < $cache_dir/$gradle_files_checksum) -le 1 ]]; then - $(__gradle-generate-tasks-cache 1>&2 2>/dev/null &) + $(__gradle-generate-tasks-cache &> /dev/null &) fi else _describe 'built-in tasks' '( @@ -262,7 +263,10 @@ __gradle_subcommand() { {-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \ {-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \ {-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle' \ + '(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \ + '--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \ '(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \ + '(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \ '--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \ '--continue[Continues task execution after a task failure.]' \ '-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \ @@ -276,6 +280,7 @@ __gradle_subcommand() { '-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \ '-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:enable parallel build:(true false)' \ '-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ + '-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \ '-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \ '-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \ '(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \ @@ -314,6 +319,7 @@ __gradle_subcommand() { '(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \ '(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \ '--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \ + '(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \ '(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \ {-x,--exclude-task}'[Specify a task to be excluded from execution.]' && ret=0 ;; @@ -347,6 +353,9 @@ _gradle() { {-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \ {-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \ {-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle:->argument-expected' \ + '(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \ + '(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \ + '--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \ '(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \ '--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \ '--continue[Continues task execution after a task failure.]' \ @@ -361,6 +370,7 @@ _gradle() { '-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \ '-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:(true false)' \ '-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ + '-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \ '-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \ '-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \ '(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \ @@ -404,6 +414,7 @@ _gradle() { '(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \ '--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \ '(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \ + '(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \ {-x,--exclude-task}'[Specify a task to be excluded from execution.]' \ '(-)*:: :->task-or-option' && ret=0 From 041c35ffc8cd97dd6327f44e35fa777af6f8e845 Mon Sep 17 00:00:00 2001 From: Samyak Sarnayak Date: Thu, 9 Feb 2023 16:57:41 +0530 Subject: [PATCH 098/321] feat(amuse): add virtualenv support (#8987) Fixes #7766 Closes #8814 --- themes/amuse.zsh-theme | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/themes/amuse.zsh-theme b/themes/amuse.zsh-theme index 3f7ec0bc..d787fdaa 100644 --- a/themes/amuse.zsh-theme +++ b/themes/amuse.zsh-theme @@ -11,8 +11,14 @@ ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg_bold[red]%}‹" ZSH_THEME_RUBY_PROMPT_SUFFIX="›%{$reset_color%}" PROMPT=' -%{$fg_bold[green]%}%~%{$reset_color%}$(git_prompt_info) ⌚ %{$fg_bold[red]%}%*%{$reset_color%} +%{$fg_bold[green]%}%~%{$reset_color%}$(git_prompt_info)$(virtualenv_prompt_info) ⌚ %{$fg_bold[red]%}%*%{$reset_color%} $ ' RPROMPT='$(ruby_prompt_info)' +VIRTUAL_ENV_DISABLE_PROMPT=0 +ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX=" %{$fg[green]%}🐍" +ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX="%{$reset_color%}" +ZSH_THEME_VIRTUALENV_PREFIX=$ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX +ZSH_THEME_VIRTUALENV_SUFFIX=$ZSH_THEME_VIRTUAL_ENV_PROMPT_SUFFIX + From f9104d155f618f2d6f5e13af648c81a5d036a592 Mon Sep 17 00:00:00 2001 From: Bartek Pacia Date: Sat, 11 Feb 2023 20:54:20 +0100 Subject: [PATCH 099/321] fix(gradle): move compdef line (#11488) --- plugins/gradle/_gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/gradle/_gradle b/plugins/gradle/_gradle index 1da5aebe..f8df928b 100644 --- a/plugins/gradle/_gradle +++ b/plugins/gradle/_gradle @@ -1,3 +1,6 @@ +#compdef gradle gradlew gw +# THE LINE ABOVE MUST BE THE FIRST LINE OF THIS FILE IN ORDER FOR COMPLETION TO WORK + # # Taken from https://github.com/gradle/gradle-completion # Copyright (c) 2017 Eric Wendelin @@ -21,8 +24,6 @@ # SOFTWARE. # Terms -#compdef gradle gradlew gw - __gradle-set-project-root-dir() { local dir=`pwd` project_root_dir=`pwd` From 3e1c0d51cb66cf02357b25f514d55a3de8197647 Mon Sep 17 00:00:00 2001 From: GrandZhuo Date: Sun, 12 Feb 2023 16:53:04 +0800 Subject: [PATCH 100/321] fix(fzf): installation dir for brew M1 (#11490) --- plugins/fzf/fzf.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 7bb6667d..b253a23d 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -9,7 +9,7 @@ function fzf_setup_using_base_dir() { "${HOME}/.nix-profile/share/fzf" "${XDG_DATA_HOME:-$HOME/.local/share}/fzf" "/usr/local/opt/fzf" - "/opt/homebrew/bin/fzf" + "/opt/homebrew/opt/fzf" "/usr/share/fzf" "/usr/local/share/examples/fzf" ) From ed407466b8ae3c12c2f03da004d721618e64fd49 Mon Sep 17 00:00:00 2001 From: Ruben van Erk Date: Sun, 12 Feb 2023 16:05:06 +0100 Subject: [PATCH 101/321] docs(lando): php support (#11491) --- plugins/lando/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/lando/README.md b/plugins/lando/README.md index 928a42bc..6daeae4e 100644 --- a/plugins/lando/README.md +++ b/plugins/lando/README.md @@ -17,6 +17,7 @@ plugins=(... lando) | `drush` | `lando drush` | | `gulp` | `lando gulp` | | `npm` | `lando npm` | +| `php` | `lando php` | | `wp` | `lando wp` | | `yarn` | `lando yarn` | From 416560c9bf0c03afe6f576ab9e420256843bfb8b Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Sun, 12 Feb 2023 11:46:25 -0500 Subject: [PATCH 102/321] docs(lib/directories): comment how to disable alias (#11489) --- lib/directories.zsh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/directories.zsh b/lib/directories.zsh index 5aa1b3d5..09114062 100644 --- a/lib/directories.zsh +++ b/lib/directories.zsh @@ -3,6 +3,11 @@ setopt auto_pushd setopt pushd_ignore_dups setopt pushdminus +# add (uncommented): +# zstyle ':omz:directories' aliases no +# to your `zshrc` before loading `oh-my-zsh.sh` +# to disable the following aliases and functions + zstyle -T ':omz:directories' aliases || return alias -g ...='../..' From 69b5737daf0448ad7e6686174638be74f86afdec Mon Sep 17 00:00:00 2001 From: shelfofclub Date: Tue, 14 Feb 2023 20:44:23 +0800 Subject: [PATCH 103/321] fix(af-magic): fix python venv checking logic (#11495) --- themes/af-magic.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme index 2ef9b02d..1b629e43 100644 --- a/themes/af-magic.zsh-theme +++ b/themes/af-magic.zsh-theme @@ -10,7 +10,7 @@ function afmagic_dashes { # if there is a python virtual environment and it is displayed in # the prompt, account for it when returning the number of dashes - if [[ -n "$python_env" && "$PS1" = \(* ]]; then + if [[ -n "$python_env" && "$PS1" = *\(${python_env}\)* ]]; then echo $(( COLUMNS - ${#python_env} - 3 )) else echo $COLUMNS From 574669da6b71462c1f92c75ad75f66476b92974c Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Sat, 11 Feb 2023 10:46:31 -0500 Subject: [PATCH 104/321] fix(correction)!: remove aliases for non standard commands BREAKING CHANGE: This commit removes aliases for some commands that previously were not being autocorrected. If you are using autocorrection, please check it. --- lib/correction.zsh | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/correction.zsh b/lib/correction.zsh index 4259d341..ba9664fc 100644 --- a/lib/correction.zsh +++ b/lib/correction.zsh @@ -1,13 +1,8 @@ if [[ "$ENABLE_CORRECTION" == "true" ]]; then alias cp='nocorrect cp' - alias ebuild='nocorrect ebuild' - alias gist='nocorrect gist' - alias heroku='nocorrect heroku' - alias hpodder='nocorrect hpodder' alias man='nocorrect man' alias mkdir='nocorrect mkdir' alias mv='nocorrect mv' - alias mysql='nocorrect mysql' alias sudo='nocorrect sudo' alias su='nocorrect su' From 8a68bf67720a6a5442ae947d10d74b1dd3558d91 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 16 Feb 2023 12:54:23 +0100 Subject: [PATCH 105/321] fix(theme-and-appearance): test color ls with $ZSH directory Fixes #11500 --- lib/theme-and-appearance.zsh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index 9b908bef..c83f58c7 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -7,32 +7,37 @@ export LSCOLORS="Gxfxcxdxbxegedabagacad" # TODO organise this chaotic logic if [[ "$DISABLE_LS_COLORS" != "true" ]]; then + if [[ -d "$ZSH" ]]; then + _test_dir="$ZSH" + else + _test_dir="." + fi # Find the option for using colors in ls, depending on the version if [[ "$OSTYPE" == netbsd* ]]; then # On NetBSD, test if "gls" (GNU ls) is installed (this one supports colors); # otherwise, leave ls as is, because NetBSD's ls doesn't support -G - gls --color -d . &>/dev/null && alias ls='gls --color=tty' + gls --color -d "$_test_dir" &>/dev/null && alias ls='gls --color=tty' elif [[ "$OSTYPE" == openbsd* ]]; then # On OpenBSD, "gls" (ls from GNU coreutils) and "colorls" (ls from base, # with color and multibyte support) are available from ports. "colorls" # will be installed on purpose and can't be pulled in by installing # coreutils, so prefer it to "gls". - gls --color -d . &>/dev/null && alias ls='gls --color=tty' - colorls -G -d . &>/dev/null && alias ls='colorls -G' + gls --color -d "$_test_dir" &>/dev/null && alias ls='gls --color=tty' + colorls -G -d "$_test_dir" &>/dev/null && alias ls='colorls -G' elif [[ "$OSTYPE" == (darwin|freebsd)* ]]; then # this is a good alias, it works by default just using $LSCOLORS - ls -G . &>/dev/null && alias ls='ls -G' + ls -G "$_test_dir" &>/dev/null && alias ls='ls -G' # only use coreutils ls if there is a dircolors customization present ($LS_COLORS or .dircolors file) # otherwise, gls will use the default color scheme which is ugly af - [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] && gls --color -d . &>/dev/null && alias ls='gls --color=tty' + [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] && gls --color -d "$_test_dir" &>/dev/null && alias ls='gls --color=tty' else # For GNU ls, we use the default ls color theme. They can later be overwritten by themes. if [[ -z "$LS_COLORS" ]]; then (( $+commands[dircolors] )) && eval "$(dircolors -b)" fi - ls --color -d . &>/dev/null && alias ls='ls --color=tty' || { ls -G . &>/dev/null && alias ls='ls -G' } + ls --color -d "$_test_dir" &>/dev/null && alias ls='ls --color=tty' || { ls -G "$_test_dir" &>/dev/null && alias ls='ls -G' } # Take advantage of $LS_COLORS for completion as well. zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" From 25368f9a65e805a961884ce70206c907218fc741 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Antonio=20Ram=C3=ADrez?= Date: Fri, 17 Feb 2023 03:09:00 -0400 Subject: [PATCH 106/321] fix(gcloud): add location of latest snap install (#11502) Latest snap installs gcloud at /snap/google-cloud-cli, so add that to the list of possible locations. --- plugins/gcloud/gcloud.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/gcloud/gcloud.plugin.zsh b/plugins/gcloud/gcloud.plugin.zsh index 9be9d68a..30f1dba8 100644 --- a/plugins/gcloud/gcloud.plugin.zsh +++ b/plugins/gcloud/gcloud.plugin.zsh @@ -10,6 +10,7 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then "/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk" "/usr/share/google-cloud-sdk" "/snap/google-cloud-sdk/current" + "/snap/google-cloud-cli/current" "/usr/lib/google-cloud-sdk" "/usr/lib64/google-cloud-sdk" "/opt/google-cloud-sdk" From aace3a6144a859d877927746a865de820e5af838 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 17 Feb 2023 16:42:59 +0100 Subject: [PATCH 107/321] chore: add `.idea` directory to `.gitignore` --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 71ae444e..10bd4beb 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ log/ .DS_Store # editor configs -.vscode \ No newline at end of file +.vscode +.idea From cc73a929f637899407d7a17648f89c63b71cc1ff Mon Sep 17 00:00:00 2001 From: guenthgr Date: Fri, 17 Feb 2023 17:29:10 +0100 Subject: [PATCH 108/321] feat(git): add `gpod` alias Closes #11501 --- plugins/git/README.md | 1 + plugins/git/git.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 1c3f8acf..9972a6d8 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -124,6 +124,7 @@ plugins=(... git) | gpf | git push --force-with-lease (git version < 2.30) | | gpf! | git push --force | | gpoat | git push origin --all && git push origin --tags | +| gpod | git push origin --delete | | gpr | git pull --rebase | | gpu | git push upstream | | gpv | git push --verbose | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 70e6b443..b016d80d 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -242,6 +242,7 @@ is-at-least 2.30 "$git_version" \ || alias gpf='git push --force-with-lease' alias gpf!='git push --force' alias gpoat='git push origin --all && git push origin --tags' +alias gpod='git push origin --delete' alias gpr='git pull --rebase' alias gpu='git push upstream' alias gpv='git push --verbose' From 8c808da23c9bafdc9d4b7b73934d6621d3a1f83e Mon Sep 17 00:00:00 2001 From: Francesco Ilario Date: Mon, 20 Feb 2023 15:35:58 +0100 Subject: [PATCH 109/321] feat(git): add aliases for gone branches (#9250) Closes #8457 Closes #9973 --- plugins/git/README.md | 3 +++ plugins/git/git.plugin.zsh | 3 +++ 2 files changed, 6 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 9972a6d8..0895ce39 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -25,6 +25,9 @@ plugins=(... git) | gbd | git branch --delete | | gbda | git branch --no-color --merged \| grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| xargs git branch --delete 2>/dev/null | | gbD | git branch --delete --force | +| gbg | git branch -vv | grep ": gone\]" | +| gbgd | local res=$(git branch -vv | grep ": gone\]" | awk '{print $1}') && [[ $res ]] && echo $res | xargs git branch -d | +| gbgD | local res=$(git branch -vv | grep ": gone\]" | awk '{print $1}') && [[ $res ]] && echo $res | xargs git branch -D | | gbl | git blame -b -w | | gbnm | git branch --no-merged | | gbr | git branch --remote | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index b016d80d..ed17436e 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -73,6 +73,9 @@ alias gba='git branch --all' alias gbd='git branch --delete' alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' alias gbD='git branch --delete --force' +alias gbg='git branch -vv | grep ": gone\]"' +alias gbgd='local res=$(gbg | awk '"'"'{print $1}'"'"') && [[ $res ]] && echo $res | xargs git branch -d' +alias gbgD='local res=$(gbg | awk '"'"'{print $1}'"'"') && [[ $res ]] && echo $res | xargs git branch -D' alias gbl='git blame -b -w' alias gbnm='git branch --no-merged' alias gbr='git branch --remote' From c50bac7b42e7d24dd9ef314fa9bf17859e4218ed Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 21 Feb 2023 11:19:56 +0100 Subject: [PATCH 110/321] fix(terraform): go back to zsh custom completion Revert fcbfdf42de702d55174fe2b19142ba232289671e --- plugins/terraform/_terraform | 411 +++++++++++++++++++++++++ plugins/terraform/terraform.plugin.zsh | 5 - 2 files changed, 411 insertions(+), 5 deletions(-) create mode 100644 plugins/terraform/_terraform diff --git a/plugins/terraform/_terraform b/plugins/terraform/_terraform new file mode 100644 index 00000000..62583456 --- /dev/null +++ b/plugins/terraform/_terraform @@ -0,0 +1,411 @@ +#compdef terraform + +local -a _terraform_cmds opt_args +_terraform_cmds=( + 'apply:Builds or changes infrastructure' + 'console:Interactive console for Terraform interpolations' + 'destroy:Destroy Terraform-managed infrastructure' + 'fmt:Rewrites config files to canonical format' + 'force-unlock:Manually unlock the terraform state' + 'get:Download and install modules for the configuration' + 'graph:Create a visual graph of Terraform resources' + 'import:Import existing infrastructure into Terraform' + 'init:Initialize a Terraform working directory' + 'login:Obtain and save credentials for a remote host' + 'logout:Remove locally-stored credentials for a remote host' + 'output:Read an output from a state file' + 'plan:Generate and show an execution plan' + 'providers:Prints a tree of the providers used in the configuration' + 'refresh:Update local state file against real resources' + 'show:Inspect Terraform state or plan' + 'state:Advanced state management' + 'taint:Manually mark a resource for recreation' + 'untaint:Manually unmark a resource as tainted' + 'validate:Validates the Terraform files' + 'version:Prints the Terraform version' + 'workspace:Workspace management' + '0.12upgrade:Rewrites pre-0.12 module source code for v0.12' + '0.13upgrade:Rewrites pre-0.13 module source code for v0.13' +) + +__012upgrade() { + _arguments \ + '-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]' \ + '-force[ Override the heuristic that attempts to detect if a configuration is already written for v0.12 or later. Some of the transformations made by this command are not idempotent, so re-running against the same module may change the meanings expressions in the module.]' +} + +__013upgrade() { + _arguments \ + '-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]' +} + +__apply() { + _arguments \ + '-auto-approve[Skip interactive approval of plan before applying.]' \ + '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \ + '-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-input=[(true) Ask for input for variables if not directly set.]' \ + '-no-color[If specified, output will be colorless.]' \ + '-parallelism=[(10) Limit the number of parallel resource operations.]' \ + '-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]' \ + '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \ + '*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \ + '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"' +} + +__console() { + _arguments \ + '-state=[(terraform.tfstate) Path to read state.]' \ + '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"' +} + +__destroy() { + _arguments \ + '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \ + '-auto-approve[Skip interactive approval before destroying.]' \ + '-force[Deprecated: same as auto-approve.]' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-no-color[If specified, output will contain no color.]' \ + '-parallelism=[(10) Limit the number of concurrent operations.]' \ + '-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]' \ + '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \ + '*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \ + '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"' +} + +__fmt() { + _arguments \ + '-list=[(true) List files whose formatting differs (always false if using STDIN)]' \ + '-write=[(true) Write result to source file instead of STDOUT (always false if using STDIN or -check)]' \ + '-diff=[(false) Display diffs of formatting changes]' \ + '-check=[(false) Check if the input is formatted. Exit status will be 0 if all input is properly formatted and non-zero otherwise.]' \ + '-recursive=[(false) Also process files in subdirectories. By default, only the given directory (or current directory) is processed.]' +} + +__force_unlock() { + _arguments \ + "-force[Don't ask for input for unlock confirmation.]" +} + +__get() { + _arguments \ + '-update=[(false) If true, modules already downloaded will be checked for updates and updated if necessary.]' \ + '-no-color[Disable text coloring in the output.]' +} + +__graph() { + _arguments \ + '-draw-cycles[Highlight any cycles in the graph with colored edges. This helps when diagnosing cycle errors.]' \ + '-type=[(plan) Type of graph to output. Can be: plan, plan-destroy, apply, validate, input, refresh.]' +} + +__import() { + _arguments \ + '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \ + '-config=[(path) Path to a directory of Terraform configuration files to use to configure the provider. Defaults to pwd. If no config files are present, they must be provided via the input prompts or env vars.]' \ + '-allow-missing-config[Allow import when no resource configuration block exists.]' \ + '-input=[(true) Ask for input for variables if not directly set.]' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-no-color[If specified, output will contain no color.]' \ + '-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(PATH) Path to the destination state file to write to. If this is not specified, the source state file will be used. This can be a new or existing path.]:statefile:_files -g "*.tfstate"' \ + '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times. This is only useful with the "-config" flag.]' \ + '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"' +} + +__init() { + _arguments \ + '-backend=[(true) Configure the backend for this configuration.]' \ + '-backend-config=[This can be either a path to an HCL file with key/value assignments (same format as terraform.tfvars) or a 'key=value' format. This is merged with what is in the configuration file. This can be specified multiple times. The backend type must be in the configuration itself.]' \ + '-force-copy[Suppress prompts about copying state data. This is equivalent to providing a "yes" to all confirmation prompts.]' \ + '-from-module=[(SOURCE) Copy the contents of the given module into the target directory before initialization.]' \ + '-get=[(true) Download any modules for this configuration.]' \ + '-get-plugins=[(true) Download any missing plugins for this configuration.]' \ + '-input=[(true) Ask for input if necessary. If false, will error if input was required.]' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-no-color[If specified, output will contain no color.]' \ + '-plugin-dir[Directory containing plugin binaries. This overrides all default search paths for plugins, and prevents the automatic installation of plugins. This flag can be used multiple times.]:plugin_dir:_files -/' \ + '-reconfigure[Reconfigure the backend, ignoring any saved configuration.]' \ + '-upgrade=[(false) If installing modules (-get) or plugins (-get-plugins), ignore previously-downloaded objects and install the latest version allowed within configured constraints.]' \ + '-verify-plugins=[(true) Verify the authenticity and integrity of automatically downloaded plugins.]' +} + +__login() { + _arguments \ + +} + +__logout() { + _arguments \ + +} + +__output() { + _arguments \ + '-state=[(path) Path to the state file to read. Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \ + '-no-color[If specified, output will contain no color.]' \ + '-json[If specified, machine readable output will be printed in JSON format]' +} + +__plan() { + _arguments \ + '-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \ + '-destroy[If set, a plan will be generated to destroy all resources managed by the given configuration and state.]' \ + '-detailed-exitcode[() Return detailed exit codes when the command exits. This will change the meaning of exit codes to: 0 - Succeeded, diff is empty (no changes); 1 - Errored, 2 - Succeeded; there is a diff]' \ + '-input=[(true) Ask for input for variables if not directly set.]' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-no-color[() If specified, output will contain no color.]' \ + '-out=[(path) Write a plan file to the given path. This can be used as input to the "apply" command.]' \ + '-parallelism=[(10) Limit the number of concurrent operations.]' \ + '-refresh=[(true) Update state prior to checking for differences.]' \ + '-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default it will use the state "terraform.tfstate" if it exists.]:statefile:_files -g "*.tfstate"' \ + '*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \ + '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"' +} + +__providers() { + local -a __providers_cmds + __providers_cmds=( + 'mirror:Mirrors the provider plugins needed for the current configuration' + 'schema:Prints the schemas of the providers used in the configuration' + ) + _describe -t providers "providers commands" __providers_cmds + +} + +__providers_mirror() { + _arguments \ + '-platform=[(os_arch) Choose which target platform to build a mirror for.]' \ + "*:target_dir:_files -/" +} + +__providers_schema() { + _arguments \ + '-json[]' \ + '::' +} + +__refresh() { + _arguments \ + '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]::backupfile:_files -g "*.backup"' \ + '-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \ + '-input=[(true) Ask for input for variables if not directly set.]' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-no-color[If specified, output will not contain any color.]' \ + '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \ + '*-target=[(resource) A Resource Address to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \ + '*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"' +} + +__show() { + _arguments \ + '-json[If specified, output the Terraform plan or state in a machine-readable form.]' \ + '-no-color[If specified, output will not contain any color.]' +} + +__state() { + local -a __state_cmds + __state_cmds=( + 'list:List resources in the state' + 'mv:Move an item in the state' + 'pull:Pull current state and output to stdout' + 'push:Update remote state from a local state file' + 'replace-provider:Replace provider for resources in the Terraform state' + 'rm:Remove instances from the state' + 'show:Show a resource in the state' + ) + _describe -t state "state commands" __state_cmds +} + +__state_list() { + _arguments \ + '-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default, Terraform will consult the state of the currently-selected workspace.]' \ + '-id=[(id) Filters the results to include only instances whose resource types have an attribute named id whose value equals the given id string.]' \ + "*:address:__statelist" +} + +__state_mv() { + _arguments \ + "-dry-run[If set, prints out what would've been moved but doesn't actually move anything.]" \ + '-backup=[(PATH) Path where Terraform should write the backup for the original state. This can"t be disabled. If not set, Terraform will write it to the same path as the statefile with a ".backup" extension.]:backupfile:_files -g "*.backup"' \ + '-backup-out=[(PATH) Path where Terraform should write the backup for the destination state. This can"t be disabled. If not set, Terraform will write it to the same path as the destination state file with a backup extension. This only needs to be specified if -state-out is set to a different path than -state.]:backupfile:_files -g "*.backup"' \ + "-lock=[(true) Lock the state files when locking is supported.]:lock:(true false)" \ + "-lock-timeout=[(0s) Duration to retry a state lock.]" \ + '-state=[(path) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(path) Path to the destination state file to write to. If this isn"t specified, the source state file will be used. This can be a new or existing path.]:statefile:_files -g "*.tfstate"' \ + "::" \ + ":source:__statelist" \ + ":destination: " +} + +__state_push() { + _arguments \ + "-force[Write the state even if lineages don't match or the remote serial is higher.]" \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + "-lock-timeout=[(0s) Duration to retry a state lock.]" \ + "::" \ + ":destination:_files" +} + +__state_replace_provider() { + _arguments \ + '-auto-approve[Skip interactive approval.]' \ + '-backup=[(PATH) Path where Terraform should write the backup for the state file. This can"t be disabled. If not set, Terraform will write it to the same path as the state file with a ".backup" extension.]:backupfile:_files -g "*.backup"' \ + "-lock=[(true) Lock the state files when locking is supported.]:lock:(true false)" \ + "-lock-timeout=[(0s) Duration to retry a state lock.]" \ + '-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \ + ":from_provider_fqn:" \ + ":to_provider_fqn:" +} + +__state_rm() { + _arguments \ + "-dry-run[If set, prints out what would've been removed but doesn't actually remove anything.]" \ + '-backup=[(PATH) Path where Terraform should write the backup for the original state.]::backupfile:_files -g "*.backup"' \ + "-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)" \ + "-lock-timeout=[(0s) Duration to retry a state lock.]" \ + '-state=[(PATH) Path to the state file to update. Defaults to the current workspace state.]:statefile:_files -g "*.tfstate"' \ + "*:address:__statelist" +} + + +__state_show() { + _arguments \ + '-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default it will use the state "terraform.tfstate" if it exists.]:statefile:_files -g "*.tfstate"' \ + "*:address:__statelist" +} + +__statelist() { + compadd $(terraform state list $opt_args[-state]) +} + +__taint() { + _arguments \ + '-allow-missing[If specified, the command will succeed (exit code 0) even if the resource is missing.]' \ + '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-module=[(path) The module path where the resource lives. By default this will be root. Child modules can be specified by names. Ex. "consul" or "consul.vpc" (nested modules).]' \ + '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"' \ + "*:address:__statelist" +} + +__untaint() { + _arguments \ + '-allow-missing[If specified, the command will succeed (exit code 0) even if the resource is missing.]' \ + '-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \ + '-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-module=[(path) The module path where the resource lives. By default this will be root. Child modules can be specified by names. Ex. "consul" or "consul.vpc" (nested modules).]' \ + '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \ + '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"' +} + +__validate() { + _arguments \ + '-no-color[If specified, output will not contain any color.]' \ + '-json[Produce output in a machine-readable JSON format, suitable for use in text editor integrations and other automated systems.]' \ + ':dir:_files -/' +} + +__version() { + _arguments \ + '-json[Output the version information as a JSON object.]' +} + +__workspace() { + local -a __workspace_cmds + __workspace_cmds=( + 'delete:Delete a workspace' + 'list:List Workspaces' + 'new:Create a new workspace' + 'select:Select a workspace' + 'show:Show the name of the current workspace' + ) + _describe -t workspace "workspace commands" __workspace_cmds +} + +_arguments '*:: :->command' + +if (( CURRENT == 1 )); then + _describe -t commands "terraform command" _terraform_cmds + return +fi + +local -a _command_args +case "$words[1]" in + 0.12upgrade) + __012upgrade ;; + 0.13upgrade) + __013upgrade ;; + apply) + __apply ;; + console) + __console;; + destroy) + __destroy ;; + fmt) + __fmt;; + force-unlock) + __force_unlock;; + get) + __get ;; + graph) + __graph ;; + import) + __import;; + init) + __init ;; + login) + __login ;; + logout) + __logout ;; + output) + __output ;; + plan) + __plan ;; + providers) + test $CURRENT -lt 3 && __providers + [[ $words[2] = "mirror" ]] && __providers_mirror + [[ $words[2] = "schema" ]] && __providers_schema + ;; + refresh) + __refresh ;; + show) + __show ;; + state) + test $CURRENT -lt 3 && __state + [[ $words[2] = "list" ]] && __state_list + [[ $words[2] = "mv" ]] && __state_mv + [[ $words[2] = "push" ]] && __state_push + [[ $words[2] = "replace-provider" ]] && __state_replace_provider + [[ $words[2] = "rm" ]] && __state_rm + [[ $words[2] = "show" ]] && __state_show + ;; + taint) + __taint ;; + untaint) + __untaint ;; + validate) + __validate ;; + version) + __version ;; + workspace) + test $CURRENT -lt 3 && __workspace ;; +esac diff --git a/plugins/terraform/terraform.plugin.zsh b/plugins/terraform/terraform.plugin.zsh index eaa1e2e8..d9e39e6a 100644 --- a/plugins/terraform/terraform.plugin.zsh +++ b/plugins/terraform/terraform.plugin.zsh @@ -16,8 +16,3 @@ alias tfi='terraform init' alias tfo='terraform output' alias tfp='terraform plan' alias tfv='terraform validate' - -if (( $+commands[terraform] )); then - autoload -U +X bashcompinit && bashcompinit - complete -o nospace -C terraform terraform -fi From 9f9d3b7d247b3c3e21542abaaf107e3d15aac1a5 Mon Sep 17 00:00:00 2001 From: rohitbahekar <57762527+rohitbahekar@users.noreply.github.com> Date: Tue, 21 Feb 2023 15:53:04 +0530 Subject: [PATCH 111/321] feat(terraform): add `tfc` alias (#10815) --- plugins/terraform/README.md | 1 + plugins/terraform/terraform.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md index 59c6e7f2..c19f2ad1 100644 --- a/plugins/terraform/README.md +++ b/plugins/terraform/README.md @@ -19,6 +19,7 @@ plugins=(... terraform) | ----- | -------------------- | | `tf` | `terraform` | | `tfa` | `terraform apply` | +| `tfc` | `terraform console` | | `tfd` | `terraform destroy` | | `tff` | `terraform fmt` | | `tfi` | `terraform init` | diff --git a/plugins/terraform/terraform.plugin.zsh b/plugins/terraform/terraform.plugin.zsh index d9e39e6a..7006f204 100644 --- a/plugins/terraform/terraform.plugin.zsh +++ b/plugins/terraform/terraform.plugin.zsh @@ -10,6 +10,7 @@ function tf_prompt_info() { alias tf='terraform' alias tfa='terraform apply' +alias tfc='terraform console' alias tfd='terraform destroy' alias tff='terraform fmt' alias tfi='terraform init' From a4f08ad238dba23a68df2a89b8fd47b8a9d26b0e Mon Sep 17 00:00:00 2001 From: Filippo Bonazzi Date: Wed, 22 Feb 2023 10:16:28 +0100 Subject: [PATCH 112/321] feat(extract): support `obscpio` format (#11511) Co-authored-by: Carlo Sala --- plugins/extract/README.md | 15 ++++++++------- plugins/extract/_extract | 2 +- plugins/extract/extract.plugin.zsh | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/plugins/extract/README.md b/plugins/extract/README.md index f67b5361..ac4a8e19 100644 --- a/plugins/extract/README.md +++ b/plugins/extract/README.md @@ -1,10 +1,10 @@ # extract plugin -This plugin defines a function called `extract` that extracts the archive file -you pass it, and it supports a wide variety of archive filetypes. +This plugin defines a function called `extract` that extracts the archive file you pass it, and it supports a +wide variety of archive filetypes. -This way you don't have to know what specific command extracts a file, you just -do `extract ` and the function takes care of the rest. +This way you don't have to know what specific command extracts a file, you just do `extract ` and +the function takes care of the rest. To use it, add `extract` to the plugins array in your zshrc file: @@ -15,7 +15,7 @@ plugins=(... extract) ## Supported file extensions | Extension | Description | -|:------------------|:-------------------------------------| +| :---------------- | :----------------------------------- | | `7z` | 7zip file | | `Z` | Z archive (LZW) | | `apk` | Android app file | @@ -32,6 +32,7 @@ plugins=(... extract) | `lrz` | LRZ archive | | `lz4` | LZ4 archive | | `lzma` | LZMA archive | +| `obscpio` | cpio archive used on OBS | | `rar` | WinRAR archive | | `rpm` | RPM package | | `sublime-package` | Sublime Text package | @@ -57,5 +58,5 @@ plugins=(... extract) | `zst` | Zstandard file (zstd) | | `zpaq` | Zpaq file | -See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for -more information regarding archive formats. +See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information +regarding archive formats. diff --git a/plugins/extract/_extract b/plugins/extract/_extract index 64678fed..56b17058 100644 --- a/plugins/extract/_extract +++ b/plugins/extract/_extract @@ -3,5 +3,5 @@ _arguments \ '(-r --remove)'{-r,--remove}'[Remove archive.]' \ - "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst|zpaq)(-.)'" \ + "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|obscpio|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst|zpaq)(-.)'" \ && return 0 diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 4c84ef88..7b7a2fa4 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -72,7 +72,7 @@ EOF builtin cd -q ..; command rm *.tar.* debian-binary ;; (*.zst) unzstd "$file" ;; (*.cab) cabextract -d "$extract_dir" "$file" ;; - (*.cpio) cpio -idmvF "$file" ;; + (*.cpio|*.obscpio) cpio -idmvF "$file" ;; (*.zpaq) zpaq x "$file" ;; (*) echo "extract: '$file' cannot be extracted" >&2 From 221eb9b90ab4d03b6f00e62f31e979459e08e7ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E4=B8=8D=E6=B8=B8?= <71683364+mefengl@users.noreply.github.com> Date: Tue, 21 Feb 2023 03:07:45 +0800 Subject: [PATCH 113/321] feat(marktext): add plugin Closes #11507 --- plugins/marktext/README.md | 17 +++++++++++++++++ plugins/marktext/marktext.plugin.zsh | 7 +++++++ 2 files changed, 24 insertions(+) create mode 100644 plugins/marktext/README.md create mode 100644 plugins/marktext/marktext.plugin.zsh diff --git a/plugins/marktext/README.md b/plugins/marktext/README.md new file mode 100644 index 00000000..71d28745 --- /dev/null +++ b/plugins/marktext/README.md @@ -0,0 +1,17 @@ +## marktext + +Plugin for MarkText, a previewer for Markdown files on Mac OS X + +### Requirements + + * [MarkText](https://github.com/marktext/marktext) + +### Usage + + * If `marktext` is called without an argument, open MarkText + + * If `marktext` is passed a file, open it in MarkText + +### Credits + + * just copied from plugins/marked2, all credits to marked2 plugin author diff --git a/plugins/marktext/marktext.plugin.zsh b/plugins/marktext/marktext.plugin.zsh new file mode 100644 index 00000000..1da85bcc --- /dev/null +++ b/plugins/marktext/marktext.plugin.zsh @@ -0,0 +1,7 @@ +# +# If marktext is called without an argument, open MarkText +# If marktext is passed a file, open it in MarkText +# +function marktext() { + open -a "MarkText.app" "$1" +} From a24e91908adb25dfc222e6a6f6431e2fbc890545 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=AF=E4=B8=8D=E6=B8=B8?= <71683364+mefengl@users.noreply.github.com> Date: Wed, 22 Feb 2023 18:26:30 +0800 Subject: [PATCH 114/321] feat(marked): remove unnecessary code --- plugins/marked2/marked2.plugin.zsh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/plugins/marked2/marked2.plugin.zsh b/plugins/marked2/marked2.plugin.zsh index 56863ade..45f4b65c 100644 --- a/plugins/marked2/marked2.plugin.zsh +++ b/plugins/marked2/marked2.plugin.zsh @@ -3,10 +3,5 @@ # If marked is passed a file, open it in Marked # function marked() { - if [ "$1" ] - then - open -a "marked 2.app" "$1" - else - open -a "marked 2.app" - fi + open -a "marked 2.app" "$1" } From aca048814b2462501ab82938ff2473661182fffb Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 22 Feb 2023 15:35:12 +0100 Subject: [PATCH 115/321] fix(theme-and-appearance): avoid infinite recursion --- lib/theme-and-appearance.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index c83f58c7..1b64b51d 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -47,7 +47,7 @@ fi # enable diff color if possible. if command diff --color /dev/null /dev/null &>/dev/null; then function color-diff { - diff --color $@ + command diff --color $@ } alias diff="color-diff" compdef _diff color-diff # compdef is already loaded by this point From b54ef89fab89eaa62ece588f96d8cbd7c222d854 Mon Sep 17 00:00:00 2001 From: WaferJay <17383312+WaferJay@users.noreply.github.com> Date: Fri, 24 Feb 2023 05:32:40 +0800 Subject: [PATCH 116/321] fix(af-magic): fix logic for separator with virtualenv (#11518) --- themes/af-magic.zsh-theme | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/themes/af-magic.zsh-theme b/themes/af-magic.zsh-theme index 1b629e43..70549d01 100644 --- a/themes/af-magic.zsh-theme +++ b/themes/af-magic.zsh-theme @@ -6,7 +6,8 @@ # dashed separator size function afmagic_dashes { # check either virtualenv or condaenv variables - local python_env="${VIRTUAL_ENV:-$CONDA_DEFAULT_ENV}" + local python_env_dir="${VIRTUAL_ENV:-$CONDA_DEFAULT_ENV}" + local python_env="${python_env_dir##*/}" # if there is a python virtual environment and it is displayed in # the prompt, account for it when returning the number of dashes From 8a008e1f51d451db21232edd6f1709e6c5ea334e Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 23 Feb 2023 23:00:31 +0100 Subject: [PATCH 117/321] fix(azure): load completion properly for brew (#11499) Closes #11497 --- plugins/azure/azure.plugin.zsh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/azure/azure.plugin.zsh b/plugins/azure/azure.plugin.zsh index 7bb173a5..51b54dbc 100644 --- a/plugins/azure/azure.plugin.zsh +++ b/plugins/azure/azure.plugin.zsh @@ -32,12 +32,14 @@ function _az-homebrew-installed() { (( $+commands[brew] )) || return 1 # speculatively check default brew prefix - if [ -h /usr/local/opt/az ]; then - _brew_prefix=/usr/local/opt/az + if [[ -d /usr/local ]]; then + _brew_prefix=/usr/local + elif [[ -d /opt/homebrew ]]; then + _brew_prefix=/opt/homebrew else # ok, it is not in the default prefix # this call to brew is expensive (about 400 ms), so at least let's make it only once - _brew_prefix=$(brew --prefix azure-cli) + _brew_prefix=$(brew --prefix) fi } @@ -49,12 +51,12 @@ _az_zsh_completer_path="$commands[az_zsh_completer.sh]" if [[ -z $_az_zsh_completer_path ]]; then # Homebrew if _az-homebrew-installed; then - _az_zsh_completer_path=$_brew_prefix/libexec/bin/az.completion.sh + _az_zsh_completer_path=$_brew_prefix/etc/bash_completion.d/az # Linux else _az_zsh_completer_path=/etc/bash_completion.d/azure-cli fi fi -[[ -r $_az_zsh_completer_path ]] && source $_az_zsh_completer_path +[[ -r $_az_zsh_completer_path ]] && autoload -U +X bashcompinit && bashcompinit && source $_az_zsh_completer_path unset _az_zsh_completer_path _brew_prefix From bd9c216fe04a1542913f524cad1719797ce39ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Reegn?= Date: Fri, 24 Feb 2023 17:27:15 +0100 Subject: [PATCH 118/321] feat(iterm2): add shell integration script (#11509) --- plugins/iterm2/README.md | 12 ++ plugins/iterm2/iterm2.plugin.zsh | 11 ++ plugins/iterm2/iterm2_shell_integration.zsh | 178 ++++++++++++++++++++ plugins/iterm2/update | 4 + 4 files changed, 205 insertions(+) create mode 100644 plugins/iterm2/iterm2_shell_integration.zsh create mode 100755 plugins/iterm2/update diff --git a/plugins/iterm2/README.md b/plugins/iterm2/README.md index 50cdebf5..3d11622d 100644 --- a/plugins/iterm2/README.md +++ b/plugins/iterm2/README.md @@ -2,11 +2,20 @@ This plugin adds a few functions that are useful when using [iTerm2](https://www.iterm2.com/). + To use it, add _iterm2_ to the plugins array of your zshrc file: ``` plugins=(... iterm2) ``` +Optionally, the plugin also applies the [Shell Integration Script for iTerm2](https://iterm2.com/documentation-shell-integration.html). +You can enable the integration with zstyle. It's important to add this line +before the line sourcing oh-my-zsh: + +``` +zstyle :omz:plugins:iterm2 shell-integration yes +``` + ## Plugin commands * `_iterm2_command ` @@ -24,6 +33,9 @@ plugins=(... iterm2) * `iterm2_tab_color_reset` resets the color of iTerm2's current tab back to default. + +For shell integration features see the [official documentation](https://iterm2.com/documentation-shell-integration.html). + ## Contributors - [Aviv Rosenberg](https://github.com/avivrosenberg) diff --git a/plugins/iterm2/iterm2.plugin.zsh b/plugins/iterm2/iterm2.plugin.zsh index 9d8e40bf..d00232a3 100644 --- a/plugins/iterm2/iterm2.plugin.zsh +++ b/plugins/iterm2/iterm2.plugin.zsh @@ -7,6 +7,17 @@ # This plugin is only relevant if the terminal is iTerm2 on OSX. if [[ "$OSTYPE" == darwin* ]] && [[ -n "$ITERM_SESSION_ID" ]] ; then + # maybe make it the default in the future and allow opting out? + if zstyle -t ':omz:plugins:iterm2' shell-integration; then + # Handle $0 according to the standard: + # https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html + 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" + 0="${${(M)0:#/*}:-$PWD/$0}" + + # See official docs: https://iterm2.com/documentation-shell-integration.html + source "${0:A:h}/iterm2_shell_integration.zsh" + fi + ### # Executes an arbitrary iTerm2 command via an escape code sequence. # See https://iterm2.com/documentation-escape-codes.html for all supported commands. diff --git a/plugins/iterm2/iterm2_shell_integration.zsh b/plugins/iterm2/iterm2_shell_integration.zsh new file mode 100644 index 00000000..7871ddde --- /dev/null +++ b/plugins/iterm2/iterm2_shell_integration.zsh @@ -0,0 +1,178 @@ +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +if [[ -o interactive ]]; then + if [ "${ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX-}""$TERM" != "tmux-256color" -a "${ITERM_ENABLE_SHELL_INTEGRATION_WITH_TMUX-}""$TERM" != "screen" -a "${ITERM_SHELL_INTEGRATION_INSTALLED-}" = "" -a "$TERM" != linux -a "$TERM" != dumb ]; then + ITERM_SHELL_INTEGRATION_INSTALLED=Yes + ITERM2_SHOULD_DECORATE_PROMPT="1" + # Indicates start of command output. Runs just before command executes. + iterm2_before_cmd_executes() { + if [ "$TERM_PROGRAM" = "iTerm.app" ]; then + printf "\033]133;C;\r\007" + else + printf "\033]133;C;\007" + fi + } + + iterm2_set_user_var() { + printf "\033]1337;SetUserVar=%s=%s\007" "$1" $(printf "%s" "$2" | base64 | tr -d '\n') + } + + # Users can write their own version of this method. It should call + # iterm2_set_user_var but not produce any other output. + # e.g., iterm2_set_user_var currentDirectory $PWD + # Accessible in iTerm2 (in a badge now, elsewhere in the future) as + # \(user.currentDirectory). + whence -v iterm2_print_user_vars > /dev/null 2>&1 + if [ $? -ne 0 ]; then + iterm2_print_user_vars() { + true + } + fi + + iterm2_print_state_data() { + local _iterm2_hostname="${iterm2_hostname-}" + if [ -z "${iterm2_hostname:-}" ]; then + _iterm2_hostname=$(hostname -f 2>/dev/null) + fi + printf "\033]1337;RemoteHost=%s@%s\007" "$USER" "${_iterm2_hostname-}" + printf "\033]1337;CurrentDir=%s\007" "$PWD" + iterm2_print_user_vars + } + + # Report return code of command; runs after command finishes but before prompt + iterm2_after_cmd_executes() { + printf "\033]133;D;%s\007" "$STATUS" + iterm2_print_state_data + } + + # Mark start of prompt + iterm2_prompt_mark() { + printf "\033]133;A\007" + } + + # Mark end of prompt + iterm2_prompt_end() { + printf "\033]133;B\007" + } + + # There are three possible paths in life. + # + # 1) A command is entered at the prompt and you press return. + # The following steps happen: + # * iterm2_preexec is invoked + # * PS1 is set to ITERM2_PRECMD_PS1 + # * ITERM2_SHOULD_DECORATE_PROMPT is set to 1 + # * The command executes (possibly reading or modifying PS1) + # * iterm2_precmd is invoked + # * ITERM2_PRECMD_PS1 is set to PS1 (as modified by command execution) + # * PS1 gets our escape sequences added to it + # * zsh displays your prompt + # * You start entering a command + # + # 2) You press ^C while entering a command at the prompt. + # The following steps happen: + # * (iterm2_preexec is NOT invoked) + # * iterm2_precmd is invoked + # * iterm2_before_cmd_executes is called since we detected that iterm2_preexec was not run + # * (ITERM2_PRECMD_PS1 and PS1 are not messed with, since PS1 already has our escape + # sequences and ITERM2_PRECMD_PS1 already has PS1's original value) + # * zsh displays your prompt + # * You start entering a command + # + # 3) A new shell is born. + # * PS1 has some initial value, either zsh's default or a value set before this script is sourced. + # * iterm2_precmd is invoked + # * ITERM2_SHOULD_DECORATE_PROMPT is initialized to 1 + # * ITERM2_PRECMD_PS1 is set to the initial value of PS1 + # * PS1 gets our escape sequences added to it + # * Your prompt is shown and you may begin entering a command. + # + # Invariants: + # * ITERM2_SHOULD_DECORATE_PROMPT is 1 during and just after command execution, and "" while the prompt is + # shown and until you enter a command and press return. + # * PS1 does not have our escape sequences during command execution + # * After the command executes but before a new one begins, PS1 has escape sequences and + # ITERM2_PRECMD_PS1 has PS1's original value. + iterm2_decorate_prompt() { + # This should be a raw PS1 without iTerm2's stuff. It could be changed during command + # execution. + ITERM2_PRECMD_PS1="$PS1" + ITERM2_SHOULD_DECORATE_PROMPT="" + + # Add our escape sequences just before the prompt is shown. + # Use ITERM2_SQUELCH_MARK for people who can't mdoify PS1 directly, like powerlevel9k users. + # This is gross but I had a heck of a time writing a correct if statetment for zsh 5.0.2. + local PREFIX="" + if [[ $PS1 == *"$(iterm2_prompt_mark)"* ]]; then + PREFIX="" + elif [[ "${ITERM2_SQUELCH_MARK-}" != "" ]]; then + PREFIX="" + else + PREFIX="%{$(iterm2_prompt_mark)%}" + fi + PS1="$PREFIX$PS1%{$(iterm2_prompt_end)%}" + ITERM2_DECORATED_PS1="$PS1" + } + + iterm2_precmd() { + local STATUS="$?" + if [ -z "${ITERM2_SHOULD_DECORATE_PROMPT-}" ]; then + # You pressed ^C while entering a command (iterm2_preexec did not run) + iterm2_before_cmd_executes + if [ "$PS1" != "${ITERM2_DECORATED_PS1-}" ]; then + # PS1 changed, perhaps in another precmd. See issue 9938. + ITERM2_SHOULD_DECORATE_PROMPT="1" + fi + fi + + iterm2_after_cmd_executes "$STATUS" + + if [ -n "$ITERM2_SHOULD_DECORATE_PROMPT" ]; then + iterm2_decorate_prompt + fi + } + + # This is not run if you press ^C while entering a command. + iterm2_preexec() { + # Set PS1 back to its raw value prior to executing the command. + PS1="$ITERM2_PRECMD_PS1" + ITERM2_SHOULD_DECORATE_PROMPT="1" + iterm2_before_cmd_executes + } + + # If hostname -f is slow on your system set iterm2_hostname prior to + # sourcing this script. We know it is fast on macOS so we don't cache + # it. That lets us handle the hostname changing like when you attach + # to a VPN. + if [ -z "${iterm2_hostname-}" ]; then + if [ "$(uname)" != "Darwin" ]; then + iterm2_hostname=`hostname -f 2>/dev/null` + # Some flavors of BSD (i.e. NetBSD and OpenBSD) don't have the -f option. + if [ $? -ne 0 ]; then + iterm2_hostname=`hostname` + fi + fi + fi + + [[ -z ${precmd_functions-} ]] && precmd_functions=() + precmd_functions=($precmd_functions iterm2_precmd) + + [[ -z ${preexec_functions-} ]] && preexec_functions=() + preexec_functions=($preexec_functions iterm2_preexec) + + iterm2_print_state_data + printf "\033]1337;ShellIntegrationVersion=14;shell=zsh\007" + fi +fi diff --git a/plugins/iterm2/update b/plugins/iterm2/update new file mode 100755 index 00000000..da8dae69 --- /dev/null +++ b/plugins/iterm2/update @@ -0,0 +1,4 @@ +#!/bin/sh + +curl -s -L https://iterm2.com/shell_integration/zsh \ + -o iterm2_shell_integration.zsh From 5cb943eea46d322542c5c2a9f54b201eddc2aa67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 24 Feb 2023 17:27:23 +0100 Subject: [PATCH 119/321] fix(lib): fix return code after expected non-zero exit code (#11524) Fixes #11524 --- lib/directories.zsh | 2 +- lib/vcs_info.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/directories.zsh b/lib/directories.zsh index 09114062..9274b5f5 100644 --- a/lib/directories.zsh +++ b/lib/directories.zsh @@ -8,7 +8,7 @@ setopt pushdminus # to your `zshrc` before loading `oh-my-zsh.sh` # to disable the following aliases and functions -zstyle -T ':omz:directories' aliases || return +zstyle -T ':omz:directories' aliases || return 0 alias -g ...='../..' alias -g ....='../../..' diff --git a/lib/vcs_info.zsh b/lib/vcs_info.zsh index e60938c1..be6d32ee 100644 --- a/lib/vcs_info.zsh +++ b/lib/vcs_info.zsh @@ -38,7 +38,7 @@ # due to malicious input as a consequence of CVE-2021-45444, which affects # zsh versions from 5.0.3 to 5.8. # -autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return +autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0 # We use $tmp here because it's already a local variable in VCS_INFO_formats typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"' From 277f38212aef31a6baba2cf1a0a355af611be5e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 24 Feb 2023 20:55:31 +0100 Subject: [PATCH 120/321] refactor: reorganize setopts in lib folder --- lib/directories.zsh | 1 + lib/misc.zsh | 8 +++----- lib/theme-and-appearance.zsh | 2 -- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/lib/directories.zsh b/lib/directories.zsh index 9274b5f5..13b680c1 100644 --- a/lib/directories.zsh +++ b/lib/directories.zsh @@ -1,4 +1,5 @@ # Changing/making/removing directory +setopt auto_cd setopt auto_pushd setopt pushd_ignore_dups setopt pushdminus diff --git a/lib/misc.zsh b/lib/misc.zsh index 1f637083..132f3355 100644 --- a/lib/misc.zsh +++ b/lib/misc.zsh @@ -15,8 +15,9 @@ if [[ $DISABLE_MAGIC_FUNCTIONS != true ]]; then done fi -## jobs -setopt long_list_jobs +setopt multios # enable redirect to multiple streams: echo >file1 >file2 +setopt long_list_jobs # show long list format job notifications +setopt interactivecomments # recognize comments env_default 'PAGER' 'less' env_default 'LESS' '-R' @@ -30,6 +31,3 @@ if (( $+commands[ack-grep] )); then elif (( $+commands[ack] )); then alias afind='ack -il' fi - -# recognize comments -setopt interactivecomments diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index 1b64b51d..208ab9ce 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -53,8 +53,6 @@ if command diff --color /dev/null /dev/null &>/dev/null; then compdef _diff color-diff # compdef is already loaded by this point fi -setopt auto_cd -setopt multios setopt prompt_subst [[ -n "$WINDOW" ]] && SCREEN_NO="%B$WINDOW%b " || SCREEN_NO="" From cd647b6dc6779a1aafa2bcc3a81ec10b65c783ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 26 Feb 2023 15:44:18 +0100 Subject: [PATCH 121/321] fix(gnu-utils): reset ls alias to use GNU-based --color argument (#11527) Fixes #11503 --- plugins/gnu-utils/gnu-utils.plugin.zsh | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/plugins/gnu-utils/gnu-utils.plugin.zsh b/plugins/gnu-utils/gnu-utils.plugin.zsh index 9419127d..6bd3e846 100644 --- a/plugins/gnu-utils/gnu-utils.plugin.zsh +++ b/plugins/gnu-utils/gnu-utils.plugin.zsh @@ -61,3 +61,14 @@ __gnu_utils_preexec() { autoload -Uz add-zsh-hook add-zsh-hook preexec __gnu_utils_preexec + +# lib/theme-and-appearance.zsh sets the alias for ls not knowing that +# we'll be using GNU ls. We'll reset this to use GNU ls --color. +# See https://github.com/ohmyzsh/ohmyzsh/issues/11503 +# +# The ls alias might look like: +# - ls='ls -G' +# - ls='gls --color=tty' +if [[ -x "${commands[gls]}" && "${aliases[ls]}" = (*-G*|gls*) ]]; then + alias ls='ls --color=tty' +fi From 0ca8907f0e6185545c5e38f77ae2f09ca2a44e77 Mon Sep 17 00:00:00 2001 From: Jannik Date: Sun, 26 Feb 2023 20:37:03 +0100 Subject: [PATCH 122/321] fix(lib): fix case-insensitive completion for zsh 5.9 (#11526) --- lib/completion.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/completion.zsh b/lib/completion.zsh index 2c569548..63379b53 100644 --- a/lib/completion.zsh +++ b/lib/completion.zsh @@ -18,9 +18,9 @@ if [[ "$CASE_SENSITIVE" = true ]]; then zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*' else if [[ "$HYPHEN_INSENSITIVE" = true ]]; then - zstyle ':completion:*' matcher-list 'm:{a-zA-Z-_}={A-Za-z_-}' 'r:|=*' 'l:|=* r:|=*' + zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*' else - zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|=*' 'l:|=* r:|=*' + zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*' fi fi unset CASE_SENSITIVE HYPHEN_INSENSITIVE From 16050ab80e63f8e53c07777b4c2ae16ad085e5ad Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Sun, 26 Feb 2023 16:40:44 -0500 Subject: [PATCH 123/321] feat(macos): allow multiple man pages in `man-preview` (#11365) --- plugins/macos/README.md | 2 +- plugins/macos/macos.plugin.zsh | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/macos/README.md b/plugins/macos/README.md index 1bc4244a..1cb9b395 100644 --- a/plugins/macos/README.md +++ b/plugins/macos/README.md @@ -25,7 +25,7 @@ Original author: [Sorin Ionescu](https://github.com/sorin-ionescu) | `pxd` | Return the current Xcode project directory | | `cdx` | `cd` to the current Xcode project directory | | `quick-look` | Quick-Look a specified file | -| `man-preview` | Open a specified man page in Preview app | +| `man-preview` | Open man pages in Preview app | | `showfiles` | Show hidden files in Finder | | `hidefiles` | Hide the hidden files in Finder | | `itunes` | _DEPRECATED_. Use `music` from macOS Catalina on | diff --git a/plugins/macos/macos.plugin.zsh b/plugins/macos/macos.plugin.zsh index e4d759dc..e27d412c 100644 --- a/plugins/macos/macos.plugin.zsh +++ b/plugins/macos/macos.plugin.zsh @@ -224,9 +224,10 @@ function quick-look() { } function man-preview() { - local location - # Don't let Preview.app steal focus if the man page doesn't exist - location=$(man -w "$@") && mandoc -Tpdf $location | open -f -a Preview + local page + for page in "${(@f)"$(man -w $@)"}"; do + command mandoc -Tpdf $page | open -f -a Preview + done } compdef _man man-preview From 21bdb18b2d1fe8b547a42da7ac7b58fb28563a2c Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Monti Date: Mon, 27 Feb 2023 20:22:39 +0100 Subject: [PATCH 124/321] feat(nodenv): add plugin for `nodenv` (#9880) Co-authored-by: Matthew Boston --- plugins/nodenv/README.md | 20 +++++++++++++++ plugins/nodenv/nodenv.plugin.zsh | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 plugins/nodenv/README.md create mode 100644 plugins/nodenv/nodenv.plugin.zsh diff --git a/plugins/nodenv/README.md b/plugins/nodenv/README.md new file mode 100644 index 00000000..55059702 --- /dev/null +++ b/plugins/nodenv/README.md @@ -0,0 +1,20 @@ +# nodenv plugin + +The primary job of this plugin is to provide `nodenv_prompt_info` which can be added to your theme to include Node +version information into your prompt. + +To use it, add `nodenv` to the plugins array in your zshrc file: + +```zsh +plugins=(... nodenv) +``` + +## Functions + +* `nodenv_prompt_info`: displays the Node version in use by nodenv; or the global Node + version, if nodenv wasn't found. You can use this function in your prompt by adding + `$(nodenv_prompt_info)` to PROMPT or RPROMPT: + + ```zsh + RPROMPT='$(nodenv_prompt_info)' + ``` diff --git a/plugins/nodenv/nodenv.plugin.zsh b/plugins/nodenv/nodenv.plugin.zsh new file mode 100644 index 00000000..79a4ffbb --- /dev/null +++ b/plugins/nodenv/nodenv.plugin.zsh @@ -0,0 +1,43 @@ +# This plugin loads nodenv into the current shell and provides prompt info via +# the 'nodenv_prompt_info' function. + +FOUND_NODENV=${+commands[nodenv]} + +if [[ $FOUND_NODENV -ne 1 ]]; then + nodenvdirs=( + "$HOME/.nodenv" + "/usr/local/nodenv" + "/opt/nodenv" + "/usr/local/opt/nodenv" + ) + for dir in $nodenvdirs; do + if [[ -d "${dir}/bin" ]]; then + export PATH="$PATH:${dir}/bin" + FOUND_NODENV=1 + break + fi + done + + if [[ $FOUND_NODENV -ne 1 ]]; then + if (( $+commands[brew] )) && dir=$(brew --prefix nodenv 2>/dev/null); then + if [[ -d "${dir}/bin" ]]; then + export PATH="$PATH:${dir}/bin" + FOUND_NODENV=1 + fi + fi + fi +fi + +if [[ $FOUND_NODENV -eq 1 ]]; then + eval "$(nodenv init --no-rehash - zsh)" + function nodenv_prompt_info() { + nodenv version-name 2>/dev/null + } +else + # fallback to system node + function nodenv_prompt_info() { + echo "system: $(node -v 2>&1 | cut -c 2-)" + } +fi + +unset FOUND_NODENV nodenvdirs dir From f42c965da44be6940134b805edb54c5eca37d9ae Mon Sep 17 00:00:00 2001 From: ZYX Date: Mon, 27 Feb 2023 14:39:38 -0500 Subject: [PATCH 125/321] fix(aliases): clarify how to pass in keywords to `acs` (#11521) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- plugins/aliases/README.md | 2 +- plugins/aliases/cheatsheet.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md index 4e77f67b..6a2da3d7 100644 --- a/plugins/aliases/README.md +++ b/plugins/aliases/README.md @@ -19,7 +19,7 @@ Requirements: Python needs to be installed. - `acs -h/--help`: print help mesage -- `acs `: filter aliases by `` and highlight +- `acs `: filter and highlight aliases by `` - `acs -g /--group `: show only aliases for group ``. Multiple uses of the flag show all groups diff --git a/plugins/aliases/cheatsheet.py b/plugins/aliases/cheatsheet.py index 3362a6ab..fb8c74aa 100644 --- a/plugins/aliases/cheatsheet.py +++ b/plugins/aliases/cheatsheet.py @@ -51,18 +51,18 @@ def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False): continue aliases = cheatsheet.get(key) if not wfilter: - pretty_print_group(key, aliases, wfilter, groups_only) + pretty_print_group(key, aliases, only_groupname=groups_only) else: - pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter) + pretty_print_group(key, [ alias for alias in aliases if wfilter in alias[0] or wfilter in alias[1] ], wfilter) if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Pretty print aliases.") - parser.add_argument('filter', nargs="*", help="search aliases matching string") + parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="acs") + parser.add_argument('filter', nargs="*", metavar="", help="search aliases matching keywords") parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups") parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups") args = parser.parse_args() lines = sys.stdin.readlines() group_list = args.group_list or None - wfilter = " ".join(args.filter) or None + wfilter = " ".join(args.filter[1:]) if args.filter else None pretty_print(cheatsheet(lines), wfilter, group_list, args.groups_only) From b602e0a066d8c98e8c02201ad16c764447fd8531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 27 Feb 2023 20:46:42 +0100 Subject: [PATCH 126/321] fix(aliases): fix regression in filter argument --- plugins/aliases/cheatsheet.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/aliases/cheatsheet.py b/plugins/aliases/cheatsheet.py index fb8c74aa..7505d304 100644 --- a/plugins/aliases/cheatsheet.py +++ b/plugins/aliases/cheatsheet.py @@ -51,9 +51,9 @@ def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False): continue aliases = cheatsheet.get(key) if not wfilter: - pretty_print_group(key, aliases, only_groupname=groups_only) + pretty_print_group(key, aliases, wfilter, groups_only) else: - pretty_print_group(key, [ alias for alias in aliases if wfilter in alias[0] or wfilter in alias[1] ], wfilter) + pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter) if __name__ == '__main__': parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="acs") @@ -64,5 +64,5 @@ if __name__ == '__main__': lines = sys.stdin.readlines() group_list = args.group_list or None - wfilter = " ".join(args.filter[1:]) if args.filter else None + wfilter = " ".join(args.filter) or None pretty_print(cheatsheet(lines), wfilter, group_list, args.groups_only) From a4a9a8cd8ccb4240a7c5df5f6766bd5340646e63 Mon Sep 17 00:00:00 2001 From: Julian Suarez <49501306+jsred@users.noreply.github.com> Date: Wed, 1 Mar 2023 07:23:32 -0300 Subject: [PATCH 127/321] feat(rvm): add `rb32` alias (#11533) --- plugins/rvm/README.md | 1 + plugins/rvm/rvm.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/rvm/README.md b/plugins/rvm/README.md index 576b037b..410bd60c 100644 --- a/plugins/rvm/README.md +++ b/plugins/rvm/README.md @@ -24,6 +24,7 @@ plugins=(... rvm) | `rb27` | `rvm use ruby-2.7` | | `rb30` | `rvm use ruby-3.0` | | `rb31` | `rvm use ruby-3.1` | +| `rb32` | `rvm use ruby-3.2` | | `rvm-update` | `rvm get head` | | `gems` | `gem list` | | `rvms` | `rvm gemset` | diff --git a/plugins/rvm/rvm.plugin.zsh b/plugins/rvm/rvm.plugin.zsh index 2a091d01..3ddf0417 100644 --- a/plugins/rvm/rvm.plugin.zsh +++ b/plugins/rvm/rvm.plugin.zsh @@ -27,6 +27,7 @@ rubies=( 27 'ruby-2.7' 30 'ruby-3.0' 31 'ruby-3.1' + 32 'ruby-3.2' ) for v in ${(k)rubies}; do From 14978859c5b8d9385c9b836cd09c97cc08b6035b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Batuhan=20=C5=9Eanl=C4=B1?= <32306925+batuhan0sanli@users.noreply.github.com> Date: Thu, 2 Mar 2023 12:03:50 +0300 Subject: [PATCH 128/321] docs(brew): remove duplication (#11535) --- plugins/brew/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/brew/README.md b/plugins/brew/README.md index d0c15023..412daae6 100644 --- a/plugins/brew/README.md +++ b/plugins/brew/README.md @@ -21,7 +21,6 @@ defined for convenience. | -------- | --------------------------------------- | ------------------------------------------------------------------- | | `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | | `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. | -| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. | | `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. | | `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. | | `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. | From 5bf7f9c83325a6cb2752e14ca01a574dbeef206e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 3 Mar 2023 12:34:31 +0100 Subject: [PATCH 129/321] fix(lib): use `$BROWSER` in `open_command` if set (#11532) Fixes #11098 --- lib/functions.zsh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/functions.zsh b/lib/functions.zsh index 6e1faa6a..1d85ea38 100644 --- a/lib/functions.zsh +++ b/lib/functions.zsh @@ -30,6 +30,13 @@ function open_command() { ;; esac + # If a URL is passed, $BROWSER might be set to a local browser within SSH. + # See https://github.com/ohmyzsh/ohmyzsh/issues/11098 + if [[ -n "$BROWSER" && "$1" = (http|https)://* ]]; then + "$BROWSER" "$@" + return + fi + ${=open_cmd} "$@" &>/dev/null } From 95d0c4b603e0c880bcf20bc9211b2162e94ed925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 3 Mar 2023 14:38:50 +0100 Subject: [PATCH 130/321] refactor(theme-and-appearance): reorganize and clean up logic (#11529) Co-authored-by: Andrew Janke Co-authored-by: Marcelo Parada Co-authored-by: Uy Ha Co-authored-by: Valentin Uveges --- lib/theme-and-appearance.zsh | 147 +++++++++++++++++++++-------------- 1 file changed, 87 insertions(+), 60 deletions(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index 208ab9ce..985d3bc1 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -1,66 +1,93 @@ -# ls colors +# Sets color variable such as $fg, $bg, $color and $reset_color autoload -U colors && colors -# Enable ls colors -export LSCOLORS="Gxfxcxdxbxegedabagacad" - -# TODO organise this chaotic logic - -if [[ "$DISABLE_LS_COLORS" != "true" ]]; then - if [[ -d "$ZSH" ]]; then - _test_dir="$ZSH" - else - _test_dir="." - fi - # Find the option for using colors in ls, depending on the version - if [[ "$OSTYPE" == netbsd* ]]; then - # On NetBSD, test if "gls" (GNU ls) is installed (this one supports colors); - # otherwise, leave ls as is, because NetBSD's ls doesn't support -G - gls --color -d "$_test_dir" &>/dev/null && alias ls='gls --color=tty' - elif [[ "$OSTYPE" == openbsd* ]]; then - # On OpenBSD, "gls" (ls from GNU coreutils) and "colorls" (ls from base, - # with color and multibyte support) are available from ports. "colorls" - # will be installed on purpose and can't be pulled in by installing - # coreutils, so prefer it to "gls". - gls --color -d "$_test_dir" &>/dev/null && alias ls='gls --color=tty' - colorls -G -d "$_test_dir" &>/dev/null && alias ls='colorls -G' - elif [[ "$OSTYPE" == (darwin|freebsd)* ]]; then - # this is a good alias, it works by default just using $LSCOLORS - ls -G "$_test_dir" &>/dev/null && alias ls='ls -G' - - # only use coreutils ls if there is a dircolors customization present ($LS_COLORS or .dircolors file) - # otherwise, gls will use the default color scheme which is ugly af - [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] && gls --color -d "$_test_dir" &>/dev/null && alias ls='gls --color=tty' - else - # For GNU ls, we use the default ls color theme. They can later be overwritten by themes. - if [[ -z "$LS_COLORS" ]]; then - (( $+commands[dircolors] )) && eval "$(dircolors -b)" - fi - - ls --color -d "$_test_dir" &>/dev/null && alias ls='ls --color=tty' || { ls -G "$_test_dir" &>/dev/null && alias ls='ls -G' } - - # Take advantage of $LS_COLORS for completion as well. - zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" - fi -fi - -# enable diff color if possible. -if command diff --color /dev/null /dev/null &>/dev/null; then - function color-diff { - command diff --color $@ - } - alias diff="color-diff" - compdef _diff color-diff # compdef is already loaded by this point -fi - +# Expand variables and commands in PROMPT variables setopt prompt_subst -[[ -n "$WINDOW" ]] && SCREEN_NO="%B$WINDOW%b " || SCREEN_NO="" - -# git theming default: Variables for theming the git info prompt -ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Prefix at the very beginning of the prompt, before the branch name -ZSH_THEME_GIT_PROMPT_SUFFIX=")" # At the very end of the prompt -ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty -ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean +# Prompt function theming defaults +ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Beginning of the git prompt, before the branch name +ZSH_THEME_GIT_PROMPT_SUFFIX=")" # End of the git prompt +ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty +ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean ZSH_THEME_RUBY_PROMPT_PREFIX="(" ZSH_THEME_RUBY_PROMPT_SUFFIX=")" + + +# Use diff --color if available +if command diff --color /dev/null{,} &>/dev/null; then + function diff { + command diff --color "$@" + } +fi + + +# Don't set ls coloring if disabled +[[ "$DISABLE_LS_COLORS" != true ]] || return 0 + +function test-ls-args { + local cmd="$1" # ls, gls, colorls, ... + local args="${@[2,-1]}" # arguments except the first one + command "$cmd" "$args" /dev/null &>/dev/null +} + +# Find the option for using colors in ls, depending on the version +case "$OSTYPE" in + netbsd*) + # On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors); + # otherwise, leave ls as is, because NetBSD's ls doesn't support -G + test-ls-args gls --color && alias ls='gls --color=tty' + ;; + openbsd*) + # On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base, + # with color and multibyte support) are available from ports. + # `colorls` will be installed on purpose and can't be pulled in by installing + # coreutils (which might be installed for ), so prefer it to `gls`. + test-ls-args gls --color && alias ls='gls --color=tty' + test-ls-args colorls -G && alias ls='colorls -G' + ;; + (darwin|freebsd)*) + # This alias works by default just using $LSCOLORS + test-ls-args ls -G && alias ls='ls -G' + # Only use GNU ls if installed and there are user defaults for $LS_COLORS, + # as the default coloring scheme is not very pretty + [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] \ + && test-ls-args gls --color \ + && alias ls='gls --color=tty' + ;; + *) + if test-ls-args ls --color; then + alias ls='ls --color=tty' + elif test-ls-args ls -G; then + alias ls='ls -G' + fi + ;; +esac + +unfunction test-ls-args + + +# Default coloring for BSD-based ls +export LSCOLORS="Gxfxcxdxbxegedabagacad" + +# Default coloring for GNU-based ls +if [[ -z "$LS_COLORS" ]]; then + # Define LS_COLORS via dircolors if available. Otherwise, set a default + # equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors) + if (( $+commands[dircolors] )); then + [[ -f "$HOME/.dircolors" ]] \ + && source <(dircolors -b "$HOME/.dircolors") \ + || source <(dircolors -b) + else + export LS_COLORS="di=34:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=37;41:sg=30;43:tw=30;42:ow=34;42:" + fi +fi + +# Take advantage of $LS_COLORS for completion as well. +function omz_set_completion_colors { + zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" + add-zsh-hook -d precmd omz_set_completion_colors + unfunction omz_set_completion_colors +} + +autoload -Uz add-zsh-hook +add-zsh-hook precmd omz_set_completion_colors From 6f3304f442afde6e1cf3e7e8641a405d29d2e73d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 4 Mar 2023 09:25:01 +0100 Subject: [PATCH 131/321] feat(argocd): add completion plugin Co-authored-by: Sumudu Lansakara Closes #9900 --- plugins/argocd/README.md | 20 ++++++++++++++++++++ plugins/argocd/gh.plugin.zsh | 14 ++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 plugins/argocd/README.md create mode 100644 plugins/argocd/gh.plugin.zsh diff --git a/plugins/argocd/README.md b/plugins/argocd/README.md new file mode 100644 index 00000000..0f900ff2 --- /dev/null +++ b/plugins/argocd/README.md @@ -0,0 +1,20 @@ +# Argo CD plugin + +This plugin adds completion for the [Argo CD](https://argoproj.github.io/cd/) CLI. + +To use it, add `argocd` to the plugins array in your zshrc file: + +```zsh +plugins=(... argocd) +``` + +This plugin does not add any aliases. + +## Cache + +This plugin caches the completion script and is automatically updated asynchronously when the plugin is +loaded, which is usually when you start up a new terminal emulator. + +The cache is stored at: + +- `$ZSH_CACHE/completions/_argocd` completions script diff --git a/plugins/argocd/gh.plugin.zsh b/plugins/argocd/gh.plugin.zsh new file mode 100644 index 00000000..8de7b023 --- /dev/null +++ b/plugins/argocd/gh.plugin.zsh @@ -0,0 +1,14 @@ +# Autocompletion for argocd. +if (( ! $+commands[argocd] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `argocd`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then + typeset -g -A _comps + autoload -Uz _argocd + _comps[argocd]=_argocd +fi + +argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &| From 3b759c5dc926d0973d82fa1b8ffed45d770d20e8 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 6 Mar 2023 11:25:47 +0100 Subject: [PATCH 132/321] fix(argocd): typo in filename --- plugins/argocd/{gh.plugin.zsh => argocd.plugin.zsh} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename plugins/argocd/{gh.plugin.zsh => argocd.plugin.zsh} (100%) diff --git a/plugins/argocd/gh.plugin.zsh b/plugins/argocd/argocd.plugin.zsh similarity index 100% rename from plugins/argocd/gh.plugin.zsh rename to plugins/argocd/argocd.plugin.zsh From 06c16175ea4aa81d4b64c0772f44c11e505a0eb7 Mon Sep 17 00:00:00 2001 From: Karim Benbourenane Date: Tue, 7 Mar 2023 03:25:34 -0500 Subject: [PATCH 133/321] fix(aliases): group properly aliases (#11546) --- plugins/aliases/cheatsheet.py | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/aliases/cheatsheet.py b/plugins/aliases/cheatsheet.py index 7505d304..f742fba9 100644 --- a/plugins/aliases/cheatsheet.py +++ b/plugins/aliases/cheatsheet.py @@ -15,6 +15,7 @@ def parse(line): def cheatsheet(lines): exps = [ parse(line) for line in lines ] + exps.sort(key=lambda exp:exp[2]) cheatsheet = {'_default': []} for key, group in itertools.groupby(exps, lambda exp:exp[2]): group_list = [ item for item in group ] From 46fd7972a2170388c9b8e9f6e58d6c8408ad4904 Mon Sep 17 00:00:00 2001 From: potato <851951875@qq.com> Date: Tue, 7 Mar 2023 20:33:16 +0800 Subject: [PATCH 134/321] feat(aws): add AWS_REGION to aws_prompt_info (#10062) --- plugins/aws/README.md | 22 +++++++++++++++----- plugins/aws/aws.plugin.zsh | 41 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/plugins/aws/README.md b/plugins/aws/README.md index d6f4f460..e1e35574 100644 --- a/plugins/aws/README.md +++ b/plugins/aws/README.md @@ -1,7 +1,7 @@ # aws This plugin provides completion support for [awscli](https://docs.aws.amazon.com/cli/latest/reference/index.html) -and a few utilities to manage AWS profiles and display them in the prompt. +and a few utilities to manage AWS profiles/regions and display them in the prompt. To use it, add `aws` to the plugins array in your zshrc file. @@ -16,6 +16,9 @@ plugins=(... aws) Run `asp` without arguments to clear the profile. * `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection. +* `asr []`: sets `$AWS_REGION` and `$AWS_DEFAULT_REGION` (legacy) to ``. + Run `asr` without arguments to clear the profile. + * `acp [] []`: in addition to `asp` functionality, it actually changes the profile by assuming the role specified in the `` configuration. It supports MFA and sets `$AWS_ACCESS_KEY_ID`, `$AWS_SECRET_ACCESS_KEY` and `$AWS_SESSION_TOKEN`, if @@ -25,25 +28,34 @@ plugins=(... aws) * `agp`: gets the current value of `$AWS_PROFILE`. +* `agr`: gets the current value of `$AWS_REGION`. + * `aws_change_access_key`: changes the AWS access key of a profile. * `aws_profiles`: lists the available profiles in the `$AWS_CONFIG_FILE` (default: `~/.aws/config`). Used to provide completion for the `asp` function. +* `aws_regions`: lists the available regions. + Used to provide completion for the `asr` function. + ## Plugin options * Set `SHOW_AWS_PROMPT=false` in your zshrc file if you want to prevent the plugin from modifying your RPROMPT. Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to - see the AWS profile prompt. + see the AWS profile/region prompt. ## Theme The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays -the current `$AWS_PROFILE`. It uses two variables to control how that is shown: +the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control how that is shown: -* ZSH_THEME_AWS_PREFIX: sets the prefix of the AWS_PROFILE. Defaults to ``. +* ZSH_THEME_AWS_PROFILE_SUFFIX: sets the suffix of the AWS_PROFILE. Defaults to `>`. + +* ZSH_THEME_AWS_REGION_PREFIX: sets the prefix of the AWS_REGION. Defaults to ``. ## Configuration diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 865e82f1..1c386a3e 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -2,6 +2,10 @@ function agp() { echo $AWS_PROFILE } +function agr() { + echo $AWS_REGION +} + # AWS profile selection function asp() { if [[ -z "$1" ]]; then @@ -27,6 +31,25 @@ function asp() { fi } +# AWS region selection +function asr() { + if [[ -z "$1" ]]; then + unset AWS_DEFAULT_REGION AWS_REGION + echo AWS region cleared. + return + fi + + local -a available_regions + available_regions=($(aws_regions)) + if [[ -z "${available_regions[(r)$1]}" ]]; then + echo "${fg[red]}Available regions: \n$(aws_regions)" + return 1 + fi + + export AWS_REGION=$1 + export AWS_DEFAULT_REGION=$1 +} + # AWS profile switch function acp() { if [[ -z "$1" ]]; then @@ -145,12 +168,25 @@ function aws_change_access_key() { AWS_PAGER="" aws iam list-access-keys } +function aws_regions() { + if [[ $AWS_DEFAULT_PROFILE || $AWS_PROFILE ]];then + aws ec2 describe-regions |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}' + else + echo "You must specify a AWS profile." + fi +} + function aws_profiles() { aws --no-cli-pager configure list-profiles 2> /dev/null && return [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1 grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g' } +function _aws_regions() { + reply=($(aws_regions)) +} +compctl -K _aws_regions asr + function _aws_profiles() { reply=($(aws_profiles)) } @@ -158,8 +194,8 @@ compctl -K _aws_profiles asp acp aws_change_access_key # AWS prompt function aws_prompt_info() { - [[ -n "$AWS_PROFILE" ]] || return - echo "${ZSH_THEME_AWS_PREFIX=}" + if [[ -z $AWS_REGION && -z $AWS_PROFILE ]];then return; fi + echo "${ZSH_THEME_AWS_PROFILE_PREFIX:=} ${ZSH_THEME_AWS_REGION_PREFIX:=}" } if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then @@ -211,3 +247,4 @@ else [[ -r $_aws_zsh_completer_path ]] && source $_aws_zsh_completer_path unset _aws_zsh_completer_path _brew_prefix fi + From d342b353e32091ef7384b86fd86b1a88dbd44609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 7 Mar 2023 18:49:17 +0100 Subject: [PATCH 135/321] fix(init): set completion colors on theme load, not with `precmd` This fixes an edge case where the user actually sets zstyle ':completion:*' list-colors in their zshrc, but the previous code used a precmd hook, which would override the user changes. With this change our modifications will be set in the init script, after the theme loads, so that later changes can affect our defaults. Note that this will not be run for users on plugin managers, as these don't generally run our init script. --- lib/theme-and-appearance.zsh | 10 ---------- oh-my-zsh.sh | 3 +++ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index 985d3bc1..e245570e 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -81,13 +81,3 @@ if [[ -z "$LS_COLORS" ]]; then export LS_COLORS="di=34:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=37;41:sg=30;43:tw=30;42:ow=34;42:" fi fi - -# Take advantage of $LS_COLORS for completion as well. -function omz_set_completion_colors { - zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" - add-zsh-hook -d precmd omz_set_completion_colors - unfunction omz_set_completion_colors -} - -autoload -Uz add-zsh-hook -add-zsh-hook precmd omz_set_completion_colors diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index 98bda8c8..363cfca8 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -189,3 +189,6 @@ if [[ -n "$ZSH_THEME" ]]; then echo "[oh-my-zsh] theme '$ZSH_THEME' not found" fi fi + +# set completion colors to be the same as `ls`, after theme has been loaded +[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" From e0f92c8df52335c266f73e3cc3384b277f3e9a34 Mon Sep 17 00:00:00 2001 From: Julien Vincent Date: Tue, 7 Mar 2023 21:46:21 +0200 Subject: [PATCH 136/321] feat(vi-mode): add settings for vi-mode cursor styles (#10860) --- plugins/vi-mode/README.md | 21 +++++++++++++++++++++ plugins/vi-mode/vi-mode.plugin.zsh | 23 ++++++++++++++++------- 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md index 476666bf..3b819c7c 100644 --- a/plugins/vi-mode/README.md +++ b/plugins/vi-mode/README.md @@ -29,6 +29,8 @@ plugins=(... vi-mode) VI_MODE_SET_CURSOR=true ``` + See [Cursor Styles](#cursor-styles) for controlling how the cursor looks in different modes + - `MODE_INDICATOR`: controls the string displayed when the shell is in normal mode. See [Mode indicators](#mode-indicators) for details. @@ -52,6 +54,25 @@ INSERT_MODE_INDICATOR="%F{yellow}+%f" You can also use the `vi_mode_prompt_info` function in your prompt, which will display this mode indicator. +## Cursor Styles + +You can control the cursor style used in each active vim mode by changing the values of the following variables. + +```zsh +# defaults +VI_MODE_CURSOR_NORMAL=2 +VI_MODE_CURSOR_VISUAL=6 +VI_MODE_CURSOR_INSERT=6 +VI_MODE_CURSOR_OPPEND=0 +``` + +- 0, 1 - Blinking block +- 2 - Solid block +- 3 - Blinking underline +- 4 - Solid underline +- 5 - Blinking line +- 6 - Solid line + ## Key bindings Use `ESC` or `CTRL-[` to enter `Normal mode`. diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh index 149d6bbd..9a410c1f 100644 --- a/plugins/vi-mode/vi-mode.plugin.zsh +++ b/plugins/vi-mode/vi-mode.plugin.zsh @@ -14,6 +14,15 @@ typeset -g VI_MODE_RESET_PROMPT_ON_MODE_CHANGE # Unset or set to any other value to do the opposite. typeset -g VI_MODE_SET_CURSOR +# Control how the cursor appears in the various vim modes. This only applies +# if $VI_MODE_SET_CURSOR=true. +# +# See https://vt100.net/docs/vt510-rm/DECSCUSR for cursor styles +typeset -g VI_MODE_CURSOR_NORMAL=2 +typeset -g VI_MODE_CURSOR_VISUAL=6 +typeset -g VI_MODE_CURSOR_INSERT=6 +typeset -g VI_MODE_CURSOR_OPPEND=0 + typeset -g VI_KEYMAP=main function _vi-mode-set-cursor-shape-for-keymap() { @@ -22,13 +31,13 @@ function _vi-mode-set-cursor-shape-for-keymap() { # https://vt100.net/docs/vt510-rm/DECSCUSR local _shape=0 case "${1:-${VI_KEYMAP:-main}}" in - main) _shape=6 ;; # vi insert: line - viins) _shape=6 ;; # vi insert: line - isearch) _shape=6 ;; # inc search: line - command) _shape=6 ;; # read a command name - vicmd) _shape=2 ;; # vi cmd: block - visual) _shape=2 ;; # vi visual mode: block - viopp) _shape=0 ;; # vi operation pending: blinking block + main) _shape=$VI_MODE_CURSOR_INSERT ;; # vi insert: line + viins) _shape=$VI_MODE_CURSOR_INSERT ;; # vi insert: line + isearch) _shape=$VI_MODE_CURSOR_INSERT ;; # inc search: line + command) _shape=$VI_MODE_CURSOR_INSERT ;; # read a command name + vicmd) _shape=$VI_MODE_CURSOR_NORMAL ;; # vi cmd: block + visual) _shape=$VI_MODE_CURSOR_VISUAL ;; # vi visual mode: block + viopp) _shape=$VI_MODE_CURSOR_OPPEND ;; # vi operation pending: blinking block *) _shape=0 ;; esac printf $'\e[%d q' "${_shape}" From 1c325de464117aa058d5f810b96ed54d65e5d0d5 Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Tue, 7 Mar 2023 11:52:38 -0800 Subject: [PATCH 137/321] Fixing link to PA website in README Was linking to an old URL --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7f4a26ca..4042c8c2 100644 --- a/README.md +++ b/README.md @@ -374,4 +374,4 @@ Oh My Zsh is released under the [MIT license](LICENSE.txt). ![Planet Argon](https://pa-github-assets.s3.amazonaws.com/PARGON_logo_digital_COL-small.jpg) -Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a [Ruby on Rails development agency](https://www.planetargon.com/skills/ruby-on-rails-development?utm_source=github). Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github). +Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a [Ruby on Rails development agency](http://www.planetargon.com/services/ruby-on-rails-development?utm_source=github). Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github). From 3ea0e0d2343a2e79be0c2c6ace030a595d5cec2f Mon Sep 17 00:00:00 2001 From: Benjamin Lieb Date: Wed, 8 Mar 2023 03:29:21 -0500 Subject: [PATCH 138/321] docs(vi-mode): document how to add vi-mode info on the prompt (#11548) --- plugins/vi-mode/README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md index 3b819c7c..0cb51675 100644 --- a/plugins/vi-mode/README.md +++ b/plugins/vi-mode/README.md @@ -51,8 +51,23 @@ MODE_INDICATOR="%F{white}+%f" INSERT_MODE_INDICATOR="%F{yellow}+%f" ``` -You can also use the `vi_mode_prompt_info` function in your prompt, which will display -this mode indicator. +### Adding mode indicators to your prompt + +`Vi-mode` by default will add mode indicators to `RPROMPT` **unless** that is defined by +a preceding plugin. + +If `PROMPT` or `RPROMPT` is not defined to your liking, you can add mode info manually. The `vi_mode_prompt_info` function is available to insert mode indicator information. + +Here are some examples: + +```bash +source $ZSH/oh-my-zsh.sh + +PROMPT="$PROMPT\$(vi_mode_prompt_info)" +RPROMPT="\$(vi_mode_prompt_info)$RPROMPT" +``` + +Note the `\$` here, which importantly prevents interpolation at the time of defining, but allows it to be executed for each prompt update event. ## Cursor Styles From 92387d9fff83934a8628697a4397a65030f0301e Mon Sep 17 00:00:00 2001 From: Zhong Zheng Date: Sat, 11 Mar 2023 01:52:44 +1100 Subject: [PATCH 139/321] feat(rails): add `rta` alias (#11553) --- plugins/rails/README.md | 1 + plugins/rails/rails.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/rails/README.md b/plugins/rails/README.md index fa66750f..b2425aab 100644 --- a/plugins/rails/README.md +++ b/plugins/rails/README.md @@ -47,6 +47,7 @@ plugins=(... rails) | `rsp` | `rails server --port` | Launch a web server and specify the listening port | | `rsts` | `rails stats` | Print code statistics | | `rt` | `rails test` | Run Rails tests | +| `rta` | `rails test:all` | Runs all Rails tests, including system tests | | `ru` | `rails runner` | Run Ruby code in the context of Rails | ### Foreman diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh index b11cbb5c..015dc9ec 100644 --- a/plugins/rails/rails.plugin.zsh +++ b/plugins/rails/rails.plugin.zsh @@ -75,6 +75,7 @@ alias rsd='rails server --debugger' alias rsp='rails server --port' alias rsts='rails stats' alias rt='rails test' +alias rta='rails test:all' alias ru='rails runner' # Foreman aliases From 72732a224e886933df6b64a49ec6f5e94c884612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 12 Mar 2023 15:47:58 +0100 Subject: [PATCH 140/321] fix(lib): set equivalent LS_COLORS and LSCOLORS variables As reported by https://geoff.greer.fm/lscolors Fixes #11554 --- lib/theme-and-appearance.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index e245570e..d8859b04 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -78,6 +78,6 @@ if [[ -z "$LS_COLORS" ]]; then && source <(dircolors -b "$HOME/.dircolors") \ || source <(dircolors -b) else - export LS_COLORS="di=34:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=37;41:sg=30;43:tw=30;42:ow=34;42:" + export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43" fi fi From 82d261603d968dfe5e86a44464c38fd88dda802c Mon Sep 17 00:00:00 2001 From: vladislav doster <10052309+vladdoster@users.noreply.github.com> Date: Mon, 20 Mar 2023 02:11:03 -0500 Subject: [PATCH 141/321] feat(gnu-utils): add `gindent` (#11569) --- plugins/gnu-utils/gnu-utils.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gnu-utils/gnu-utils.plugin.zsh b/plugins/gnu-utils/gnu-utils.plugin.zsh index 6bd3e846..6023bf2b 100644 --- a/plugins/gnu-utils/gnu-utils.plugin.zsh +++ b/plugins/gnu-utils/gnu-utils.plugin.zsh @@ -19,7 +19,7 @@ __gnu_utils() { 'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate' 'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand' 'gexpr' 'gfactor' 'gfalse' 'gfmt' 'gfold' 'ggroups' 'ghead' 'ghostid' - 'gid' 'ginstall' 'gjoin' 'gkill' 'glink' 'gln' 'glogname' 'gls' 'gmd5sum' + 'gid' 'gindent' 'ginstall' 'gjoin' 'gkill' 'glink' 'gln' 'glogname' 'gls' 'gmd5sum' 'gmkdir' 'gmkfifo' 'gmknod' 'gmktemp' 'gmv' 'gnice' 'gnl' 'gnohup' 'gnproc' 'god' 'gpaste' 'gpathchk' 'gpinky' 'gpr' 'gprintenv' 'gprintf' 'gptx' 'gpwd' 'greadlink' 'grm' 'grmdir' 'gruncon' 'gseq' 'gsha1sum' 'gsha224sum' From 4a39779067eda369152bfd6b653f843286c930c0 Mon Sep 17 00:00:00 2001 From: Yu Xiang Zhang Date: Tue, 14 Mar 2023 19:02:54 +0000 Subject: [PATCH 142/321] feat(aws): set region when AWS_REGION is not set --- plugins/aws/README.md | 2 +- plugins/aws/aws.plugin.zsh | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/aws/README.md b/plugins/aws/README.md index e1e35574..846bf141 100644 --- a/plugins/aws/README.md +++ b/plugins/aws/README.md @@ -12,7 +12,7 @@ plugins=(... aws) ## Plugin commands * `asp []`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to ``. - It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI. + It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`. Run `asp` without arguments to clear the profile. * `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection. diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 1c386a3e..39c47d57 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -9,7 +9,7 @@ function agr() { # AWS profile selection function asp() { if [[ -z "$1" ]]; then - unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE + unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION echo AWS profile cleared. return fi @@ -26,6 +26,8 @@ function asp() { export AWS_PROFILE=$1 export AWS_EB_PROFILE=$1 + export AWS_PROFILE_REGION=$(aws configure get region) + if [[ "$2" == "login" ]]; then aws sso login fi @@ -195,7 +197,8 @@ compctl -K _aws_profiles asp acp aws_change_access_key # AWS prompt function aws_prompt_info() { if [[ -z $AWS_REGION && -z $AWS_PROFILE ]];then return; fi - echo "${ZSH_THEME_AWS_PROFILE_PREFIX:=} ${ZSH_THEME_AWS_REGION_PREFIX:=}" + region=${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}} + echo "${ZSH_THEME_AWS_PROFILE_PREFIX:=} ${ZSH_THEME_AWS_REGION_PREFIX:=}" } if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then From f9f01e48a890ad4359a6973d1b8a7039f57b2d08 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 21 Mar 2023 15:29:48 +0100 Subject: [PATCH 143/321] fix(aws): do not print region if it's not defined Closes #11568 Closes #11570 --- plugins/aws/aws.plugin.zsh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 39c47d57..0242be97 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -196,9 +196,15 @@ compctl -K _aws_profiles asp acp aws_change_access_key # AWS prompt function aws_prompt_info() { - if [[ -z $AWS_REGION && -z $AWS_PROFILE ]];then return; fi - region=${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}} - echo "${ZSH_THEME_AWS_PROFILE_PREFIX:=} ${ZSH_THEME_AWS_REGION_PREFIX:=}" + local _aws_to_show + if [[ -n $AWS_PROFILE ]];then + _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX:=}" + fi + if [[ -n $AWS_REGION ]]; then + [[ -n $AWS_PROFILE ]] && _aws_to_show+=" " + _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX:=}" + fi + echo "$_aws_to_show" } if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then From 5efcfc39735c818a9778172356f82ec0eb3e5916 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jose=20C=2E=20Mass=C3=B3n?= <939888+Abuelodelanada@users.noreply.github.com> Date: Thu, 23 Mar 2023 05:42:20 -0300 Subject: [PATCH 144/321] feat(juju): add functions to get current controller and model (#11572) --- plugins/juju/README.md | 2 ++ plugins/juju/juju.plugin.zsh | 32 +++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/plugins/juju/README.md b/plugins/juju/README.md index f0c65309..6ee333f5 100644 --- a/plugins/juju/README.md +++ b/plugins/juju/README.md @@ -126,5 +126,7 @@ Naming convention: - `jaddr [unit_num]`: display app or unit IP address. - `jreld `: display app and unit relation data. - `jclean`: destroy all controllers +- `jcontroller`: display the controller your are connected to. +- `jmodel`: display the model your are connected to. - `wjst [interval_secs] [args_for_watch]`: watch juju status, with optional interval (default: 5s); you may pass additional arguments to `watch`. diff --git a/plugins/juju/juju.plugin.zsh b/plugins/juju/juju.plugin.zsh index be8a2c7a..0c60e35c 100644 --- a/plugins/juju/juju.plugin.zsh +++ b/plugins/juju/juju.plugin.zsh @@ -163,10 +163,40 @@ jreld() { juju run "relation-get -r $relid - $2" --unit $2/$3 } +# Return Juju current controller +jcontroller() { + local controller="$(awk '/current-controller/ {print $2}' ~/.local/share/juju/controllers.yaml)" + if [[ -z "$controller" ]]; then + return 1 + fi + + echo $controller + return 0 +} + +# Return Juju current model +jmodel() { + local yqbin="$(whereis yq | awk '{print $2}')" + + if [[ -z "$yqbin" ]]; then + echo "--" + return 1 + fi + + local model="$(yq e ".controllers.$(jcontroller).current-model" < ~/.local/share/juju/models.yaml | cut -d/ -f2)" + + if [[ -z "$model" ]]; then + echo "--" + return 1 + fi + + echo $model + return 0 +} + # Watch juju status, with optional interval (default: 5 sec) wjst() { local interval="${1:-5}" shift $(( $# > 0 )) watch -n "$interval" --color juju status --relations --color "$@" } - From c08b925d282e35ea7bd9a8f4c29de2ece0debb49 Mon Sep 17 00:00:00 2001 From: Michele Bologna Date: Thu, 23 Mar 2023 14:34:43 +0100 Subject: [PATCH 145/321] fix(uninstall): abort uninstall if unable to change shell (#10357) --- tools/uninstall.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/tools/uninstall.sh b/tools/uninstall.sh index 6a0e7b4c..6e3df7ac 100644 --- a/tools/uninstall.sh +++ b/tools/uninstall.sh @@ -1,3 +1,15 @@ +if hash chsh >/dev/null 2>&1 && [ -f ~/.shell.pre-oh-my-zsh ]; then + old_shell=$(cat ~/.shell.pre-oh-my-zsh) + echo "Switching your shell back to '$old_shell':" + if chsh -s "$old_shell"; then + rm -f ~/.shell.pre-oh-my-zsh + else + echo "Could not change default shell. Change it manually by running chsh" + echo "or editing the /etc/passwd file." + exit + fi +fi + read -r -p "Are you sure you want to remove Oh My Zsh? [y/N] " confirmation if [ "$confirmation" != y ] && [ "$confirmation" != Y ]; then echo "Uninstall cancelled" @@ -25,16 +37,5 @@ else echo "No original zsh config found" fi -if hash chsh >/dev/null 2>&1 && [ -f ~/.shell.pre-oh-my-zsh ]; then - old_shell=$(cat ~/.shell.pre-oh-my-zsh) - echo "Switching your shell back to '$old_shell':" - if chsh -s "$old_shell"; then - rm -f ~/.shell.pre-oh-my-zsh - else - echo "Could not change default shell. Change it manually by running chsh" - echo "or editing the /etc/passwd file." - fi -fi - echo "Thanks for trying out Oh My Zsh. It's been uninstalled." echo "Don't forget to restart your terminal!" From 8f6fbe238969ecb22fbdae75450a9f8705c9f979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5vard=20Bartnes?= Date: Tue, 28 Mar 2023 12:50:05 +0200 Subject: [PATCH 146/321] feat(upgrade): add verbosity settings Co-authored-by: Carlo Sala Closes #11574 Closes #11579 --- README.md | 12 +++++++++ lib/cli.zsh | 5 ++-- tools/check_for_upgrade.sh | 3 ++- tools/upgrade.sh | 53 ++++++++++++++++++++++++++++---------- 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 4042c8c2..4f0aeb7b 100644 --- a/README.md +++ b/README.md @@ -317,6 +317,18 @@ zstyle ':omz:update' frequency 7 zstyle ':omz:update' frequency 0 ``` +### Updates verbosity + +You can also limit the update verbosity with the following settings: + +```sh +zstyle ':omz:update' verbose default # default update prompt + +zstyle ':omz:update' verbose minimal # only few lines + +zstyle ':omz:update' verbose silent # only errors +``` + ### Manual Updates If you'd like to update at any point in time (maybe someone just released a new plugin and you don't want to wait a week?) you just need to run: diff --git a/lib/cli.zsh b/lib/cli.zsh index fed00d21..ba3e39eb 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -776,10 +776,11 @@ function _omz::update { local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD) # Run update script + zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default if [[ "$1" != --unattended ]]; then - ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" --interactive || return $? + ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $? else - ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" || return $? + ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -v $verbose_mode || return $? fi # Update last updated file diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index 734714c9..81c371b3 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -95,7 +95,8 @@ function update_last_updated_file() { } function update_ohmyzsh() { - if ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" --interactive; then + zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default + if ZSH="$ZSH" zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode; then update_last_updated_file fi } diff --git a/tools/upgrade.sh b/tools/upgrade.sh index 596a5930..684ad894 100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -12,6 +12,23 @@ esac cd "$ZSH" +verbose_mode="default" +interactive=false + +while getopts "v:i" opt; do + case $opt in + v) + if [[ $OPTARG == default || $OPTARG == minimal || $OPTARG == silent ]]; then + verbose_mode=$OPTARG + else + echo "[oh-my-zsh] update verbosity '$OPTARG' is not valid" + echo "[oh-my-zsh] valid options are 'default', 'minimal' and 'silent'" + fi + ;; + i) interactive=true ;; + esac +done + # Use colors, but only if connected to a terminal # and that terminal supports them. @@ -203,7 +220,9 @@ git checkout -q "$branch" -- || exit 1 last_commit=$(git rev-parse "$branch") # Update Oh My Zsh -printf "${BLUE}%s${RESET}\n" "Updating Oh My Zsh" +if [[ $verbose_mode != silent ]]; then + printf "${BLUE}%s${RESET}\n" "Updating Oh My Zsh" +fi if LANG= git pull --quiet --rebase $remote $branch; then # Check if it was really updated or not if [[ "$(git rev-parse HEAD)" = "$last_commit" ]]; then @@ -215,24 +234,30 @@ if LANG= git pull --quiet --rebase $remote $branch; then git config oh-my-zsh.lastVersion "$last_commit" # Print changelog to the terminal - if [[ "$1" = --interactive ]]; then + if [[ interactive == true && $verbose_mode == default ]] ; then "$ZSH/tools/changelog.sh" HEAD "$last_commit" fi - printf "${BLUE}%s \`${BOLD}%s${RESET}${BLUE}\`${RESET}\n" "You can see the changelog with" "omz changelog" + if [[ $verbose_mode != silent ]]; then + printf "${BLUE}%s \`${BOLD}%s${RESET}${BLUE}\`${RESET}\n" "You can see the changelog with" "omz changelog" + fi fi - printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET - printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET - printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $RAINBOW $RESET - printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET - printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET - printf '%s %s %s %s /____/ %s %s %s %s\n' $RAINBOW $RESET - printf '\n' - printf "${BLUE}%s${RESET}\n\n" "$message" - printf "${BLUE}${BOLD}%s %s${RESET}\n" "To keep up with the latest news and updates, follow us on Twitter:" "$(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)" - printf "${BLUE}${BOLD}%s %s${RESET}\n" "Want to get involved in the community? Join our Discord:" "$(fmt_link "Discord server" https://discord.gg/ohmyzsh)" - printf "${BLUE}${BOLD}%s %s${RESET}\n" "Get your Oh My Zsh swag at:" "$(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)" + if [[ $verbose_mode == default ]]; then + printf '%s %s__ %s %s %s %s %s__ %s\n' $RAINBOW $RESET + printf '%s ____ %s/ /_ %s ____ ___ %s__ __ %s ____ %s_____%s/ /_ %s\n' $RAINBOW $RESET + printf '%s / __ \\%s/ __ \\ %s / __ `__ \\%s/ / / / %s /_ / %s/ ___/%s __ \\ %s\n' $RAINBOW $RESET + printf '%s/ /_/ /%s / / / %s / / / / / /%s /_/ / %s / /_%s(__ )%s / / / %s\n' $RAINBOW $RESET + printf '%s\\____/%s_/ /_/ %s /_/ /_/ /_/%s\\__, / %s /___/%s____/%s_/ /_/ %s\n' $RAINBOW $RESET + printf '%s %s %s %s /____/ %s %s %s %s\n' $RAINBOW $RESET + printf '\n' + printf "${BLUE}%s${RESET}\n\n" "$message" + printf "${BLUE}${BOLD}%s %s${RESET}\n" "To keep up with the latest news and updates, follow us on Twitter:" "$(fmt_link @ohmyzsh https://twitter.com/ohmyzsh)" + printf "${BLUE}${BOLD}%s %s${RESET}\n" "Want to get involved in the community? Join our Discord:" "$(fmt_link "Discord server" https://discord.gg/ohmyzsh)" + printf "${BLUE}${BOLD}%s %s${RESET}\n" "Get your Oh My Zsh swag at:" "$(fmt_link "Planet Argon Shop" https://shop.planetargon.com/collections/oh-my-zsh)" + elif [[ $verbose_mode == minimal ]]; then + printf "${BLUE}%s${RESET}\n" "$message" + fi else ret=$? printf "${RED}%s${RESET}\n" 'There was an error updating. Try again later?' From fcbdc330ff50617c8b84d39ce069cc75df41108f Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 28 Mar 2023 16:55:53 +0200 Subject: [PATCH 147/321] fix(aws): restore accidentally deleted variable Closes #11589 --- plugins/aws/aws.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 0242be97..a379eaa1 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -197,6 +197,7 @@ compctl -K _aws_profiles asp acp aws_change_access_key # AWS prompt function aws_prompt_info() { local _aws_to_show + local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}" if [[ -n $AWS_PROFILE ]];then _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX:=}" fi @@ -211,7 +212,6 @@ if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; th RPROMPT='$(aws_prompt_info)'"$RPROMPT" fi - # Load awscli completions # AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back From 7837ba6a993fb2243b3e69fdbd63b437a8674b4c Mon Sep 17 00:00:00 2001 From: Webpage-gh <70434775+Webpage-gh@users.noreply.github.com> Date: Fri, 31 Mar 2023 13:37:01 +0800 Subject: [PATCH 148/321] fix(installer): don't use `sudo` when user is in Termux (#11591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- tools/install.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/install.sh b/tools/install.sh index f4ef16a0..efdb7d48 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -84,6 +84,11 @@ command_exists() { user_can_sudo() { # Check if sudo is installed command_exists sudo || return 1 + # Termux can't run sudo unless the device is rooted. Either way, `chsh` works + # without sudo, so we can detect it and exit the function early. + case "$PREFIX" in + *com.termux*) return 1 ;; + esac # The following command has 3 parts: # # 1. Run `sudo` with `-v`. Does the following: From b9c4e2e82337594c2899db1f9ca005bb02fe20cd Mon Sep 17 00:00:00 2001 From: Guy Sartorelli <36352093+GuySartorelli@users.noreply.github.com> Date: Fri, 31 Mar 2023 18:49:59 +1300 Subject: [PATCH 149/321] feat(changelog): provide links in changelog (#11578) --- tools/changelog.sh | 98 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 2 deletions(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index a5cc468f..5f7a14d0 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -157,6 +157,89 @@ function parse-commit { fi } +################################ +# SUPPORTS HYPERLINKS FUNCTION # +################################ + +# The code for checking if a terminal supports hyperlinks is copied from install.sh + +# The [ -t 1 ] check only works when the function is not called from +# a subshell (like in `$(...)` or `(...)`, so this hack redefines the +# function at the top level to always return false when stdout is not +# a tty. +if [ -t 1 ]; then + is_tty() { + true + } +else + is_tty() { + false + } +fi + +# This function uses the logic from supports-hyperlinks[1][2], which is +# made by Kat Marchán (@zkat) and licensed under the Apache License 2.0. +# [1] https://github.com/zkat/supports-hyperlinks +# [2] https://crates.io/crates/supports-hyperlinks +# +# Copyright (c) 2021 Kat Marchán +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +supports_hyperlinks() { + # $FORCE_HYPERLINK must be set and be non-zero (this acts as a logic bypass) + if [ -n "$FORCE_HYPERLINK" ]; then + [ "$FORCE_HYPERLINK" != 0 ] + return $? + fi + + # If stdout is not a tty, it doesn't support hyperlinks + is_tty || return 1 + + # DomTerm terminal emulator (domterm.org) + if [ -n "$DOMTERM" ]; then + return 0 + fi + + # VTE-based terminals above v0.50 (Gnome Terminal, Guake, ROXTerm, etc) + if [ -n "$VTE_VERSION" ]; then + [ $VTE_VERSION -ge 5000 ] + return $? + fi + + # If $TERM_PROGRAM is set, these terminals support hyperlinks + case "$TERM_PROGRAM" in + Hyper|iTerm.app|terminology|WezTerm) return 0 ;; + esac + + # kitty supports hyperlinks + if [ "$TERM" = xterm-kitty ]; then + return 0 + fi + + # Windows Terminal also supports hyperlinks + if [ -n "$WT_SESSION" ]; then + return 0 + fi + + # Konsole supports hyperlinks, but it's an opt-in setting that can't be detected + # https://github.com/ohmyzsh/ohmyzsh/issues/10964 + # if [ -n "$KONSOLE_VERSION" ]; then + # return 0 + # fi + + return 1 +} + ############################# # RELEASE CHANGELOG DISPLAY # ############################# @@ -208,7 +291,13 @@ function display-release { local hash="${1:-$hash}" case "$output" in raw) printf '%s' "$hash" ;; - text) printf '\e[33m%s\e[0m' "$hash" ;; # red + text) + local text="\e[33m$hash\e[0m"; # red + if supports_hyperlinks; then + printf "\e]8;;%s\a%s\e]8;;\a" "https://github.com/ohmyzsh/ohmyzsh/commit/$hash" $text; + else + echo $text; + fi ;; md) printf '[`%s`](https://github.com/ohmyzsh/ohmyzsh/commit/%s)' "$hash" "$hash" ;; esac } @@ -272,7 +361,12 @@ function display-release { case "$output" in raw) printf '%s' "$subject" ;; # In text mode, highlight (#) and dim text between `backticks` - text) sed -E $'s|#([0-9]+)|\e[32m#\\1\e[0m|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject" ;; + text) + if supports_hyperlinks; then + sed -E $'s|#([0-9]+)|\e]8;;https://github.com/ohmyzsh/ohmyzsh/issues/\\1\a\e[32m#\\1\e[0m\e]8;;\a|g' <<< "$subject" + else + sed -E $'s|#([0-9]+)|\e[32m#\\1\e[0m|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject" + fi ;; # In markdown mode, link to (#) issues md) sed -E 's|#([0-9]+)|[#\1](https://github.com/ohmyzsh/ohmyzsh/issues/\1)|g' <<< "$subject" ;; esac From cc9913210498e2d527486310f1e8a53b93f55ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 31 Mar 2023 07:51:10 +0200 Subject: [PATCH 150/321] fix(vi-mode): fix check for prompt redisplay on mode change (#11547) --- plugins/vi-mode/vi-mode.plugin.zsh | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh index 9a410c1f..d44be69d 100644 --- a/plugins/vi-mode/vi-mode.plugin.zsh +++ b/plugins/vi-mode/vi-mode.plugin.zsh @@ -43,12 +43,25 @@ function _vi-mode-set-cursor-shape-for-keymap() { printf $'\e[%d q' "${_shape}" } +function _vi-mode-should-reset-prompt() { + # If $VI_MODE_RESET_PROMPT_ON_MODE_CHANGE is unset (default), dynamically + # check whether we're using the prompt to display vi-mode info + if [[ -z "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" ]]; then + [[ "${PS1} ${RPS1}" = *'$(vi_mode_prompt_info)'* ]] + return $? + fi + + # If $VI_MODE_RESET_PROMPT_ON_MODE_CHANGE was manually set, let's check + # if it was specifically set to true or it was disabled with any other value + [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE}" = true ]] +} + # Updates editor information when the keymap changes. function zle-keymap-select() { # update keymap variable for the prompt typeset -g VI_KEYMAP=$KEYMAP - if [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" = true ]]; then + if _vi-mode-should-reset-prompt; then zle reset-prompt zle -R fi @@ -59,10 +72,9 @@ zle -N zle-keymap-select # These "echoti" statements were originally set in lib/key-bindings.zsh # Not sure the best way to extend without overriding. function zle-line-init() { - local prev_vi_keymap - prev_vi_keymap="${VI_KEYMAP:-}" + local prev_vi_keymap="${VI_KEYMAP:-}" typeset -g VI_KEYMAP=main - [[ "$prev_vi_keymap" != 'main' ]] && [[ "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:-}" = true ]] && zle reset-prompt + [[ "$prev_vi_keymap" != 'main' ]] && _vi-mode-should-reset-prompt && zle reset-prompt (( ! ${+terminfo[smkx]} )) || echoti smkx _vi-mode-set-cursor-shape-for-keymap "${VI_KEYMAP}" } @@ -138,13 +150,6 @@ if [[ -z "$MODE_INDICATOR" ]]; then fi function vi_mode_prompt_info() { - # If we're using the prompt to display mode info, and we haven't explicitly - # disabled "reset prompt on mode change", then set it here. - # - # We do that here instead of the `if` statement below because the user may - # set RPS1/RPROMPT to something else in their custom config. - : "${VI_MODE_RESET_PROMPT_ON_MODE_CHANGE:=true}" - echo "${${VI_KEYMAP/vicmd/$MODE_INDICATOR}/(main|viins)/$INSERT_MODE_INDICATOR}" } From 029a6d2de8681d52142129eb8b6ff0f20be9f0a6 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 31 Mar 2023 15:30:19 +0200 Subject: [PATCH 151/321] fix(upgrade): typo in variable check --- tools/upgrade.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/upgrade.sh b/tools/upgrade.sh index 684ad894..d9a372d1 100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -234,7 +234,7 @@ if LANG= git pull --quiet --rebase $remote $branch; then git config oh-my-zsh.lastVersion "$last_commit" # Print changelog to the terminal - if [[ interactive == true && $verbose_mode == default ]] ; then + if [[ $interactive == true && $verbose_mode == default ]]; then "$ZSH/tools/changelog.sh" HEAD "$last_commit" fi From 6ef236dd99f2090b54911f9135d00ac37d6757ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sat, 1 Apr 2023 10:14:18 +0200 Subject: [PATCH 152/321] fix(updater): search for upstream remote if using non-conventional name (#11135) Fixes #11135 --- tools/upgrade.sh | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tools/upgrade.sh b/tools/upgrade.sh index d9a372d1..34ff3f02 100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -1,5 +1,7 @@ #!/usr/bin/env zsh +local ret=0 # exit code + # Protect against running with shells other than zsh if [ -z "$ZSH_VERSION" ]; then exec zsh "$0" "$@" @@ -181,17 +183,23 @@ fi # Update upstream remote to ohmyzsh org git remote -v | while read remote url extra; do case "$url" in - https://github.com/robbyrussell/oh-my-zsh(|.git)) - git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" - break ;; - git@github.com:robbyrussell/oh-my-zsh(|.git)) - git remote set-url "$remote" "git@github.com:ohmyzsh/ohmyzsh.git" - break ;; - # Update out-of-date "unauthenticated git protocol on port 9418" to https git://github.com/robbyrussell/oh-my-zsh(|.git)) - git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" - break ;; + # Update out-of-date "unauthenticated git protocol on port 9418" to https + git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" ;; + https://github.com/robbyrussell/oh-my-zsh(|.git)) + git remote set-url "$remote" "https://github.com/ohmyzsh/ohmyzsh.git" ;; + git@github.com:robbyrussell/oh-my-zsh(|.git)) + git remote set-url "$remote" "git@github.com:ohmyzsh/ohmyzsh.git" ;; + https://github.com/ohmyzsh/ohmyzsh(|.git)) ;; + git@github.com:ohmyzsh/ohmyzsh(|.git)) ;; + *) continue ;; esac + + # If we reach this point we have found the proper ohmyzsh upstream remote. If we don't, + # we'll only update from the set remote if `oh-my-zsh.remote` has been set to a remote, + # as when installing from a fork. + git config --local oh-my-zsh.remote "$remote" + break done # Set git-config values known to fix git errors From 68005b887055ddd1c6d3fd1381b6eb7b786a0a38 Mon Sep 17 00:00:00 2001 From: Saverio Guzzo Date: Sun, 2 Apr 2023 12:54:55 +0200 Subject: [PATCH 153/321] docs(spotify): fix link (#11593) --- plugins/macos/spotify | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/macos/spotify b/plugins/macos/spotify index 491a6068..5fb40517 100644 --- a/plugins/macos/spotify +++ b/plugins/macos/spotify @@ -43,7 +43,7 @@ showAPIHelp() { echo " find music by name. It is very likely you want this feature!"; echo; echo " To get this to work, you need to sign up (or in) and create an 'Application' at:"; - echo " https://developer.spotify.com/my-applications/#!/applications/create"; + echo " https://developer.spotify.com/dashboard/create"; echo; echo " Once you've created an application, find the 'Client ID' and 'Client Secret'"; echo " values, and enter them into your shpotify config file at '${USER_CONFIG_FILE}'"; From f7d903f3a31567f326d0f8ec2414722d0e3b992a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 2 Apr 2023 13:40:49 +0200 Subject: [PATCH 154/321] fix(vi-mode): fix cursor change on visual mode (#11586) Fixes #11586 --- plugins/vi-mode/vi-mode.plugin.zsh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh index d44be69d..cc9817a7 100644 --- a/plugins/vi-mode/vi-mode.plugin.zsh +++ b/plugins/vi-mode/vi-mode.plugin.zsh @@ -43,6 +43,13 @@ function _vi-mode-set-cursor-shape-for-keymap() { printf $'\e[%d q' "${_shape}" } +function _visual-mode { + typeset -g VI_KEYMAP=visual + _vi-mode-set-cursor-shape-for-keymap "$VI_KEYMAP" + zle .visual-mode +} +zle -N visual-mode _visual-mode + function _vi-mode-should-reset-prompt() { # If $VI_MODE_RESET_PROMPT_ON_MODE_CHANGE is unset (default), dynamically # check whether we're using the prompt to display vi-mode info From 75405b7b0ae03a1fdf2fdb172d2a50cd5f570162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 2 Apr 2023 14:28:01 +0200 Subject: [PATCH 155/321] feat(extract): always extract files into its own folder (#11596) --- plugins/extract/extract.plugin.zsh | 84 ++++++++++++++++++------------ 1 file changed, 51 insertions(+), 33 deletions(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 7b7a2fa4..c416f49c 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -29,61 +29,79 @@ EOF local success=0 local extract_dir="${1:t:r}" local file="$1" full_path="${1:A}" + + # Create an extraction directory based on the file name + command mkdir -p "$extract_dir" + builtin cd -q "$extract_dir" + case "${file:l}" in (*.tar.gz|*.tgz) - (( $+commands[pigz] )) && { tar -I pigz -xvf "$file" } || tar zxvf "$file" ;; + (( $+commands[pigz] )) && { tar -I pigz -xvf "$full_path" } || tar zxvf "$full_path" ;; (*.tar.bz2|*.tbz|*.tbz2) - (( $+commands[pbzip2] )) && { tar -I pbzip2 -xvf "$file" } || tar xvjf "$file" ;; + (( $+commands[pbzip2] )) && { tar -I pbzip2 -xvf "$full_path" } || tar xvjf "$full_path" ;; (*.tar.xz|*.txz) - (( $+commands[pixz] )) && { tar -I pixz -xvf "$file" } || { + (( $+commands[pixz] )) && { tar -I pixz -xvf "$full_path" } || { tar --xz --help &> /dev/null \ - && tar --xz -xvf "$file" \ - || xzcat "$file" | tar xvf - } ;; + && tar --xz -xvf "$full_path" \ + || xzcat "$full_path" | tar xvf - } ;; (*.tar.zma|*.tlz) tar --lzma --help &> /dev/null \ - && tar --lzma -xvf "$file" \ - || lzcat "$file" | tar xvf - ;; + && tar --lzma -xvf "$full_path" \ + || lzcat "$full_path" | tar xvf - ;; (*.tar.zst|*.tzst) tar --zstd --help &> /dev/null \ - && tar --zstd -xvf "$file" \ - || zstdcat "$file" | tar xvf - ;; - (*.tar) tar xvf "$file" ;; - (*.tar.lz) (( $+commands[lzip] )) && tar xvf "$file" ;; - (*.tar.lz4) lz4 -c -d "$file" | tar xvf - ;; - (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$file" ;; - (*.gz) (( $+commands[pigz] )) && pigz -dk "$file" || gunzip -k "$file" ;; - (*.bz2) bunzip2 "$file" ;; - (*.xz) unxz "$file" ;; - (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$file" ;; - (*.lz4) lz4 -d "$file" ;; - (*.lzma) unlzma "$file" ;; - (*.z) uncompress "$file" ;; - (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$file" -d "$extract_dir" ;; - (*.rar) unrar x -ad "$file" ;; + && tar --zstd -xvf "$full_path" \ + || zstdcat "$full_path" | tar xvf - ;; + (*.tar) tar xvf "$full_path" ;; + (*.tar.lz) (( $+commands[lzip] )) && tar xvf "$full_path" ;; + (*.tar.lz4) lz4 -c -d "$full_path" | tar xvf - ;; + (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$full_path" ;; + (*.gz) (( $+commands[pigz] )) && pigz -dk "$full_path" || gunzip -k "$full_path" ;; + (*.bz2) bunzip2 "$full_path" ;; + (*.xz) unxz "$full_path" ;; + (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$full_path" ;; + (*.lz4) lz4 -d "$full_path" ;; + (*.lzma) unlzma "$full_path" ;; + (*.z) uncompress "$full_path" ;; + (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$full_path" ;; + (*.rar) unrar x -ad "$full_path" ;; (*.rpm) - command mkdir -p "$extract_dir" && builtin cd -q "$extract_dir" \ - && rpm2cpio "$full_path" | cpio --quiet -id ;; - (*.7z) 7za x "$file" ;; + rpm2cpio "$full_path" | cpio --quiet -id ;; + (*.7z) 7za x "$full_path" ;; (*.deb) - command mkdir -p "$extract_dir/control" "$extract_dir/data" - builtin cd -q "$extract_dir"; ar vx "$full_path" > /dev/null + command mkdir -p "control" "data" + ar vx "$full_path" > /dev/null builtin cd -q control; extract ../control.tar.* builtin cd -q ../data; extract ../data.tar.* builtin cd -q ..; command rm *.tar.* debian-binary ;; - (*.zst) unzstd "$file" ;; - (*.cab) cabextract -d "$extract_dir" "$file" ;; - (*.cpio|*.obscpio) cpio -idmvF "$file" ;; - (*.zpaq) zpaq x "$file" ;; + (*.zst) unzstd "$full_path" ;; + (*.cab) cabextract "$full_path" ;; + (*.cpio|*.obscpio) cpio -idmvF "$full_path" ;; + (*.zpaq) zpaq x "$full_path" ;; (*) echo "extract: '$file' cannot be extracted" >&2 success=1 ;; esac (( success = success > 0 ? success : $? )) - (( success == 0 && remove_archive == 0 )) && rm "$full_path" + (( success == 0 && remove_archive == 0 )) && command rm "$full_path" shift - # Go back to original working directory in case we ran cd previously + # Go back to original working directory + # and remove extraction directory if there was an error builtin cd -q "$pwd" + (( success > 0 )) && command rm -r "$extract_dir" + + # If content of extract dir is a single directory, move its contents up + # Glob flags: + # - D: include files starting with . + # - N: no error if directory is empty + # - Y2: at most give 2 files + local -a content + content=("${extract_dir}"/*(DNY2)) + if [[ ${#content} -eq 1 && -d "${content[1]}" ]]; then + command mv -f "${content[1]}" . + command rmdir "$extract_dir" + fi done } From d47e1d65f66f9bb2e7a96ba58797b33f0e91a623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 2 Apr 2023 16:33:54 +0200 Subject: [PATCH 156/321] fix(extract): safely remove extract directory The previous code would remove the extract directory if the command failed. This could be bad because we're not checking if the extract directory already existed (since we're using `mkdir -p`), so it could be possible that the extract operation failed, and we'd be removing a directory that already existed and had files in it. This change only removes the directory if there are no files in it, regardless of whether the extract operation was successful or not. This is much safer. --- plugins/extract/extract.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index c416f49c..40e67575 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -88,9 +88,7 @@ EOF shift # Go back to original working directory - # and remove extraction directory if there was an error builtin cd -q "$pwd" - (( success > 0 )) && command rm -r "$extract_dir" # If content of extract dir is a single directory, move its contents up # Glob flags: @@ -102,6 +100,8 @@ EOF if [[ ${#content} -eq 1 && -d "${content[1]}" ]]; then command mv -f "${content[1]}" . command rmdir "$extract_dir" + elif [[ ${#content} -eq 0 ]]; then + command rmdir "$extract_dir" fi done } From f8bf88edca7a3246e065f13cefac2c5f1ab396e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 3 Apr 2023 22:21:49 +0200 Subject: [PATCH 157/321] chore(installer): remove words triggering false positives in antiviruses --- tools/install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/install.sh b/tools/install.sh index efdb7d48..fcfbcf77 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -84,8 +84,7 @@ command_exists() { user_can_sudo() { # Check if sudo is installed command_exists sudo || return 1 - # Termux can't run sudo unless the device is rooted. Either way, `chsh` works - # without sudo, so we can detect it and exit the function early. + # Termux can't run sudo, so we can detect it and exit the function early. case "$PREFIX" in *com.termux*) return 1 ;; esac From 1ad167dfac325a9f92e0693c70d0ab3f7c4c574b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 3 Apr 2023 23:14:36 +0200 Subject: [PATCH 158/321] feat(init)!: allow turning off aliases for libs and plugins (#11550) BREAKING CHANGE: the previous zstyle setting to disable `lib/directories.zsh` aliases has been changed to the new syntax: `zstyle ':omz:lib:directories' aliases no`. See https://github.com/ohmyzsh/ohmyzsh#skip-aliases to see other ways you can use this setting. Co-authored-by: Carlo Sala --- README.md | 54 ++++++++++++++++++++++++++++++++++++++++----- lib/directories.zsh | 6 ----- oh-my-zsh.sh | 45 ++++++++++++++++++++++++++++++------- 3 files changed, 86 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 4f0aeb7b..556d4c8c 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,9 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi - [Manual Installation](#manual-installation) - [Installation Problems](#installation-problems) - [Custom Plugins and Themes](#custom-plugins-and-themes) + - [Skip aliases](#skip-aliases) - [Getting Updates](#getting-updates) + - [Updates verbosity](#updates-verbosity) - [Manual Updates](#manual-updates) - [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh) - [How do I contribute to Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh) @@ -276,16 +278,58 @@ If you have many functions that go well together, you can put them as a `XYZ.plu If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. -### Remove directories aliases +### Skip aliases -If you want to skip ohmyzsh default -[directories aliases](https://github.com/ohmyzsh/ohmyzsh/blob/master/lib/directories.zsh) you can add the -following snippet to your `zshrc`, before loading `oh-my-zsh.sh` script: + -```zsh +If you want to skip default Oh My Zsh aliases (those defined in `lib/*` files) or plugin aliases, +you can use the settings below in your `~/.zshrc` file, **before Oh My Zsh is loaded**. Note that +there are many different ways to skip aliases, depending on your needs. + +```sh +# Skip all aliases, in lib files and enabled plugins +zstyle ':omz:*' aliases no + +# Skip all aliases in lib files +zstyle ':omz:lib:*' aliases no +# Skip only aliases defined in the directories.zsh lib file +zstyle ':omz:lib:directories' aliases no + +# Skip all plugin aliases +zstyle ':omz:plugins:*' aliases no +# Skip only the aliases from the git plugin +zstyle ':omz:plugins:git' aliases no +``` + +You can combine these in other ways taking into account that more specific scopes takes precedence: + +```sh +# Skip all plugin aliases, except for the git plugin +zstyle ':omz:plugins:*' aliases no +zstyle ':omz:plugins:git' aliases yes +``` + +A previous version of this feature was using the setting below, which has been removed: + +```sh zstyle ':omz:directories' aliases no ``` +Instead, you can now use the following: + +```sh +zstyle ':omz:lib:directories' aliases no +``` + +#### Notice + +> This feature is currently in a testing phase and it may be subject to change in the future. +> It is also not currently compatible with plugin managers such as zpm or zinit, which don't +> source the init script (`oh-my-zsh.sh`) where this feature is implemented in. + +> It is also not currently aware of "aliases" that are defined as functions. Example of such +> are `gccd`, `ggf`, or `ggl` functions from the git plugin. + ## Getting Updates By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**: diff --git a/lib/directories.zsh b/lib/directories.zsh index 13b680c1..8927a56a 100644 --- a/lib/directories.zsh +++ b/lib/directories.zsh @@ -4,12 +4,6 @@ setopt auto_pushd setopt pushd_ignore_dups setopt pushdminus -# add (uncommented): -# zstyle ':omz:directories' aliases no -# to your `zshrc` before loading `oh-my-zsh.sh` -# to disable the following aliases and functions - -zstyle -T ':omz:directories' aliases || return 0 alias -g ...='../..' alias -g ....='../../..' diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index 363cfca8..20d2e354 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -146,22 +146,51 @@ if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock" fi +_omz_source() { + local context filepath="$1" + + # Construct zstyle context based on path + case "$filepath" in + lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name + plugins/*) context="plugins:${filepath:h2:t}" ;; # :h2 = plugins/plugin_name, :t = plugin_name + esac + + local disable_aliases=0 + zstyle -T ":omz:${context}" aliases || disable_aliases=1 + + # Back up alias names prior to sourcing + local -a aliases_pre galiases_pre + if (( disable_aliases )); then + aliases_pre=("${(@k)aliases}") + galiases_pre=("${(@k)galiases}") + fi + + # Source file from $ZSH_CUSTOM if it exists, otherwise from $ZSH + if [[ -f "$ZSH_CUSTOM/$filepath" ]]; then + source "$ZSH_CUSTOM/$filepath" + elif [[ -f "$ZSH/$filepath" ]]; then + source "$ZSH/$filepath" + fi + + # Unset all aliases that don't appear in the backed up list of aliases + if (( disable_aliases )); then + local -a disabled + # ${var:|array} gets the list of items in var not in array + disabled=("${(@k)aliases:|aliases_pre}" "${(@k)galiases:|galiases_pre}") + (( $#disabled == 0 )) || unalias "${(@)disabled}" + fi +} + # Load all of the config files in ~/oh-my-zsh that end in .zsh # TIP: Add files you don't want in git to .gitignore for config_file ("$ZSH"/lib/*.zsh); do - custom_config_file="$ZSH_CUSTOM/lib/${config_file:t}" - [[ -f "$custom_config_file" ]] && config_file="$custom_config_file" - source "$config_file" + _omz_source "${config_file:t2}" done unset custom_config_file # Load all of the plugins that were defined in ~/.zshrc for plugin ($plugins); do - if [[ -f "$ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh" ]]; then - source "$ZSH_CUSTOM/plugins/$plugin/$plugin.plugin.zsh" - elif [[ -f "$ZSH/plugins/$plugin/$plugin.plugin.zsh" ]]; then - source "$ZSH/plugins/$plugin/$plugin.plugin.zsh" - fi + _omz_source "plugins/$plugin/$plugin.plugin.zsh" done unset plugin From c7bb88f9ad3eb742aecca2e36b615819cead10f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 3 Apr 2023 23:27:14 +0200 Subject: [PATCH 159/321] fix(changelog): ignore lines containing whitespace in breaking change commits --- tools/changelog.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/changelog.sh b/tools/changelog.sh index 5f7a14d0..1af74e42 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -106,6 +106,9 @@ function parse-commit { message="${match[1]}" # remove CR characters (might be inserted in GitHub UI commit description form) message="${message//$'\r'/}" + # remove lines containing only whitespace + local nlnl=$'\n\n' + message="${message//$'\n'[[:space:]]##$'\n'/$nlnl}" # skip next paragraphs (separated by two newlines or more) message="${message%%$'\n\n'*}" # ... and replace newlines with spaces From 9233ef75f28423d147a2f9f64a45a77b1886ee5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 3 Apr 2023 23:36:44 +0200 Subject: [PATCH 160/321] fix(init): don't use digits in parameter modifiers for compatibility (#11598) Digit modifiers were introduced in zsh 5.7.1 [1]. This commit uses readily available alternatives for backwards compatibility. [1] https://github.com/zsh-users/zsh/commit/b8dc5a7f6d Fixes #11598 --- oh-my-zsh.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index 20d2e354..e047d483 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -151,8 +151,8 @@ _omz_source() { # Construct zstyle context based on path case "$filepath" in - lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name - plugins/*) context="plugins:${filepath:h2:t}" ;; # :h2 = plugins/plugin_name, :t = plugin_name + lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name + plugins/*) context="plugins:${filepath:h:t}" ;; # :h = plugins/plugin_name, :t = plugin_name esac local disable_aliases=0 @@ -184,7 +184,7 @@ _omz_source() { # Load all of the config files in ~/oh-my-zsh that end in .zsh # TIP: Add files you don't want in git to .gitignore for config_file ("$ZSH"/lib/*.zsh); do - _omz_source "${config_file:t2}" + _omz_source "lib/${config_file:t}" done unset custom_config_file From 8d23fbd6964b8446bbc73ff04507362d1fd49eb5 Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Tue, 4 Apr 2023 16:47:13 +0200 Subject: [PATCH 161/321] feat(termsupport): add contour terminal (#11599) Signed-off-by: Christian Parpart --- lib/termsupport.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 80ca7ef7..5bc41876 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -17,7 +17,7 @@ function title { : ${2=$1} case "$TERM" in - cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot) + cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot|contour*) print -Pn "\e]2;${2:q}\a" # set window name print -Pn "\e]1;${1:q}\a" # set tab name ;; From 33aadeced0bf17b8abc7d680b424de7c5e71dd45 Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Tue, 4 Apr 2023 17:52:16 -0400 Subject: [PATCH 162/321] feat(term_tab): add support for macOS (#11391) --- plugins/term_tab/term_tab.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/term_tab/term_tab.plugin.zsh b/plugins/term_tab/term_tab.plugin.zsh index 1b612df6..89acd910 100644 --- a/plugins/term_tab/term_tab.plugin.zsh +++ b/plugins/term_tab/term_tab.plugin.zsh @@ -28,6 +28,7 @@ function _term_list(){ case $OSTYPE in solaris*) dirs=( ${(M)${${(f)"$(pgrep -U $UID -x zsh|xargs pwdx)"}:#$$:*}%%/*} ) ;; linux*) dirs=( /proc/${^$(pidof zsh):#$$}/cwd(N:A) ) ;; + darwin*) dirs=( $( lsof -d cwd -c zsh -a -w -Fn | sed -n 's/^n//p' ) ) ;; esac dirs=( ${(D)dirs} ) From 25c2c3a4683be60c3526858be960ee6ce1249245 Mon Sep 17 00:00:00 2001 From: Alexander Schlarb Date: Sun, 16 May 2021 18:58:38 +0200 Subject: [PATCH 163/321] feat(lib): send OSC 7 on directory change for more supported terminals (#9914) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously this was only emitted on macOS with Apple's Terminal.app (and compatible clones like iTerm2), but it is used by other terminal emulators as well to obtain the actual current working directory wiht symlinks intact. All non-supporting terminal emulators tested gracefully ignored this value, so emit this on these as well in case they (or some other app masquarading as them) add future support for this value. Closes #9914 Co-authored-by: Marc Cornellà --- lib/termsupport.zsh | 70 ++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 5bc41876..cf8f0874 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -109,28 +109,52 @@ if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then add-zsh-hook preexec omz_termsupport_preexec fi -# Keep Apple Terminal.app's current working directory updated -# Based on this answer: https://superuser.com/a/315029 -# With extra fixes to handle multibyte chars and non-UTF-8 locales +# Keep terminal emulator's current working directory correct, +# even if the current working directory path contains symbolic links +# +# References: +# - Apple's Terminal.app: https://superuser.com/a/315029 +# - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost) +# - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1 +# - libvte (gnome-terminal, mate-terminal, …): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14 +# Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code +# +# As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC. -if [[ "$TERM_PROGRAM" == "Apple_Terminal" ]] && [[ -z "$INSIDE_EMACS" ]]; then - # Emits the control sequence to notify Terminal.app of the cwd - # Identifies the directory using a file: URI scheme, including - # the host name to disambiguate local vs. remote paths. - function update_terminalapp_cwd() { - emulate -L zsh - - # Percent-encode the host and path names. - local URL_HOST URL_PATH - URL_HOST="$(omz_urlencode -P $HOST)" || return 1 - URL_PATH="$(omz_urlencode -P $PWD)" || return 1 - - # Undocumented Terminal.app-specific control sequence - printf '\e]7;%s\a' "file://$URL_HOST$URL_PATH" - } - - # Use a precmd hook instead of a chpwd hook to avoid contaminating output - add-zsh-hook precmd update_terminalapp_cwd - # Run once to get initial cwd set - update_terminalapp_cwd +# Don't define the function if we're inside Emacs +if [[ -n "$INSIDE_EMACS" ]]; then + return fi + +# Don't define the function if we're in an unsupported terminal +case "$TERM" in + # all of these either process OSC 7 correctly or ignore entirely + xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty|screen*|tmux*) ;; + contour*|foot*) ;; + *) + # Terminal.app and iTerm2 process OSC 7 correctly + case "$TERM_PROGRAM" in + Apple_Terminal|iTerm.app) ;; + *) return ;; + esac ;; +esac + +# Emits the control sequence to notify many terminal emulators +# of the cwd +# +# Identifies the directory using a file: URI scheme, including +# the host name to disambiguate local vs. remote paths. +function omz_termsupport_cwd { + # Percent-encode the host and path names. + local URL_HOST URL_PATH + URL_HOST="$(omz_urlencode -P $HOST)" || return 1 + URL_PATH="$(omz_urlencode -P $PWD)" || return 1 + + # common control sequence (OSC 7) to set current host and path + printf "\e]7;%s\a" "file://${URL_HOST}${URL_PATH}" +} + +# Use a precmd hook instead of a chpwd hook to avoid contaminating output +# i.e. when a script or function changes directory without `cd -q`, chpwd +# will be called the output may be swallowed by the script or function. +add-zsh-hook precmd omz_termsupport_cwd From cf0c80049288d1029aee824bf975016c4201a3ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20M?= Date: Thu, 6 Apr 2023 15:11:52 +0200 Subject: [PATCH 164/321] feat(toolbox)!: rename and add aliases (#11580) --- plugins/toolbox/README.md | 3 ++- plugins/toolbox/toolbox.plugin.zsh | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/toolbox/README.md b/plugins/toolbox/README.md index abaca31f..bc04a906 100644 --- a/plugins/toolbox/README.md +++ b/plugins/toolbox/README.md @@ -22,4 +22,5 @@ RPROMPT='$(toolbox_prompt_info)' | Alias | Command | Description | |-------|----------------------|----------------------------------------| -| tb | `toolbox enter` | Enters the toolbox environment | +| tbe | `toolbox enter` | Enters the toolbox environment | +| tbr | `toolbox run` | Run a command in an existing toolbox | diff --git a/plugins/toolbox/toolbox.plugin.zsh b/plugins/toolbox/toolbox.plugin.zsh index d24d6d39..377e498c 100644 --- a/plugins/toolbox/toolbox.plugin.zsh +++ b/plugins/toolbox/toolbox.plugin.zsh @@ -2,4 +2,5 @@ function toolbox_prompt_info() { [[ -f /run/.toolboxenv ]] && echo "⬢" } -alias tb="toolbox enter" +alias tbe="toolbox enter" +alias tbr="toolbox run" From 49d34d00cdaf132f318700398bf42120ff1af8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 6 Apr 2023 21:06:16 +0200 Subject: [PATCH 165/321] fix(extract): fix conflict if compressed file has a folder of the same name This change fixes the case where the compressed file (e.g. tools.tgz) only contains a folder with the same name (e.g. tools) in its root folder. tools.tgz: |- tools |- fileA.txt |- fileB.txt \- fileC.txt In that case, the "smart" folder creation mechanism will extract the files in a folder "tools", and this extraction folder will contain a single folder with the same name. Before this fix, the tool would try to move out the inside folder to the parent one, but there would already be a folder named "tools", so it would generate a conflict. This change first renames the inside folder to a random string, and only then it is moved outside and the old extraction folder is deleted. --- plugins/extract/extract.plugin.zsh | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 40e67575..34c08065 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -98,8 +98,22 @@ EOF local -a content content=("${extract_dir}"/*(DNY2)) if [[ ${#content} -eq 1 && -d "${content[1]}" ]]; then - command mv -f "${content[1]}" . - command rmdir "$extract_dir" + # The extracted folder (${content[1]}) may have the same name as $extract_dir + # If so, we need to rename it to avoid conflicts in a 3-step process + # + # 1. Move and rename the extracted folder to a temporary random name + # 2. Delete the empty folder + # 3. Rename the extracted folder to the original name + if [[ "${content[1]:t}" == "$extract_dir" ]]; then + # =(:) gives /tmp/zsh, with :t it gives zsh + local tmp_dir==(:); tmp_dir="${tmp_dir:t}" + command mv -f "${content[1]}" "$tmp_dir" \ + && command rmdir "$extract_dir" \ + && command mv -f "$tmp_dir" "$extract_dir" + else + command mv -f "${content[1]}" . \ + && command rmdir "$extract_dir" + fi elif [[ ${#content} -eq 0 ]]; then command rmdir "$extract_dir" fi From 01c82c381d90f10239908ace41df9532c8c45495 Mon Sep 17 00:00:00 2001 From: Alexander Huynh Date: Fri, 7 Apr 2023 07:35:12 -0400 Subject: [PATCH 166/321] fix(jump): even spacing between marks (#11601) --- plugins/jump/jump.plugin.zsh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/jump/jump.plugin.zsh b/plugins/jump/jump.plugin.zsh index c2da1144..829c9d9c 100644 --- a/plugins/jump/jump.plugin.zsh +++ b/plugins/jump/jump.plugin.zsh @@ -35,12 +35,11 @@ marks() { max=${#link:t} fi done - local printf_markname_template="$(printf -- "%%%us " "$max")" + local printf_markname_template="$(printf -- "%%%us" "$max")" for link in $MARKPATH/{,.}*(@N); do - local markname="$fg[cyan]${link:t}$reset_color" + local markname="$fg[cyan]$(printf -- "$printf_markname_template" "${link:t}")$reset_color" local markpath="$fg[blue]$(readlink $link)$reset_color" - printf -- "$printf_markname_template" "$markname" - printf -- "-> %s\n" "$markpath" + printf -- "%s -> %s\n" "$markname" "$markpath" done } From 9b1ef262bcc8d47a6d20b4efc673557560df6647 Mon Sep 17 00:00:00 2001 From: deimosian Date: Fri, 7 Apr 2023 11:43:45 +0000 Subject: [PATCH 167/321] feat(archlinux): unify `upgrade` function (#11597) Co-authored-by: Carlo Sala --- plugins/archlinux/archlinux.plugin.zsh | 31 +++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index 4f136477..e3b1b126 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/plugins/archlinux/archlinux.plugin.zsh @@ -23,7 +23,6 @@ alias pacfiles='pacman -F' alias pacls='pacman -Ql' alias pacown='pacman -Qo' alias pacupd="sudo pacman -Sy" -alias upgrade='sudo pacman -Syu' function paclist() { # Based on https://bbs.archlinux.org/viewtopic.php?id=93683 @@ -109,7 +108,6 @@ if (( $+commands[aura] )); then alias auupd="sudo aura -Sy" alias auupg='sudo sh -c "aura -Syu && aura -Au"' alias ausu='sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"' - alias upgrade='sudo aura -Syu' # extra bonus specially for aura alias auown="aura -Qqo" @@ -136,7 +134,6 @@ if (( $+commands[pacaur] )); then alias painsd='pacaur -S --asdeps' alias pamir='pacaur -Syy' alias paupd="pacaur -Sy" - alias upgrade='pacaur -Syu' fi if (( $+commands[trizen] )); then @@ -158,7 +155,6 @@ if (( $+commands[trizen] )); then alias trinsd='trizen -S --asdeps' alias trmir='trizen -Syy' alias trupd="trizen -Sy" - alias upgrade='trizen -Syu' fi if (( $+commands[yay] )); then @@ -180,5 +176,30 @@ if (( $+commands[yay] )); then alias yainsd='yay -S --asdeps' alias yamir='yay -Syy' alias yaupd="yay -Sy" - alias upgrade='yay -Syu' fi + +# Check Arch Linux PGP Keyring before System Upgrade to prevent failure. +function upgrade() { + echo "[oh-my-zsh] Checking Arch Linux PGP Keyring" + local installedver="$(sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')" + local currentver="$(sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')" + if [ $installedver != $currentver ]; then + echo "[oh-my-zsh] Arch Linux PGP Keyring is out of date." + echo "[oh-my-zsh] Updating before full system upgrade." + sudo pacman -Syu --needed --noconfirm archlinux-keyring + else + echo "[oh-my-zsh] Arch Linux PGP Keyring is up to date." + fi + echo "[oh-mh-zsh] Proceeding with full system upgrade." + if (( $+commands[yay] )); then + yay -Syu + elif (( $+commands[trizen] )); then + trizen -Syu + elif (( $+commands[pacaur] )); then + pacaur -Syu + elif (( $+commands[aura] )); then + sudo aura -Syu + else + sudo pacman -Syu + fi +} From e906a3130eb5031a2c82d9187ea17387881631db Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 8 Apr 2023 11:13:30 +0200 Subject: [PATCH 168/321] fix(azure): look properly for azure config file Closes #11606 --- plugins/azure/azure.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/azure/azure.plugin.zsh b/plugins/azure/azure.plugin.zsh index 51b54dbc..8fec3c1f 100644 --- a/plugins/azure/azure.plugin.zsh +++ b/plugins/azure/azure.plugin.zsh @@ -18,10 +18,10 @@ compctl -K _az_subscriptions azss # Azure prompt function azure_prompt_info() { - [[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}" ]] && return + [[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json" ]] && return # azgs is too expensive, if we have jq, we enable the prompt (( $+commands[jq] )) || return 1 - azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}) + azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json") echo "${ZSH_THEME_AZURE_PREFIX:=}" } From ad99f0c164111fa3cfcbfc5b9cda321800541936 Mon Sep 17 00:00:00 2001 From: Aleks Date: Sat, 8 Apr 2023 13:36:54 +0200 Subject: [PATCH 169/321] feat(git): add merge squash alias (`gms`) (#10937) --- plugins/git/README.md | 1 + plugins/git/git.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 0895ce39..f87d3fbc 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -116,6 +116,7 @@ plugins=(... git) | gloga | git log --oneline --decorate --graph --all | | glp | git log --pretty=\ | | gm | git merge | +| gms | git merge --squash | | gmom | git merge origin/$(git_main_branch) | | gmtl | git mergetool --no-prompt | | gmtlvim | git mergetool --no-prompt --tool=vimdiff | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index ed17436e..3c8d53c8 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -237,6 +237,7 @@ alias gmtl='git mergetool --no-prompt' alias gmtlvim='git mergetool --no-prompt --tool=vimdiff' alias gmum='git merge upstream/$(git_main_branch)' alias gma='git merge --abort' +alias gms="git merge --squash" alias gp='git push' alias gpd='git push --dry-run' From 90ec2d1a68049d8b7e57b87c3661d8cacf54655c Mon Sep 17 00:00:00 2001 From: deimosian Date: Sun, 9 Apr 2023 04:24:55 -0400 Subject: [PATCH 170/321] fix(archlinux): keyring update function (#11607) --- plugins/archlinux/archlinux.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index e3b1b126..ce7bfdf2 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/plugins/archlinux/archlinux.plugin.zsh @@ -186,7 +186,7 @@ function upgrade() { if [ $installedver != $currentver ]; then echo "[oh-my-zsh] Arch Linux PGP Keyring is out of date." echo "[oh-my-zsh] Updating before full system upgrade." - sudo pacman -Syu --needed --noconfirm archlinux-keyring + sudo pacman -Sy --needed --noconfirm archlinux-keyring else echo "[oh-my-zsh] Arch Linux PGP Keyring is up to date." fi From 4586808f86bf3bfdf97685380472b63597ce43c0 Mon Sep 17 00:00:00 2001 From: deimosian Date: Sun, 9 Apr 2023 06:58:38 -0400 Subject: [PATCH 171/321] feat(archlinux): improve update function messages (#11608) --- plugins/archlinux/archlinux.plugin.zsh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index ce7bfdf2..da170f48 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/plugins/archlinux/archlinux.plugin.zsh @@ -180,17 +180,17 @@ fi # Check Arch Linux PGP Keyring before System Upgrade to prevent failure. function upgrade() { - echo "[oh-my-zsh] Checking Arch Linux PGP Keyring" + echo ":: Checking Arch Linux PGP Keyring..." local installedver="$(sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')" local currentver="$(sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')" if [ $installedver != $currentver ]; then - echo "[oh-my-zsh] Arch Linux PGP Keyring is out of date." - echo "[oh-my-zsh] Updating before full system upgrade." + echo " Arch Linux PGP Keyring is out of date." + echo " Updating before full system upgrade." sudo pacman -Sy --needed --noconfirm archlinux-keyring else - echo "[oh-my-zsh] Arch Linux PGP Keyring is up to date." + echo " Arch Linux PGP Keyring is up to date." + echo " Proceeding with full system upgrade." fi - echo "[oh-mh-zsh] Proceeding with full system upgrade." if (( $+commands[yay] )); then yay -Syu elif (( $+commands[trizen] )); then From b4f9698733d7b29cc495e649e26fd6c3a5dcfcae Mon Sep 17 00:00:00 2001 From: Josh McKinney Date: Tue, 11 Apr 2023 01:41:00 -0700 Subject: [PATCH 172/321] docs(ssh-agent): macOS and p10k advices (#11612) --- plugins/ssh-agent/README.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/plugins/ssh-agent/README.md b/plugins/ssh-agent/README.md index fa6a996d..8c118e65 100644 --- a/plugins/ssh-agent/README.md +++ b/plugins/ssh-agent/README.md @@ -99,6 +99,33 @@ ssh-add -K -c -a /run/user/1000/ssh-auth For valid `ssh-add` arguments run `ssh-add --help` or `man ssh-add`. +### Powerline 10k specific settings + +Powerline10k has an instant prompt setting that doesn't like when this plugin +writes to the console. Consider using the following settings if you're using +p10k (documented above): + +``` +zstyle :omz:plugins:ssh-agent quiet yes +zstyle :omz:plugins:ssh-agent lazy yes +``` + +### macOS specific settings + +macOS supports using passphrases stored in the keychain when adding identities +to the ssh-agent. + +``` +ssh-add --apple-use-keychain ~/.ssh/id_rsa ... +``` + + +This plugin can be configured to use the keychain when loading using the following: + +``` +zstyle :omz:plugins:ssh-agent ssh-add-args --apple-load-keychain +``` + ## Credits Based on code from Joseph M. Reagle: https://www.cygwin.com/ml/cygwin/2001-06/msg00537.html From bd5ebba834c53e730671d9d24d93eb98b812a579 Mon Sep 17 00:00:00 2001 From: Eddie Romanov <81505200+SnoopDraugg@users.noreply.github.com> Date: Sun, 16 Apr 2023 03:49:04 -0400 Subject: [PATCH 173/321] feat(pipenv): add pupd alias (#11616) --- plugins/pipenv/README.md | 1 + plugins/pipenv/pipenv.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/pipenv/README.md b/plugins/pipenv/README.md index ab1c1e44..4329feb3 100644 --- a/plugins/pipenv/README.md +++ b/plugins/pipenv/README.md @@ -23,6 +23,7 @@ This plugin provides some features to simplify the use of Pipenv while working o - `psh` is aliased to `pipenv shell` - `psy` is aliased to `pipenv sync` - `pu` is aliased to `pipenv uninstall` + - `pupd` is aliased to `pipenv update` - `pwh` is aliased to `pipenv --where` - `pvenv` is aliased to `pipenv --venv` - `ppy` is aliased to `pipenv --py` diff --git a/plugins/pipenv/pipenv.plugin.zsh b/plugins/pipenv/pipenv.plugin.zsh index 244bd6b7..22d1a313 100644 --- a/plugins/pipenv/pipenv.plugin.zsh +++ b/plugins/pipenv/pipenv.plugin.zsh @@ -47,6 +47,7 @@ alias prun="pipenv run" alias psh="pipenv shell" alias psy="pipenv sync" alias pu="pipenv uninstall" +alias pupd="pipenv update" alias pwh="pipenv --where" alias pvenv="pipenv --venv" alias ppy="pipenv --py" From d889eca72633b7a66d6c832736a5460c5f1a1833 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 17 Apr 2023 20:09:30 +0200 Subject: [PATCH 174/321] fix(check_for_upgrade): update properly `LAST_EPOCH` Fixes #11617 --- tools/check_for_upgrade.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index 81c371b3..3210e437 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -180,6 +180,7 @@ function has_typed_input() { # Check if there are updates available before proceeding if ! is_update_available; then + update_last_updated_file return fi From 673b9fc3317d48a169fe612575186b3eb1a42a13 Mon Sep 17 00:00:00 2001 From: Mark Keisler Date: Tue, 18 Apr 2023 03:36:07 -0500 Subject: [PATCH 175/321] feat(aws)!: improve `aws_change_access_key` (#11378) BREAKING CHANGE: This commit removes compatibility for `aws` cli v1. Now only v2 is supported. --- plugins/aws/README.md | 11 ++++++----- plugins/aws/aws.plugin.zsh | 37 +++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 11 deletions(-) diff --git a/plugins/aws/README.md b/plugins/aws/README.md index 846bf141..54bc7a44 100644 --- a/plugins/aws/README.md +++ b/plugins/aws/README.md @@ -1,7 +1,8 @@ # aws -This plugin provides completion support for [awscli](https://docs.aws.amazon.com/cli/latest/reference/index.html) +This plugin provides completion support for [awscli v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html) and a few utilities to manage AWS profiles/regions and display them in the prompt. +[awscli v1](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html) is no longer supported. To use it, add `aws` to the plugins array in your zshrc file. @@ -12,9 +13,9 @@ plugins=(... aws) ## Plugin commands * `asp []`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to ``. - It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`. + It also sets `$AWS_EB_PROFILE` to `` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`. Run `asp` without arguments to clear the profile. -* `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection. +* `asp [] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection. * `asr []`: sets `$AWS_REGION` and `$AWS_DEFAULT_REGION` (legacy) to ``. Run `asr` without arguments to clear the profile. @@ -65,7 +66,7 @@ the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control Source profile credentials in `~/.aws/credentials`: -``` +```ini [source-profile-name] aws_access_key_id = ... aws_secret_access_key = ... @@ -73,7 +74,7 @@ aws_secret_access_key = ... Role configuration in `~/.aws/config`: -``` +```ini [profile source-profile-name] mfa_serial = arn:aws:iam::111111111111:mfa/myuser region = us-east-1 diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index a379eaa1..d45abba5 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -160,14 +160,39 @@ function aws_change_access_key() { return 1 fi - echo "Insert the credentials when asked." - asp "$1" || return 1 - AWS_PAGER="" aws iam create-access-key - AWS_PAGER="" aws configure --profile "$1" + local profile="$1" + # Get current access key + local original_aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)" - echo "You can now safely delete the old access key running \`aws iam delete-access-key --access-key-id ID\`" + asp "$profile" || return 1 + echo "Generating a new access key pair for you now." + if aws --no-cli-pager iam create-access-key; then + echo "Insert the newly generated credentials when asked." + aws --no-cli-pager configure --profile $profile + else + echo "Current access keys:" + aws --no-cli-pager iam list-access-keys + echo "Profile \"${profile}\" is currently using the $original_aws_access_key_id key. You can delete an old access key by running \`aws --profile $profile iam delete-access-key --access-key-id AccessKeyId\`" + return 1 + fi + + read -q "yn?Would you like to disable your previous access key (${original_aws_access_key_id}) now? " + case $yn in + [Yy]*) + echo -n "\nDisabling access key ${original_aws_access_key_id}..." + if aws --no-cli-pager update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then + echo "done." + else + echo "\nFailed to disable ${original_aws_access_key_id} key." + fi + ;; + *) + echo "" + ;; + esac + echo "You can now safely delete the old access key by running \`aws --profile $profile iam delete-access-key --access-key-id ${original_aws_access_key_id}\`" echo "Your current keys are:" - AWS_PAGER="" aws iam list-access-keys + aws --no-cli-pager iam list-access-keys } function aws_regions() { From 9139d30ca30f8f687cc21121ed9b4f5238bc5260 Mon Sep 17 00:00:00 2001 From: Roeniss Moon Date: Wed, 19 Apr 2023 22:46:10 +0900 Subject: [PATCH 176/321] feat(aws): allow more customisation in prompt function (#11619) --- plugins/aws/README.md | 2 ++ plugins/aws/aws.plugin.zsh | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/plugins/aws/README.md b/plugins/aws/README.md index 54bc7a44..9e1e055b 100644 --- a/plugins/aws/README.md +++ b/plugins/aws/README.md @@ -58,6 +58,8 @@ the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control * ZSH_THEME_AWS_REGION_SUFFIX: sets the suffix of the AWS_REGION. Defaults to `>`. +* ZSH_THEME_AWS_DIVIDER: sets the divider between ZSH_THEME_AWS_PROFILE_SUFFIX and ZSH_THEME_AWS_REGION_PREFIX. Defaults to ` ` (single space). + ## Configuration [Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) by AWS diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index d45abba5..0da91bc2 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -223,13 +223,16 @@ compctl -K _aws_profiles asp acp aws_change_access_key function aws_prompt_info() { local _aws_to_show local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}" + if [[ -n $AWS_PROFILE ]];then - _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX:=}" + _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX=""}" fi + if [[ -n $AWS_REGION ]]; then - [[ -n $AWS_PROFILE ]] && _aws_to_show+=" " - _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX:=}" + [[ -n $AWS_PROFILE ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=' '}" + _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX=""}" fi + echo "$_aws_to_show" } From 18c837b136a9591117ef059eb8266c490d5eeee1 Mon Sep 17 00:00:00 2001 From: Erin Schlarb Date: Thu, 20 Apr 2023 13:30:49 +0200 Subject: [PATCH 177/321] fix(dirhistory): run properly if `ksh_arrays` is set (#11630) --- plugins/dirhistory/dirhistory.plugin.zsh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/dirhistory/dirhistory.plugin.zsh b/plugins/dirhistory/dirhistory.plugin.zsh index 7021fc03..8d67c618 100644 --- a/plugins/dirhistory/dirhistory.plugin.zsh +++ b/plugins/dirhistory/dirhistory.plugin.zsh @@ -19,15 +19,17 @@ export DIRHISTORY_SIZE=30 # Returns the element if the array was not empty, # otherwise returns empty string. function pop_past() { - typeset -g $1="${dirhistory_past[$#dirhistory_past]}" + setopt localoptions no_ksh_arrays if [[ $#dirhistory_past -gt 0 ]]; then + typeset -g $1="${dirhistory_past[$#dirhistory_past]}" dirhistory_past[$#dirhistory_past]=() fi } function pop_future() { - typeset -g $1="${dirhistory_future[$#dirhistory_future]}" + setopt localoptions no_ksh_arrays if [[ $#dirhistory_future -gt 0 ]]; then + typeset -g $1="${dirhistory_future[$#dirhistory_future]}" dirhistory_future[$#dirhistory_future]=() fi } @@ -35,6 +37,7 @@ function pop_future() { # Push a new element onto the end of dirhistory_past. If the size of the array # is >= DIRHISTORY_SIZE, the array is shifted function push_past() { + setopt localoptions no_ksh_arrays if [[ $#dirhistory_past -ge $DIRHISTORY_SIZE ]]; then shift dirhistory_past fi @@ -44,6 +47,7 @@ function push_past() { } function push_future() { + setopt localoptions no_ksh_arrays if [[ $#dirhistory_future -ge $DIRHISTORY_SIZE ]]; then shift dirhistory_future fi From 5b11e70a9617c6e248fd6947e84016bd8c37028e Mon Sep 17 00:00:00 2001 From: Erin Schlarb Date: Thu, 20 Apr 2023 13:32:32 +0200 Subject: [PATCH 178/321] fix(cli): execute as expected if `ksh_arrays` is set (#11629) --- lib/cli.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cli.zsh b/lib/cli.zsh index ba3e39eb..561c1b98 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -11,7 +11,7 @@ function omz { # Subcommand functions start with _ so that they don't # appear as completion entries when looking for `omz` - (( $+functions[_omz::$command] )) || { + (( ${+functions[_omz::$command]} )) || { _omz::help return 1 } From 91c7ed45a312a71b7d3b856228047ddcd51d4651 Mon Sep 17 00:00:00 2001 From: Nathanial Spearing Date: Thu, 20 Apr 2023 07:42:47 -0400 Subject: [PATCH 179/321] feat(npm): add `npmrd` alias (#11627) --- plugins/npm/README.md | 1 + plugins/npm/npm.plugin.zsh | 3 +++ 2 files changed, 4 insertions(+) diff --git a/plugins/npm/README.md b/plugins/npm/README.md index 8eafc6d6..420dd710 100644 --- a/plugins/npm/README.md +++ b/plugins/npm/README.md @@ -29,6 +29,7 @@ plugins=(... npm) | `npmI` | `npm init` | Run npm init | | `npmi` | `npm info` | Run npm info | | `npmSe` | `npm search` | Run npm search | +| `npmrd` | `npm run dev` | Run npm run dev | ## `npm install` / `npm uninstall` toggle diff --git a/plugins/npm/npm.plugin.zsh b/plugins/npm/npm.plugin.zsh index e0dcbf14..3cba18f6 100644 --- a/plugins/npm/npm.plugin.zsh +++ b/plugins/npm/npm.plugin.zsh @@ -70,6 +70,9 @@ alias npmi="npm info" # Run npm search alias npmSe="npm search" +# Run npm run dev +alias npmrd="npm run dev" + npm_toggle_install_uninstall() { # Look up to the previous 2 history commands local line From 07454029bd67239ce42aaa68b427fbbe8e428e7d Mon Sep 17 00:00:00 2001 From: Andrew Xie <62098008+axieax@users.noreply.github.com> Date: Fri, 21 Apr 2023 16:59:58 +1000 Subject: [PATCH 180/321] feat(starship): create plugin (#10947) Co-authored-by: Carlo Sala --- .github/CODEOWNERS | 1 + plugins/starship/README.md | 21 +++++++++++++++++++++ plugins/starship/starship.plugin.zsh | 8 ++++++++ 3 files changed, 30 insertions(+) create mode 100644 plugins/starship/README.md create mode 100644 plugins/starship/starship.plugin.zsh diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6668cd7c..599b765c 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -9,3 +9,4 @@ plugins/shell-proxy/ @septs plugins/universalarchive/ @Konfekt plugins/wp-cli/ @joshmedeski plugins/zoxide/ @ajeetdsouza +plugins/starship/ @axieax diff --git a/plugins/starship/README.md b/plugins/starship/README.md new file mode 100644 index 00000000..0e66c529 --- /dev/null +++ b/plugins/starship/README.md @@ -0,0 +1,21 @@ +# starship plugin + +Initializes [starship prompt](https://starship.rs) - a minimal, blazing-fast and infinitely customizable cross-shell prompt. + +[Demo](https://user-images.githubusercontent.com/62098008/169764279-50b48262-9506-4651-ba89-f6611a88ebf0.mp4) + +[External repository](https://github.com/axieax/zsh-starship) for this zsh plugin. + +# Installation + +**Note:** you have to [install starship](https://starship.rs/guide/#%F0%9F%9A%80-installation) first. + +## [oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh) + +Add `starship` to the plugins array in your `.zshrc` file: + +```zsh +plugins=(... starship) +``` + +## ⚠️ ENABLING THIS PLUGIN WILL UNSET YOUR ZSH_THEME VARIABLE diff --git a/plugins/starship/starship.plugin.zsh b/plugins/starship/starship.plugin.zsh new file mode 100644 index 00000000..8c5d9135 --- /dev/null +++ b/plugins/starship/starship.plugin.zsh @@ -0,0 +1,8 @@ +# ignore oh-my-zsh theme +unset ZSH_THEME + +if (( $+commands[starship] )); then + eval "$(starship init zsh)" +else + echo '[oh-my-zsh] starship not found, please install it from https://starship.rs' +fi From 5d3e86e2a48adf7a308773f8f1b725d187c7c5ef Mon Sep 17 00:00:00 2001 From: Miguel Sempere Date: Fri, 21 Apr 2023 08:15:31 +0100 Subject: [PATCH 181/321] feat(dbt): create plugin (#11635) Co-authored-by: Carlo Sala --- .github/CODEOWNERS | 1 + plugins/dbt/README.md | 29 +++++++++++++++++++++++++++++ plugins/dbt/dbt.plugin.zsh | 23 +++++++++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 plugins/dbt/README.md create mode 100644 plugins/dbt/dbt.plugin.zsh diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 599b765c..0c5f3ace 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -10,3 +10,4 @@ plugins/universalarchive/ @Konfekt plugins/wp-cli/ @joshmedeski plugins/zoxide/ @ajeetdsouza plugins/starship/ @axieax +plugins/dbt/ @msempere diff --git a/plugins/dbt/README.md b/plugins/dbt/README.md new file mode 100644 index 00000000..e05d79cc --- /dev/null +++ b/plugins/dbt/README.md @@ -0,0 +1,29 @@ +# dbt plugin + +## Introduction + +The `dbt plugin` adds several aliases for useful [dbt](https://docs.getdbt.com/) commands and +[aliases](#aliases). + +To use it, add `dbt` to the plugins array of your zshrc file: + +``` +plugins=(... dbt) +``` + +## Aliases + +| Alias | Command | Description | +| ------ | ------------------------------------------------ | ---------------------------------------------------- | +| dbtlm | `dbt ls -s state:modified` | List modified models only | +| dbtrm | `dbt run -s state:modified` | Run modified models only | +| dbttm | `dbt test -m state:modified` | Test modified models only | +| dbtrtm | `dbtrm && dbttm` | Run and test modified models only | +| dbtrs | `dbt clean; dbt deps; dbt seed` | Re-seed data | +| dbtfrt | `dbtrs; dbt run --full-refresh; dbt test` | Perform a full fresh run with tests | +| dbtcds | `dbt docs generate; dbt docs serve` | Generate docs without compiling | +| dbtds | `dbt docs generate --no-compile; dbt docs serve` | Generate and serve docs skipping doc. re-compilation | + +## Maintainer + +### [msempere](https://github.com/msempere) diff --git a/plugins/dbt/dbt.plugin.zsh b/plugins/dbt/dbt.plugin.zsh new file mode 100644 index 00000000..6fcc2eec --- /dev/null +++ b/plugins/dbt/dbt.plugin.zsh @@ -0,0 +1,23 @@ +# list modified models only +alias dbtlm="dbt ls -s state:modified" + +# run modified models only +alias dbtrm="dbt run -s state:modified" + +# test modified models only +alias dbttm="dbt test -m state:modified" + +# run and test modified models only +alias dbtrtm="dbtrm && dbttm" + +# re-seed data +alias dbtrs="dbt clean; dbt deps; dbt seed" + +# perform a full fresh run with tests +alias dbtfrt="dbtrs; dbt run --full-refresh; dbt test" + +# generate and serve docs +alias dbtcds="dbt docs generate; dbt docs serve" + +# generate and serve docs skipping doc. re-compilation +alias dbtds="dbt docs generate --no-compile; dbt docs serve" From 343c78ae91ff03ea66517b1d69b25fa262ce5408 Mon Sep 17 00:00:00 2001 From: Idan Fishman Date: Thu, 27 Apr 2023 11:49:26 +0200 Subject: [PATCH 182/321] fix(aws): set properly set divider to space Closes #11649 Co-authored-by: Carlo Sala --- plugins/aws/aws.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 0da91bc2..a437dc8e 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -229,7 +229,7 @@ function aws_prompt_info() { fi if [[ -n $AWS_REGION ]]; then - [[ -n $AWS_PROFILE ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=' '}" + [[ -n $AWS_PROFILE ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}" _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX=""}" fi From 65699912be974d36b732b63e32c3b9428d23ace8 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 27 Apr 2023 09:57:44 +0200 Subject: [PATCH 183/321] fix(azure): recognize properly linuxbrew Closes #11644 --- plugins/azure/azure.plugin.zsh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/azure/azure.plugin.zsh b/plugins/azure/azure.plugin.zsh index 8fec3c1f..22fbea80 100644 --- a/plugins/azure/azure.plugin.zsh +++ b/plugins/azure/azure.plugin.zsh @@ -31,11 +31,9 @@ function _az-homebrew-installed() { # check if Homebrew is installed (( $+commands[brew] )) || return 1 - # speculatively check default brew prefix - if [[ -d /usr/local ]]; then - _brew_prefix=/usr/local - elif [[ -d /opt/homebrew ]]; then - _brew_prefix=/opt/homebrew + # if so, we assume it's default way to install brew + if [[ ${commands[brew]:t2} == bin/brew ]]; then + _brew_prefix="${commands[brew]:h:h}" # remove trailing /bin/brew else # ok, it is not in the default prefix # this call to brew is expensive (about 400 ms), so at least let's make it only once From 5fc1118fd240a0d87ad022d36f48cb31d869ab2e Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 27 Apr 2023 19:42:55 +0200 Subject: [PATCH 184/321] chore(azure): fix typo --- plugins/azure/azure.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/azure/azure.plugin.zsh b/plugins/azure/azure.plugin.zsh index 22fbea80..b33b0f80 100644 --- a/plugins/azure/azure.plugin.zsh +++ b/plugins/azure/azure.plugin.zsh @@ -1,4 +1,4 @@ -# AZ Get Subscritions +# AZ Get Subscriptions function azgs() { az account show --output tsv --query 'name' 2>/dev/null } From 2e7a247cab663fbc0aafdefa15bf10eb4dd64563 Mon Sep 17 00:00:00 2001 From: Bas Nijholt Date: Fri, 28 Apr 2023 09:05:36 +0200 Subject: [PATCH 185/321] feat(z): update to latest upstream version Mirror of https://github.com/agkozak/zsh-z/commit/6bfe418332866d15373392164df11b4fbec2083f Closes #11652 Co-authored-by: Carlo Sala --- plugins/z/LICENSE | 2 +- plugins/z/MANUAL.md | 21 ++++++++++-- plugins/z/_z | 2 +- plugins/z/img/mit_license.svg | 1 + plugins/z/img/zsh_4.3.11_plus.svg | 1 + plugins/z/z.plugin.zsh | 54 ++++++++++++++++++++++++------- 6 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 plugins/z/img/mit_license.svg create mode 100644 plugins/z/img/zsh_4.3.11_plus.svg diff --git a/plugins/z/LICENSE b/plugins/z/LICENSE index d1cca7ae..6af13b9e 100644 --- a/plugins/z/LICENSE +++ b/plugins/z/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018-2022 Alexandros Kozak +Copyright (c) 2018-2023 Alexandros Kozak Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/z/MANUAL.md b/plugins/z/MANUAL.md index dcca3c45..d367c302 100644 --- a/plugins/z/MANUAL.md +++ b/plugins/z/MANUAL.md @@ -1,5 +1,9 @@ # Zsh-z +[![MIT License](img/mit_license.svg)](https://opensource.org/licenses/MIT) +![Zsh version 4.3.11 and higher](img/zsh_4.3.11_plus.svg) +[![GitHub stars](https://img.shields.io/github/stars/agkozak/zsh-z.svg)](https://github.com/agkozak/zsh-z/stargazers) + Zsh-z is a command line tool that allows you to jump quickly to directories that you have visited frequently in the past, or recently -- but most often a combination of the two (a concept known as ["frecency"](https://en.wikipedia.org/wiki/Frecency)). It works by keeping track of when you go to directories and how much time you spend in them. It is then in the position to guess where you want to go when you type a partial string, e.g., `z src` might take you to `~/src/zsh`. `z zsh` might also get you there, and `z c/z` might prove to be even more specific -- it all depends on your habits and how much time you have been using Zsh-z to build up a database. After using Zsh-z for a little while, you will get to where you want to be by typing considerably less than you would need if you were using `cd`. Zsh-z is a native Zsh port of [rupa/z](https://github.com/rupa/z), a tool written for `bash` and Zsh that uses embedded `awk` scripts to do the heavy lifting. It was quite possibly my most used command line tool for a couple of years. I decided to translate it, `awk` parts and all, into pure Zsh script, to see if by eliminating calls to external tools (`awk`, `sort`, `date`, `sed`, `mv`, `rm`, and `chown`) and reducing forking through subshells I could make it faster. The performance increase is impressive, particularly on systems where forking is slow, such as Cygwin, MSYS2, and WSL. I have found that, in those environments, switching directories using Zsh-z can be over 100% faster than it is using `rupa/z`. @@ -28,6 +32,10 @@ Zsh-z is a drop-in replacement for `rupa/z` and will, by default, use the same d

Here are the latest features and updates. +- April 27, 2023 + + Zsh-z now allows the user to specify the directory-changing command using the `ZSHZ_CD` environment variable (default: `builtin cd`; props @basnijholt). +- January 27, 2023 + + If the datafile directory specified by `ZSHZ_DATA` or `_Z_DATA` does not already exist, create it (props @mattmc3). - June 29, 2022 + Zsh-z is less likely to leave temporary files sitting around (props @mafredri). - June 27, 2022 @@ -118,13 +126,19 @@ Add the line to your `.zshrc`, somewhere above the line that says `antigen apply`. -### For [oh-my-zsh](http://ohmyz.sh/) users +### For [Oh My Zsh](http://ohmyz.sh/) users -Execute the following command: +Zsh-z is now included as part of Oh My Zsh! As long as you are using an up-to-date installation of Oh My Zsh, you can activate Zsh-z simply by adding `z` to your `plugins` array in your `.zshrc`, e.g., + + plugins=( git z ) + +It is as simple as that. + +If, however, you prefer always to use the latest version of Zsh-z from the `agkozak/zsh-z` repo, you may install it thus: git clone https://github.com/agkozak/zsh-z ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-z -and add `zsh-z` to the line of your `.zshrc` that specifies `plugins=()`, e.g., `plugins=( git zsh-z )`. +and activate it by adding `zsh-z` to the line of your `.zshrc` that specifies `plugins=()`, e.g., `plugins=( git zsh-z )`. ### For [prezto](https://github.com/sorin-ionescu/prezto) users @@ -246,6 +260,7 @@ to install `zsh-z`. Zsh-z has environment variables (they all begin with `ZSHZ_`) that change its behavior if you set them; you can also keep your old ones if you have been using `rupa/z` (they begin with `_Z_`). * `ZSHZ_CMD` changes the command name (default: `z`) +* `ZSHZ_CD` specifies the default directory-changing command (default: `builtin cd`) * `ZSHZ_COMPLETION` can be `'frecent'` (default) or `'legacy'`, depending on whether you want your completion results sorted according to frecency or simply sorted alphabetically * `ZSHZ_DATA` changes the database file (default: `~/.z`) * `ZSHZ_ECHO` displays the new path name when changing directories (default: `0`) diff --git a/plugins/z/_z b/plugins/z/_z index 9891a52e..a493f35b 100644 --- a/plugins/z/_z +++ b/plugins/z/_z @@ -5,7 +5,7 @@ # # https://github.com/agkozak/zsh-z # -# Copyright (c) 2018-2022 Alexandros Kozak +# Copyright (c) 2018-2023 Alexandros Kozak # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal diff --git a/plugins/z/img/mit_license.svg b/plugins/z/img/mit_license.svg new file mode 100644 index 00000000..1c02079d --- /dev/null +++ b/plugins/z/img/mit_license.svg @@ -0,0 +1 @@ +licenselicenseMITMIT \ No newline at end of file diff --git a/plugins/z/img/zsh_4.3.11_plus.svg b/plugins/z/img/zsh_4.3.11_plus.svg new file mode 100644 index 00000000..f46d947d --- /dev/null +++ b/plugins/z/img/zsh_4.3.11_plus.svg @@ -0,0 +1 @@ +zshzsh4.3.11+4.3.11+ \ No newline at end of file diff --git a/plugins/z/z.plugin.zsh b/plugins/z/z.plugin.zsh index 209edfea..60a63062 100644 --- a/plugins/z/z.plugin.zsh +++ b/plugins/z/z.plugin.zsh @@ -4,7 +4,7 @@ # # https://github.com/agkozak/zsh-z # -# Copyright (c) 2018-2022 Alexandros Kozak +# Copyright (c) 2018-2023 Alexandros Kozak # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -52,6 +52,7 @@ # ZSHZ_CASE -> if `ignore', pattern matching is case-insensitive; if `smart', # pattern matching is case-insensitive only when the pattern is all # lowercase +# ZSHZ_CD -> the directory-changing command that is used (default: builtin cd) # ZSHZ_CMD -> name of command (default: z) # ZSHZ_COMPLETION -> completion method (default: 'frecent'; 'legacy' for # alphabetic sorting) @@ -129,6 +130,7 @@ is-at-least 5.3.0 && ZSHZ[PRINTV]=1 # Globals: # ZSHZ # ZSHZ_CASE +# ZSHZ_CD # ZSHZ_COMPLETION # ZSHZ_DATA # ZSHZ_DEBUG @@ -149,9 +151,19 @@ zshz() { local REPLY local -a lines - # Allow the user to specify the datafile name in $ZSHZ_DATA (default: ~/.z) + # Allow the user to specify a custom datafile in $ZSHZ_DATA (or legacy $_Z_DATA) + local custom_datafile="${ZSHZ_DATA:-$_Z_DATA}" + + # If a datafile was provided as a standalone file without a directory path + # print a warning and exit + if [[ -n ${custom_datafile} && ${custom_datafile} != */* ]]; then + print "ERROR: You configured a custom Zsh-z datafile (${custom_datafile}), but have not specified its directory." >&2 + exit + fi + + # If the user specified a datafile, use that or default to ~/.z # If the datafile is a symlink, it gets dereferenced - local datafile=${${ZSHZ_DATA:-${_Z_DATA:-${HOME}/.z}}:A} + local datafile=${${custom_datafile:-$HOME/.z}:A} # If the datafile is a directory, print a warning and exit if [[ -d $datafile ]]; then @@ -161,7 +173,7 @@ zshz() { # Make sure that the datafile exists before attempting to read it or lock it # for writing - [[ -f $datafile ]] || touch "$datafile" + [[ -f $datafile ]] || { mkdir -p "${datafile:h}" && touch "$datafile" } # Bail if we don't own the datafile and $ZSHZ_OWNER is not set [[ -z ${ZSHZ_OWNER:-${_Z_OWNER}} && -f $datafile && ! -O $datafile ]] && @@ -620,7 +632,7 @@ zshz() { *) # Frecency routine (( dx = EPOCHSECONDS - time_field )) - rank=$(( 10000 * rank_field * (3.75/((0.0001 * dx + 1) + 0.25)) )) + rank=$(( 10000 * rank_field * (3.75/( (0.0001 * dx + 1) + 0.25)) )) ;; esac @@ -756,6 +768,26 @@ zshz() { [[ $output_format != 'completion' ]] && output_format='list' } + ######################################################### + # Allow the user to specify directory-changing command + # using $ZSHZ_CD (default: builtin cd). + # + # Globals: + # ZSHZ_CD + # + # Arguments: + # $* Path + ######################################################### + zshz_cd() { + setopt LOCAL_OPTIONS NO_WARN_CREATE_GLOBAL + + if [[ -z $ZSHZ_CD ]]; then + builtin cd "$*" + else + ${=ZSHZ_CD} "$*" + fi + } + ######################################################### # If $ZSHZ_ECHO == 1, display paths as you jump to them. # If it is also the case that $ZSHZ_TILDE == 1, display @@ -773,7 +805,7 @@ zshz() { if [[ ${@: -1} == /* ]] && (( ! $+opts[-e] && ! $+opts[-l] )); then # cd if possible; echo the new path if $ZSHZ_ECHO == 1 - [[ -d ${@: -1} ]] && builtin cd ${@: -1} && _zshz_echo && return + [[ -d ${@: -1} ]] && zshz_cd ${@: -1} && _zshz_echo && return fi # With option -c, make sure query string matches beginning of matches; @@ -830,12 +862,12 @@ zshz() { print -- "$cd" else # cd if possible; echo the new path if $ZSHZ_ECHO == 1 - [[ -d $cd ]] && builtin cd "$cd" && _zshz_echo + [[ -d $cd ]] && zshz_cd "$cd" && _zshz_echo fi else # if $req is a valid path, cd to it; echo the new path if $ZSHZ_ECHO == 1 if ! (( $+opts[-e] || $+opts[-l] )) && [[ -d $req ]]; then - builtin cd "$req" && _zshz_echo + zshz_cd "$req" && _zshz_echo else return $ret2 fi @@ -900,9 +932,9 @@ add-zsh-hook chpwd _zshz_chpwd ############################################################ # Standarized $0 handling -# (See https://github.com/agkozak/Zsh-100-Commits-Club/blob/master/Zsh-Plugin-Standard.adoc) -0=${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}} -0=${${(M)0:#/*}:-$PWD/$0} +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" +0="${${(M)0:#/*}:-$PWD/$0}" (( ${fpath[(ie)${0:A:h}]} <= ${#fpath} )) || fpath=( "${0:A:h}" "${fpath[@]}" ) From b22593cf179bae479ab32700c5a7b94d3053762d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 1 May 2023 22:21:01 +0200 Subject: [PATCH 186/321] fix(init): avoid overwriting existing aliases Fix regression introduced in #11550. If an existing alias was present in the moment of sourcing, and oh-my-zsh aliases were disabled for that file, it'd be overwritten aswell. See #11658. --- oh-my-zsh.sh | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index e047d483..a577c1f4 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -159,10 +159,10 @@ _omz_source() { zstyle -T ":omz:${context}" aliases || disable_aliases=1 # Back up alias names prior to sourcing - local -a aliases_pre galiases_pre + local -A aliases_pre galiases_pre if (( disable_aliases )); then - aliases_pre=("${(@k)aliases}") - galiases_pre=("${(@k)galiases}") + aliases_pre=("${(@kv)aliases}") + galiases_pre=("${(@kv)galiases}") fi # Source file from $ZSH_CUSTOM if it exists, otherwise from $ZSH @@ -174,10 +174,16 @@ _omz_source() { # Unset all aliases that don't appear in the backed up list of aliases if (( disable_aliases )); then - local -a disabled - # ${var:|array} gets the list of items in var not in array - disabled=("${(@k)aliases:|aliases_pre}" "${(@k)galiases:|galiases_pre}") - (( $#disabled == 0 )) || unalias "${(@)disabled}" + if (( #aliases_pre )); then + aliases=("${(@kv)aliases_pre}") + else + (( #aliases )) && unalias "${(@k)aliases}" + fi + if (( #galiases_pre )); then + galiases=("${(@kv)galiases_pre}") + else + (( #galiases )) && unalias "${(@k)galiases}" + fi fi } From 693e3dcc447b5d6fa611eea43166ea2b4e0ed877 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 2 May 2023 10:03:24 +0200 Subject: [PATCH 187/321] fix(apple): replace deprecated nerdfonts icon --- themes/apple.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/apple.zsh-theme b/themes/apple.zsh-theme index 0c183258..65a2b80f 100644 --- a/themes/apple.zsh-theme +++ b/themes/apple.zsh-theme @@ -1,5 +1,5 @@ function toon { - echo -n "" + echo -n "󰐀" } autoload -Uz vcs_info From dab09cc0eec220f5c1a541ccb75449c62c20bdb4 Mon Sep 17 00:00:00 2001 From: Oleg Grigoriev Date: Tue, 2 May 2023 13:27:57 +0300 Subject: [PATCH 188/321] feat(rake-fast): show task descriptions in autocomplete (#11653) --- plugins/rake-fast/rake-fast.plugin.zsh | 39 ++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/plugins/rake-fast/rake-fast.plugin.zsh b/plugins/rake-fast/rake-fast.plugin.zsh index 19dab154..86e5ed58 100644 --- a/plugins/rake-fast/rake-fast.plugin.zsh +++ b/plugins/rake-fast/rake-fast.plugin.zsh @@ -1,5 +1,28 @@ +# The version of the format of .rake_tasks. If the output of _rake_generate +# changes, incrementing this number will force it to regenerate +_rake_tasks_version=2 + _rake_does_task_list_need_generating () { - [[ ! -f .rake_tasks ]] || [[ Rakefile -nt .rake_tasks ]] || { _is_rails_app && _tasks_changed } + _rake_tasks_missing || _rake_tasks_version_changed || _rakefile_has_changes || { _is_rails_app && _tasks_changed } +} + +_rake_tasks_missing () { + [[ ! -f .rake_tasks ]] +} + +_rake_tasks_version_changed () { + local -a file_version + file_version=`head -n 1 .rake_tasks | sed "s/^version\://"` + + if ! [[ $file_version =~ '^[0-9]*$' ]]; then + return true + fi + + [[ $file_version -ne $_rake_tasks_version ]] +} + +_rakefile_has_changes () { + [[ Rakefile -nt .rake_tasks ]] } _is_rails_app () { @@ -20,7 +43,14 @@ _tasks_changed () { } _rake_generate () { - rake --silent --tasks | cut -d " " -f 2 | sed 's/\[.*\]//g' > .rake_tasks + echo "version:$_rake_tasks_version" > .rake_tasks + + rake --silent --tasks --all \ + | sed "s/^rake //" | sed "s/\:/\\\:/g" \ + | sed "s/\[[^]]*\]//g" \ + | sed "s/ *# /\:/" \ + | sed "s/\:$//" \ + >> .rake_tasks } _rake () { @@ -29,7 +59,10 @@ _rake () { echo "\nGenerating .rake_tasks..." >&2 _rake_generate fi - compadd $(cat .rake_tasks) + local -a rake_options + rake_options=("${(@f)$(cat .rake_tasks)}") + shift rake_options + _describe 'rake tasks' rake_options fi } compdef _rake rake From 85fdbfe21692a3fa7bdd7bc509163e23fb385279 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 3 May 2023 11:17:47 +0200 Subject: [PATCH 189/321] fix(apple): go back to previous icon Turns out that is a reserved unicode code that is Apple logo in Apple systems. Nerd fonts was overwritting that code to other stuff in v2 and that's why I thought it needed to be replaced. Closes #11665 This reverts commit 693e3dcc447b5d6fa611eea43166ea2b4e0ed877. --- themes/apple.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/apple.zsh-theme b/themes/apple.zsh-theme index 65a2b80f..0c183258 100644 --- a/themes/apple.zsh-theme +++ b/themes/apple.zsh-theme @@ -1,5 +1,5 @@ function toon { - echo -n "󰐀" + echo -n "" } autoload -Uz vcs_info From 5a3f565e7d4371db92ba574f231b396c2c8c9a19 Mon Sep 17 00:00:00 2001 From: kang <1115610574@qq.com> Date: Wed, 3 May 2023 23:48:37 +0800 Subject: [PATCH 190/321] feat(deno): add `dru` alias for `--unstable` (#11667) --- plugins/deno/README.md | 27 ++++++++++++++------------- plugins/deno/deno.plugin.zsh | 1 + 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/plugins/deno/README.md b/plugins/deno/README.md index 69131839..38f9f203 100644 --- a/plugins/deno/README.md +++ b/plugins/deno/README.md @@ -4,16 +4,17 @@ This plugin sets up completion and aliases for [Deno](https://deno.land). ## Aliases -| Alias | Full command | -| ----- | ---------------- | -| db | deno bundle | -| dc | deno compile | -| dca | deno cache | -| dfmt | deno fmt | -| dh | deno help | -| dli | deno lint | -| drn | deno run | -| drA | deno run -A | -| drw | deno run --watch | -| dts | deno test | -| dup | deno upgrade | +| Alias | Full command | +| ----- | ------------------- | +| db | deno bundle | +| dc | deno compile | +| dca | deno cache | +| dfmt | deno fmt | +| dh | deno help | +| dli | deno lint | +| drn | deno run | +| drA | deno run -A | +| drw | deno run --watch | +| dru | deno run --unstable | +| dts | deno test | +| dup | deno upgrade | diff --git a/plugins/deno/deno.plugin.zsh b/plugins/deno/deno.plugin.zsh index 7708f84d..bf97d6f0 100644 --- a/plugins/deno/deno.plugin.zsh +++ b/plugins/deno/deno.plugin.zsh @@ -8,6 +8,7 @@ alias dli='deno lint' alias drn='deno run' alias drA='deno run -A' alias drw='deno run --watch' +alias dru='deno run --unstable' alias dts='deno test' alias dup='deno upgrade' From c5208867f1eb46f722e040b239150817abec87a6 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 2 May 2023 12:41:01 +0200 Subject: [PATCH 191/321] feat(theme-and-appearance): allow disabling gnu-ls in bsd To disable gnu-ls (`gls`) even if it's installed in freeBSD and macOS you can set it up with: ```zsh zstyle ':omz:lib:theme-and-appearance' gnu-ls no ``` Closes #11647 --- README.md | 13 +++++++++++++ lib/theme-and-appearance.zsh | 36 +++++++++++++++++------------------- 2 files changed, 30 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 556d4c8c..650fb00e 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi - [Manual Installation](#manual-installation) - [Installation Problems](#installation-problems) - [Custom Plugins and Themes](#custom-plugins-and-themes) + - [Disable GNU ls in macOS and freeBSD systems](#disable-gnu-ls) - [Skip aliases](#skip-aliases) - [Getting Updates](#getting-updates) - [Updates verbosity](#updates-verbosity) @@ -278,6 +279,18 @@ If you have many functions that go well together, you can put them as a `XYZ.plu If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. +### Disable GNU ls in macOS and freeBSD systems + + + +The default behaviour in Oh My Zsh is to use GNU `ls` even in macOS and freeBSD systems if it's installed (as +`gls` command) when enabling colorized `ls` in `lib/theme-and-appearance.zsh`. If you want to disable this +behaviour you can use zstyle-based config before sourcing `oh-my-zsh.sh`: + +```zsh +zstyle ':omz:lib:theme-and-appearance' gnu-ls no +``` + ### Skip aliases diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index d8859b04..96bdb00e 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -20,10 +20,25 @@ if command diff --color /dev/null{,} &>/dev/null; then } fi - # Don't set ls coloring if disabled [[ "$DISABLE_LS_COLORS" != true ]] || return 0 +# Default coloring for BSD-based ls +export LSCOLORS="Gxfxcxdxbxegedabagacad" + +# Default coloring for GNU-based ls +if [[ -z "$LS_COLORS" ]]; then + # Define LS_COLORS via dircolors if available. Otherwise, set a default + # equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors) + if (( $+commands[dircolors] )); then + [[ -f "$HOME/.dircolors" ]] \ + && source <(dircolors -b "$HOME/.dircolors") \ + || source <(dircolors -b) + else + export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43" + fi +fi + function test-ls-args { local cmd="$1" # ls, gls, colorls, ... local args="${@[2,-1]}" # arguments except the first one @@ -50,7 +65,7 @@ case "$OSTYPE" in test-ls-args ls -G && alias ls='ls -G' # Only use GNU ls if installed and there are user defaults for $LS_COLORS, # as the default coloring scheme is not very pretty - [[ -n "$LS_COLORS" || -f "$HOME/.dircolors" ]] \ + zstyle -T ':omz:lib:theme-and-appearance' gnu-ls \ && test-ls-args gls --color \ && alias ls='gls --color=tty' ;; @@ -64,20 +79,3 @@ case "$OSTYPE" in esac unfunction test-ls-args - - -# Default coloring for BSD-based ls -export LSCOLORS="Gxfxcxdxbxegedabagacad" - -# Default coloring for GNU-based ls -if [[ -z "$LS_COLORS" ]]; then - # Define LS_COLORS via dircolors if available. Otherwise, set a default - # equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors) - if (( $+commands[dircolors] )); then - [[ -f "$HOME/.dircolors" ]] \ - && source <(dircolors -b "$HOME/.dircolors") \ - || source <(dircolors -b) - else - export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43" - fi -fi From 017e288560ef7bdfb8835516d6b3b77bbdcdde6c Mon Sep 17 00:00:00 2001 From: Mark Keisler Date: Sat, 6 May 2023 06:40:06 -0500 Subject: [PATCH 192/321] fix(aws): correct access key disable command (#11671) --- plugins/aws/aws.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index a437dc8e..b2415b73 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -180,7 +180,7 @@ function aws_change_access_key() { case $yn in [Yy]*) echo -n "\nDisabling access key ${original_aws_access_key_id}..." - if aws --no-cli-pager update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then + if aws --no-cli-pager iam update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then echo "done." else echo "\nFailed to disable ${original_aws_access_key_id} key." From dcff7a7f0854591ee1b4f25266f292ec1b1904eb Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 9 May 2023 12:05:15 +0200 Subject: [PATCH 193/321] fix(theme-and-appearance): make bsd `ls` to be default --- lib/theme-and-appearance.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/theme-and-appearance.zsh b/lib/theme-and-appearance.zsh index 96bdb00e..585e969d 100644 --- a/lib/theme-and-appearance.zsh +++ b/lib/theme-and-appearance.zsh @@ -65,7 +65,7 @@ case "$OSTYPE" in test-ls-args ls -G && alias ls='ls -G' # Only use GNU ls if installed and there are user defaults for $LS_COLORS, # as the default coloring scheme is not very pretty - zstyle -T ':omz:lib:theme-and-appearance' gnu-ls \ + zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \ && test-ls-args gls --color \ && alias ls='gls --color=tty' ;; From aaf83d37aa1cc5ed2cb96dd29328502003a70848 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 9 May 2023 12:10:05 +0200 Subject: [PATCH 194/321] docs(theme-and-appearance): reflect properly dcff7a7 changes --- README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 650fb00e..2249b49d 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi - [Manual Installation](#manual-installation) - [Installation Problems](#installation-problems) - [Custom Plugins and Themes](#custom-plugins-and-themes) - - [Disable GNU ls in macOS and freeBSD systems](#disable-gnu-ls) + - [Enable GNU ls in macOS and freeBSD systems](#enable-gnu-ls) - [Skip aliases](#skip-aliases) - [Getting Updates](#getting-updates) - [Updates verbosity](#updates-verbosity) @@ -279,18 +279,20 @@ If you have many functions that go well together, you can put them as a `XYZ.plu If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. -### Disable GNU ls in macOS and freeBSD systems +### Enable GNU ls in macOS and freeBSD systems - + -The default behaviour in Oh My Zsh is to use GNU `ls` even in macOS and freeBSD systems if it's installed (as -`gls` command) when enabling colorized `ls` in `lib/theme-and-appearance.zsh`. If you want to disable this -behaviour you can use zstyle-based config before sourcing `oh-my-zsh.sh`: +The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and freeBSD systems. If GNU `ls` is installed +(as `gls` command), you can choose to use it instead. To do it, you can use zstyle-based config before +sourcing `oh-my-zsh.sh`: ```zsh zstyle ':omz:lib:theme-and-appearance' gnu-ls no ``` +_Note: this is not compatible with `DISABLE_LS_COLORS=true`_ + ### Skip aliases From aab3bfff9f27a261dcd4cd4a2082a2ce3fff8c59 Mon Sep 17 00:00:00 2001 From: roodkcab Date: Tue, 9 May 2023 18:27:22 +0800 Subject: [PATCH 195/321] fix(robbyrussell) multiline command editing (#11681) Co-authored-by: chenshuoshi Closes #11680 --- themes/robbyrussell.zsh-theme | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/robbyrussell.zsh-theme b/themes/robbyrussell.zsh-theme index 2fd5f2cd..173e6d57 100644 --- a/themes/robbyrussell.zsh-theme +++ b/themes/robbyrussell.zsh-theme @@ -1,5 +1,5 @@ -PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )" -PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)' +PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ ) %{$fg[cyan]%}%c%{$reset_color%}" +PROMPT+=' $(git_prompt_info)' ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}" ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} " From f01eea76da194fef6005f53a281b6f5a998db126 Mon Sep 17 00:00:00 2001 From: ZYX Date: Fri, 12 May 2023 02:42:30 -0700 Subject: [PATCH 196/321] fix(aws): use the correct variable to assert region is defined (#11691) --- plugins/aws/aws.plugin.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index b2415b73..c946515b 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -224,12 +224,12 @@ function aws_prompt_info() { local _aws_to_show local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}" - if [[ -n $AWS_PROFILE ]];then + if [[ -n "$AWS_PROFILE" ]];then _aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX=""}" fi - if [[ -n $AWS_REGION ]]; then - [[ -n $AWS_PROFILE ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}" + if [[ -n "$region" ]]; then + [[ -n "$_aws_to_show" ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}" _aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX=""}" fi From 7a030f6bd6c15259052c7007020cf3ecf8a3f299 Mon Sep 17 00:00:00 2001 From: Joe Date: Mon, 15 May 2023 09:27:31 -0400 Subject: [PATCH 197/321] docs(pyenv): warn about pyenv init (#11692) --- plugins/pyenv/README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/plugins/pyenv/README.md b/plugins/pyenv/README.md index b9ee937b..f1ca3d28 100644 --- a/plugins/pyenv/README.md +++ b/plugins/pyenv/README.md @@ -10,6 +10,14 @@ To use it, add `pyenv` to the plugins array in your zshrc file: plugins=(... pyenv) ``` +If you receive a `Found pyenv, but it is badly configured.` error on startup, you may need to ensure that `pyenv` is initialized before the oh-my-zsh pyenv plugin is loaded. This can be achived by adding the following earlier in the `.zshrc` file than the `plugins=(...)` line: + +```zsh +export PYENV_ROOT="$HOME/.pyenv" +export PATH="$PYENV_ROOT/bin:$PATH" +eval "$(pyenv init --path)" +``` + ## Settings - `ZSH_PYENV_QUIET`: if set to `true`, the plugin will not print any messages if it From bfeeda1491b5366aa5798a86cf6f3621536b171c Mon Sep 17 00:00:00 2001 From: Craig Furman Date: Sun, 21 May 2023 11:47:38 +0100 Subject: [PATCH 198/321] docs(theme-and-appearance): fix gnu-ls snippet (#11701) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2249b49d..a3059558 100644 --- a/README.md +++ b/README.md @@ -288,7 +288,7 @@ The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and freeBSD syste sourcing `oh-my-zsh.sh`: ```zsh -zstyle ':omz:lib:theme-and-appearance' gnu-ls no +zstyle ':omz:lib:theme-and-appearance' gnu-ls yes ``` _Note: this is not compatible with `DISABLE_LS_COLORS=true`_ From 3a01d7df82157a5f3aef01eab9a940e4cba2283a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 21 May 2023 19:58:26 +0200 Subject: [PATCH 199/321] fix(extract): fix extract dir naming conflicts Fixes #11642 --- plugins/extract/extract.plugin.zsh | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 34c08065..ee1d38b3 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -27,12 +27,20 @@ EOF fi local success=0 - local extract_dir="${1:t:r}" local file="$1" full_path="${1:A}" + local extract_dir="${1:t:r}" + + # If there's a file or directory with the same name as the archive + # add a random string to the end of the extract directory + if [[ -e "$extract_dir" ]]; then + local rnd="${(L)"${$(( [##36]$RANDOM*$RANDOM ))}":1:5}" + extract_dir="${extract_dir}-${rnd}" + fi # Create an extraction directory based on the file name command mkdir -p "$extract_dir" builtin cd -q "$extract_dir" + echo "extract: extracting to $extract_dir" >&2 case "${file:l}" in (*.tar.gz|*.tgz) @@ -107,11 +115,13 @@ EOF if [[ "${content[1]:t}" == "$extract_dir" ]]; then # =(:) gives /tmp/zsh, with :t it gives zsh local tmp_dir==(:); tmp_dir="${tmp_dir:t}" - command mv -f "${content[1]}" "$tmp_dir" \ + command mv "${content[1]}" "$tmp_dir" \ && command rmdir "$extract_dir" \ - && command mv -f "$tmp_dir" "$extract_dir" - else - command mv -f "${content[1]}" . \ + && command mv "$tmp_dir" "$extract_dir" + # Otherwise, if the extracted folder name already exists in the current + # directory (because of a previous file / folder), keep the extract_dir + elif [[ ! -e "${content[1]:t}" ]]; then + command mv "${content[1]}" . \ && command rmdir "$extract_dir" fi elif [[ ${#content} -eq 0 ]]; then From b06663df23b2910a6e542dc114dc7adc2cdce22f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 21 May 2023 20:14:32 +0200 Subject: [PATCH 200/321] feat(extract): add support for `.zlib` and `.exe` files (#11085) Fixes #11085 --- plugins/extract/README.md | 3 +++ plugins/extract/extract.plugin.zsh | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/extract/README.md b/plugins/extract/README.md index ac4a8e19..c8d98b22 100644 --- a/plugins/extract/README.md +++ b/plugins/extract/README.md @@ -25,6 +25,7 @@ plugins=(... extract) | `cpio` | Cpio archive | | `deb` | Debian package | | `ear` | Enterprise Application aRchive | +| `exe` | Windows executable file | | `gz` | Gzip file | | `ipa` | iOS app package | | `ipsw` | iOS firmware file | @@ -52,9 +53,11 @@ plugins=(... extract) | `txz` | Tarball with lzma2 compression | | `tzst` | Tarball with zstd compression | | `war` | Web Application archive (Java-based) | +| `whl` | Python wheel file | | `xpi` | Mozilla XPI module file | | `xz` | LZMA2 archive | | `zip` | Zip archive | +| `zlib` | zlib archive | | `zst` | Zstandard file (zstd) | | `zpaq` | Zpaq file | diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index ee1d38b3..b7a823c9 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -83,9 +83,10 @@ EOF builtin cd -q ../data; extract ../data.tar.* builtin cd -q ..; command rm *.tar.* debian-binary ;; (*.zst) unzstd "$full_path" ;; - (*.cab) cabextract "$full_path" ;; + (*.cab|*.exe) cabextract "$full_path" ;; (*.cpio|*.obscpio) cpio -idmvF "$full_path" ;; (*.zpaq) zpaq x "$full_path" ;; + (*.zlib) zlib-flate -uncompress < "$full_path" > "${file:r}" ;; (*) echo "extract: '$file' cannot be extracted" >&2 success=1 ;; From 444e715766c4a8b267dba82f3f0f562584d61adc Mon Sep 17 00:00:00 2001 From: rogarb <69053978+rogarb@users.noreply.github.com> Date: Mon, 22 May 2023 10:49:10 +0000 Subject: [PATCH 201/321] feat(bureau): ignore hidden git repos (#11707) The git_prompt_info() function in lib/git.zsh ignores git repos which contains a specific config key, allowing to effectively "hide" them from the prompt. Unfortunately, the bureau theme doesn't use the library function to build its prompt. This commit modifies the specific prompt generation function in the bureau theme in order to achieve the same behaviour. --- themes/bureau.zsh-theme | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/themes/bureau.zsh-theme b/themes/bureau.zsh-theme index 698aa2ff..9943a0c8 100644 --- a/themes/bureau.zsh-theme +++ b/themes/bureau.zsh-theme @@ -67,6 +67,12 @@ bureau_git_status() { } bureau_git_prompt() { + # ignore non git folders and hidden repos (adapted from lib/git.zsh) + if ! command git rev-parse --git-dir &> /dev/null \ + || [[ "$(command git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then + return + fi + # check git information local gitinfo=$(bureau_git_info) if [[ -z "$gitinfo" ]]; then From 902b79e635fedf4a12542d2ed8bd29665d3d281c Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 23 May 2023 08:43:47 +0200 Subject: [PATCH 202/321] fix(functions): use `command` env Closes #11709 --- lib/functions.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/functions.zsh b/lib/functions.zsh index 1d85ea38..a252d0a3 100644 --- a/lib/functions.zsh +++ b/lib/functions.zsh @@ -5,7 +5,7 @@ function zsh_stats() { } function uninstall_oh_my_zsh() { - env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh" + command env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh" } function upgrade_oh_my_zsh() { From 1bbe4d8d2431b5ac06d7402b570431884786db58 Mon Sep 17 00:00:00 2001 From: Felipe Francisco Date: Tue, 23 May 2023 03:46:46 -0300 Subject: [PATCH 203/321] feat(half-life): add virtualenv prompt (#11708) --- themes/half-life.zsh-theme | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/themes/half-life.zsh-theme b/themes/half-life.zsh-theme index c4d78512..2ad84ac8 100644 --- a/themes/half-life.zsh-theme +++ b/themes/half-life.zsh-theme @@ -89,5 +89,9 @@ ZSH_THEME_RUBY_PROMPT_PREFIX="with%F{red} " ZSH_THEME_RUBY_PROMPT_SUFFIX="%{$reset_color%}" ZSH_THEME_RVM_PROMPT_OPTIONS="v g" +# virtualenv prompt settings +ZSH_THEME_VIRTUALENV_PREFIX=" with%F{red} " +ZSH_THEME_VIRTUALENV_SUFFIX="%{$reset_color%}" + setopt prompt_subst -PROMPT="${purple}%n%{$reset_color%} in ${limegreen}%~%{$reset_color%}\$(ruby_prompt_info)\$vcs_info_msg_0_${orange} λ%{$reset_color%} " +PROMPT="${purple}%n%{$reset_color%} in ${limegreen}%~%{$reset_color%}\$(virtualenv_prompt_info)\$(ruby_prompt_info)\$vcs_info_msg_0_${orange} λ%{$reset_color%} " From ec369bb38e873fa2e8954bc45bc192fdb0051313 Mon Sep 17 00:00:00 2001 From: rogarb <69053978+rogarb@users.noreply.github.com> Date: Wed, 24 May 2023 12:32:26 +0000 Subject: [PATCH 204/321] fix(bureau): properly display git stash info (#11711) --- themes/bureau.zsh-theme | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/bureau.zsh-theme b/themes/bureau.zsh-theme index 9943a0c8..e87a594c 100644 --- a/themes/bureau.zsh-theme +++ b/themes/bureau.zsh-theme @@ -15,6 +15,7 @@ ZSH_THEME_GIT_PROMPT_BEHIND="%{$fg[magenta]%}▾%{$reset_color%}" ZSH_THEME_GIT_PROMPT_STAGED="%{$fg_bold[green]%}●%{$reset_color%}" ZSH_THEME_GIT_PROMPT_UNSTAGED="%{$fg_bold[yellow]%}●%{$reset_color%}" ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg_bold[red]%}●%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_STASHED="(%{$fg_bold[blue]%}✹%{$reset_color%})" bureau_git_info () { local ref From 5901f30b44fc5a3055e6b801d3d71af6d2359ee8 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Thu, 25 May 2023 18:43:01 +0800 Subject: [PATCH 205/321] feat(archlinux): optimize `paclist` and `pacdisowned` (#11398) Co-authored-by: ratijas --- plugins/archlinux/README.md | 1 + plugins/archlinux/archlinux.plugin.zsh | 23 ++++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/plugins/archlinux/README.md b/plugins/archlinux/README.md index fd772c61..5e015dba 100644 --- a/plugins/archlinux/README.md +++ b/plugins/archlinux/README.md @@ -181,3 +181,4 @@ whether the package manager is installed, checked in the following order: - Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info - Jeff M. Hubbard - jeffmhubbard@gmail.com - K. Harishankar(harishnkr) - hari2menon1234@gmail.com +- WH-2099 - wh2099@outlook.com \ No newline at end of file diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index da170f48..796ff7ad 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/plugins/archlinux/archlinux.plugin.zsh @@ -25,27 +25,28 @@ alias pacown='pacman -Qo' alias pacupd="sudo pacman -Sy" function paclist() { - # Based on https://bbs.archlinux.org/viewtopic.php?id=93683 - pacman -Qqe | \ - xargs -I '{}' \ - expac "${bold_color}% 20n ${fg_no_bold[white]}%d${reset_color}" '{}' + local pkgs=$(LC_ALL=C pacman -Qqe) + for pkg in ${(f)pkgs}; do + pacman -Qs --color=auto "^${pkg}\$" || break + done } function pacdisowned() { - local tmp db fs - tmp=${TMPDIR-/tmp}/pacman-disowned-$UID-$$ - db=$tmp/db - fs=$tmp/fs + local tmp_dir db fs + tmp_dir=$(mktemp --directory) + db=$tmp_dir/db + fs=$tmp_dir/fs - mkdir "$tmp" - trap 'rm -rf "$tmp"' EXIT + trap "rm -rf $tmp_dir" EXIT pacman -Qlq | sort -u > "$db" - find /bin /etc /lib /sbin /usr ! -name lost+found \ + find /etc /usr ! -name lost+found \ \( -type d -printf '%p/\n' -o -print \) | sort > "$fs" comm -23 "$fs" "$db" + + rm -rf $tmp_dir } alias pacmanallkeys='sudo pacman-key --refresh-keys' From fb4213c34ff8ec83cbe6251f432fdac383378562 Mon Sep 17 00:00:00 2001 From: Tom D Date: Fri, 26 May 2023 09:43:17 +0200 Subject: [PATCH 206/321] perf(git): improve `gunwip` alias (#11714) --- plugins/git/README.md | 2 +- plugins/git/git.plugin.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index f87d3fbc..2742aa53 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -186,7 +186,7 @@ plugins=(... git) | gtv | git tag \| sort -V | | gtl | gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl | | gunignore | git update-index --no-assume-unchanged | -| gunwip | git log --max-count=1 \| grep -q -c "\-\-wip\-\-" && git reset HEAD~1 | +| gunwip | git rev-list --max-count=1 --format="%s" HEAD \| grep -q "\-\-wip\-\-" && git reset HEAD~1 | | gup | git pull --rebase | | gupv | git pull --rebase --verbose | | gupa | git pull --rebase --autostash | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 3c8d53c8..4be865f6 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -312,7 +312,7 @@ alias gtv='git tag | sort -V' alias gtl='gtl(){ git tag --sort=-v:refname -n --list "${1}*" }; noglob gtl' alias gunignore='git update-index --no-assume-unchanged' -alias gunwip='git log --max-count=1 | grep -q -c "\--wip--" && git reset HEAD~1' +alias gunwip='git rev-list --max-count=1 --format="%s" HEAD | grep -q "\--wip--" && git reset HEAD~1' alias gup='git pull --rebase' alias gupv='git pull --rebase --verbose' alias gupa='git pull --rebase --autostash' From 00241073105643874531e1826b7df6d2cb3cadfb Mon Sep 17 00:00:00 2001 From: William Snyders Date: Wed, 31 May 2023 14:59:41 -0700 Subject: [PATCH 207/321] fix(gcloud): update AUR default location (#11718) --- plugins/gcloud/gcloud.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/gcloud/gcloud.plugin.zsh b/plugins/gcloud/gcloud.plugin.zsh index 30f1dba8..9c26aea1 100644 --- a/plugins/gcloud/gcloud.plugin.zsh +++ b/plugins/gcloud/gcloud.plugin.zsh @@ -14,6 +14,7 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then "/usr/lib/google-cloud-sdk" "/usr/lib64/google-cloud-sdk" "/opt/google-cloud-sdk" + "/opt/google-cloud-cli" "/opt/local/libexec/google-cloud-sdk" ) From 6101106916147b1716ff2d5de4a53260e7607bae Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 2 Jun 2023 21:37:48 +0200 Subject: [PATCH 208/321] feat(install): deploy installer to install.ohmyz.sh (#11722) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- .github/workflows/installer.yml | 55 +++++++++++++++++++++++ .github/workflows/installer/.gitignore | 1 + .github/workflows/installer/.vercelignore | 2 + .github/workflows/installer/vercel.json | 14 ++++++ .github/workflows/main.yml | 2 - 5 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/installer.yml create mode 100644 .github/workflows/installer/.gitignore create mode 100644 .github/workflows/installer/.vercelignore create mode 100644 .github/workflows/installer/vercel.json diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml new file mode 100644 index 00000000..ac88d10b --- /dev/null +++ b/.github/workflows/installer.yml @@ -0,0 +1,55 @@ +name: Test and Deploy installer +on: + workflow_dispatch: {} + push: + paths: + - tools/install.sh + - .github/workflows/installer + - .github/workflows/installer.yml + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: false + +permissions: + contents: read # to checkout + +jobs: + test: + name: Test installer + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: + - ubuntu-latest + - macos-latest + steps: + - name: Set up git repository + uses: actions/checkout@v3 + - name: Install zsh + if: runner.os == 'Linux' + run: sudo apt-get update; sudo apt-get install zsh + - name: Test installer + run: sh ./tools/install.sh + + deploy: + name: Deploy installer in install.ohmyz.sh + if: github.ref == 'refs/heads/master' + runs-on: ubuntu-latest + environment: vercel + needs: + - test + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Install Vercel CLI + run: npm install -g vercel + - name: Setup project and deploy + env: + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} + run: | + cp tools/install.sh .github/workflows/installer/install.sh + cd .github/workflows/installer + vc link --yes -t ${{ secrets.VERCEL_TOKEN }} + vc deploy --prod -t ${{ secrets.VERCEL_TOKEN }} diff --git a/.github/workflows/installer/.gitignore b/.github/workflows/installer/.gitignore new file mode 100644 index 00000000..f66fce31 --- /dev/null +++ b/.github/workflows/installer/.gitignore @@ -0,0 +1 @@ +install.sh diff --git a/.github/workflows/installer/.vercelignore b/.github/workflows/installer/.vercelignore new file mode 100644 index 00000000..41b23336 --- /dev/null +++ b/.github/workflows/installer/.vercelignore @@ -0,0 +1,2 @@ +/* +!/install.sh diff --git a/.github/workflows/installer/vercel.json b/.github/workflows/installer/vercel.json new file mode 100644 index 00000000..8c5aec5e --- /dev/null +++ b/.github/workflows/installer/vercel.json @@ -0,0 +1,14 @@ +{ + "headers": [ + { + "source": "/((?!favicon.ico).*)", + "headers": [{ "key": "Content-Type", "value": "text/plain" }] + } + ], + "rewrites": [ + { + "source": "/((?!favicon.ico|install.sh).*)", + "destination": "/install.sh" + } + ] +} diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 8ee2df3d..57403629 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -31,8 +31,6 @@ jobs: - name: Install zsh if: runner.os == 'Linux' run: sudo apt-get update; sudo apt-get install zsh - - name: Test installer - run: sh ./tools/install.sh - name: Check syntax run: | for file in ./oh-my-zsh.sh \ From 62ab5406dd89848bb26e8c6e648eb7d860e9dce5 Mon Sep 17 00:00:00 2001 From: Lawrence Shah Date: Mon, 5 Jun 2023 01:20:32 -0700 Subject: [PATCH 209/321] docs(custom): update comments in example files (#11727) --- custom/example.zsh | 18 ++++++++++-------- custom/plugins/example/example.plugin.zsh | 1 + custom/themes/example.zsh-theme | 2 ++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/custom/example.zsh b/custom/example.zsh index c505a967..21a8d8be 100644 --- a/custom/example.zsh +++ b/custom/example.zsh @@ -1,10 +1,12 @@ -# You can put files here to add functionality separated per file, which -# will be ignored by git. -# Files on the custom/ directory will be automatically loaded by the init -# script, in alphabetical order. - -# For example: add yourself some shortcuts to projects you often work on. -# +# Put files in this folder to add your own custom functionality. +# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization +# +# Files in the custom/ directory will be: +# - loaded automatically by the init script, in alphabetical order +# - loaded last, after all built-ins in the lib/ directory, to override them +# - ignored by git by default +# +# Example: add custom/shortcuts.zsh for shortcuts to your local projects +# # brainstormr=~/Projects/development/planetargon/brainstormr # cd $brainstormr -# diff --git a/custom/plugins/example/example.plugin.zsh b/custom/plugins/example/example.plugin.zsh index 406f2744..83611fe3 100644 --- a/custom/plugins/example/example.plugin.zsh +++ b/custom/plugins/example/example.plugin.zsh @@ -1,2 +1,3 @@ # Add your own custom plugins in the custom/plugins directory. Plugins placed # here will override ones with the same name in the main plugins directory. +# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-plugins diff --git a/custom/themes/example.zsh-theme b/custom/themes/example.zsh-theme index ef8f1c63..494d029e 100644 --- a/custom/themes/example.zsh-theme +++ b/custom/themes/example.zsh-theme @@ -1,4 +1,6 @@ # Put your custom themes in this folder. +# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes +# # Example: PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% " From b36c90d9abd2fd2ffe53d19b11e47077dfdb38a8 Mon Sep 17 00:00:00 2001 From: Diego Costa R <62116423+diegocostares@users.noreply.github.com> Date: Mon, 5 Jun 2023 04:25:17 -0400 Subject: [PATCH 210/321] feat(autoenv): macOS compatibility, add more dirs (#11724) Co-authored-by: Carlo Sala --- plugins/autoenv/autoenv.plugin.zsh | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/autoenv/autoenv.plugin.zsh b/plugins/autoenv/autoenv.plugin.zsh index 229a8a83..cbf7cefb 100644 --- a/plugins/autoenv/autoenv.plugin.zsh +++ b/plugins/autoenv/autoenv.plugin.zsh @@ -17,9 +17,13 @@ if ! type autoenv_init >/dev/null; then /usr/local/bin /usr/share/autoenv-git ~/Library/Python/bin + .venv/bin + venv/bin + env/bin + .env/bin ) for d ( $install_locations ); do - if [[ -e $d/activate.sh ]]; then + if [[ -e $d/activate || -e $d/activate.sh ]]; then autoenv_dir=$d break fi @@ -29,13 +33,13 @@ if ! type autoenv_init >/dev/null; then # Look for Homebrew path as a last resort if [[ -z "$autoenv_dir" ]] && (( $+commands[brew] )); then d=$(brew --prefix)/opt/autoenv - if [[ -e $d/activate.sh ]]; then + if [[ -e $d/activate || -e $d/activate.sh ]]; then autoenv_dir=$d fi fi # Complain if autoenv is not installed - if [[ -z $autoenv_dir ]]; then + if [[ -z $autoenv_dir ]]; then cat <&2 -------- AUTOENV --------- Could not locate autoenv installation. @@ -46,7 +50,11 @@ END return 1 fi # Load autoenv - source $autoenv_dir/activate.sh + if [[ -e $autoenv_dir/activate ]]; + source $autoenv_dir/activate + else + source $autoenv_dir/activate.sh + fi fi } [[ $? != 0 ]] && return $? From d1c64bfda30ad56bac09f11c920b93b94dab7f9f Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 5 Jun 2023 10:26:36 +0200 Subject: [PATCH 211/321] fix(autoenv): typo --- plugins/autoenv/autoenv.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/autoenv/autoenv.plugin.zsh b/plugins/autoenv/autoenv.plugin.zsh index cbf7cefb..2f84f0ac 100644 --- a/plugins/autoenv/autoenv.plugin.zsh +++ b/plugins/autoenv/autoenv.plugin.zsh @@ -50,7 +50,7 @@ END return 1 fi # Load autoenv - if [[ -e $autoenv_dir/activate ]]; + if [[ -e $autoenv_dir/activate ]]; then source $autoenv_dir/activate else source $autoenv_dir/activate.sh From 115cee17015e4b5665e16dc4fd15c53e06a22f9a Mon Sep 17 00:00:00 2001 From: Ihor Date: Mon, 5 Jun 2023 10:38:54 +0200 Subject: [PATCH 212/321] feat(git): add `gunwipall` function (#11725) Co-authored-by: Carlo Sala --- plugins/git/README.md | 1 + plugins/git/git.plugin.zsh | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 2742aa53..bf4b19f3 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -254,6 +254,7 @@ These features allow to pause a branch development and switch to another one (_" | work_in_progress | Echoes a warning if the current branch is a wip | | gwip | Commit wip branch | | gunwip | Uncommit wip branch | +| gunwipall | Uncommit `--wip--` commits recursively | ### Deprecated functions diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 4be865f6..19212430 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -27,6 +27,20 @@ function work_in_progress() { command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!" } +# Same as `gunwip` but recursive +# "Unwips" all recent `--wip--` commits in loop until there is no left +function gunwipall() { + while true; do + commit_message=$(git rev-list --max-count=1 --format="%s" HEAD) + if [[ $commit_message =~ "--wip--" ]]; then + git reset "HEAD~1" + (( $? )) && return 1 + else + break + fi + done +} + # Check if main exists and use instead of master function git_main_branch() { command git rev-parse --git-dir &>/dev/null || return From 46c70406dd0b26bbd61210873ad6c86d9e8ee5da Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 7 Jun 2023 18:43:47 +0200 Subject: [PATCH 213/321] feat(nvm): add `npx` to lazy trigger list Closes #11740 --- plugins/nvm/README.md | 2 +- plugins/nvm/nvm.plugin.zsh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index d3fd980b..6830c14d 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -26,7 +26,7 @@ These settings should go in your zshrc file, before Oh My Zsh is sourced: #### Lazy startup This option will help you to defer nvm's load until you use it to speed-up your zsh startup. This will source -nvm script only when using it, and will create a function for `node`, `npm`, `pnpm`, `yarn`, and the +nvm script only when using it, and will create a function for `node`, `npm`, `npx`, `pnpm`, `yarn`, and the command(s) specified by `lazy-cmd` option, so when you call either of them, nvm will be loaded and run with default version. To enable it, you can add this snippet to your zshrc, before Oh My Zsh is sourced: diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 20697d67..31d27541 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -43,8 +43,8 @@ if zstyle -t ':omz:plugins:nvm' lazy; then # Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd eval " - function nvm node npm pnpm yarn $nvm_lazy_cmd { - unfunction nvm node npm pnpm yarn $nvm_lazy_cmd + function nvm node npm npx pnpm yarn $nvm_lazy_cmd { + unfunction nvm node npm npx pnpm yarn $nvm_lazy_cmd # Load nvm if it exists in \$NVM_DIR [[ -f \"\$NVM_DIR/nvm.sh\" ]] && source \"\$NVM_DIR/nvm.sh\" \"\$0\" \"\$@\" From 50c678687e73d1433f278b7bb7f168e8fa817670 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 8 Jun 2023 18:47:05 +0200 Subject: [PATCH 214/321] fix(termsupport): fix pwd report for Konsole (#11730) The Konsole terminal shows an error if the host is provided in the OSC 7 sequence. Fixes #11730 --- lib/termsupport.zsh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index cf8f0874..14598270 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -150,8 +150,11 @@ function omz_termsupport_cwd { URL_HOST="$(omz_urlencode -P $HOST)" || return 1 URL_PATH="$(omz_urlencode -P $PWD)" || return 1 + # Konsole errors if the HOST is provided + [[ -z "$KONSOLE_VERSION" ]] || URL_HOST="" + # common control sequence (OSC 7) to set current host and path - printf "\e]7;%s\a" "file://${URL_HOST}${URL_PATH}" + printf "\e]7;file://%s%s\e\\" "${URL_HOST}" "${URL_PATH}" } # Use a precmd hook instead of a chpwd hook to avoid contaminating output From cb8b677488c7a20278917af58dfccd72cd40e1b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 11 Jun 2023 17:02:48 +0200 Subject: [PATCH 215/321] fix(termsupport): don't report current working directory in SSH sessions (#11703) --- lib/termsupport.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 14598270..6d969503 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -121,8 +121,8 @@ fi # # As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC. -# Don't define the function if we're inside Emacs -if [[ -n "$INSIDE_EMACS" ]]; then +# Don't define the function if we're inside Emacs or in an SSH session (#11696) +if [[ -n "$INSIDE_EMACS" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then return fi From 14f0f2971f42952e2eb78fdc2535538e98323b2b Mon Sep 17 00:00:00 2001 From: Oleg Voronkovich Date: Thu, 15 Jun 2023 12:01:02 +0300 Subject: [PATCH 216/321] feat(brew): autoconfigure completions (#11152) --- plugins/brew/README.md | 2 ++ plugins/brew/brew.plugin.zsh | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/plugins/brew/README.md b/plugins/brew/README.md index 412daae6..4730194b 100644 --- a/plugins/brew/README.md +++ b/plugins/brew/README.md @@ -33,6 +33,8 @@ defined for convenience. ## Completion +This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh. + With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the brew installation, so we no longer ship it with the brew plugin; now it only has brew aliases. If you find that brew completion no longer works, make sure you have your Homebrew diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index f6abe087..b52664a3 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -25,6 +25,10 @@ if [[ -z "$HOMEBREW_PREFIX" ]]; then export HOMEBREW_PREFIX="$(brew --prefix)" fi +if [[ -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then + fpath+=("$HOMEBREW_PREFIX/share/zsh/site-functions") +fi + alias bcubc='brew upgrade --cask && brew cleanup' alias bcubo='brew update && brew outdated --cask' alias bcubc='brew upgrade --cask && brew cleanup' From b1b3a020ecb1b4b322efbf8e08ad7fb55e2e687a Mon Sep 17 00:00:00 2001 From: Josh Powell Date: Thu, 15 Jun 2023 05:03:45 -0400 Subject: [PATCH 217/321] feat(rails): add some aliases (#11739) --- plugins/rails/README.md | 5 ++++- plugins/rails/rails.plugin.zsh | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/rails/README.md b/plugins/rails/README.md index b2425aab..c0c37ff3 100644 --- a/plugins/rails/README.md +++ b/plugins/rails/README.md @@ -40,7 +40,10 @@ plugins=(... rails) | `rn` | `rails notes` | Search for notes (`FIXME`, `TODO`) in code comments | | `rp` | `rails plugin` | Run a Rails plugin command | | `rr` | `rails routes` | List all defined routes | -| `rrg` | `rails routes \| grep` | List and filter the defined routes | +| `rrc` | `rails routes --controller` | List and filter routes mapped to specific controller | +| `rre` | `rails routes --expanded` | List all defined routes in expanded table mode | +| `rrg` | `rails routes --grep` | List and filter the defined routes | +| `rru` | `rails routes --unused` | List unused routes | | `rs` | `rails server` | Launch a web server | | `rsb` | `rails server --bind` | Launch a web server binding it to a specific IP | | `rsd` | `rails server --debugger` | Launch a web server with debugger | diff --git a/plugins/rails/rails.plugin.zsh b/plugins/rails/rails.plugin.zsh index 015dc9ec..75dd9b0c 100644 --- a/plugins/rails/rails.plugin.zsh +++ b/plugins/rails/rails.plugin.zsh @@ -68,7 +68,10 @@ alias rmd='rails middleware' alias rn='rails notes' alias rp='rails plugin' alias rr='rails routes' -alias rrg='rails routes | grep' +alias rrc='rails routes --controller' +alias rre='rails routes --expanded' +alias rrg='rails routes --grep' +alias rru='rails routes --unused' alias rs='rails server' alias rsb='rails server --bind' alias rsd='rails server --debugger' From 68f3ebb4de11aa2013ccc5252d4415840e0d7342 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 15 Jun 2023 11:16:25 +0200 Subject: [PATCH 218/321] feat(docker): generate completion function Closes #10825 Closes #10912 Closes #11751 --- plugins/docker/_docker | 3123 ------------------------------ plugins/docker/docker.plugin.zsh | 10 + 2 files changed, 10 insertions(+), 3123 deletions(-) delete mode 100644 plugins/docker/_docker diff --git a/plugins/docker/_docker b/plugins/docker/_docker deleted file mode 100644 index e6a12d77..00000000 --- a/plugins/docker/_docker +++ /dev/null @@ -1,3123 +0,0 @@ -#compdef docker dockerd -# -# zsh completion for docker (http://docker.com) -# -# version: 0.3.0 -# github: https://github.com/felixr/docker-zsh-completion -# -# contributors: -# - Felix Riedel -# - Steve Durrheimer -# - Vincent Bernat -# - Rohan Verma -# -# license: -# -# Copyright (c) 2013, Felix Riedel -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# * Neither the name of the nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -# - -# Short-option stacking can be enabled with: -# zstyle ':completion:*:*:docker:*' option-stacking yes -# zstyle ':completion:*:*:docker-*:*' option-stacking yes -__docker_arguments() { - if zstyle -t ":completion:${curcontext}:" option-stacking; then - print -- -s - fi -} - -__docker_get_containers() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local kind type line s - declare -a running stopped lines args names - - kind=$1; shift - type=$1; shift - [[ $kind = (stopped|all) ]] && args=($args -a) - - lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line - lines=(${lines[2,-1]}) - - # Container ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}" - s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" - s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" - if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then - stopped=($stopped $s) - else - running=($running $s) - fi - done - fi - - # Names: we only display the one without slash. All other names - # are generated and may clutter the completion. However, with - # Swarm, all names may be prefixed by the swarm node name. - if [[ $type = (names|all) ]]; then - for line in $lines; do - names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}}) - # First step: find a common prefix and strip it (swarm node case) - (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/} - # Second step: only keep the first name without a / - s=${${names:#*/*}[1]} - # If no name, well give up. - (( $#s != 0 )) || continue - s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" - s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" - if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then - stopped=($stopped $s) - else - running=($running $s) - fi - done - fi - - [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0 - [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0 - return ret -} - -__docker_complete_stopped_containers() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers stopped all "$@" -} - -__docker_complete_running_containers() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers running all "$@" -} - -__docker_complete_containers() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers all all "$@" -} - -__docker_complete_containers_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers all ids "$@" -} - -__docker_complete_containers_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_containers all names "$@" -} - -__docker_complete_info_plugins() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - emulate -L zsh - setopt extendedglob - local -a plugins - plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: }) - _describe -t plugins "$1 plugins" plugins && ret=0 - return ret -} - -__docker_complete_images() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a images - images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}}) - _describe -t docker-images "images" images && ret=0 - __docker_complete_repositories_with_tags && ret=0 - return ret -} - -__docker_complete_repositories() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a repos - repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]}) - repos=(${repos#}) - _describe -t docker-repos "repositories" repos && ret=0 - return ret -} - -__docker_complete_repositories_with_tags() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a repos onlyrepos matched - declare m - repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *}) - repos=(${${repos%:::}#}) - # Check if we have a prefix-match for the current prefix. - onlyrepos=(${repos%::*}) - for m in $onlyrepos; do - [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && { - # Yes, complete with tags - repos=(${${repos/:::/:}/:/\\:}) - _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0 - return ret - } - done - # No, only complete repositories - onlyrepos=(${${repos%:::*}/:/\\:}) - _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0 - - return ret -} - -__docker_search() { - [[ $PREFIX = -* ]] && return 1 - local cache_policy - zstyle -s ":completion:${curcontext}:" cache-policy cache_policy - if [[ -z "$cache_policy" ]]; then - zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy - fi - - local searchterm cachename - searchterm="${words[$CURRENT]%/}" - cachename=_docker-search-$searchterm - - local expl - local -a result - if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ - && ! _retrieve_cache ${cachename#_}; then - _message "Searching for ${searchterm}..." - result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]}) - _store_cache ${cachename#_} result - fi - _wanted dockersearch expl 'available images' compadd -a result -} - -__docker_get_log_options() { - [[ $PREFIX = -* ]] && return 1 - - integer ret=1 - local log_driver=${opt_args[--log-driver]:-"all"} - local -a common_options common_options2 awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options - - common_options=("max-buffer-size" "mode") - common_options2=("env" "env-regex" "labels") - awslogs_options=($common_options "awslogs-create-group" "awslogs-datetime-format" "awslogs-group" "awslogs-multiline-pattern" "awslogs-region" "awslogs-stream" "tag") - fluentd_options=($common_options $common_options2 "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "fluentd-sub-second-precision" "tag") - gcplogs_options=($common_options $common_options2 "gcp-log-cmd" "gcp-meta-id" "gcp-meta-name" "gcp-meta-zone" "gcp-project") - gelf_options=($common_options $common_options2 "gelf-address" "gelf-compression-level" "gelf-compression-type" "tag") - journald_options=($common_options $common_options2 "tag") - json_file_options=($common_options $common_options2 "max-file" "max-size") - logentries_options=($common_options $common_options2 "logentries-token" "tag") - syslog_options=($common_options $common_options2 "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag") - splunk_options=($common_options $common_options2 "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag") - - [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0 - [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0 - [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0 - [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0 - [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0 - [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0 - [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0 - [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0 - [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0 - - return ret -} - -__docker_complete_log_drivers() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog) - _describe -t log-drivers "log drivers" drivers && ret=0 - return ret -} - -__docker_complete_log_options() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (syslog-format) - local opts=('rfc3164' 'rfc5424' 'rfc5424micro') - _describe -t syslog-format-opts "syslog format options" opts && ret=0 - ;; - (mode) - local opts=('blocking' 'non-blocking') - _describe -t mode-opts "mode options" opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - __docker_get_log_options -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_detach_keys() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - compset -P "*," - keys=(${:-{a-z}}) - ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}}) - _describe -t detach_keys "[a-z]" keys -qS "," && ret=0 - _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0 -} - -__docker_complete_pid() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local -a opts vopts - - opts=('host') - vopts=('container') - - if compset -P '*:'; then - case "${${words[-1]%:*}#*=}" in - (container) - __docker_complete_running_containers && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0 - _describe -t pid-opts "PID Options" opts && ret=0 - fi - - return ret -} - -__docker_complete_runtimes() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - emulate -L zsh - setopt extendedglob - local -a runtimes_opts - runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}}) - _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0 -} - -__docker_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (ancestor) - __docker_complete_images && ret=0 - ;; - (before|since) - __docker_complete_containers && ret=0 - ;; - (health) - health_opts=('healthy' 'none' 'starting' 'unhealthy') - _describe -t health-filter-opts "health filter options" health_opts && ret=0 - ;; - (id) - __docker_complete_containers_ids && ret=0 - ;; - (is-task) - _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 - ;; - (name) - __docker_complete_containers_names && ret=0 - ;; - (network) - __docker_complete_networks && ret=0 - ;; - (status) - status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing') - _describe -t status-filter-opts "status filter options" status_opts && ret=0 - ;; - (volume) - __docker_complete_volumes && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('ancestor' 'before' 'exited' 'expose' 'health' 'id' 'label' 'name' 'network' 'publish' 'since' 'status' 'volume') - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_search_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a boolean_opts opts - - boolean_opts=('true' 'false') - opts=('is-automated' 'is-official' 'stars') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (is-automated|is-official) - _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_images_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a boolean_opts opts - - boolean_opts=('true' 'false') - opts=('before' 'dangling' 'label' 'reference' 'since') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (before|reference|since) - __docker_complete_images && ret=0 - ;; - (dangling) - _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_events_filter() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a opts - - opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'scope' 'type' 'volume') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (container) - __docker_complete_containers && ret=0 - ;; - (daemon) - emulate -L zsh - setopt extendedglob - local -a daemon_opts - daemon_opts=( - ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}} - ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:} - ) - _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0 - ;; - (event) - local -a event_opts - event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disable' 'disconnect' 'enable' 'exec_create' 'exec_detach' - 'exec_start' 'export' 'health_status' 'import' 'install' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'remove' 'rename' 'resize' - 'restart' 'save' 'start' 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update') - _describe -t event-filter-opts "event filter options" event_opts && ret=0 - ;; - (image) - __docker_complete_images && ret=0 - ;; - (network) - __docker_complete_networks && ret=0 - ;; - (scope) - local -a scope_opts - scope_opts=('local' 'swarm') - _describe -t scope-filter-opts "scope filter options" scope_opts && ret=0 - ;; - (type) - local -a type_opts - type_opts=('container' 'daemon' 'image' 'network' 'volume') - _describe -t type-filter-opts "type filter options" type_opts && ret=0 - ;; - (volume) - __docker_complete_volumes && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_prune_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a opts - - opts=('until') - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - *) - _message 'value' && ret=0 - ;; - esac - else - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -# BO checkpoint - -__docker_checkpoint_commands() { - local -a _docker_checkpoint_subcommands - _docker_checkpoint_subcommands=( - "create:Create a checkpoint from a running container" - "ls:List checkpoints for a container" - "rm:Remove a checkpoint" - ) - _describe -t docker-checkpoint-commands "docker checkpoint command" _docker_checkpoint_subcommands -} - -__docker_checkpoint_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)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ - "($help)--leave-running[Leave the container running after checkpoint]" \ - "($help -)1:container:__docker_complete_running_containers" \ - "($help -)2:checkpoint: " && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ - "($help -)1:container:__docker_complete_containers" && ret=0 - ;; - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ - "($help -)1:container:__docker_complete_containers" \ - "($help -)2:checkpoint: " && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_checkpoint_commands" && ret=0 - ;; - esac - - return ret -} - -# EO checkpoint - -# BO container - -__docker_container_commands() { - local -a _docker_container_subcommands - _docker_container_subcommands=( - "attach:Attach to a running container" - "commit:Create a new image from a container's changes" - "cp:Copy files/folders between a container and the local filesystem" - "create:Create a new container" - "diff:Inspect changes on a container's filesystem" - "exec:Execute a command in a running container" - "export:Export a container's filesystem as a tar archive" - "inspect:Display detailed information on one or more containers" - "kill:Kill one or more running containers" - "logs:Fetch the logs of a container" - "ls:List containers" - "pause:Pause all processes within one or more containers" - "port:List port mappings or a specific mapping for the container" - "prune:Remove all stopped containers" - "rename:Rename a container" - "restart:Restart one or more containers" - "rm:Remove one or more containers" - "run:Create and run a new container from an image" - "start:Start one or more stopped containers" - "stats:Display a live stream of container(s) resource usage statistics" - "stop:Stop one or more running containers" - "top:Display the running processes of a container" - "unpause:Unpause all processes within one or more containers" - "update:Update configuration of one or more containers" - "wait:Block until one or more containers stop, then print their exit codes" - ) - _describe -t docker-container-commands "docker container command" _docker_container_subcommands -} - -__docker_container_subcommand() { - local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update - local expl help="--help" - integer ret=1 - - opts_attach_exec_run_start=( - "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys" - ) - opts_create_run=( - "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)" - "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " - "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: " - "($help)*--cap-add=[Add Linux capabilities]:capability: " - "($help)*--cap-drop=[Drop Linux capabilities]:capability: " - "($help)--cgroupns=[Cgroup namespace mode to use]:cgroup namespace mode: " - "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " - "($help)--cidfile=[Write the container ID to the file]:CID file:_files" - "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: " - "($help)*--device=[Add a host device to the container]:device:_files" - "($help)*--device-cgroup-rule=[Add a rule to the cgroup allowed devices list]:device:cgroup: " - "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: " - "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: " - "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: " - "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: " - "($help)--disable-content-trust[Skip image verification]" - "($help)*--dns=[Custom DNS servers]:DNS server: " - "($help)*--dns-option=[Custom DNS options]:DNS option: " - "($help)*--dns-search=[Custom DNS search domains]:DNS domains: " - "($help)*--domainname=[Container NIS domain name]:domainname:_hosts" - "($help)*"{-e=,--env=}"[Environment variables]:environment variable: " - "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: " - "($help)*--env-file=[Read environment variables from a file]:environment file:_files" - "($help)*--expose=[Expose a port from the container without publishing it]: " - "($help)*--gpus=[GPU devices to add to the container ('all' to pass all GPUs)]:device: " - "($help)*--group-add=[Set one or more supplementary user groups for the container]:group:_groups" - "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts" - "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" - "($help)--init[Run an init inside the container that forwards signals and reaps processes]" - "($help)--ip=[IPv4 address]:IPv4: " - "($help)--ip6=[IPv6 address]:IPv6: " - "($help)--ipc=[IPC namespace to use]:IPC namespace: " - "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" - "($help)*--link=[Add link to another container]:link:->link" - "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: " - "($help)*"{-l=,--label=}"[Container metadata]:label: " - "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" - "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options" - "($help)--mac-address=[Container MAC address]:MAC address: " - "($help)*--mount=[Attach a filesystem mount to the container]:mount: " - "($help)--name=[Container name]:name: " - "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" - "($help)*--network-alias=[Add network-scoped alias for the container]:alias: " - "($help)--oom-kill-disable[Disable OOM Killer]" - "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]" - "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" - "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]" - "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports" - "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid" - "($help)--privileged[Give extended privileges to this container]" - "($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]" - "($help)--read-only[Mount the container's root filesystem as read only]" - "($help)*--security-opt=[Security options]:security option: " - "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " - "($help)--stop-signal=[Signal to kill a container]:signal:_signals" - "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: " - "($help)*--sysctl=-[sysctl options]:sysctl: " - "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" - "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" - "($help)*--ulimit=[ulimit options]:ulimit: " - "($help)--userns=[Container user namespace]:user namespace:(host)" - "($help)--tmpfs[mount tmpfs]" - "($help)*-v[Bind mount a volume]:volume: " - "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)" - "($help)*--volumes-from=[Mount volumes from the specified container]:volume: " - "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" - ) - opts_create_run_update=( - "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)" - "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" - "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " - "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " - "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " - "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " - "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " - "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " - "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: " - "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " - "($help)--memory-reservation=[Memory soft limit]:Memory limit: " - "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " - "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" - "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)" - ) - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (attach) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_attach_exec_run_start \ - "($help)--no-stdin[Do not attach stdin]" \ - "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ - "($help -):containers:__docker_complete_running_containers" && ret=0 - ;; - (commit) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --author)"{-a=,--author=}"[Author]:author: " \ - "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ - "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \ - "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \ - "($help -):container:__docker_complete_containers" \ - "($help -): :__docker_complete_repositories_with_tags" && ret=0 - ;; - (cp) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \ - "($help -)1:container:->container" \ - "($help -)2:hostpath:_files" && ret=0 - case $state in - (container) - if compset -P "*:"; then - _files && ret=0 - else - __docker_complete_containers -qS ":" && ret=0 - fi - ;; - esac - ;; - (create) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_run \ - $opts_create_run_update \ - "($help -): :__docker_complete_images" \ - "($help -):command: _command_names -e" \ - "($help -)*::arguments: _normal" && ret=0 - case $state in - (link) - if compset -P "*:"; then - _wanted alias expl "Alias" compadd -E "" && ret=0 - else - __docker_complete_running_containers -qS ":" && ret=0 - fi - ;; - esac - ;; - (diff) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (exec) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_attach_exec_run_start \ - "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ - "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \ - "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ - "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \ - "($help)--privileged[Give extended Linux capabilities to the command]" \ - "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \ - "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \ - "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" \ - "($help -):containers:__docker_complete_running_containers" \ - "($help -)*::command:->anycommand" && ret=0 - case $state in - (anycommand) - shift 1 words - (( CURRENT-- )) - _normal && ret=0 - ;; - esac - ;; - (export) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -s --size)"{-s,--size}"[Display total file sizes]" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (kill) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (logs) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--details[Show extra details provided to logs]" \ - "($help -f --follow)"{-f,--follow}"[Follow log output]" \ - "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \ - "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ - "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Show all containers]" \ - "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \ - "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only show container IDs]" \ - "($help -s --size)"{-s,--size}"[Display total file sizes]" \ - "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0 - ;; - (pause|unpause) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (port) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:containers:__docker_complete_running_containers" \ - "($help -)2:port:_ports" && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (rename) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -):old name:__docker_complete_containers" \ - "($help -):new name: " && ret=0 - ;; - (restart) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ - "($help -)*:containers:__docker_complete_containers" && ret=0 - ;; - (rm) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force removal]" \ - "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \ - "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \ - "($help -)*:containers:->values" && ret=0 - case $state in - (values) - if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then - __docker_complete_containers && ret=0 - else - __docker_complete_stopped_containers && ret=0 - fi - ;; - esac - ;; - (run) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_run \ - $opts_create_run_update \ - $opts_attach_exec_run_start \ - "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ - "($help)--health-cmd=[Command to run to check health]:command: " \ - "($help)--health-interval=[Time between running the check]:time: " \ - "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \ - "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \ - "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \ - "($help)--rm[Remove intermediate containers when it exits]" \ - "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \ - "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ - "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \ - "($help -): :__docker_complete_images" \ - "($help -):command: _command_names -e" \ - "($help -)*::arguments: _normal" && ret=0 - case $state in - (link) - if compset -P "*:"; then - _wanted alias expl "Alias" compadd -E "" && ret=0 - else - __docker_complete_running_containers -qS ":" && ret=0 - fi - ;; - (storage-opt) - if compset -P "*="; then - _message "value" && ret=0 - else - opts=('size') - _describe -t filter-opts "storage options" opts -qS "=" && ret=0 - fi - ;; - esac - ;; - (start) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_attach_exec_run_start \ - "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \ - "($help -i --interactive)"{-i,--interactive}"[Attach container's stdin]" \ - "($help -)*:containers:__docker_complete_stopped_containers" && ret=0 - ;; - (stats) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help)--no-stream[Disable streaming stats and only pull the first result]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (stop) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (top) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:containers:__docker_complete_running_containers" \ - "($help -)*:: :->ps-arguments" && ret=0 - case $state in - (ps-arguments) - _ps && ret=0 - ;; - esac - ;; - (update) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_run_update \ - "($help -)*: :->values" && ret=0 - case $state in - (values) - if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then - __docker_complete_stopped_containers && ret=0 - else - __docker_complete_containers && ret=0 - fi - ;; - esac - ;; - (wait) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:containers:__docker_complete_running_containers" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 - ;; - esac - - return ret -} - -# EO container - -# BO image - -__docker_image_commands() { - local -a _docker_image_subcommands - _docker_image_subcommands=( - "build:Build an image from a Dockerfile" - "history:Show the history of an image" - "import:Import the contents from a tarball to create a filesystem image" - "inspect:Display detailed information on one or more images" - "load:Load an image from a tar archive or STDIN" - "ls:List images" - "prune:Remove unused images" - "pull:Download an image from a registry" - "push:Upload an image to a registry" - "rm:Remove one or more images" - "save:Save one or more images to a tar archive (streamed to STDOUT by default)" - "tag:Tag an image into a repository" - ) - _describe -t docker-image-commands "docker image command" _docker_image_subcommands -} - -__docker_image_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (build) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " \ - "($help)*--build-arg=[Build-time variables]:=: " \ - "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \ - "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \ - "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \ - "($help)--compress[Compress the build context using gzip]" \ - "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \ - "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \ - "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \ - "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \ - "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \ - "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \ - "($help)--disable-content-trust[Skip image verification]" \ - "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \ - "($help)--force-rm[Always remove intermediate containers]" \ - "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \ - "($help)*--label=[Set metadata for an image]:label=value: " \ - "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \ - "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \ - "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \ - "($help)--no-cache[Do not use cache when building the image]" \ - "($help)--pull[Attempt to pull a newer version of the image]" \ - "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \ - "($help)--rm[Remove intermediate containers after a successful build]" \ - "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " \ - "($help)--squash[Squash newly built layers into a single new layer]" \ - "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \ - "($help)--target=[Set the target build stage to build.]" \ - "($help)*--ulimit=[ulimit options]:ulimit: " \ - "($help)--userns=[Container user namespace]:user namespace:(host)" \ - "($help -):path or URL:_directories" && ret=0 - ;; - (history) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ - "($help -)*: :__docker_complete_images" && ret=0 - ;; - (import) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ - "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \ - "($help -):URL:(- http:// file://)" \ - "($help -): :__docker_complete_repositories_with_tags" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -)*:images:__docker_complete_images" && ret=0 - ;; - (load) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \ - "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0 - ;; - (ls|list) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Show all images]" \ - "($help)--digests[Show digests]" \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ - "($help -): :__docker_complete_repositories" && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (pull) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \ - "($help)--disable-content-trust[Skip image verification]" \ - "($help -):name:__docker_search" && ret=0 - ;; - (push) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \ - "($help)--disable-content-trust[Skip image signing]" \ - "($help -): :__docker_complete_images" && ret=0 - ;; - (rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force removal]" \ - "($help)--no-prune[Do not delete untagged parents]" \ - "($help -)*: :__docker_complete_images" && ret=0 - ;; - (save) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \ - "($help -)*: :__docker_complete_images" && ret=0 - ;; - (tag) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -):source:__docker_complete_images"\ - "($help -):destination:__docker_complete_repositories_with_tags" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 - ;; - esac - - return ret -} - -# EO image - -# BO network - -__docker_network_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (driver) - __docker_complete_info_plugins Network && ret=0 - ;; - (id) - __docker_complete_networks_ids && ret=0 - ;; - (name) - __docker_complete_networks_names && ret=0 - ;; - (scope) - opts=('global' 'local' 'swarm') - _describe -t scope-filter-opts "Scope filter options" opts && ret=0 - ;; - (type) - opts=('builtin' 'custom') - _describe -t type-filter-opts "Type filter options" opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('driver' 'id' 'label' 'name' 'scope' 'type') - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_get_networks() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines networks - - type=$1; shift - - lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Network ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" - s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" - networks=($networks $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" - s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" - networks=($networks $s) - done - fi - - _describe -t networks-list "networks" networks "$@" && ret=0 - return ret -} - -__docker_complete_networks() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_networks all "$@" -} - -__docker_complete_networks_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_networks ids "$@" -} - -__docker_complete_networks_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_get_networks names "$@" -} - -__docker_network_commands() { - local -a _docker_network_subcommands - _docker_network_subcommands=( - "connect:Connect a container to a network" - "create:Creates a new network with a name specified by the user" - "disconnect:Disconnects a container from a network" - "inspect:Displays detailed information on a network" - "ls:Lists all the networks created by the user" - "prune:Remove all unused networks" - "rm:Deletes one or more networks" - ) - _describe -t docker-network-commands "docker network command" _docker_network_subcommands -} - -__docker_network_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (connect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ - "($help)--ip=[IPv4 address]:IPv4: " \ - "($help)--ip6=[IPv6 address]:IPv6: " \ - "($help)*--link=[Add a link to another container]:link:->link" \ - "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ - "($help -)1:network:__docker_complete_networks" \ - "($help -)2:containers:__docker_complete_containers" && ret=0 - - case $state in - (link) - if compset -P "*:"; then - _wanted alias expl "Alias" compadd -E "" && ret=0 - else - __docker_complete_running_containers -qS ":" && ret=0 - fi - ;; - esac - ;; - (create) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)--attachable[Enable manual container attachment]" \ - "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \ - "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \ - "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \ - "($help)--internal[Restricts external access to the network]" \ - "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \ - "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \ - "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \ - "($help)--ipv6[Enable IPv6 networking]" \ - "($help)*--label=[Set metadata on a network]:label=value: " \ - "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \ - "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \ - "($help -)1:Network Name: " && ret=0 - ;; - (disconnect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:network:__docker_complete_networks" \ - "($help -)2:containers:__docker_complete_containers" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help)--verbose[Show detailed information]" \ - "($help -)*:network:__docker_complete_networks" && ret=0 - ;; - (ls) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--no-trunc[Do not truncate the output]" \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:network:__docker_complete_networks" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 - ;; - esac - - return ret -} - -# EO network - -# BO node - -__docker_node_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (id) - __docker_complete_nodes_ids && ret=0 - ;; - (membership) - membership_opts=('accepted' 'pending' 'rejected') - _describe -t membership-opts "membership options" membership_opts && ret=0 - ;; - (name) - __docker_complete_nodes_names && ret=0 - ;; - (role) - role_opts=('manager' 'worker') - _describe -t role-opts "role options" role_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('id' 'label' 'membership' 'name' 'node.label' 'role') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_node_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (desired-state) - state_opts=('accepted' 'running' 'shutdown') - _describe -t state-opts "desired state options" state_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('desired-state' 'id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_nodes() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines nodes args - - type=$1; shift - filter=$1; shift - [[ $filter != "none" ]] && args=("-f $filter") - - lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}}) - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Node ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - nodes=($nodes $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[HOSTNAME]},${end[HOSTNAME]}]%% ##}" - nodes=($nodes $s) - done - fi - - _describe -t nodes-list "nodes" nodes "$@" && ret=0 - return ret -} - -__docker_complete_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all none "$@" -} - -__docker_complete_nodes_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes ids none "$@" -} - -__docker_complete_nodes_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes names none "$@" -} - -__docker_complete_pending_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all "membership=pending" "$@" -} - -__docker_complete_manager_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all "role=manager" "$@" -} - -__docker_complete_worker_nodes() { - [[ $PREFIX = -* ]] && return 1 - __docker_nodes all "role=worker" "$@" -} - -__docker_node_commands() { - local -a _docker_node_subcommands - _docker_node_subcommands=( - "demote:Demote a node as manager in the swarm" - "inspect:Display detailed information on one or more nodes" - "ls:List nodes in the swarm" - "promote:Promote a node as manager in the swarm" - "rm:Remove one or more nodes from the swarm" - "ps:List tasks running on one or more nodes, defaults to current node" - "update:Update a node" - ) - _describe -t docker-node-commands "docker node command" _docker_node_subcommands -} - -__docker_node_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \ - "($help -)*:node:__docker_complete_pending_nodes" && ret=0 - ;; - (demote) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:node:__docker_complete_manager_nodes" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help)--pretty[Print the information in a human friendly format]" \ - "($help -)*:node:__docker_complete_nodes" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ls_filters" \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - ;; - (promote) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:node:__docker_complete_worker_nodes" && ret=0 - ;; - (ps) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Display all instances]" \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ps_filters" \ - "($help)--format=[Format the output using the given go template]:template: " \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ - "($help -)*:node:__docker_complete_nodes" && ret=0 - ;; - (update) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--availability=[Availability of the node]:availability:(active pause drain)" \ - "($help)*--label-add=[Add or update a node label]:key=value: " \ - "($help)*--label-rm=[Remove a node label if exists]:label: " \ - "($help)--role=[Role of the node]:role:(manager worker)" \ - "($help -)1:node:__docker_complete_nodes" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0 - ;; - esac - - return ret -} - -# EO node - -# BO plugin - -__docker_plugin_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (capability) - opts=('authz' 'ipamdriver' 'logdriver' 'metricscollector' 'networkdriver' 'volumedriver') - _describe -t capability-opts "capability options" opts && ret=0 - ;; - (enabled) - opts=('false' 'true') - _describe -t enabled-opts "enabled options" opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('capability' 'enabled') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_plugins() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines plugins args - - filter=$1; shift - [[ $filter != "none" ]] && args=("-f $filter") - - lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls $args)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Name - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}" - plugins=($plugins $s) - done - - _describe -t plugins-list "plugins" plugins "$@" && ret=0 - return ret -} - -__docker_complete_plugins() { - [[ $PREFIX = -* ]] && return 1 - __docker_plugins none "$@" -} - -__docker_complete_enabled_plugins() { - [[ $PREFIX = -* ]] && return 1 - __docker_plugins enabled=true "$@" -} - -__docker_complete_disabled_plugins() { - [[ $PREFIX = -* ]] && return 1 - __docker_plugins enabled=false "$@" -} - -__docker_plugin_commands() { - local -a _docker_plugin_subcommands - _docker_plugin_subcommands=( - "disable:Disable a plugin" - "enable:Enable a plugin" - "inspect:Return low-level information about a plugin" - "install:Install a plugin" - "ls:List plugins" - "push:Push a plugin" - "rm:Remove a plugin" - "set:Change settings for a plugin" - "upgrade:Upgrade an existing plugin" - ) - _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands -} - -__docker_plugin_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (disable) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force the disable of an active plugin]" \ - "($help -)1:plugin:__docker_complete_enabled_plugins" && ret=0 - ;; - (enable) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--timeout=[HTTP client timeout (in seconds)]:timeout: " \ - "($help -)1:plugin:__docker_complete_disabled_plugins" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ - "($help -)*:plugin:__docker_complete_plugins" && ret=0 - ;; - (install) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--alias=[Local name for plugin]:alias: " \ - "($help)--disable[Do not enable the plugin on install]" \ - "($help)--disable-content-trust[Skip image verification (default true)]" \ - "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \ - "($help -)1:plugin:__docker_complete_plugins" \ - "($help -)*:key=value: " && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_plugin_complete_ls_filters" \ - "($help --format)--format=[Format the output using the given Go template]:template: " \ - "($help)--no-trunc[Don't truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - ;; - (push) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--disable-content-trust[Skip image verification (default true)]" \ - "($help -)1:plugin:__docker_complete_plugins" && ret=0 - ;; - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force the removal of an active plugin]" \ - "($help -)*:plugin:__docker_complete_plugins" && ret=0 - ;; - (set) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)1:plugin:__docker_complete_plugins" \ - "($help -)*:key=value: " && ret=0 - ;; - (upgrade) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--disable-content-trust[Skip image verification (default true)]" \ - "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \ - "($help)--skip-remote-check[Do not check if specified remote plugin matches existing plugin image]" \ - "($help -)1:plugin:__docker_complete_plugins" \ - "($help -):remote: " && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0 - ;; - esac - - return ret -} - -# EO plugin - -# BO secret - -__docker_secrets() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines secrets - - type=$1; shift - - lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - secrets=($secrets $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - secrets=($secrets $s) - done - fi - - _describe -t secrets-list "secrets" secrets "$@" && ret=0 - return ret -} - -__docker_complete_secrets() { - [[ $PREFIX = -* ]] && return 1 - __docker_secrets all "$@" -} - -__docker_secret_commands() { - local -a _docker_secret_subcommands - _docker_secret_subcommands=( - "create:Create a secret using stdin as content" - "inspect:Display detailed information on one or more secrets" - "ls:List secrets" - "rm:Remove one or more secrets" - ) - _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands -} - -__docker_secret_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) -A '-*' \ - $opts_help \ - "($help)*"{-l=,--label=}"[Secret labels]:label: " \ - "($help -):secret: " && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ - "($help -)*:secret:__docker_complete_secrets" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--format=[Format the output using the given go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - ;; - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:secret:__docker_complete_secrets" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0 - ;; - esac - - return ret -} - -# EO secret - -# BO service - -__docker_service_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (id) - __docker_complete_services_ids && ret=0 - ;; - (mode) - opts=('global' 'replicated') - _describe -t mode-opts "mode options" opts && ret=0 - ;; - (name) - __docker_complete_services_names && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('id' 'label' 'mode' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_service_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (desired-state) - state_opts=('accepted' 'running' 'shutdown') - _describe -t state-opts "desired state options" state_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('desired-state' 'id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_service_complete_placement_pref() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (spread) - opts=('engine.labels' 'node.labels') - _describe -t spread-opts "spread options" opts -qS "." && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('spread') - _describe -t pref-opts "placement pref options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_services() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines services - - type=$1; shift - - lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Service ID - if [[ $type = (ids|all) ]]; then - for line in $lines; do - s="${line[${begin[ID]},${end[ID]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" - services=($services $s) - done - fi - - # Names - if [[ $type = (names|all) ]]; then - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" - services=($services $s) - done - fi - - _describe -t services-list "services" services "$@" && ret=0 - return ret -} - -__docker_complete_services() { - [[ $PREFIX = -* ]] && return 1 - __docker_services all "$@" -} - -__docker_complete_services_ids() { - [[ $PREFIX = -* ]] && return 1 - __docker_services ids "$@" -} - -__docker_complete_services_names() { - [[ $PREFIX = -* ]] && return 1 - __docker_services names "$@" -} - -__docker_service_commands() { - local -a _docker_service_subcommands - _docker_service_subcommands=( - "create:Create a new service" - "inspect:Display detailed information on one or more services" - "logs:Fetch the logs of a service or task" - "ls:List services" - "rm:Remove one or more services" - "rollback:Revert changes to a service's configuration" - "scale:Scale one or multiple replicated services" - "ps:List the tasks of a service" - "update:Update a service" - ) - _describe -t docker-service-commands "docker service command" _docker_service_subcommands -} - -__docker_service_subcommand() { - local -a _command_args opts_help opts_create_update - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - opts_create_update=( - "($help)*--cap-add=[Add Linux capabilities]:capability: " - "($help)*--cap-drop=[Drop Linux capabilities]:capability: " - "($help)*--constraint=[Placement constraints]:constraint: " - "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" - "($help)*"{-e=,--env=}"[Set environment variables]:env: " - "($help)--health-cmd=[Command to run to check health]:command: " - "($help)--health-interval=[Time between running the check]:time: " - "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" - "($help)--health-timeout=[Maximum time to allow one check to run]:time: " - "($help)--hostname=[Service container hostname]:hostname: " \ - "($help)--isolation=[Service container isolation mode]:isolation:(default process hyperv)" \ - "($help)*--label=[Service labels]:label: " - "($help)--limit-cpu=[Limit CPUs]:value: " - "($help)--limit-memory=[Limit Memory]:value: " - "($help)--limit-pids[Limit maximum number of processes (default 0 = unlimited)]" - "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers" - "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options" - "($help)*--mount=[Attach a filesystem mount to the service]:mount: " - "($help)*--network=[Network attachments]:network: " - "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" - "($help)--read-only[Mount the container's root filesystem as read only]" - "($help)--replicas=[Number of tasks]:replicas: " - "($help)--reserve-cpu=[Reserve CPUs]:value: " - "($help)--reserve-memory=[Reserve Memory]:value: " - "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)" - "($help)--restart-delay=[Delay between restart attempts]:delay: " - "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: " - "($help)--restart-window=[Window used to evaluate the restart policy]:duration: " - "($help)--rollback-delay=[Delay between task rollbacks]:duration: " - "($help)--rollback-failure-action=[Action on rollback failure]:action:(continue pause)" - "($help)--rollback-max-failure-ratio=[Failure rate to tolerate during a rollback]:failure rate: " - "($help)--rollback-monitor=[Duration after each task rollback to monitor for failure]:duration: " - "($help)--rollback-parallelism=[Maximum number of tasks rolled back simultaneously]:number: " - "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets" - "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " - "($help)--stop-signal=[Signal to stop the container]:signal:_signals" - "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]" - "($help)--update-delay=[Delay between updates]:delay: " - "($help)--update-failure-action=[Action on update failure]:mode:(continue pause rollback)" - "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: " - "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: " - "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " - "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" - "($help)--with-registry-auth[Send registry authentication details to swarm agents]" - "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" - ) - - case "$words[1]" in - (create) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_update \ - "($help)*--container-label=[Container labels]:label: " \ - "($help)*--dns=[Set custom DNS servers]:DNS: " \ - "($help)*--dns-option=[Set DNS options]:DNS option: " \ - "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \ - "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ - "($help)*--group=[Set one or more supplementary user groups for the container]:group: _groups " \ - "($help)--mode=[Service Mode]:mode:(global replicated)" \ - "($help)--name=[Service name]:name: " \ - "($help)*--placement-pref=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \ - "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " \ - "($help -): :__docker_complete_images" \ - "($help -):command: _command_names -e" \ - "($help -)*::arguments: _normal" && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help)--pretty[Print the information in a human friendly format]" \ - "($help -)*:service:__docker_complete_services" && ret=0 - ;; - (logs) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --follow)"{-f,--follow}"[Follow log output]" \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-task-ids[Do not include task IDs]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help)--since=[Show logs since timestamp]:timestamp: " \ - "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \ - "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ - "($help -)1:service:__docker_complete_services" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 - ;; - (rm|remove) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -)*:service:__docker_complete_services" && ret=0 - ;; - (rollback) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \ - "($help -q --quiet)"{-q,--quiet}"[Suppress progress output]" \ - "($help -)*:service:__docker_complete_services" && ret=0 - ;; - (scale) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \ - "($help -)*:service:->values" && ret=0 - case $state in - (values) - if compset -P '*='; then - _message 'replicas' && ret=0 - else - __docker_complete_services -qS "=" - fi - ;; - esac - ;; - (ps) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_service_complete_ps_filters" \ - "($help)--format=[Format the output using the given go template]:template: " \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ - "($help -)*:service:__docker_complete_services" && ret=0 - ;; - (update) - _arguments $(__docker_arguments) \ - $opts_help \ - $opts_create_update \ - "($help)--arg=[Service command args]:arguments: _normal" \ - "($help)*--container-label-add=[Add or update container labels]:label: " \ - "($help)*--container-label-rm=[Remove a container label by its key]:label: " \ - "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \ - "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \ - "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \ - "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \ - "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \ - "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \ - "($help)--force[Force update]" \ - "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \ - "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \ - "($help)--image=[Service image tag]:image:__docker_complete_repositories" \ - "($help)*--placement-pref-add=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \ - "($help)*--placement-pref-rm=[Remove a placement preference]:pref:__docker_service_complete_placement_pref" \ - "($help)*--publish-add=[Add or update a port]:port: " \ - "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \ - "($help)--rollback[Rollback to previous specification]" \ - "($help -)1:service:__docker_complete_services" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0 - ;; - esac - - return ret -} - -# EO service - -# BO stack - -__docker_stack_complete_ps_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (desired-state) - state_opts=('accepted' 'running' 'shutdown') - _describe -t state-opts "desired state options" state_opts && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('desired-state' 'id' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_stack_complete_services_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('id' 'label' 'name') - _describe -t filter-opts "filter options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_stacks() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - local line s - declare -a lines stacks - - lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Service NAME - for line in $lines; do - s="${line[${begin[NAME]},${end[NAME]}]%% ##}" - stacks=($stacks $s) - done - - _describe -t stacks-list "stacks" stacks "$@" && ret=0 - return ret -} - -__docker_complete_stacks() { - [[ $PREFIX = -* ]] && return 1 - __docker_stacks "$@" -} - -__docker_stack_commands() { - local -a _docker_stack_subcommands - _docker_stack_subcommands=( - "deploy:Deploy a new stack or update an existing stack" - "ls:List stacks" - "ps:List the tasks in the stack" - "rm:Remove the stack" - "services:List the services in the stack" - ) - _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands -} - -__docker_stack_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (deploy|up) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file, or '-' to read from stdin]:compose file:_files -g \"*.(yml|yaml)\"" \ - "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (ls|list) - _arguments $(__docker_arguments) \ - $opts_help && ret=0 - ;; - (ps) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Display all tasks]" \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \ - "($help)--format=[Format the output using the given go template]:template: " \ - "($help)--no-resolve[Do not map IDs to Names]" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (rm|remove|down) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (services) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ - "($help -):stack:__docker_complete_stacks" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0 - ;; - esac - - return ret -} - -# EO stack - -# BO swarm - -__docker_swarm_commands() { - local -a _docker_swarm_subcommands - _docker_swarm_subcommands=( - "init:Initialize a swarm" - "join:Join a swarm as a node and/or manager" - "join-token:Manage join tokens" - "leave:Leave a swarm" - "unlock:Unlock swarm" - "unlock-key:Manage the unlock key" - "update:Update the swarm" - ) - _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands -} - -__docker_swarm_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (init) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--advertise-addr=[Advertised address]:ip\:port: " \ - "($help)--data-path-addr=[Data path IP or interface]:ip " \ - "($help)--data-path-port=[Data Path Port]:port " \ - "($help)--default-addr-pool=[Default address pool]" \ - "($help)--default-addr-pool-mask-length=[Default address pool subnet mask length]" \ - "($help)--autolock[Enable manager autolocking]" \ - "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ - "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ - "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ - "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ - "($help)--force-new-cluster[Force create a new cluster from current state]" \ - "($help)--listen-addr=[Listen address]:ip\:port: " \ - "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ - "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ - "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 - ;; - (join) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)--advertise-addr=[Advertised address]:ip\:port: " \ - "($help)--data-path-addr=[Data path IP or interface]:ip " \ - "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ - "($help)--listen-addr=[Listen address]:ip\:port: " \ - "($help)--token=[Token for entry into the swarm]:secret: " \ - "($help -):host\:port: " && ret=0 - ;; - (join-token) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ - "($help)--rotate[Rotate join token]" \ - "($help -):role:(manager worker)" && ret=0 - ;; - (leave) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0 - ;; - (unlock) - _arguments $(__docker_arguments) \ - $opts_help && ret=0 - ;; - (unlock-key) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ - "($help)--rotate[Rotate unlock token]" && ret=0 - ;; - (update) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)--autolock[Enable manager autolocking]" \ - "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ - "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ - "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ - "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ - "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ - "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 - ;; - esac - - return ret -} - -# EO swarm - -# BO system - -__docker_system_commands() { - local -a _docker_system_subcommands - _docker_system_subcommands=( - "df:Show docker filesystem usage" - "events:Get real time events from the server" - "info:Display system-wide information" - "prune:Remove unused data" - ) - _describe -t docker-system-commands "docker system command" _docker_system_subcommands -} - -__docker_system_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (df) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0 - ;; - (events) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \ - "($help)--since=[Events created since this timestamp]:timestamp: " \ - "($help)--until=[Events created until this timestamp]:timestamp: " \ - "($help)--format=[Format the output using the given go template]:template: " && ret=0 - ;; - (info) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \ - "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" \ - "($help)--volumes=[Remove all unused volumes]" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 - ;; - esac - - return ret -} - -# EO system - -# BO volume - -__docker_volume_complete_ls_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (dangling) - dangling_opts=('true' 'false') - _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0 - ;; - (driver) - __docker_complete_info_plugins Volume && ret=0 - ;; - (name) - __docker_complete_volumes && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('dangling' 'driver' 'label' 'name') - _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 - fi - - return ret -} - -__docker_complete_volumes() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - declare -a lines volumes - - lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}}) - - # Parse header line to find columns - local i=1 j=1 k header=${lines[1]} - declare -A begin end - while (( j < ${#header} - 1 )); do - i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) - j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) - k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) - begin[${header[$i,$((j-1))]}]=$i - end[${header[$i,$((j-1))]}]=$k - done - end[${header[$i,$((j-1))]}]=-1 - lines=(${lines[2,-1]}) - - # Names - local line s - for line in $lines; do - s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}" - s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" - volumes=($volumes $s) - done - - _describe -t volumes-list "volumes" volumes && ret=0 - return ret -} - -__docker_volume_commands() { - local -a _docker_volume_subcommands - _docker_volume_subcommands=( - "create:Create a volume" - "inspect:Display detailed information on one or more volumes" - "ls:List volumes" - "prune:Remove all unused volumes" - "rm:Remove one or more volumes" - ) - _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands -} - -__docker_volume_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) -A '-*' \ - $opts_help \ - "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \ - "($help)*--label=[Set metadata for a volume]:label=value: " \ - "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \ - "($help -)1:Volume name: " && ret=0 - ;; - (inspect) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -)1:volume:__docker_complete_volumes" && ret=0 - ;; - (ls) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \ - "($help)--format=[Format the output using the given Go template]:template: " \ - "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 - ;; - (prune) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 - ;; - (rm) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \ - "($help -):volume:__docker_complete_volumes" && ret=0 - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 - ;; - esac - - return ret -} - -# 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)--description=[Description of the context]:description:" \ - "($help)--docker=[Set the docker endpoint]:docker:" \ - "($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)--description=[Description of the context]:description:" \ - "($help)--docker=[Set the docker endpoint]:docker:" \ - "($help -):name:" && ret=0 - ;; - esac - - return ret -} - -# EO context - -__docker_caching_policy() { - oldp=( "$1"(Nmh+1) ) # 1 hour - (( $#oldp )) -} - -__docker_commands() { - local cache_policy - integer force_invalidation=0 - - zstyle -s ":completion:${curcontext}:" cache-policy cache_policy - if [[ -z "$cache_policy" ]]; then - zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy - fi - - if ( (( ! ${+_docker_hide_legacy_commands} )) || _cache_invalid docker_hide_legacy_commands ) \ - && ! _retrieve_cache docker_hide_legacy_commands; - then - _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}" - _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands - fi - - if [[ "${_docker_hide_legacy_commands}" != "${DOCKER_HIDE_LEGACY_COMMANDS}" ]]; then - force_invalidation=1 - _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}" - _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands - fi - - if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands ) \ - && ! _retrieve_cache docker_subcommands || [[ ${force_invalidation} -eq 1 ]]; - then - local -a lines - lines=(${(f)"$(_call_program commands docker 2>&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 - _describe -t docker-commands "docker command" _docker_subcommands -} - -__docker_subcommand() { - local -a _command_args opts_help - local expl help="--help" - integer ret=1 - - opts_help=("(: -)--help[Print usage]") - - case "$words[1]" in - (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait) - __docker_container_subcommand && ret=0 - ;; - (build|history|import|load|pull|push|save|tag) - __docker_image_subcommand && ret=0 - ;; - (checkpoint) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_checkpoint_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_checkpoint_subcommand && ret=0 - ;; - esac - ;; - (container) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_container_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_container_subcommand && ret=0 - ;; - 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 \ - "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \ - "($help)*--allow-nondistributable-artifacts=[Push nondistributable artifacts to specified registries]:registry: " \ - "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \ - "($help)*--authorization-plugin=[Authorization plugins to load]" \ - "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ - "($help)--bip=[Network bridge IP]:IP address: " \ - "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ - "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ - "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ - "($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \ - "($help)--containerd-plugins-namespace=[Containerd namespace to use for plugins]:containerd namespace:" \ - "($help)--data-root=[Root directory of persisted Docker data]:path:_directories" \ - "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ - "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \ - "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \ - "($help)--default-shm-size=[Default shm size for containers]:size:" \ - "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \ - "($help)*--dns=[DNS server to use]:DNS: " \ - "($help)*--dns-opt=[DNS options to use]:DNS option: " \ - "($help)*--dns-search=[DNS search domains to use]:DNS search: " \ - "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \ - "($help)--exec-root=[Root directory for execution state files]:path:_directories" \ - "($help)--experimental[Enable experimental features]" \ - "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \ - "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \ - "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \ - "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ - "($help)--icc[Enable inter-container communication]" \ - "($help)--init[Run an init inside containers to forward signals and reap processes]" \ - "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \ - "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \ - "($help)--ip=[Default IP when binding container ports]" \ - "($help)--ip-forward[Enable net.ipv4.ip_forward]" \ - "($help)--ip-masq[Enable IP masquerading]" \ - "($help)--iptables[Enable addition of iptables rules]" \ - "($help)--ipv6[Enable IPv6 networking]" \ - "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ - "($help)*--label=[Key=value labels]:label: " \ - "($help)--live-restore[Enable live restore of docker when containers are still running]" \ - "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \ - "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \ - "($help)--max-concurrent-downloads[Set the max concurrent downloads for each pull]" \ - "($help)--max-concurrent-uploads[Set the max concurrent uploads for each push]" \ - "($help)--max-download-attempts[Set the max download attempts for each pull]" \ - "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \ - "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ - "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ - "($help)--raw-logs[Full timestamps without ANSI coloring]" \ - "($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \ - "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ - "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(aufs btrfs devicemapper overlay overlay2 vfs zfs)" \ - "($help)--selinux-enabled[Enable selinux support]" \ - "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \ - "($help)*--storage-opt=[Storage driver options]:storage driver options: " \ - "($help)--tls[Use TLS]" \ - "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \ - "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \ - "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \ - "($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" \ - "($help)--validate[Validate daemon configuration and exit]" && ret=0 - - case $state in - (users-groups) - if compset -P '*:'; then - _groups && ret=0 - else - _describe -t userns-default "default Docker user management" '(default)' && ret=0 - _users && ret=0 - fi - ;; - esac - ;; - (events|info) - __docker_system_subcommand && ret=0 - ;; - (image) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_image_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_image_subcommand && ret=0 - ;; - esac - ;; - (images) - words[1]='ls' - __docker_image_subcommand && ret=0 - ;; - (inspect) - local state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ - "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \ - "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \ - "($help -)*: :->values" && ret=0 - - case $state in - (values) - if [[ ${words[(r)--type=container]} == --type=container ]]; then - __docker_complete_containers && ret=0 - elif [[ ${words[(r)--type=image]} == --type=image ]]; then - __docker_complete_images && ret=0 - elif [[ ${words[(r)--type=network]} == --type=network ]]; then - __docker_complete_networks && ret=0 - elif [[ ${words[(r)--type=node]} == --type=node ]]; then - __docker_complete_nodes && ret=0 - elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then - __docker_complete_plugins && ret=0 - elif [[ ${words[(r)--type=service]} == --type=secrets ]]; then - __docker_complete_secrets && ret=0 - elif [[ ${words[(r)--type=service]} == --type=service ]]; then - __docker_complete_services && ret=0 - elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then - __docker_complete_volumes && ret=0 - else - __docker_complete_containers - __docker_complete_images - __docker_complete_networks - __docker_complete_nodes - __docker_complete_plugins - __docker_complete_secrets - __docker_complete_services - __docker_complete_volumes && ret=0 - fi - ;; - esac - ;; - (login) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help -p --password)"{-p=,--password=}"[Password]:password: " \ - "($help)--password-stdin[Read password from stdin]" \ - "($help -u --username)"{-u=,--username=}"[Username]:username: " \ - "($help -)1:server: " && ret=0 - ;; - (logout) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help -)1:server: " && ret=0 - ;; - (network) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_network_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_network_subcommand && ret=0 - ;; - esac - ;; - (node) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_node_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_node_subcommand && ret=0 - ;; - esac - ;; - (plugin) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_plugin_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_plugin_subcommand && ret=0 - ;; - esac - ;; - (ps) - words[1]='ls' - __docker_container_subcommand && ret=0 - ;; - (rmi) - words[1]='rm' - __docker_image_subcommand && ret=0 - ;; - (search) - _arguments $(__docker_arguments) -A '-*' \ - $opts_help \ - "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_search_filters" \ - "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \ - "($help)--no-trunc[Do not truncate output]" \ - "($help -):term: " && ret=0 - ;; - (secret) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_secret_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_secret_subcommand && ret=0 - ;; - esac - ;; - (service) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_service_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_service_subcommand && ret=0 - ;; - esac - ;; - (stack) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_stack_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_stack_subcommand && ret=0 - ;; - esac - ;; - (swarm) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_swarm_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_swarm_subcommand && ret=0 - ;; - esac - ;; - (system) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_system_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_system_subcommand && ret=0 - ;; - esac - ;; - (version) - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 - ;; - (volume) - local curcontext="$curcontext" state - _arguments $(__docker_arguments) \ - $opts_help \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker_volume_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-${words[-1]}: - __docker_volume_subcommand && ret=0 - ;; - esac - ;; - (help) - _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0 - ;; - esac - - return ret -} - -_docker() { - # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. - # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. - if [[ $service != docker ]]; then - _call_function - _$service - return - fi - - local curcontext="$curcontext" state line help="-h --help" - integer ret=1 - typeset -A opt_args - - _arguments $(__docker_arguments) -C \ - "(: -)"{-h,--help}"[Print usage]" \ - "($help)--config[Location of client config files]:path:_directories" \ - "($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \ - "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ - "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ - "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ - "($help)--tls[Use TLS]" \ - "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \ - "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \ - "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \ - "($help)--tlsverify[Use TLS and verify the remote]" \ - "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ - "($help -v --version)"{-v,--version}"[Print version information and quit]" \ - "($help -): :->command" \ - "($help -)*:: :->option-or-argument" && ret=0 - - local host=${opt_args[-H]}${opt_args[--host]} - local config=${opt_args[--config]} - local context=${opt_args[-c]}${opt_args[--context]} - local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} " - - case $state in - (command) - __docker_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-$words[1]: - __docker_subcommand && ret=0 - ;; - esac - - return ret -} - -_dockerd() { - integer ret=1 - words[1]='daemon' - __docker_subcommand && ret=0 - return ret -} - -_docker "$@" - -# Local Variables: -# mode: Shell-Script -# sh-indentation: 4 -# indent-tabs-mode: nil -# sh-basic-offset: 4 -# End: -# vim: ft=zsh sw=4 ts=4 et diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 8684a978..06a191a1 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -1,3 +1,13 @@ +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `docker`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then + typeset -g -A _comps + autoload -Uz _docker + _comps[docker]=_docker +fi + +docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" &| + alias dbl='docker build' alias dcin='docker container inspect' alias dcls='docker container ls' From 6bffaab2904d4bb37edad90e00b6f6e842d3811d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 15 Jun 2023 20:06:56 +0200 Subject: [PATCH 219/321] fix(docker): only generate completion for docker >23 (#11754) --- plugins/docker/docker.plugin.zsh | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 06a191a1..e8aad923 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -1,13 +1,3 @@ -# If the completion file doesn't exist yet, we need to autoload it and -# bind it to `docker`. Otherwise, compinit will have already done that. -if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then - typeset -g -A _comps - autoload -Uz _docker - _comps[docker]=_docker -fi - -docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" &| - alias dbl='docker build' alias dcin='docker container inspect' alias dcls='docker container ls' @@ -41,3 +31,22 @@ alias dvls='docker volume ls' alias dvprune='docker volume prune' alias dxc='docker container exec' alias dxcit='docker container exec -it' + +if (( ! $+commands[docker] )); then + return +fi + +{ + # `docker completion` is only available from 23.0.0 on + local _docker_version=$(docker version --format '{{.Client.Version}}' 2>/dev/null) + if is-at-least 23.0.0 $_docker_version; then + # If the completion file doesn't exist yet, we need to autoload it and + # bind it to `docker`. Otherwise, compinit will have already done that. + if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then + typeset -g -A _comps + autoload -Uz _docker + _comps[docker]=_docker + fi + docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" + fi +} &| From 42b86327ed875ee182f8fc394b90ae9328a5ac00 Mon Sep 17 00:00:00 2001 From: rfigueroa <41128440+rfigueroa@users.noreply.github.com> Date: Fri, 16 Jun 2023 02:52:12 -0500 Subject: [PATCH 220/321] fix(mvn)!: rename `mvnd` to `mvndp` alias (#11756) BREAKING CHANGE: Rename alias to prevent conflicts with Apache Maven Daemon. --- plugins/mvn/README.md | 2 +- plugins/mvn/mvn.plugin.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/mvn/README.md b/plugins/mvn/README.md index 815dfd57..4181fedc 100644 --- a/plugins/mvn/README.md +++ b/plugins/mvn/README.md @@ -33,7 +33,7 @@ if it's found, or the mvn command otherwise. | `mvnct` | `mvn clean test` | | `mvncv` | `mvn clean verify` | | `mvncvst` | `mvn clean verify -DskipTests` | -| `mvnd` | `mvn deploy` | +| `mvndp` | `mvn deploy` | | `mvndocs` | `mvn dependency:resolve -Dclassifier=javadoc` | | `mvndt` | `mvn dependency:tree` | | `mvne` | `mvn eclipse:eclipse` | diff --git a/plugins/mvn/mvn.plugin.zsh b/plugins/mvn/mvn.plugin.zsh index da51f74d..a569a87f 100644 --- a/plugins/mvn/mvn.plugin.zsh +++ b/plugins/mvn/mvn.plugin.zsh @@ -62,7 +62,7 @@ alias mvncp='mvn clean package' alias mvnct='mvn clean test' alias mvncv='mvn clean verify' alias mvncvst='mvn clean verify -DskipTests' -alias mvnd='mvn deploy' +alias mvndp='mvn deploy' alias mvndocs='mvn dependency:resolve -Dclassifier=javadoc' alias mvndt='mvn dependency:tree' alias mvne='mvn eclipse:eclipse' From f5cb9a6c978693c9570206f4267ba2589bef1b4c Mon Sep 17 00:00:00 2001 From: Ihor Date: Sat, 17 Jun 2023 13:28:55 +0200 Subject: [PATCH 221/321] fix(git): `gunwipall` now only resets once (#11758) Closes #11750 Co-authored-by: Carlo Sala --- plugins/git/README.md | 2 +- plugins/git/git.plugin.zsh | 18 +++++++----------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index bf4b19f3..05cba858 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -254,7 +254,7 @@ These features allow to pause a branch development and switch to another one (_" | work_in_progress | Echoes a warning if the current branch is a wip | | gwip | Commit wip branch | | gunwip | Uncommit wip branch | -| gunwipall | Uncommit `--wip--` commits recursively | +| gunwipall | Uncommit all recent `--wip--` commits | ### Deprecated functions diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 19212430..66877df4 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -27,18 +27,14 @@ function work_in_progress() { command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!" } -# Same as `gunwip` but recursive -# "Unwips" all recent `--wip--` commits in loop until there is no left +# Similar to `gunwip` but recursive "Unwips" all recent `--wip--` commits not just the last one function gunwipall() { - while true; do - commit_message=$(git rev-list --max-count=1 --format="%s" HEAD) - if [[ $commit_message =~ "--wip--" ]]; then - git reset "HEAD~1" - (( $? )) && return 1 - else - break - fi - done + local _commit=$(git log --grep='--wip--' --invert-grep --max-count=1 --format=format:%H) + + # Check if a commit without "--wip--" was found and it's not the same as HEAD + if [[ "$_commit" != "$(git rev-parse HEAD)" ]]; then + git reset $_commit || return 1 + fi } # Check if main exists and use instead of master From c0e811c90df387eca4223c7d4dbb3f2d32a684c7 Mon Sep 17 00:00:00 2001 From: WH-2099 Date: Mon, 19 Jun 2023 18:32:37 +0800 Subject: [PATCH 222/321] perf(archlinux): improve `paclist` performance (#11764) --- plugins/archlinux/archlinux.plugin.zsh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index 796ff7ad..fca6548c 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/plugins/archlinux/archlinux.plugin.zsh @@ -25,10 +25,7 @@ alias pacown='pacman -Qo' alias pacupd="sudo pacman -Sy" function paclist() { - local pkgs=$(LC_ALL=C pacman -Qqe) - for pkg in ${(f)pkgs}; do - pacman -Qs --color=auto "^${pkg}\$" || break - done + pacman -Qqe | xargs -I{} -P0 --no-run-if-empty pacman -Qs --color=auto "^{}\$" } function pacdisowned() { From 8ace453f37acf0568bdb2e40920edb7598ad873a Mon Sep 17 00:00:00 2001 From: kang Date: Tue, 20 Jun 2023 08:49:56 +0200 Subject: [PATCH 223/321] feat(git-extras): update completion (2023-06-19 3a258cb) Closes #11712 --- plugins/git-extras/git-extras.plugin.zsh | 176 +++++++---------------- 1 file changed, 48 insertions(+), 128 deletions(-) diff --git a/plugins/git-extras/git-extras.plugin.zsh b/plugins/git-extras/git-extras.plugin.zsh index 6b96e12a..f5fd387d 100644 --- a/plugins/git-extras/git-extras.plugin.zsh +++ b/plugins/git-extras/git-extras.plugin.zsh @@ -80,22 +80,10 @@ __gitex_specific_branch_names() { _wanted branch-names expl branch-name compadd - $branch_names } -__gitex_chore_branch_names() { - __gitex_specific_branch_names 'chore' -} - __gitex_feature_branch_names() { __gitex_specific_branch_names 'feature' } -__gitex_refactor_branch_names() { - __gitex_specific_branch_names 'refactor' -} - -__gitex_bug_branch_names() { - __gitex_specific_branch_names 'bug' -} - __gitex_submodule_names() { local expl declare -a submodule_names @@ -114,88 +102,29 @@ __gitex_author_names() { } # subcommands +# new subcommand should be added in alphabetical order _git-authors() { _arguments -C \ '(--list -l)'{--list,-l}'[show authors]' \ '--no-email[without email]' \ } -_git-bug() { - local curcontext=$curcontext state line ret=1 - declare -A opt_args - - _arguments -C \ - ': :->command' \ - '*:: :->option-or-argument' && ret=0 - - case $state in - (command) - declare -a commands - commands=( - 'finish:merge bug into the current branch' - ) - _describe -t commands command commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*}-$line[1]: - case $line[1] in - (finish) - _arguments -C \ - ':branch-name:__gitex_bug_branch_names' - ;; - -r|--remote ) - _arguments -C \ - ':remote-name:__gitex_remote_names' - ;; - esac - return 0 - esac - - _arguments \ - '(--remote -r)'{--remote,-r}'[setup remote tracking branch]' -} - - _git-changelog() { _arguments \ '(-l --list)'{-l,--list}'[list commits]' \ } -_git-chore() { - local curcontext=$curcontext state line ret=1 - declare -A opt_args - - _arguments -C \ - ': :->command' \ - '*:: :->option-or-argument' && ret=0 - - case $state in - (command) - declare -a commands - commands=( - 'finish:merge and delete the chore branch' - ) - _describe -t commands command commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*}-$line[1]: - case $line[1] in - (finish) - _arguments -C \ - ':branch-name:__gitex_chore_branch_names' - ;; - -r|--remote ) - _arguments -C \ - ':remote-name:__gitex_remote_names' - ;; - esac - return 0 - esac - +_git-clear() { _arguments \ - '(--remote -r)'{--remote,-r}'[setup remote tracking branch]' + '(-f --force)'{-f,--force}'[force clear]' \ + '(-h --help)'{-h,--help}'[help message]' \ } +_git-coauthor() { + _arguments \ + ':co-author[co-author to add]' \ + ':co-author-email[email address of co-author to add]' +} _git-contrib() { _arguments \ @@ -235,6 +164,11 @@ _git-delete-branch() { ':branch-name:__gitex_branch_names' } +_git-delete-squashed-branches() { + _arguments \ + ':branch-name:__gitex_branch_names' +} + _git-delete-submodule() { _arguments \ @@ -298,6 +232,7 @@ _git-feature() { case $line[1] in (finish) _arguments -C \ + '--squash[Use squash merge]' \ ':branch-name:__gitex_feature_branch_names' ;; -r|--remote ) @@ -327,20 +262,17 @@ _git-guilt() { } _git-ignore() { - _arguments -C \ + _arguments -C \ '(--local -l)'{--local,-l}'[show local gitignore]' \ '(--global -g)'{--global,-g}'[show global gitignore]' \ '(--private -p)'{--private,-p}'[show repo gitignore]' } -_git-ignore() { - _arguments -C \ - '(--append -a)'{--append,-a}'[append .gitignore]' \ - '(--replace -r)'{--replace,-r}'[replace .gitignore]' \ - '(--list-in-table -l)'{--list-in-table,-l}'[print available types in table format]' \ - '(--list-alphabetically -L)'{--list-alphabetically,-L}'[print available types in alphabetical order]' \ - '(--search -s)'{--search,-s}'[search word in available types]' +_git-info() { + _arguments -C \ + '(--color -c)'{--color,-c}'[use color for information titles]' \ + '--no-config[do not show list all variables set in config file, along with their values]' } @@ -357,50 +289,27 @@ _git-missing() { ':second-branch-name:__gitex_branch_names' } - -_git-refactor() { - local curcontext=$curcontext state line ret=1 - declare -A opt_args - +_git-release() { _arguments -C \ - ': :->command' \ - '*:: :->option-or-argument' && ret=0 - - case $state in - (command) - declare -a commands - commands=( - 'finish:merge refactor into the current branch' - ) - _describe -t commands command commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*}-$line[1]: - case $line[1] in - (finish) - _arguments -C \ - ':branch-name:__gitex_refactor_branch_names' - ;; - -r|--remote ) - _arguments -C \ - ':remote-name:__gitex_remote_names' - ;; - esac - return 0 - esac - - _arguments \ - '(--remote -r)'{--remote,-r}'[setup remote tracking branch]' + '-c[Generates/populates the changelog with all commit message since the last tag.]' \ + '-r[The "remote" repository that is destination of a push operation.]' \ + '-m[use the custom commit information instead of the default message.]' \ + '-s[Create a signed and annotated tag.]' \ + '-u[Create a tag, annotated and signed with the given key.]' \ + '--semver[If the latest tag in your repo matches the semver format requirement, you could increase part of it as the new release tag.]' \ + '--prefix[Add a prefix string to semver to allow more complex tags.]' \ + '--no-empty-commit[Avoid creating empty commit if nothing could be committed.]' \ + '--[The arguments listed after "--" separator will be passed to pre/post-release hook.]' } - _git-squash() { + _arguments '--squash-msg[commit with the squashed commit messages]' _arguments \ ':branch-name:__gitex_branch_names' } _git-stamp() { - _arguments -C \ + _arguments -C \ '(--replace -r)'{--replace,-r}'[replace stamps with same id]' } @@ -413,17 +322,19 @@ _git-standup() { '-g[Display GPG signed info]' \ '-h[Display help message]' \ '-L[Enable the inclusion of symbolic links]' \ - '-m[The depth of recursive directory search]' + '-m[The depth of recursive directory search]' \ + '-B[Display the commits in branch groups]' } _git-summary() { _arguments '--line[summarize with lines rather than commits]' + _arguments '--dedup-by-email[remove duplicate users by the email address]' + _arguments '--no-merges[exclude merge commits]' __gitex_commits } - _git-undo(){ - _arguments -C \ + _arguments -C \ '(--soft -s)'{--soft,-s}'[only rolls back the commit but changes remain un-staged]' \ '(--hard -h)'{--hard,-h}'[wipes your commit(s)]' } @@ -432,21 +343,26 @@ zstyle -g existing_user_commands ':completion:*:*:git:*' user-commands zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \ alias:'define, search and show aliases' \ + abort:'abort current revert, merge, rebase, or cherry-pick process' \ archive-file:'export the current head of the git repository to an archive' \ authors:'generate authors report' \ - back:'undo and stage latest commits' \ + browse:'open repo website in browser' \ + browse-ci:'open repo CI page in browser' \ bug:'create bug branch' \ bulk:'run bulk commands' \ + brv:'list branches sorted by their last commit date'\ changelog:'generate a changelog report' \ chore:'create chore branch' \ clear-soft:'soft clean up a repository' \ clear:'rigorously clean up a repository' \ + coauthor:'add a co-author to the last commit' \ commits-since:'show commit logs since some date' \ contrib:'show user contributions' \ count:'show commit count' \ create-branch:'create branches' \ delete-branch:'delete branches' \ delete-merged-branches:'delete merged branches' \ + delete-squashed-branches:'delete squashed branches' \ delete-submodule:'delete submodules' \ delete-tag:'delete tags' \ delta:'lists changed files' \ @@ -465,11 +381,13 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \ local-commits:'list local commits' \ lock:'lock a file excluded from version control' \ locked:'ls files that have been locked' \ + magic:'commits everything with a generated message' \ merge-into:'merge one branch into another' \ merge-repo:'merge two repo histories' \ missing:'show commits missing from another branch' \ mr:'checks out a merge request locally' \ obliterate:'rewrite past commits to remove some files' \ + paste:'send patches to pastebin sites' \ pr:'checks out a pull request locally' \ psykorebase:'rebase a branch with a merge commit' \ pull-request:'create pull request to GitHub project' \ @@ -479,6 +397,7 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \ release:'commit, tag and push changes to the repository' \ rename-branch:'rename a branch' \ rename-tag:'rename a tag' \ + rename-remote:'rename a remote' \ repl:'git read-eval-print-loop' \ reset-file:'reset one file' \ root:'show path of root' \ @@ -495,4 +414,5 @@ zstyle ':completion:*:*:git:*' user-commands $existing_user_commands \ sync:'sync local branch with remote branch' \ touch:'touch and add file to the index' \ undo:'remove latest commits' \ - unlock:'unlock a file excluded from version control' + unlock:'unlock a file excluded from version control' \ + utimes:'change files modification time to their last commit date' From 4ba17232dae591f67b8e474fb013d2cb6555696e Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 20 Jun 2023 08:54:35 +0200 Subject: [PATCH 224/321] feat(nvm)!: remove soft-deprecated code BREAKING CHANGE: $NVM_LAZY, $NVM_LAZY_CMD, AND $NVM_AUTOLOAD cannot be used anymore to tweak nvm plugin. Use zstyle-based configurations instead. --- plugins/nvm/nvm.plugin.zsh | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 31d27541..943678f7 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -16,29 +16,6 @@ fi # Note: nvm is a function so we need to use `which` which nvm &>/dev/null && return -# TODO: 2022-11-11: Remove soft-deprecate options -if (( ${+NVM_LAZY} + ${+NVM_LAZY_CMD} + ${+NVM_AUTOLOAD} )); then - # Get list of NVM_* variable settings defined - local -a used_vars - used_vars=(${(o)parameters[(I)NVM_(AUTOLOAD|LAZY|LAZY_CMD)]}) - # Nicely print the list in the style `var1, var2 and var3` - echo "${fg[yellow]}[nvm plugin] Variable-style settings are deprecated. Instead of ${(j:, :)used_vars[1,-2]}${used_vars[-2]+ and }${used_vars[-1]}, use:\n" - if (( $+NVM_AUTOLOAD )); then - echo " zstyle ':omz:plugins:nvm' autoload yes" - zstyle ':omz:plugins:nvm' autoload yes - fi - if (( $+NVM_LAZY )); then - echo " zstyle ':omz:plugins:nvm' lazy yes" - zstyle ':omz:plugins:nvm' lazy yes - fi - if (( $+NVM_LAZY_CMD )); then - echo " zstyle ':omz:plugins:nvm' lazy-cmd $NVM_LAZY_CMD" - zstyle ':omz:plugins:nvm' lazy-cmd $NVM_LAZY_CMD - fi - echo "$reset_color" - unset used_vars NVM_AUTOLOAD NVM_LAZY NVM_LAZY_CMD -fi - if zstyle -t ':omz:plugins:nvm' lazy; then # Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd From b5be2d39e2d2a598f7bba26d0bae2cce8c7d3d64 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 20 Jun 2023 09:36:11 +0200 Subject: [PATCH 225/321] fix(nvm): disable lazy-loading if autoload is set Closes #11748 --- plugins/nvm/README.md | 3 +++ plugins/nvm/nvm.plugin.zsh | 18 +++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index 6830c14d..eee3bf71 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -43,6 +43,9 @@ zstyle ':omz:plugins:nvm' lazy-cmd eslint prettier typescript ... #### `.nvmrc` autoload +Note: _this option cannot be used at the same time as `lazy`. `autoload` will override it and load `nvm` at +startup._ + If set, the plugin will automatically load a node version when if finds a [`.nvmrc` file](https://github.com/nvm-sh/nvm#nvmrc) in the current working directory indicating which node version to load. This can be done, similar as previous options, adding: diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 943678f7..484ef296 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -16,7 +16,18 @@ fi # Note: nvm is a function so we need to use `which` which nvm &>/dev/null && return -if zstyle -t ':omz:plugins:nvm' lazy; then +if [[ -z "$NVM_DIR" ]]; then + echo "[oh-my-zsh] nvm installation cannot be found" + echo "[oh-my-zsh] set NVM_DIR to your installation" + return +fi +if [[ ! -f "$NVM_DIR/nvm.sh" ]]; then + echo "[oh-my-zsh] nvm.sh does not exist in $NVM_DIR" + return +fi + +if zstyle -t ':omz:plugins:nvm' lazy && \ + ! zstyle -t ':omz:plugins:nvm' autoload; then # Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd eval " @@ -28,11 +39,8 @@ if zstyle -t ':omz:plugins:nvm' lazy; then } " unset nvm_lazy_cmd -elif [[ -f "$NVM_DIR/nvm.sh" ]]; then - # Load nvm if it exists in $NVM_DIR - source "$NVM_DIR/nvm.sh" else - return + source "$NVM_DIR/nvm.sh" fi # Autoload nvm when finding a .nvmrc file in the current directory From 8a6fc5c16d49368dc8f9ddd965a9e25ef652e129 Mon Sep 17 00:00:00 2001 From: Haltarys <45515869+Haltarys@users.noreply.github.com> Date: Tue, 20 Jun 2023 22:27:14 +0200 Subject: [PATCH 226/321] fix(docker): use `command docker` (#11766) --- plugins/docker/docker.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index e8aad923..434b1fc6 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -38,7 +38,7 @@ fi { # `docker completion` is only available from 23.0.0 on - local _docker_version=$(docker version --format '{{.Client.Version}}' 2>/dev/null) + local _docker_version=$(command docker version --format '{{.Client.Version}}' 2>/dev/null) if is-at-least 23.0.0 $_docker_version; then # If the completion file doesn't exist yet, we need to autoload it and # bind it to `docker`. Otherwise, compinit will have already done that. @@ -47,6 +47,6 @@ fi autoload -Uz _docker _comps[docker]=_docker fi - docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" + command docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" fi } &| From 22e710b4e4c8934706ef5047506b3b7594af9138 Mon Sep 17 00:00:00 2001 From: Gustavo Perdomo Date: Mon, 26 Jun 2023 04:35:38 -0400 Subject: [PATCH 227/321] fix(gcloud): add support for `brew` installations (#11772) --- plugins/gcloud/gcloud.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/gcloud/gcloud.plugin.zsh b/plugins/gcloud/gcloud.plugin.zsh index 9c26aea1..5c57302d 100644 --- a/plugins/gcloud/gcloud.plugin.zsh +++ b/plugins/gcloud/gcloud.plugin.zsh @@ -6,6 +6,7 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then search_locations=( "$HOME/google-cloud-sdk" + "/usr/local/share/google-cloud-sdk" "/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk" "/opt/homebrew/Caskroom/google-cloud-sdk/latest/google-cloud-sdk" "/usr/share/google-cloud-sdk" From d5f1f50ad2d62363785464d5b6eef1a009243d7a Mon Sep 17 00:00:00 2001 From: Richard Mitchell Date: Mon, 26 Jun 2023 04:48:17 -0400 Subject: [PATCH 228/321] docs(git-extras): clarify readme (#11776) --- plugins/git-extras/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git-extras/README.md b/plugins/git-extras/README.md index 2adc9d47..7eb53fcf 100644 --- a/plugins/git-extras/README.md +++ b/plugins/git-extras/README.md @@ -1,6 +1,6 @@ # git-extras -This plugin provides completion definitions for some of the commands defined by [git-extras](https://github.com/tj/git-extras). +This plugin provides completion definitions for some of the commands defined by [git-extras](https://github.com/tj/git-extras), which must already be installed. To use it, add `git-extras` to the plugins array in your zshrc file: From 8cbe98469d9862d37d43ca4229dc8e915ec377a9 Mon Sep 17 00:00:00 2001 From: Devraj Mehta Date: Mon, 26 Jun 2023 13:05:22 -0400 Subject: [PATCH 229/321] fix(git): remove color codes from some aliases (#11770) --- plugins/git/README.md | 4 ++-- plugins/git/git.plugin.zsh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 05cba858..d1853195 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -26,8 +26,8 @@ plugins=(... git) | gbda | git branch --no-color --merged \| grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| xargs git branch --delete 2>/dev/null | | gbD | git branch --delete --force | | gbg | git branch -vv | grep ": gone\]" | -| gbgd | local res=$(git branch -vv | grep ": gone\]" | awk '{print $1}') && [[ $res ]] && echo $res | xargs git branch -d | -| gbgD | local res=$(git branch -vv | grep ": gone\]" | awk '{print $1}') && [[ $res ]] && echo $res | xargs git branch -D | +| gbgd | git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d | +| gbgD | git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D | | gbl | git blame -b -w | | gbnm | git branch --no-merged | | gbr | git branch --remote | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 66877df4..d04edea5 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -84,8 +84,8 @@ alias gbd='git branch --delete' alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' alias gbD='git branch --delete --force' alias gbg='git branch -vv | grep ": gone\]"' -alias gbgd='local res=$(gbg | awk '"'"'{print $1}'"'"') && [[ $res ]] && echo $res | xargs git branch -d' -alias gbgD='local res=$(gbg | awk '"'"'{print $1}'"'"') && [[ $res ]] && echo $res | xargs git branch -D' +alias gbgd='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' +alias gbgD='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' alias gbl='git blame -b -w' alias gbnm='git branch --no-merged' alias gbr='git branch --remote' From 723af07a566cbadc26e61f69c44a1a67ed1ba0c8 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 29 Jun 2023 13:25:05 +0200 Subject: [PATCH 230/321] fix(docker): add static completion script --- plugins/docker/_docker | 3126 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3126 insertions(+) create mode 100644 plugins/docker/_docker diff --git a/plugins/docker/_docker b/plugins/docker/_docker new file mode 100644 index 00000000..466b09d9 --- /dev/null +++ b/plugins/docker/_docker @@ -0,0 +1,3126 @@ +#compdef docker dockerd +# +# zsh completion for docker (http://docker.com) +# +# version: 0.3.0 +# github: https://github.com/felixr/docker-zsh-completion +# +# contributors: +# - Felix Riedel +# - Steve Durrheimer +# - Vincent Bernat +# - Rohan Verma +# +# license: +# +# Copyright (c) 2013, Felix Riedel +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# * Neither the name of the nor the +# names of its contributors may be used to endorse or promote products +# derived from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +# Short-option stacking can be enabled with: +# zstyle ':completion:*:*:docker:*' option-stacking yes +# zstyle ':completion:*:*:docker-*:*' option-stacking yes +__docker_arguments() { + if zstyle -t ":completion:${curcontext}:" option-stacking; then + print -- -s + fi +} + +__docker_get_containers() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local kind type line s + declare -a running stopped lines args names + + kind=$1; shift + type=$1; shift + [[ $kind = (stopped|all) ]] && args=($args -a) + + lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line + lines=(${lines[2,-1]}) + + # Container ID + if [[ $type = (ids|all) ]]; then + for line in $lines; do + s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}" + s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" + s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then + stopped=($stopped $s) + else + running=($running $s) + fi + done + fi + + # Names: we only display the one without slash. All other names + # are generated and may clutter the completion. However, with + # Swarm, all names may be prefixed by the swarm node name. + if [[ $type = (names|all) ]]; then + for line in $lines; do + names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}}) + # First step: find a common prefix and strip it (swarm node case) + (( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/} + # Second step: only keep the first name without a / + s=${${names:#*/*}[1]} + # If no name, well give up. + (( $#s != 0 )) || continue + s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}" + s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}" + if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then + stopped=($stopped $s) + else + running=($running $s) + fi + done + fi + + [[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0 + [[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0 + return ret +} + +__docker_complete_stopped_containers() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_containers stopped all "$@" +} + +__docker_complete_running_containers() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_containers running all "$@" +} + +__docker_complete_containers() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_containers all all "$@" +} + +__docker_complete_containers_ids() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_containers all ids "$@" +} + +__docker_complete_containers_names() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_containers all names "$@" +} + +__docker_complete_info_plugins() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + emulate -L zsh + setopt extendedglob + local -a plugins + plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: }) + _describe -t plugins "$1 plugins" plugins && ret=0 + return ret +} + +__docker_complete_images() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a images + images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}}) + _describe -t docker-images "images" images && ret=0 + __docker_complete_repositories_with_tags && ret=0 + return ret +} + +__docker_complete_repositories() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a repos + repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]}) + repos=(${repos#}) + _describe -t docker-repos "repositories" repos && ret=0 + return ret +} + +__docker_complete_repositories_with_tags() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a repos onlyrepos matched + declare m + repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *}) + repos=(${${repos%:::}#}) + # Check if we have a prefix-match for the current prefix. + onlyrepos=(${repos%::*}) + for m in $onlyrepos; do + [[ ${PREFIX##${~~m}} != ${PREFIX} ]] && { + # Yes, complete with tags + repos=(${${repos/:::/:}/:/\\:}) + _describe -t docker-repos-with-tags "repositories with tags" repos && ret=0 + return ret + } + done + # No, only complete repositories + onlyrepos=(${${repos%:::*}/:/\\:}) + _describe -t docker-repos "repositories" onlyrepos -qS : && ret=0 + + return ret +} + +__docker_search() { + [[ $PREFIX = -* ]] && return 1 + local cache_policy + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy + fi + + local searchterm cachename + searchterm="${words[$CURRENT]%/}" + cachename=_docker-search-$searchterm + + local expl + local -a result + if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \ + && ! _retrieve_cache ${cachename#_}; then + _message "Searching for ${searchterm}..." + result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]}) + _store_cache ${cachename#_} result + fi + _wanted dockersearch expl 'available images' compadd -a result +} + +__docker_get_log_options() { + [[ $PREFIX = -* ]] && return 1 + + integer ret=1 + local log_driver=${opt_args[--log-driver]:-"all"} + local -a common_options common_options2 awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options + + common_options=("max-buffer-size" "mode") + common_options2=("env" "env-regex" "labels") + awslogs_options=($common_options "awslogs-create-group" "awslogs-datetime-format" "awslogs-group" "awslogs-multiline-pattern" "awslogs-region" "awslogs-stream" "tag") + fluentd_options=($common_options $common_options2 "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "fluentd-sub-second-precision" "tag") + gcplogs_options=($common_options $common_options2 "gcp-log-cmd" "gcp-meta-id" "gcp-meta-name" "gcp-meta-zone" "gcp-project") + gelf_options=($common_options $common_options2 "gelf-address" "gelf-compression-level" "gelf-compression-type" "tag") + journald_options=($common_options $common_options2 "tag") + json_file_options=($common_options $common_options2 "max-file" "max-size") + logentries_options=($common_options $common_options2 "logentries-token" "tag") + syslog_options=($common_options $common_options2 "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag") + splunk_options=($common_options $common_options2 "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag") + + [[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0 + [[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0 + [[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0 + [[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0 + [[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0 + [[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0 + [[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0 + [[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0 + [[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0 + + return ret +} + +__docker_complete_log_drivers() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog) + _describe -t log-drivers "log drivers" drivers && ret=0 + return ret +} + +__docker_complete_log_options() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (syslog-format) + local opts=('rfc3164' 'rfc5424' 'rfc5424micro') + _describe -t syslog-format-opts "syslog format options" opts && ret=0 + ;; + (mode) + local opts=('blocking' 'non-blocking') + _describe -t mode-opts "mode options" opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + __docker_get_log_options -qS "=" && ret=0 + fi + + return ret +} + +__docker_complete_detach_keys() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + compset -P "*," + keys=(${:-{a-z}}) + ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}}) + _describe -t detach_keys "[a-z]" keys -qS "," && ret=0 + _describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0 +} + +__docker_complete_pid() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local -a opts vopts + + opts=('host') + vopts=('container') + + if compset -P '*:'; then + case "${${words[-1]%:*}#*=}" in + (container) + __docker_complete_running_containers && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + _describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0 + _describe -t pid-opts "PID Options" opts && ret=0 + fi + + return ret +} + +__docker_complete_runtimes() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + emulate -L zsh + setopt extendedglob + local -a runtimes_opts + runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}}) + _describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0 +} + +__docker_complete_ps_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (ancestor) + __docker_complete_images && ret=0 + ;; + (before|since) + __docker_complete_containers && ret=0 + ;; + (health) + health_opts=('healthy' 'none' 'starting' 'unhealthy') + _describe -t health-filter-opts "health filter options" health_opts && ret=0 + ;; + (id) + __docker_complete_containers_ids && ret=0 + ;; + (is-task) + _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 + ;; + (name) + __docker_complete_containers_names && ret=0 + ;; + (network) + __docker_complete_networks && ret=0 + ;; + (status) + status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing') + _describe -t status-filter-opts "status filter options" status_opts && ret=0 + ;; + (volume) + __docker_complete_volumes && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('ancestor' 'before' 'exited' 'expose' 'health' 'id' 'label' 'name' 'network' 'publish' 'since' 'status' 'volume') + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_complete_search_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a boolean_opts opts + + boolean_opts=('true' 'false') + opts=('is-automated' 'is-official' 'stars') + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (is-automated|is-official) + _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_complete_images_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a boolean_opts opts + + boolean_opts=('true' 'false') + opts=('before' 'dangling' 'label' 'reference' 'since') + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (before|reference|since) + __docker_complete_images && ret=0 + ;; + (dangling) + _describe -t boolean-filter-opts "filter options" boolean_opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_complete_events_filter() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a opts + + opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'scope' 'type' 'volume') + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (container) + __docker_complete_containers && ret=0 + ;; + (daemon) + emulate -L zsh + setopt extendedglob + local -a daemon_opts + daemon_opts=( + ${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}} + ${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:} + ) + _describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0 + ;; + (event) + local -a event_opts + event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disable' 'disconnect' 'enable' 'exec_create' 'exec_detach' + 'exec_start' 'export' 'health_status' 'import' 'install' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'remove' 'rename' 'resize' + 'restart' 'save' 'start' 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update') + _describe -t event-filter-opts "event filter options" event_opts && ret=0 + ;; + (image) + __docker_complete_images && ret=0 + ;; + (network) + __docker_complete_networks && ret=0 + ;; + (scope) + local -a scope_opts + scope_opts=('local' 'swarm') + _describe -t scope-filter-opts "scope filter options" scope_opts && ret=0 + ;; + (type) + local -a type_opts + type_opts=('container' 'daemon' 'image' 'network' 'volume') + _describe -t type-filter-opts "type filter options" type_opts && ret=0 + ;; + (volume) + __docker_complete_volumes && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_complete_prune_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a opts + + opts=('until') + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + *) + _message 'value' && ret=0 + ;; + esac + else + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +# BO checkpoint + +__docker_checkpoint_commands() { + local -a _docker_checkpoint_subcommands + _docker_checkpoint_subcommands=( + "create:Create a checkpoint from a running container" + "ls:List checkpoints for a container" + "rm:Remove a checkpoint" + ) + _describe -t docker-checkpoint-commands "docker checkpoint command" _docker_checkpoint_subcommands +} + +__docker_checkpoint_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)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ + "($help)--leave-running[Leave the container running after checkpoint]" \ + "($help -)1:container:__docker_complete_running_containers" \ + "($help -)2:checkpoint: " && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ + "($help -)1:container:__docker_complete_containers" && ret=0 + ;; + (rm|remove) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \ + "($help -)1:container:__docker_complete_containers" \ + "($help -)2:checkpoint: " && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_checkpoint_commands" && ret=0 + ;; + esac + + return ret +} + +# EO checkpoint + +# BO container + +__docker_container_commands() { + local -a _docker_container_subcommands + _docker_container_subcommands=( + "attach:Attach to a running container" + "commit:Create a new image from a container's changes" + "cp:Copy files/folders between a container and the local filesystem" + "create:Create a new container" + "diff:Inspect changes on a container's filesystem" + "exec:Execute a command in a running container" + "export:Export a container's filesystem as a tar archive" + "inspect:Display detailed information on one or more containers" + "kill:Kill one or more running containers" + "logs:Fetch the logs of a container" + "ls:List containers" + "pause:Pause all processes within one or more containers" + "port:List port mappings or a specific mapping for the container" + "prune:Remove all stopped containers" + "rename:Rename a container" + "restart:Restart one or more containers" + "rm:Remove one or more containers" + "run:Create and run a new container from an image" + "start:Start one or more stopped containers" + "stats:Display a live stream of container(s) resource usage statistics" + "stop:Stop one or more running containers" + "top:Display the running processes of a container" + "unpause:Unpause all processes within one or more containers" + "update:Update configuration of one or more containers" + "wait:Block until one or more containers stop, then print their exit codes" + ) + _describe -t docker-container-commands "docker container command" _docker_container_subcommands +} + +__docker_container_subcommand() { + local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update + local expl help="--help" + integer ret=1 + + opts_attach_exec_run_start=( + "($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys" + ) + opts_create_run=( + "($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)" + "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " + "($help)*--annotation=[Add an annotation to the container (passed through to the OCI runtime)]:annotations: " + "($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: " + "($help)*--cap-add=[Add Linux capabilities]:capability: " + "($help)*--cap-drop=[Drop Linux capabilities]:capability: " + "($help)--cgroupns=[Cgroup namespace mode to use]:cgroup namespace mode: " + "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " + "($help)--cidfile=[Write the container ID to the file]:CID file:_files" + "($help)--cpus=[Number of CPUs (default 0.000)]:cpus: " + "($help)*--device=[Add a host device to the container]:device:_files" + "($help)*--device-cgroup-rule=[Add a rule to the cgroup allowed devices list]:device:cgroup: " + "($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: " + "($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: " + "($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: " + "($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: " + "($help)--disable-content-trust[Skip image verification]" + "($help)*--dns=[Custom DNS servers]:DNS server: " + "($help)*--dns-option=[Custom DNS options]:DNS option: " + "($help)*--dns-search=[Custom DNS search domains]:DNS domains: " + "($help)*--domainname=[Container NIS domain name]:domainname:_hosts" + "($help)*"{-e=,--env=}"[Environment variables]:environment variable: " + "($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: " + "($help)*--env-file=[Read environment variables from a file]:environment file:_files" + "($help)*--expose=[Expose a port from the container without publishing it]: " + "($help)*--gpus=[GPU devices to add to the container ('all' to pass all GPUs)]:device: " + "($help)*--group-add=[Set one or more supplementary user groups for the container]:group:_groups" + "($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts" + "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" + "($help)--init[Run an init inside the container that forwards signals and reaps processes]" + "($help)--ip=[IPv4 address]:IPv4: " + "($help)--ip6=[IPv6 address]:IPv6: " + "($help)--ipc=[IPC namespace to use]:IPC namespace: " + "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" + "($help)*--link=[Add link to another container]:link:->link" + "($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: " + "($help)*"{-l=,--label=}"[Container metadata]:label: " + "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" + "($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options" + "($help)--mac-address=[Container MAC address]:MAC address: " + "($help)*--mount=[Attach a filesystem mount to the container]:mount: " + "($help)--name=[Container name]:name: " + "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" + "($help)*--network-alias=[Add network-scoped alias for the container]:alias: " + "($help)--oom-kill-disable[Disable OOM Killer]" + "($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]" + "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" + "($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]" + "($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports" + "($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid" + "($help)--privileged[Give extended privileges to this container]" + "($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]" + "($help)--read-only[Mount the container's root filesystem as read only]" + "($help)*--security-opt=[Security options]:security option: " + "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " + "($help)--stop-signal=[Signal to kill a container]:signal:_signals" + "($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: " + "($help)*--sysctl=-[sysctl options]:sysctl: " + "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" + "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" + "($help)*--ulimit=[ulimit options]:ulimit: " + "($help)--userns=[Container user namespace]:user namespace:(host)" + "($help)--tmpfs[mount tmpfs]" + "($help)*-v[Bind mount a volume]:volume:_directories -W / -P '/' -S '\:' -r '/ '" + "($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)" + "($help)*--volumes-from=[Mount volumes from the specified container]:volume: " + "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" + ) + opts_create_run_update=( + "($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)" + "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" + "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " + "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " + "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " + "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " + "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " + "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " + "($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: " + "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " + "($help)--memory-reservation=[Memory soft limit]:Memory limit: " + "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " + "($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]" + "($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)" + ) + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (attach) + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_attach_exec_run_start \ + "($help)--no-stdin[Do not attach stdin]" \ + "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ + "($help -):containers:__docker_complete_running_containers" && ret=0 + ;; + (commit) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --author)"{-a=,--author=}"[Author]:author: " \ + "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ + "($help -m --message)"{-m=,--message=}"[Commit message]:message: " \ + "($help -p --pause)"{-p,--pause}"[Pause container during commit]" \ + "($help -):container:__docker_complete_containers" \ + "($help -): :__docker_complete_repositories_with_tags" && ret=0 + ;; + (cp) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \ + "($help -)1:container:->container" \ + "($help -)2:hostpath:_files" && ret=0 + case $state in + (container) + if compset -P "*:"; then + _files && ret=0 + else + __docker_complete_containers -qS ":" && ret=0 + fi + ;; + esac + ;; + (create) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_create_run \ + $opts_create_run_update \ + "($help -): :__docker_complete_images" \ + "($help -):command: _command_names -e" \ + "($help -)*::arguments: _normal" && ret=0 + case $state in + (link) + if compset -P "*:"; then + _wanted alias expl "Alias" compadd -E "" && ret=0 + else + __docker_complete_running_containers -qS ":" && ret=0 + fi + ;; + esac + ;; + (diff) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:containers:__docker_complete_containers" && ret=0 + ;; + (exec) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_attach_exec_run_start \ + "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ + "($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \ + "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ + "($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \ + "($help)--privileged[Give extended Linux capabilities to the command]" \ + "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \ + "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \ + "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" \ + "($help -):containers:__docker_complete_running_containers" \ + "($help -)*::command:->anycommand" && ret=0 + case $state in + (anycommand) + shift 1 words + (( CURRENT-- )) + _normal && ret=0 + ;; + esac + ;; + (export) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \ + "($help -)*:containers:__docker_complete_containers" && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help -s --size)"{-s,--size}"[Display total file sizes]" \ + "($help -)*:containers:__docker_complete_containers" && ret=0 + ;; + (kill) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \ + "($help -)*:containers:__docker_complete_running_containers" && ret=0 + ;; + (logs) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--details[Show extra details provided to logs]" \ + "($help -f --follow)"{-f,--follow}"[Follow log output]" \ + "($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \ + "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ + "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \ + "($help -)*:containers:__docker_complete_containers" && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Show all containers]" \ + "($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \ + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \ + "($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only show container IDs]" \ + "($help -s --size)"{-s,--size}"[Display total file sizes]" \ + "($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0 + ;; + (pause|unpause) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:containers:__docker_complete_running_containers" && ret=0 + ;; + (port) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)1:containers:__docker_complete_running_containers" \ + "($help -)2:port:_ports" && ret=0 + ;; + (prune) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 + ;; + (rename) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -):old name:__docker_complete_containers" \ + "($help -):new name: " && ret=0 + ;; + (restart) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ + "($help -)*:containers:__docker_complete_containers" && ret=0 + ;; + (rm) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force removal]" \ + "($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \ + "($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \ + "($help -)*:containers:->values" && ret=0 + case $state in + (values) + if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then + __docker_complete_containers && ret=0 + else + __docker_complete_stopped_containers && ret=0 + fi + ;; + esac + ;; + (run) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_create_run \ + $opts_create_run_update \ + $opts_attach_exec_run_start \ + "($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \ + "($help)--health-cmd=[Command to run to check health]:command: " \ + "($help)--health-interval=[Time between running the check]:time: " \ + "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \ + "($help)--health-timeout=[Maximum time to allow one check to run]:time: " \ + "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \ + "($help)--rm[Remove intermediate containers when it exits]" \ + "($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \ + "($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \ + "($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \ + "($help -): :__docker_complete_images" \ + "($help -):command: _command_names -e" \ + "($help -)*::arguments: _normal" && ret=0 + case $state in + (link) + if compset -P "*:"; then + _wanted alias expl "Alias" compadd -E "" && ret=0 + else + __docker_complete_running_containers -qS ":" && ret=0 + fi + ;; + (storage-opt) + if compset -P "*="; then + _message "value" && ret=0 + else + opts=('size') + _describe -t filter-opts "storage options" opts -qS "=" && ret=0 + fi + ;; + esac + ;; + (start) + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_attach_exec_run_start \ + "($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \ + "($help -i --interactive)"{-i,--interactive}"[Attach container's stdin]" \ + "($help -)*:containers:__docker_complete_stopped_containers" && ret=0 + ;; + (stats) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help)--no-stream[Disable streaming stats and only pull the first result]" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -)*:containers:__docker_complete_running_containers" && ret=0 + ;; + (stop) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \ + "($help -)*:containers:__docker_complete_running_containers" && ret=0 + ;; + (top) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)1:containers:__docker_complete_running_containers" \ + "($help -)*:: :->ps-arguments" && ret=0 + case $state in + (ps-arguments) + _ps && ret=0 + ;; + esac + ;; + (update) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_create_run_update \ + "($help -)*: :->values" && ret=0 + case $state in + (values) + if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then + __docker_complete_stopped_containers && ret=0 + else + __docker_complete_containers && ret=0 + fi + ;; + esac + ;; + (wait) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:containers:__docker_complete_running_containers" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 + ;; + esac + + return ret +} + +# EO container + +# BO image + +__docker_image_commands() { + local -a _docker_image_subcommands + _docker_image_subcommands=( + "build:Build an image from a Dockerfile" + "history:Show the history of an image" + "import:Import the contents from a tarball to create a filesystem image" + "inspect:Display detailed information on one or more images" + "load:Load an image from a tar archive or STDIN" + "ls:List images" + "prune:Remove unused images" + "pull:Download an image from a registry" + "push:Upload an image to a registry" + "rm:Remove one or more images" + "save:Save one or more images to a tar archive (streamed to STDOUT by default)" + "tag:Tag an image into a repository" + ) + _describe -t docker-image-commands "docker image command" _docker_image_subcommands +} + +__docker_image_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (build) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " \ + "($help)*--build-arg=[Build-time variables]:=: " \ + "($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \ + "($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \ + "($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \ + "($help)--compress[Compress the build context using gzip]" \ + "($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \ + "($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \ + "($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \ + "($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \ + "($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \ + "($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \ + "($help)--disable-content-trust[Skip image verification]" \ + "($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \ + "($help)--force-rm[Always remove intermediate containers]" \ + "($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \ + "($help)*--label=[Set metadata for an image]:label=value: " \ + "($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \ + "($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \ + "($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \ + "($help)--no-cache[Do not use cache when building the image]" \ + "($help)--pull[Attempt to pull a newer version of the image]" \ + "($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \ + "($help)--rm[Remove intermediate containers after a successful build]" \ + "($help)*--shm-size=[Size of '/dev/shm' (format is '')]:shm size: " \ + "($help)--squash[Squash newly built layers into a single new layer]" \ + "($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \ + "($help)--target=[Set the target build stage to build.]" \ + "($help)*--ulimit=[ulimit options]:ulimit: " \ + "($help)--userns=[Container user namespace]:user namespace:(host)" \ + "($help -):path or URL:_directories" && ret=0 + ;; + (history) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ + "($help -)*: :__docker_complete_images" && ret=0 + ;; + (import) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \ + "($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \ + "($help -):URL:(- http:// file://)" \ + "($help -): :__docker_complete_repositories_with_tags" && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help -)*:images:__docker_complete_images" && ret=0 + ;; + (load) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \ + "($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0 + ;; + (ls|list) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Show all images]" \ + "($help)--digests[Show digests]" \ + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \ + "($help -): :__docker_complete_repositories" && ret=0 + ;; + (prune) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \ + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 + ;; + (pull) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \ + "($help)--disable-content-trust[Skip image verification]" \ + "($help -):name:__docker_search" && ret=0 + ;; + (push) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \ + "($help)--disable-content-trust[Skip image signing]" \ + "($help -): :__docker_complete_images" && ret=0 + ;; + (rm) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force removal]" \ + "($help)--no-prune[Do not delete untagged parents]" \ + "($help -)*: :__docker_complete_images" && ret=0 + ;; + (save) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \ + "($help -)*: :__docker_complete_images" && ret=0 + ;; + (tag) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -):source:__docker_complete_images"\ + "($help -):destination:__docker_complete_repositories_with_tags" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0 + ;; + esac + + return ret +} + +# EO image + +# BO network + +__docker_network_complete_ls_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (driver) + __docker_complete_info_plugins Network && ret=0 + ;; + (id) + __docker_complete_networks_ids && ret=0 + ;; + (name) + __docker_complete_networks_names && ret=0 + ;; + (scope) + opts=('global' 'local' 'swarm') + _describe -t scope-filter-opts "Scope filter options" opts && ret=0 + ;; + (type) + opts=('builtin' 'custom') + _describe -t type-filter-opts "Type filter options" opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('driver' 'id' 'label' 'name' 'scope' 'type') + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_get_networks() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local line s + declare -a lines networks + + type=$1; shift + + lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # Network ID + if [[ $type = (ids|all) ]]; then + for line in $lines; do + s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}" + s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" + s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" + networks=($networks $s) + done + fi + + # Names + if [[ $type = (names|all) ]]; then + for line in $lines; do + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" + s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" + s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}" + networks=($networks $s) + done + fi + + _describe -t networks-list "networks" networks "$@" && ret=0 + return ret +} + +__docker_complete_networks() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_networks all "$@" +} + +__docker_complete_networks_ids() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_networks ids "$@" +} + +__docker_complete_networks_names() { + [[ $PREFIX = -* ]] && return 1 + __docker_get_networks names "$@" +} + +__docker_network_commands() { + local -a _docker_network_subcommands + _docker_network_subcommands=( + "connect:Connect a container to a network" + "create:Creates a new network with a name specified by the user" + "disconnect:Disconnects a container from a network" + "inspect:Displays detailed information on a network" + "ls:Lists all the networks created by the user" + "prune:Remove all unused networks" + "rm:Deletes one or more networks" + ) + _describe -t docker-network-commands "docker network command" _docker_network_subcommands +} + +__docker_network_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (connect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*--alias=[Add network-scoped alias for the container]:alias: " \ + "($help)--ip=[IPv4 address]:IPv4: " \ + "($help)--ip6=[IPv6 address]:IPv6: " \ + "($help)*--link=[Add a link to another container]:link:->link" \ + "($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \ + "($help -)1:network:__docker_complete_networks" \ + "($help -)2:containers:__docker_complete_containers" && ret=0 + + case $state in + (link) + if compset -P "*:"; then + _wanted alias expl "Alias" compadd -E "" && ret=0 + else + __docker_complete_running_containers -qS ":" && ret=0 + fi + ;; + esac + ;; + (create) + _arguments $(__docker_arguments) -A '-*' \ + $opts_help \ + "($help)--attachable[Enable manual container attachment]" \ + "($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \ + "($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \ + "($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \ + "($help)--internal[Restricts external access to the network]" \ + "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \ + "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \ + "($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \ + "($help)--ipv6[Enable IPv6 networking]" \ + "($help)*--label=[Set metadata on a network]:label=value: " \ + "($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \ + "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \ + "($help -)1:Network Name: " && ret=0 + ;; + (disconnect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)1:network:__docker_complete_networks" \ + "($help -)2:containers:__docker_complete_containers" && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help)--verbose[Show detailed information]" \ + "($help -)*:network:__docker_complete_networks" && ret=0 + ;; + (ls) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--no-trunc[Do not truncate the output]" \ + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0 + ;; + (prune) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 + ;; + (rm) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:network:__docker_complete_networks" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 + ;; + esac + + return ret +} + +# EO network + +# BO node + +__docker_node_complete_ls_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (id) + __docker_complete_nodes_ids && ret=0 + ;; + (membership) + membership_opts=('accepted' 'pending' 'rejected') + _describe -t membership-opts "membership options" membership_opts && ret=0 + ;; + (name) + __docker_complete_nodes_names && ret=0 + ;; + (role) + role_opts=('manager' 'worker') + _describe -t role-opts "role options" role_opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('id' 'label' 'membership' 'name' 'node.label' 'role') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_node_complete_ps_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (desired-state) + state_opts=('accepted' 'running' 'shutdown') + _describe -t state-opts "desired state options" state_opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('desired-state' 'id' 'label' 'name') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_nodes() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local line s + declare -a lines nodes args + + type=$1; shift + filter=$1; shift + [[ $filter != "none" ]] && args=("-f $filter") + + lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}}) + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # Node ID + if [[ $type = (ids|all) ]]; then + for line in $lines; do + s="${line[${begin[ID]},${end[ID]}]%% ##}" + nodes=($nodes $s) + done + fi + + # Names + if [[ $type = (names|all) ]]; then + for line in $lines; do + s="${line[${begin[HOSTNAME]},${end[HOSTNAME]}]%% ##}" + nodes=($nodes $s) + done + fi + + _describe -t nodes-list "nodes" nodes "$@" && ret=0 + return ret +} + +__docker_complete_nodes() { + [[ $PREFIX = -* ]] && return 1 + __docker_nodes all none "$@" +} + +__docker_complete_nodes_ids() { + [[ $PREFIX = -* ]] && return 1 + __docker_nodes ids none "$@" +} + +__docker_complete_nodes_names() { + [[ $PREFIX = -* ]] && return 1 + __docker_nodes names none "$@" +} + +__docker_complete_pending_nodes() { + [[ $PREFIX = -* ]] && return 1 + __docker_nodes all "membership=pending" "$@" +} + +__docker_complete_manager_nodes() { + [[ $PREFIX = -* ]] && return 1 + __docker_nodes all "role=manager" "$@" +} + +__docker_complete_worker_nodes() { + [[ $PREFIX = -* ]] && return 1 + __docker_nodes all "role=worker" "$@" +} + +__docker_node_commands() { + local -a _docker_node_subcommands + _docker_node_subcommands=( + "demote:Demote a node as manager in the swarm" + "inspect:Display detailed information on one or more nodes" + "ls:List nodes in the swarm" + "promote:Promote a node as manager in the swarm" + "rm:Remove one or more nodes from the swarm" + "ps:List tasks running on one or more nodes, defaults to current node" + "update:Update a node" + ) + _describe -t docker-node-commands "docker node command" _docker_node_subcommands +} + +__docker_node_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (rm|remove) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \ + "($help -)*:node:__docker_complete_pending_nodes" && ret=0 + ;; + (demote) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:node:__docker_complete_manager_nodes" && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help)--pretty[Print the information in a human friendly format]" \ + "($help -)*:node:__docker_complete_nodes" && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ls_filters" \ + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 + ;; + (promote) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:node:__docker_complete_worker_nodes" && ret=0 + ;; + (ps) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Display all instances]" \ + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ps_filters" \ + "($help)--format=[Format the output using the given go template]:template: " \ + "($help)--no-resolve[Do not map IDs to Names]" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ + "($help -)*:node:__docker_complete_nodes" && ret=0 + ;; + (update) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--availability=[Availability of the node]:availability:(active pause drain)" \ + "($help)*--label-add=[Add or update a node label]:key=value: " \ + "($help)*--label-rm=[Remove a node label if exists]:label: " \ + "($help)--role=[Role of the node]:role:(manager worker)" \ + "($help -)1:node:__docker_complete_nodes" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0 + ;; + esac + + return ret +} + +# EO node + +# BO plugin + +__docker_plugin_complete_ls_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (capability) + opts=('authz' 'ipamdriver' 'logdriver' 'metricscollector' 'networkdriver' 'volumedriver') + _describe -t capability-opts "capability options" opts && ret=0 + ;; + (enabled) + opts=('false' 'true') + _describe -t enabled-opts "enabled options" opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('capability' 'enabled') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_plugins() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local line s + declare -a lines plugins args + + filter=$1; shift + [[ $filter != "none" ]] && args=("-f $filter") + + lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls $args)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # Name + for line in $lines; do + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" + s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}" + plugins=($plugins $s) + done + + _describe -t plugins-list "plugins" plugins "$@" && ret=0 + return ret +} + +__docker_complete_plugins() { + [[ $PREFIX = -* ]] && return 1 + __docker_plugins none "$@" +} + +__docker_complete_enabled_plugins() { + [[ $PREFIX = -* ]] && return 1 + __docker_plugins enabled=true "$@" +} + +__docker_complete_disabled_plugins() { + [[ $PREFIX = -* ]] && return 1 + __docker_plugins enabled=false "$@" +} + +__docker_plugin_commands() { + local -a _docker_plugin_subcommands + _docker_plugin_subcommands=( + "disable:Disable a plugin" + "enable:Enable a plugin" + "inspect:Return low-level information about a plugin" + "install:Install a plugin" + "ls:List plugins" + "push:Push a plugin" + "rm:Remove a plugin" + "set:Change settings for a plugin" + "upgrade:Upgrade an existing plugin" + ) + _describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands +} + +__docker_plugin_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (disable) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force the disable of an active plugin]" \ + "($help -)1:plugin:__docker_complete_enabled_plugins" && ret=0 + ;; + (enable) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--timeout=[HTTP client timeout (in seconds)]:timeout: " \ + "($help -)1:plugin:__docker_complete_disabled_plugins" && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ + "($help -)*:plugin:__docker_complete_plugins" && ret=0 + ;; + (install) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--alias=[Local name for plugin]:alias: " \ + "($help)--disable[Do not enable the plugin on install]" \ + "($help)--disable-content-trust[Skip image verification (default true)]" \ + "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \ + "($help -)1:plugin:__docker_complete_plugins" \ + "($help -)*:key=value: " && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_plugin_complete_ls_filters" \ + "($help --format)--format=[Format the output using the given Go template]:template: " \ + "($help)--no-trunc[Don't truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 + ;; + (push) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--disable-content-trust[Skip image verification (default true)]" \ + "($help -)1:plugin:__docker_complete_plugins" && ret=0 + ;; + (rm|remove) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force the removal of an active plugin]" \ + "($help -)*:plugin:__docker_complete_plugins" && ret=0 + ;; + (set) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)1:plugin:__docker_complete_plugins" \ + "($help -)*:key=value: " && ret=0 + ;; + (upgrade) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--disable-content-trust[Skip image verification (default true)]" \ + "($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \ + "($help)--skip-remote-check[Do not check if specified remote plugin matches existing plugin image]" \ + "($help -)1:plugin:__docker_complete_plugins" \ + "($help -):remote: " && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0 + ;; + esac + + return ret +} + +# EO plugin + +# BO secret + +__docker_secrets() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local line s + declare -a lines secrets + + type=$1; shift + + lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # ID + if [[ $type = (ids|all) ]]; then + for line in $lines; do + s="${line[${begin[ID]},${end[ID]}]%% ##}" + secrets=($secrets $s) + done + fi + + # Names + if [[ $type = (names|all) ]]; then + for line in $lines; do + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" + secrets=($secrets $s) + done + fi + + _describe -t secrets-list "secrets" secrets "$@" && ret=0 + return ret +} + +__docker_complete_secrets() { + [[ $PREFIX = -* ]] && return 1 + __docker_secrets all "$@" +} + +__docker_secret_commands() { + local -a _docker_secret_subcommands + _docker_secret_subcommands=( + "create:Create a secret using stdin as content" + "inspect:Display detailed information on one or more secrets" + "ls:List secrets" + "rm:Remove one or more secrets" + ) + _describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands +} + +__docker_secret_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) -A '-*' \ + $opts_help \ + "($help)*"{-l=,--label=}"[Secret labels]:label: " \ + "($help -):secret: " && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \ + "($help -)*:secret:__docker_complete_secrets" && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--format=[Format the output using the given go template]:template: " \ + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 + ;; + (rm|remove) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:secret:__docker_complete_secrets" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0 + ;; + esac + + return ret +} + +# EO secret + +# BO service + +__docker_service_complete_ls_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (id) + __docker_complete_services_ids && ret=0 + ;; + (mode) + opts=('global' 'replicated') + _describe -t mode-opts "mode options" opts && ret=0 + ;; + (name) + __docker_complete_services_names && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('id' 'label' 'mode' 'name') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_service_complete_ps_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (desired-state) + state_opts=('accepted' 'running' 'shutdown') + _describe -t state-opts "desired state options" state_opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('desired-state' 'id' 'label' 'name') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_service_complete_placement_pref() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (spread) + opts=('engine.labels' 'node.labels') + _describe -t spread-opts "spread options" opts -qS "." && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('spread') + _describe -t pref-opts "placement pref options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_services() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local line s + declare -a lines services + + type=$1; shift + + lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # Service ID + if [[ $type = (ids|all) ]]; then + for line in $lines; do + s="${line[${begin[ID]},${end[ID]}]%% ##}" + s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" + services=($services $s) + done + fi + + # Names + if [[ $type = (names|all) ]]; then + for line in $lines; do + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" + s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}" + services=($services $s) + done + fi + + _describe -t services-list "services" services "$@" && ret=0 + return ret +} + +__docker_complete_services() { + [[ $PREFIX = -* ]] && return 1 + __docker_services all "$@" +} + +__docker_complete_services_ids() { + [[ $PREFIX = -* ]] && return 1 + __docker_services ids "$@" +} + +__docker_complete_services_names() { + [[ $PREFIX = -* ]] && return 1 + __docker_services names "$@" +} + +__docker_service_commands() { + local -a _docker_service_subcommands + _docker_service_subcommands=( + "create:Create a new service" + "inspect:Display detailed information on one or more services" + "logs:Fetch the logs of a service or task" + "ls:List services" + "rm:Remove one or more services" + "rollback:Revert changes to a service's configuration" + "scale:Scale one or multiple replicated services" + "ps:List the tasks of a service" + "update:Update a service" + ) + _describe -t docker-service-commands "docker service command" _docker_service_subcommands +} + +__docker_service_subcommand() { + local -a _command_args opts_help opts_create_update + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + opts_create_update=( + "($help)*--cap-add=[Add Linux capabilities]:capability: " + "($help)*--cap-drop=[Drop Linux capabilities]:capability: " + "($help)*--constraint=[Placement constraints]:constraint: " + "($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)" + "($help)*"{-e=,--env=}"[Set environment variables]:env: " + "($help)--health-cmd=[Command to run to check health]:command: " + "($help)--health-interval=[Time between running the check]:time: " + "($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" + "($help)--health-timeout=[Maximum time to allow one check to run]:time: " + "($help)--hostname=[Service container hostname]:hostname: " \ + "($help)--isolation=[Service container isolation mode]:isolation:(default process hyperv)" \ + "($help)*--label=[Service labels]:label: " + "($help)--limit-cpu=[Limit CPUs]:value: " + "($help)--limit-memory=[Limit Memory]:value: " + "($help)--limit-pids[Limit maximum number of processes (default 0 = unlimited)]" + "($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers" + "($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options" + "($help)*--mount=[Attach a filesystem mount to the service]:mount: " + "($help)*--network=[Network attachments]:network: " + "($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" + "($help)--read-only[Mount the container's root filesystem as read only]" + "($help)--replicas=[Number of tasks]:replicas: " + "($help)--reserve-cpu=[Reserve CPUs]:value: " + "($help)--reserve-memory=[Reserve Memory]:value: " + "($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)" + "($help)--restart-delay=[Delay between restart attempts]:delay: " + "($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: " + "($help)--restart-window=[Window used to evaluate the restart policy]:duration: " + "($help)--rollback-delay=[Delay between task rollbacks]:duration: " + "($help)--rollback-failure-action=[Action on rollback failure]:action:(continue pause)" + "($help)--rollback-max-failure-ratio=[Failure rate to tolerate during a rollback]:failure rate: " + "($help)--rollback-monitor=[Duration after each task rollback to monitor for failure]:duration: " + "($help)--rollback-parallelism=[Maximum number of tasks rolled back simultaneously]:number: " + "($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets" + "($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: " + "($help)--stop-signal=[Signal to stop the container]:signal:_signals" + "($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]" + "($help)--update-delay=[Delay between updates]:delay: " + "($help)--update-failure-action=[Action on update failure]:mode:(continue pause rollback)" + "($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: " + "($help)--update-monitor=[Duration after each task update to monitor for failure]:window: " + "($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: " + "($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" + "($help)--with-registry-auth[Send registry authentication details to swarm agents]" + "($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" + ) + + case "$words[1]" in + (create) + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_create_update \ + "($help)*--container-label=[Container labels]:label: " \ + "($help)*--dns=[Set custom DNS servers]:DNS: " \ + "($help)*--dns-option=[Set DNS options]:DNS option: " \ + "($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \ + "($help)*--env-file=[Read environment variables from a file]:environment file:_files" \ + "($help)*--group=[Set one or more supplementary user groups for the container]:group: _groups " \ + "($help)--mode=[Service Mode]:mode:(global replicated)" \ + "($help)--name=[Service name]:name: " \ + "($help)*--placement-pref=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \ + "($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " \ + "($help -): :__docker_complete_images" \ + "($help -):command: _command_names -e" \ + "($help -)*::arguments: _normal" && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help)--pretty[Print the information in a human friendly format]" \ + "($help -)*:service:__docker_complete_services" && ret=0 + ;; + (logs) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --follow)"{-f,--follow}"[Follow log output]" \ + "($help)--no-resolve[Do not map IDs to Names]" \ + "($help)--no-task-ids[Do not include task IDs]" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help)--since=[Show logs since timestamp]:timestamp: " \ + "($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \ + "($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \ + "($help -)1:service:__docker_complete_services" && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0 + ;; + (rm|remove) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -)*:service:__docker_complete_services" && ret=0 + ;; + (rollback) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \ + "($help -q --quiet)"{-q,--quiet}"[Suppress progress output]" \ + "($help -)*:service:__docker_complete_services" && ret=0 + ;; + (scale) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \ + "($help -)*:service:->values" && ret=0 + case $state in + (values) + if compset -P '*='; then + _message 'replicas' && ret=0 + else + __docker_complete_services -qS "=" + fi + ;; + esac + ;; + (ps) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_service_complete_ps_filters" \ + "($help)--format=[Format the output using the given go template]:template: " \ + "($help)--no-resolve[Do not map IDs to Names]" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ + "($help -)*:service:__docker_complete_services" && ret=0 + ;; + (update) + _arguments $(__docker_arguments) \ + $opts_help \ + $opts_create_update \ + "($help)--arg=[Service command args]:arguments: _normal" \ + "($help)*--container-label-add=[Add or update container labels]:label: " \ + "($help)*--container-label-rm=[Remove a container label by its key]:label: " \ + "($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \ + "($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \ + "($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \ + "($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \ + "($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \ + "($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \ + "($help)--force[Force update]" \ + "($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \ + "($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \ + "($help)--image=[Service image tag]:image:__docker_complete_repositories" \ + "($help)*--placement-pref-add=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \ + "($help)*--placement-pref-rm=[Remove a placement preference]:pref:__docker_service_complete_placement_pref" \ + "($help)*--publish-add=[Add or update a port]:port: " \ + "($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \ + "($help)--rollback[Rollback to previous specification]" \ + "($help -)1:service:__docker_complete_services" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0 + ;; + esac + + return ret +} + +# EO service + +# BO stack + +__docker_stack_complete_ps_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (desired-state) + state_opts=('accepted' 'running' 'shutdown') + _describe -t state-opts "desired state options" state_opts && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('desired-state' 'id' 'name') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_stack_complete_services_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('id' 'label' 'name') + _describe -t filter-opts "filter options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_stacks() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + local line s + declare -a lines stacks + + lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # Service NAME + for line in $lines; do + s="${line[${begin[NAME]},${end[NAME]}]%% ##}" + stacks=($stacks $s) + done + + _describe -t stacks-list "stacks" stacks "$@" && ret=0 + return ret +} + +__docker_complete_stacks() { + [[ $PREFIX = -* ]] && return 1 + __docker_stacks "$@" +} + +__docker_stack_commands() { + local -a _docker_stack_subcommands + _docker_stack_subcommands=( + "deploy:Deploy a new stack or update an existing stack" + "ls:List stacks" + "ps:List the tasks in the stack" + "rm:Remove the stack" + "services:List the services in the stack" + ) + _describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands +} + +__docker_stack_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (deploy|up) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file, or '-' to read from stdin]:compose file:_files -g \"*.(yml|yaml)\"" \ + "($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \ + "($help -):stack:__docker_complete_stacks" && ret=0 + ;; + (ls|list) + _arguments $(__docker_arguments) \ + $opts_help && ret=0 + ;; + (ps) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Display all tasks]" \ + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \ + "($help)--format=[Format the output using the given go template]:template: " \ + "($help)--no-resolve[Do not map IDs to Names]" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \ + "($help -):stack:__docker_complete_stacks" && ret=0 + ;; + (rm|remove|down) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -):stack:__docker_complete_stacks" && ret=0 + ;; + (services) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \ + "($help -):stack:__docker_complete_stacks" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0 + ;; + esac + + return ret +} + +# EO stack + +# BO swarm + +__docker_swarm_commands() { + local -a _docker_swarm_subcommands + _docker_swarm_subcommands=( + "init:Initialize a swarm" + "join:Join a swarm as a node and/or manager" + "join-token:Manage join tokens" + "leave:Leave a swarm" + "unlock:Unlock swarm" + "unlock-key:Manage the unlock key" + "update:Update the swarm" + ) + _describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands +} + +__docker_swarm_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (init) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--advertise-addr=[Advertised address]:ip\:port: " \ + "($help)--data-path-addr=[Data path IP or interface]:ip " \ + "($help)--data-path-port=[Data Path Port]:port " \ + "($help)--default-addr-pool=[Default address pool]" \ + "($help)--default-addr-pool-mask-length=[Default address pool subnet mask length]" \ + "($help)--autolock[Enable manager autolocking]" \ + "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ + "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ + "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ + "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ + "($help)--force-new-cluster[Force create a new cluster from current state]" \ + "($help)--listen-addr=[Listen address]:ip\:port: " \ + "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ + "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ + "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 + ;; + (join) + _arguments $(__docker_arguments) -A '-*' \ + $opts_help \ + "($help)--advertise-addr=[Advertised address]:ip\:port: " \ + "($help)--data-path-addr=[Data path IP or interface]:ip " \ + "($help)--availability=[Availability of the node]:availability:(active drain pause)" \ + "($help)--listen-addr=[Listen address]:ip\:port: " \ + "($help)--token=[Token for entry into the swarm]:secret: " \ + "($help -):host\:port: " && ret=0 + ;; + (join-token) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ + "($help)--rotate[Rotate join token]" \ + "($help -):role:(manager worker)" && ret=0 + ;; + (leave) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0 + ;; + (unlock) + _arguments $(__docker_arguments) \ + $opts_help && ret=0 + ;; + (unlock-key) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -q --quiet)"{-q,--quiet}"[Only display token]" \ + "($help)--rotate[Rotate unlock token]" && ret=0 + ;; + (update) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)--autolock[Enable manager autolocking]" \ + "($help)--cert-expiry=[Validity period for node certificates]:duration: " \ + "($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \ + "($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \ + "($help)--max-snapshots[Number of additional Raft snapshots to retain]" \ + "($help)--snapshot-interval[Number of log entries between Raft snapshots]" \ + "($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0 + ;; + esac + + return ret +} + +# EO swarm + +# BO system + +__docker_system_commands() { + local -a _docker_system_subcommands + _docker_system_subcommands=( + "df:Show docker filesystem usage" + "events:Get real time events from the server" + "info:Display system-wide information" + "prune:Remove unused data" + ) + _describe -t docker-system-commands "docker system command" _docker_system_subcommands +} + +__docker_system_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (df) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0 + ;; + (events) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \ + "($help)--since=[Events created since this timestamp]:timestamp: " \ + "($help)--until=[Events created until this timestamp]:timestamp: " \ + "($help)--format=[Format the output using the given go template]:template: " && ret=0 + ;; + (info) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 + ;; + (prune) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \ + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" \ + "($help)--volumes=[Remove all unused volumes]" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 + ;; + esac + + return ret +} + +# EO system + +# BO volume + +__docker_volume_complete_ls_filters() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + + if compset -P '*='; then + case "${${words[-1]%=*}#*=}" in + (dangling) + dangling_opts=('true' 'false') + _describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0 + ;; + (driver) + __docker_complete_info_plugins Volume && ret=0 + ;; + (name) + __docker_complete_volumes && ret=0 + ;; + *) + _message 'value' && ret=0 + ;; + esac + else + opts=('dangling' 'driver' 'label' 'name') + _describe -t filter-opts "Filter Options" opts -qS "=" && ret=0 + fi + + return ret +} + +__docker_complete_volumes() { + [[ $PREFIX = -* ]] && return 1 + integer ret=1 + declare -a lines volumes + + lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}}) + + # Parse header line to find columns + local i=1 j=1 k header=${lines[1]} + declare -A begin end + while (( j < ${#header} - 1 )); do + i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 )) + j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 )) + k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 )) + begin[${header[$i,$((j-1))]}]=$i + end[${header[$i,$((j-1))]}]=$k + done + end[${header[$i,$((j-1))]}]=-1 + lines=(${lines[2,-1]}) + + # Names + local line s + for line in $lines; do + s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}" + s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}" + volumes=($volumes $s) + done + + _describe -t volumes-list "volumes" volumes && ret=0 + return ret +} + +__docker_volume_commands() { + local -a _docker_volume_subcommands + _docker_volume_subcommands=( + "create:Create a volume" + "inspect:Display detailed information on one or more volumes" + "ls:List volumes" + "prune:Remove all unused volumes" + "rm:Remove one or more volumes" + ) + _describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands +} + +__docker_volume_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) -A '-*' \ + $opts_help \ + "($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \ + "($help)*--label=[Set metadata for a volume]:label=value: " \ + "($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \ + "($help -)1:Volume name: " && ret=0 + ;; + (inspect) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help -)1:volume:__docker_complete_volumes" && ret=0 + ;; + (ls) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \ + "($help)--format=[Format the output using the given Go template]:template: " \ + "($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0 + ;; + (prune) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -a --all)"{-a,--all}"[Remove all unused local volumes, not just anonymous ones]" \ + "($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \ + "($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0 + ;; + (rm) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \ + "($help -):volume:__docker_complete_volumes" && ret=0 + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0 + ;; + esac + + return ret +} + +# 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)--description=[Description of the context]:description:" \ + "($help)--docker=[Set the docker endpoint]:docker:" \ + "($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)--description=[Description of the context]:description:" \ + "($help)--docker=[Set the docker endpoint]:docker:" \ + "($help -):name:" && ret=0 + ;; + esac + + return ret +} + +# EO context + +__docker_caching_policy() { + oldp=( "$1"(Nmh+1) ) # 1 hour + (( $#oldp )) +} + +__docker_commands() { + local cache_policy + integer force_invalidation=0 + + zstyle -s ":completion:${curcontext}:" cache-policy cache_policy + if [[ -z "$cache_policy" ]]; then + zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy + fi + + if ( (( ! ${+_docker_hide_legacy_commands} )) || _cache_invalid docker_hide_legacy_commands ) \ + && ! _retrieve_cache docker_hide_legacy_commands; + then + _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}" + _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands + fi + + if [[ "${_docker_hide_legacy_commands}" != "${DOCKER_HIDE_LEGACY_COMMANDS}" ]]; then + force_invalidation=1 + _docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}" + _store_cache docker_hide_legacy_commands _docker_hide_legacy_commands + fi + + if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands ) \ + && ! _retrieve_cache docker_subcommands || [[ ${force_invalidation} -eq 1 ]]; + then + local -a lines + lines=(${(f)"$(_call_program commands docker 2>&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 + _describe -t docker-commands "docker command" _docker_subcommands +} + +__docker_subcommand() { + local -a _command_args opts_help + local expl help="--help" + integer ret=1 + + opts_help=("(: -)--help[Print usage]") + + case "$words[1]" in + (attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait) + __docker_container_subcommand && ret=0 + ;; + (build|history|import|load|pull|push|save|tag) + __docker_image_subcommand && ret=0 + ;; + (checkpoint) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_checkpoint_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_checkpoint_subcommand && ret=0 + ;; + esac + ;; + (container) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_container_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_container_subcommand && ret=0 + ;; + 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 \ + "($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \ + "($help)*--allow-nondistributable-artifacts=[Push nondistributable artifacts to specified registries]:registry: " \ + "($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \ + "($help)*--authorization-plugin=[Authorization plugins to load]" \ + "($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \ + "($help)--bip=[Network bridge IP]:IP address: " \ + "($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \ + "($help)--config-file=[Path to daemon configuration file]:Config File:_files" \ + "($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \ + "($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \ + "($help)--containerd-plugins-namespace=[Containerd namespace to use for plugins]:containerd namespace:" \ + "($help)--data-root=[Root directory of persisted Docker data]:path:_directories" \ + "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ + "($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \ + "($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \ + "($help)--default-shm-size=[Default shm size for containers]:size:" \ + "($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \ + "($help)*--dns=[DNS server to use]:DNS: " \ + "($help)*--dns-opt=[DNS options to use]:DNS option: " \ + "($help)*--dns-search=[DNS search domains to use]:DNS search: " \ + "($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \ + "($help)--exec-root=[Root directory for execution state files]:path:_directories" \ + "($help)--experimental[Enable experimental features]" \ + "($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \ + "($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \ + "($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \ + "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ + "($help)--icc[Enable inter-container communication]" \ + "($help)--init[Run an init inside containers to forward signals and reap processes]" \ + "($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \ + "($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \ + "($help)--ip=[Default IP when binding container ports]" \ + "($help)--ip-forward[Enable net.ipv4.ip_forward]" \ + "($help)--ip-masq[Enable IP masquerading]" \ + "($help)--iptables[Enable addition of iptables rules]" \ + "($help)--ipv6[Enable IPv6 networking]" \ + "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ + "($help)*--label=[Key=value labels]:label: " \ + "($help)--live-restore[Enable live restore of docker when containers are still running]" \ + "($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \ + "($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \ + "($help)--max-concurrent-downloads[Set the max concurrent downloads]" \ + "($help)--max-concurrent-uploads[Set the max concurrent uploads]" \ + "($help)--max-download-attempts[Set the max download attempts for each pull]" \ + "($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \ + "($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \ + "($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \ + "($help)--raw-logs[Full timestamps without ANSI coloring]" \ + "($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \ + "($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \ + "($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(btrfs devicemapper overlay2 vfs zfs)" \ + "($help)--selinux-enabled[Enable selinux support]" \ + "($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \ + "($help)*--storage-opt=[Storage driver options]:storage driver options: " \ + "($help)--tls[Use TLS]" \ + "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \ + "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \ + "($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \ + "($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" \ + "($help)--validate[Validate daemon configuration and exit]" && ret=0 + + case $state in + (users-groups) + if compset -P '*:'; then + _groups && ret=0 + else + _describe -t userns-default "default Docker user management" '(default)' && ret=0 + _users && ret=0 + fi + ;; + esac + ;; + (events|info) + __docker_system_subcommand && ret=0 + ;; + (image) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_image_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_image_subcommand && ret=0 + ;; + esac + ;; + (images) + words[1]='ls' + __docker_image_subcommand && ret=0 + ;; + (inspect) + local state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \ + "($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \ + "($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \ + "($help -)*: :->values" && ret=0 + + case $state in + (values) + if [[ ${words[(r)--type=container]} == --type=container ]]; then + __docker_complete_containers && ret=0 + elif [[ ${words[(r)--type=image]} == --type=image ]]; then + __docker_complete_images && ret=0 + elif [[ ${words[(r)--type=network]} == --type=network ]]; then + __docker_complete_networks && ret=0 + elif [[ ${words[(r)--type=node]} == --type=node ]]; then + __docker_complete_nodes && ret=0 + elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then + __docker_complete_plugins && ret=0 + elif [[ ${words[(r)--type=service]} == --type=secrets ]]; then + __docker_complete_secrets && ret=0 + elif [[ ${words[(r)--type=service]} == --type=service ]]; then + __docker_complete_services && ret=0 + elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then + __docker_complete_volumes && ret=0 + else + __docker_complete_containers + __docker_complete_images + __docker_complete_networks + __docker_complete_nodes + __docker_complete_plugins + __docker_complete_secrets + __docker_complete_services + __docker_complete_volumes && ret=0 + fi + ;; + esac + ;; + (login) + _arguments $(__docker_arguments) -A '-*' \ + $opts_help \ + "($help -p --password)"{-p=,--password=}"[Password]:password: " \ + "($help)--password-stdin[Read password from stdin]" \ + "($help -u --username)"{-u=,--username=}"[Username]:username: " \ + "($help -)1:server: " && ret=0 + ;; + (logout) + _arguments $(__docker_arguments) -A '-*' \ + $opts_help \ + "($help -)1:server: " && ret=0 + ;; + (network) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_network_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_network_subcommand && ret=0 + ;; + esac + ;; + (node) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_node_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_node_subcommand && ret=0 + ;; + esac + ;; + (plugin) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_plugin_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_plugin_subcommand && ret=0 + ;; + esac + ;; + (ps) + words[1]='ls' + __docker_container_subcommand && ret=0 + ;; + (rmi) + words[1]='rm' + __docker_image_subcommand && ret=0 + ;; + (search) + _arguments $(__docker_arguments) -A '-*' \ + $opts_help \ + "($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_search_filters" \ + "($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \ + "($help)--no-trunc[Do not truncate output]" \ + "($help -):term: " && ret=0 + ;; + (secret) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_secret_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_secret_subcommand && ret=0 + ;; + esac + ;; + (service) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_service_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_service_subcommand && ret=0 + ;; + esac + ;; + (stack) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_stack_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_stack_subcommand && ret=0 + ;; + esac + ;; + (swarm) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_swarm_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_swarm_subcommand && ret=0 + ;; + esac + ;; + (system) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_system_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_system_subcommand && ret=0 + ;; + esac + ;; + (version) + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0 + ;; + (volume) + local curcontext="$curcontext" state + _arguments $(__docker_arguments) \ + $opts_help \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + case $state in + (command) + __docker_volume_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-${words[-1]}: + __docker_volume_subcommand && ret=0 + ;; + esac + ;; + (help) + _arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0 + ;; + esac + + return ret +} + +_docker() { + # Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`. + # Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`. + if [[ $service != docker ]]; then + _call_function - _$service + return + fi + + local curcontext="$curcontext" state line help="-h --help" + integer ret=1 + typeset -A opt_args + + _arguments $(__docker_arguments) -C \ + "(: -)"{-h,--help}"[Print usage]" \ + "($help)--config[Location of client config files]:path:_directories" \ + "($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \ + "($help -D --debug)"{-D,--debug}"[Enable debug mode]" \ + "($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \ + "($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \ + "($help)--tls[Use TLS]" \ + "($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \ + "($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \ + "($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \ + "($help)--tlsverify[Use TLS and verify the remote]" \ + "($help)--userland-proxy[Use userland proxy for loopback traffic]" \ + "($help -v --version)"{-v,--version}"[Print version information and quit]" \ + "($help -): :->command" \ + "($help -)*:: :->option-or-argument" && ret=0 + + local host=${opt_args[-H]}${opt_args[--host]} + local config=${opt_args[--config]} + local context=${opt_args[-c]}${opt_args[--context]} + local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} " + + case $state in + (command) + __docker_commands && ret=0 + ;; + (option-or-argument) + curcontext=${curcontext%:*:*}:docker-$words[1]: + __docker_subcommand && ret=0 + ;; + esac + + return ret +} + +_dockerd() { + integer ret=1 + words[1]='daemon' + __docker_subcommand && ret=0 + return ret +} + +_docker "$@" + +# Local Variables: +# mode: Shell-Script +# sh-indentation: 4 +# indent-tabs-mode: nil +# sh-basic-offset: 4 +# End: +# vim: ft=zsh sw=4 ts=4 et From 73c4764e78947864c6f067df3bec4cff02866eb2 Mon Sep 17 00:00:00 2001 From: Andrei Polushin Date: Thu, 29 Jun 2023 13:25:41 +0200 Subject: [PATCH 231/321] fix(docker): use `docker --version` instead of `docker version` `docker version` subcommand is able to return both docker client and docker daemon information. To get a daemon version, it connects to a possibly remote daemon. If the remote daemon is not accessible, the client waits for some time, until it gets interrupted by timeout. As a result we can have a docker client running in background. When zsh session is rather short, a terminal application (iTerm2) starts asking if that background docker process should be stopped. On the other hand, to get a docker client version only, we can use `docker --version` instead. It does not connect to a daemon. Closes #11780 --- plugins/docker/docker.plugin.zsh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 434b1fc6..3abce646 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -37,8 +37,10 @@ if (( ! $+commands[docker] )); then fi { + # docker version returns `Docker version 24.0.2, build cb74dfcd85` + # with `s:,:` remove the comma after the version, and select third word of it + local _docker_version=${${(s:,:z)"$(command docker --version)"}[3]} # `docker completion` is only available from 23.0.0 on - local _docker_version=$(command docker version --format '{{.Client.Version}}' 2>/dev/null) if is-at-least 23.0.0 $_docker_version; then # If the completion file doesn't exist yet, we need to autoload it and # bind it to `docker`. Otherwise, compinit will have already done that. From 54779e5250f362ebd1cf6a7094657f2c894958c3 Mon Sep 17 00:00:00 2001 From: Matthias Heyman Date: Thu, 29 Jun 2023 13:29:14 +0200 Subject: [PATCH 232/321] fix(jira): support identifiers delimited with a hyphen (#11782) Co-authored-by: Matthias Heyman --- plugins/jira/jira.plugin.zsh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index e789fce9..b6ee9f10 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -80,7 +80,13 @@ function jira() { issue_arg=${issue_arg##*/} # Strip suffixes starting with _ issue_arg=(${(s:_:)issue_arg}) - issue_arg=${issue_arg[1]} + # If there is only one part, it means that there is a different delimiter. Try with - + if [[ ${#issue_arg[@]} = 1 && ${issue_arg} == *-* ]]; then + issue_arg=(${(s:-:)issue_arg}) + issue_arg="${issue_arg[1]}-${issue_arg[2]}" + else + issue_arg=${issue_arg[1]} + fi if [[ "${issue_arg:l}" = ${jira_prefix:l}* ]]; then issue="${issue_arg}" else From fe4b5659863c388786986d70fa6d1bb66b00afb6 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 30 Jun 2023 11:41:44 +0200 Subject: [PATCH 233/321] fix(docker): only load old completion if docker <23 --- plugins/docker/{ => completions}/_docker | 0 plugins/docker/docker.plugin.zsh | 7 +++++++ 2 files changed, 7 insertions(+) rename plugins/docker/{ => completions}/_docker (100%) diff --git a/plugins/docker/_docker b/plugins/docker/completions/_docker similarity index 100% rename from plugins/docker/_docker rename to plugins/docker/completions/_docker diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 3abce646..7777048a 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -36,6 +36,11 @@ if (( ! $+commands[docker] )); then return fi +# Standarized $0 handling +# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html +0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" +0="${${(M)0:#/*}:-$PWD/$0}" + { # docker version returns `Docker version 24.0.2, build cb74dfcd85` # with `s:,:` remove the comma after the version, and select third word of it @@ -50,5 +55,7 @@ fi _comps[docker]=_docker fi command docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" + else + command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker" fi } &| From 8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd Mon Sep 17 00:00:00 2001 From: Jarrett Lusso Date: Sat, 15 Jul 2023 16:10:48 -0400 Subject: [PATCH 234/321] docs(nvm): clarify autoload setup (#11797) --- plugins/nvm/README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index eee3bf71..b5ef221d 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -52,12 +52,7 @@ version to load. This can be done, similar as previous options, adding: ```zsh zstyle ':omz:plugins:nvm' autoload yes -``` - -To remove the output generated by NVM when autoloading, you can set the following option: - -```zsh -zstyle ':omz:plugins:nvm' silent-autoload yes +zstyle ':omz:plugins:nvm' silent-autoload yes # optionally remove the output generated by NVM when autoloading ``` Note: _this will not remove regular `nvm` output_ From b3427f0de6cf7a2ea8387366c44257663e72555c Mon Sep 17 00:00:00 2001 From: majick <125657+majick@users.noreply.github.com> Date: Wed, 19 Jul 2023 14:28:33 +0200 Subject: [PATCH 235/321] fix(ubuntu)!: rename `acse` alias to `acs` Closes #11799 This commit reverses 5bfdd0356b46dc711a8f0866eeb9b717c033d5b2 BREAKING CHANGE: reverting alias rename from `acs` to `acse`. --- plugins/debian/README.md | 2 +- plugins/debian/debian.plugin.zsh | 2 +- plugins/ubuntu/README.md | 2 +- plugins/ubuntu/ubuntu.plugin.zsh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/debian/README.md b/plugins/debian/README.md index c1ebe1c5..1db534f1 100644 --- a/plugins/debian/README.md +++ b/plugins/debian/README.md @@ -21,7 +21,7 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh | ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- | | `age` | `apt-get` | Command line tool for handling packages | | `api` | `aptitude` | Same functionality as `apt-get`, provides extra options | -| `acse` | `apt-cache search` | Command line tool for searching apt software package cache | +| `acs` | `apt-cache search` | Command line tool for searching apt software package cache | | `aps` | `aptitude search` | Searches installed packages using aptitude | | `as` | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format | | `afs` | `apt-file search --regexp` | Search file in packages | diff --git a/plugins/debian/debian.plugin.zsh b/plugins/debian/debian.plugin.zsh index bab1ae1c..5ef4cfb6 100644 --- a/plugins/debian/debian.plugin.zsh +++ b/plugins/debian/debian.plugin.zsh @@ -26,7 +26,7 @@ alias age='apt-get' alias api='aptitude' # Some self-explanatory aliases -alias acse="apt-cache search" +alias acs="apt-cache search" alias aps='aptitude search' alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search" diff --git a/plugins/ubuntu/README.md b/plugins/ubuntu/README.md index 2401c102..20f5c65e 100644 --- a/plugins/ubuntu/README.md +++ b/plugins/ubuntu/README.md @@ -15,7 +15,7 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other | Alias | Command | Description | |---------|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| | age | `sudo $APT` | Run apt-get with sudo | -| acse | `apt-cache search` | Search the apt-cache with the specified criteria | +| acs | `apt-cache search` | Search the apt-cache with the specified criteria | | acsp | `apt-cache showpkg` | Shows information about the listed packages | | acp | `apt-cache policy` | Display the package source priorities | | afs | `apt-file search --regexp` | Perform a regular expression apt-file search | diff --git a/plugins/ubuntu/ubuntu.plugin.zsh b/plugins/ubuntu/ubuntu.plugin.zsh index 4d35da2a..7b765a40 100644 --- a/plugins/ubuntu/ubuntu.plugin.zsh +++ b/plugins/ubuntu/ubuntu.plugin.zsh @@ -1,6 +1,6 @@ (( $+commands[apt] )) && APT=apt || APT=apt-get -alias acse='apt-cache search' +alias acs='apt-cache search' alias afs='apt-file search --regexp' From 33fbbdbb0d46e87d76bbef94ac07ceff2cd0b47e Mon Sep 17 00:00:00 2001 From: majick <125657+majick@users.noreply.github.com> Date: Wed, 19 Jul 2023 14:28:55 +0200 Subject: [PATCH 236/321] fix(aliases)!: rename `acs` to `als` BREAKING CHANGE: rename main function from `acs` to `als` to avoid conflicts with `ubuntu` and `debian` plugins and improve semantics. --- plugins/aliases/README.md | 10 +++++----- plugins/aliases/aliases.plugin.zsh | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md index 6a2da3d7..41955409 100644 --- a/plugins/aliases/README.md +++ b/plugins/aliases/README.md @@ -15,14 +15,14 @@ Requirements: Python needs to be installed. ## Usage -- `acs`: show all aliases by group +- `als`: show all aliases by group -- `acs -h/--help`: print help mesage +- `als -h/--help`: print help mesage -- `acs `: filter and highlight aliases by `` +- `als `: filter and highlight aliases by `` -- `acs -g /--group `: show only aliases for group ``. Multiple uses of the flag show all groups +- `als -g /--group `: show only aliases for group ``. Multiple uses of the flag show all groups -- `acs --groups`: show only group names +- `als --groups`: show only group names ![screenshot](https://cloud.githubusercontent.com/assets/3602957/11581913/cb54fb8a-9a82-11e5-846b-5a67f67ad9ad.png) diff --git a/plugins/aliases/aliases.plugin.zsh b/plugins/aliases/aliases.plugin.zsh index 9864de95..7f1ba83b 100644 --- a/plugins/aliases/aliases.plugin.zsh +++ b/plugins/aliases/aliases.plugin.zsh @@ -4,7 +4,7 @@ 0="${${(M)0:#/*}:-$PWD/$0}" eval ' - function acs(){ + function als(){ (( $+commands[python3] )) || { echo "[error] No python executable detected" return From 7cf00a0b5cf0f25c16fc7902f78dff480e03fe3d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 19 Jul 2023 14:46:35 +0200 Subject: [PATCH 237/321] fix(nvm): remove nvm not found verbose message --- plugins/nvm/nvm.plugin.zsh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 484ef296..1badbeab 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -16,13 +16,7 @@ fi # Note: nvm is a function so we need to use `which` which nvm &>/dev/null && return -if [[ -z "$NVM_DIR" ]]; then - echo "[oh-my-zsh] nvm installation cannot be found" - echo "[oh-my-zsh] set NVM_DIR to your installation" - return -fi -if [[ ! -f "$NVM_DIR/nvm.sh" ]]; then - echo "[oh-my-zsh] nvm.sh does not exist in $NVM_DIR" +if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then return fi From c4392a4da31efee36f29a62d3951d5c0fcd7d4e6 Mon Sep 17 00:00:00 2001 From: Jokeoo <30483934+SunJun8@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:03:38 +0800 Subject: [PATCH 238/321] feat(tig): add two new aliases (#11090) --- plugins/tig/tig.plugin.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/tig/tig.plugin.zsh b/plugins/tig/tig.plugin.zsh index 7e0c530a..5b7d2550 100644 --- a/plugins/tig/tig.plugin.zsh +++ b/plugins/tig/tig.plugin.zsh @@ -1,3 +1,5 @@ alias tis='tig status' alias til='tig log' alias tib='tig blame -C' +alias tif='tig reflog' +alias tia='tig --all' From 7d5e12500a2ba0b575ffafcbb516568973528730 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 20 Jul 2023 10:43:56 +0200 Subject: [PATCH 239/321] feat(docker): add `legacy-completion` option --- plugins/docker/README.md | 11 ++++++++++- plugins/docker/docker.plugin.zsh | 27 ++++++++++++++------------- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/plugins/docker/README.md b/plugins/docker/README.md index 512b5d17..0ab2e41f 100644 --- a/plugins/docker/README.md +++ b/plugins/docker/README.md @@ -30,6 +30,15 @@ file**, but be aware of the side effects: > zstyle ':completion:*:*:docker-*:*' option-stacking yes > ``` +### Use old-style completion + +If the current completion does not work well for you, you can enable legacy completion instead with the +following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more information. + +```zsh +zstyle ':omz:plugins:docker' legacy-completion yes +``` + ## Aliases | Alias | Command | Description | @@ -58,7 +67,7 @@ file**, but be aware of the side effects: | drm | `docker container rm` | Remove the specified container(s) | | drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | | dst | `docker container start` | Start one or more stopped containers | -| drs | `docker container restart` | Restart one or more containers +| drs | `docker container restart` | Restart one or more containers | | dsta | `docker stop $(docker ps -q)` | Stop all running containers | | dstp | `docker container stop` | Stop one or more running containers | | dtop | `docker top` | Display the running processes of a container | diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 7777048a..7e657f2d 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -41,21 +41,22 @@ fi 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${(M)0:#/*}:-$PWD/$0}" +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `docker`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then + typeset -g -A _comps + autoload -Uz _docker + _comps[docker]=_docker +fi + { + # `docker completion` is only available from 23.0.0 on # docker version returns `Docker version 24.0.2, build cb74dfcd85` # with `s:,:` remove the comma after the version, and select third word of it - local _docker_version=${${(s:,:z)"$(command docker --version)"}[3]} - # `docker completion` is only available from 23.0.0 on - if is-at-least 23.0.0 $_docker_version; then - # If the completion file doesn't exist yet, we need to autoload it and - # bind it to `docker`. Otherwise, compinit will have already done that. - if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then - typeset -g -A _comps - autoload -Uz _docker - _comps[docker]=_docker - fi - command docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" - else - command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker" + if zstyle -t ':omz:plugins:docker' legacy-completion || \ + ! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then + command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker" + else + command docker completion zsh >| "$ZSH_CACHE_DIR/completions/_docker" fi } &| From b9354c5e9c29bd2d5b53731847855d25381c157c Mon Sep 17 00:00:00 2001 From: Zou Yang Date: Mon, 24 Jul 2023 01:44:30 +0800 Subject: [PATCH 240/321] fix(michelebologna): use blue instead of white (#11810) --- themes/michelebologna.zsh-theme | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/themes/michelebologna.zsh-theme b/themes/michelebologna.zsh-theme index bb86d68d..b13b2caf 100644 --- a/themes/michelebologna.zsh-theme +++ b/themes/michelebologna.zsh-theme @@ -29,14 +29,13 @@ local cyan="%{$fg_bold[cyan]%}" local yellow="%{$fg_bold[yellow]%}" local blue="%{$fg_bold[blue]%}" local magenta="%{$fg_bold[magenta]%}" -local white="%{$fg_bold[white]%}" local reset="%{$reset_color%}" local -a color_array -color_array=($green $red $cyan $yellow $blue $magenta $white) +color_array=($green $red $cyan $yellow $blue $magenta) -local username_color=$white -local hostname_color=$color_array[$[((#HOST))%7+1]] # choose hostname color based on first character +local username_color=$blue +local hostname_color=$color_array[$[((#HOST))%6+1]] # choose hostname color based on first character local current_dir_color=$blue local username="%n" @@ -66,10 +65,10 @@ function michelebologna_git_prompt { local out=$(git_prompt_info)$(git_prompt_status)$(git_remote_status) [[ -n $out ]] || return printf " %s(%s%s%s)%s" \ - "%{$fg_bold[white]%}" \ + "%{$fg_bold[blue]%}" \ "%{$fg_bold[green]%}" \ "$out" \ - "%{$fg_bold[white]%}" \ + "%{$fg_bold[blue]%}" \ "%{$reset_color%}" } From 338b9a615a276240deaf4b6a26bb3abda204fe3f Mon Sep 17 00:00:00 2001 From: cohml <62400541+cohml@users.noreply.github.com> Date: Sun, 23 Jul 2023 16:02:17 -0400 Subject: [PATCH 241/321] fix(per-directory-history): ^G also in vi mode (#11808) Co-authored-by: Chris Hamill --- plugins/per-directory-history/per-directory-history.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/per-directory-history/per-directory-history.zsh b/plugins/per-directory-history/per-directory-history.zsh index 7cd673cd..acbd6475 100644 --- a/plugins/per-directory-history/per-directory-history.zsh +++ b/plugins/per-directory-history/per-directory-history.zsh @@ -81,6 +81,7 @@ function per-directory-history-toggle-history() { autoload per-directory-history-toggle-history zle -N per-directory-history-toggle-history bindkey $PER_DIRECTORY_HISTORY_TOGGLE per-directory-history-toggle-history +bindkey -M vicmd $PER_DIRECTORY_HISTORY_TOGGLE per-directory-history-toggle-history #------------------------------------------------------------------------------- # implementation details From 6925c44af4bf909a1e023aaa7243e1752db2439a Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 25 Jul 2023 01:22:33 +0200 Subject: [PATCH 242/321] fix(aliases): rename acs to als in script help Closes #11812 --- plugins/aliases/cheatsheet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/aliases/cheatsheet.py b/plugins/aliases/cheatsheet.py index f742fba9..61bf5f95 100644 --- a/plugins/aliases/cheatsheet.py +++ b/plugins/aliases/cheatsheet.py @@ -57,7 +57,7 @@ def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False): pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter) if __name__ == '__main__': - parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="acs") + parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="als") parser.add_argument('filter', nargs="*", metavar="", help="search aliases matching keywords") parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups") parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups") From e564793939a086fc4c46628b193a38997ea4ecb3 Mon Sep 17 00:00:00 2001 From: naturedamends <120284608+naturedamends@users.noreply.github.com> Date: Tue, 25 Jul 2023 09:25:07 +0100 Subject: [PATCH 243/321] feat(fino-time): add conda environment (#11785) --- themes/fino-time.zsh-theme | 1 + 1 file changed, 1 insertion(+) diff --git a/themes/fino-time.zsh-theme b/themes/fino-time.zsh-theme index c7e2d965..3f9360ac 100644 --- a/themes/fino-time.zsh-theme +++ b/themes/fino-time.zsh-theme @@ -12,6 +12,7 @@ # Also borrowing from http://stevelosh.com/blog/2010/02/my-extravagant-zsh-prompt/ function virtualenv_info { + [ $CONDA_DEFAULT_ENV ] && echo "($CONDA_DEFAULT_ENV) " [ $VIRTUAL_ENV ] && echo '('`basename $VIRTUAL_ENV`') ' } From 4188b22aea3356a02768505103e42a96d18547a3 Mon Sep 17 00:00:00 2001 From: jabunovoty Date: Tue, 25 Jul 2023 10:31:24 +0200 Subject: [PATCH 244/321] feat(agnoster): add git tag to prompt (#8417) Co-authored-by: Jakub Novotny --- themes/agnoster.zsh-theme | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index 88854ecc..aa274a5b 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -109,7 +109,9 @@ prompt_git() { if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then repo_path=$(git rev-parse --git-dir 2>/dev/null) dirty=$(parse_git_dirty) - ref=$(git symbolic-ref HEAD 2> /dev/null) || ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" + ref=$(git symbolic-ref HEAD 2> /dev/null) || \ + ref="◈ $(git describe --exact-match --tags HEAD 2> /dev/null)" || \ + ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" if [[ -n $dirty ]]; then prompt_segment yellow black else From 7d2aedf199d1e27b6bea8ab33212043b055b3715 Mon Sep 17 00:00:00 2001 From: David LJ Date: Wed, 9 Aug 2023 18:27:39 +0200 Subject: [PATCH 245/321] chore(gitignore): use new API endpoint from TopTal (#11835) --- plugins/gitignore/README.md | 2 +- plugins/gitignore/gitignore.plugin.zsh | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/gitignore/README.md b/plugins/gitignore/README.md index 753dd31f..23c7887c 100644 --- a/plugins/gitignore/README.md +++ b/plugins/gitignore/README.md @@ -1,6 +1,6 @@ # gitignore -This plugin enables you the use of [gitignore.io](https://www.gitignore.io/) from the command line. You need an active internet connection. +This plugin enables you the use of [gitignore.io](https://www.toptal.com/developers/gitignore) from the command line. You need an active internet connection. To use it, add `gitignore` to the plugins array in your zshrc file: diff --git a/plugins/gitignore/gitignore.plugin.zsh b/plugins/gitignore/gitignore.plugin.zsh index a687f5cc..3271d61a 100644 --- a/plugins/gitignore/gitignore.plugin.zsh +++ b/plugins/gitignore/gitignore.plugin.zsh @@ -1,7 +1,7 @@ -function gi() { curl -fLw '\n' https://www.gitignore.io/api/"${(j:,:)@}" } +function gi() { curl -fLw '\n' https://www.toptal.com/developers/gitignore/api/"${(j:,:)@}" } _gitignoreio_get_command_list() { - curl -sfL https://www.gitignore.io/api/list | tr "," "\n" + curl -sfL https://www.toptal.com/developers/gitignore/api/list | tr "," "\n" } _gitignoreio () { From fd219a94ab585fa699a0e842335a9f33dcbb613b Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 10 Aug 2023 15:39:40 +0200 Subject: [PATCH 246/321] docs(aliases): replace screenshot Closes #11837 Closes #11822 --- plugins/aliases/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md index 41955409..53b68ea0 100644 --- a/plugins/aliases/README.md +++ b/plugins/aliases/README.md @@ -25,4 +25,4 @@ Requirements: Python needs to be installed. - `als --groups`: show only group names - ![screenshot](https://cloud.githubusercontent.com/assets/3602957/11581913/cb54fb8a-9a82-11e5-846b-5a67f67ad9ad.png) + ![screenshot](https://github.com/ohmyzsh/ohmyzsh/assets/66907184/5bfa00ea-5fc3-4e97-8b22-2f74f6b948c7) From b81915d3293cc4657cec64202b9fd991b96b4ba2 Mon Sep 17 00:00:00 2001 From: Jin Cheol <76617139+bik1111@users.noreply.github.com> Date: Wed, 16 Aug 2023 20:46:28 +0900 Subject: [PATCH 247/321] feat(terraform): add terraform version prompt (#11845) --- plugins/terraform/README.md | 13 ++++++++----- plugins/terraform/terraform.plugin.zsh | 7 +++++++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md index c19f2ad1..fc9a9f00 100644 --- a/plugins/terraform/README.md +++ b/plugins/terraform/README.md @@ -1,7 +1,7 @@ # Terraform plugin -Plugin for Terraform, a tool from Hashicorp for managing infrastructure safely and efficiently. -It adds completion for `terraform`, as well as aliases and a prompt function. +Plugin for Terraform, a tool from Hashicorp for managing infrastructure safely and efficiently. It adds +completion for `terraform`, as well as aliases and a prompt function. To use it, add `terraform` to the plugins array of your `~/.zshrc` file: @@ -11,7 +11,7 @@ plugins=(... terraform) ## Requirements -* [Terraform](https://terraform.io/) +- [Terraform](https://terraform.io/) ## Aliases @@ -29,11 +29,12 @@ plugins=(... terraform) ## Prompt function -You can add the current Terraform workspace in your prompt by adding `$(tf_prompt_info)` -to your `PROMPT` or `RPROMPT` variable. +You can add the current Terraform workspace in your prompt by adding `$(tf_prompt_info)`, +`$(tf_version_prompt_info)` to your `PROMPT` or `RPROMPT` variable. ```sh RPROMPT='$(tf_prompt_info)' +RPROMPT='$(tf_version_prompt_info)' ``` You can also specify the PREFIX and SUFFIX for the workspace with the following variables: @@ -41,4 +42,6 @@ You can also specify the PREFIX and SUFFIX for the workspace with the following ```sh ZSH_THEME_TF_PROMPT_PREFIX="%{$fg[white]%}" ZSH_THEME_TF_PROMPT_SUFFIX="%{$reset_color%}" +ZSH_THEME_TF_VERSION_PROMPT_PREFIX="%{$fg[white]%}" +ZSH_THEME_TF_VERSION_PROMPT_SUFFIX="%{$reset_color%}" ``` diff --git a/plugins/terraform/terraform.plugin.zsh b/plugins/terraform/terraform.plugin.zsh index 7006f204..ccca5468 100644 --- a/plugins/terraform/terraform.plugin.zsh +++ b/plugins/terraform/terraform.plugin.zsh @@ -8,6 +8,13 @@ function tf_prompt_info() { echo "${ZSH_THEME_TF_PROMPT_PREFIX-[}${workspace:gs/%/%%}${ZSH_THEME_TF_PROMPT_SUFFIX-]}" } +function tf_version_prompt_info() { + local terraform_version + terraform_version=$(terraform --version | head -n 1 | cut -d ' ' -f 2) + echo "${ZSH_THEME_TF_VERSION_PROMPT_PREFIX-[}${terraform_version:gs/%/%%}${ZSH_THEME_TF_VERSION_PROMPT_SUFFIX-]}" +} + + alias tf='terraform' alias tfa='terraform apply' alias tfc='terraform console' From 6bc4c80c7db072a0d2d265eb3589bbe52e0d2737 Mon Sep 17 00:00:00 2001 From: Ahmed Wael <73046395+ahmedwael216@users.noreply.github.com> Date: Mon, 21 Aug 2023 19:07:28 +0300 Subject: [PATCH 248/321] fix(colored-man-pages): add env GROFF_NO_SGR=1 (#11831) --- plugins/colored-man-pages/colored-man-pages.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/colored-man-pages/colored-man-pages.plugin.zsh b/plugins/colored-man-pages/colored-man-pages.plugin.zsh index 981992d8..57facbb5 100644 --- a/plugins/colored-man-pages/colored-man-pages.plugin.zsh +++ b/plugins/colored-man-pages/colored-man-pages.plugin.zsh @@ -36,6 +36,7 @@ function colored() { # Prefer `less` whenever available, since we specifically configured # environment for it. environment+=( PAGER="${commands[less]:-$PAGER}" ) + environment+=( GROFF_NO_SGR=1 ) # See ./nroff script. if [[ "$OSTYPE" = solaris* ]]; then From dfe2f04de7e839ae0a9757c37a26b9d8710aa372 Mon Sep 17 00:00:00 2001 From: LuckyWindsck Date: Tue, 22 Aug 2023 01:09:02 +0900 Subject: [PATCH 249/321] refactor(init): rename variable (#11851) --- oh-my-zsh.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index a577c1f4..40f13f37 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -187,12 +187,12 @@ _omz_source() { fi } -# Load all of the config files in ~/oh-my-zsh that end in .zsh +# Load all of the lib files in ~/oh-my-zsh/lib that end in .zsh # TIP: Add files you don't want in git to .gitignore -for config_file ("$ZSH"/lib/*.zsh); do - _omz_source "lib/${config_file:t}" +for lib_file ("$ZSH"/lib/*.zsh); do + _omz_source "lib/${lib_file:t}" done -unset custom_config_file +unset lib_file # Load all of the plugins that were defined in ~/.zshrc for plugin ($plugins); do From 3f477e5da5ee42356f103d2c5cdd478d23bf9f03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 23 Aug 2023 13:25:33 +0200 Subject: [PATCH 250/321] fix(extract): extraction to directory for single-file .gz (#11852) --- plugins/extract/extract.plugin.zsh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index b7a823c9..513950f3 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -64,7 +64,7 @@ EOF (*.tar.lz) (( $+commands[lzip] )) && tar xvf "$full_path" ;; (*.tar.lz4) lz4 -c -d "$full_path" | tar xvf - ;; (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$full_path" ;; - (*.gz) (( $+commands[pigz] )) && pigz -dk "$full_path" || gunzip -k "$full_path" ;; + (*.gz) (( $+commands[pigz] )) && pigz -cdk "$full_path" > "${file:t:r}" || gunzip -ck "$full_path" > "${file:t:r}" ;; (*.bz2) bunzip2 "$full_path" ;; (*.xz) unxz "$full_path" ;; (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$full_path" ;; @@ -106,19 +106,19 @@ EOF # - Y2: at most give 2 files local -a content content=("${extract_dir}"/*(DNY2)) - if [[ ${#content} -eq 1 && -d "${content[1]}" ]]; then - # The extracted folder (${content[1]}) may have the same name as $extract_dir + if [[ ${#content} -eq 1 && -e "${content[1]}" ]]; then + # The extracted file/folder (${content[1]}) may have the same name as $extract_dir # If so, we need to rename it to avoid conflicts in a 3-step process # - # 1. Move and rename the extracted folder to a temporary random name + # 1. Move and rename the extracted file/folder to a temporary random name # 2. Delete the empty folder - # 3. Rename the extracted folder to the original name + # 3. Rename the extracted file/folder to the original name if [[ "${content[1]:t}" == "$extract_dir" ]]; then # =(:) gives /tmp/zsh, with :t it gives zsh - local tmp_dir==(:); tmp_dir="${tmp_dir:t}" - command mv "${content[1]}" "$tmp_dir" \ + local tmp_name==(:); tmp_name="${tmp_name:t}" + command mv "${content[1]}" "$tmp_name" \ && command rmdir "$extract_dir" \ - && command mv "$tmp_dir" "$extract_dir" + && command mv "$tmp_name" "$extract_dir" # Otherwise, if the extracted folder name already exists in the current # directory (because of a previous file / folder), keep the extract_dir elif [[ ! -e "${content[1]:t}" ]]; then From 33c0de7add12b050b94fd6f2f988e9b5547d172c Mon Sep 17 00:00:00 2001 From: Miguel Hargreaves Pimenta Date: Wed, 23 Aug 2023 12:38:32 +0100 Subject: [PATCH 251/321] refactor(git): sort git aliases alphabetically (#9743) --- plugins/git/README.md | 419 ++++++++++++------------ plugins/git/git.plugin.zsh | 634 ++++++++++++++++++------------------- 2 files changed, 527 insertions(+), 526 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index d1853195..0b757c48 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -10,213 +10,214 @@ plugins=(... git) ## Aliases -| Alias | Command | -| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| g | git | -| ga | git add | -| gaa | git add --all | -| gapa | git add --patch | -| gau | git add --update | -| gav | git add --verbose | -| gap | git apply | -| gapt | git apply --3way | -| gb | git branch | -| gba | git branch --all | -| gbd | git branch --delete | -| gbda | git branch --no-color --merged \| grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| xargs git branch --delete 2>/dev/null | -| gbD | git branch --delete --force | -| gbg | git branch -vv | grep ": gone\]" | -| gbgd | git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d | -| gbgD | git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D | -| gbl | git blame -b -w | -| gbnm | git branch --no-merged | -| gbr | git branch --remote | -| gbs | git bisect | -| gbsb | git bisect bad | -| gbsg | git bisect good | -| gbsr | git bisect reset | -| gbss | git bisect start | -| gc | git commit --verbose | -| gc! | git commit --verbose --amend | -| gcn! | git commit --verbose --no-edit --amend | -| gca | git commit --verbose --all | -| gca! | git commit --verbose --all --amend | -| gcan! | git commit --verbose --all --no-edit --amend | -| gcans! | git commit --verbose --all --signoff --no-edit --amend | -| gcam | git commit --all --message | -| gcas | git commit --all --signoff | -| gcasm | git commit --all --signoff --message | -| gcsm | git commit --signoff --message | -| gcb | git checkout -b | -| gcf | git config --list | -| gcl | git clone --recurse-submodules | -| gccd | git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)" | -| gclean | git clean --interactive -d | -| gpristine | git reset --hard && git clean -dffx | -| gcm | git checkout $(git_main_branch) | -| gcd | git checkout $(git_develop_branch) | -| gcmsg | git commit --message | -| gco | git checkout | -| gcor | git checkout --recurse-submodules | -| gcount | git shortlog --summary -n | -| gcp | git cherry-pick | -| gcpa | git cherry-pick --abort | -| gcpc | git cherry-pick --continue | -| gcs | git commit -S | -| gcss | git commit -S -s | -| gcssm | git commit -S -s -m | -| gd | git diff | -| gdca | git diff --cached | -| gdcw | git diff --cached --word-diff | -| gdct | git describe --tags $(git rev-list --tags --max-count=1) | -| gds | git diff --staged | -| gdt | git diff-tree --no-commit-id --name-only -r | -| gdnolock | git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock" | -| gdup | git diff @{upstream} | -| gdv | git diff -w $@ \| view - | -| gdw | git diff --word-diff | -| gf | git fetch | -| gfa | git fetch --all --prune | -| gfg | git ls-files \| grep | -| gfo | git fetch origin | -| gg | git gui citool | -| gga | git gui citool --amend | -| ggf | git push --force origin $(current_branch) | -| ggfl | git push --force-with-lease origin $(current_branch) | -| ggl | git pull origin $(current_branch) | -| ggp | git push origin $(current_branch) | -| ggpnp | ggl && ggp | -| ggpull | git pull origin "$(git_current_branch)" | -| ggpur | ggu | -| ggpush | git push origin "$(git_current_branch)" | -| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | -| ggu | git pull --rebase origin $(current_branch) | -| gpsup | git push --set-upstream origin $(git_current_branch) | -| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes (git version >= 2.30) | -| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease (git version < 2.30) | -| ghh | git help | -| gignore | git update-index --assume-unchanged | -| gignored | git ls-files -v \| grep "^[[:lower:]]" | -| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk | -| gk | gitk --all --branches &! | -| gke | gitk --all $(git log --walk-reflogs --pretty=%h) &! | -| gl | git pull | -| glg | git log --stat | -| glgp | git log --stat --patch | -| glgg | git log --graph | -| glgga | git log --graph --decorate --all | -| glgm | git log --graph --max-count=10 | -| glo | git log --oneline --decorate | -| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' | -| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat | -| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' | -| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short | -| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all | -| glog | git log --oneline --decorate --graph | -| gloga | git log --oneline --decorate --graph --all | -| glp | git log --pretty=\ | -| gm | git merge | -| gms | git merge --squash | -| gmom | git merge origin/$(git_main_branch) | -| gmtl | git mergetool --no-prompt | -| gmtlvim | git mergetool --no-prompt --tool=vimdiff | -| gmum | git merge upstream/$(git_main_branch) | -| gma | git merge --abort | -| gp | git push | -| gpd | git push --dry-run | -| gpf | git push --force-with-lease --force-if-includes (git version >= 2.30) | -| gpf | git push --force-with-lease (git version < 2.30) | -| gpf! | git push --force | -| gpoat | git push origin --all && git push origin --tags | -| gpod | git push origin --delete | -| gpr | git pull --rebase | -| gpu | git push upstream | -| gpv | git push --verbose | -| gr | git remote | -| gra | git remote add | -| grb | git rebase | -| grba | git rebase --abort | -| grbc | git rebase --continue | -| grbd | git rebase $(git_develop_branch) | -| grbi | git rebase --interactive | -| grbm | git rebase $(git_main_branch) | -| grbom | git rebase origin/$(git_main_branch) | -| grbo | git rebase --onto | -| grbs | git rebase --skip | -| grev | git revert | -| grh | git reset | -| grhh | git reset --hard | -| groh | git reset origin/$(git_current_branch) --hard | -| grm | git rm | -| grmc | git rm --cached | -| grmv | git remote rename | -| grrm | git remote remove | -| grs | git restore | -| grset | git remote set-url | -| grss | git restore --source | -| grst | git restore --staged | -| grt | cd "$(git rev-parse --show-toplevel \|\| echo .)" | -| gru | git reset -- | -| grup | git remote update | -| grv | git remote --verbose | -| gsb | git status --short -b | -| gsd | git svn dcommit | -| gsh | git show | -| gsi | git submodule init | -| gsps | git show --pretty=short --show-signature | -| gsr | git svn rebase | -| gss | git status --short | -| gst | git status | -| gsta | git stash push (git version >= 2.13) | -| gsta | git stash save (git version < 2.13) | -| gstaa | git stash apply | -| gstc | git stash clear | -| gstd | git stash drop | -| gstl | git stash list | -| gstp | git stash pop | -| gsts | git stash show --text | -| gstu | git stash --include-untracked | -| gstall | git stash --all | -| gsu | git submodule update | -| gsw | git switch | -| gswc | git switch -c | -| gswm | git switch $(git_main_branch) | -| gswd | git switch $(git_develop_branch) | -| gts | git tag -s | -| gtv | git tag \| sort -V | -| gtl | gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl | -| gunignore | git update-index --no-assume-unchanged | -| gunwip | git rev-list --max-count=1 --format="%s" HEAD \| grep -q "\-\-wip\-\-" && git reset HEAD~1 | -| gup | git pull --rebase | -| gupv | git pull --rebase --verbose | -| gupa | git pull --rebase --autostash | -| gupav | git pull --rebase --autostash --verbose | -| gupom | git pull --rebase origin $(git_main_branch) | -| gupomi | git pull --rebase=interactive origin $(git_main_branch) | -| glum | git pull upstream $(git_main_branch) | -| gluc | git pull upstream $(git_current_branch) | -| gwch | git whatchanged -p --abbrev-commit --pretty=medium | -| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]" | -| gam | git am | -| gamc | git am --continue | -| gams | git am --skip | -| gama | git am --abort | -| gamscp | git am --show-current-patch | -| gwt | git worktree | -| gwtls | git worktree list | -| gwtmv | git worktree move | -| gwtrm | git worktree remove | +| Alias | Command | +| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| grt | cd "$(git rev-parse --show-toplevel || echo .)" | +| ggpnp | ggl && ggp | +| ggpur | ggu | +| g | git | +| ga | git add | +| gaa | git add --all | +| gapa | git add --patch | +| gau | git add --update | +| gav | git add --verbose | +| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]" | +| gam | git am | +| gama | git am --abort | +| gamc | git am --continue | +| gamscp | git am --show-current-patch | +| gams | git am --skip | +| gap | git apply | +| gapt | git apply --3way | +| gbs | git bisect | +| gbsb | git bisect bad | +| gbsg | git bisect good | +| gbsr | git bisect reset | +| gbss | git bisect start | +| gbl | git blame -b -w | +| gb | git branch | +| gba | git branch --all | +| gbd | git branch --delete | +| gbD | git branch --delete --force | +| gbda | git branch --no-color --merged | grep -vE "^([+]|\s($(git_main_branch)|$(git_develop_branch))\s\*$)" | xargs git branch --delete 2>/dev/null | +| gbgd | git branch --no-color -vv | +| gbgD | git branch --no-color -vv | +| gbnm | git branch --no-merged | +| gbr | git branch --remote | +| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | +| gbg | git branch -vv | +| gco | git checkout | +| gcor | git checkout --recurse-submodules | +| gcb | git checkout -b | +| gcd | git checkout $(git_develop_branch) | +| gcm | git checkout $(git_main_branch) | +| gcp | git cherry-pick | +| gcpa | git cherry-pick --abort | +| gcpc | git cherry-pick --continue | +| gclean | git clean --interactive -d | +| gcl | git clone --recurse-submodules | +| gccd | git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)" | +| gcam | git commit --all --message | +| gcas | git commit --all --signoff | +| gcasm | git commit --all --signoff --message | +| gcmsg | git commit --message | +| gcsm | git commit --signoff --message | +| gc | git commit --verbose | +| gca | git commit --verbose --all | +| gca! | git commit --verbose --all --amend | +| gcan! | git commit --verbose --all --no-edit --amend | +| gcans! | git commit --verbose --all --signoff --no-edit --amend | +| gc! | git commit --verbose --amend | +| gcn! | git commit --verbose --no-edit --amend | +| gcs | git commit -S | +| gcss | git commit -S -s | +| gcssm | git commit -S -s -m | +| gcf | git config --list | +| gdct | git describe --tags $(git rev-list --tags --max-count=1) | +| gd | git diff | +| gdca | git diff --cached | +| gdcw | git diff --cached --word-diff | +| gds | git diff --staged | +| gdw | git diff --word-diff | +| gdv | git diff -w $@ | view - | +| gdup | git diff @{upstream} | +| gdnolock | git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock" | +| gdt | git diff-tree --no-commit-id --name-only -r | +| gf | git fetch | +| gfa | git fetch --all --prune | +| gfo | git fetch origin | +| gg | git gui citool | +| gga | git gui citool --amend | +| ghh | git help | +| glgg | git log --graph | +| glgga | git log --graph --decorate --all | +| glgm | git log --graph --max-count=10 | +| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' | +| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short | +| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' | +| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all | +| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat | +| glo | git log --oneline --decorate | +| glog | git log --oneline --decorate --graph | +| gloga | git log --oneline --decorate --graph --all | +| glp | git log --pretty=\ | +| glg | git log --stat | +| glgp | git log --stat --patch | +| gignored | git ls-files -v | grep "^[[:lower:]]" | +| gfg | git ls-files | grep | +| gm | git merge | +| gma | git merge --abort | +| gms | git merge --squash | +| gmom | git merge origin/$(git_main_branch) | +| gmum | git merge upstream/$(git_main_branch) | +| gmtl | git mergetool --no-prompt | +| gmtlvim | git mergetool --no-prompt --tool=vimdiff | +| gl | git pull | +| gpr | git pull --rebase | +| gup | git pull --rebase | +| gupa | git pull --rebase --autostash | +| gupav | git pull --rebase --autostash --verbose | +| gupv | git pull --rebase --verbose | +| ggu | git pull --rebase origin $(current_branch) | +| gupom | git pull --rebase origin $(git_main_branch) | +| gupomi | git pull --rebase=interactive origin $(git_main_branch) | +| ggpull | git pull origin "$(git_current_branch)" | +| ggl | git pull origin $(current_branch) | +| gluc | git pull upstream $(git_current_branch) | +| glum | git pull upstream $(git_main_branch) | +| gp | git push | +| gpd | git push --dry-run | +| gpf! | git push --force | +| ggf | git push --force origin $(current_branch) | +| gpf | git push --force-with-lease --force-if-includes (git version >= 2.30) | +| gpf | git push --force-with-lease (git version < 2.30) | +| ggfl | git push --force-with-lease origin $(current_branch) | +| gpsup | git push --set-upstream origin $(git_current_branch) | +| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes (git version >= 2.30) | +| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease (git version < 2.30) | +| gpv | git push --verbose | +| gpoat | git push origin --all && git push origin --tags | +| gpod | git push origin --delete | +| ggpush | git push origin "$(git_current_branch)" | +| ggp | git push origin $(current_branch) | +| gpu | git push upstream | +| grb | git rebase | +| grba | git rebase --abort | +| grbc | git rebase --continue | +| grbi | git rebase --interactive | +| grbo | git rebase --onto | +| grbs | git rebase --skip | +| grbd | git rebase $(git_develop_branch) | +| grbm | git rebase $(git_main_branch) | +| grbom | git rebase origin/$(git_main_branch) | +| gr | git remote | +| grv | git remote --verbose | +| gra | git remote add | +| grrm | git remote remove | +| grmv | git remote rename | +| grset | git remote set-url | +| grup | git remote update | +| grh | git reset | +| gru | git reset -- | +| grhh | git reset --hard | +| gpristine | git reset --hard && git clean -dffx | +| groh | git reset origin/$(git_current_branch) --hard | +| grs | git restore | +| grss | git restore --source | +| grst | git restore --staged | +| gunwip | git rev-list --max-count=1 --format="%s" HEAD | grep -q "--wip--" && git reset HEAD~1 | +| grev | git revert | +| grm | git rm | +| grmc | git rm --cached | +| gcount | git shortlog --summary -n | +| gsh | git show | +| gsps | git show --pretty=short --show-signature | +| gstall | git stash --all | +| gstu | git stash --include-untracked | +| gstaa | git stash apply | +| gstc | git stash clear | +| gstd | git stash drop | +| gstl | git stash list | +| gstp | git stash pop | +| gsta | git stash push (git version >= 2.13) | +| gsta | git stash save (git version < 2.13) | +| gsts | git stash show --text | +| gst | git status | +| gss | git status --short | +| gsb | git status --short -b | +| gsi | git submodule init | +| gsu | git submodule update | +| gsd | git svn dcommit | +| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk | +| gsr | git svn rebase | +| gsw | git switch | +| gswc | git switch -c | +| gswd | git switch $(git_develop_branch) | +| gswm | git switch $(git_main_branch) | +| gts | git tag -s | +| gtv | git tag | sort -V | +| gignore | git update-index --assume-unchanged | +| gunignore | git update-index --no-assume-unchanged | +| gwch | git whatchanged -p --abbrev-commit --pretty=medium | +| gwt | git worktree | +| gwtls | git worktree list | +| gwtmv | git worktree move | +| gwtrm | git worktree remove | +| gk | gitk --all --branches &! | +| gke | gitk --all $(git log --walk-reflogs --pretty=%h) &! | +| gtl | gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl | ### Main branch preference -Following the recent push for removing racially-charged words from our technical vocabulary, the git plugin favors using -a branch name other than `master`. In this case, we favor the shorter, neutral and descriptive term `main`. This means -that any aliases and functions that previously used `master`, will use `main` if that branch exists. We do this via the -function `git_main_branch`. +Following the recent push for removing racially-charged words from our technical vocabulary, the git plugin +favors using a branch name other than `master`. In this case, we favor the shorter, neutral and descriptive +term `main`. This means that any aliases and functions that previously used `master`, will use `main` if that +branch exists. We do this via the function `git_main_branch`. ### Deprecated aliases -These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, receive further support. +These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, +receive further support. | Alias | Command | Modification | | :----- | :----------------------------------------------------- | :----------------------------------------------------- | @@ -238,23 +239,27 @@ These are aliases that have been removed, renamed, or otherwise modified in a wa | Command | Description | | :--------------------- | :------------------------------------------------------------------------------------------------------- | -| `grename ` | Rename `old` branch to `new`, including in origin remote | | current_branch | Return the name of the current branch | -| git_current_user_name | Returns the `user.name` config value | -| git_current_user_email | Returns the `user.email` config value | -| git_main_branch | Returns the name of the main branch: `main` if it exists, `master` otherwise | +| git_current_user_email | Returns the `user.email` config value (lives in lib/git.zsh) | +| git_current_user_name | Returns the `user.name` config value (lives in lib/git.zsh) | | git_develop_branch | Returns the name of the develop branch: `dev`, `devel`, `development` if they exist, `develop` otherwise | +| git_main_branch | Returns the name of the main branch: `main` if it exists, `master` otherwise | +| grename \ \ | Rename `old` branch to `new`, including in origin remote | ### Work in Progress (WIP) -These features allow to pause a branch development and switch to another one (_"Work in Progress"_, or wip). When you want to go back to work, just unwip it. +These features allow to pause a branch development and switch to another one (_"Work in Progress"_, or wip). +When you want to go back to work, just unwip it. | Command | Description | | :--------------- | :---------------------------------------------- | -| work_in_progress | Echoes a warning if the current branch is a wip | | gwip | Commit wip branch | | gunwip | Uncommit wip branch | | gunwipall | Uncommit all recent `--wip--` commits | +| work_in_progress | Echoes a warning if the current branch is a wip | + +Note that `gwip` and `gunwip` are effectivly alias, but are also documented here to group all related WIP +features. ### Deprecated functions diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index d04edea5..b321ce7b 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -3,7 +3,9 @@ autoload -Uz is-at-least git_version="${${(As: :)$(git version 2>/dev/null)}[3]}" # -# Functions +# Functions Current +# (sorted alphabetically by function name) +# (order should follow README) # # The name of the current branch @@ -14,42 +16,6 @@ function current_branch() { git_current_branch } -# Pretty log messages -function _git_log_prettily(){ - if ! [ -z $1 ]; then - git log --pretty=$1 - fi -} -compdef _git _git_log_prettily=git-log - -# Warn if the current branch is a WIP -function work_in_progress() { - command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!" -} - -# Similar to `gunwip` but recursive "Unwips" all recent `--wip--` commits not just the last one -function gunwipall() { - local _commit=$(git log --grep='--wip--' --invert-grep --max-count=1 --format=format:%H) - - # Check if a commit without "--wip--" was found and it's not the same as HEAD - if [[ "$_commit" != "$(git rev-parse HEAD)" ]]; then - git reset $_commit || return 1 - fi -} - -# Check if main exists and use instead of master -function git_main_branch() { - command git rev-parse --git-dir &>/dev/null || return - local ref - for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default}; do - if command git show-ref -q --verify $ref; then - echo ${ref:t} - return - fi - done - echo master -} - # Check for develop and similarly named branches function git_develop_branch() { command git rev-parse --git-dir &>/dev/null || return @@ -63,289 +29,18 @@ function git_develop_branch() { echo develop } -# -# Aliases -# (sorted alphabetically) -# - -alias g='git' - -alias ga='git add' -alias gaa='git add --all' -alias gapa='git add --patch' -alias gau='git add --update' -alias gav='git add --verbose' -alias gap='git apply' -alias gapt='git apply --3way' - -alias gb='git branch' -alias gba='git branch --all' -alias gbd='git branch --delete' -alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' -alias gbD='git branch --delete --force' -alias gbg='git branch -vv | grep ": gone\]"' -alias gbgd='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' -alias gbgD='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' -alias gbl='git blame -b -w' -alias gbnm='git branch --no-merged' -alias gbr='git branch --remote' -alias gbs='git bisect' -alias gbsb='git bisect bad' -alias gbsg='git bisect good' -alias gbsr='git bisect reset' -alias gbss='git bisect start' - -alias gc='git commit --verbose' -alias gc!='git commit --verbose --amend' -alias gcn!='git commit --verbose --no-edit --amend' -alias gca='git commit --verbose --all' -alias gca!='git commit --verbose --all --amend' -alias gcan!='git commit --verbose --all --no-edit --amend' -alias gcans!='git commit --verbose --all --signoff --no-edit --amend' -alias gcam='git commit --all --message' -alias gcsm='git commit --signoff --message' -alias gcas='git commit --all --signoff' -alias gcasm='git commit --all --signoff --message' -alias gcb='git checkout -b' -alias gcf='git config --list' - -function gccd() { - command git clone --recurse-submodules "$@" - [[ -d "$_" ]] && cd "$_" || cd "${${_:t}%.git}" +# Check if main exists and use instead of master +function git_main_branch() { + command git rev-parse --git-dir &>/dev/null || return + local ref + for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default}; do + if command git show-ref -q --verify $ref; then + echo ${ref:t} + return + fi + done + echo master } -compdef _git gccd=git-clone - -alias gcl='git clone --recurse-submodules' -alias gclean='git clean --interactive -d' -alias gpristine='git reset --hard && git clean --force -dfx' -alias gcm='git checkout $(git_main_branch)' -alias gcd='git checkout $(git_develop_branch)' -alias gcmsg='git commit --message' -alias gco='git checkout' -alias gcor='git checkout --recurse-submodules' -alias gcount='git shortlog --summary --numbered' -alias gcp='git cherry-pick' -alias gcpa='git cherry-pick --abort' -alias gcpc='git cherry-pick --continue' -alias gcs='git commit --gpg-sign' -alias gcss='git commit --gpg-sign --signoff' -alias gcssm='git commit --gpg-sign --signoff --message' - -alias gd='git diff' -alias gdca='git diff --cached' -alias gdcw='git diff --cached --word-diff' -alias gdct='git describe --tags $(git rev-list --tags --max-count=1)' -alias gds='git diff --staged' -alias gdt='git diff-tree --no-commit-id --name-only -r' -alias gdup='git diff @{upstream}' -alias gdw='git diff --word-diff' - -function gdnolock() { - git diff "$@" ":(exclude)package-lock.json" ":(exclude)*.lock" -} -compdef _git gdnolock=git-diff - -function gdv() { git diff -w "$@" | view - } -compdef _git gdv=git-diff - -alias gf='git fetch' -# --jobs= was added in git 2.8 -is-at-least 2.8 "$git_version" \ - && alias gfa='git fetch --all --prune --jobs=10' \ - || alias gfa='git fetch --all --prune' -alias gfo='git fetch origin' - -alias gfg='git ls-files | grep' - -alias gg='git gui citool' -alias gga='git gui citool --amend' - -function ggf() { - [[ "$#" != 1 ]] && local b="$(git_current_branch)" - git push --force origin "${b:=$1}" -} -compdef _git ggf=git-checkout -function ggfl() { - [[ "$#" != 1 ]] && local b="$(git_current_branch)" - git push --force-with-lease origin "${b:=$1}" -} -compdef _git ggfl=git-checkout - -function ggl() { - if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then - git pull origin "${*}" - else - [[ "$#" == 0 ]] && local b="$(git_current_branch)" - git pull origin "${b:=$1}" - fi -} -compdef _git ggl=git-checkout - -function ggp() { - if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then - git push origin "${*}" - else - [[ "$#" == 0 ]] && local b="$(git_current_branch)" - git push origin "${b:=$1}" - fi -} -compdef _git ggp=git-checkout - -function ggpnp() { - if [[ "$#" == 0 ]]; then - ggl && ggp - else - ggl "${*}" && ggp "${*}" - fi -} -compdef _git ggpnp=git-checkout - -function ggu() { - [[ "$#" != 1 ]] && local b="$(git_current_branch)" - git pull --rebase origin "${b:=$1}" -} -compdef _git ggu=git-checkout - -alias ggpur='ggu' -alias ggpull='git pull origin "$(git_current_branch)"' -alias ggpush='git push origin "$(git_current_branch)"' - -alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' -alias gpsup='git push --set-upstream origin $(git_current_branch)' -is-at-least 2.30 "$git_version" \ - && alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes' \ - || alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease' - -alias ghh='git help' - -alias gignore='git update-index --assume-unchanged' -alias gignored='git ls-files -v | grep "^[[:lower:]]"' -alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk' - -alias gk='\gitk --all --branches &!' -alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!' - -alias gl='git pull' -alias glg='git log --stat' -alias glgp='git log --stat --patch' -alias glgg='git log --graph' -alias glgga='git log --graph --decorate --all' -alias glgm='git log --graph --max-count=10' -alias glo='git log --oneline --decorate' -alias glol="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'" -alias glols="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat" -alias glod="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'" -alias glods="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short" -alias glola="git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all" -alias glog='git log --oneline --decorate --graph' -alias gloga='git log --oneline --decorate --graph --all' -alias glp="_git_log_prettily" - -alias gm='git merge' -alias gmom='git merge origin/$(git_main_branch)' -alias gmtl='git mergetool --no-prompt' -alias gmtlvim='git mergetool --no-prompt --tool=vimdiff' -alias gmum='git merge upstream/$(git_main_branch)' -alias gma='git merge --abort' -alias gms="git merge --squash" - -alias gp='git push' -alias gpd='git push --dry-run' -is-at-least 2.30 "$git_version" \ - && alias gpf='git push --force-with-lease --force-if-includes' \ - || alias gpf='git push --force-with-lease' -alias gpf!='git push --force' -alias gpoat='git push origin --all && git push origin --tags' -alias gpod='git push origin --delete' -alias gpr='git pull --rebase' -alias gpu='git push upstream' -alias gpv='git push --verbose' - -alias gr='git remote' -alias gra='git remote add' -alias grb='git rebase' -alias grba='git rebase --abort' -alias grbc='git rebase --continue' -alias grbd='git rebase $(git_develop_branch)' -alias grbi='git rebase --interactive' -alias grbm='git rebase $(git_main_branch)' -alias grbom='git rebase origin/$(git_main_branch)' -alias grbo='git rebase --onto' -alias grbs='git rebase --skip' -alias grev='git revert' -alias grh='git reset' -alias grhh='git reset --hard' -alias groh='git reset origin/$(git_current_branch) --hard' -alias grm='git rm' -alias grmc='git rm --cached' -alias grmv='git remote rename' -alias grrm='git remote remove' -alias grs='git restore' -alias grset='git remote set-url' -alias grss='git restore --source' -alias grst='git restore --staged' -alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' -alias gru='git reset --' -alias grup='git remote update' -alias grv='git remote --verbose' - -alias gsb='git status --short --branch' -alias gsd='git svn dcommit' -alias gsh='git show' -alias gsi='git submodule init' -alias gsps='git show --pretty=short --show-signature' -alias gsr='git svn rebase' -alias gss='git status --short' -alias gst='git status' - -# use the default stash push on git 2.13 and newer -is-at-least 2.13 "$git_version" \ - && alias gsta='git stash push' \ - || alias gsta='git stash save' - -alias gstaa='git stash apply' -alias gstc='git stash clear' -alias gstd='git stash drop' -alias gstl='git stash list' -alias gstp='git stash pop' -alias gsts='git stash show --text' -alias gstu='gsta --include-untracked' -alias gstall='git stash --all' -alias gsu='git submodule update' -alias gsw='git switch' -alias gswc='git switch --create' -alias gswm='git switch $(git_main_branch)' -alias gswd='git switch $(git_develop_branch)' - -alias gts='git tag --sign' -alias gtv='git tag | sort -V' -alias gtl='gtl(){ git tag --sort=-v:refname -n --list "${1}*" }; noglob gtl' - -alias gunignore='git update-index --no-assume-unchanged' -alias gunwip='git rev-list --max-count=1 --format="%s" HEAD | grep -q "\--wip--" && git reset HEAD~1' -alias gup='git pull --rebase' -alias gupv='git pull --rebase --verbose' -alias gupa='git pull --rebase --autostash' -alias gupav='git pull --rebase --autostash --verbose' -alias gupom='git pull --rebase origin $(git_main_branch)' -alias gupomi='git pull --rebase=interactive origin $(git_main_branch)' -alias glum='git pull upstream $(git_main_branch)' -alias gluc='git pull upstream $(git_current_branch)' - -alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' -alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"' - -alias gwt='git worktree' -alias gwta='git worktree add' -alias gwtls='git worktree list' -alias gwtmv='git worktree move' -alias gwtrm='git worktree remove' - -alias gam='git am' -alias gamc='git am --continue' -alias gams='git am --skip' -alias gama='git am --abort' -alias gamscp='git am --show-current-patch' function grename() { if [[ -z "$1" || -z "$2" ]]; then @@ -361,4 +56,305 @@ function grename() { fi } +# +# Functions Work in Progress (WIP) +# (sorted alphabetically by function name) +# (order should follow README) +# + +# Similar to `gunwip` but recursive "Unwips" all recent `--wip--` commits not just the last one +function gunwipall() { + local _commit=$(git log --grep='--wip--' --invert-grep --max-count=1 --format=format:%H) + + # Check if a commit without "--wip--" was found and it's not the same as HEAD + if [[ "$_commit" != "$(git rev-parse HEAD)" ]]; then + git reset $_commit || return 1 + fi +} + +# Warn if the current branch is a WIP +function work_in_progress() { + command git -c log.showSignature=false log -n 1 2>/dev/null | grep -q -- "--wip--" && echo "WIP!!" +} + +# +# Aliases +# (sorted alphabetically by command) +# (order should follow README) +# (in some cases force the alisas order to match README, like for example gke and gk) +# + +alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' + +function ggpnp() { + if [[ "$#" == 0 ]]; then + ggl && ggp + else + ggl "${*}" && ggp "${*}" + fi +} +compdef _git ggpnp=git-checkout + +alias ggpur='ggu' +alias g='git' +alias ga='git add' +alias gaa='git add --all' +alias gapa='git add --patch' +alias gau='git add --update' +alias gav='git add --verbose' +alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"' +alias gam='git am' +alias gama='git am --abort' +alias gamc='git am --continue' +alias gamscp='git am --show-current-patch' +alias gams='git am --skip' +alias gap='git apply' +alias gapt='git apply --3way' +alias gbs='git bisect' +alias gbsb='git bisect bad' +alias gbsg='git bisect good' +alias gbsr='git bisect reset' +alias gbss='git bisect start' +alias gbl='git blame -b -w' +alias gb='git branch' +alias gba='git branch --all' +alias gbd='git branch --delete' +alias gbD='git branch --delete --force' +alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' +alias gbgd='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' +alias gbgD='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' +alias gbnm='git branch --no-merged' +alias gbr='git branch --remote' +alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' +alias gbg='git branch -vv | grep ": gone\]"' +alias gco='git checkout' +alias gcor='git checkout --recurse-submodules' +alias gcb='git checkout -b' +alias gcd='git checkout $(git_develop_branch)' +alias gcm='git checkout $(git_main_branch)' +alias gcp='git cherry-pick' +alias gcpa='git cherry-pick --abort' +alias gcpc='git cherry-pick --continue' +alias gclean='git clean --interactive -d' +alias gcl='git clone --recurse-submodules' + +function gccd() { + command git clone --recurse-submodules "$@" + [[ -d "$_" ]] && cd "$_" || cd "${${_:t}%.git}" +} +compdef _git gccd=git-clone + +alias gcam='git commit --all --message' +alias gcas='git commit --all --signoff' +alias gcasm='git commit --all --signoff --message' +alias gcs='git commit --gpg-sign' +alias gcss='git commit --gpg-sign --signoff' +alias gcssm='git commit --gpg-sign --signoff --message' +alias gcmsg='git commit --message' +alias gcsm='git commit --signoff --message' +alias gc='git commit --verbose' +alias gca='git commit --verbose --all' +alias gca!='git commit --verbose --all --amend' +alias gcan!='git commit --verbose --all --no-edit --amend' +alias gcans!='git commit --verbose --all --signoff --no-edit --amend' +alias gc!='git commit --verbose --amend' +alias gcn!='git commit --verbose --no-edit --amend' +alias gcf='git config --list' +alias gdct='git describe --tags $(git rev-list --tags --max-count=1)' +alias gd='git diff' +alias gdca='git diff --cached' +alias gdcw='git diff --cached --word-diff' +alias gds='git diff --staged' +alias gdw='git diff --word-diff' + +function gdv() { git diff -w "$@" | view - } +compdef _git gdv=git-diff + +alias gdup='git diff @{upstream}' + +function gdnolock() { + git diff "$@" ":(exclude)package-lock.json" ":(exclude)*.lock" +} +compdef _git gdnolock=git-diff + +alias gdt='git diff-tree --no-commit-id --name-only -r' +alias gf='git fetch' +# --jobs= was added in git 2.8 +is-at-least 2.8 "$git_version" \ + && alias gfa='git fetch --all --prune --jobs=10' \ + || alias gfa='git fetch --all --prune' +alias gfo='git fetch origin' +alias gg='git gui citool' +alias gga='git gui citool --amend' +alias ghh='git help' +alias glgg='git log --graph' +alias glgga='git log --graph --decorate --all' +alias glgm='git log --graph --max-count=10' +alias glods='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset" --date=short' +alias glod='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset"' +alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all' +alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat' +alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"' +alias glo='git log --oneline --decorate' +alias glog='git log --oneline --decorate --graph' +alias gloga='git log --oneline --decorate --graph --all' + +# Pretty log messages +function _git_log_prettily(){ + if ! [ -z $1 ]; then + git log --pretty=$1 + fi +} +compdef _git _git_log_prettily=git-log + +alias glp='_git_log_prettily' +alias glg='git log --stat' +alias glgp='git log --stat --patch' +alias gignored='git ls-files -v | grep "^[[:lower:]]"' +alias gfg='git ls-files | grep' +alias gm='git merge' +alias gma='git merge --abort' +alias gms="git merge --squash" +alias gmom='git merge origin/$(git_main_branch)' +alias gmum='git merge upstream/$(git_main_branch)' +alias gmtl='git mergetool --no-prompt' +alias gmtlvim='git mergetool --no-prompt --tool=vimdiff' +alias gl='git pull' +alias gpr='git pull --rebase' +alias gup='git pull --rebase' +alias gupa='git pull --rebase --autostash' +alias gupav='git pull --rebase --autostash --verbose' +alias gupv='git pull --rebase --verbose' + +function ggu() { + [[ "$#" != 1 ]] && local b="$(git_current_branch)" + git pull --rebase origin "${b:=$1}" +} +compdef _git ggu=git-checkout + +alias gupom='git pull --rebase origin $(git_main_branch)' +alias gupomi='git pull --rebase=interactive origin $(git_main_branch)' +alias ggpull='git pull origin "$(git_current_branch)"' + +function ggl() { + if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then + git pull origin "${*}" + else + [[ "$#" == 0 ]] && local b="$(git_current_branch)" + git pull origin "${b:=$1}" + fi +} +compdef _git ggl=git-checkout + +alias gluc='git pull upstream $(git_current_branch)' +alias glum='git pull upstream $(git_main_branch)' +alias gp='git push' +alias gpd='git push --dry-run' + +function ggf() { + [[ "$#" != 1 ]] && local b="$(git_current_branch)" + git push --force origin "${b:=$1}" +} +compdef _git ggf=git-checkout + +alias gpf!='git push --force' +is-at-least 2.30 "$git_version" \ + && alias gpf='git push --force-with-lease --force-if-includes' \ + || alias gpf='git push --force-with-lease' + +function ggfl() { + [[ "$#" != 1 ]] && local b="$(git_current_branch)" + git push --force-with-lease origin "${b:=$1}" +} +compdef _git ggfl=git-checkout + +alias gpsup='git push --set-upstream origin $(git_current_branch)' +is-at-least 2.30 "$git_version" \ + && alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes' \ + || alias gpsupf='git push --set-upstream origin $(git_current_branch) --force-with-lease' +alias gpv='git push --verbose' +alias gpoat='git push origin --all && git push origin --tags' +alias gpod='git push origin --delete' +alias ggpush='git push origin "$(git_current_branch)"' + +function ggp() { + if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then + git push origin "${*}" + else + [[ "$#" == 0 ]] && local b="$(git_current_branch)" + git push origin "${b:=$1}" + fi +} +compdef _git ggp=git-checkout + +alias gpu='git push upstream' +alias grb='git rebase' +alias grba='git rebase --abort' +alias grbc='git rebase --continue' +alias grbi='git rebase --interactive' +alias grbo='git rebase --onto' +alias grbs='git rebase --skip' +alias grbd='git rebase $(git_develop_branch)' +alias grbm='git rebase $(git_main_branch)' +alias grbom='git rebase origin/$(git_main_branch)' +alias gr='git remote' +alias grv='git remote --verbose' +alias gra='git remote add' +alias grrm='git remote remove' +alias grmv='git remote rename' +alias grset='git remote set-url' +alias grup='git remote update' +alias grh='git reset' +alias gru='git reset --' +alias grhh='git reset --hard' +alias gpristine='git reset --hard && git clean --force -dfx' +alias groh='git reset origin/$(git_current_branch) --hard' +alias grs='git restore' +alias grss='git restore --source' +alias grst='git restore --staged' +alias gunwip='git rev-list --max-count=1 --format="%s" HEAD | grep -q "\--wip--" && git reset HEAD~1' +alias grev='git revert' +alias grm='git rm' +alias grmc='git rm --cached' +alias gcount='git shortlog --summary --numbered' +alias gsh='git show' +alias gsps='git show --pretty=short --show-signature' +alias gstall='git stash --all' +alias gstaa='git stash apply' +alias gstc='git stash clear' +alias gstd='git stash drop' +alias gstl='git stash list' +alias gstp='git stash pop' +# use the default stash push on git 2.13 and newer +is-at-least 2.13 "$git_version" \ + && alias gsta='git stash push' \ + || alias gsta='git stash save' +alias gsts='git stash show --text' +alias gst='git status' +alias gss='git status --short' +alias gsb='git status --short --branch' +alias gsi='git submodule init' +alias gsu='git submodule update' +alias gsd='git svn dcommit' +alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk' +alias gsr='git svn rebase' +alias gsw='git switch' +alias gswc='git switch --create' +alias gswd='git switch $(git_develop_branch)' +alias gswm='git switch $(git_main_branch)' +alias gts='git tag --sign' +alias gtv='git tag | sort -V' +alias gignore='git update-index --assume-unchanged' +alias gunignore='git update-index --no-assume-unchanged' +alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' +alias gwt='git worktree' +alias gwta='git worktree add' +alias gwtls='git worktree list' +alias gwtmv='git worktree move' +alias gwtrm='git worktree remove' +alias gstu='gsta --include-untracked' +alias gtl='gtl(){ git tag --sort=-v:refname -n --list "${1}*" }; noglob gtl' +alias gk='\gitk --all --branches &!' +alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!' + unset git_version From c92af18c36c84cef0c785e1ae9cabc49a61a5c3a Mon Sep 17 00:00:00 2001 From: Zhang Visper Date: Thu, 24 Aug 2023 17:37:38 +0800 Subject: [PATCH 252/321] fix(git): some aliases under non-english LANG (#11855) --- plugins/git/README.md | 6 +++--- plugins/git/git.plugin.zsh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 0b757c48..c3e6dd27 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -40,12 +40,12 @@ plugins=(... git) | gbd | git branch --delete | | gbD | git branch --delete --force | | gbda | git branch --no-color --merged | grep -vE "^([+]|\s($(git_main_branch)|$(git_develop_branch))\s\*$)" | xargs git branch --delete 2>/dev/null | -| gbgd | git branch --no-color -vv | -| gbgD | git branch --no-color -vv | +| gbgd | LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d | +| gbgD | LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D | | gbnm | git branch --no-merged | | gbr | git branch --remote | | ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | -| gbg | git branch -vv | +| gbg | LANG=C git branch -vv | grep ": gone\]" | | gco | git checkout | | gcor | git checkout --recurse-submodules | | gcb | git checkout -b | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index b321ce7b..8886aac6 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -121,12 +121,12 @@ alias gba='git branch --all' alias gbd='git branch --delete' alias gbD='git branch --delete --force' alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' -alias gbgd='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' -alias gbgD='git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' +alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' +alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' alias gbnm='git branch --no-merged' alias gbr='git branch --remote' alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' -alias gbg='git branch -vv | grep ": gone\]"' +alias gbg='LANG=C git branch -vv | grep ": gone\]"' alias gco='git checkout' alias gcor='git checkout --recurse-submodules' alias gcb='git checkout -b' From 13a8e3d98aeeb4f5f0b98f92ace540067e58ba92 Mon Sep 17 00:00:00 2001 From: Roeniss Moon Date: Fri, 25 Aug 2023 00:12:59 +0900 Subject: [PATCH 253/321] feat(alias-finder): add cheaper option and apply zstyle options (#11773) --- plugins/alias-finder/.zunit.yml | 9 ++ plugins/alias-finder/README.md | 55 ++++----- plugins/alias-finder/alias-finder.plugin.zsh | 79 +++++++------ plugins/alias-finder/tests/_output/.gitkeep | 0 plugins/alias-finder/tests/_support/.gitkeep | 0 plugins/alias-finder/tests/_support/bootstrap | 2 + plugins/alias-finder/tests/test_run.sh | 107 ++++++++++++++++++ 7 files changed, 186 insertions(+), 66 deletions(-) create mode 100644 plugins/alias-finder/.zunit.yml create mode 100644 plugins/alias-finder/tests/_output/.gitkeep create mode 100644 plugins/alias-finder/tests/_support/.gitkeep create mode 100644 plugins/alias-finder/tests/_support/bootstrap create mode 100644 plugins/alias-finder/tests/test_run.sh diff --git a/plugins/alias-finder/.zunit.yml b/plugins/alias-finder/.zunit.yml new file mode 100644 index 00000000..ae65f8ef --- /dev/null +++ b/plugins/alias-finder/.zunit.yml @@ -0,0 +1,9 @@ +tap: false +directories: + tests: tests + output: tests/_output + support: tests/_support +time_limit: 0 +fail_fast: false +allow_risky: false +verbose: true diff --git a/plugins/alias-finder/README.md b/plugins/alias-finder/README.md index 409f4b65..6c87c723 100644 --- a/plugins/alias-finder/README.md +++ b/plugins/alias-finder/README.md @@ -2,45 +2,32 @@ This plugin searches the defined aliases and outputs any that match the command inputted. This makes learning new aliases easier. +## Usage + To use it, add `alias-finder` to the `plugins` array of your zshrc file: ``` plugins=(... alias-finder) ``` -## Usage -To see if there is an alias defined for the command, pass it as an argument to `alias-finder`. This can also run automatically before each command you input - add `ZSH_ALIAS_FINDER_AUTOMATIC=true` to your zshrc if you want this. +To enable it for every single command, set zstyle in your `~/.zshrc`. -## Options +```zsh +# ~/.zshrc + +zstyle ':omz:plugins:alias-finder' autoload yes # disabled by default +zstyle ':omz:plugins:alias-finder' longer yes # disabled by default +zstyle ':omz:plugins:alias-finder' exact yes # disabled by default +zstyle ':omz:plugins:alias-finder' cheaper yes # disabled by default +``` + +As you can see, options are also available with zstyle. + +### Options + +> In order to clarify, let's say `alias a=abc` has source 'abc' and destination 'a'. + +- Use `--longer` or `-l` to include aliases where the source is longer than the input (in other words, the source could contain the whole input). +- Use `--exact` or `-e` to avoid aliases where the source is shorter than the input (in other words, the source must be the same with the input). +- Use `--cheaper` or `-c` to avoid aliases where the destination is longer than the input (in other words, the destination must be the shorter than the input). -- Use `--longer` or `-l` to allow the aliases to be longer than the input (match aliases if they contain the input). -- Use `--exact` or `-e` to avoid matching aliases that are shorter than the input. -## Examples -``` -$ alias-finder "git pull" -gl='git pull' -g=git -``` -``` -$ alias-finder "web_search google oh my zsh" -google='web_search google' -``` -``` -$ alias-finder "git commit -v" -gc="git commit -v" -g=git -``` -``` -$ alias-finder -e "git commit -v" -gc='git commit -v' -``` -``` -$ alias-finder -l "git commit -v" -gc='git commit -v' -'gc!'='git commit -v --amend' -gca='git commit -v -a' -'gca!'='git commit -v -a --amend' -'gcan!'='git commit -v -a --no-edit --amend' -'gcans!'='git commit -v -a -s --no-edit --amend' -'gcn!'='git commit -v --no-edit --amend' -``` diff --git a/plugins/alias-finder/alias-finder.plugin.zsh b/plugins/alias-finder/alias-finder.plugin.zsh index caee9b5a..5fdfbc83 100644 --- a/plugins/alias-finder/alias-finder.plugin.zsh +++ b/plugins/alias-finder/alias-finder.plugin.zsh @@ -1,44 +1,59 @@ alias-finder() { - local cmd="" exact="" longer="" wordStart="" wordEnd="" multiWordEnd="" - for i in $@; do - case $i in + local cmd=" " exact="" longer="" cheaper="" wordEnd="'{0,1}$" finder="" filter="" + + # build command and options + for c in "$@"; do + case $c in + # TODO: Remove backward compatibility (other than zstyle form) + # set options if exist -e|--exact) exact=true;; -l|--longer) longer=true;; - *) - if [[ -z $cmd ]]; then - cmd=$i - else - cmd="$cmd $i" - fi - ;; + -c|--cheaper) cheaper=true;; + # concatenate cmd + *) cmd="$cmd$c " ;; esac done - cmd=$(sed 's/[].\|$(){}?+*^[]/\\&/g' <<< $cmd) # adds escaping for grep - if (( $(wc -l <<< $cmd) == 1 )); then - while [[ $cmd != "" ]]; do - if [[ $longer = true ]]; then - wordStart="'{0,1}" - else - wordEnd="$" - multiWordEnd="'$" - fi - if [[ $cmd == *" "* ]]; then - local finder="'$cmd$multiWordEnd" - else - local finder=$wordStart$cmd$wordEnd - fi - alias | grep -E "=$finder" - if [[ $exact = true || $longer = true ]]; then - break - else - cmd=$(sed -E 's/ {0,1}[^ ]*$//' <<< $cmd) # removes last word - fi - done + + zstyle -t ':omz:plugins:alias-finder' longer && longer=true + zstyle -t ':omz:plugins:alias-finder' exact && exact=true + zstyle -t ':omz:plugins:alias-finder' cheaper && cheaper=true + + # format cmd for grep + ## - replace newlines with spaces + ## - trim both ends + ## - replace multiple spaces with one space + ## - add escaping character to special characters + cmd=$(echo -n "$cmd" | tr '\n' ' ' | xargs | tr -s '[:space:]' | sed 's/[].\|$(){}?+*^[]/\\&/g') + + if [[ $longer == true ]]; then + wordEnd="" # remove wordEnd to find longer aliases fi + + # find with alias and grep, removing last word each time until no more words + while [[ $cmd != "" ]]; do + finder="'{0,1}$cmd$wordEnd" + + # make filter to find only shorter results than current cmd + if [[ $cheaper == true ]]; then + cmdLen=$(echo -n "$cmd" | wc -c) + filter="^'{0,1}.{0,$((cmdLen - 1))}=" + fi + + alias | grep -E "$filter" | grep -E "=$finder" + + if [[ $exact == true ]]; then + break # because exact case is only one + elif [[ $longer = true ]]; then + break # because above grep command already found every longer aliases during first cycle + fi + + cmd=$(sed -E 's/ {0,}[^ ]*$//' <<< "$cmd") # remove last word + done } preexec_alias-finder() { - if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then + # TODO: Remove backward compatibility (other than zstyle form) + zstyle -t ':omz:plugins:alias-finder' autoload && alias-finder $1 || if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then alias-finder $1 fi } diff --git a/plugins/alias-finder/tests/_output/.gitkeep b/plugins/alias-finder/tests/_output/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/plugins/alias-finder/tests/_support/.gitkeep b/plugins/alias-finder/tests/_support/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/plugins/alias-finder/tests/_support/bootstrap b/plugins/alias-finder/tests/_support/bootstrap new file mode 100644 index 00000000..01076611 --- /dev/null +++ b/plugins/alias-finder/tests/_support/bootstrap @@ -0,0 +1,2 @@ +#!/usr/bin/env zsh +# Write your bootstrap code here diff --git a/plugins/alias-finder/tests/test_run.sh b/plugins/alias-finder/tests/test_run.sh new file mode 100644 index 00000000..6b7abebb --- /dev/null +++ b/plugins/alias-finder/tests/test_run.sh @@ -0,0 +1,107 @@ +#!/usr/bin/env zunit + +@setup { + load ../alias-finder.plugin.zsh + + set_git_aliases() { + unalias -a # all + alias g="git" + alias gc="git commit" + alias gcv="git commit -v" + alias gcvs="git commit -v -S" + } +} + +@test 'find aliases that contain input' { + set_git_aliases + + run alias-finder "git" + + assert "${#lines[@]}" equals 1 + assert "${lines[1]}" same_as "g=git" +} + +@test 'find aliases that contain input with whitespaces at ends' { + set_git_aliases + + run alias-finder " git " + + assert "${#lines[@]}" equals 1 + assert "${lines[1]}" same_as "g=git" +} + +@test 'find aliases that contain multiple words' { + set_git_aliases + + run alias-finder "git commit -v" + + assert "${#lines[@]}" equals 3 + assert "${lines[1]}" same_as "gcv='git commit -v'" + assert "${lines[2]}" same_as "gc='git commit'" + assert "${lines[3]}" same_as "g=git" +} + +@test 'find alias that is the same with input when --exact option is set' { + set_git_aliases + + run alias-finder -e "git" + + assert "${#lines[@]}" equals 1 + assert "${lines[1]}" same_as "g=git" +} + +@test 'find alias that is the same with multiple words input when --exact option is set' { + set_git_aliases + + run alias-finder -e "git commit -v" + + assert "${#lines[@]}" equals 1 + assert "${lines[1]}" same_as "gcv='git commit -v'" +} + +@test 'find alias that is the same with or longer than input when --longer option is set' { + set_git_aliases + + run alias-finder -l "git" + + assert "${#lines[@]}" equals 4 + assert "${lines[1]}" same_as "g=git" + assert "${lines[2]}" same_as "gc='git commit'" + assert "${lines[3]}" same_as "gcv='git commit -v'" + assert "${lines[4]}" same_as "gcvs='git commit -v -S'" +} + +@test 'find alias that is the same with or longer than multiple words input when --longer option is set' { + set_git_aliases + + run alias-finder -l "git commit -v" + + assert "${#lines[@]}" equals 2 + assert "${lines[1]}" same_as "gcv='git commit -v'" + assert "${lines[2]}" same_as "gcvs='git commit -v -S'" +} + +@test 'find aliases including expensive (longer) than input' { + set_git_aliases + alias expensiveCommands="git commit" + + run alias-finder "git commit -v" + + assert "${#lines[@]}" equals 4 + assert "${lines[1]}" same_as "gcv='git commit -v'" + assert "${lines[2]}" same_as "expensiveCommands='git commit'" + assert "${lines[3]}" same_as "gc='git commit'" + assert "${lines[4]}" same_as "g=git" +} + +@test 'find aliases excluding expensive (longer) than input when --cheap option is set' { + set_git_aliases + alias expensiveCommands="git commit" + + run alias-finder -c "git commit -v" + + assert "${#lines[@]}" equals 3 + assert "${lines[1]}" same_as "gcv='git commit -v'" + assert "${lines[2]}" same_as "gc='git commit'" + assert "${lines[3]}" same_as "g=git" +} From 03a0d5bbaedc732436b5c67b166cde954817cc2f Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 24 Aug 2023 17:20:24 +0200 Subject: [PATCH 254/321] fix(clipboard): load clipboard on usage Closes #8827 --- lib/clipboard.zsh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/clipboard.zsh b/lib/clipboard.zsh index 2f3b6bca..4b37abc9 100644 --- a/lib/clipboard.zsh +++ b/lib/clipboard.zsh @@ -100,8 +100,8 @@ function detect-clipboard() { fi } -# Detect at startup. A non-zero exit here indicates that the dummy clipboards were set, -# which is not really an error. If the user calls them, they will attempt to redetect -# (for example, perhaps the user has now installed xclip) and then either print an error -# or proceed successfully. -detect-clipboard || true +function clipcopy clippaste { + unfunction clipcopy clippaste + detect-clipboard || true # let one retry + "$0" "$@" +} From 000be72dd0c2f668cd94b36c69e45dec7b06a23e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 29 Aug 2023 10:27:36 +0200 Subject: [PATCH 255/321] fix(updater): disable `nounset` to avoid warnings (#11856) --- tools/upgrade.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/upgrade.sh b/tools/upgrade.sh index 34ff3f02..f7a263d6 100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -1,4 +1,5 @@ #!/usr/bin/env zsh +set +u # disable nounset local ret=0 # exit code From bf774211916c8a9d57b2b56c7846cd0b3d91baab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1s=20Hern=C3=A1ndez?= Date: Tue, 29 Aug 2023 04:29:15 -0400 Subject: [PATCH 256/321] feat(bun): add plugin (#11859) --- plugins/bun/README.md | 20 ++++++++++++++++++++ plugins/bun/bun.plugin.zsh | 14 ++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 plugins/bun/README.md create mode 100644 plugins/bun/bun.plugin.zsh diff --git a/plugins/bun/README.md b/plugins/bun/README.md new file mode 100644 index 00000000..5a312370 --- /dev/null +++ b/plugins/bun/README.md @@ -0,0 +1,20 @@ +# Bun Plugin + +This plugin sets up completion for [Bun](https://bun.sh). + +To use it, add `bun` to the plugins array in your zshrc file: + +```zsh +plugins=(... bun) +``` + +This plugin does not add any aliases. + +## Cache + +This plugin caches the completion script and is automatically updated when the +plugin is loaded, which is usually when you start up a new terminal emulator. + +The cache is stored at: + +- `$ZSH_CACHE_DIR/completions/_bun_` completions script diff --git a/plugins/bun/bun.plugin.zsh b/plugins/bun/bun.plugin.zsh new file mode 100644 index 00000000..9924faa8 --- /dev/null +++ b/plugins/bun/bun.plugin.zsh @@ -0,0 +1,14 @@ +# If Bun is not found, don't do the rest of the script +if (( ! $+commands[bun] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `bun`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then + typeset -g -A _comps + autoload -Uz _bun + _comps[bun]=_bun +fi + +bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &| From 2ef7c73cc884163367279e4b586136e3335b1c53 Mon Sep 17 00:00:00 2001 From: t-aswath <119417646+t-aswath@users.noreply.github.com> Date: Wed, 30 Aug 2023 21:38:09 +0530 Subject: [PATCH 257/321] feat(web-search): add `youtube` alias (#11865) --- plugins/web-search/web-search.plugin.zsh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index ec176dd6..fc87a349 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -25,6 +25,7 @@ function web_search() { archive "https://web.archive.org/web/*/" scholar "https://scholar.google.com/scholar?q=" ask "https://www.ask.com/web?q=" + youtube "https://www.youtube.com/results?search_query=" ) # check whether the search engine is supported @@ -66,11 +67,12 @@ alias wolframalpha='web_search wolframalpha' alias archive='web_search archive' alias scholar='web_search scholar' alias ask='web_search ask' +alias youtube='web_search youtube' #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 youtube='web_search duckduckgo \!yt' alias map='web_search duckduckgo \!m' alias image='web_search duckduckgo \!i' alias ducky='web_search duckduckgo \!' From ccce2e1cfdf5b9680f691a402e288d9cf6ce272a Mon Sep 17 00:00:00 2001 From: James Cuzella Date: Thu, 31 Aug 2023 15:35:33 -0600 Subject: [PATCH 258/321] fix(termsupport): match all `foot`-like terminfo (#11868) --- lib/termsupport.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index 6d969503..a800e651 100644 --- a/lib/termsupport.zsh +++ b/lib/termsupport.zsh @@ -17,7 +17,7 @@ function title { : ${2=$1} case "$TERM" in - cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot|contour*) + cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot*|contour*) print -Pn "\e]2;${2:q}\a" # set window name print -Pn "\e]1;${1:q}\a" # set tab name ;; From 0dc40e88a3f5bbe2607d958b5f0bf79e9df0c118 Mon Sep 17 00:00:00 2001 From: not pua <140790944+im-notpua@users.noreply.github.com> Date: Sat, 2 Sep 2023 11:46:59 +0000 Subject: [PATCH 259/321] feat(battery): add support for OpenBSD (#11872) --- plugins/battery/battery.plugin.zsh | 44 ++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/plugins/battery/battery.plugin.zsh b/plugins/battery/battery.plugin.zsh index db5eeb93..1d3d529a 100644 --- a/plugins/battery/battery.plugin.zsh +++ b/plugins/battery/battery.plugin.zsh @@ -13,6 +13,10 @@ # Author: Avneet Singh (kalsi-avneet) # # Modified to add support for Android # ########################################### +# Author: Not Pua (im-notpua) # +# Modified to add support for OpenBSD # +########################################### + if [[ "$OSTYPE" = darwin* ]]; then function battery_is_charging() { @@ -139,6 +143,46 @@ elif [[ "$OSTYPE" = linux-android ]] && (( ${+commands[termux-battery-status]} ) echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}" fi } +elif [[ "$OSTYPE" = openbsd* ]]; then + function battery_is_charging() { + [[ $(apm -b) -eq 3 ]] + } + function battery_pct() { + apm -l + } + function battery_pct_remaining() { + if ! battery_is_charging; then + battery_pct + else + echo "External Power" + fi + } + function battery_time_remaining() { + local remaining_time + remaining_time=$(apm -m) + if [[ $remaining_time -ge 0 ]]; then + ((hour = $remaining_time / 60 )) + ((minute = $remaining_time % 60 )) + printf %02d:%02d $hour $minute + fi + } + function battery_pct_prompt() { + local battery_pct color + battery_pct=$(battery_pct_remaining) + if battery_is_charging; then + echo "∞" + else + if [[ $battery_pct -gt 50 ]]; then + color='green' + elif [[ $battery_pct -gt 20 ]]; then + color='yellow' + else + color='red' + fi + echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}" + fi + } + elif [[ "$OSTYPE" = linux* ]]; then function battery_is_charging() { if (( $+commands[acpitool] )); then From 1f56f2bdc455f2167c10fdbeca10934f5f0cbd99 Mon Sep 17 00:00:00 2001 From: Daniel Wang Date: Sun, 3 Sep 2023 23:08:19 +0800 Subject: [PATCH 260/321] fix(extract): remove extraction file extension for tar (#11873) --- plugins/extract/extract.plugin.zsh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 513950f3..88d8b074 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -30,6 +30,11 @@ EOF local file="$1" full_path="${1:A}" local extract_dir="${1:t:r}" + # Remove the .tar extension if the file name is .tar.* + if [[ $extract_dir =~ '\.tar$' ]]; then + extract_dir="${extract_dir:r}" + fi + # If there's a file or directory with the same name as the archive # add a random string to the end of the extract directory if [[ -e "$extract_dir" ]]; then From 2b1303a728afc285cc13a6710de128a050500f1e Mon Sep 17 00:00:00 2001 From: n0tr00t <106423923+0x020B@users.noreply.github.com> Date: Sun, 3 Sep 2023 15:38:32 +0000 Subject: [PATCH 261/321] feat(tmux): allow all standard config files (#11103) Closes #11803 Co-authored-by: n0tr00t <106423923+n0tr00teuorg@users.noreply.github.com> --- plugins/tmux/README.md | 26 +++++++++++++------------- plugins/tmux/tmux.plugin.zsh | 9 +++++++-- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md index 7348f77c..0f8473da 100644 --- a/plugins/tmux/README.md +++ b/plugins/tmux/README.md @@ -28,16 +28,16 @@ The plugin also supports the following: ## Configuration Variables -| Variable | Description | -| ----------------------------------- | ----------------------------------------------------------------------------- | -| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) | -| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) | -| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) | -| `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) | -| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support | -| `ZSH_TMUX_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) | -| `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `screen`) | -| `ZSH_TMUX_FIXTERM_WITH_256COLOR` | `$TERM` to use for 256-color terminals (default: `screen-256color` | -| `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`) | -| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode | -| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | +| Variable | Description | +| ----------------------------------- | ------------------------------------------------------------------------------------------- | +| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) | +| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) | +| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) | +| `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) | +| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support | +| `ZSH_TMUX_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) | +| `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `screen`) | +| `ZSH_TMUX_FIXTERM_WITH_256COLOR` | `$TERM` to use for 256-color terminals (default: `screen-256color` | +| `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) | +| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode | +| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 311c2e6a..680f7259 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -26,12 +26,17 @@ fi # systems without the proper terminfo : ${ZSH_TMUX_FIXTERM_WITH_256COLOR:=screen-256color} # Set the configuration path -: ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf} +if [[ -e $HOME/.tmux.conf ]]; then + : ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf} +elif [[ -e ${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf ]]; then + : ${ZSH_TMUX_CONFIG:=${XDG_CONFIG_HOME:-$HOME/.config}/tmux/tmux.conf} +else + : ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf} +fi # Set -u option to support unicode : ${ZSH_TMUX_UNICODE:=false} # ALIASES - alias ta='tmux attach -t' alias tad='tmux attach -d -t' alias ts='tmux new-session -s' From f694d5ecc9aa45f4c394d2e15bf2bfde96eeeda6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Pu=C5=A1k=C3=A1r?= <93598525+puskarpeter@users.noreply.github.com> Date: Mon, 4 Sep 2023 19:17:28 +0200 Subject: [PATCH 262/321] feat(qodana): add completion plugin (#11813) --- plugins/qodana/README.md | 20 ++++++++++++++++++++ plugins/qodana/qodana.plugin.zsh | 14 ++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 plugins/qodana/README.md create mode 100644 plugins/qodana/qodana.plugin.zsh diff --git a/plugins/qodana/README.md b/plugins/qodana/README.md new file mode 100644 index 00000000..0b68bdec --- /dev/null +++ b/plugins/qodana/README.md @@ -0,0 +1,20 @@ +# JetBrains Qodana CLI plugin + +This plugin adds completion for the [JetBrains Qodana CLI](https://github.com/JetBrains/qodana-cli). + +To use it, add `qodana` to the plugins array in your zshrc file: + +```zsh +plugins=(... qodana) +``` + +This plugin does not add any aliases. + +## Cache + +This plugin caches the completion script and is automatically updated when the +plugin is loaded, which is usually when you start up a new terminal emulator. + +The cache is stored at: + +- `$ZSH_CACHE_DIR/completions/_qodana` completions script diff --git a/plugins/qodana/qodana.plugin.zsh b/plugins/qodana/qodana.plugin.zsh new file mode 100644 index 00000000..2b92a805 --- /dev/null +++ b/plugins/qodana/qodana.plugin.zsh @@ -0,0 +1,14 @@ +# Autocompletion for the JetBrains Qodana CLI (qodana). +if (( ! $+commands[qodana] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `qodana`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_qodana" ]]; then + typeset -g -A _comps + autoload -Uz _qodana + _comps[qodana]=_qodana +fi + +qodana completion zsh >| "$ZSH_CACHE_DIR/completions/_qodana" &| From 1abc1d998a71efd50af30210e26bee462496e442 Mon Sep 17 00:00:00 2001 From: Oscar Lee-Vermeren Date: Mon, 4 Sep 2023 13:21:27 -0400 Subject: [PATCH 263/321] feat(git-commit): create plugin (#9646) Co-authored-by: K. Akatsuki --- plugins/git-commit/README.md | 36 ++++++++++++++++++++++++ plugins/git-commit/git-commit.plugin.zsh | 23 +++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 plugins/git-commit/README.md create mode 100644 plugins/git-commit/git-commit.plugin.zsh diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md new file mode 100644 index 00000000..dc10d8ad --- /dev/null +++ b/plugins/git-commit/README.md @@ -0,0 +1,36 @@ +# git-commit plugin + +The git-commit plugin adds several [git aliases](https://www.git-scm.com/docs/git-config#Documentation/git-config.txt-alias) for [conventional commit](https://www.conventionalcommits.org/en/v1.0.0/#summary) messages. + +To use it, add `git-commit` to the plugins array in your zshrc file: + +```zsh +plugins=(... git-commit) +``` + +## Syntax + +```zshrc +git [(-s, --scope) ""] "" +``` + +> ⚠️ Single/Double quotes around the scope and message are required + +Where `type` is one of the following: + +- `build` +- `chore` +- `ci` +- `docs` +- `feat` +- `fix` +- `perf` +- `refactor` +- `revert` +- `style` +- `test` + +## Examples + +`git style "remove trailing whitespace"` -> `git commit -m "style: remove trailing whitespace"` +`git fix -s "router" "correct redirect link"` -> `git commit -m "fix(router): correct redirect link"` diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh new file mode 100644 index 00000000..70d541f2 --- /dev/null +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -0,0 +1,23 @@ +_register() { + if ! git config --global --get-all alias.$1 &>/dev/null; then + git config --global alias.$1 '!a() { if [[ "$1" == "-s" || "$1" == "--scope" ]]; then git commit -m "'$1'(${2}): ${@:3}"; else git commit -m "'$1': ${@}"; fi }; a' + fi +} + +aliases=( + 'build' + 'chore' + 'ci' + 'docs' + 'feat' + 'fix' + 'perf' + 'refactor' + 'revert' + 'style' + 'test' +) + +for alias in "${aliases[@]}"; do + _register $alias +done \ No newline at end of file From 30f0d591881713c4efd1482511943abca5103927 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 4 Sep 2023 19:32:38 +0200 Subject: [PATCH 264/321] fix(init): exit gracefully if on non-zsh emulation mode (#11874) Fixes #11686 --- oh-my-zsh.sh | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index 40f13f37..137ca3b6 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -1,14 +1,14 @@ +# ANSI formatting function (\033[m) +# 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow +omz_f() { + [ $# -gt 0 ] || return + IFS=";" printf "\033[%sm" $* +} +# If stdout is not a terminal ignore all formatting +[ -t 1 ] || omz_f() { :; } + # Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here) [ -n "$ZSH_VERSION" ] || { - # ANSI formatting function (\033[m) - # 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow - omz_f() { - [ $# -gt 0 ] || return - IFS=";" printf "\033[%sm" $* - } - # If stdout is not a terminal ignore all formatting - [ -t 1 ] || omz_f() { :; } - omz_ptree() { # Get process tree of the current process pid=$$; pids="$pid" @@ -38,6 +38,15 @@ return 1 } +# Check if in emulation mode, if so early return +# https://github.com/ohmyzsh/ohmyzsh/issues/11686 +[[ "$(emulate)" = zsh ]] || { + printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded in \`$(emulate)\` emulation mode.$(omz_f 0)\n" >&2 + return 1 +} + +unset -f omz_f + # If ZSH is not defined, use the current script's directory. [[ -z "$ZSH" ]] && export ZSH="${${(%):-%x}:a:h}" From c74f2a1be980c60d937046364db0c9497187457a Mon Sep 17 00:00:00 2001 From: Tjark <16938041+tjarbo@users.noreply.github.com> Date: Mon, 4 Sep 2023 19:43:06 +0200 Subject: [PATCH 265/321] feat(podman): add plugin (#11695) Closes #7489 Closes #9721 --- plugins/podman/README.md | 47 ++++++++++++++++++++++++++++++++ plugins/podman/podman.plugin.zsh | 47 ++++++++++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 plugins/podman/README.md create mode 100644 plugins/podman/podman.plugin.zsh diff --git a/plugins/podman/README.md b/plugins/podman/README.md new file mode 100644 index 00000000..99daa28c --- /dev/null +++ b/plugins/podman/README.md @@ -0,0 +1,47 @@ +# Podman plugin + +This plugin adds auto-completion and aliases for [podman](https://podman.io/). + +To use it add `podman` to the plugins array in your zshrc file. + +```zsh +plugins=(... podman) +``` + +## Aliases + +| Alias | Command | Description | +| :------ | :-------------------------------------------- | :--------------------------------------------------------------------------------------- | +| pbl | `podman build` | Build an image from a Dockerfile | +| pcin | `podman container inspect` | Display detailed information on one or more containers | +| pcls | `podman container ls` | List all the running podman containers | +| pclsa | `podman container ls --all` | List all running and stopped containers | +| pib | `podman image build` | Build an image from a Dockerfile (same as podman build) | +| pii | `podman image inspect` | Display detailed information on one or more images | +| pils | `podman image ls` | List podman images | +| pipu | `podman image push` | Push an image or repository to a remote registry | +| pirm | `podman image rm` | Remove one or more images | +| pit | `podman image tag` | Add a name and tag to a particular image | +| plo | `podman container logs` | Fetch the logs of a podman container | +| pnc | `podman network create` | Create a new network | +| pncn | `podman network connect` | Connect a container to a network | +| pndcn | `podman network disconnect` | Disconnect a container from a network | +| pni | `podman network inspect` | Return information about one or more networks | +| pnls | `podman network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts | +| pnrm | `podman network rm` | Remove one or more networks | +| ppo | `podman container port` | List port mappings or a specific mapping for the container | +| ppu | `podman pull` | Pull an image or a repository from a registry | +| pr | `podman container run` | Create a new container and start it using the specified command | +| prit | `podman container run --interactive --tty` | Create a new container and start it in an interactive shell | +| prm | `podman container rm` | Remove the specified container(s) | +| prm! | `podman container rm --force` | Force the removal of a running container (uses SIGKILL) | +| pst | `podman container start` | Start one or more stopped containers | +| prs | `podman container restart` | Restart one or more containers | +| psta | `podman stop $(podman ps -q)` | Stop all running containers | +| pstp | `podman container stop` | Stop one or more running containers | +| ptop | `podman top` | Display the running processes of a container | +| pvi | `podman volume inspect` | Display detailed information about one or more volumes | +| pvls | `podman volume ls` | List all the volumes known to podman | +| pvprune | `podman volume prune` | Cleanup dangling volumes | +| pxc | `podman container exec` | Run a new command in a running container | +| pxcit | `podman container exec --interactive --tty` | Run a new command in a running container in an interactive shell | diff --git a/plugins/podman/podman.plugin.zsh b/plugins/podman/podman.plugin.zsh new file mode 100644 index 00000000..97cf92b2 --- /dev/null +++ b/plugins/podman/podman.plugin.zsh @@ -0,0 +1,47 @@ +if (( ! $+commands[podman] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `podman`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_podman" ]]; then + typeset -g -A _comps + autoload -Uz _podman + _comps[podman]=_podman +fi + +podman completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_podman" &| + +alias pbl='podman build' +alias pcin='podman container inspect' +alias pcls='podman container ls' +alias pclsa='podman container ls --all' +alias pib='podman image build' +alias pii='podman image inspect' +alias pils='podman image ls' +alias pipu='podman image push' +alias pirm='podman image rm' +alias pit='podman image tag' +alias plo='podman container logs' +alias pnc='podman network create' +alias pncn='podman network connect' +alias pndcn='podman network disconnect' +alias pni='podman network inspect' +alias pnls='podman network ls' +alias pnrm='podman network rm' +alias ppo='podman container port' +alias ppu='podman pull' +alias pr='podman container run' +alias prit='podman container run --interactive --tty' +alias prm='podman container rm' +alias 'prm!'='podman container rm --force' +alias pst='podman container start' +alias prs='podman container restart' +alias psta='podman stop $(podman ps --quiet)' +alias pstp='podman container stop' +alias ptop='podman top' +alias pvi='podman volume inspect' +alias pvls='podman volume ls' +alias pvprune='podman volume prune' +alias pxc='podman container exec' +alias pxcit='podman container exec --interactive --tty' From bae577d6b2eb621fedc994d6309b6f819855c2f8 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 5 Sep 2023 11:41:50 +0100 Subject: [PATCH 266/321] fix(git)!: remove `-b` from `blame` alias (#11864) --- plugins/git/README.md | 2 +- plugins/git/git.plugin.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index c3e6dd27..44ed6f32 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -34,7 +34,7 @@ plugins=(... git) | gbsg | git bisect good | | gbsr | git bisect reset | | gbss | git bisect start | -| gbl | git blame -b -w | +| gbl | git blame -w | | gb | git branch | | gba | git branch --all | | gbd | git branch --delete | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 8886aac6..e20373de 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -115,7 +115,7 @@ alias gbsb='git bisect bad' alias gbsg='git bisect good' alias gbsr='git bisect reset' alias gbss='git bisect start' -alias gbl='git blame -b -w' +alias gbl='git blame -w' alias gb='git branch' alias gba='git branch --all' alias gbd='git branch --delete' From 8e8ec1348b3d4ae5fa156e26c07040ade461c83a Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 6 Sep 2023 10:54:11 +0200 Subject: [PATCH 267/321] fix(git-commit): avoid conflict with `aliases` var Closes #11876 --- plugins/git-commit/git-commit.plugin.zsh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index 70d541f2..2ac8aa5f 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -1,10 +1,11 @@ -_register() { - if ! git config --global --get-all alias.$1 &>/dev/null; then +function _git_commit_register { + if ! git config --global --get-all alias.$1 >/dev/null 2>&1; then git config --global alias.$1 '!a() { if [[ "$1" == "-s" || "$1" == "--scope" ]]; then git commit -m "'$1'(${2}): ${@:3}"; else git commit -m "'$1': ${@}"; fi }; a' fi } -aliases=( +local -a _git_commit_aliases +_git_commit_aliases=( 'build' 'chore' 'ci' @@ -18,6 +19,9 @@ aliases=( 'test' ) -for alias in "${aliases[@]}"; do - _register $alias -done \ No newline at end of file +for _alias in "${_git_commit_aliases[@]}"; do + _git_commit_register $_alias +done + +unfunction _git_commit_register +unset _alias From 76e541a3fe71075c8ef75ecf44cd60f17b5292bb Mon Sep 17 00:00:00 2001 From: Felipe Gallois Date: Wed, 6 Sep 2023 10:18:36 +0100 Subject: [PATCH 268/321] feat(gallois): big rewrite to `gallois` theme (#11867) --- themes/gallois.zsh-theme | 136 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 126 insertions(+), 10 deletions(-) diff --git a/themes/gallois.zsh-theme b/themes/gallois.zsh-theme index bb97bfb1..3fc34907 100644 --- a/themes/gallois.zsh-theme +++ b/themes/gallois.zsh-theme @@ -1,24 +1,140 @@ # Depends on the git plugin for work_in_progress() (( $+functions[work_in_progress] )) || work_in_progress() {} -ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}[" -ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}" -ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[cyan]%}[%{$fg[green]%}" +ZSH_THEME_GIT_PROMPT_SUFFIX="%{$fg[cyan]%}]" +ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}" ZSH_THEME_GIT_PROMPT_CLEAN="" # Customized git status, oh-my-zsh currently does not allow render dirty status before branch git_custom_status() { local branch=$(git_current_branch) [[ -n "$branch" ]] || return 0 - echo "$(parse_git_dirty)\ -%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\ -${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}${ZSH_THEME_GIT_PROMPT_SUFFIX}" + print "%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\ +${ZSH_THEME_GIT_PROMPT_PREFIX}$(parse_git_dirty)${branch}\ +${ZSH_THEME_GIT_PROMPT_SUFFIX}" +} +autoload -U colors && colors + +#export VCS_PROMPT=hg_prompt_info +export VCS_PROMPT=git_custom_status + +base_prompt="%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b " +custom_prompt="" +last_run_time="" +last_vcs_info="" + + +function pipestatus_parse { + PIPESTATUS="$pipestatus" + ERROR=0 + for i in "${(z)PIPESTATUS}"; do + if [[ "$i" -ne 0 ]]; then + ERROR=1 + fi + done + + if [[ "$ERROR" -ne 0 ]]; then + print "[%{$fg[red]%}$PIPESTATUS%{$fg[cyan]%}]" + fi } -# RVM component of prompt -ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}[" -ZSH_THEME_RUBY_PROMPT_SUFFIX="]%{$reset_color%}" # Combine it all into a final right-side prompt -RPS1="\$(git_custom_status)\$(ruby_prompt_info)${RPS1:+ $RPS1}" PROMPT='%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b ' +function preexec() { + last_run_time=$(perl -MTime::HiRes=time -e 'printf "%.9f\n", time') +} + +function duration() { + local duration + local now=$(perl -MTime::HiRes=time -e 'printf "%.9f\n", time') + local last=$1 + local last_split=("${(@s/./)last}") + local now_split=("${(@s/./)now}") + local T=$((now_split[1] - last_split[1])) + local D=$((T/60/60/24)) + local H=$((T/60/60%24)) + local M=$((T/60%60)) + local S=$((T%60)) + local s=$(((now_split[2] - last_split[2]) / 1000000000.)) + local m=$(((now_split[2] - last_split[2]) / 1000000.)) + + (( $D > 0 )) && duration+="${D}d" + (( $H > 0 )) && duration+="${H}h" + (( $M > 0 )) && duration+="${M}m" + + if [[ $S -le 0 ]]; then + printf "%ims" "$m" + else + if ! [[ -z $duration ]] && printf "%s" "$duration" + local sec_milli=$((S + s)) + printf "%.3fs" "$sec_milli" + fi +} + +function precmd() { + RETVAL=$(pipestatus_parse) + local info="" + + if [ ! -z "$last_run_time" ]; then + local elapsed=$(duration $last_run_time) + last_run_time=$(print $last_run_time | tr -d ".") + if [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 120 * 1000 * 1000 * 1000 )) ]; then + local elapsed_color="%{$fg[magenta]%}" + elif [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 60 * 1000 * 1000 * 1000 )) ]; then + local elapsed_color="%{$fg[red]%}" + elif [ $(( $(perl -MTime::HiRes=time -e 'printf "%.9f\n", time' | tr -d ".") - $last_run_time )) -gt $(( 10 * 1000 * 1000 * 1000 )) ]; then + local elapsed_color="%{$fg[yellow]%}" + else + local elapsed_color="%{$fg[green]%}" + fi + info=$(printf "%s%s%s%s%s" "%{$fg[cyan]%}[" "$elapsed_color" "$elapsed" "%{$fg[cyan]%}]" "$RETVAL") + unset last_run_time + fi + + if [ -z "$info" -a ! -z "$last_vcs_info" ]; then + custom_prompt="$last_vcs_info$base_prompt" + return; + fi + + if (( ${+VCS_PROMPT} )); then + last_vcs_info=$($VCS_PROMPT) + if [ ! -z "$last_vcs_info" ]; then + [ -z "$info" ] && info=$last_vcs_info || info="$info$last_vcs_info" + fi + fi + + [ -z "$info" ] && custom_prompt="$base_prompt" || custom_prompt="$info$base_prompt" +} + +function hg_prompt_info() { + unset output info parts branch_parts branch + + local output="" + if ! output="$(hg status 2> /dev/null)"; then + return + fi + + local info=$(hg log -l1 --template '{author}:{node|short}:{remotenames}:{phabdiff}') + local parts=(${(@s/:/)info}) + local branch_parts=(${(@s,/,)parts[3]}) + local branch=${branch_parts[-1]} + [ ! -z "${parts[3]}" ] && [[ "${parts[1]}" =~ "$USER@" ]] && branch=${parts[3]} + [ -z "${parts[3]}" ] && branch=${parts[2]} + + if [[ ! -z "$output" ]]; then + local color="%{$fg[red]%}" + elif [[ "${branch}" == "master" || "${branch}" == "warm" ]]; then + local color="%{$fg[yellow]%}" + else + local color="%{$fg[green]%}" + fi + + print "%{$fg[cyan]%}[${color}${branch}%{$fg[cyan]%}]" +} + +setopt PROMPT_SUBST +PROMPT='$custom_prompt' + + From 331f3c8b2e28e47af41ae309aa814dab524a3374 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 6 Sep 2023 11:36:57 +0100 Subject: [PATCH 269/321] feat(git): add bisect aliases `gbsn` and `gbso` (#11869) --- plugins/git/README.md | 2 ++ plugins/git/git.plugin.zsh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 44ed6f32..922cbee5 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -32,6 +32,8 @@ plugins=(... git) | gbs | git bisect | | gbsb | git bisect bad | | gbsg | git bisect good | +| gbsn | git bisect new | +| gbso | git bisect old | | gbsr | git bisect reset | | gbss | git bisect start | | gbl | git blame -w | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index e20373de..4afe34e9 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -113,6 +113,8 @@ alias gapt='git apply --3way' alias gbs='git bisect' alias gbsb='git bisect bad' alias gbsg='git bisect good' +alias gbsn='git bisect new' +alias gbso='git bisect old' alias gbsr='git bisect reset' alias gbss='git bisect start' alias gbl='git blame -w' From 6a7aab47dd6071b7f264477195b06efb7e7bd480 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Wed, 6 Sep 2023 11:42:09 +0100 Subject: [PATCH 270/321] docs(git): align markdown table borders (#11878) --- plugins/git/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 922cbee5..6eb63ea4 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -36,7 +36,7 @@ plugins=(... git) | gbso | git bisect old | | gbsr | git bisect reset | | gbss | git bisect start | -| gbl | git blame -w | +| gbl | git blame -w | | gb | git branch | | gba | git branch --all | | gbd | git branch --delete | From 079dbff2c4f22935a71101c511e2285327d8ab68 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 6 Sep 2023 19:01:41 +0200 Subject: [PATCH 271/321] feat(pipenv): add option to disable auto shell feature Closes #11472 --- plugins/pipenv/README.md | 15 ++++++++++++- plugins/pipenv/pipenv.plugin.zsh | 38 +++++++++++++++++--------------- 2 files changed, 34 insertions(+), 19 deletions(-) diff --git a/plugins/pipenv/README.md b/plugins/pipenv/README.md index 4329feb3..e78ef0e3 100644 --- a/plugins/pipenv/README.md +++ b/plugins/pipenv/README.md @@ -1,6 +1,7 @@ # Pipenv ## Installation + In your `.zshrc` file, add `pipenv` to the plugins section ``` @@ -8,7 +9,9 @@ plugins=(... pipenv ...) ``` ## Features -This plugin provides some features to simplify the use of Pipenv while working on ZSH. + +This plugin provides some features to simplify the use of Pipenv while working on ZSH. + - Adds completion for pipenv - Auto activates and deactivates pipenv shell - Adds short aliases for common pipenv commands @@ -27,3 +30,13 @@ This plugin provides some features to simplify the use of Pipenv while working o - `pwh` is aliased to `pipenv --where` - `pvenv` is aliased to `pipenv --venv` - `ppy` is aliased to `pipenv --py` + +## Configuration + +### Shell activation + +If you want to disable the shell activation and deactivation feature, add the following style to your `.zshrc` before sourcing `oh-my-zsh.sh`: + +```zsh +zstyle ':omz:plugins:pipenv' auto-shell no +``` diff --git a/plugins/pipenv/pipenv.plugin.zsh b/plugins/pipenv/pipenv.plugin.zsh index 22d1a313..f81c266a 100644 --- a/plugins/pipenv/pipenv.plugin.zsh +++ b/plugins/pipenv/pipenv.plugin.zsh @@ -12,28 +12,30 @@ fi _PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &| -# Automatic pipenv shell activation/deactivation -_togglePipenvShell() { - # deactivate shell if Pipfile doesn't exist and not in a subdir - if [[ ! -f "$PWD/Pipfile" ]]; then - if [[ "$PIPENV_ACTIVE" == 1 ]]; then - if [[ "$PWD" != "$pipfile_dir"* ]]; then - exit +if zstyle -T ':omz:plugins:pipenv' auto-shell; then + # Automatic pipenv shell activation/deactivation + _togglePipenvShell() { + # deactivate shell if Pipfile doesn't exist and not in a subdir + if [[ ! -f "$PWD/Pipfile" ]]; then + if [[ "$PIPENV_ACTIVE" == 1 ]]; then + if [[ "$PWD" != "$pipfile_dir"* ]]; then + exit + fi fi fi - fi - # activate the shell if Pipfile exists - if [[ "$PIPENV_ACTIVE" != 1 ]]; then - if [[ -f "$PWD/Pipfile" ]]; then - export pipfile_dir="$PWD" - pipenv shell + # activate the shell if Pipfile exists + if [[ "$PIPENV_ACTIVE" != 1 ]]; then + if [[ -f "$PWD/Pipfile" ]]; then + export pipfile_dir="$PWD" + pipenv shell + fi fi - fi -} -autoload -U add-zsh-hook -add-zsh-hook chpwd _togglePipenvShell -_togglePipenvShell + } + autoload -U add-zsh-hook + add-zsh-hook chpwd _togglePipenvShell + _togglePipenvShell +fi # Aliases alias pch="pipenv check" From b07c8cfe692bc6c7702f0aef5d493b12dfb43392 Mon Sep 17 00:00:00 2001 From: Haltarys <45515869+Haltarys@users.noreply.github.com> Date: Sun, 10 Sep 2023 09:28:33 +0200 Subject: [PATCH 272/321] fix(git-commit): fix compatibility of alias functions (#11883) --- plugins/git-commit/git-commit.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index 2ac8aa5f..4ad4c017 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -1,6 +1,6 @@ function _git_commit_register { if ! git config --global --get-all alias.$1 >/dev/null 2>&1; then - git config --global alias.$1 '!a() { if [[ "$1" == "-s" || "$1" == "--scope" ]]; then git commit -m "'$1'(${2}): ${@:3}"; else git commit -m "'$1': ${@}"; fi }; a' + git config --global alias.$1 '!a() { if [ "$1" = "-s" ] || [ "$1" = "--scope" ]; then local scope="$2"; shift 2; git commit -m "'$1'(${scope}): ${@}"; else git commit -m "'$1': ${@}"; fi }; a' fi } From cd18bce53e01d0f614ffcbb7429053fb508cb095 Mon Sep 17 00:00:00 2001 From: AJ Jordan Date: Mon, 11 Sep 2023 03:31:53 -0400 Subject: [PATCH 273/321] feat(mortalscumbag): show toolbox info (#11884) --- themes/mortalscumbag.zsh-theme | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/themes/mortalscumbag.zsh-theme b/themes/mortalscumbag.zsh-theme index d81a7ca0..36301cb7 100644 --- a/themes/mortalscumbag.zsh-theme +++ b/themes/mortalscumbag.zsh-theme @@ -51,8 +51,14 @@ function ssh_connection() { fi } +function _toolbox_prompt_info() { + if typeset -f toolbox_prompt_info > /dev/null; then + toolbox_prompt_info + fi +} + local ret_status="%(?:%{$fg_bold[green]%}:%{$fg_bold[red]%})%?%{$reset_color%}" -PROMPT=$'\n$(ssh_connection)%{$fg_bold[green]%}%n@%m%{$reset_color%}$(my_git_prompt) : %~\n[${ret_status}] %# ' +PROMPT=$'\n$(_toolbox_prompt_info)$(ssh_connection)%{$fg_bold[green]%}%n@%m%{$reset_color%}$(my_git_prompt) : %~\n[${ret_status}] %# ' ZSH_THEME_PROMPT_RETURNCODE_PREFIX="%{$fg_bold[red]%}" ZSH_THEME_GIT_PROMPT_PREFIX=" $fg[white]‹ %{$fg_bold[yellow]%}" From 7077989d28e9cd723afcb4355874683d847278b4 Mon Sep 17 00:00:00 2001 From: Samuel Beckley Date: Mon, 11 Sep 2023 03:35:28 -0400 Subject: [PATCH 274/321] feat(macos): update spotify plugin to upstream (#11534) --- plugins/macos/spotify | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/plugins/macos/spotify b/plugins/macos/spotify index 5fb40517..ae42db42 100644 --- a/plugins/macos/spotify +++ b/plugins/macos/spotify @@ -1,7 +1,7 @@ #!/usr/bin/env bash function spotify() { -# Copyright (c) 2012--2019 Harish Narayanan +# Copyright (c) 2012--2023 Harish Narayanan # # Contains numerous helpful contributions from Jorge Colindres, Thomas # Pritchard, iLan Epstein, Gabriele Bonetti, Sean Heller, Eric Martin @@ -35,6 +35,9 @@ if ! [[ -f "${USER_CONFIG_FILE}" ]]; then fi source "${USER_CONFIG_FILE}"; +# Set the percent change in volume for vol up and vol down +VOL_INCREMENT=10 + showAPIHelp() { echo; echo "Connecting to Spotify's API:"; @@ -170,12 +173,12 @@ while [ $# -gt 0 ]; do if [ -z "${CLIENT_ID}" ]; then cecho "Invalid Client ID, please update ${USER_CONFIG_FILE}"; showAPIHelp; - return 1 + return 1; fi if [ -z "${CLIENT_SECRET}" ]; then cecho "Invalid Client Secret, please update ${USER_CONFIG_FILE}"; showAPIHelp; - return 1 + return 1; fi SHPOTIFY_CREDENTIALS=$(printf "${CLIENT_ID}:${CLIENT_SECRET}" | base64 | tr -d "\n"|tr -d '\r'); SPOTIFY_PLAY_URI=""; @@ -198,7 +201,7 @@ while [ $# -gt 0 ]; do fi SPOTIFY_ACCESS_TOKEN=$( \ printf "${SPOTIFY_TOKEN_RESPONSE_DATA}" \ - | grep -E -o '"access_token":".*",' \ + | command grep -E -o '"access_token":".*",' \ | sed 's/"access_token"://g' \ | sed 's/"//g' \ | sed 's/,.*//g' \ @@ -219,9 +222,8 @@ while [ $# -gt 0 ]; do -H "Accept: application/json" \ --data-urlencode "q=$Q" \ -d "type=$type&limit=1&offset=0" \ - | grep -E -o "spotify:$type:[a-zA-Z0-9]+" -m 1 + | command grep -E -o "spotify:$type:[a-zA-Z0-9]+" -m 1 ) - echo "play uri: ${SPOTIFY_PLAY_URI}" } case $2 in @@ -235,11 +237,11 @@ while [ $# -gt 0 ]; do results=$( \ curl -s -G $SPOTIFY_SEARCH_API --data-urlencode "q=$Q" -d "type=playlist&limit=10&offset=0" -H "Accept: application/json" -H "Authorization: Bearer ${SPOTIFY_ACCESS_TOKEN}" \ - | grep -E -o "spotify:playlist:[a-zA-Z0-9]+" -m 10 \ + | command grep -E -o "spotify:playlist:[a-zA-Z0-9]+" -m 10 \ ) count=$( \ - echo "$results" | grep -c "spotify:playlist" \ + echo "$results" | command grep -c "spotify:playlist" \ ) if [ "$count" -gt 0 ]; then @@ -333,16 +335,16 @@ while [ $# -gt 0 ]; do cecho "Current Spotify volume level is $vol."; break ; elif [ "$2" = "up" ]; then - if [ $vol -le 90 ]; then - newvol=$(( vol+10 )); + if [ $vol -le $(( 100-$VOL_INCREMENT )) ]; then + newvol=$(( vol+$VOL_INCREMENT )); cecho "Increasing Spotify volume to $newvol."; else newvol=100; cecho "Spotify volume level is at max."; fi elif [ "$2" = "down" ]; then - if [ $vol -ge 10 ]; then - newvol=$(( vol-10 )); + if [ $vol -ge $(( $VOL_INCREMENT )) ]; then + newvol=$(( vol-$VOL_INCREMENT )); cecho "Reducing Spotify volume to $newvol."; else newvol=0; @@ -354,11 +356,11 @@ while [ $# -gt 0 ]; do else echo "Improper use of 'vol' command" echo "The 'vol' command should be used as follows:" - echo " vol up # Increases the volume by 10%."; - echo " vol down # Decreases the volume by 10%."; + echo " vol up # Increases the volume by $VOL_INCREMENT%."; + echo " vol down # Decreases the volume by $VOL_INCREMENT%."; echo " vol [amount] # Sets the volume to an amount between 0 and 100."; echo " vol # Shows the current Spotify volume."; - return 1 + return 1; fi osascript -e "tell application \"Spotify\" to set sound volume to $newvol"; @@ -468,10 +470,9 @@ while [ $# -gt 0 ]; do "help" ) showHelp; break ;; - * ) showHelp; - return 1 ;; + return 1; esac done From 38ef5192cb1c43159b516d15ab8fed96f847b36b Mon Sep 17 00:00:00 2001 From: Felipe Gallois Date: Mon, 11 Sep 2023 10:05:50 +0100 Subject: [PATCH 275/321] feat(oldgalois): add theme (#11880) Closes #11879 --- themes/oldgallois.zsh-theme | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 themes/oldgallois.zsh-theme diff --git a/themes/oldgallois.zsh-theme b/themes/oldgallois.zsh-theme new file mode 100644 index 00000000..bb97bfb1 --- /dev/null +++ b/themes/oldgallois.zsh-theme @@ -0,0 +1,24 @@ +# Depends on the git plugin for work_in_progress() +(( $+functions[work_in_progress] )) || work_in_progress() {} + +ZSH_THEME_GIT_PROMPT_PREFIX="%{$reset_color%}%{$fg[green]%}[" +ZSH_THEME_GIT_PROMPT_SUFFIX="]%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_CLEAN="" + +# Customized git status, oh-my-zsh currently does not allow render dirty status before branch +git_custom_status() { + local branch=$(git_current_branch) + [[ -n "$branch" ]] || return 0 + echo "$(parse_git_dirty)\ +%{${fg_bold[yellow]}%}$(work_in_progress)%{$reset_color%}\ +${ZSH_THEME_GIT_PROMPT_PREFIX}${branch}${ZSH_THEME_GIT_PROMPT_SUFFIX}" +} + +# RVM component of prompt +ZSH_THEME_RUBY_PROMPT_PREFIX="%{$fg[red]%}[" +ZSH_THEME_RUBY_PROMPT_SUFFIX="]%{$reset_color%}" + +# Combine it all into a final right-side prompt +RPS1="\$(git_custom_status)\$(ruby_prompt_info)${RPS1:+ $RPS1}" +PROMPT='%{$fg[cyan]%}[%~% ]%(?.%{$fg[green]%}.%{$fg[red]%})%B$%b ' From 01f55123118601a935f28ff6c49e625448bdd32d Mon Sep 17 00:00:00 2001 From: bretello Date: Tue, 12 Sep 2023 21:41:07 +0200 Subject: [PATCH 276/321] feat(systemd): add alias for --failed commands (#11847) --- plugins/systemd/README.md | 1 + plugins/systemd/systemd.plugin.zsh | 3 +++ 2 files changed, 4 insertions(+) diff --git a/plugins/systemd/README.md b/plugins/systemd/README.md index ffa0567a..755c649a 100644 --- a/plugins/systemd/README.md +++ b/plugins/systemd/README.md @@ -12,6 +12,7 @@ plugins=(... systemd) | Alias | Command | Description | |:-----------------------|:-----------------------------------|:-----------------------------------------------------------------| +| `sc-failed` | `systemctl --failed` | List failed systemd units | | `sc-list-units` | `systemctl list-units` | List all units systemd has in memory | | `sc-is-active` | `systemctl is-active` | Show whether a unit is active | | `sc-status` | `systemctl status` | Show terse runtime status information about one or more units | diff --git a/plugins/systemd/systemd.plugin.zsh b/plugins/systemd/systemd.plugin.zsh index 1270bea0..382a57b2 100644 --- a/plugins/systemd/systemd.plugin.zsh +++ b/plugins/systemd/systemd.plugin.zsh @@ -93,6 +93,9 @@ alias scu-enable-now="scu-enable --now" alias scu-disable-now="scu-disable --now" alias scu-mask-now="scu-mask --now" +# --failed commands +alias scu-failed='systemctl --user --failed' +alias sc-failed='systemctl --failed' function systemd_prompt_info { local unit From 7e4c26860d74a01cd6d91fd10fcc28fccd740ddd Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 13 Sep 2023 10:48:16 +0200 Subject: [PATCH 277/321] feat(brew): add support for custom `BREW_LOCATION` Fixes #11888 Co-authored-by: Matt Cable --- plugins/brew/README.md | 20 +++++++++++--------- plugins/brew/brew.plugin.zsh | 7 ++++++- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/plugins/brew/README.md b/plugins/brew/README.md index 4730194b..299393b2 100644 --- a/plugins/brew/README.md +++ b/plugins/brew/README.md @@ -10,10 +10,12 @@ plugins=(... brew) ## Shellenv -If `brew` is not found in the PATH, this plugin will attempt to find it in common -locations, and execute `brew shellenv` to set the environment appropriately. -This plugin will also export `HOMEBREW_PREFIX="$(brew --prefix)"` if not previously -defined for convenience. +If `brew` is not found in the PATH, this plugin will attempt to find it in common locations, and execute +`brew shellenv` to set the environment appropriately. This plugin will also export +`HOMEBREW_PREFIX="$(brew --prefix)"` if not previously defined for convenience. + +In case you installed `brew` in a non-common location, you can still set `BREW_LOCATION` variable pointing to +the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environment. ## Aliases @@ -33,9 +35,9 @@ defined for convenience. ## Completion -This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh. +This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it +manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh. -With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the -brew installation, so we no longer ship it with the brew plugin; now it only has brew -aliases. If you find that brew completion no longer works, make sure you have your Homebrew -installation fully up to date. +With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the brew installation, +so we no longer ship it with the brew plugin; now it only has brew aliases. If you find that brew completion +no longer works, make sure you have your Homebrew installation fully up to date. diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index b52664a3..44703637 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -1,5 +1,10 @@ if (( ! $+commands[brew] )); then - if [[ -x /opt/homebrew/bin/brew ]]; then + if [[ -n "$BREW_LOCATION" ]]; then + if [[ ! -x "$BREW_LOCATION" ]]; then + echo "[oh-my-zsh] $BREW_LOCATION is not executable" + return + fi + elif [[ -x /opt/homebrew/bin/brew ]]; then BREW_LOCATION="/opt/homebrew/bin/brew" elif [[ -x /usr/local/bin/brew ]]; then BREW_LOCATION="/usr/local/bin/brew" From 4167474f124bfc39d0e6cd612c95acf0a1ae9904 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Benoit?= Date: Wed, 13 Sep 2023 16:31:24 +0200 Subject: [PATCH 278/321] feat(grc): add support for arm64 macos (#11890) --- plugins/grc/grc.plugin.zsh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/grc/grc.plugin.zsh b/plugins/grc/grc.plugin.zsh index b709b9e0..e036b8d8 100644 --- a/plugins/grc/grc.plugin.zsh +++ b/plugins/grc/grc.plugin.zsh @@ -2,8 +2,9 @@ # common grc.zsh paths files=( - /etc/grc.zsh # default - /usr/local/etc/grc.zsh # homebrew + /etc/grc.zsh # default + /usr/local/etc/grc.zsh # homebrew darwin-x64 + /opt/homebrew/etc/grc.zsh # homebrew darwin-arm64 ) # verify the file is readable and source it From bbda81fe4b338f00bbf7c7f33e6d1b12d067dc05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 13 Sep 2023 19:23:41 +0200 Subject: [PATCH 279/321] fix(changelog): fix regression for unstyled code in commit subjects --- tools/changelog.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index 1af74e42..6d768963 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -366,7 +366,7 @@ function display-release { # In text mode, highlight (#) and dim text between `backticks` text) if supports_hyperlinks; then - sed -E $'s|#([0-9]+)|\e]8;;https://github.com/ohmyzsh/ohmyzsh/issues/\\1\a\e[32m#\\1\e[0m\e]8;;\a|g' <<< "$subject" + sed -E $'s|#([0-9]+)|\e]8;;https://github.com/ohmyzsh/ohmyzsh/issues/\\1\a\e[32m#\\1\e[0m\e]8;;\a|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject" else sed -E $'s|#([0-9]+)|\e[32m#\\1\e[0m|g;s|`([^`]+)`|`\e[2m\\1\e[0m`|g' <<< "$subject" fi ;; From cdd7dab5db4c668b962f908b57e244aa1ff4b574 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 17 Sep 2023 16:20:46 +0200 Subject: [PATCH 280/321] ci(installer): remove `vc link` which generates the wrong project `vc link` is not needed, as we already have `VERCEL_PROJECT_ID` defined as an env variable. Currently the `vc link` only creates a second empty project with the name `installer` as seen in logs: Linked to ohmyzsh/installer (created .vercel and added it to .gitignore) Vercel CLI 32.2.4 --- .github/workflows/installer.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index ac88d10b..4a25c807 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -51,5 +51,4 @@ jobs: run: | cp tools/install.sh .github/workflows/installer/install.sh cd .github/workflows/installer - vc link --yes -t ${{ secrets.VERCEL_TOKEN }} vc deploy --prod -t ${{ secrets.VERCEL_TOKEN }} From 91cd5341b9e682bf1c1be4a4051249cffdab7943 Mon Sep 17 00:00:00 2001 From: Marc-Antoine Godde Date: Wed, 20 Sep 2023 12:09:46 +0200 Subject: [PATCH 281/321] fix(gcloud): source `path.zsh.inc` always (#11901) --- plugins/gcloud/gcloud.plugin.zsh | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/plugins/gcloud/gcloud.plugin.zsh b/plugins/gcloud/gcloud.plugin.zsh index 5c57302d..9a4213aa 100644 --- a/plugins/gcloud/gcloud.plugin.zsh +++ b/plugins/gcloud/gcloud.plugin.zsh @@ -29,11 +29,9 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then fi if (( ${+CLOUDSDK_HOME} )); then - # Only source this if gcloud isn't already on the path - if (( ! $+commands[gcloud] )); then - if [[ -f "${CLOUDSDK_HOME}/path.zsh.inc" ]]; then - source "${CLOUDSDK_HOME}/path.zsh.inc" - fi + # Source path file + if [[ -f "${CLOUDSDK_HOME}/path.zsh.inc" ]]; then + source "${CLOUDSDK_HOME}/path.zsh.inc" fi # Look for completion file in different paths From 350427dea2293a3e23f9823b5dc2574c1b1ae2a2 Mon Sep 17 00:00:00 2001 From: Trick van Staveren Date: Wed, 20 Sep 2023 09:09:26 -0500 Subject: [PATCH 282/321] feat(hitchhiker): clean up refs to magic string (#11900) --- plugins/hitchhiker/fortunes/hitchhiker | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/plugins/hitchhiker/fortunes/hitchhiker b/plugins/hitchhiker/fortunes/hitchhiker index 825b86cd..b0448b21 100644 --- a/plugins/hitchhiker/fortunes/hitchhiker +++ b/plugins/hitchhiker/fortunes/hitchhiker @@ -194,31 +194,31 @@ ARTHUR It probably seems a terrible thing to say, but you know what I sometimes - One of the more preferable pieces of advice contained in the Guide. % -"His eyes seemed to be popping out of his head. He wasn't certain if this was because they were trying to see more clearly, or if they simply wanted to leave at this point."QUOTEHERESTRINGMAGIC1234- Arthur trying to see who had diverted him from going to a party. +"His eyes seemed to be popping out of his head. He wasn't certain if this was because they were trying to see more clearly, or if they simply wanted to leave at this point." - Arthur trying to see who had diverted him from going to a party. % -"Arthur yawed wildly as his skin tried to jump one way and his skeleton the other, whilst his brain tried to work out which of his ears it most wanted to crawl out of. `Bet you weren't expecting to see me again,' said the monster, which Arthur couldn't help thinking was a strange remark for it to make, seeing as he had never met the creature before. He could tell that he hadn't met the creature before from the simple fact that he was able to sleep at nights."QUOTEHERESTRINGMAGIC1234- Arthur discovering who had diverted him from going to a party. +"Arthur yawed wildly as his skin tried to jump one way and his skeleton the other, whilst his brain tried to work out which of his ears it most wanted to crawl out of. `Bet you weren't expecting to see me again,' said the monster, which Arthur couldn't help thinking was a strange remark for it to make, seeing as he had never met the creature before. He could tell that he hadn't met the creature before from the simple fact that he was able to sleep at nights." - Arthur discovering who had diverted him from going to a party. % -"`That young girl is one of the least benightedly unintelligent organic life forms it has been my profound lack of pleasure not to be able to avoid meeting.'"QUOTEHERESTRINGMAGIC1234- Marvin's first ever compliment about anybody. +"`That young girl is one of the least benightedly unintelligent organic life forms it has been my profound lack of pleasure not to be able to avoid meeting.'" - Marvin's first ever compliment about anybody. % -"Arthur hoped and prayed that there wasn't an afterlife. Then he realised there was a contradiction there and merely hoped that there wasn't an afterlife."QUOTEHERESTRINGMAGIC1234- Arthur realising that he's in a certain death situation with a supernova bomb that is shaped like a cricket ball. +"Arthur hoped and prayed that there wasn't an afterlife. Then he realised there was a contradiction there and merely hoped that there wasn't an afterlife." - Arthur realising that he's in a certain death situation with a supernova bomb that is shaped like a cricket ball. % -"`Credit?' he said. `Aaaargggh...' These two words are usually coupled together in the Old Pink Dog Bar."QUOTEHERESTRINGMAGIC1234- Ford in a spot of bother. +"`Credit?' he said. `Aaaargggh...' These two words are usually coupled together in the Old Pink Dog Bar." - Ford in a spot of bother. % -"`...we might as well start with where your hand is now.' Arthur said, `So which way do I go?' `Down,' said Fenchurch, `on this occasion.' He moved his hand. `Down,' she said, `is in fact the other way.' `Oh yes.'"QUOTEHERESTRINGMAGIC1234- Arthur trying to discover which part of Fenchurch is wrong. +"`...we might as well start with where your hand is now.' Arthur said, `So which way do I go?' `Down,' said Fenchurch, `on this occasion.' He moved his hand. `Down,' she said, `is in fact the other way.' `Oh yes.'" - Arthur trying to discover which part of Fenchurch is wrong. % -"There was a point to this story, but it has temporarily escaped the chronicler's mind."QUOTEHERESTRINGMAGIC1234- This line perhaps best sums up the whole book. +"There was a point to this story, but it has temporarily escaped the chronicler's mind." - This line perhaps best sums up the whole book. % -"The last time anybody made a list of the top hundred character attributes of New Yorkers, common sense snuck in at number 79. .... When it's fall in New York, the air smells as if someone's been frying goats in it, and if you are keen to breathe the best plan is to open a window and stick your head in a building."QUOTEHERESTRINGMAGIC1234- Nuff said?? +"The last time anybody made a list of the top hundred character attributes of New Yorkers, common sense snuck in at number 79. .... When it's fall in New York, the air smells as if someone's been frying goats in it, and if you are keen to breathe the best plan is to open a window and stick your head in a building." - Nuff said?? % -"`What's been happening here?' he demanded. `Oh just the nicest things, sir, just the nicest things. can I sit on your lap please?'" "`Colin, I am going to abandon you to your fate.' `I'm so happy.'" "`It will be very, very nasty for you, and that's just too bad. Got it?' `I gurgle with pleasure.'"QUOTEHERESTRINGMAGIC1234- Ford and Colin the robot. +"`What's been happening here?' he demanded. `Oh just the nicest things, sir, just the nicest things. can I sit on your lap please?'" "`Colin, I am going to abandon you to your fate.' `I'm so happy.'" "`It will be very, very nasty for you, and that's just too bad. Got it?' `I gurgle with pleasure.'" - Ford and Colin the robot. % -"What the hell, he thought, you're only young once, and threw himself out of the window. That would at least keep the element of surprise on his side."QUOTEHERESTRINGMAGIC1234- Ford outwitting a Vogon with a rocket launcher by going into another certain death situation. +"What the hell, he thought, you're only young once, and threw himself out of the window. That would at least keep the element of surprise on his side." - Ford outwitting a Vogon with a rocket launcher by going into another certain death situation. % -"The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair."QUOTEHERESTRINGMAGIC1234- One of the laws of computers and programming revealed. +"The major difference between a thing that might go wrong and a thing that cannot possibly go wrong is that when a thing that cannot possibly go wrong goes wrong it usually turns out to be impossible to get at or repair." - One of the laws of computers and programming revealed. % -"`You know they've reintroduced the death penalty for insurance company directors?' `Really?' said Arthur. `No I didn't. For what offence?' Trillian frowned. `What do you mean, offence?' `I see.'"QUOTEHERESTRINGMAGIC1234- Evidence that there will be some justice in the Universe eventually. +"`You know they've reintroduced the death penalty for insurance company directors?' `Really?' said Arthur. `No I didn't. For what offence?' Trillian frowned. `What do you mean, offence?' `I see.'" - Evidence that there will be some justice in the Universe eventually. % -"`She hit me on the head with the rock again.' `I think I can confirm that that was my daughter.' `Sweet kid.' `You have to get to know her,' said Arthur. `She eases up does she?' `No,' said Arthur, `but you get a better sense of when to duck.'"QUOTEHERESTRINGMAGIC1234- Ford and Arthur on Random. +"`She hit me on the head with the rock again.' `I think I can confirm that that was my daughter.' `Sweet kid.' `You have to get to know her,' said Arthur. `She eases up does she?' `No,' said Arthur, `but you get a better sense of when to duck.'" - Ford and Arthur on Random. % "Far out in the uncharted backwaters of the unfashionable end of the western spiral arm of the Galaxy lies a small unregarded yellow sun. " % From 1cc32be5f632ff933b3e3f1c7bd9e612a274c095 Mon Sep 17 00:00:00 2001 From: ajatkj Date: Wed, 20 Sep 2023 20:21:27 +0530 Subject: [PATCH 283/321] feat(poetry-env): create plugin (#11069) --- plugins/poetry-env/README.md | 10 +++++++++ plugins/poetry-env/poetry-env.plugin.zsh | 27 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 plugins/poetry-env/README.md create mode 100644 plugins/poetry-env/poetry-env.plugin.zsh diff --git a/plugins/poetry-env/README.md b/plugins/poetry-env/README.md new file mode 100644 index 00000000..a7d16563 --- /dev/null +++ b/plugins/poetry-env/README.md @@ -0,0 +1,10 @@ +# Poetry Environment Plugin + +This plugin automatically changes poetry environment when you cd into or out of the project directory. +Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment + +To use it, add `poetry-env` to the plugins array in your zshrc file: + +```zsh +plugins=(... poetry-env) +``` diff --git a/plugins/poetry-env/poetry-env.plugin.zsh b/plugins/poetry-env/poetry-env.plugin.zsh new file mode 100644 index 00000000..86e5fad4 --- /dev/null +++ b/plugins/poetry-env/poetry-env.plugin.zsh @@ -0,0 +1,27 @@ +# Automatic poetry environment activation/deactivation +_togglePoetryShell() { + # deactivate environment if pyproject.toml doesn't exist and not in a subdir + if [[ ! -f "$PWD/pyproject.toml" ]] ; then + if [[ "$poetry_active" == 1 ]]; then + if [[ "$PWD" != "$poetry_dir"* ]]; then + export poetry_active=0 + deactivate + return + fi + fi + fi + + # activate the environment if pyproject.toml exists + if [[ "$poetry_active" != 1 ]]; then + if [[ -f "$PWD/pyproject.toml" ]]; then + if grep -q 'tool.poetry' "$PWD/pyproject.toml"; then + export poetry_active=1 + export poetry_dir="$PWD" + source "$(poetry env info --path)/bin/activate" + fi + fi + fi +} +autoload -U add-zsh-hook +add-zsh-hook chpwd _togglePoetryShell +_togglePoetryShell From 1c55a0fe5246487ec9f18e03b7f28862b76cb7ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20M=C3=BCller?= Date: Thu, 21 Sep 2023 12:43:00 +0200 Subject: [PATCH 284/321] feat(dnf): use `dnf5` if available (#11904) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marcus Müller --- plugins/dnf/README.md | 3 +++ plugins/dnf/dnf.plugin.zsh | 28 ++++++++++++++++------------ 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/plugins/dnf/README.md b/plugins/dnf/README.md index dc0d1e0a..f45c8778 100644 --- a/plugins/dnf/README.md +++ b/plugins/dnf/README.md @@ -10,6 +10,9 @@ To use it, add `dnf` to the plugins array in your zshrc file: plugins=(... dnf) ``` +Classic `dnf` is getting superseded by `dnf5`; this plugin detects the presence +of `dnf5` and uses it as drop-in alternative to the slower `dnf`. + ## Aliases | Alias | Command | Description | diff --git a/plugins/dnf/dnf.plugin.zsh b/plugins/dnf/dnf.plugin.zsh index 653ce7dd..642422fe 100644 --- a/plugins/dnf/dnf.plugin.zsh +++ b/plugins/dnf/dnf.plugin.zsh @@ -1,15 +1,19 @@ ## Aliases +local dnfprog="dnf" -alias dnfl="dnf list" # List packages -alias dnfli="dnf list installed" # List installed packages -alias dnfgl="dnf grouplist" # List package groups -alias dnfmc="dnf makecache" # Generate metadata cache -alias dnfp="dnf info" # Show package information -alias dnfs="dnf search" # Search package +# Prefer dnf5 if installed +command -v dnf5 > /dev/null && dnfprog=dnf5 -alias dnfu="sudo dnf upgrade" # Upgrade package -alias dnfi="sudo dnf install" # Install package -alias dnfgi="sudo dnf groupinstall" # Install package group -alias dnfr="sudo dnf remove" # Remove package -alias dnfgr="sudo dnf groupremove" # Remove package group -alias dnfc="sudo dnf clean all" # Clean cache +alias dnfl="${dnfprog} list" # List packages +alias dnfli="${dnfprog} list installed" # List installed packages +alias dnfgl="${dnfprog} grouplist" # List package groups +alias dnfmc="${dnfprog} makecache" # Generate metadata cache +alias dnfp="${dnfprog} info" # Show package information +alias dnfs="${dnfprog} search" # Search package + +alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package +alias dnfi="sudo ${dnfprog} install" # Install package +alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group +alias dnfr="sudo ${dnfprog} remove" # Remove package +alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group +alias dnfc="sudo ${dnfprog} clean all" # Clean cache From c91684bb1b723833a96415c2c724332a6e2e620f Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 25 Sep 2023 08:20:20 +0100 Subject: [PATCH 285/321] docs(web-search): add `youtube` entry --- plugins/web-search/README.md | 62 ++++++++++++------------ plugins/web-search/web-search.plugin.zsh | 1 - 2 files changed, 30 insertions(+), 33 deletions(-) diff --git a/plugins/web-search/README.md b/plugins/web-search/README.md index 0bf9f26a..6e4b4d7b 100644 --- a/plugins/web-search/README.md +++ b/plugins/web-search/README.md @@ -12,8 +12,8 @@ plugins=( ... web-search) You can use the `web-search` plugin in these two forms: -* `web_search [more terms if you want]` -* ` [more terms if you want]` +- `web_search [more terms if you want]` +- ` [more terms if you want]` For example, these two are equivalent: @@ -24,43 +24,42 @@ $ google oh-my-zsh Available search contexts are: -| Context | URL | -| --------------------- | ---------------------------------------- | -| `bing` | `https://www.bing.com/search?q=` | -| `google` | `https://www.google.com/search?q=` | -| `brs` or `brave` | `https://search.brave.com/search?q=` | -| `yahoo` | `https://search.yahoo.com/search?p=` | -| `ddg` or `duckduckgo` | `https://www.duckduckgo.com/?q=` | -| `sp` or `startpage` | `https://www.startpage.com/do/search?q=` | -| `yandex` | `https://yandex.ru/yandsearch?text=` | -| `github` | `https://github.com/search?q=` | -| `baidu` | `https://www.baidu.com/s?wd=` | -| `ecosia` | `https://www.ecosia.org/search?q=` | -| `goodreads` | `https://www.goodreads.com/search?q=` | -| `qwant` | `https://www.qwant.com/?q=` | -| `givero` | `https://www.givero.com/search?q=` | -| `stackoverflow` | `https://stackoverflow.com/search?q=` | -| `wolframalpha` | `https://wolframalpha.com/input?i=` | -| `archive` | `https://web.archive.org/web/*/` | -| `scholar` | `https://scholar.google.com/scholar?q=` | -| `ask` | `https://www.ask.com/web?q=` | +| Context | URL | +| --------------------- | ----------------------------------------------- | +| `bing` | `https://www.bing.com/search?q=` | +| `google` | `https://www.google.com/search?q=` | +| `brs` or `brave` | `https://search.brave.com/search?q=` | +| `yahoo` | `https://search.yahoo.com/search?p=` | +| `ddg` or `duckduckgo` | `https://www.duckduckgo.com/?q=` | +| `sp` or `startpage` | `https://www.startpage.com/do/search?q=` | +| `yandex` | `https://yandex.ru/yandsearch?text=` | +| `github` | `https://github.com/search?q=` | +| `baidu` | `https://www.baidu.com/s?wd=` | +| `ecosia` | `https://www.ecosia.org/search?q=` | +| `goodreads` | `https://www.goodreads.com/search?q=` | +| `qwant` | `https://www.qwant.com/?q=` | +| `givero` | `https://www.givero.com/search?q=` | +| `stackoverflow` | `https://stackoverflow.com/search?q=` | +| `wolframalpha` | `https://wolframalpha.com/input?i=` | +| `archive` | `https://web.archive.org/web/*/` | +| `scholar` | `https://scholar.google.com/scholar?q=` | +| `ask` | `https://www.ask.com/web?q=` | +| `youtube` | `https://www.youtube.com/results?search_query=` | Also there are aliases for bang-searching DuckDuckGo: | Context | Bang | -|-----------|-------| +| --------- | ----- | | `wiki` | `!w` | | `news` | `!n` | -| `youtube` | `!yt` | | `map` | `!m` | | `image` | `!i` | | `ducky` | `!` | ### Custom search engines -If you want to add other search contexts to the plugin, you can use the -`$ZSH_WEB_SEARCH_ENGINES` variable. Set it before Oh My Zsh is sourced, -with the following format: +If you want to add other search contexts to the plugin, you can use the `$ZSH_WEB_SEARCH_ENGINES` variable. +Set it before Oh My Zsh is sourced, with the following format: ```zsh ZSH_WEB_SEARCH_ENGINES=( @@ -69,13 +68,12 @@ ZSH_WEB_SEARCH_ENGINES=( ) ``` -where `` is the name of the search context, and `` a URL of -the same type as the search contexts above. For example, to add `reddit`, -you'd do: +where `` is the name of the search context, and `` a URL of the same type as the search contexts +above. For example, to add `reddit`, you'd do: ```zsh ZSH_WEB_SEARCH_ENGINES=(reddit "https://www.reddit.com/search/?q=") ``` -These custom search engines will also be turned to aliases, so you can -both do `web_search reddit ` or `reddit `. +These custom search engines will also be turned to aliases, so you can both do `web_search reddit ` or +`reddit `. diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index fc87a349..a8848fd9 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -72,7 +72,6 @@ alias youtube='web_search youtube' #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 \!' From a17789eedea4f6b9b5a9c970174d6d5dc0ef64ee Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Mon, 25 Sep 2023 09:49:22 +0100 Subject: [PATCH 286/321] docs(git): improve tables and language (#11895) --- plugins/git/README.md | 463 +++++++++++++++++++++--------------------- 1 file changed, 231 insertions(+), 232 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 6eb63ea4..9621a312 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -10,204 +10,204 @@ plugins=(... git) ## Aliases -| Alias | Command | -| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| grt | cd "$(git rev-parse --show-toplevel || echo .)" | -| ggpnp | ggl && ggp | -| ggpur | ggu | -| g | git | -| ga | git add | -| gaa | git add --all | -| gapa | git add --patch | -| gau | git add --update | -| gav | git add --verbose | -| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]" | -| gam | git am | -| gama | git am --abort | -| gamc | git am --continue | -| gamscp | git am --show-current-patch | -| gams | git am --skip | -| gap | git apply | -| gapt | git apply --3way | -| gbs | git bisect | -| gbsb | git bisect bad | -| gbsg | git bisect good | -| gbsn | git bisect new | -| gbso | git bisect old | -| gbsr | git bisect reset | -| gbss | git bisect start | -| gbl | git blame -w | -| gb | git branch | -| gba | git branch --all | -| gbd | git branch --delete | -| gbD | git branch --delete --force | -| gbda | git branch --no-color --merged | grep -vE "^([+]|\s($(git_main_branch)|$(git_develop_branch))\s\*$)" | xargs git branch --delete 2>/dev/null | -| gbgd | LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d | -| gbgD | LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D | -| gbnm | git branch --no-merged | -| gbr | git branch --remote | -| ggsup | git branch --set-upstream-to=origin/$(git_current_branch) | -| gbg | LANG=C git branch -vv | grep ": gone\]" | -| gco | git checkout | -| gcor | git checkout --recurse-submodules | -| gcb | git checkout -b | -| gcd | git checkout $(git_develop_branch) | -| gcm | git checkout $(git_main_branch) | -| gcp | git cherry-pick | -| gcpa | git cherry-pick --abort | -| gcpc | git cherry-pick --continue | -| gclean | git clean --interactive -d | -| gcl | git clone --recurse-submodules | -| gccd | git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)" | -| gcam | git commit --all --message | -| gcas | git commit --all --signoff | -| gcasm | git commit --all --signoff --message | -| gcmsg | git commit --message | -| gcsm | git commit --signoff --message | -| gc | git commit --verbose | -| gca | git commit --verbose --all | -| gca! | git commit --verbose --all --amend | -| gcan! | git commit --verbose --all --no-edit --amend | -| gcans! | git commit --verbose --all --signoff --no-edit --amend | -| gc! | git commit --verbose --amend | -| gcn! | git commit --verbose --no-edit --amend | -| gcs | git commit -S | -| gcss | git commit -S -s | -| gcssm | git commit -S -s -m | -| gcf | git config --list | -| gdct | git describe --tags $(git rev-list --tags --max-count=1) | -| gd | git diff | -| gdca | git diff --cached | -| gdcw | git diff --cached --word-diff | -| gds | git diff --staged | -| gdw | git diff --word-diff | -| gdv | git diff -w $@ | view - | -| gdup | git diff @{upstream} | -| gdnolock | git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock" | -| gdt | git diff-tree --no-commit-id --name-only -r | -| gf | git fetch | -| gfa | git fetch --all --prune | -| gfo | git fetch origin | -| gg | git gui citool | -| gga | git gui citool --amend | -| ghh | git help | -| glgg | git log --graph | -| glgga | git log --graph --decorate --all | -| glgm | git log --graph --max-count=10 | -| glod | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' | -| glods | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short | -| glol | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' | -| glola | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all | -| glols | git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat | -| glo | git log --oneline --decorate | -| glog | git log --oneline --decorate --graph | -| gloga | git log --oneline --decorate --graph --all | -| glp | git log --pretty=\ | -| glg | git log --stat | -| glgp | git log --stat --patch | -| gignored | git ls-files -v | grep "^[[:lower:]]" | -| gfg | git ls-files | grep | -| gm | git merge | -| gma | git merge --abort | -| gms | git merge --squash | -| gmom | git merge origin/$(git_main_branch) | -| gmum | git merge upstream/$(git_main_branch) | -| gmtl | git mergetool --no-prompt | -| gmtlvim | git mergetool --no-prompt --tool=vimdiff | -| gl | git pull | -| gpr | git pull --rebase | -| gup | git pull --rebase | -| gupa | git pull --rebase --autostash | -| gupav | git pull --rebase --autostash --verbose | -| gupv | git pull --rebase --verbose | -| ggu | git pull --rebase origin $(current_branch) | -| gupom | git pull --rebase origin $(git_main_branch) | -| gupomi | git pull --rebase=interactive origin $(git_main_branch) | -| ggpull | git pull origin "$(git_current_branch)" | -| ggl | git pull origin $(current_branch) | -| gluc | git pull upstream $(git_current_branch) | -| glum | git pull upstream $(git_main_branch) | -| gp | git push | -| gpd | git push --dry-run | -| gpf! | git push --force | -| ggf | git push --force origin $(current_branch) | -| gpf | git push --force-with-lease --force-if-includes (git version >= 2.30) | -| gpf | git push --force-with-lease (git version < 2.30) | -| ggfl | git push --force-with-lease origin $(current_branch) | -| gpsup | git push --set-upstream origin $(git_current_branch) | -| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes (git version >= 2.30) | -| gpsupf | git push --set-upstream origin $(git_current_branch) --force-with-lease (git version < 2.30) | -| gpv | git push --verbose | -| gpoat | git push origin --all && git push origin --tags | -| gpod | git push origin --delete | -| ggpush | git push origin "$(git_current_branch)" | -| ggp | git push origin $(current_branch) | -| gpu | git push upstream | -| grb | git rebase | -| grba | git rebase --abort | -| grbc | git rebase --continue | -| grbi | git rebase --interactive | -| grbo | git rebase --onto | -| grbs | git rebase --skip | -| grbd | git rebase $(git_develop_branch) | -| grbm | git rebase $(git_main_branch) | -| grbom | git rebase origin/$(git_main_branch) | -| gr | git remote | -| grv | git remote --verbose | -| gra | git remote add | -| grrm | git remote remove | -| grmv | git remote rename | -| grset | git remote set-url | -| grup | git remote update | -| grh | git reset | -| gru | git reset -- | -| grhh | git reset --hard | -| gpristine | git reset --hard && git clean -dffx | -| groh | git reset origin/$(git_current_branch) --hard | -| grs | git restore | -| grss | git restore --source | -| grst | git restore --staged | -| gunwip | git rev-list --max-count=1 --format="%s" HEAD | grep -q "--wip--" && git reset HEAD~1 | -| grev | git revert | -| grm | git rm | -| grmc | git rm --cached | -| gcount | git shortlog --summary -n | -| gsh | git show | -| gsps | git show --pretty=short --show-signature | -| gstall | git stash --all | -| gstu | git stash --include-untracked | -| gstaa | git stash apply | -| gstc | git stash clear | -| gstd | git stash drop | -| gstl | git stash list | -| gstp | git stash pop | -| gsta | git stash push (git version >= 2.13) | -| gsta | git stash save (git version < 2.13) | -| gsts | git stash show --text | -| gst | git status | -| gss | git status --short | -| gsb | git status --short -b | -| gsi | git submodule init | -| gsu | git submodule update | -| gsd | git svn dcommit | -| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk | -| gsr | git svn rebase | -| gsw | git switch | -| gswc | git switch -c | -| gswd | git switch $(git_develop_branch) | -| gswm | git switch $(git_main_branch) | -| gts | git tag -s | -| gtv | git tag | sort -V | -| gignore | git update-index --assume-unchanged | -| gunignore | git update-index --no-assume-unchanged | -| gwch | git whatchanged -p --abbrev-commit --pretty=medium | -| gwt | git worktree | -| gwtls | git worktree list | -| gwtmv | git worktree move | -| gwtrm | git worktree remove | -| gk | gitk --all --branches &! | -| gke | gitk --all $(git log --walk-reflogs --pretty=%h) &! | -| gtl | gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl | +| Alias | Command | +| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `grt` | `cd "$(git rev-parse --show-toplevel \|\| echo .)"` | +| `ggpnp` | `ggl && ggp` | +| `ggpur` | `ggu` | +| `g` | `git` | +| `ga` | `git add` | +| `gaa` | `git add --all` | +| `gapa` | `git add --patch` | +| `gau` | `git add --update` | +| `gav` | `git add --verbose` | +| `gwip` | `git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign --message "--wip-- [skip ci]"` | +| `gam` | `git am` | +| `gama` | `git am --abort` | +| `gamc` | `git am --continue` | +| `gamscp` | `git am --show-current-patch` | +| `gams` | `git am --skip` | +| `gap` | `git apply` | +| `gapt` | `git apply --3way` | +| `gbs` | `git bisect` | +| `gbsb` | `git bisect bad` | +| `gbsg` | `git bisect good` | +| `gbsn` | `git bisect new` | +| `gbso` | `git bisect old` | +| `gbsr` | `git bisect reset` | +| `gbss` | `git bisect start` | +| `gbl` | `git blame -w` | +| `gb` | `git branch` | +| `gba` | `git branch --all` | +| `gbd` | `git branch --delete` | +| `gbD` | `git branch --delete --force` | +| `gbda` | `git branch --no-color --merged \| command grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| command xargs git branch --delete 2>/dev/null` | +| `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` | +| `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` | +| `gbnm` | `git branch --no-merged` | +| `gbr` | `git branch --remote` | +| `ggsup` | `git branch --set-upstream-to=origin/$(git_current_branch)` | +| `gbg` | `LANG=C git branch -vv \| grep ": gone\]"` | +| `gco` | `git checkout` | +| `gcor` | `git checkout --recurse-submodules` | +| `gcb` | `git checkout -b` | +| `gcd` | `git checkout $(git_develop_branch)` | +| `gcm` | `git checkout $(git_main_branch)` | +| `gcp` | `git cherry-pick` | +| `gcpa` | `git cherry-pick --abort` | +| `gcpc` | `git cherry-pick --continue` | +| `gclean` | `git clean --interactive -d` | +| `gcl` | `git clone --recurse-submodules` | +| `gccd` | `git clone --recurse-submodules "$@" && cd "$(basename $\_ .git)"` | +| `gcam` | `git commit --all --message` | +| `gcas` | `git commit --all --signoff` | +| `gcasm` | `git commit --all --signoff --message` | +| `gcmsg` | `git commit --message` | +| `gcsm` | `git commit --signoff --message` | +| `gc` | `git commit --verbose` | +| `gca` | `git commit --verbose --all` | +| `gca!` | `git commit --verbose --all --amend` | +| `gcan!` | `git commit --verbose --all --no-edit --amend` | +| `gcans!` | `git commit --verbose --all --signoff --no-edit --amend` | +| `gc!` | `git commit --verbose --amend` | +| `gcn!` | `git commit --verbose --no-edit --amend` | +| `gcs` | `git commit -S` | +| `gcss` | `git commit -S -s` | +| `gcssm` | `git commit -S -s -m` | +| `gcf` | `git config --list` | +| `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` | +| `gd` | `git diff` | +| `gdca` | `git diff --cached` | +| `gdcw` | `git diff --cached --word-diff` | +| `gds` | `git diff --staged` | +| `gdw` | `git diff --word-diff` | +| `gdv` | `git diff -w "$@" \| view -` | +| `gdup` | `git diff @{upstream}` | +| `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` | +| `gdt` | `git diff-tree --no-commit-id --name-only -r` | +| `gf` | `git fetch` | +| `gfa` | `git fetch --all --prune` | +| `gfo` | `git fetch origin` | +| `gg` | `git gui citool` | +| `gga` | `git gui citool --amend` | +| `ghh` | `git help` | +| `glgg` | `git log --graph` | +| `glgga` | `git log --graph --decorate --all` | +| `glgm` | `git log --graph --max-count=10` | +| `glod` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset'` | +| `glods` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short` | +| `glol` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` | +| `glola` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all` | +| `glols` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat` | +| `glo` | `git log --oneline --decorate` | +| `glog` | `git log --oneline --decorate --graph` | +| `gloga` | `git log --oneline --decorate --graph --all` | +| `glp` | `git log --pretty=` | +| `glg` | `git log --stat` | +| `glgp` | `git log --stat --patch` | +| `gignored` | `git ls-files -v \| grep "^[[:lower:]]"` | +| `gfg` | `git ls-files \| grep` | +| `gm` | `git merge` | +| `gma` | `git merge --abort` | +| `gms` | `git merge --squash` | +| `gmom` | `git merge origin/$(git_main_branch)` | +| `gmum` | `git merge upstream/$(git_main_branch)` | +| `gmtl` | `git mergetool --no-prompt` | +| `gmtlvim` | `git mergetool --no-prompt --tool=vimdiff` | +| `gl` | `git pull` | +| `gpr` | `git pull --rebase` | +| `gup` | `git pull --rebase` | +| `gupa` | `git pull --rebase --autostash` | +| `gupav` | `git pull --rebase --autostash --verbose` | +| `gupv` | `git pull --rebase --verbose` | +| `ggu` | `git pull --rebase origin $(current_branch)` | +| `gupom` | `git pull --rebase origin $(git_main_branch)` | +| `gupomi` | `git pull --rebase=interactive origin $(git_main_branch)` | +| `ggpull` | `git pull origin "$(git_current_branch)"` | +| `ggl` | `git pull origin $(current_branch)` | +| `gluc` | `git pull upstream $(git_current_branch)` | +| `glum` | `git pull upstream $(git_main_branch)` | +| `gp` | `git push` | +| `gpd` | `git push --dry-run` | +| `gpf!` | `git push --force` | +| `ggf` | `git push --force origin $(current_branch)` | +| `gpf` | On Git >= 2.30: `git push --force-with-lease --force-if-includes` | +| `gpf` | On Git < 2.30: `git push --force-with-lease` | +| `ggfl` | `git push --force-with-lease origin $(current_branch)` | +| `gpsup` | `git push --set-upstream origin $(git_current_branch)` | +| `gpsupf` | On Git >= 2.30: `git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes` | +| `gpsupf` | On Git < 2.30: `git push --set-upstream origin $(git_current_branch) --force-with-lease` | +| `gpv` | `git push --verbose` | +| `gpoat` | `git push origin --all && git push origin --tags` | +| `gpod` | `git push origin --delete` | +| `ggpush` | `git push origin "$(git_current_branch)"` | +| `ggp` | `git push origin $(current_branch)` | +| `gpu` | `git push upstream` | +| `grb` | `git rebase` | +| `grba` | `git rebase --abort` | +| `grbc` | `git rebase --continue` | +| `grbi` | `git rebase --interactive` | +| `grbo` | `git rebase --onto` | +| `grbs` | `git rebase --skip` | +| `grbd` | `git rebase $(git_develop_branch)` | +| `grbm` | `git rebase $(git_main_branch)` | +| `grbom` | `git rebase origin/$(git_main_branch)` | +| `gr` | `git remote` | +| `grv` | `git remote --verbose` | +| `gra` | `git remote add` | +| `grrm` | `git remote remove` | +| `grmv` | `git remote rename` | +| `grset` | `git remote set-url` | +| `grup` | `git remote update` | +| `grh` | `git reset` | +| `gru` | `git reset --` | +| `grhh` | `git reset --hard` | +| `gpristine` | `git reset --hard && git clean -dffx` | +| `groh` | `git reset origin/$(git_current_branch) --hard` | +| `grs` | `git restore` | +| `grss` | `git restore --source` | +| `grst` | `git restore --staged` | +| `gunwip` | `git rev-list --max-count=1 --format="%s" HEAD \| grep -q "--wip--" && git reset HEAD~1` | +| `grev` | `git revert` | +| `grm` | `git rm` | +| `grmc` | `git rm --cached` | +| `gcount` | `git shortlog --summary -n` | +| `gsh` | `git show` | +| `gsps` | `git show --pretty=short --show-signature` | +| `gstall` | `git stash --all` | +| `gstu` | `git stash --include-untracked` | +| `gstaa` | `git stash apply` | +| `gstc` | `git stash clear` | +| `gstd` | `git stash drop` | +| `gstl` | `git stash list` | +| `gstp` | `git stash pop` | +| `gsta` | On Git >= 2.13: `git stash push` | +| `gsta` | On Git < 2.13: `git stash save` | +| `gsts` | `git stash show --text` | +| `gst` | `git status` | +| `gss` | `git status --short` | +| `gsb` | `git status --short -b` | +| `gsi` | `git submodule init` | +| `gsu` | `git submodule update` | +| `gsd` | `git svn dcommit` | +| `git-svn-dcommit-push` | `git svn dcommit && git push github $(git_main_branch):svntrunk` | +| `gsr` | `git svn rebase` | +| `gsw` | `git switch` | +| `gswc` | `git switch -c` | +| `gswd` | `git switch $(git_develop_branch)` | +| `gswm` | `git switch $(git_main_branch)` | +| `gts` | `git tag -s` | +| `gtv` | `git tag \| sort -V` | +| `gignore` | `git update-index --assume-unchanged` | +| `gunignore` | `git update-index --no-assume-unchanged` | +| `gwch` | `git whatchanged -p --abbrev-commit --pretty=medium` | +| `gwt` | `git worktree` | +| `gwtls` | `git worktree list` | +| `gwtmv` | `git worktree move` | +| `gwtrm` | `git worktree remove` | +| `gk` | `gitk --all --branches &!` | +| `gke` | `gitk --all $(git log --walk-reflogs --pretty=%h) &!` | +| `gtl` | `gtl(){ git tag --sort=-v:refname -n --list ${1}\* }; noglob gtl` | ### Main branch preference @@ -221,50 +221,49 @@ branch exists. We do this via the function `git_main_branch`. These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not, receive further support. -| Alias | Command | Modification | -| :----- | :----------------------------------------------------- | :----------------------------------------------------- | -| gap | `git add --patch` | new alias `gapa` | -| gcl | `git config --list` | new alias `gcf` | -| gdc | `git diff --cached` | new alias `gdca` | -| gdt | `git difftool` | no replacement | -| ggpull | `git pull origin $(current_branch)` | new alias `ggl` (`ggpull` still exists for now though) | -| ggpur | `git pull --rebase origin $(current_branch)` | new alias `ggu` (`ggpur` still exists for now though) | -| ggpush | `git push origin $(current_branch)` | new alias `ggp` (`ggpush` still exists for now though) | -| gk | `gitk --all --branches` | now aliased to `gitk --all --branches` | -| glg | `git log --stat --max-count = 10` | now aliased to `git log --stat --color` | -| glgg | `git log --graph --max-count = 10` | now aliased to `git log --graph --color` | -| gwc | `git whatchanged -p --abbrev-commit --pretty = medium` | new alias `gwch` | +| Alias | Command | Modification | +| :------- | :----------------------------------------------------- | :-------------------------------------------------------- | +| `gap` | `git add --patch` | New alias: `gapa`. | +| `gcl` | `git config --list` | New alias: `gcf`. | +| `gdc` | `git diff --cached` | New alias: `gdca`. | +| `gdt` | `git difftool` | No replacement. | +| `ggpull` | `git pull origin $(current_branch)` | New alias: `ggl`. (`ggpull` still exists for now though.) | +| `ggpur` | `git pull --rebase origin $(current_branch)` | New alias: `ggu`. (`ggpur` still exists for now though.) | +| `ggpush` | `git push origin $(current_branch)` | New alias: `ggp`. (`ggpush` still exists for now though.) | +| `gk` | `gitk --all --branches` | Now aliased to `gitk --all --branches`. | +| `glg` | `git log --stat --max-count=10` | Now aliased to `git log --stat --color`. | +| `glgg` | `git log --graph --max-count=10` | Now aliased to `git log --graph --color`. | +| `gwc` | `git whatchanged -p --abbrev-commit --pretty = medium` | New alias: `gwch`. | ## Functions ### Current -| Command | Description | -| :--------------------- | :------------------------------------------------------------------------------------------------------- | -| current_branch | Return the name of the current branch | -| git_current_user_email | Returns the `user.email` config value (lives in lib/git.zsh) | -| git_current_user_name | Returns the `user.name` config value (lives in lib/git.zsh) | -| git_develop_branch | Returns the name of the develop branch: `dev`, `devel`, `development` if they exist, `develop` otherwise | -| git_main_branch | Returns the name of the main branch: `main` if it exists, `master` otherwise | -| grename \ \ | Rename `old` branch to `new`, including in origin remote | +| Command | Description | +| :----------------------- | :-------------------------------------------------------------------------------------------------------------- | +| `current_branch` | Returns the name of the current branch. | +| `git_current_user_email` | Returns the `user.email` config value. (Lives in `lib/git.zsh`.) | +| `git_current_user_name` | Returns the `user.name` config value. (Lives in `lib/git.zsh`.) | +| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. | +| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise. | +| `grename ` | Renames branch `` to ``, including on the origin remote. | ### Work in Progress (WIP) -These features allow to pause a branch development and switch to another one (_"Work in Progress"_, or wip). -When you want to go back to work, just unwip it. +These features allow you to pause developing one branch and switch to another one (_"Work in Progress"_, or +“wip”). When you want to go back to work, just “unwip” it. -| Command | Description | -| :--------------- | :---------------------------------------------- | -| gwip | Commit wip branch | -| gunwip | Uncommit wip branch | -| gunwipall | Uncommit all recent `--wip--` commits | -| work_in_progress | Echoes a warning if the current branch is a wip | +| Command | Description | +| :----------------- | :---------------------------------------------- | +| `gwip` | Commit wip branch | +| `gunwip` | Uncommit wip branch | +| `gunwipall` | Uncommit all recent `--wip--` commits | +| `work_in_progress` | Echoes a warning if the current branch is a wip | -Note that `gwip` and `gunwip` are effectivly alias, but are also documented here to group all related WIP -features. +Note that `gwip` and `gunwip` are aliases, but are also documented here to group all related WIP features. ### Deprecated functions -| Command | Description | Reason | -| :----------------- | :-------------------------------------- | :-------------------------------------------------------------- | -| current_repository | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias) | +| Command | Description | Reason | +| :------------------- | :-------------------------------------- | :--------------------------------------------------------------- | +| `current_repository` | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias). | From aaa74964a8f5908716f5bc8658116db096467702 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 Sep 2023 08:18:54 +0100 Subject: [PATCH 287/321] fix(git): remove `--text` from `gsts` (#11897) --- plugins/git/README.md | 2 +- plugins/git/git.plugin.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 9621a312..390f5200 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -183,7 +183,7 @@ plugins=(... git) | `gstp` | `git stash pop` | | `gsta` | On Git >= 2.13: `git stash push` | | `gsta` | On Git < 2.13: `git stash save` | -| `gsts` | `git stash show --text` | +| `gsts` | `git stash show` | | `gst` | `git status` | | `gss` | `git status --short` | | `gsb` | `git status --short -b` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 4afe34e9..426f5197 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -331,7 +331,7 @@ alias gstp='git stash pop' is-at-least 2.13 "$git_version" \ && alias gsta='git stash push' \ || alias gsta='git stash save' -alias gsts='git stash show --text' +alias gsts='git stash show' alias gst='git status' alias gss='git status --short' alias gsb='git status --short --branch' From bca62f78e23247afdc44882111a27a7333e5acb0 Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 Sep 2023 08:22:32 +0100 Subject: [PATCH 288/321] feat(git): add branch rename alias `gbm` (#11909) Co-authored-by: Gabriel Akinyosoye --- plugins/git/README.md | 1 + plugins/git/git.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 390f5200..e7c32e97 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -44,6 +44,7 @@ plugins=(... git) | `gbda` | `git branch --no-color --merged \| command grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| command xargs git branch --delete 2>/dev/null` | | `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` | | `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` | +| `gbm` | `git branch --move` | | `gbnm` | `git branch --no-merged` | | `gbr` | `git branch --remote` | | `ggsup` | `git branch --set-upstream-to=origin/$(git_current_branch)` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 426f5197..01eab682 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -125,6 +125,7 @@ alias gbD='git branch --delete --force' alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' +alias gbm='git branch --move' alias gbnm='git branch --no-merged' alias gbr='git branch --remote' alias ggsup='git branch --set-upstream-to=origin/$(git_current_branch)' From e2b855341bfd587590734da860d75ead7788810f Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 Sep 2023 08:27:48 +0100 Subject: [PATCH 289/321] feat(git): add tag aliases `gt` and `gta` (#11910) Co-authored-by: hasecilu Co-authored-by: Rik Co-authored-by: Carlo Sala --- plugins/git/README.md | 2 ++ plugins/git/git.plugin.zsh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index e7c32e97..5a732ed6 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -197,6 +197,8 @@ plugins=(... git) | `gswc` | `git switch -c` | | `gswd` | `git switch $(git_develop_branch)` | | `gswm` | `git switch $(git_main_branch)` | +| `gt` | `git tag` | +| `gta` | `git tag --annotate` | | `gts` | `git tag -s` | | `gtv` | `git tag \| sort -V` | | `gignore` | `git update-index --assume-unchanged` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 01eab682..527093c2 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -345,6 +345,8 @@ alias gsw='git switch' alias gswc='git switch --create' alias gswd='git switch $(git_develop_branch)' alias gswm='git switch $(git_main_branch)' +alias gt='git tag' +alias gta='git tag --annotate' alias gts='git tag --sign' alias gtv='git tag | sort -V' alias gignore='git update-index --assume-unchanged' From 4fb5d02db94fa87d22afea9825bd5f866e0cd1ac Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 26 Sep 2023 08:31:32 +0100 Subject: [PATCH 290/321] feat(git): add reset aliases `grhk` and `grhs` (#11896) --- plugins/git/README.md | 2 ++ plugins/git/git.plugin.zsh | 2 ++ 2 files changed, 4 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 5a732ed6..5b2db55f 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -163,6 +163,8 @@ plugins=(... git) | `grh` | `git reset` | | `gru` | `git reset --` | | `grhh` | `git reset --hard` | +| `grhk` | `git reset --keep` | +| `grhs` | `git reset --soft` | | `gpristine` | `git reset --hard && git clean -dffx` | | `groh` | `git reset origin/$(git_current_branch) --hard` | | `grs` | `git restore` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 527093c2..ba90c936 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -310,6 +310,8 @@ alias grup='git remote update' alias grh='git reset' alias gru='git reset --' alias grhh='git reset --hard' +alias grhk='git reset --keep' +alias grhs='git reset --soft' alias gpristine='git reset --hard && git clean --force -dfx' alias groh='git reset origin/$(git_current_branch) --hard' alias grs='git restore' From 0e1e877ea9182f87b3ab34cbc2ea944b34f5345e Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 27 Sep 2023 08:19:57 +0200 Subject: [PATCH 291/321] fix(git)!: remove `gt` alias BREAKING CHANGE: `gt` alias clashes with Graphite CLI (https://graphite.dev). See https://github.com/ohmyzsh/ohmyzsh/pull/11910#issuecomment-1736340910 --- plugins/git/README.md | 1 - plugins/git/git.plugin.zsh | 1 - 2 files changed, 2 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 5b2db55f..9c16cb6e 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -199,7 +199,6 @@ plugins=(... git) | `gswc` | `git switch -c` | | `gswd` | `git switch $(git_develop_branch)` | | `gswm` | `git switch $(git_main_branch)` | -| `gt` | `git tag` | | `gta` | `git tag --annotate` | | `gts` | `git tag -s` | | `gtv` | `git tag \| sort -V` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index ba90c936..cb848b40 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -347,7 +347,6 @@ alias gsw='git switch' alias gswc='git switch --create' alias gswd='git switch $(git_develop_branch)' alias gswm='git switch $(git_main_branch)' -alias gt='git tag' alias gta='git tag --annotate' alias gts='git tag --sign' alias gtv='git tag | sort -V' From d3b6f1fd5e42deafb3a6458213762a492e484073 Mon Sep 17 00:00:00 2001 From: Piotr Minkina Date: Thu, 28 Sep 2023 23:43:06 +0200 Subject: [PATCH 292/321] fix(gradle): remove look for settings.gradle files (#11917) --- plugins/gradle/gradle.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gradle/gradle.plugin.zsh b/plugins/gradle/gradle.plugin.zsh index 5bca364d..dacc4647 100644 --- a/plugins/gradle/gradle.plugin.zsh +++ b/plugins/gradle/gradle.plugin.zsh @@ -6,7 +6,7 @@ function gradle-or-gradlew() { # taken from https://github.com/gradle/gradle-completion local dir="$PWD" project_root="$PWD" while [[ "$dir" != / ]]; do - if [[ -f "$dir/settings.gradle" || -f "$dir/settings.gradle.kts" || -f "$dir/gradlew" ]]; then + if [[ -x "$dir/gradlew" ]]; then project_root="$dir" break fi From 27402e2603b9354f419af3695bad8ff17ed33bac Mon Sep 17 00:00:00 2001 From: Jake Conway Date: Fri, 29 Sep 2023 05:24:40 -0500 Subject: [PATCH 293/321] docs(gas): update plugin url (#11918) --- plugins/gas/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/gas/README.md b/plugins/gas/README.md index 47b3fb9d..a0a7a568 100644 --- a/plugins/gas/README.md +++ b/plugins/gas/README.md @@ -1,6 +1,6 @@ # Gas plugin -This plugin adds autocompletion for the [gas](http://walle.github.com/gas) command, +This plugin adds autocompletion for the [gas](http://ramblingsby.me/gas/) command, a utility to manage Git authors. To use it, add `gas` to the plugins array of your zshrc file: From 278bcfc93bed91d1095a9ea7981c4a1109da7abd Mon Sep 17 00:00:00 2001 From: Thomas Faugier Date: Mon, 2 Oct 2023 20:25:17 +0200 Subject: [PATCH 294/321] feat(asdf): load zsh completions instead of bash ones Closes #11143 Closes #8779 Co-authored-by: Carlo Sala --- plugins/asdf/asdf.plugin.zsh | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/plugins/asdf/asdf.plugin.zsh b/plugins/asdf/asdf.plugin.zsh index 3016282c..7635d20c 100644 --- a/plugins/asdf/asdf.plugin.zsh +++ b/plugins/asdf/asdf.plugin.zsh @@ -2,26 +2,29 @@ ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}" ASDF_COMPLETIONS="$ASDF_DIR/completions" -# If not found, check for archlinux/AUR package (/opt/asdf-vm/) -if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/asdf.bash" ]] && [[ -f "/opt/asdf-vm/asdf.sh" ]]; then - ASDF_DIR="/opt/asdf-vm" - ASDF_COMPLETIONS="$ASDF_DIR" -fi - -# If not found, check for Homebrew package -if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/asdf.bash" ]] && (( $+commands[brew] )); then - brew_prefix="$(brew --prefix asdf)" - ASDF_DIR="${brew_prefix}/libexec" - ASDF_COMPLETIONS="${brew_prefix}/etc/bash_completion.d" - unset brew_prefix +if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/_asdf" ]]; then + # If not found, check for archlinux/AUR package (/opt/asdf-vm/) + if [[ -f "/opt/asdf-vm/asdf.sh" ]]; then + ASDF_DIR="/opt/asdf-vm" + ASDF_COMPLETIONS="$ASDF_DIR" + # If not found, check for Homebrew package + elif (( $+commands[brew] )); then + _ASDF_PREFIX="$(brew --prefix asdf)" + ASDF_DIR="${_ASDF_PREFIX}/libexec" + ASDF_COMPLETIONS="${_ASDF_PREFIX}/share/zsh/site-functions" + unset _ASDF_PREFIX + else + return + fi fi # Load command if [[ -f "$ASDF_DIR/asdf.sh" ]]; then - . "$ASDF_DIR/asdf.sh" - + source "$ASDF_DIR/asdf.sh" # Load completions - if [[ -f "$ASDF_COMPLETIONS/asdf.bash" ]]; then - . "$ASDF_COMPLETIONS/asdf.bash" + if [[ -f "$ASDF_COMPLETIONS/_asdf" ]]; then + fpath+=("$ASDF_COMPLETIONS") + autoload -Uz _asdf + compdef _asdf asdf # compdef is already loaded before loading plugins fi fi From fea4584cebf98fc58334b7cca841ab1ef224a35e Mon Sep 17 00:00:00 2001 From: HeroCC Date: Mon, 2 Oct 2023 14:34:57 -0400 Subject: [PATCH 295/321] fix(tmux): don't autostart inside background intelliJ (#11927) --- plugins/tmux/tmux.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 680f7259..6ed91c44 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -109,7 +109,7 @@ compdef _tmux _zsh_tmux_plugin_run alias tmux=_zsh_tmux_plugin_run # Autostart if not already in tmux and enabled. -if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" ]]; then +if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" && -z "$INTELLIJ_ENVIRONMENT_READER" ]]; then # Actually don't autostart if we already did and multiple autostarts are disabled. if [[ "$ZSH_TMUX_AUTOSTART_ONCE" == "false" || "$ZSH_TMUX_AUTOSTARTED" != "true" ]]; then export ZSH_TMUX_AUTOSTARTED=true From df80a2da5475fc3c068bc5f700fa176a47f7adbe Mon Sep 17 00:00:00 2001 From: bretello Date: Mon, 2 Oct 2023 20:41:01 +0200 Subject: [PATCH 296/321] feat(vi-mode): copy to clipboard when using `vi-change*` and `vi-yank*` widgets (#11861) --- plugins/vi-mode/README.md | 6 ++++++ plugins/vi-mode/vi-mode.plugin.zsh | 11 +++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md index 0cb51675..821c12ad 100644 --- a/plugins/vi-mode/README.md +++ b/plugins/vi-mode/README.md @@ -144,11 +144,17 @@ NOTE: this used to be bound to `v`. That is now the default (`visual-mode`). - `c{motion}` : Delete {motion} text and start insert - `cc` : Delete line and start insert - `C` : Delete to the end of the line and start insert +- `P` : Insert the contents of the clipboard before the cursor +- `p` : Insert the contents of the clipboard after the cursor - `r{char}` : Replace the character under the cursor with {char} - `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 +NOTE: delete/kill commands (`dd`, `D`, `c{motion}`, `C`, `x`,`X`) and yank commands +(`y`, `Y`) will copy to the clipboard. Contents can then be put back using paste commands +(`P`, `p`). + ## Known issues ### Low `$KEYTIMEOUT` diff --git a/plugins/vi-mode/vi-mode.plugin.zsh b/plugins/vi-mode/vi-mode.plugin.zsh index cc9817a7..d1493e02 100644 --- a/plugins/vi-mode/vi-mode.plugin.zsh +++ b/plugins/vi-mode/vi-mode.plugin.zsh @@ -147,8 +147,15 @@ function wrap_clipboard_widgets() { done } -wrap_clipboard_widgets copy vi-yank vi-yank-eol vi-backward-kill-word vi-change-whole-line vi-delete vi-delete-char -wrap_clipboard_widgets paste vi-put-{before,after} +wrap_clipboard_widgets copy \ + vi-yank vi-yank-eol vi-yank-whole-line \ + vi-change vi-change-eol vi-change-whole-line \ + vi-kill-line vi-kill-eol vi-backward-kill-word \ + vi-delete vi-delete-char vi-backward-delete-char + +wrap_clipboard_widgets paste \ + vi-put-{before,after} + unfunction wrap_clipboard_widgets # if mode indicator wasn't setup by theme, define default, we'll leave INSERT_MODE_INDICATOR empty by default From 7400d469b67e2e72a6405df39c5f28cba646e1a8 Mon Sep 17 00:00:00 2001 From: jack Date: Tue, 3 Oct 2023 02:41:18 +0800 Subject: [PATCH 297/321] fix(ruby): add missing `-run` in `rserver` alias (#11913) --- plugins/ruby/ruby.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ruby/ruby.plugin.zsh b/plugins/ruby/ruby.plugin.zsh index 40851211..e09b22c7 100644 --- a/plugins/ruby/ruby.plugin.zsh +++ b/plugins/ruby/ruby.plugin.zsh @@ -23,4 +23,4 @@ alias gel="gem lock" alias geo="gem open" alias geoe="gem open -e" alias rrun="ruby -e" -alias rserver="ruby -e httpd . -p 8080" # requires webrick +alias rserver="ruby -run -e httpd . -p 8080" # requires webrick From f36c6db0eac17b022eee87411e6996a5f5fc8457 Mon Sep 17 00:00:00 2001 From: Abhinav Date: Tue, 3 Oct 2023 00:28:42 +0530 Subject: [PATCH 298/321] feat(shell-proxy): allow excluding endpoints with `NO_PROXY` (#11924) --- plugins/shell-proxy/README.md | 5 +++++ plugins/shell-proxy/proxy.py | 23 +++++++++++++++++----- plugins/shell-proxy/shell-proxy.plugin.zsh | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/plugins/shell-proxy/README.md b/plugins/shell-proxy/README.md index b19888c5..102e46b6 100644 --- a/plugins/shell-proxy/README.md +++ b/plugins/shell-proxy/README.md @@ -23,6 +23,7 @@ Set `SHELLPROXY_URL` environment variable to the URL of the proxy server: ```sh SHELLPROXY_URL="http://127.0.0.1:8123" +SHELLPROXY_NO_PROXY="localhost,127.0.0.1" proxy enable ``` @@ -36,11 +37,15 @@ Example: ```sh #!/bin/bash +# HTTP Proxy if [[ "$(uname)" = Darwin ]]; then echo "http://127.0.0.1:6152" # Surge Mac else echo "http://127.0.0.1:8123" # polipo fi + +# No Proxy +echo "localhost,127.0.0.1" ``` ### Method 3 diff --git a/plugins/shell-proxy/proxy.py b/plugins/shell-proxy/proxy.py index 14f2944c..8c2aaf9f 100755 --- a/plugins/shell-proxy/proxy.py +++ b/plugins/shell-proxy/proxy.py @@ -6,6 +6,7 @@ from subprocess import check_output, list2cmdline cwd = os.path.dirname(__file__) ssh_agent = os.path.join(cwd, "ssh-agent.py") proxy_env = "SHELLPROXY_URL" +no_proxy_env = "SHELLPROXY_NO_PROXY" proxy_config = os.environ.get("SHELLPROXY_CONFIG") or os.path.expandvars("$HOME/.config/proxy") usage="""shell-proxy: no proxy configuration found. @@ -15,18 +16,30 @@ See the plugin README for more information.""".format(env=proxy_env, config=prox def get_http_proxy(): default_proxy = os.environ.get(proxy_env) - if default_proxy: - return default_proxy + no_proxy = os.environ.get(no_proxy_env) + if default_proxy and no_proxy: + return default_proxy, no_proxy + if os.path.isfile(proxy_config): - return check_output(proxy_config).decode("utf-8").strip() + proxy_configdata = [line.strip() for line in check_output(proxy_config).decode("utf-8").splitlines()] + if len(proxy_configdata) >= 1: + if not default_proxy: + default_proxy = proxy_configdata[0] + if len(proxy_configdata) == 2 and not no_proxy: + no_proxy = proxy_configdata[1] + + if default_proxy: + return default_proxy, no_proxy print(usage, file=sys.stderr) sys.exit(1) -def make_proxies(url: str): +def make_proxies(url: str, no_proxy: str): proxies = {"%s_PROXY" % _: url for _ in ("HTTP", "HTTPS", "FTP", "RSYNC", "ALL")} proxies.update({name.lower(): value for (name, value) in proxies.items()}) proxies["GIT_SSH"] = ssh_agent + if no_proxy: + proxies.update({"NO_PROXY": no_proxy, "no_proxy": no_proxy}) return proxies @@ -35,7 +48,7 @@ def merge(mapping: dict): class CommandSet: - proxies = make_proxies(get_http_proxy()) + proxies = make_proxies(*get_http_proxy()) aliases = { _: "env __SSH_PROGRAM_NAME__=%s %s" % (_, ssh_agent) for _ in ("ssh", "sftp", "scp", "slogin", "ssh-copy-id") diff --git a/plugins/shell-proxy/shell-proxy.plugin.zsh b/plugins/shell-proxy/shell-proxy.plugin.zsh index 4fdbe932..f6c31da4 100644 --- a/plugins/shell-proxy/shell-proxy.plugin.zsh +++ b/plugins/shell-proxy/shell-proxy.plugin.zsh @@ -27,7 +27,7 @@ eval ' # capture the output of the proxy script and bail out if it fails local output - output="$(SHELLPROXY_URL="$SHELLPROXY_URL" SHELLPROXY_CONFIG="$SHELLPROXY_CONFIG" "$proxy" "$1")" || + output="$(SHELLPROXY_URL="$SHELLPROXY_URL" SHELLPROXY_NO_PROXY="$SHELLPROXY_NO_PROXY" SHELLPROXY_CONFIG="$SHELLPROXY_CONFIG" "$proxy" "$1")" || return $? # evaluate the output generated by the proxy script From 974055f638dac907cfb10281bce9cf998641febd Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Sun, 8 Oct 2023 13:47:16 +0200 Subject: [PATCH 299/321] Adding Mastadon and updating X badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a3059558..d915bd72 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,8 @@ Finally, you'll begin to get the sort of attention that you have always felt you To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter, and join us on [Discord](https://discord.gg/ohmyzsh). [![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI) -[![Follow @ohmyzsh](https://img.shields.io/twitter/follow/ohmyzsh?label=Follow+@ohmyzsh&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh) +![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?style=flat) +![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?domain=https%3A%2F%2Fmstdn.social&style=flat) [![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) [![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh) [![huntr.dev](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh) From ee857e3acf4beba9e3121bc8e776a048c46fa85f Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Sun, 8 Oct 2023 14:05:03 +0200 Subject: [PATCH 300/321] Adding operating system compatibility chart --- README.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d915bd72..70c4faaf 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,21 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi ## Getting Started +### Operating System Compatibility + +| O/S | Status | +| :---------------- | :------: | +| Android | ✅ | +| FreeBSD | ✅ | +| LCARS | 🛸 | +| Linux | ✅ | +| MacOS | ✅ | +| OS/2 Warp | ❌ | +| Windows (WSL2) | ✅ | + + ### Prerequisites -- A Unix-like operating system: macOS, Linux, BSD. On Windows: WSL2 is preferred, but cygwin or msys also mostly work. - [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent is fine but we prefer 5.0.8 and newer). If not pre-installed (run `zsh --version` to confirm), check the following wiki instructions here: [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH) - `curl` or `wget` should be installed - `git` should be installed (recommended v2.4.11 or higher) From 7105e37ef09ff890f7eca3e64d48b8b7ff94a494 Mon Sep 17 00:00:00 2001 From: DemonKiller <55846983+demonkillerr@users.noreply.github.com> Date: Sun, 8 Oct 2023 14:27:55 +0100 Subject: [PATCH 301/321] feat(rtx) Added new polyglot runtime manager (asdf rust clone) (#11932) * add readme.md for rtx * add rtx plugin * update install info * remove redundant slashes --- plugins/rtx/README.md | 30 ++++++++++++++++++++++++++++++ plugins/rtx/rtx.plugin.zsh | 30 ++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 plugins/rtx/README.md create mode 100644 plugins/rtx/rtx.plugin.zsh diff --git a/plugins/rtx/README.md b/plugins/rtx/README.md new file mode 100644 index 00000000..c6436d3a --- /dev/null +++ b/plugins/rtx/README.md @@ -0,0 +1,30 @@ +## rtx + + +Adds integration with [rtx](https://github.com/jdx/rtx), a runtime executor compatible with npm, nodenv, pyenv, etc. rtx is written in rust and is very fast. 20x-200x faster than asdf. With that being said, rtx is compatible with asdf plugins and .tool-versions files. It can be used as a drop-in replacement. + +### Installation + +1. [Download & install rtx](https://github.com/jdx/rtx#installation) by running the following: + + ``` + curl https://rtx.pub/install.sh | sh + ``` + + +2. [Enable rtx](https://github.com/jdx/rtx#quickstart) by adding it to your `plugins` definition in `~/.zshrc`. + + ``` + plugins=(rtx) + ``` + +### Usage + +See the [rtx readme](https://github.com/jdx/rtx#table-of-contents) for information on how to use rtx. Here are a few examples: + +``` +rtx install node Install the current version specified in .tool-versions/.rtx.toml +rtx use -g node@system Use system node as global default +rtx install node@20.0.0 Install a specific version number +rtx use -g node@20 Use node-20.x as global default +``` diff --git a/plugins/rtx/rtx.plugin.zsh b/plugins/rtx/rtx.plugin.zsh new file mode 100644 index 00000000..aaccaf01 --- /dev/null +++ b/plugins/rtx/rtx.plugin.zsh @@ -0,0 +1,30 @@ +# Find where rtx should be installed +RTX_DIR="${RTX_DIR:-$HOME/.rtx}" +RTX_COMPLETIONS="$RTX_DIR/completions" + +if [[ ! -f "$RTX_DIR/rtx.sh" || ! -f "$RTX_COMPLETIONS/_rtx" ]]; then + # If not found, check for archlinux/AUR package (/opt/rtx-vm/) + if [[ -f "/opt/rtx-vm/rtx.sh" ]]; then + RTX_DIR="/opt/rtx-vm" + RTX_COMPLETIONS="$RTX_DIR" + # If not found, check for Homebrew package + elif (( $+commands[brew] )); then + _RTX_PREFIX="$(brew --prefix rtx)" + RTX_DIR="${_RTX_PREFIX}/libexec" + RTX_COMPLETIONS="${_RTX_PREFIX}/share/zsh/site-functions" + unset _RTX_PREFIX + else + return + fi +fi + +# Load command +if [[ -f "$RTX_DIR/rtx.sh" ]]; then + source "$RTX_DIR/rtx.sh" + # Load completions + if [[ -f "$RTX_COMPLETIONS/_rtx" ]]; then + fpath+=("$RTX_COMPLETIONS") + autoload -Uz _rtx + compdef _rtx rtx # compdef is already loaded before loading plugins + fi +fi From b75b01a3092e59cd10ff01084d4a5e3ac0be3e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 8 Oct 2023 20:01:46 +0200 Subject: [PATCH 302/321] chore: update README badges --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 70c4faaf..c83e1621 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Finally, you'll begin to get the sort of attention that you have always felt you To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter, and join us on [Discord](https://discord.gg/ohmyzsh). [![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI) -![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?style=flat) -![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?domain=https%3A%2F%2Fmstdn.social&style=flat) +[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?label=%40ohmyzsh&logo=x&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh) +[![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh) [![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) [![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh) [![huntr.dev](https://cdn.huntr.dev/huntr_security_badge_mono.svg)](https://huntr.dev/bounties/disclose/?utm_campaign=ohmyzsh%2Fohmyzsh&utm_medium=social&utm_source=github&target=https%3A%2F%2Fgithub.com%2Fohmyzsh%2Fohmyzsh) From 30a8a5d3e2f36e395c439c3346ef96e40e7bd277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 9 Oct 2023 17:53:00 +0200 Subject: [PATCH 303/321] fix(rtx): fix `rtx` init procedure (#11949) --- plugins/rtx/rtx.plugin.zsh | 42 ++++++++++++++------------------------ 1 file changed, 15 insertions(+), 27 deletions(-) diff --git a/plugins/rtx/rtx.plugin.zsh b/plugins/rtx/rtx.plugin.zsh index aaccaf01..a01828af 100644 --- a/plugins/rtx/rtx.plugin.zsh +++ b/plugins/rtx/rtx.plugin.zsh @@ -1,30 +1,18 @@ -# Find where rtx should be installed -RTX_DIR="${RTX_DIR:-$HOME/.rtx}" -RTX_COMPLETIONS="$RTX_DIR/completions" - -if [[ ! -f "$RTX_DIR/rtx.sh" || ! -f "$RTX_COMPLETIONS/_rtx" ]]; then - # If not found, check for archlinux/AUR package (/opt/rtx-vm/) - if [[ -f "/opt/rtx-vm/rtx.sh" ]]; then - RTX_DIR="/opt/rtx-vm" - RTX_COMPLETIONS="$RTX_DIR" - # If not found, check for Homebrew package - elif (( $+commands[brew] )); then - _RTX_PREFIX="$(brew --prefix rtx)" - RTX_DIR="${_RTX_PREFIX}/libexec" - RTX_COMPLETIONS="${_RTX_PREFIX}/share/zsh/site-functions" - unset _RTX_PREFIX - else - return - fi +# rtx needs to be in $PATH +if (( ! ${+commands[rtx]} )); then + return fi -# Load command -if [[ -f "$RTX_DIR/rtx.sh" ]]; then - source "$RTX_DIR/rtx.sh" - # Load completions - if [[ -f "$RTX_COMPLETIONS/_rtx" ]]; then - fpath+=("$RTX_COMPLETIONS") - autoload -Uz _rtx - compdef _rtx rtx # compdef is already loaded before loading plugins - fi +# Load rtx hooks +eval "$(rtx activate zsh)" + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `rtx`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_rtx" ]]; then + typeset -g -A _comps + autoload -Uz _rtx + _comps[rtx]=_rtx fi + +# Generate and load rtx completion +rtx completion zsh >! "$ZSH_CACHE_DIR/completions/_rtx" &| From 29b99c2c7b16f22f3ca2bdf9478ba700ac6c48b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Mon, 9 Oct 2023 18:00:17 +0200 Subject: [PATCH 304/321] feat(updater): add `background-alpha` update mode (preview) (#11928) NOTE: this feature is in alpha / preview mode, it is not guaranteed to work 100% of the time in all cases. If you experience any issues, open an issue or search for an open one describing your same situation. To use this, use the zstyle update mode settings [1] with the value `background-alpha`: zstyle ':omz:update' mode background-alpha [1] https://github.com/ohmyzsh/ohmyzsh#getting-updates --- tools/check_for_upgrade.sh | 228 +++++++++++++++++++++++++------------ 1 file changed, 155 insertions(+), 73 deletions(-) diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index 3210e437..1cc193bd 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -9,6 +9,7 @@ fi # - prompt (default): the user is asked before updating when it's time to update # - auto: the update is performed automatically when it's time # - reminder: a reminder is shown to the user when it's time to update +# - background-alpha: an experimental update-on-the-background option # - disabled: automatic update is turned off zstyle -s ':omz:update' mode update_mode || { update_mode=prompt @@ -91,13 +92,37 @@ function is_update_available() { } function update_last_updated_file() { - echo "LAST_EPOCH=$(current_epoch)" >! "${ZSH_CACHE_DIR}/.zsh-update" + local exit_status="$1" error="$2" + + if [[ -z "${1}${2}" ]]; then + echo "LAST_EPOCH=$(current_epoch)" >! "${ZSH_CACHE_DIR}/.zsh-update" + return + fi + + cat >! "${ZSH_CACHE_DIR}/.zsh-update" <&1); then + update_last_updated_file 0 "Update successful" + else + exit_status=$? + update_last_updated_file $exit_status "$error" + return $exit_status fi } @@ -126,88 +151,145 @@ function has_typed_input() { } } -() { - emulate -L zsh +function handle_update() { + () { + emulate -L zsh - local epoch_target mtime option LAST_EPOCH + local epoch_target mtime option LAST_EPOCH - # Remove lock directory if older than a day - zmodload zsh/datetime - zmodload -F zsh/stat b:zstat - if mtime=$(zstat +mtime "$ZSH/log/update.lock" 2>/dev/null); then - if (( (mtime + 3600 * 24) < EPOCHSECONDS )); then - command rm -rf "$ZSH/log/update.lock" + # Remove lock directory if older than a day + zmodload zsh/datetime + zmodload -F zsh/stat b:zstat + if mtime=$(zstat +mtime "$ZSH/log/update.lock" 2>/dev/null); then + if (( (mtime + 3600 * 24) < EPOCHSECONDS )); then + command rm -rf "$ZSH/log/update.lock" + fi fi - fi - # Check for lock directory - if ! command mkdir "$ZSH/log/update.lock" 2>/dev/null; then - return - fi + # Check for lock directory + if ! command mkdir "$ZSH/log/update.lock" 2>/dev/null; then + return + fi - # Remove lock directory on exit. `return $ret` is important for when trapping a SIGINT: - # The return status from the function is handled specially. If it is zero, the signal is - # assumed to have been handled, and execution continues normally. Otherwise, the shell - # will behave as interrupted except that the return status of the trap is retained. - # This means that for a CTRL+C, the trap needs to return the same exit status so that - # the shell actually exits what it's running. - trap " - ret=\$? - unset update_mode - unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh 2>/dev/null - command rm -rf '$ZSH/log/update.lock' - return \$ret - " EXIT INT QUIT + # Remove lock directory on exit. `return $ret` is important for when trapping a SIGINT: + # The return status from the function is handled specially. If it is zero, the signal is + # assumed to have been handled, and execution continues normally. Otherwise, the shell + # will behave as interrupted except that the return status of the trap is retained. + # This means that for a CTRL+C, the trap needs to return the same exit status so that + # the shell actually exits what it's running. + trap " + ret=\$? + unset update_mode + unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh handle_update 2>/dev/null + command rm -rf '$ZSH/log/update.lock' + return \$ret + " EXIT INT QUIT - # Create or update .zsh-update file if missing or malformed - if ! source "${ZSH_CACHE_DIR}/.zsh-update" 2>/dev/null || [[ -z "$LAST_EPOCH" ]]; then - update_last_updated_file - return - fi + # Create or update .zsh-update file if missing or malformed + if ! source "${ZSH_CACHE_DIR}/.zsh-update" 2>/dev/null || [[ -z "$LAST_EPOCH" ]]; then + update_last_updated_file + return + fi - # Number of days before trying to update again - zstyle -s ':omz:update' frequency epoch_target || epoch_target=${UPDATE_ZSH_DAYS:-13} - # Test if enough time has passed until the next update - if (( ( $(current_epoch) - $LAST_EPOCH ) < $epoch_target )); then - return - fi + # Number of days before trying to update again + zstyle -s ':omz:update' frequency epoch_target || epoch_target=${UPDATE_ZSH_DAYS:-13} + # Test if enough time has passed until the next update + if (( ( $(current_epoch) - $LAST_EPOCH ) < $epoch_target )); then + return + fi - # Test if Oh My Zsh directory is a git repository - if ! (builtin cd -q "$ZSH" && LANG= git rev-parse &>/dev/null); then - echo >&2 "[oh-my-zsh] Can't update: not a git repository." - return - fi + # Test if Oh My Zsh directory is a git repository + if ! (builtin cd -q "$ZSH" && LANG= git rev-parse &>/dev/null); then + echo >&2 "[oh-my-zsh] Can't update: not a git repository." + return + fi - # Check if there are updates available before proceeding - if ! is_update_available; then - update_last_updated_file - return - fi + # Check if there are updates available before proceeding + if ! is_update_available; then + update_last_updated_file + return + fi - # If in reminder mode or user has typed input, show reminder and exit - if [[ "$update_mode" = reminder ]] || has_typed_input; then - printf '\r\e[0K' # move cursor to first column and clear whole line - echo "[oh-my-zsh] It's time to update! You can do that by running \`omz update\`" - return 0 - fi + # If in reminder mode or user has typed input, show reminder and exit + if [[ "$update_mode" = reminder ]] || { [[ "$update_mode" != background-alpha ]] && has_typed_input }; then + printf '\r\e[0K' # move cursor to first column and clear whole line + echo "[oh-my-zsh] It's time to update! You can do that by running \`omz update\`" + return 0 + fi - # Don't ask for confirmation before updating if in auto mode - if [[ "$update_mode" = auto ]]; then - update_ohmyzsh - return $? - fi + # Don't ask for confirmation before updating if in auto mode + if [[ "$update_mode" = (auto|background-alpha) ]]; then + update_ohmyzsh + return $? + fi - # Ask for confirmation and only update on 'y', 'Y' or Enter - # Otherwise just show a reminder for how to update - echo -n "[oh-my-zsh] Would you like to update? [Y/n] " - read -r -k 1 option - [[ "$option" = $'\n' ]] || echo - case "$option" in - [yY$'\n']) update_ohmyzsh ;; - [nN]) update_last_updated_file ;& - *) echo "[oh-my-zsh] You can update manually by running \`omz update\`" ;; - esac + # Ask for confirmation and only update on 'y', 'Y' or Enter + # Otherwise just show a reminder for how to update + echo -n "[oh-my-zsh] Would you like to update? [Y/n] " + read -r -k 1 option + [[ "$option" = $'\n' ]] || echo + case "$option" in + [yY$'\n']) update_ohmyzsh ;; + [nN]) update_last_updated_file ;& + *) echo "[oh-my-zsh] You can update manually by running \`omz update\`" ;; + esac + } + + unset update_mode + unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh handle_update } -unset update_mode -unset -f current_epoch is_update_available update_last_updated_file update_ohmyzsh +case "$update_mode" in + background-alpha) + autoload -Uz add-zsh-hook + + _omz_bg_update() { + # do the update in a subshell + (handle_update) &| + + # register update results function + add-zsh-hook precmd _omz_bg_update_status + + # deregister background function + add-zsh-hook -d precmd _omz_bg_update + unset -f _omz_bg_update + } + + _omz_bg_update_status() { + { + local LAST_EPOCH EXIT_STATUS ERROR + if [[ ! -f "$ZSH_CACHE_DIR"/.zsh-update ]]; then + return 1 + fi + + # check update results until timeout is reached + . "$ZSH_CACHE_DIR/.zsh-update" + if [[ -z "$EXIT_STATUS" || -z "$ERROR" ]]; then + return 1 + fi + + if [[ "$EXIT_STATUS" -eq 0 ]]; then + print -P "\n%F{green}[oh-my-zsh] Update successful.%f" + return 0 + elif [[ "$EXIT_STATUS" -ne 0 ]]; then + print -P "\n%F{red}[oh-my-zsh] There was an error updating:%f" + printf "\n${fg[yellow]}%s${reset_color}" "$ERROR" + return 0 + fi + } always { + if (( TRY_BLOCK_ERROR == 0 )); then + # if last update results have been handled, remove them from the status file + update_last_updated_file + + # deregister background function + add-zsh-hook -d precmd _omz_bg_update_status + unset -f _omz_bg_update_status + fi + } + } + + add-zsh-hook precmd _omz_bg_update + ;; + *) + handle_update ;; +esac From 24b2600558f999dd53f0d354ad61fc07cf7d6e2b Mon Sep 17 00:00:00 2001 From: tobi1805 <66414944+tobi1805@users.noreply.github.com> Date: Mon, 9 Oct 2023 18:07:51 +0200 Subject: [PATCH 305/321] feat(git): delete squash-merged branches in `gbda` (#11948) --- plugins/git/README.md | 2 +- plugins/git/git.plugin.zsh | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 9c16cb6e..33c10ffd 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -41,7 +41,6 @@ plugins=(... git) | `gba` | `git branch --all` | | `gbd` | `git branch --delete` | | `gbD` | `git branch --delete --force` | -| `gbda` | `git branch --no-color --merged \| command grep -vE "^([+*]\|\s*($(git_main_branch)\|$(git_develop_branch))\s*$)" \| command xargs git branch --delete 2>/dev/null` | | `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` | | `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` | | `gbm` | `git branch --move` | @@ -251,6 +250,7 @@ receive further support. | `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. | | `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise. | | `grename ` | Renames branch `` to ``, including on the origin remote. | +| `gbda` | Deletes all merged and squash-merged branches | ### Work in Progress (WIP) diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index cb848b40..ceb2011f 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -122,7 +122,22 @@ alias gb='git branch' alias gba='git branch --all' alias gbd='git branch --delete' alias gbD='git branch --delete --force' -alias gbda='git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null' + +# Copied and modified from James Roeder (jmaroeder) under MIT License +# https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish +function gbda() { + git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null + + local default_branch=$(git_main_branch) + git for-each-ref refs/heads/ "--format=%(refname:short)" | \ + while read branch; do + local merge_base=$(git merge-base $default_branch $branch) + if [[ '-*' == $(git cherry $default_branch $(git commit-tree $(git rev-parse $branch\^{tree}) -p $merge_base -m _)) ]]; then + git branch -D $branch + fi + done +} + alias gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -d' alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | awk '"'"'{print $1}'"'"' | xargs git branch -D' alias gbm='git branch --move' From 38db3e16ef3266800e1a9516c0615ff04ec97cb6 Mon Sep 17 00:00:00 2001 From: Adam Henley <71472057+ajh-sr@users.noreply.github.com> Date: Tue, 10 Oct 2023 07:28:09 +1300 Subject: [PATCH 306/321] feat(kind): add plugin for Kind k8s tool (#9827) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: jxlwqq Co-authored-by: Francesco Ilario Co-authored-by: Marc Cornellà --- plugins/kind/README.md | 22 ++++++++++++++++++++++ plugins/kind/kind.plugin.zsh | 23 +++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 plugins/kind/README.md create mode 100644 plugins/kind/kind.plugin.zsh diff --git a/plugins/kind/README.md b/plugins/kind/README.md new file mode 100644 index 00000000..49024648 --- /dev/null +++ b/plugins/kind/README.md @@ -0,0 +1,22 @@ +# Kind plugin + +This plugin adds completion for the [Kind](https://kind.sigs.k8s.io/) tool, as well +as a few aliases for easier use. + +To use it, add `kind` to the plugins array in your zshrc file: + +```zsh +plugins=(... kind) +``` + +## Aliases + +| Alias | Command | +| ------- | ---------------------------- | +| `kicc` | `kind create cluster` | +| `kiccn` | `kind create cluster --name` | +| `kigc` | `kind get clusters` | +| `kidc` | `kind delete cluster` | +| `kidcn` | `kind delete cluster --name` | +| `kidca` | `kind delete clusters -A` | +| `kigk` | `kind get kubeconfig` | diff --git a/plugins/kind/kind.plugin.zsh b/plugins/kind/kind.plugin.zsh new file mode 100644 index 00000000..183eb7bd --- /dev/null +++ b/plugins/kind/kind.plugin.zsh @@ -0,0 +1,23 @@ +if (( ! $+commands[kind] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `kind`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_kind" ]]; then + typeset -g -A _comps + autoload -Uz _kind + _comps[kind]=_kind +fi + +# Generate and load kind completion +kind completion zsh >! "$ZSH_CACHE_DIR/completions/_kind" &| + +# Register aliases +alias kicc="kind create cluster" +alias kiccn="kind create cluster --name" +alias kigc="kind get clusters" +alias kidc="kind delete cluster" +alias kidcn="kind delete cluster --name" +alias kidca="kind delete clusters -A" +alias kigk="kind get kubeconfig" From b1821a24f0574488554de8e7f6d0735fb851de8b Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 10 Oct 2023 16:56:54 +0100 Subject: [PATCH 307/321] fix(git): restore showing patch in `gsts` (#11951) --- plugins/git/README.md | 2 +- plugins/git/git.plugin.zsh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index 33c10ffd..a4e9f4c4 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -185,7 +185,7 @@ plugins=(... git) | `gstp` | `git stash pop` | | `gsta` | On Git >= 2.13: `git stash push` | | `gsta` | On Git < 2.13: `git stash save` | -| `gsts` | `git stash show` | +| `gsts` | `git stash show --patch` | | `gst` | `git status` | | `gss` | `git status --short` | | `gsb` | `git status --short -b` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index ceb2011f..b0376308 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -349,7 +349,7 @@ alias gstp='git stash pop' is-at-least 2.13 "$git_version" \ && alias gsta='git stash push' \ || alias gsta='git stash save' -alias gsts='git stash show' +alias gsts='git stash show --patch' alias gst='git status' alias gss='git status --short' alias gsb='git status --short --branch' From da3b8fcb6a6bcf4d440b9768d2deab27f787929a Mon Sep 17 00:00:00 2001 From: Lukas Elmer Date: Wed, 11 Oct 2023 18:06:22 +0200 Subject: [PATCH 308/321] fix(yarn): output completion entries in UTF-8 (#11955) --- plugins/yarn/_yarn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/yarn/_yarn b/plugins/yarn/_yarn index 1237ba67..f15756ff 100644 --- a/plugins/yarn/_yarn +++ b/plugins/yarn/_yarn @@ -144,7 +144,7 @@ _yarn_scripts() { fi if [[ -n $packageJson ]]; then - scripts=("${(@f)$(cat ${packageJson} | perl -0777 -MJSON::PP -n -E '%r=%{decode_json($_)->{scripts}}; do{$k=$_;($e=$k)=~s/:/\\:/g; printf "$e:$r{$k}\n"} for sort keys %r')}") + scripts=("${(@f)$(cat ${packageJson} | perl -0777 -MJSON::PP -n -E 'binmode(STDOUT, ":encoding(UTF-8)"); %r=%{decode_json($_)->{scripts}}; do{$k=$_;($e=$k)=~s/:/\\:/g; printf "$e:$r{$k}\n"} for sort keys %r')}") fi commands=('env' $scripts $binaries) From fedef5dbd5f8ffef16815cb3a2c611eb0f7f00b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 11 Oct 2023 19:23:44 +0200 Subject: [PATCH 309/321] fix(xcode): open Xcode in current Desk if already open in another (#10384) Fixes #10384 --- plugins/xcode/xcode.plugin.zsh | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/xcode/xcode.plugin.zsh b/plugins/xcode/xcode.plugin.zsh index 5d1f901a..f09434e6 100644 --- a/plugins/xcode/xcode.plugin.zsh +++ b/plugins/xcode/xcode.plugin.zsh @@ -17,6 +17,13 @@ function xc { local active_path active_path=${"$(xcode-select -p)"%%/Contents/Developer*} echo "Found ${xcode_files[1]}. Opening with ${active_path}" + + # If Xcode is already opened in another Desk, we need this double call + # with -g to open the project window in the current Desk and focus it. + # See https://github.com/ohmyzsh/ohmyzsh/issues/10384 + if command pgrep -q "^Xcode"; then + open -g -a "$active_path" "${xcode_files[1]}" + fi open -a "$active_path" "${xcode_files[1]}" } From 53cb50acb5c2c70f6ba9d26d3d2ffb37c8a19e8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 11 Oct 2023 20:43:55 +0200 Subject: [PATCH 310/321] refactor(systemadmin): use `ss` instead of `netstat` when available (#11957) --- plugins/systemadmin/systemadmin.plugin.zsh | 116 ++++++++++++--------- 1 file changed, 67 insertions(+), 49 deletions(-) diff --git a/plugins/systemadmin/systemadmin.plugin.zsh b/plugins/systemadmin/systemadmin.plugin.zsh index 7ce62bac..03dd995b 100644 --- a/plugins/systemadmin/systemadmin.plugin.zsh +++ b/plugins/systemadmin/systemadmin.plugin.zsh @@ -13,11 +13,11 @@ # ------------------------------------------------------------------------------ function retlog() { - if [[ -z $1 ]];then - echo '/var/log/nginx/access.log' - else - echo $1 - fi + if [[ -z $1 ]];then + echo '/var/log/nginx/access.log' + else + echo $1 + fi } alias ping='ping -c 5' @@ -28,142 +28,160 @@ alias mkdir='mkdir -pv' alias psmem='ps -e -orss=,args= | sort -b -k1 -nr' alias psmem10='ps -e -orss=,args= | sort -b -k1 -nr | head -n 10' # get top process eating cpu if not work try execute : export LC_ALL='C' -alias pscpu='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr' -alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args|sort -k1,1n -nr | head -n 10' +alias pscpu='ps -e -o pcpu,cpu,nice,state,cputime,args | sort -k1,1n -nr' +alias pscpu10='ps -e -o pcpu,cpu,nice,state,cputime,args | sort -k1,1n -nr | head -n 10' # top10 of the history alias hist10='print -l ${(o)history%% *} | uniq -c | sort -nr | head -n 10' function ip() { - if [ -t 1 ]; then - command ip -color "$@" - else - command ip "$@" - fi + if [ -t 1 ]; then + command ip -color "$@" + else + command ip "$@" + fi } # directory LS function dls() { - print -l *(/) + print -l *(/) } function psgrep() { - ps aux | grep "${1:-.}" | grep -v grep + ps aux | grep "${1:-.}" | grep -v grep } # Kills any process that matches a regexp passed to it function killit() { - ps aux | grep -v "grep" | grep "$@" | awk '{print $2}' | xargs sudo kill + ps aux | grep -v "grep" | grep "$@" | awk '{print $2}' | xargs sudo kill } # list contents of directories in a tree-like format if ! (( $+commands[tree] )); then - function tree() { - find $@ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' - } + function tree() { + find $@ -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' + } fi # Sort connection state function sortcons() { - netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn + { + LANG= ss -nat | awk 'NR > 1 {print $1}' \ + || LANG= netstat -nat | awk 'NR > 2 {print $6}' + } | sort | uniq -c | sort -rn } # View all 80 Port Connections function con80() { - netstat -nat|grep -i ":80"|wc -l + { + LANG= ss -nat || LANG= netstat -nat + } | grep -E ":80[^0-9]" | wc -l } # On the connected IP sorted by the number of connections function sortconip() { - netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n + { + LANG= ss -ntu | awk 'NR > 1 {print $6}' \ + || LANG= netstat -ntu | awk 'NR > 2 {print $5}' + } | cut -d: -f1 | sort | uniq -c | sort -n } # top20 of Find the number of requests on 80 port function req20() { - netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20 + { + LANG= ss -tn | awk '$4 ~ /:80$/ {print $5}' \ + || LANG= netstat -tn | awk '$4 ~ /:80$/ {print $5}' + } | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n 20 } # top20 of Using tcpdump port 80 access to view function http20() { - sudo tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -n 20 + sudo tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | head -n 20 } # top20 of Find time_wait connection function timewait20() { - netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20 + { + LANG= ss -nat | awk 'NR > 1 && /TIME-WAIT/ {print $5}' \ + || LANG= netstat -nat | awk 'NR > 2 && /TIME_WAIT/ {print $5}' + } | sort | uniq -c | sort -rn | head -n 20 } # top20 of Find SYN connection function syn20() { - netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr|head -n20 + { + LANG= ss -an | awk '/SYN/ {print $5}' \ + || LANG= netstat -an | awk '/SYN/ {print $5}' + } | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head -n20 } # Printing process according to the port number function port_pro() { - netstat -ntlp | grep "${1:-.}" | awk '{print $7}' | cut -d/ -f1 + LANG= ss -ntlp | awk "NR > 1 && /:${1:-}/ {print \$6}" | sed 's/.*pid=\([^,]*\).*/\1/' \ + || LANG= netstat -ntlp | awk "NR > 2 && /:${1:-}/ {print \$7}" | cut -d/ -f1 } # top10 of gain access to the ip address function accessip10() { - awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}' "$(retlog)" + awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}' "$(retlog)" } # top20 of Most Visited file or page function visitpage20() { - awk '{print $11}' "$(retlog)"|sort|uniq -c|sort -nr|head -n 20 + awk '{print $11}' "$(retlog)" | sort | uniq -c | sort -nr | head -n 20 } # top100 of Page lists the most time-consuming (more than 60 seconds) as well as the corresponding page number of occurrences function consume100() { - awk '($NF > 60 && $7~/\.php/){print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -n 100 - # if django website or other website make by no suffix language - # awk '{print $7}' "$(retlog)" |sort -n|uniq -c|sort -nr|head -n 100 + awk '($NF > 60 && $7~/\.php/){print $7}' "$(retlog)" | sort -n | uniq -c | sort -nr | head -n 100 + # if django website or other website make by no suffix language + # awk '{print $7}' "$(retlog)" | sort -n | uniq -c | sort -nr | head -n 100 } # Website traffic statistics (G) function webtraffic() { - awk "{sum+=$10} END {print sum/1024/1024/1024}" "$(retlog)" + awk "{sum+=$10} END {print sum/1024/1024/1024}" "$(retlog)" } # Statistical connections 404 function c404() { - awk '($9 ~/404/)' "$(retlog)" | awk '{print $9,$7}' | sort + awk '($9 ~ /404/)' "$(retlog)" | awk '{print $9,$7}' | sort } # Statistical http status. function httpstatus() { - awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' "$(retlog)" + awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' "$(retlog)" } # Delete 0 byte file function d0() { - find "${1:-.}" -type f -size 0 -exec rm -rf {} \; + find "${1:-.}" -type f -size 0 -exec rm -rf {} \; } # gather external ip address function geteip() { - curl -s -S -4 https://icanhazip.com + curl -s -S -4 https://icanhazip.com - # handle case when there is no IPv6 external IP, which shows error - # curl: (7) Couldn't connect to server - curl -s -S -6 https://icanhazip.com 2>/dev/null - local ret=$? - (( ret == 7 )) && print -P -u2 "%F{red}error: no IPv6 route to host%f" - return $ret + # handle case when there is no IPv6 external IP, which shows error + # curl: (7) Couldn't connect to server + curl -s -S -6 https://icanhazip.com 2>/dev/null + local ret=$? + (( ret == 7 )) && print -P -u2 "%F{red}error: no IPv6 route to host%f" + return $ret } # determine local IP address(es) function getip() { - if (( ${+commands[ip]} )); then - ip addr | awk '/inet /{print $2}' | command grep -v 127.0.0.1 - else - ifconfig | awk '/inet /{print $2}' | command grep -v 127.0.0.1 - fi + if (( ${+commands[ip]} )); then + ip addr | awk '/inet /{print $2}' | command grep -v 127.0.0.1 + else + ifconfig | awk '/inet /{print $2}' | command grep -v 127.0.0.1 + fi } # Clear zombie processes function clrz() { - ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9 + ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9 } # Second concurrent function 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 + awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' "$(retlog)" | sort -k 2 -nr | head -n10 } From 408330e131110c8b86ce60ab0492b35657cb4d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 11 Oct 2023 20:44:46 +0200 Subject: [PATCH 311/321] ci: remove redundant macos runner for CI tests Currently the macOS runner is not needed, as we are only checking zsh syntax. We can reactivate it in the future if needed. --- .github/workflows/main.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 57403629..de7d9826 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,16 +20,12 @@ permissions: jobs: tests: name: Run tests - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest if: github.repository == 'ohmyzsh/ohmyzsh' - strategy: - matrix: - os: [ubuntu-latest, macos-latest] steps: - name: Set up git repository uses: actions/checkout@v3 - name: Install zsh - if: runner.os == 'Linux' run: sudo apt-get update; sudo apt-get install zsh - name: Check syntax run: | From 6768906d07151140db901510b2c8b1ce2622f365 Mon Sep 17 00:00:00 2001 From: sattisumasri <73093486+sattisumasri@users.noreply.github.com> Date: Thu, 12 Oct 2023 00:27:01 +0530 Subject: [PATCH 312/321] chore: change headings in README to Title Case (#11956) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- README.md | 69 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 35 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index c83e1621..308d117e 100644 --- a/README.md +++ b/README.md @@ -23,32 +23,33 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi Table of Contents - [Getting Started](#getting-started) + - [Operating System Compatibility](#operating-system-compatibility) - [Prerequisites](#prerequisites) - [Basic Installation](#basic-installation) - - [Manual inspection](#manual-inspection) + - [Manual Inspection](#manual-inspection) - [Using Oh My Zsh](#using-oh-my-zsh) - [Plugins](#plugins) - [Enabling Plugins](#enabling-plugins) - [Using Plugins](#using-plugins) - [Themes](#themes) - - [Selecting a Theme](#selecting-a-theme) + - [Selecting A Theme](#selecting-a-theme) - [FAQ](#faq) - [Advanced Topics](#advanced-topics) - [Advanced Installation](#advanced-installation) - [Custom Directory](#custom-directory) - - [Unattended install](#unattended-install) - - [Installing from a forked repository](#installing-from-a-forked-repository) + - [Unattended Install](#unattended-install) + - [Installing From A Forked Repository](#installing-from-a-forked-repository) - [Manual Installation](#manual-installation) - [Installation Problems](#installation-problems) - - [Custom Plugins and Themes](#custom-plugins-and-themes) - - [Enable GNU ls in macOS and freeBSD systems](#enable-gnu-ls) - - [Skip aliases](#skip-aliases) + - [Custom Plugins And Themes](#custom-plugins-and-themes) + - [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems) + - [Skip Aliases](#skip-aliases) - [Getting Updates](#getting-updates) - - [Updates verbosity](#updates-verbosity) + - [Updates Verbosity](#updates-verbosity) - [Manual Updates](#manual-updates) - [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh) -- [How do I contribute to Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh) - - [Do NOT send us themes](#do-not-send-us-themes) +- [How Do I Contribute To Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh) + - [Do Not Send Us Themes](#do-not-send-us-themes) - [Contributors](#contributors) - [Follow Us](#follow-us) - [Merchandise](#merchandise) @@ -61,15 +62,15 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi ### Operating System Compatibility -| O/S | Status | -| :---------------- | :------: | -| Android | ✅ | -| FreeBSD | ✅ | -| LCARS | 🛸 | -| Linux | ✅ | -| MacOS | ✅ | -| OS/2 Warp | ❌ | -| Windows (WSL2) | ✅ | +| O/S | Status | +| :------------- | :-----: | +| Android | ✅ | +| freeBSD | ✅ | +| LCARS | 🛸 | +| Linux | ✅ | +| macOS | ✅ | +| OS/2 Warp | ❌ | +| Windows (WSL2) | ✅ | ### Prerequisites @@ -90,7 +91,7 @@ Oh My Zsh is installed by running one of the following commands in your terminal _Note that any previous `.zshrc` will be renamed to `.zshrc.pre-oh-my-zsh`. After installation, you can move the configuration you want to preserve into the new `.zshrc`._ -#### Manual inspection +#### Manual Inspection It's a good idea to inspect the install script from projects you don't yet know. You can do that by downloading the install script first, looking through it so everything looks normal, @@ -139,7 +140,7 @@ Each built-in plugin includes a **README**, documenting it. This README should s We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one hundred and fifty themes now bundled. Most of them have [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). Check them out! -#### Selecting a Theme +#### Selecting A Theme _Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right one (for him)._ @@ -210,7 +211,7 @@ like this: ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh ``` -#### Unattended install +#### Unattended Install If you're running the Oh My Zsh install script as part of an automated install, you can pass the `--unattended` flag to the `install.sh` script. This will have the effect of not trying to change @@ -220,7 +221,7 @@ the default shell, and it also won't run `zsh` when the installation has finishe sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended ``` -#### Installing from a forked repository +#### Installing From A Forked Repository The install script also accepts these variables to allow installation of a different repository: @@ -245,19 +246,19 @@ REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh #### Manual Installation -##### 1. Clone the repository +##### 1. Clone The Repository ```sh git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh ``` -##### 2. _Optionally_, backup your existing `~/.zshrc` file +##### 2. _Optionally_, Backup Your Existing `~/.zshrc` File ```sh cp ~/.zshrc ~/.zshrc.orig ``` -##### 3. Create a new zsh configuration file +##### 3. Create A New Zsh Configuration File You can create a new zsh config file by copying the template that we have included for you. @@ -265,7 +266,7 @@ You can create a new zsh config file by copying the template that we have includ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc ``` -##### 4. Change your default shell +##### 4. Change Your Default Shell ```sh chsh -s $(which zsh) @@ -273,7 +274,7 @@ chsh -s $(which zsh) You must log out from your user session and log back in to see this change. -##### 5. Initialize your new zsh configuration +##### 5. Initialize Your New Zsh Configuration Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration. @@ -284,7 +285,7 @@ If you have any hiccups installing, here are a few common fixes. - You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after switching to `oh-my-zsh`. - If you installed manually or changed the install location, check the `ZSH` environment variable in `~/.zshrc`. -### Custom Plugins and Themes +### Custom Plugins And Themes If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/` directory. @@ -292,7 +293,7 @@ If you have many functions that go well together, you can put them as a `XYZ.plu If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. -### Enable GNU ls in macOS and freeBSD systems +### Enable GNU ls In macOS And freeBSD Systems @@ -306,7 +307,7 @@ zstyle ':omz:lib:theme-and-appearance' gnu-ls yes _Note: this is not compatible with `DISABLE_LS_COLORS=true`_ -### Skip aliases +### Skip Aliases @@ -389,7 +390,7 @@ zstyle ':omz:update' frequency 7 zstyle ':omz:update' frequency 0 ``` -### Updates verbosity +### Updates Verbosity You can also limit the update verbosity with the following settings: @@ -417,7 +418,7 @@ Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy b If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove itself and revert your previous `bash` or `zsh` configuration. -## How do I contribute to Oh My Zsh? +## How Do I Contribute To Oh My Zsh? Before you participate in our delightful community, please read the [code of conduct](CODE_OF_CONDUCT.md). @@ -427,7 +428,7 @@ We also need people to test out pull requests. So take a look through [the open See [Contributing](CONTRIBUTING.md) for more details. -### Do NOT send us themes +### Do Not Send Us Themes We have (more than) enough themes for the time being. Please add your theme to the [external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page. From 5743198e0ed5de137b4aa1b948cf4c82b02bdd8e Mon Sep 17 00:00:00 2001 From: Preston Button Date: Thu, 12 Oct 2023 04:32:48 -0400 Subject: [PATCH 313/321] docs(aliases): fix typo (#11958) --- plugins/aliases/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md index 53b68ea0..14f9c5c5 100644 --- a/plugins/aliases/README.md +++ b/plugins/aliases/README.md @@ -17,7 +17,7 @@ Requirements: Python needs to be installed. - `als`: show all aliases by group -- `als -h/--help`: print help mesage +- `als -h/--help`: print help message - `als `: filter and highlight aliases by `` From 7329b2fbb1787651d4900d5ef280b926c5696c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 12 Oct 2023 11:46:49 +0200 Subject: [PATCH 314/321] docs(debian): clarify override behavior for `apt_pref` and `apt_upgr` Fixes #11959 --- plugins/debian/README.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/debian/README.md b/plugins/debian/README.md index 1db534f1..6835ad65 100644 --- a/plugins/debian/README.md +++ b/plugins/debian/README.md @@ -13,7 +13,12 @@ plugins=(... debian) - `$apt_pref`: use aptitude or apt if installed, fallback is apt-get. - `$apt_upgr`: use upgrade or safe-upgrade (for aptitude). -Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior. +Set **both** `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior, e.g.: + +```sh +apt_pref='apt' +apt_upgr='full-upgrade' +``` ## Common Aliases From 772b41ea5a362206e1498453dd053e638752c5dc Mon Sep 17 00:00:00 2001 From: Sandesh Pyakurel <82999440+Sandesh-Pyakurel@users.noreply.github.com> Date: Thu, 12 Oct 2023 20:09:40 +0545 Subject: [PATCH 315/321] chore(zsh-navigation-tools): fix typo (#11960) --- plugins/zsh-navigation-tools/n-list | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/zsh-navigation-tools/n-list b/plugins/zsh-navigation-tools/n-list index f25db8f6..a852b083 100644 --- a/plugins/zsh-navigation-tools/n-list +++ b/plugins/zsh-navigation-tools/n-list @@ -467,7 +467,7 @@ while (( 1 )); do elif [ -n "$keypad" ]; then final_key="$keypad" else - _nlist_status_msg "Inproper input detected" + _nlist_status_msg "Improper input detected" zcurses refresh main inner fi From 3efdbf9e1e6663adf9d8a2d113ec62855c621ef7 Mon Sep 17 00:00:00 2001 From: Sandesh Pyakurel <82999440+Sandesh-Pyakurel@users.noreply.github.com> Date: Fri, 13 Oct 2023 13:38:48 +0545 Subject: [PATCH 316/321] chore(hitchhiker): fix typos (#11961) --- plugins/hitchhiker/fortunes/hitchhiker | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/hitchhiker/fortunes/hitchhiker b/plugins/hitchhiker/fortunes/hitchhiker index b0448b21..94cc1c83 100644 --- a/plugins/hitchhiker/fortunes/hitchhiker +++ b/plugins/hitchhiker/fortunes/hitchhiker @@ -80,7 +80,7 @@ % "The fronting for the eighty-yard-long marble-topped bar had been made by stitching together nearly twenty thousand Antarean Mosaic Lizard skins, despite the fact that the twenty thousand lizards concerned had needed them to keep their insides in." -- The Book decribing Milliways' politically incorrect decor. +- The Book describing Milliways' politically incorrect decor. % "`...and the Universe,' continued the waiter, determined not to be deflected on his home stretch, `will explode later for your pleasure.' Ford's head swivelled slowly towards him. He spoke with feeling. `Wow,' he said, `What sort of drinks do you serve in this place?' The waiter laughed a polite little waiter's laugh. `Ah,' he said, `I think sir has perhaps misunderstood me.' `Oh, I hope not,' breathed Ford." @@ -104,7 +104,7 @@ % "`The first ten million years were the worst,' said Marvin, `and the second ten million, they were the worst too. The third ten million I didn't enjoy at all. After that I went into a bit of a decline.'" -- Marvin reflecting back on his 576,000,003,579 year career as Milliways' car park attendent. +- Marvin reflecting back on his 576,000,003,579 year career as Milliways' car park attendant. % "`Incidentally,' he said, `what does teleport mean?' Another moment passed. Slowly, the others turned to face him. `Probably the wrong moment to ask,' said Arthur, `It's just I remember you use the word a short while ago and I only bring it up because...' `Where,' said Ford quietly, `does it say teleport?' `Well, just over here in fact,' said Arthur, pointing at a dark control box in the rear of the cabin, `Just under the word "emergency", above the word "system" and beside the sign saying "out of order".'" @@ -122,7 +122,7 @@ - Ford "debating" what to do with fire with a marketing girl. % -"The story goes that I first had the idea for THHGTTG while lying drunk in a field in Innsbruck (or `Spain' as the BBC TV publicity department authoritatively has it, probably because it's easier to spell)." - Foreward by DNA. +"The story goes that I first had the idea for THHGTTG while lying drunk in a field in Innsbruck (or `Spain' as the BBC TV publicity department authoritatively has it, probably because it's easier to spell)." - Foreword by DNA. FORD Six pints of bitter. And quickly please, the world's about to end. BARMAN Oh yes, sir? Nice weather for it. % @@ -162,7 +162,7 @@ ARTHUR It probably seems a terrible thing to say, but you know what I sometimes - Arthur discovering a way of coping with life on Prehistoric Earth. % -"`... then I decided that I was a lemon for a couple of weeks. I kept myself amused all that time jumping in and out of a gin and tonic.' Arthur cleared his throat, and then did it again. `Where,' he said, `did you...?' `Find a gin and tonic?' said Ford brightly. `I found a small lake that thought it was a gin and tonic, and jumped in and out of that. At least, I think it thought it was a gin and tonic.' `I may,' he addded with a grin which would have sent sane men scampering into the trees, `have been imagining it.'" +"`... then I decided that I was a lemon for a couple of weeks. I kept myself amused all that time jumping in and out of a gin and tonic.' Arthur cleared his throat, and then did it again. `Where,' he said, `did you...?' `Find a gin and tonic?' said Ford brightly. `I found a small lake that thought it was a gin and tonic, and jumped in and out of that. At least, I think it thought it was a gin and tonic.' `I may,' he added with a grin which would have sent sane men scampering into the trees, `have been imagining it.'" - Ford updating Arthur about what he's been doing for the past four years. % From 8d9c9b6174466cc432a9946b0459c214586cb1b2 Mon Sep 17 00:00:00 2001 From: Sandesh Pyakurel <82999440+Sandesh-Pyakurel@users.noreply.github.com> Date: Fri, 13 Oct 2023 20:45:28 +0545 Subject: [PATCH 317/321] chore(postgres): fix typo (#11967) --- plugins/postgres/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/postgres/README.md b/plugins/postgres/README.md index 59445f31..3f59a8fe 100644 --- a/plugins/postgres/README.md +++ b/plugins/postgres/README.md @@ -19,4 +19,4 @@ plugins=(... postgres) | stoppost | `pg_ctl -D /usr/local/var/postgres stop -s -m fast` | Stop postgres server | | restartpost | `stoppost && sleep 1 && startpost` | Restart (calls stop, then start) | | reloadpost | `pg_ctl reload -D /usr/local/var/postgres -s` | Reload postgres configuration (some setting require restart)| -| statuspost | `pg_ctl status -D /usr/local/var/postgres -s` | Check startus of postgres server (running, stopped) | +| statuspost | `pg_ctl status -D /usr/local/var/postgres -s` | Check status of postgres server (running, stopped) | From 48a62a9f713449a014d66b01afd99a4fcf1911fe Mon Sep 17 00:00:00 2001 From: Kapil Pau Date: Fri, 13 Oct 2023 23:11:47 +0100 Subject: [PATCH 318/321] feat(span): Introducing Snapcraft CLI plugin (#9357) --- plugins/snap/README.md | 18 ++++++++++++++++++ plugins/snap/snap.plugin.zsh | 10 ++++++++++ 2 files changed, 28 insertions(+) create mode 100644 plugins/snap/README.md create mode 100644 plugins/snap/snap.plugin.zsh diff --git a/plugins/snap/README.md b/plugins/snap/README.md new file mode 100644 index 00000000..75c5ec19 --- /dev/null +++ b/plugins/snap/README.md @@ -0,0 +1,18 @@ +# snap plugin + +This plugin sets up aliases for the common [snap](https://snapcraft.io/docs/getting-started) commands + +## Aliases + +| Alias | Full command | +| --- | ---| +| sv | snap version | +| sf | snap find | +| si | snap install | +| sin | snap info | +| sr | snap remove | +| sref | snap refresh | +| srev | snap revert | +| sl | snap list | +| sd | snap disable | +| se | snap enable | diff --git a/plugins/snap/snap.plugin.zsh b/plugins/snap/snap.plugin.zsh new file mode 100644 index 00000000..af234697 --- /dev/null +++ b/plugins/snap/snap.plugin.zsh @@ -0,0 +1,10 @@ +alias sv="snap version" +alias sf="snap find" +alias si="snap install" +alias sin="snap info" +alias sr="snap remove" +alias sref="snap refresh" +alias srev="snap revert" +alias sl="snap list" +alias sd="snap disable" +alias se="snap enable" From 2db53ff1da078b2207cb98736370f1f145e5c667 Mon Sep 17 00:00:00 2001 From: Steve Lessard Jr Date: Fri, 13 Oct 2023 18:26:16 -0400 Subject: [PATCH 319/321] fix(avit): RPROMPT Fix for #10307 (#11131) Co-authored-by: Steve Lessard --- themes/avit.zsh-theme | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/themes/avit.zsh-theme b/themes/avit.zsh-theme index 1279ea91..20627446 100644 --- a/themes/avit.zsh-theme +++ b/themes/avit.zsh-theme @@ -11,7 +11,12 @@ $(_user_host)${_current_dir} $(git_prompt_info) $(ruby_prompt_info) PROMPT2='%{%(!.${fg[red]}.${fg[white]})%}◀%{$reset_color%} ' -RPROMPT='$(vi_mode_prompt_info)%{$(echotc UP 1)%}$(_git_time_since_commit) $(git_prompt_status) ${_return_status}%{$(echotc DO 1)%}' +__RPROMPT='$(vi_mode_prompt_info)%{$(echotc UP 1)%}$(_git_time_since_commit) $(git_prompt_status) ${_return_status}%{$(echotc DO 1)%}' +if [[ -z $RPROMPT ]]; then + RPROMPT=$__RPROMPT +else + RPROMPT="${RPROMPT} ${__RPROMPT}" +fi function _user_host() { local me From f7130bb529a2d15652f739c552688b34aac63315 Mon Sep 17 00:00:00 2001 From: Robby Russell Date: Fri, 13 Oct 2023 15:38:13 -0700 Subject: [PATCH 320/321] fix(gnzh): Don't show .local for local hostnames in theme Fixes #10871 --- themes/gnzh.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/gnzh.zsh-theme b/themes/gnzh.zsh-theme index 1e6c4e93..ca62320e 100644 --- a/themes/gnzh.zsh-theme +++ b/themes/gnzh.zsh-theme @@ -21,7 +21,7 @@ fi if [[ -n "$SSH_CLIENT" || -n "$SSH2_CLIENT" ]]; then PR_HOST='%F{red}%M%f' # SSH else - PR_HOST='%F{green}%M%f' # no SSH + PR_HOST='%F{green}%m%f' # no SSH fi From f93976875133409297be864ce94d50f20a9bc18d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sat, 14 Oct 2023 16:40:45 +0200 Subject: [PATCH 321/321] fix(git): fix fallback to develop branch if `master` not found (#11966) --- plugins/git/git.plugin.zsh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index b0376308..d053a763 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -20,26 +20,31 @@ function current_branch() { function git_develop_branch() { command git rev-parse --git-dir &>/dev/null || return local branch - for branch in dev devel development; do + for branch in dev devel develop development; do if command git show-ref -q --verify refs/heads/$branch; then echo $branch - return + return 0 fi done + echo develop + return 1 } # Check if main exists and use instead of master function git_main_branch() { command git rev-parse --git-dir &>/dev/null || return local ref - for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default}; do + for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,master}; do if command git show-ref -q --verify $ref; then echo ${ref:t} - return + return 0 fi done + + # If no main branch was found, fall back to master but return error echo master + return 1 } function grename() { @@ -129,6 +134,8 @@ function gbda() { git branch --no-color --merged | command grep -vE "^([+*]|\s*($(git_main_branch)|$(git_develop_branch))\s*$)" | command xargs git branch --delete 2>/dev/null local default_branch=$(git_main_branch) + (( ! $? )) || default_branch=$(git_develop_branch) + git for-each-ref refs/heads/ "--format=%(refname:short)" | \ while read branch; do local merge_base=$(git merge-base $default_branch $branch)