From f7b647e1b13ed9cd2f34f3559c112e61b8c03108 Mon Sep 17 00:00:00 2001 From: Michal Date: Sun, 21 Jan 2024 05:25:50 +0100 Subject: [PATCH 001/158] feat(spectrum): add `FX[dim]` format (#12172) --- lib/spectrum.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/spectrum.zsh b/lib/spectrum.zsh index 97f5c360a..31e37792c 100644 --- a/lib/spectrum.zsh +++ b/lib/spectrum.zsh @@ -7,6 +7,7 @@ typeset -AHg FX FG BG FX=( reset "%{%}" bold "%{%}" no-bold "%{%}" + dim "%{%}" no-dim "%{%}" italic "%{%}" no-italic "%{%}" underline "%{%}" no-underline "%{%}" blink "%{%}" no-blink "%{%}" From e656377d36077b0ca757d995c9c35f0fea7c7fdd Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 24 Jan 2024 10:10:55 +0100 Subject: [PATCH 002/158] fix(web-search): encode spaces as `%20` --- plugins/web-search/web-search.plugin.zsh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index 1b42abe86..0fa2852dc 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -37,9 +37,14 @@ function web_search() { # search or go to main page depending on number of arguments passed if [[ $# -gt 1 ]]; then + # if search goes in the query string ==> space as +, otherwise %20 + # see https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20 + local param="-P" + [[ "$urls[$1]" =~ .*\?.*=$ ]] && param="" + # build search url: # join arguments passed with '+', then append to search engine URL - url="${urls[$1]}$(omz_urlencode ${@[2,-1]})" + url="${urls[$1]}$(omz_urlencode $param ${@[2,-1]})" else # build main page url: # split by '/', then rejoin protocol (1) and domain (2) parts with '//' From 652037ebdfbe581e4c7dfcd0862ac2d1577c86d9 Mon Sep 17 00:00:00 2001 From: ditzy Date: Thu, 25 Jan 2024 03:19:01 -0600 Subject: [PATCH 003/158] fix(jump)!: only resolve mark symlink (#11074) BREAKING CHANGE: Previously, `jump` would resolve the symlink to the mark directory and resolve again if the mark directory was also a symlink. It only resolves once after this commit. --- plugins/jump/jump.plugin.zsh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/jump/jump.plugin.zsh b/plugins/jump/jump.plugin.zsh index 829c9d9cb..c2b21e92e 100644 --- a/plugins/jump/jump.plugin.zsh +++ b/plugins/jump/jump.plugin.zsh @@ -8,8 +8,10 @@ # export MARKPATH=$HOME/.marks + jump() { - builtin cd -P "$MARKPATH/$1" 2>/dev/null || {echo "No such mark: $1"; return 1} + local markpath="$(readlink $MARKPATH/$1)" || {echo "No such mark: $1"; return 1} + builtin cd "$markpath" 2>/dev/null || {echo "Destination does not exist for mark [$1]: $markpath"; return 2} } mark() { From 80c114cb3a64044ea50b623f96a35bc022db5e8d Mon Sep 17 00:00:00 2001 From: Eemil Lagerspetz Date: Thu, 25 Jan 2024 10:23:07 +0100 Subject: [PATCH 004/158] fix(awesomepanda): new line wrap Closes #5982 Co-authored-by: Carlo Sala --- themes/awesomepanda.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/awesomepanda.zsh-theme b/themes/awesomepanda.zsh-theme index 85036e4ac..000697397 100644 --- a/themes/awesomepanda.zsh-theme +++ b/themes/awesomepanda.zsh-theme @@ -1,6 +1,6 @@ # the svn plugin has to be activated for this to work. local ret_status="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ %s)" -PROMPT='${ret_status}%{$fg_bold[green]%} %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%}$(svn_prompt_info)%{$reset_color%}' +PROMPT='%{${ret_status}%}%{$fg_bold[green]%} %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%}$(svn_prompt_info)%{$reset_color%}' ZSH_THEME_GIT_PROMPT_PREFIX="git:(%{$fg[red]%}" ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%}" From 8b2ce98578da743fbc4a208285f33744d6abd3cf Mon Sep 17 00:00:00 2001 From: Frank Dana Date: Tue, 30 Jan 2024 05:43:03 -0500 Subject: [PATCH 005/158] feat(ssh): add plugin (#12186) Closes #2707 Co-authored-by: Frank Wittig Co-authored-by: Frank Wittig --- plugins/ssh/ssh.plugin.zsh | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 plugins/ssh/ssh.plugin.zsh diff --git a/plugins/ssh/ssh.plugin.zsh b/plugins/ssh/ssh.plugin.zsh new file mode 100644 index 000000000..085e71fa1 --- /dev/null +++ b/plugins/ssh/ssh.plugin.zsh @@ -0,0 +1,46 @@ +############################################################ +# Take all host sections in .ssh/config and offer them for +# completion as hosts (e.g. for ssh, rsync, scp and the like) +# Filter out wildcard host sections. +_ssh_configfile="$HOME/.ssh/config" +if [[ -f "$_ssh_configfile" ]]; then + _hosts=($(egrep '^Host.*' "$_ssh_configfile" | awk '{print $2}' | grep -v '^*' | sed -e 's/\.*\*$//')) + zstyle ':completion:*:hosts' hosts $_hosts + unset _hosts +fi +unset _ssh_configfile + +############################################################ +# Remove host key from known hosts based on a host section +# name from .ssh/config +function ssh_rmhkey { + local ssh_configfile="$HOME/.ssh/config" + local ssh_host="$1" + if [[ -z "$ssh_host" ]]; then return; fi + ssh-keygen -R $(grep -A10 "$ssh_host" "$ssh_configfile" | grep -i HostName | head -n 1 | awk '{print $2}') +} +compctl -k hosts ssh_rmhkey + +############################################################ +# Load SSH key into agent +function ssh_load_key() { + local key="$1" + if [[ -z "$key" ]]; then return; fi + local keyfile="$HOME/.ssh/$key" + local keysig=$(ssh-keygen -l -f "$keyfile") + if ( ! ssh-add -l | grep -q "$keysig" ); then + ssh-add "$keyfile" + fi +} + +############################################################ +# Remove SSH key from agent +function ssh_unload_key { + local key="$1" + if [[ -z "$key" ]]; then return; fi + local keyfile="$HOME/.ssh/$key" + local keysig=$(ssh-keygen -l -f "$keyfile") + if ( ssh-add -l | grep -q "$keysig" ); then + ssh-add -d "$keyfile" + fi +} From e195c7cb438224e8bcea20bdbc2e4b8a6bb3949b Mon Sep 17 00:00:00 2001 From: Gauthier Delacroix <1533042+gdlx@users.noreply.github.com> Date: Tue, 30 Jan 2024 21:36:18 +0100 Subject: [PATCH 006/158] fix(aws): pass default region to fetch regions (#12175) Co-authored-by: Gauthier Delacroix --- plugins/aws/aws.plugin.zsh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index fd00714e7..7a2e08a7c 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -202,8 +202,17 @@ function aws_change_access_key() { } function aws_regions() { + local region + if [[ $AWS_DEFAULT_REGION ]];then + region="$AWS_DEFAULT_REGION" + elif [[ $AWS_REGION ]];then + region="$AWS_REGION" + else + region="us-west-1" + fi + if [[ $AWS_DEFAULT_PROFILE || $AWS_PROFILE ]];then - aws ec2 describe-regions |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}' + aws ec2 describe-regions --region $region |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}' else echo "You must specify a AWS profile." fi From 4efad7ab1ba0d1715af62e484c6852808581cfb9 Mon Sep 17 00:00:00 2001 From: Rejman Nascimento <72097727+rejmann@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:54:24 -0300 Subject: [PATCH 007/158] feat(git-commit): add `wip` kind (#12188) --- plugins/git-commit/README.md | 4 +++- plugins/git-commit/git-commit.plugin.zsh | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md index 91cc73b44..a00983935 100644 --- a/plugins/git-commit/README.md +++ b/plugins/git-commit/README.md @@ -29,8 +29,9 @@ Where `type` is one of the following: - `rev` - `style` - `test` +- `wip` -> NOTE: the alias for `revert` type is `rev`, as otherwise it conflicts with the git command of the same name. +> NOTE: the alias for `revert` type is `rev`, as otherwise it conflicts with the git command of the same name. > It will still generate a commit message in the format `revert: ` ## Examples @@ -38,5 +39,6 @@ Where `type` is one of the following: | Git alias | Command | | --------------------------------------------- | ---------------------------------------------------- | | `git style "remove trailing whitespace"` | `git commit -m "style: remove trailing whitespace"` | +| `git wip "work in progress"` | `git commit -m "work in progress"` | | `git fix -s "router" "correct redirect link"` | `git commit -m "fix(router): correct redirect link"` | | `git rev -s "api" "rollback v2"` | `git commit -m "revert(api): rollback v2"` | diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index 72cecb1d6..3f0c2121d 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -11,6 +11,7 @@ _git_commit_aliases=( 'revert' 'style' 'test' + 'wip' ) local alias type From 6f215cd6922a76cf8ac6f629d0de386c3eb6667a Mon Sep 17 00:00:00 2001 From: Harkesh <100549064+harkeshbirman@users.noreply.github.com> Date: Thu, 1 Feb 2024 21:30:27 +0530 Subject: [PATCH 008/158] feat(git): add `grf` alias (#12176) --- 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 be3f85827..4acb0c858 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -152,6 +152,7 @@ plugins=(... git) | `grbd` | `git rebase $(git_develop_branch)` | | `grbm` | `git rebase $(git_main_branch)` | | `grbom` | `git rebase origin/$(git_main_branch)` | +| `grf` | `git reflog` | | `gr` | `git remote` | | `grv` | `git remote --verbose` | | `gra` | `git remote add` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 5c3064e8a..692a36a73 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -335,6 +335,7 @@ 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 grf='git reflog' alias gr='git remote' alias grv='git remote --verbose' alias gra='git remote add' From 05bf69c604e34300b02406462d4376c86d595470 Mon Sep 17 00:00:00 2001 From: 0rxa Date: Thu, 1 Feb 2024 17:11:13 +0100 Subject: [PATCH 009/158] feat(aws): implement permanent state (#12018) Co-authored-by: Rei Arifi Co-authored-by: Hysen Ndregjoni --- plugins/aws/README.md | 5 +++++ plugins/aws/aws.plugin.zsh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/plugins/aws/README.md b/plugins/aws/README.md index dbf8dcfeb..0d0773f63 100644 --- a/plugins/aws/README.md +++ b/plugins/aws/README.md @@ -47,6 +47,11 @@ plugins=(... aws) 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/region prompt. +* Set `AWS_PROFILE_STATE_ENABLED=true` in your zshrc file if you want the aws profile to persist between shell sessions. + This option might slow down your shell startup time. + By default the state file path is `/tmp/.aws_current_profile`. This means that the state won't survive a reboot or otherwise GC. + You can control the state file path using the `AWS_STATE_FILE` environment variable. + ## Theme The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 7a2e08a7c..071dd1f0b 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -6,10 +6,26 @@ function agr() { echo $AWS_REGION } +# Update state file if enabled +function _aws_update_state() { + if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then + test -d $(dirname ${AWS_STATE_FILE}) || exit 1 + echo "${AWS_PROFILE} ${AWS_REGION}" > "${AWS_STATE_FILE}" + fi +} + +function _aws_clear_state() { + if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then + test -d $(dirname ${AWS_STATE_FILE}) || exit 1 + echo -n > "${AWS_STATE_FILE}" + fi +} + # AWS profile selection function asp() { if [[ -z "$1" ]]; then unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION + _aws_clear_state echo AWS profile cleared. return fi @@ -28,6 +44,8 @@ function asp() { export AWS_PROFILE_REGION=$(aws configure get region) + _aws_update_state + if [[ "$2" == "login" ]]; then if [[ -n "$3" ]]; then aws sso login --sso-session $3 @@ -43,6 +61,7 @@ function asp() { function asr() { if [[ -z "$1" ]]; then unset AWS_DEFAULT_REGION AWS_REGION + _aws_update_state echo AWS region cleared. return fi @@ -56,6 +75,7 @@ function asr() { export AWS_REGION=$1 export AWS_DEFAULT_REGION=$1 + _aws_update_state } # AWS profile switch @@ -255,6 +275,22 @@ if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; th RPROMPT='$(aws_prompt_info)'"$RPROMPT" fi +if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then + AWS_STATE_FILE="${AWS_STATE_FILE:-/tmp/.aws_current_profile}" + test -s "${AWS_STATE_FILE}" || return + + aws_state=($(cat $AWS_STATE_FILE)) + + export AWS_DEFAULT_PROFILE="${aws_state[1]}" + export AWS_PROFILE="$AWS_DEFAULT_PROFILE" + export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE" + + test -z "${aws_state[2]}" && AWS_REGION=$(aws configure get region) + + export AWS_REGION=${AWS_REGION:-$aws_state[2]} + export AWS_DEFAULT_REGION="$AWS_REGION" +fi + # Load awscli completions # AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back From d6658f9af321e615a9b8be696f557a113cd6b026 Mon Sep 17 00:00:00 2001 From: Eric Schultz Date: Thu, 1 Feb 2024 10:16:34 -0600 Subject: [PATCH 010/158] feat(stripe): add completion plugin (#12064) Co-authored-by: Carlo Sala --- plugins/stripe/README.md | 9 +++++++++ plugins/stripe/stripe.plugin.zsh | 13 +++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 plugins/stripe/README.md create mode 100644 plugins/stripe/stripe.plugin.zsh diff --git a/plugins/stripe/README.md b/plugins/stripe/README.md new file mode 100644 index 000000000..9f0f32bc2 --- /dev/null +++ b/plugins/stripe/README.md @@ -0,0 +1,9 @@ +# Struoe + +This plugin provides completion for the [Stripe CLI](https://stripe.com/docs/stripe-cli). + +To use it add stripe to the plugins array in your zshrc file. + +```bash +plugins=(... stripe) +``` diff --git a/plugins/stripe/stripe.plugin.zsh b/plugins/stripe/stripe.plugin.zsh new file mode 100644 index 000000000..e2041bef2 --- /dev/null +++ b/plugins/stripe/stripe.plugin.zsh @@ -0,0 +1,13 @@ +if (( ! $+commands[stripe] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `stripe`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_stripe" ]]; then + typeset -g -A _comps + autoload -Uz _stripe + _comps[stripe]=_stripe +fi + +stripe completion --shell zsh --write-to-stdout >| "$ZSH_CACHE_DIR/completions/_stripe" &| From b5e6392f2140b7aa49c248aa6c232a6922d3311b Mon Sep 17 00:00:00 2001 From: Markus Hofbauer Date: Thu, 1 Feb 2024 17:37:37 +0100 Subject: [PATCH 011/158] feat(hazel): add some aliases (#12070) --- plugins/bazel/README.md | 12 ++++++++++-- plugins/bazel/bazel.plugin.zsh | 5 +++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 plugins/bazel/bazel.plugin.zsh diff --git a/plugins/bazel/README.md b/plugins/bazel/README.md index fc375d219..eba4175bc 100644 --- a/plugins/bazel/README.md +++ b/plugins/bazel/README.md @@ -1,7 +1,6 @@ # Bazel plugin -This plugin adds completion for [bazel](https://bazel.build), an open-source build and -test tool that scalably supports multi-language and multi-platform projects. +This plugin adds completion and aliases for [bazel](https://bazel.build), an open-source build and test tool that scalably supports multi-language and multi-platform projects. To use it, add `bazel` to the plugins array in your zshrc file: @@ -12,3 +11,12 @@ plugins=(... bazel) The plugin has a copy of [the completion script from the git repository][1]. [1]: https://github.com/bazelbuild/bazel/blob/master/scripts/zsh_completion/_bazel + +## Aliases + +| Alias | Command | Description | +| ------- | -------------------------------------- | ------------------------------------------------------ | +| bzb | `bazel build` | The `bazel build` command | +| bzt | `bazel test` | The `bazel test` command | +| bzr | `bazel run` | The `bazel run` command | +| bzq | `bazel query` | The `bazel query` command | diff --git a/plugins/bazel/bazel.plugin.zsh b/plugins/bazel/bazel.plugin.zsh new file mode 100644 index 000000000..d239a06b5 --- /dev/null +++ b/plugins/bazel/bazel.plugin.zsh @@ -0,0 +1,5 @@ +# Aliases for bazel +alias bzb='bazel build' +alias bzt='bazel test' +alias bzr='bazel run' +alias bzq='bazel query' From 69b0dfeadf35a6da8de41501149cf3a3817218cf Mon Sep 17 00:00:00 2001 From: lutra <49721741+lutra@users.noreply.github.com> Date: Fri, 2 Feb 2024 17:12:36 +0100 Subject: [PATCH 012/158] fix(kubectx): k8s contexts with spaces (#12191) --- plugins/kubectx/kubectx.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/kubectx/kubectx.plugin.zsh b/plugins/kubectx/kubectx.plugin.zsh index 6096feeae..a3210facc 100644 --- a/plugins/kubectx/kubectx.plugin.zsh +++ b/plugins/kubectx/kubectx.plugin.zsh @@ -9,5 +9,5 @@ function kubectx_prompt_info() { # use value in associative array if it exists # otherwise fall back to the context name - echo "${kubectx_mapping[$current_ctx]:-${current_ctx:gs/%/%%}}" + echo "${kubectx_mapping[\"$current_ctx\"]:-${current_ctx:gs/%/%%}}" } From bebd9ea59f6f5ed629b659dc1f230ac71b1fd1a8 Mon Sep 17 00:00:00 2001 From: Markus Hofbauer Date: Sat, 3 Feb 2024 10:18:33 +0100 Subject: [PATCH 013/158] chore(brew): remove duplicated alias (#12192) --- plugins/brew/brew.plugin.zsh | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index 447036376..b15137e0f 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -36,7 +36,6 @@ 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' From 70bf12402ceb5599f209bd687d4ee9d9dbf1776a Mon Sep 17 00:00:00 2001 From: Taylor Cochran Date: Sat, 3 Feb 2024 13:50:44 -0800 Subject: [PATCH 014/158] fix(prompt): quote ruby prompt (#12195) --- lib/prompt_info_functions.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/prompt_info_functions.zsh b/lib/prompt_info_functions.zsh index 3dc9b6d10..29aca9b48 100644 --- a/lib/prompt_info_functions.zsh +++ b/lib/prompt_info_functions.zsh @@ -40,5 +40,5 @@ ZSH_THEME_RVM_PROMPT_OPTIONS="i v g" # use this to enable users to see their ruby version, no matter which # version management system they use function ruby_prompt_info() { - echo $(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info) + echo "$(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)" } From 212437090032ea1c8c7ccbc1bc2937083c2e7185 Mon Sep 17 00:00:00 2001 From: Rayzeq Date: Sun, 4 Feb 2024 18:21:31 +0100 Subject: [PATCH 015/158] fix(sublime): pass user's env to `sst` (#12194) --- plugins/sublime/sublime.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/sublime/sublime.plugin.zsh b/plugins/sublime/sublime.plugin.zsh index dadf37574..cc84de737 100644 --- a/plugins/sublime/sublime.plugin.zsh +++ b/plugins/sublime/sublime.plugin.zsh @@ -4,7 +4,7 @@ alias st=subl alias stt='subl .' # Define sst only if sudo exists -(( $+commands[sudo] )) && alias sst='sudo subl' +(( $+commands[sudo] )) && alias sst='sudo -EH subl' alias stp=find_project alias stn=create_project @@ -62,7 +62,7 @@ alias stn=create_project for _sublime_path in $_sublime_paths; do if [[ -a $_sublime_path ]]; then alias subl="'$_sublime_path'" - (( $+commands[sudo] )) && alias sst="sudo '$_sublime_path'" + (( $+commands[sudo] )) && alias sst="sudo -EH '$_sublime_path'" break fi done From 883da63320806532f3d3246b03f934e15aff3bab Mon Sep 17 00:00:00 2001 From: Mateus Fernandes de Mello Date: Tue, 6 Feb 2024 07:26:30 -0300 Subject: [PATCH 016/158] feat(web-search): add programming packages search (#12199) --- plugins/web-search/README.md | 4 ++++ plugins/web-search/web-search.plugin.zsh | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/plugins/web-search/README.md b/plugins/web-search/README.md index cf5bab3f7..d21c81ca9 100644 --- a/plugins/web-search/README.md +++ b/plugins/web-search/README.md @@ -46,6 +46,10 @@ Available search contexts are: | `ask` | `https://www.ask.com/web?q=` | | `youtube` | `https://www.youtube.com/results?search_query=` | | `deepl` | `https://www.deepl.com/translator#auto/auto/` | +| `dockerhub` | `https://hub.docker.com/search?q=` | +| `npmpkg` | `https://www.npmjs.com/search?q=` | +| `packagist` | `https://packagist.org/?query=` | +| `gopkg` | `https://pkg.go.dev/search?m=package&q=` | Also there are aliases for bang-searching DuckDuckGo: diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index 0fa2852dc..2fe4aea84 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -27,6 +27,10 @@ function web_search() { ask "https://www.ask.com/web?q=" youtube "https://www.youtube.com/results?search_query=" deepl "https://www.deepl.com/translator#auto/auto/" + dockerhub "https://hub.docker.com/search?q=" + npmpkg "https://www.npmjs.com/search?q=" + packagist "https://packagist.org/?query=" + gopkg "https://pkg.go.dev/search?m=package&q=" ) # check whether the search engine is supported @@ -75,6 +79,10 @@ alias scholar='web_search scholar' alias ask='web_search ask' alias youtube='web_search youtube' alias deepl='web_search deepl' +alias dockerhub='web_search dockerhub' +alias npmpkg='web_search npmpkg' +alias packagist='web_search packagist' +alias gopkg='web_search gopkg' #add your own !bang searches here alias wiki='web_search duckduckgo \!w' From 43613d7b710f9a06971fac48dea3301bbc15b579 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 7 Feb 2024 11:16:36 +0100 Subject: [PATCH 017/158] fix(web-search): use pattern instead of regex Closes #12202 --- plugins/web-search/web-search.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index 2fe4aea84..c602e0623 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -44,7 +44,7 @@ function web_search() { # if search goes in the query string ==> space as +, otherwise %20 # see https://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20 local param="-P" - [[ "$urls[$1]" =~ .*\?.*=$ ]] && param="" + [[ "$urls[$1]" == *\?*= ]] && param="" # build search url: # join arguments passed with '+', then append to search engine URL From fff073b55defed72a0a1aac4e853b165f208735b Mon Sep 17 00:00:00 2001 From: vladislav doster <10052309+vladdoster@users.noreply.github.com> Date: Thu, 8 Feb 2024 08:41:34 -0600 Subject: [PATCH 018/158] style(completion): remove extra space (#12206) --- lib/completion.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/completion.zsh b/lib/completion.zsh index 63379b53f..5a233a322 100644 --- a/lib/completion.zsh +++ b/lib/completion.zsh @@ -49,7 +49,7 @@ zstyle ':completion:*:*:*:users' ignored-patterns \ adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \ clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \ gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \ - ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \ + ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \ named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \ operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \ rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \ From bdcb4d9d1f36d5d82720dfd53f0c95242ab62dae Mon Sep 17 00:00:00 2001 From: SgtDaJim Date: Mon, 12 Feb 2024 16:43:52 +0800 Subject: [PATCH 019/158] feat(bira): add support for `kube-ps1` prompt (#8437) --- themes/bira.zsh-theme | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/themes/bira.zsh-theme b/themes/bira.zsh-theme index 42a70a018..f909afa62 100644 --- a/themes/bira.zsh-theme +++ b/themes/bira.zsh-theme @@ -6,10 +6,15 @@ local current_dir="%B%{$fg[blue]%}%~ %{$reset_color%}" local vcs_branch='$(git_prompt_info)$(hg_prompt_info)' local rvm_ruby='$(ruby_prompt_info)' local venv_prompt='$(virtualenv_prompt_info)' +if [[ "${plugins[@]}" =~ 'kube-ps1' ]]; then + local kube_prompt='$(kube_ps1)' +else + local kube_prompt='' +fi ZSH_THEME_RVM_PROMPT_OPTIONS="i v g" -PROMPT="╭─${user_host}${current_dir}${rvm_ruby}${vcs_branch}${venv_prompt} +PROMPT="╭─${user_host}${current_dir}${rvm_ruby}${vcs_branch}${venv_prompt}${kube_prompt} ╰─%B${user_symbol}%b " RPROMPT="%B${return_code}%b" From 8f22370af8bd390ea3b8610da1ccf388826d909d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 12 Feb 2024 09:48:38 +0100 Subject: [PATCH 020/158] fix(key-bindings): bind default arrow keys to `beginning-search` Fixes #12197 --- lib/key-bindings.zsh | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/lib/key-bindings.zsh b/lib/key-bindings.zsh index aaa73046e..a5650dd81 100644 --- a/lib/key-bindings.zsh +++ b/lib/key-bindings.zsh @@ -32,19 +32,26 @@ if [[ -n "${terminfo[knp]}" ]]; then fi # Start typing + [Up-Arrow] - fuzzy find history forward -if [[ -n "${terminfo[kcuu1]}" ]]; then - autoload -U up-line-or-beginning-search - zle -N up-line-or-beginning-search +autoload -U up-line-or-beginning-search +zle -N up-line-or-beginning-search +bindkey -M emacs "^[[A" up-line-or-beginning-search +bindkey -M viins "^[[A" up-line-or-beginning-search +bindkey -M vicmd "^[[A" up-line-or-beginning-search +if [[ -n "${terminfo[kcuu1]}" ]]; then bindkey -M emacs "${terminfo[kcuu1]}" up-line-or-beginning-search bindkey -M viins "${terminfo[kcuu1]}" up-line-or-beginning-search bindkey -M vicmd "${terminfo[kcuu1]}" up-line-or-beginning-search fi -# Start typing + [Down-Arrow] - fuzzy find history backward -if [[ -n "${terminfo[kcud1]}" ]]; then - autoload -U down-line-or-beginning-search - zle -N down-line-or-beginning-search +# Start typing + [Down-Arrow] - fuzzy find history backward +autoload -U down-line-or-beginning-search +zle -N down-line-or-beginning-search + +bindkey -M emacs "^[[B" down-line-or-beginning-search +bindkey -M viins "^[[B" down-line-or-beginning-search +bindkey -M vicmd "^[[B" down-line-or-beginning-search +if [[ -n "${terminfo[kcud1]}" ]]; then bindkey -M emacs "${terminfo[kcud1]}" down-line-or-beginning-search bindkey -M viins "${terminfo[kcud1]}" down-line-or-beginning-search bindkey -M vicmd "${terminfo[kcud1]}" down-line-or-beginning-search From 514d5736ea7b1af2cb2e6617048236aa9b34fc51 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 13 Feb 2024 17:25:16 +0100 Subject: [PATCH 021/158] ci: enable dependabot --- .github/dependabot.yml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..4dc9f3854 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,12 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: "weekly" + day: "sunday" + - package-ecosystem: "pip" + directory: "/.github/workflows/dependencies" + schedule: + interval: "weekly" + day: "sunday" From f9bbf6047b35ff00ea398857d2a09ffea5cd8bfa Mon Sep 17 00:00:00 2001 From: Raphael Boidol Date: Tue, 13 Feb 2024 17:32:44 +0100 Subject: [PATCH 022/158] ci: bump `actions/checkout` version (#12210) --- .github/workflows/installer.yml | 4 ++-- .github/workflows/main.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/installer.yml b/.github/workflows/installer.yml index cad5d445b..5593c9175 100644 --- a/.github/workflows/installer.yml +++ b/.github/workflows/installer.yml @@ -26,7 +26,7 @@ jobs: - macos-latest steps: - name: Set up git repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install zsh if: runner.os == 'Linux' run: sudo apt-get update; sudo apt-get install zsh @@ -42,7 +42,7 @@ jobs: - test steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Vercel CLI run: npm install -g vercel - name: Setup project and deploy diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index de7d98262..264ac31f3 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -24,7 +24,7 @@ jobs: if: github.repository == 'ohmyzsh/ohmyzsh' steps: - name: Set up git repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install zsh run: sudo apt-get update; sudo apt-get install zsh - name: Check syntax From 872b5cd4086a5547dbf788dda4e96ab3868cf59b Mon Sep 17 00:00:00 2001 From: Frederik Ring Date: Wed, 14 Feb 2024 12:14:08 +0100 Subject: [PATCH 023/158] docs(kubectx): add quoting to array keys (#12216) --- plugins/kubectx/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/kubectx/README.md b/plugins/kubectx/README.md index 98f1cf032..d924e745c 100644 --- a/plugins/kubectx/README.md +++ b/plugins/kubectx/README.md @@ -17,9 +17,9 @@ One can rename default context name for better readability. _Example_. Add to **.zshrc**: ``` -kubectx_mapping[minikube]="mini" -kubectx_mapping[context_name_from_kubeconfig]="$emoji[wolf_face]" -kubectx_mapping[production_cluster]="%{$fg[yellow]%}prod!%{$reset_color%}" +kubectx_mapping["minikube"]="mini" +kubectx_mapping["context_name_from_kubeconfig"]="$emoji[wolf_face]" +kubectx_mapping["production_cluster"]="%{$fg[yellow]%}prod!%{$reset_color%}" ``` ![staging](stage.png) From 15ffbdd346daa58de6701d3421787012420aa6cc Mon Sep 17 00:00:00 2001 From: Julian <489233+naydichev@users.noreply.github.com> Date: Mon, 19 Feb 2024 10:29:37 +0100 Subject: [PATCH 024/158] feat(zoxide): add option to override cmd (#12218) --- plugins/zoxide/README.md | 3 +++ plugins/zoxide/zoxide.plugin.zsh | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/zoxide/README.md b/plugins/zoxide/README.md index f326effe6..45f77bdf5 100644 --- a/plugins/zoxide/README.md +++ b/plugins/zoxide/README.md @@ -10,5 +10,8 @@ To use it, add `zoxide` to the plugins array in your `.zshrc` file: ```zsh plugins=(... zoxide) ``` +## Overriding `z` Alias + +You can set the `ZOXIDE_CMD_OVERRIDE`, which will be passed to the `--cmd` flag of `zoxide init`. This allows you to set your `z` command to a default of `cd`. **Note:** you have to [install zoxide](https://github.com/ajeetdsouza/zoxide#step-1-install-zoxide) first. diff --git a/plugins/zoxide/zoxide.plugin.zsh b/plugins/zoxide/zoxide.plugin.zsh index e5658b8f0..25d2e8377 100644 --- a/plugins/zoxide/zoxide.plugin.zsh +++ b/plugins/zoxide/zoxide.plugin.zsh @@ -1,5 +1,5 @@ if (( $+commands[zoxide] )); then - eval "$(zoxide init zsh)" + eval "$(zoxide init --cmd ${ZOXIDE_CMD_OVERRIDE:-z} zsh)" else echo '[oh-my-zsh] zoxide not found, please install it from https://github.com/ajeetdsouza/zoxide' fi From 40ff950fcd081078a8cd3de0eaab784f85c681d5 Mon Sep 17 00:00:00 2001 From: Oren Date: Tue, 20 Feb 2024 11:59:12 +0200 Subject: [PATCH 025/158] fix(docker): support completion on snap installs (#12224) --- plugins/docker/docker.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 7e657f2df..b429ae211 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -57,6 +57,6 @@ fi ! 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" + command docker completion zsh | tee "$ZSH_CACHE_DIR/completions/_docker" > /dev/null fi } &| From fcab8f161139d04fb1137be815d8130584a99713 Mon Sep 17 00:00:00 2001 From: Juan Morete Date: Fri, 23 Feb 2024 11:25:53 +0100 Subject: [PATCH 026/158] docs(ansible): remove duplicated alias entry (#12235) --- plugins/ansible/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/ansible/README.md b/plugins/ansible/README.md index e0e6a19bb..ce21e7075 100644 --- a/plugins/ansible/README.md +++ b/plugins/ansible/README.md @@ -21,7 +21,6 @@ plugins=(... ansible) | `acon` | command `ansible-console` | | `ainv` | command `ansible-inventory` | | `aplaybook` | command `ansible-playbook` | -| `ainv` | command `ansible-inventory` | | `adoc` | command `ansible-doc` | | `agal` | command `ansible-galaxy` | | `apull` | command `ansible-pull` | From c891b7e6ada5427f4c8cca05c8ed1ae33cb49943 Mon Sep 17 00:00:00 2001 From: Dusk Date: Tue, 27 Feb 2024 15:09:02 -0400 Subject: [PATCH 027/158] feat(tmux): add option for detached mode (#12242) --- plugins/tmux/README.md | 15 ++++++++------- plugins/tmux/tmux.plugin.zsh | 6 ++++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md index b4516ef26..a253457f2 100644 --- a/plugins/tmux/README.md +++ b/plugins/tmux/README.md @@ -19,13 +19,13 @@ The plugin also supports the following: | ---------- | -------------------------- | -------------------------------------------------------- | | `ta` | tmux attach -t | Attach new tmux session to already running named session | | `tad` | tmux attach -d -t | Detach named tmux session | -| `ts` | tmux new-session -s | Create a new named tmux session | -| `tl` | tmux list-sessions | Displays a list of running tmux sessions | -| `tksv` | tmux kill-server | Terminate all running tmux sessions | +| `tds` | `_tmux_directory_session` | Creates or attaches to a session for the current path | | `tkss` | tmux kill-session -t | Terminate named running tmux session | +| `tksv` | tmux kill-server | Terminate all running tmux sessions | +| `tl` | tmux list-sessions | Displays a list of running tmux sessions | | `tmux` | `_zsh_tmux_plugin_run` | Start a new tmux session | | `tmuxconf` | `$EDITOR $ZSH_TMUX_CONFIG` | Open .tmux.conf file with an editor | -| `tds` | `_tmux_directory_session` | Creates or attaches to a session for the current path | +| `ts` | tmux new-session -s | Create a new named tmux session | ## Configuration Variables @@ -35,10 +35,11 @@ The plugin also supports the following: | `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_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) | +| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | +| `ZSH_TMUX_DETACHED` | Set the detached mode (default: `false`) | | `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_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) | | `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 72cdd4818..0ecb0a5b5 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -14,6 +14,8 @@ fi # Automatically close the terminal when tmux exits : ${ZSH_TMUX_AUTOQUIT:=$ZSH_TMUX_AUTOSTART} # Set term to screen or screen-256color based on current terminal support +: ${ZSH_TMUX_DETACHED:=false} +# Set detached mode : ${ZSH_TMUX_FIXTERM:=true} # Set '-CC' option for iTerm2 tmux integration : ${ZSH_TMUX_ITERM2:=false} @@ -79,9 +81,9 @@ function _zsh_tmux_plugin_run() { # Try to connect to an existing session. if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then - [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach -t $ZSH_TMUX_DEFAULT_SESSION_NAME + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach ${ZSH_TMUX_DETACHED:+"-d"} -t $ZSH_TMUX_DEFAULT_SESSION_NAME else - [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach ${ZSH_TMUX_DETACHED:+"-d"} fi # If failed, just run tmux, fixing the TERM variable if requested. From 51bf9fc2def19f1d3059c15059df21ddddb518fd Mon Sep 17 00:00:00 2001 From: Pandu E POLUAN Date: Wed, 28 Feb 2024 16:52:09 +0700 Subject: [PATCH 028/158] feat(tmux): prioritize `tmux` terminfo (#12243) Co-authored-by: Carlo Sala --- plugins/tmux/README.md | 32 ++++++++++++++++---------------- plugins/tmux/tmux.plugin.zsh | 16 ++++++++++++---- 2 files changed, 28 insertions(+), 20 deletions(-) diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md index a253457f2..50f8b2c2f 100644 --- a/plugins/tmux/README.md +++ b/plugins/tmux/README.md @@ -1,7 +1,7 @@ # tmux -This plugin provides aliases for [tmux](https://tmux.github.io/), the terminal multiplexer. -To use it add `tmux` to the plugins array in your zshrc file. +This plugin provides aliases for [tmux](https://tmux.github.io/), the terminal multiplexer. To use it add +`tmux` to the plugins array in your zshrc file. ```zsh plugins=(... tmux) @@ -29,17 +29,17 @@ 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_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) | -| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | -| `ZSH_TMUX_DETACHED` | Set the detached mode (default: `false`) | -| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support | -| `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_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) | -| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode | +| 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_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) | +| `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | +| `ZSH_TMUX_DETACHED` | Set the detached mode (default: `false`) | +| `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support | +| `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `tmux` if available, `screen` otherwise) | +| `ZSH_TMUX_FIXTERM_WITH_256COLOR` | `$TERM` to use for 256-color terminals (default: `tmux-256color` if available, `screen-256color` otherwise) | +| `ZSH_TMUX_ITERM2` | Sets the `-CC` option for iTerm2 tmux integration (default: `false`) | +| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode | diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 0ecb0a5b5..09e326344 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -20,13 +20,21 @@ fi # Set '-CC' option for iTerm2 tmux integration : ${ZSH_TMUX_ITERM2:=false} # The TERM to use for non-256 color terminals. -# Tmux states this should be screen, but you may need to change it on +# Tmux states this should be tmux|screen, but you may need to change it on # systems without the proper terminfo -: ${ZSH_TMUX_FIXTERM_WITHOUT_256COLOR:=screen} +if [[ -e /usr/share/terminfo/t/tmux ]]; then + : ${ZSH_TMUX_FIXTERM_WITHOUT_256COLOR:=tmux} +else + : ${ZSH_TMUX_FIXTERM_WITHOUT_256COLOR:=screen} +fi # The TERM to use for 256 color terminals. -# Tmux states this should be screen-256color, but you may need to change it on +# Tmux states this should be (tmux|screen)-256color, but you may need to change it on # systems without the proper terminfo -: ${ZSH_TMUX_FIXTERM_WITH_256COLOR:=screen-256color} +if [[ -e /usr/share/terminfo/t/tmux-256color ]]; then + : ${ZSH_TMUX_FIXTERM_WITH_256COLOR:=tmux-256color} +else + : ${ZSH_TMUX_FIXTERM_WITH_256COLOR:=screen-256color} +fi # Set the configuration path if [[ -e $HOME/.tmux.conf ]]; then : ${ZSH_TMUX_CONFIG:=$HOME/.tmux.conf} From 6a65ac90259d87f7549c581372403405ef01b7d2 Mon Sep 17 00:00:00 2001 From: Pandu E POLUAN Date: Thu, 29 Feb 2024 15:40:40 +0700 Subject: [PATCH 029/158] feat(eza): create plugin (#12237) Co-authored-by: Carlo Sala --- .github/CODEOWNERS | 5 +- plugins/eza/README.md | 101 +++++++++++++++++++++++++++++++++++++ plugins/eza/eza.plugin.zsh | 62 +++++++++++++++++++++++ 3 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 plugins/eza/README.md create mode 100644 plugins/eza/eza.plugin.zsh diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0c5f3acee..361ed624b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,13 +1,14 @@ # Plugin owners plugins/archlinux/ @ratijas +plugins/dbt/ @msempere +plugins/eza/ @pepoluan plugins/genpass/ @atoponce plugins/git-lfs/ @hellovietduc plugins/gitfast/ @felipec plugins/react-native @esthor plugins/sdk/ @rgoldberg plugins/shell-proxy/ @septs +plugins/starship/ @axieax plugins/universalarchive/ @Konfekt plugins/wp-cli/ @joshmedeski plugins/zoxide/ @ajeetdsouza -plugins/starship/ @axieax -plugins/dbt/ @msempere diff --git a/plugins/eza/README.md b/plugins/eza/README.md new file mode 100644 index 000000000..5de935c2c --- /dev/null +++ b/plugins/eza/README.md @@ -0,0 +1,101 @@ +# eza plugin + +This provides aliases that invoke the [`eza`](https://github.com/eza-community/eza) utility rather than `ls` + +To use it add `eza` to the plugins array in your zshrc file: + +```zsh +plugins=(... eza) +``` + +## Configuration + +All configurations are done using the `zstyle` command in the `:omz:plugins:eza` namespace. + +**NOTE:** The configuring needs to be done prior to OMZ loading the plugins. When the plugin is loaded, +changing the `zstyle` won't have any effect. + +### `dirs-first` + +```zsh +zstyle ':omz:plugins:eza' 'dirs-first' yes|no +``` + +If `yes`, directories will be grouped first. + +Default: `no` + +### `git-status` + +```zsh +zstyle ':omz:plugins:eza' 'git-status' yes|no +``` + +If `yes`, always add `--git` flag to indicate git status (if tracked / in a git repo). + +Default: `no` + +### `header` + +```zsh +zstyle ':omz:plugins:eza' 'header' yes|no +``` + +If `yes`, always add `-h` flag to add a header row for each column. + +Default: `no` + +### `show-group` + +```zsh +zstyle ':omz:plugins:eza' 'show-group' yes|no +``` + +If `yes` (default), always add `-g` flag to show the group ownership. + +Default: `yes` + +### `size-prefix` + +```zsh +zstyle ':omz:plugins:eza' 'size-prefix' (binary|none|si) +``` + +Choose the prefix to be used in displaying file size: + +- `binary` -- use [binary prefixes](https://en.wikipedia.org/wiki/Binary_prefix) such as "Ki", "Mi", "Gi" and + so on +- `none` -- don't use any prefix, show size in bytes +- `si` (default) -- use [Metric/S.I. prefixes](https://en.wikipedia.org/wiki/Metric_prefix) + +Default: `si` + +### `time-style` + +```zsh +zstyle ':omz:plugins:eza' 'time-style' $TIME_STYLE +``` + +Sets the `--time-style` option of `eza`. (See `man eza` for the options) + +Default: Not set, which means the default behavior of `eza` will take place. + +## Aliases + +**Notes:** + +- Aliases may be modified by Configuration +- The term "files" without "only" qualifier means both files & directories + +| Alias | Command | Description | +| ------ | ----------------- | -------------------------------------------------------------------------- | +| `la` | `eza -la` | List all files (except . and ..) as a long list | +| `ldot` | `eza -ld .*` | List dotfiles only (directories shown as entries instead of recursed into) | +| `lD` | `eza -lD` | List only directories (excluding dotdirs) as a long list | +| `lDD` | `eza -laD` | List only directories (including dotdirs) as a long list | +| `ll` | `eza -l` | List files as a long list | +| `ls` | `eza` | Plain eza call | +| `lsd` | `eza -d` | List specified files with directories as entries, in a grid | +| `lsdl` | `eza -dl` | List specified files with directories as entries, in a long list | +| `lS` | `eza -l -ssize` | List files as a long list, sorted by size | +| `lT` | `eza -l -snewest` | List files as a long list, sorted by date (newest last) | diff --git a/plugins/eza/eza.plugin.zsh b/plugins/eza/eza.plugin.zsh new file mode 100644 index 000000000..6d7f720bd --- /dev/null +++ b/plugins/eza/eza.plugin.zsh @@ -0,0 +1,62 @@ +if ! (( $+commands[eza] )); then + print "zsh eza plugin: eza not found. Please install eza before using this plugin." >&2 + return 1 +fi + +typeset -a _EZA_HEAD +typeset -a _EZA_TAIL + +function _configure_eza() { + local _val + # Get the head flags + if zstyle -T ':omz:plugins:eza' 'show-group'; then + _EZA_HEAD+=("g") + fi + if zstyle -t ':omz:plugins:eza' 'header'; then + _EZA_HEAD+=("h") + fi + zstyle -s ':omz:plugins:eza' 'size-prefix' _val + case "${_val:l}" in + binary) + _EZA_HEAD+=("b") + ;; + none) + _EZA_HEAD+=("B") + ;; + esac + # Get the tail long-options + if zstyle -t ':omz:plugins:eza' 'dirs-first'; then + _EZA_TAIL+=("--group-directories-first") + fi + if zstyle -t ':omz:plugins:eza' 'git-status'; then + _EZA_TAIL+=("--git") + fi + zstyle -s ':omz:plugins:eza' 'time-style' _val + if [[ $_val ]]; then + _EZA_TAIL+=("--time-style='$_val'") + fi +} + +_configure_eza + +function _alias_eza() { + local _head="${(j::)_EZA_HEAD}$2" + local _tail="${(j: :)_EZA_TAIL}" + alias "$1"="eza${_head:+ -}${_head}${_tail:+ }${_tail}${3:+ }$3" +} + +_alias_eza la la +_alias_eza ldot ld ".*" +_alias_eza lD lD +_alias_eza lDD lDa +_alias_eza ll l +_alias_eza ls +_alias_eza lsd d +_alias_eza lsdl dl +_alias_eza lS "l -ssize" +_alias_eza lT "l -snewest" + +unfunction _alias_eza +unfunction _configure_eza +unset _EZA_HEAD +unset _EZA_TAIL From 65b23a3328bfd7ddf3234de4538fa7c3e9644491 Mon Sep 17 00:00:00 2001 From: Jonathan De Troye Date: Thu, 29 Feb 2024 13:05:54 -0500 Subject: [PATCH 030/158] fix(tmux): do not pass empty flags to aliases (#12232) This enables compatibility with tmux >3.3a Co-authored-by: Carlo Sala --- plugins/tmux/tmux.plugin.zsh | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 09e326344..436e2671d 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -47,14 +47,27 @@ fi : ${ZSH_TMUX_UNICODE:=false} # ALIASES -alias ta='tmux attach -t' -alias tad='tmux attach -d -t' -alias ts='tmux new-session -s' -alias tl='tmux list-sessions' +function _build_tmux_alias { + eval "function $1 { + if [[ -z \$1 ]] || [[ \${1::1} == '-' ]]; then + tmux $2 \"\$@\" + else + tmux $2 $3 \"\$@\" + fi + }" +} + alias tksv='tmux kill-server' -alias tkss='tmux kill-session -t' +alias tl='tmux list-sessions' alias tmuxconf='$EDITOR $ZSH_TMUX_CONFIG' +_build_tmux_alias "ta" "attach" "-t" +_build_tmux_alias "tad" "attach -d" "-t" +_build_tmux_alias "ts" "new-session" "-s" +_build_tmux_alias "tkss" "kill-session" "-t" + +unfunction _build_tmux_alias + # Determine if the terminal supports 256 colors if [[ $terminfo[colors] == 256 ]]; then export ZSH_TMUX_TERM=$ZSH_TMUX_FIXTERM_WITH_256COLOR From 50fd98e5a6c9d7c36b0cc678f577f7ce1d181bea Mon Sep 17 00:00:00 2001 From: Gam <1348187+Y3K@users.noreply.github.com> Date: Thu, 29 Feb 2024 14:59:27 -0600 Subject: [PATCH 031/158] fix(ssh): allow multiple definitions per host (#12227) --- plugins/ssh/ssh.plugin.zsh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/ssh/ssh.plugin.zsh b/plugins/ssh/ssh.plugin.zsh index 085e71fa1..b5b050536 100644 --- a/plugins/ssh/ssh.plugin.zsh +++ b/plugins/ssh/ssh.plugin.zsh @@ -4,9 +4,16 @@ # Filter out wildcard host sections. _ssh_configfile="$HOME/.ssh/config" if [[ -f "$_ssh_configfile" ]]; then - _hosts=($(egrep '^Host.*' "$_ssh_configfile" | awk '{print $2}' | grep -v '^*' | sed -e 's/\.*\*$//')) - zstyle ':completion:*:hosts' hosts $_hosts - unset _hosts + _ssh_hosts=($( + egrep '^Host.*' "$_ssh_configfile" |\ + awk '{for (i=2; i<=NF; i++) print $i}' |\ + sort |\ + uniq |\ + grep -v '^*' |\ + sed -e 's/\.*\*$//' + )) + zstyle ':completion:*:hosts' hosts $_ssh_hosts + unset _ssh_hosts fi unset _ssh_configfile From 9730915910c6cc7640f8af6063ffb93becf0414a Mon Sep 17 00:00:00 2001 From: Artem Babii Date: Thu, 29 Feb 2024 23:07:10 +0200 Subject: [PATCH 032/158] feat(kube-ps1): add symlink support (#12208) --- plugins/kube-ps1/README.md | 1 + plugins/kube-ps1/kube-ps1.plugin.zsh | 27 ++++++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/plugins/kube-ps1/README.md b/plugins/kube-ps1/README.md index 1ed3e4438..dd49eff39 100644 --- a/plugins/kube-ps1/README.md +++ b/plugins/kube-ps1/README.md @@ -136,6 +136,7 @@ the following environment variables: | `KUBE_PS1_SUFFIX` | `)` | Prompt closing character | | `KUBE_PS1_CLUSTER_FUNCTION` | No default, must be user supplied | Function to customize how cluster is displayed | | `KUBE_PS1_NAMESPACE_FUNCTION` | No default, must be user supplied | Function to customize how namespace is displayed | +| `KUBE_PS1_KUBECONFIG_SYMLINK` | `false` | Treat `KUBECONFIG` and `~/.kube/config` files as symbolic links | For terminals that do not support UTF-8, the symbol will be replaced with the string `k8s`. diff --git a/plugins/kube-ps1/kube-ps1.plugin.zsh b/plugins/kube-ps1/kube-ps1.plugin.zsh index 894e0f7f0..7edc62de8 100644 --- a/plugins/kube-ps1/kube-ps1.plugin.zsh +++ b/plugins/kube-ps1/kube-ps1.plugin.zsh @@ -40,6 +40,7 @@ KUBE_PS1_NS_COLOR="${KUBE_PS1_NS_COLOR-cyan}" KUBE_PS1_BG_COLOR="${KUBE_PS1_BG_COLOR}" KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}" +KUBE_PS1_KUBECONFIG_SYMLINK="${KUBE_PS1_KUBECONFIG_SYMLINK:-false}" KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled" KUBE_PS1_LAST_TIME=0 KUBE_PS1_CLUSTER_FUNCTION="${KUBE_PS1_CLUSTER_FUNCTION}" @@ -190,14 +191,26 @@ _kube_ps1_file_newer_than() { local file=$1 local check_time=$2 - if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then - mtime=$(zstat +mtime "${file}") - elif stat -c "%s" /dev/null &> /dev/null; then - # GNU stat - mtime=$(stat -L -c %Y "${file}") + if [[ "${KUBE_PS1_KUBECONFIG_SYMLINK}" == "true" ]]; then + if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then + mtime=$(zstat -L +mtime "${file}") + elif stat -c "%s" /dev/null &> /dev/null; then + # GNU stat + mtime=$(stat -c %Y "${file}") + else + # BSD stat + mtime=$(stat -f %m "$file") + fi else - # BSD stat - mtime=$(stat -L -f %m "$file") + if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then + mtime=$(zstat +mtime "${file}") + elif stat -c "%s" /dev/null &> /dev/null; then + # GNU stat + mtime=$(stat -L -c %Y "${file}") + else + # BSD stat + mtime=$(stat -L -f %m "$file") + fi fi [[ "${mtime}" -gt "${check_time}" ]] From 0008534147a28eeeea52cfd92154ae2e801678ae Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 1 Mar 2024 16:44:20 +0100 Subject: [PATCH 033/158] fix(tmux): regression with detached sessions See https://github.com/ohmyzsh/ohmyzsh/pull/12242#issuecomment-1973236605 --- plugins/tmux/tmux.plugin.zsh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 436e2671d..11550d687 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -100,11 +100,13 @@ function _zsh_tmux_plugin_run() { [[ "$ZSH_TMUX_ITERM2" == "true" ]] && tmux_cmd+=(-CC) [[ "$ZSH_TMUX_UNICODE" == "true" ]] && tmux_cmd+=(-u) + local _detached="" + [[ "$ZSH_TMUX_DETACHED" == "true" ]] && _detached="-d" # Try to connect to an existing session. if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then - [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach ${ZSH_TMUX_DETACHED:+"-d"} -t $ZSH_TMUX_DEFAULT_SESSION_NAME + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached -t $ZSH_TMUX_DEFAULT_SESSION_NAME else - [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach ${ZSH_TMUX_DETACHED:+"-d"} + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached fi # If failed, just run tmux, fixing the TERM variable if requested. From e3216d15c2d2ee81716e4c2cbc999b4bed5694d9 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 2 Mar 2024 00:57:26 +0100 Subject: [PATCH 034/158] fix(git-commit)!: allow alias update BREAKING CHANGE: Prior to this commit, git aliases were not being updated after every update of oh-my-zsh. In case you were using git-commit plugin before this commit, please remove your git aliases to proceed. --- plugins/git-commit/git-commit.plugin.zsh | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index 3f0c2121d..207c37e21 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -1,3 +1,8 @@ +if git config --global --get-all alias.$_alias >/dev/null 2>&1 \ + && ! git config --global --get-all oh-my-zsh.git-commit-alias >/dev/null 2>&1; then + return +fi + local -a _git_commit_aliases _git_commit_aliases=( 'build' @@ -14,19 +19,18 @@ _git_commit_aliases=( 'wip' ) -local alias type -for type in "${_git_commit_aliases[@]}"; do +local _alias _type +for _type in "${_git_commit_aliases[@]}"; do # an alias can't be named "revert" because the git command takes precedence # https://stackoverflow.com/a/3538791 - case "$type" in - revert) alias=rev ;; - *) alias=$type ;; + case "$_type" in + revert) _alias=rev ;; + *) _alias=$_type ;; esac - local func='!a() { if [ "$1" = "-s" ] || [ "$1" = "--scope" ]; then local scope="$2"; shift 2; git commit -m "'$type'(${scope}): ${@}"; else git commit -m "'$type': ${@}"; fi }; a' - if ! git config --global --get-all alias.${alias} >/dev/null 2>&1; then - git config --global alias.${alias} "$func" - fi + local _func='!a() { if [ "$1" = "-s" ] || [ "$1" = "--scope" ]; then local scope="$2"; shift 2; git commit -m "'$type'(${scope}): ${@}"; else git commit -m "'$type': ${@}"; fi }; a' + + git config --global alias.$_alias "$_func" done -unset _git_commit_aliases alias type func +git config --global oh-my-zsh.git-commit-alias "true" From 3ee108ccb301dd4143080e8bfd8f9ae869957a2e Mon Sep 17 00:00:00 2001 From: Rejman Date: Sat, 2 Mar 2024 01:21:30 +0100 Subject: [PATCH 035/158] feat(git-commit): add `-a | --attention` flag Refactor function as well to reduce flaws and increase stability Closes #12234 Co-authored-by: Carlo Sala --- plugins/git-commit/git-commit.plugin.zsh | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index 207c37e21..7ad349735 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -28,7 +28,30 @@ for _type in "${_git_commit_aliases[@]}"; do *) _alias=$_type ;; esac - local _func='!a() { if [ "$1" = "-s" ] || [ "$1" = "--scope" ]; then local scope="$2"; shift 2; git commit -m "'$type'(${scope}): ${@}"; else git commit -m "'$type': ${@}"; fi }; a' + local _func='!a() { +local _scope _attention _message +while [ $# -ne 0 ]; do +case $1 in + -s | --scope ) + if [ -z $2 ]; then + echo "Missing scope!" + return 1 + fi + _scope="$2" + shift 2 + ;; + -a | --attention ) + _attention="!" + shift 1 + ;; + * ) + _message+=" $1" + shift 1 + ;; +esac +done +git commit -m "'$_type'${_scope:+(${_scope})}${_attention}:${_message}" +}; a' git config --global alias.$_alias "$_func" done From 8e088ded8289a9db2a9f2c03cab618d6dd017dd7 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 2 Mar 2024 01:25:20 +0100 Subject: [PATCH 036/158] docs(git-commit): document attention flag --- plugins/git-commit/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md index a00983935..49072d0fb 100644 --- a/plugins/git-commit/README.md +++ b/plugins/git-commit/README.md @@ -11,7 +11,7 @@ plugins=(... git-commit) ## Syntax ```zsh -git [(-s, --scope) ""] "" +git [(-s, --scope) ""] [(-a, --attention)] "" ``` > ⚠️ Single/Double quotes around the scope and message are required From 2c62584b8389cb9510c12f7c28b5ca7970619277 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E5=A4=A9=E6=B3=BD?= <35888946+zhangtianze1997@users.noreply.github.com> Date: Sat, 2 Mar 2024 16:12:34 +0800 Subject: [PATCH 037/158] fix(tmux): use full offset parameter (#12249) --- 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 11550d687..791592d8f 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -49,7 +49,7 @@ fi # ALIASES function _build_tmux_alias { eval "function $1 { - if [[ -z \$1 ]] || [[ \${1::1} == '-' ]]; then + if [[ -z \$1 ]] || [[ \${1:0:1} == '-' ]]; then tmux $2 \"\$@\" else tmux $2 $3 \"\$@\" From b6c1de87b01aaf5eb434b86b1d32b92cb37467bb Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 2 Mar 2024 10:05:44 +0100 Subject: [PATCH 038/158] fix(git-commit): add omz version check --- plugins/git-commit/git-commit.plugin.zsh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/git-commit/git-commit.plugin.zsh b/plugins/git-commit/git-commit.plugin.zsh index 7ad349735..121ae59de 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -1,7 +1,8 @@ -if git config --global --get-all alias.$_alias >/dev/null 2>&1 \ - && ! git config --global --get-all oh-my-zsh.git-commit-alias >/dev/null 2>&1; then +local _rev="$(git -C $ZSH rev-parse HEAD 2> /dev/null)" +if [[ $_rev == $(git config --global --get oh-my-zsh.git-commit-alias 2> /dev/null) ]]; then return fi +git config --global oh-my-zsh.git-commit-alias "$_rev" local -a _git_commit_aliases _git_commit_aliases=( @@ -55,5 +56,3 @@ git commit -m "'$_type'${_scope:+(${_scope})}${_attention}:${_message}" git config --global alias.$_alias "$_func" done - -git config --global oh-my-zsh.git-commit-alias "true" From 458fc2e1df4757e64b036edee17ccdefdde41f73 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 2 Mar 2024 10:05:54 +0100 Subject: [PATCH 039/158] docs(git-commit): add warning --- plugins/git-commit/README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/git-commit/README.md b/plugins/git-commit/README.md index 49072d0fb..f812ee23f 100644 --- a/plugins/git-commit/README.md +++ b/plugins/git-commit/README.md @@ -1,6 +1,8 @@ # 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. +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: @@ -14,8 +16,6 @@ plugins=(... git-commit) git [(-s, --scope) ""] [(-a, --attention)] "" ``` -> ⚠️ Single/Double quotes around the scope and message are required - Where `type` is one of the following: - `build` @@ -34,6 +34,9 @@ Where `type` is one of the following: > NOTE: the alias for `revert` type is `rev`, as otherwise it conflicts with the git command of the same name. > It will still generate a commit message in the format `revert: ` +> ⚠️ Enabling this plugin will (potentially) overwrite all `alias.` that you manually set. Use with +> care! + ## Examples | Git alias | Command | From 70395a64637ad1a94b11f6007f29ee0c0d716884 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sun, 3 Mar 2024 11:22:25 +0100 Subject: [PATCH 040/158] fix(git): do not use `+=` in sh script Fixes #12251 --- 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 121ae59de..c4df77c80 100644 --- a/plugins/git-commit/git-commit.plugin.zsh +++ b/plugins/git-commit/git-commit.plugin.zsh @@ -46,7 +46,7 @@ case $1 in shift 1 ;; * ) - _message+=" $1" + _message="${_message} $1" shift 1 ;; esac From 97a86ed1678022683d9f0113ada51f4ed8aa7375 Mon Sep 17 00:00:00 2001 From: Maxime Brunet Date: Sun, 3 Mar 2024 10:56:40 +0000 Subject: [PATCH 041/158] feat(terraform): update completion to `v1.7` (#12252) --- plugins/terraform/_terraform | 820 ++++++++++++++++++++--------------- 1 file changed, 469 insertions(+), 351 deletions(-) diff --git a/plugins/terraform/_terraform b/plugins/terraform/_terraform index 625834563..aad1c6096 100644 --- a/plugins/terraform/_terraform +++ b/plugins/terraform/_terraform @@ -1,411 +1,529 @@ #compdef terraform +compdef _terraform 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' +(( ${+functions[_terraform_commands]} )) || _terraform_commands() { + local -a _terraform_cmds + _terraform_cmds=( + 'apply:Create or update infrastructure' + 'console:Try Terraform expressions at an interactive command prompt' + 'destroy:Destroy previously-created infrastructure' + 'fmt:Reformat your configuration in the standard style' + 'force-unlock:Release a stuck lock on the current workspace' + 'get:Install or upgrade remote Terraform modules' + 'graph:Generate a Graphviz graph of the steps in an operation' + 'import:Associate existing infrastructure with a Terraform resource' + 'init:Prepare your working directory for other commands' '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' + 'metadata:Metadata related commands' + 'output:Show output values from your root module' + 'plan:Show changes required by the current configuration' + 'providers:Show the providers required for this configuration' + 'refresh:Update the state to match remote systems' + 'show:Show the current state or a saved 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' + 'taint:Mark a resource instance as not fully functional' + 'test:Execute integration tests for Terraform modules' + 'untaint:Remove the '\''tainted'\'' state from a resource instance' + 'validate:Check whether the configuration is valid' + 'version:Show the current 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' -) + ) + if ((CURRENT == 1)); then + _describe -t commands 'terraform commands' _terraform_cmds + return + fi -__012upgrade() { + local curcontext="${curcontext}" + cmd="${${_terraform_cmds[(r)$words[1]:*]%%:*}}" + curcontext="${curcontext%:*:*}:terraform-${cmd}:" + + if (( ${+functions[_terraform_$cmd]} )); then + "_terraform_${cmd}" + else + _message "no more options" + fi +} + +(( ${+functions[_terraform_apply]} )) || _terraform_apply() { _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.]' + '-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.]' \ + '-destroy[Destroy Terraform-managed infrastructure. The command "terraform destroy" is a convenience alias for this option.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-input=[(true) Ask for input for variables if not directly set.]:input:(true false)' \ + '-no-color[If specified, output won'\''t contain any color.]' \ + '-parallelism=[(10) Limit the number of parallel resource operations.]' \ + '-refresh=[(true) Skip checking for external changes to remote objects while creating the plan. This can potentially make planning faster, but at the expense of possibly planning against a stale record of the remote system state.]:refresh:(true false)' \ + '*-replace=[(resource) Force replacement of a particular resource instance using its resource address. If applying would'\''ve normally produced an update or no-op action for this instance, Terraform will replace it instead. You can use this option multiple times to replace more than one object.]:resource:__terraform_state_resources' \ + '-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) Limit the operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' \ + ':plan:_files -' } -__013upgrade() { +(( ${+functions[_terraform_console]} )) || _terraform_console() { _arguments \ - '-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]' + '-state=[(terraform.tfstate) Legacy option for the local backend only. See the local backend'\''s documentation for more information.]' \ + '-plan[Create a new plan (as if running "terraform plan") and then evaluate expressions against its planned state, instead of evaluating against the current state. You can use this to inspect the effects of configuration changes that haven'\''t been applied yet.]' \ + '*-var=[(for=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}"' } -__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() { +(( ${+functions[_terraform_destroy]} )) || _terraform_destroy() { _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.]' \ + '-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) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-input=[(true) Ask for input for variables if not directly set.]:input:(true false)' \ + '-no-color[If specified, output won'\''t contain any color.]' \ + '-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.]:refresh:(true false)' \ + '-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) Limit the operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' +} + +(( ${+functions[_terraform_fmt]} )) || _terraform_fmt() { + _arguments \ + '-list=[(true) Don'\''t list files whose formatting differs (always disabled if using STDIN)]:list:(true false)' \ + '-write=[(true) Don'\''t write to source files (always disabled if using STDIN or -check)]:write:(true false)' \ + '-diff[Display diffs of formatting changes]' \ + '-check[Check if the input is formatted. Exit status will be 0 if all input is properly formatted and non-zero otherwise.]' \ + '-no-color[If specified, output won'\''t contain any color.]' \ + '-recursive[Also process files in subdirectories. By default, only the given directory (or current directory) is processed.]' \ + '*:targets:_files -' +} + +(( ${+functions[_terraform_force-unlock]} )) || _terraform_force-unlock() { + _arguments \ + '-force[Don'\''t ask for input for unlock confirmation.]' \ + ':lock_id:' +} + +(( ${+functions[_terraform_get]} )) || _terraform_get() { + _arguments \ + '-update[Check already-downloaded modules for available updates and install the newest versions available.]' \ + '-no-color[Disable text coloring in the output.]' \ + '-test-directory=[(tests) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' +} + +(( ${+functions[_terraform_graph]} )) || _terraform_graph() { + _arguments \ + '-draw-cycles[Highlight any cycles in the graph with colored edges. This helps when diagnosing cycle errors. This option is supported only when illustrating a real evaluation graph, selected using the -type=TYPE option.]' \ + '-module-depth=[(-1) (deprecated) In prior versions of Terraform, specified the depth of modules to show in the output.]' \ + '-plan=[Render graph using the specified plan file instead of the configuration in the current directory. Implies -type=apply.]:plan:_files -' \ + '-type=[(plan) Type of operation graph to output. Can be: plan, plan-refresh-only, plan-destroy, or apply. By default Terraform just summarizes the relationships between the resources in your configuration, without any particular operation in mind. Full operation graphs are more detailed but therefore often harder to read.]:type:(plan plan-refresh-only plan-destroy apply)' +} + +(( ${+functions[_terraform_import]} )) || _terraform_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.]:config:_files -/' \ + '-input=[(true) Disable interactive input prompts.]:input:(true false)' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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=[(for=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}"' \ + ':addr:' \ + ':id:' +} + +(( ${+functions[_terraform_init]} )) || _terraform_init() { + _arguments \ + '-backend=[(true) Disable backend or Terraform Cloud initialization for this configuration and use what was previously initialized instead.]:backend:(true false)' \ + '-backend-config=[Configuration to be merged with what is in the configuration file'\''s '\''backend'\'' block. This can be either a path to an HCL file with key/value assignments (same format as terraform.tfvars) or a '\''key=value'\'' format, and can be specified multiple times. The backend type must be in the configuration itself.]:backend_config:_files -' \ + '-force-copy[Suppress prompts about copying state data. This is equivalent to providing a "yes" to all confirmation prompts.]' \ + '-from-module=[Copy the contents of the given module into the target directory before initialization.]:from_module:_files -/' \ + '-get=[(true) Disable downloading modules for this configuration.]:get:(true false)' \ + '-input=[(true) Disable interactive prompts. Note that some actions may require interactive prompts and will error if input is disabled.]:input:(true false)' \ + '-lock=[(true) Don'\''t hold a state lock during backend migration. This is dangerous if others might concurrently run commands against the same workspace.]: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.]' \ + '-migrate-state[Reconfigure a backend, and attempt to migrate any existing state.]' \ + '-upgrade[Install the latest module and provider versions allowed within configured constraints, overriding the default behavior of selecting exactly the version recorded in the dependency lockfile.]' \ + '-lockfile=[Set a dependency lockfile mode. Currently only "readonly" is valid.]:lockfile:( readonly )' \ + '-ignore-remote-version[A rare option used for Terraform Cloud and the remote backend only. Set this to ignore checking that the local and remote Terraform versions use compatible state representations, making an operation proceed even when there is a potential mismatch. See the documentation on configuring Terraform with Terraform Cloud for more information.]' \ + '-test-directory=[(tests) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' +} + +(( ${+functions[_terraform_login]} )) || _terraform_login() { + _arguments \ + ':hostname:' +} + +(( ${+functions[_terraform_logout]} )) || _terraform_logout() { + _arguments \ + ':hostname:' +} + +(( ${+functions[_terraform_metadata]} )) || _terraform_metadata() { + local -a _metadata_cmds + _metadata_cmds=( + 'functions:Show signatures and descriptions for the available functions' + ) + if [[ "${CURRENT}" -lt 3 ]]; then + _describe -t commands "terraform metadata commands" _metadata_cmds + return + fi + + local curcontext="${curcontext}" + cmd="${${_metadata_cmds[(r)$words[2]:*]%%:*}}" + curcontext="${curcontext%:*:*}:terraform-metadata-${cmd}:" + + if (( ${+functions[_terraform_metadata_$cmd]} )); then + "_terraform_metadata_${cmd}" + else + _message "no more options" + fi +} + +(( ${+functions[_terraform_metadata_functions]} )) || _terraform_metadata_functions() { + _arguments \ + '-json' \ + '::' +} + +(( ${+functions[_terraform_output]} )) || _terraform_output() { + _arguments \ + '-state=[(path) Path to the state file to read. Defaults to "terraform.tfstate". Ignored when remote state is used.]: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]' \ + '-raw[For value types that can be automatically converted to a string, will print the raw string directly, rather than a human-oriented representation of the value.]' \ + ':name:' +} + +(( ${+functions[_terraform_plan]} )) || _terraform_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[Select the "destroy" planning mode, which creates a plan to destroy all objects currently managed by this Terraform configuration instead of the usual behavior.]' \ + '-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.]:input:(true false)' \ + '-generate-config-out=[(path) (Experimental) If import blocks are present in configuration, instructs Terraform to generate HCL for any imported resources not already present. The configuration is written to a new file at PATH, which must not already exist. Terraform may still attempt to write configuration if the plan errors.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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) Skip checking for external changes to remote objects while creating the plan. This can potentially make planning faster, but at the expense of possibly planning against a stale record of the remote system state.]:refresh:(true false)' \ + '-refresh-only[Select the "refresh only" planning mode, which checks whether remote objects still match the outcome of the most recent Terraform apply but does not propose any actions to undo any changes made outside of Terraform.]' \ + '*-replace=[(resource) Force replacement of a particular resource instance using its resource address. If the plan would'\''ve normally produced an update or no-op action for this instance, Terraform will plan to replace it instead. You can use this option multiple times to replace more than one object.]:replace:__terraform_state_resources' \ + '-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) Limit the planning operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' +} + +(( ${+functions[_terraform_providers]} )) || _terraform_providers() { + local -a _providers_cmds + _providers_cmds=( + 'lock:Write out dependency locks for the configured providers' + 'mirror:Save local copies of all required provider plugins' + 'schema:Show schemas for the providers used in the configuration' + ) + + if [[ "${CURRENT}" -lt 3 ]]; then + _arguments \ + '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' \ + '*:: :->command' + + _describe -t commands "terraform providers commands" _providers_cmds + return + fi + + local curcontext="${curcontext}" + cmd="${${_providers_cmds[(r)$words[2]:*]%%:*}}" + curcontext="${curcontext%:*:*}:terraform-providers-${cmd}:" + + if (( ${+functions[_terraform_providers_$cmd]} )); then + "_terraform_providers_${cmd}" + else + _message "no more options" + fi +} + +(( ${+functions[_terraform_providers_lock]} )) || _terraform_providers_lock() { + _arguments \ + '-fs-mirror=[(dir) Consult the given filesystem mirror directory instead of the origin registry for each of the given providers.]:fs_mirror:_files -/' \ + '-net-mirror=[(url) Consult the given network mirror (given as a base URL) instead of the origin registry for each of the given providers.]' \ + '*-platform=[(os_arch) Choose a target platform to request package checksums for.]' \ + '*:provider:' +} + +(( ${+functions[_terraform_providers_mirror]} )) || _terraform_providers_mirror() { + _arguments \ + '*-platform=[(os_arch) Choose which target platform to build a mirror for.]' \ + '::' \ + ':target_dir:_files -/' +} + +(( ${+functions[_terraform_providers_schema]} )) || _terraform_providers_schema() { + _arguments \ + '-json[]' \ + '::' +} + +(( ${+functions[_terraform_refresh]} )) || _terraform_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.]:input:(true false)' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-no-color[If specified, output will not contain any color.]' \ + '-parallelism=[(10) Limit the number of parallel resource operations.]' \ + '-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:__terraform_state_resources' \ + '*-var=[(for=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}"' +} + +(( ${+functions[_terraform_show]} )) || _terraform_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.]' \ + ':path:_files -g "*.tfstate"' +} + +(( ${+functions[_terraform_state]} )) || _terraform_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 in the state' + 'rm:Remove instances from the state' + 'show:Show a resource in the state' + ) + if [[ "${CURRENT}" -lt 3 ]]; then + _describe -t commands "terraform state commands" _state_cmds + return + fi + + local curcontext="${curcontext}" + cmd="${${_state_cmds[(r)$words[2]:*]%%:*}}" + curcontext="${curcontext%:*:*}:terraform-state-${cmd}:" + + if (( ${+functions[_terraform_state_$cmd]} )); then + "_terraform_state_${cmd}" + else + _message "no more options" + fi +} + +(( ${+functions[_terraform_state_list]} )) || _terraform_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.]:statefile:_files -g "*.tfstate"' \ '-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" + '*:address:__terraform_state_resources' } -__state_mv() { +(( ${+functions[_terraform_state_mv]} )) || _terraform_state_mv() { _arguments \ - "-dry-run[If set, prints out what would've been moved but doesn't actually move anything.]" \ + '-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.]" \ + '-ignore-remote-version[A rare option used for the remote backend only. See the remote backend documentation for more information.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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: " + '::' \ + ':source:__terraform_state_resources' \ + ':destination: ' } -__state_push() { +(( ${+functions[_terraform_state_push]} )) || _terraform_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" + '-force[Write the state even if lineages don'\''t match or the remote serial is higher.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '::' \ + ':destination:_files' } -__state_replace_provider() { +(( ${+functions[_terraform_state_replace-provider]} )) || _terraform_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.]" \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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:" + '::' \ + ':from_provider_fqn:' \ + ':to_provider_fqn:' } -__state_rm() { +(( ${+functions[_terraform_state_rm]} )) || _terraform_state_rm() { _arguments \ - "-dry-run[If set, prints out what would've been removed but doesn't actually remove anything.]" \ + '-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.]" \ + '-ignore-remote-version[Continue even if remote and local Terraform versions are incompatible. This may result in an unusable workspace, and should be used with extreme caution.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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" + '*:address:__terraform_state_resources' } - -__state_show() { +(( ${+functions[_terraform_state_show]} )) || _terraform_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" + "*:address:__terraform_state_resources" } -__statelist() { - compadd $(terraform state list $opt_args[-state]) +(( ${+functions[__terraform_state_resources]} )) || __terraform_state_resources() { + local resource + local -a resources + terraform state list -state="${opt_args[-state]}" 2>/dev/null | while read -r resource; do + resources+=( "${resource}" ) + done + compadd "${@}" - "${resources[@]}" } -__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 \ +(( ${+functions[_terraform_taint]} )) || _terraform_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)' \ + '-ignore-remote-version[A rare option used for the remote backend only. See the remote backend documentation for more information.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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"' + '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"' \ + '*:address:__terraform_state_resources' } -__validate() { - _arguments \ - '-no-color[If specified, output will not contain any color.]' \ +(( ${+functions[_terraform_test]} )) || _terraform_test() { + _arguments \ + '-cloud-run=[(source) If specified, Terraform will execute this test run remotely using Terraform Cloud. You must specify the source of a module registered in a private module registry as the argument to this flag. This allows Terraform to associate the cloud run with the correct Terraform Cloud module and organization.]' \ + '*-filter=[(testfile) If specified, Terraform will only execute the test files specified by this flag. You can use this option multiple times to execute more than one test file.]:testfile:_files -g "*.tftest.hcl"' \ + '-json[If specified, machine readable output will be printed in JSON format]' \ + '-no-color[If specified, machine readable output will be printed in JSON format]' \ + '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' \ + '-verbose[Print the plan or state for each test run block as it executes.]' \ +} + +(( ${+functions[_terraform_untaint]} )) || _terraform_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) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-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"' \ + ':name:__terraform_state_resources' +} + +(( ${+functions[_terraform_validate]} )) || _terraform_validate() { + _arguments \ '-json[Produce output in a machine-readable JSON format, suitable for use in text editor integrations and other automated systems.]' \ + '-no-color[If specified, output will not contain any color.]' \ + '-no-tests[If specified, Terraform will not validate test files.]' \ + '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' \ ':dir:_files -/' } -__version() { - _arguments \ - '-json[Output the version information as a JSON object.]' +(( ${+functions[_terraform_version]} )) || _terraform_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 +(( ${+functions[_terraform_workspace]} )) || _terraform_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' + ) + if [[ "${CURRENT}" -lt 3 ]]; then + _describe -t commands "terraform workspace commands" _workspace_cmds + return + fi + + local curcontext="${curcontext}" + cmd="${${_workspace_cmds[(r)$words[2]:*]%%:*}}" + curcontext="${curcontext%:*:*}:terraform-workspace-${cmd}:" + + if (( ${+functions[_terraform_workspace_$cmd]} )); then + "_terraform_workspace_${cmd}" + else + _message "no more options" + fi } -_arguments '*:: :->command' +(( ${+functions[_terraform_workspace_delete]} )) || _terraform_workspace_delete() { + _arguments \ + '-force[Remove a workspace even if it is managing resources. Terraform can no longer track or manage the workspace'\''s infrastructure.]' \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '::' \ + ':name:__terraform_workspaces' +} -if (( CURRENT == 1 )); then - _describe -t commands "terraform command" _terraform_cmds - return +(( ${+functions[_terraform_workspace_list]} )) || _terraform_workspace_list() { + _arguments +} + +(( ${+functions[_terraform_workspace_new]} )) || _terraform_workspace_new() { + _arguments \ + '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-state=[(path) Copy an existing state file into the new workspace.]:statefile:_files -g "*.tfstate"' \ + '::' \ + ':name:' +} + +(( ${+functions[_terraform_workspace_select]} )) || _terraform_workspace_select() { + _arguments \ + '-or-create=[(false) Create the Terraform workspace if it doesn'\''t exist.]:or_create:(true false)' \ + '::' \ + ':name:__terraform_workspaces' +} + +(( ${+functions[_terraform_workspace_show]} )) || _terraform_workspace_show() { + _arguments +} + +(( ${+functions[__terraform_workspaces]} )) || __terraform_workspaces() { + local workspace + local -a workspaces + terraform workspace list | while read -r workspace; do + if [[ -z "${workspace}" ]]; then + continue + fi + workspaces+=( "${workspace#[ *] }" ) + done + compadd "${@}" - "${workspaces[@]}" +} + +_terraform() { + _arguments \ + '-chdir=[(DIR) Switch to a different working directory before executing the given subcommand.]:chdir:_files -/' \ + '-help[Show this help output, or the help for a specified subcommand.]' \ + '-version[An alias for the "version" subcommand.]' \ + '*::terraform command:_terraform_commands' +} + +# don't run the completion function when being source-ed or eval-ed +if [ "${funcstack[1]}" = '_terraform' ]; then + _terraform 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 From 12cd3b3e399d39b2b458fdd8f1f6286250253476 Mon Sep 17 00:00:00 2001 From: Robert Crews Date: Sun, 3 Mar 2024 04:04:19 -0800 Subject: [PATCH 042/158] feat(python): add auto venv activation (#12248) Co-authored-by: Carlo Sala --- plugins/python/README.md | 16 +++++++++++++--- plugins/python/python.plugin.zsh | 23 +++++++++++++++++++---- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/plugins/python/README.md b/plugins/python/README.md index 7bf1b34ac..c99697b22 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -22,8 +22,18 @@ plugins=(... python) ## Virtual environments -The plugin provides two utilities to manage Python venvs: +The plugin provides three utilities to manage Python 3.3+ [venv](https://docs.python.org/3/library/venv.html) +virtual environments: -- `mkv [name]`: make a new virtual environment called `name` (default: `venv`) in current directory. +- `mkv [name]`: make a new virtual environment called `name` (default: if set `$PYTHON_VENV_NAME`, else + `venv`) in the current directory. -- `vrun [name]`: activate virtual environment called `name` (default: `venv`) in current directory. +- `vrun [name]`: Activate the virtual environment called `name` (default: if set `$PYTHON_VENV_NAME`, else + `venv`) in the current directory. + +- `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing + `/bin/activate`, and automatically deactivate it when navigating out of it (including + subdirectories!). + - To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. + - The default virtual environment name is `venv`. To use a different name, set + `export PYTHON_VENV_NAME=`. For example: `export PYTHON_VENV_NAME=".venv"` diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 77d4bf425..f6ea85027 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -51,11 +51,12 @@ alias pyserver="python3 -m http.server" ## venv utilities +: ${PYTHON_VENV_NAME:=venv} # Activate a the python virtual environment specified. -# If none specified, use 'venv'. +# If none specified, use $PYTHON_VENV_NAME, else 'venv'. function vrun() { - local name="${1:-venv}" + local name="${1:-$PYTHON_VENV_NAME}" local venvpath="${name:P}" if [[ ! -d "$venvpath" ]]; then @@ -72,12 +73,26 @@ function vrun() { echo "Activated virtual environment ${name}" } -# Create a new virtual environment, with default name 'venv'. +# Create a new virtual environment using the specified name. +# If none specfied, use $PYTHON_VENV_NAME function mkv() { - local name="${1:-venv}" + local name="${1:-$PYTHON_VENV_NAME}" local venvpath="${name:P}" python3 -m venv "${name}" || return echo >&2 "Created venv in '${venvpath}'" vrun "${name}" } + +if [[ "$PYTHON_AUTO_VRUN" == "true" ]]; then + # Automatically activate venv when changing dir + auto_vrun() { + if [[ -f "${PYTHON_VENV_NAME}/bin/activate" ]]; then + source "${PYTHON_VENV_NAME}/bin/activate" > /dev/null 2>&1 + else + (( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 + fi + } + add-zsh-hook chpwd auto_vrun + auto_vrun +fi From f17aa2ffa8c12b71518f1b0233edca3a0dd7cade Mon Sep 17 00:00:00 2001 From: Maxime Brunet Date: Sun, 3 Mar 2024 20:22:41 +0000 Subject: [PATCH 043/158] fix(terraform): pass `-chdir` to completion commands (#12254) --- plugins/terraform/_terraform | 166 +++++++++++++++++++---------------- 1 file changed, 91 insertions(+), 75 deletions(-) diff --git a/plugins/terraform/_terraform b/plugins/terraform/_terraform index aad1c6096..f72f3e552 100644 --- a/plugins/terraform/_terraform +++ b/plugins/terraform/_terraform @@ -29,7 +29,7 @@ compdef _terraform terraform 'version:Show the current Terraform version' 'workspace:Workspace management' ) - if ((CURRENT == 1)); then + if (( CURRENT == 1 )); then _describe -t commands 'terraform commands' _terraform_cmds return fi @@ -38,6 +38,8 @@ compdef _terraform terraform cmd="${${_terraform_cmds[(r)$words[1]:*]%%:*}}" curcontext="${curcontext%:*:*}:terraform-${cmd}:" + local __chdir="${opt_args[-chdir]:-.}" + if (( ${+functions[_terraform_$cmd]} )); then "_terraform_${cmd}" else @@ -48,7 +50,7 @@ compdef _terraform terraform (( ${+functions[_terraform_apply]} )) || _terraform_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"' \ + '-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 -W __chdir -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.]' \ '-destroy[Destroy Terraform-managed infrastructure. The command "terraform destroy" is a convenience alias for this option.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ @@ -58,12 +60,12 @@ compdef _terraform terraform '-parallelism=[(10) Limit the number of parallel resource operations.]' \ '-refresh=[(true) Skip checking for external changes to remote objects while creating the plan. This can potentially make planning faster, but at the expense of possibly planning against a stale record of the remote system state.]:refresh:(true false)' \ '*-replace=[(resource) Force replacement of a particular resource instance using its resource address. If applying would'\''ve normally produced an update or no-op action for this instance, Terraform will replace it instead. You can use this option multiple times to replace more than one object.]:resource:__terraform_state_resources' \ - '-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"' \ + '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '*-target=[(resource) Limit the operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ - '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' \ - ':plan:_files -' + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' \ + ':plan:_files -W __chdir -' } (( ${+functions[_terraform_console]} )) || _terraform_console() { @@ -71,13 +73,13 @@ compdef _terraform terraform '-state=[(terraform.tfstate) Legacy option for the local backend only. See the local backend'\''s documentation for more information.]' \ '-plan[Create a new plan (as if running "terraform plan") and then evaluate expressions against its planned state, instead of evaluating against the current state. You can use this to inspect the effects of configuration changes that haven'\''t been applied yet.]' \ '*-var=[(for=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}"' + '*-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 -W __chdir -g "*.tfvars{,.json}"' } (( ${+functions[_terraform_destroy]} )) || _terraform_destroy() { _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"' \ + '-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 -W __chdir -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) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ '-lock-timeout=[(0s) Duration to retry a state lock.]' \ @@ -85,11 +87,11 @@ compdef _terraform terraform '-no-color[If specified, output won'\''t contain any color.]' \ '-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.]:refresh:(true false)' \ - '-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"' \ + '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '*-target=[(resource) Limit the operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ - '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' } (( ${+functions[_terraform_fmt]} )) || _terraform_fmt() { @@ -100,7 +102,7 @@ compdef _terraform terraform '-check[Check if the input is formatted. Exit status will be 0 if all input is properly formatted and non-zero otherwise.]' \ '-no-color[If specified, output won'\''t contain any color.]' \ '-recursive[Also process files in subdirectories. By default, only the given directory (or current directory) is processed.]' \ - '*:targets:_files -' + '*:targets:_files -W __chdir -' } (( ${+functions[_terraform_force-unlock]} )) || _terraform_force-unlock() { @@ -113,29 +115,29 @@ compdef _terraform terraform _arguments \ '-update[Check already-downloaded modules for available updates and install the newest versions available.]' \ '-no-color[Disable text coloring in the output.]' \ - '-test-directory=[(tests) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' + '-test-directory=[(tests) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -W __chdir -/' } (( ${+functions[_terraform_graph]} )) || _terraform_graph() { _arguments \ '-draw-cycles[Highlight any cycles in the graph with colored edges. This helps when diagnosing cycle errors. This option is supported only when illustrating a real evaluation graph, selected using the -type=TYPE option.]' \ '-module-depth=[(-1) (deprecated) In prior versions of Terraform, specified the depth of modules to show in the output.]' \ - '-plan=[Render graph using the specified plan file instead of the configuration in the current directory. Implies -type=apply.]:plan:_files -' \ + '-plan=[Render graph using the specified plan file instead of the configuration in the current directory. Implies -type=apply.]:plan:_files -W __chdir -' \ '-type=[(plan) Type of operation graph to output. Can be: plan, plan-refresh-only, plan-destroy, or apply. By default Terraform just summarizes the relationships between the resources in your configuration, without any particular operation in mind. Full operation graphs are more detailed but therefore often harder to read.]:type:(plan plan-refresh-only plan-destroy apply)' } (( ${+functions[_terraform_import]} )) || _terraform_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.]:config:_files -/' \ + '-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 -W __chdir -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.]:config:_files -W __chdir -/' \ '-input=[(true) Disable interactive input prompts.]:input:(true false)' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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"' \ + '-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '*-var=[(for=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}"' \ + '*-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 -W __chdir -g "*.tfvars{,.json}"' \ ':addr:' \ ':id:' } @@ -143,21 +145,21 @@ compdef _terraform terraform (( ${+functions[_terraform_init]} )) || _terraform_init() { _arguments \ '-backend=[(true) Disable backend or Terraform Cloud initialization for this configuration and use what was previously initialized instead.]:backend:(true false)' \ - '-backend-config=[Configuration to be merged with what is in the configuration file'\''s '\''backend'\'' block. This can be either a path to an HCL file with key/value assignments (same format as terraform.tfvars) or a '\''key=value'\'' format, and can be specified multiple times. The backend type must be in the configuration itself.]:backend_config:_files -' \ + '-backend-config=[Configuration to be merged with what is in the configuration file'\''s '\''backend'\'' block. This can be either a path to an HCL file with key/value assignments (same format as terraform.tfvars) or a '\''key=value'\'' format, and can be specified multiple times. The backend type must be in the configuration itself.]:backend_config:_files -W __chdir -' \ '-force-copy[Suppress prompts about copying state data. This is equivalent to providing a "yes" to all confirmation prompts.]' \ - '-from-module=[Copy the contents of the given module into the target directory before initialization.]:from_module:_files -/' \ + '-from-module=[Copy the contents of the given module into the target directory before initialization.]:from_module:_files -W __chdir -/' \ '-get=[(true) Disable downloading modules for this configuration.]:get:(true false)' \ '-input=[(true) Disable interactive prompts. Note that some actions may require interactive prompts and will error if input is disabled.]:input:(true false)' \ '-lock=[(true) Don'\''t hold a state lock during backend migration. This is dangerous if others might concurrently run commands against the same workspace.]: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 -/' \ + '-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 -W __chdir -/' \ '-reconfigure[Reconfigure the backend, ignoring any saved configuration.]' \ '-migrate-state[Reconfigure a backend, and attempt to migrate any existing state.]' \ '-upgrade[Install the latest module and provider versions allowed within configured constraints, overriding the default behavior of selecting exactly the version recorded in the dependency lockfile.]' \ '-lockfile=[Set a dependency lockfile mode. Currently only "readonly" is valid.]:lockfile:( readonly )' \ '-ignore-remote-version[A rare option used for Terraform Cloud and the remote backend only. Set this to ignore checking that the local and remote Terraform versions use compatible state representations, making an operation proceed even when there is a potential mismatch. See the documentation on configuring Terraform with Terraform Cloud for more information.]' \ - '-test-directory=[(tests) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' + '-test-directory=[(tests) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -W __chdir -/' } (( ${+functions[_terraform_login]} )) || _terraform_login() { @@ -171,17 +173,22 @@ compdef _terraform terraform } (( ${+functions[_terraform_metadata]} )) || _terraform_metadata() { + _arguments \ + '*::terraform metadata command:_terraform_metadata_commands' +} + +(( ${+functions[_terraform_metadata_commands]} )) || _terraform_metadata_commands() { local -a _metadata_cmds _metadata_cmds=( 'functions:Show signatures and descriptions for the available functions' ) - if [[ "${CURRENT}" -lt 3 ]]; then + if (( CURRENT == 1 )); then _describe -t commands "terraform metadata commands" _metadata_cmds return fi local curcontext="${curcontext}" - cmd="${${_metadata_cmds[(r)$words[2]:*]%%:*}}" + cmd="${${_metadata_cmds[(r)$words[1]:*]%%:*}}" curcontext="${curcontext%:*:*}:terraform-metadata-${cmd}:" if (( ${+functions[_terraform_metadata_$cmd]} )); then @@ -193,13 +200,12 @@ compdef _terraform terraform (( ${+functions[_terraform_metadata_functions]} )) || _terraform_metadata_functions() { _arguments \ - '-json' \ - '::' + '-json[]' } (( ${+functions[_terraform_output]} )) || _terraform_output() { _arguments \ - '-state=[(path) Path to the state file to read. Defaults to "terraform.tfstate". Ignored when remote state is used.]:statefile:_files -g "*.tfstate"' \ + '-state=[(path) Path to the state file to read. Defaults to "terraform.tfstate". Ignored when remote state is used.]:statefile:_files -W __chdir -g "*.tfstate"' \ '-no-color[If specified, output will contain no color.]' \ '-json[If specified, machine readable output will be printed in JSON format]' \ '-raw[For value types that can be automatically converted to a string, will print the raw string directly, rather than a human-oriented representation of the value.]' \ @@ -221,31 +227,32 @@ compdef _terraform terraform '-refresh=[(true) Skip checking for external changes to remote objects while creating the plan. This can potentially make planning faster, but at the expense of possibly planning against a stale record of the remote system state.]:refresh:(true false)' \ '-refresh-only[Select the "refresh only" planning mode, which checks whether remote objects still match the outcome of the most recent Terraform apply but does not propose any actions to undo any changes made outside of Terraform.]' \ '*-replace=[(resource) Force replacement of a particular resource instance using its resource address. If the plan would'\''ve normally produced an update or no-op action for this instance, Terraform will plan to replace it instead. You can use this option multiple times to replace more than one object.]:replace:__terraform_state_resources' \ - '-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"' \ + '-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 -W __chdir -g "*.tfstate"' \ '*-target=[(resource) Limit the planning operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ - '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' } (( ${+functions[_terraform_providers]} )) || _terraform_providers() { + _arguments \ + '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -W __chdir -/' \ + '*::terraform providers command:_terraform_providers_commands' +} + +(( ${+functions[_terraform_providers_commands]} )) || _terraform_providers_commands() { local -a _providers_cmds _providers_cmds=( 'lock:Write out dependency locks for the configured providers' 'mirror:Save local copies of all required provider plugins' 'schema:Show schemas for the providers used in the configuration' ) - - if [[ "${CURRENT}" -lt 3 ]]; then - _arguments \ - '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' \ - '*:: :->command' - + if (( CURRENT == 1 )); then _describe -t commands "terraform providers commands" _providers_cmds return fi local curcontext="${curcontext}" - cmd="${${_providers_cmds[(r)$words[2]:*]%%:*}}" + cmd="${${_providers_cmds[(r)$words[1]:*]%%:*}}" curcontext="${curcontext%:*:*}:terraform-providers-${cmd}:" if (( ${+functions[_terraform_providers_$cmd]} )); then @@ -257,7 +264,7 @@ compdef _terraform terraform (( ${+functions[_terraform_providers_lock]} )) || _terraform_providers_lock() { _arguments \ - '-fs-mirror=[(dir) Consult the given filesystem mirror directory instead of the origin registry for each of the given providers.]:fs_mirror:_files -/' \ + '-fs-mirror=[(dir) Consult the given filesystem mirror directory instead of the origin registry for each of the given providers.]:fs_mirror:_files -W __chdir -/' \ '-net-mirror=[(url) Consult the given network mirror (given as a base URL) instead of the origin registry for each of the given providers.]' \ '*-platform=[(os_arch) Choose a target platform to request package checksums for.]' \ '*:provider:' @@ -267,39 +274,43 @@ compdef _terraform terraform _arguments \ '*-platform=[(os_arch) Choose which target platform to build a mirror for.]' \ '::' \ - ':target_dir:_files -/' + ':target_dir:_files -W __chdir -/' } (( ${+functions[_terraform_providers_schema]} )) || _terraform_providers_schema() { _arguments \ - '-json[]' \ - '::' + '-json[]' } (( ${+functions[_terraform_refresh]} )) || _terraform_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"' \ + '-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 -W __chdir -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.]:input:(true false)' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ '-lock-timeout=[(0s) Duration to retry a state lock.]' \ '-no-color[If specified, output will not contain any color.]' \ '-parallelism=[(10) Limit the number of parallel resource operations.]' \ - '-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"' \ + '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -W __chdir -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 -W __chdir -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:__terraform_state_resources' \ '*-var=[(for=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}"' + '*-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 -W __chdir -g "*.tfvars{,.json}"' } (( ${+functions[_terraform_show]} )) || _terraform_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.]' \ - ':path:_files -g "*.tfstate"' + ':path:_files -W __chdir -g "*.tfstate"' } (( ${+functions[_terraform_state]} )) || _terraform_state() { + _arguments \ + '*::terraform state command:_terraform_state_commands' +} + +(( ${+functions[_terraform_state_commands]} )) || _terraform_state_commands() { local -a _state_cmds _state_cmds=( 'list:List resources in the state' @@ -310,13 +321,13 @@ compdef _terraform terraform 'rm:Remove instances from the state' 'show:Show a resource in the state' ) - if [[ "${CURRENT}" -lt 3 ]]; then + if (( CURRENT == 1 )); then _describe -t commands "terraform state commands" _state_cmds return fi local curcontext="${curcontext}" - cmd="${${_state_cmds[(r)$words[2]:*]%%:*}}" + cmd="${${_state_cmds[(r)$words[1]:*]%%:*}}" curcontext="${curcontext%:*:*}:terraform-state-${cmd}:" if (( ${+functions[_terraform_state_$cmd]} )); then @@ -328,7 +339,7 @@ compdef _terraform terraform (( ${+functions[_terraform_state_list]} )) || _terraform_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.]:statefile:_files -g "*.tfstate"' \ + '-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.]:statefile:_files -W __chdir -g "*.tfstate"' \ '-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:__terraform_state_resources' } @@ -336,13 +347,13 @@ compdef _terraform terraform (( ${+functions[_terraform_state_mv]} )) || _terraform_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"' \ + '-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 -W __chdir -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 -W __chdir -g "*.backup"' \ '-ignore-remote-version[A rare option used for the remote backend only. See the remote backend documentation for more information.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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"' \ + '-state=[(path) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '::' \ ':source:__terraform_state_resources' \ ':destination: ' @@ -360,10 +371,10 @@ compdef _terraform terraform (( ${+functions[_terraform_state_replace-provider]} )) || _terraform_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"' \ + '-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 -W __chdir -g "*.backup"' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -W __chdir -g "*.tfstate"' \ '::' \ ':from_provider_fqn:' \ ':to_provider_fqn:' @@ -372,24 +383,24 @@ compdef _terraform terraform (( ${+functions[_terraform_state_rm]} )) || _terraform_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"' \ + '-backup=[(PATH) Path where Terraform should write the backup for the original state.]::backupfile:_files -W __chdir -g "*.backup"' \ '-ignore-remote-version[Continue even if remote and local Terraform versions are incompatible. This may result in an unusable workspace, and should be used with extreme caution.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]: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"' \ + '-state=[(PATH) Path to the state file to update. Defaults to the current workspace state.]:statefile:_files -W __chdir -g "*.tfstate"' \ '*:address:__terraform_state_resources' } (( ${+functions[_terraform_state_show]} )) || _terraform_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"' \ + '-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 -W __chdir -g "*.tfstate"' \ "*:address:__terraform_state_resources" } (( ${+functions[__terraform_state_resources]} )) || __terraform_state_resources() { local resource local -a resources - terraform state list -state="${opt_args[-state]}" 2>/dev/null | while read -r resource; do + terraform -chdir="${__chdir}" state list -state="${opt_args[-state]}" 2>/dev/null | while read -r resource; do resources+=( "${resource}" ) done compadd "${@}" - "${resources[@]}" @@ -398,35 +409,35 @@ compdef _terraform terraform (( ${+functions[_terraform_taint]} )) || _terraform_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"' \ + '-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 -W __chdir -g "*.backup"' \ '-ignore-remote-version[A rare option used for the remote backend only. See the remote backend documentation for more information.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ '-lock-timeout=[(0s) Duration to retry a state lock.]' \ - '-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"' \ + '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -W __chdir -g "*.tfstate"' \ + '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -W __chdir -g "*.tfstate"' \ '*:address:__terraform_state_resources' } (( ${+functions[_terraform_test]} )) || _terraform_test() { _arguments \ '-cloud-run=[(source) If specified, Terraform will execute this test run remotely using Terraform Cloud. You must specify the source of a module registered in a private module registry as the argument to this flag. This allows Terraform to associate the cloud run with the correct Terraform Cloud module and organization.]' \ - '*-filter=[(testfile) If specified, Terraform will only execute the test files specified by this flag. You can use this option multiple times to execute more than one test file.]:testfile:_files -g "*.tftest.hcl"' \ + '*-filter=[(testfile) If specified, Terraform will only execute the test files specified by this flag. You can use this option multiple times to execute more than one test file.]:testfile:_files -W __chdir -g "*.tftest.hcl"' \ '-json[If specified, machine readable output will be printed in JSON format]' \ '-no-color[If specified, machine readable output will be printed in JSON format]' \ - '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' \ + '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -W __chdir -/' \ '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ - '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -g "*.tfvars{,.json}"' \ + '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' \ '-verbose[Print the plan or state for each test run block as it executes.]' \ } (( ${+functions[_terraform_untaint]} )) || _terraform_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"' \ + '-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 -W __chdir -g "*.backup"' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ '-lock-timeout=[(0s) Duration to retry a state lock.]' \ - '-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"' \ + '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -W __chdir -g "*.tfstate"' \ + '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -W __chdir -g "*.tfstate"' \ ':name:__terraform_state_resources' } @@ -435,8 +446,8 @@ compdef _terraform terraform '-json[Produce output in a machine-readable JSON format, suitable for use in text editor integrations and other automated systems.]' \ '-no-color[If specified, output will not contain any color.]' \ '-no-tests[If specified, Terraform will not validate test files.]' \ - '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -/' \ - ':dir:_files -/' + '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -W __chdir -/' \ + ':dir:_files -W __chdir -/' } (( ${+functions[_terraform_version]} )) || _terraform_version() { @@ -446,6 +457,11 @@ compdef _terraform terraform } (( ${+functions[_terraform_workspace]} )) || _terraform_workspace() { + _arguments \ + '*::terraform workspace command:_terraform_workspace_commands' +} + +(( ${+functions[_terraform_workspace_commands]} )) || _terraform_workspace_commands() { local -a _workspace_cmds _workspace_cmds=( 'delete:Delete a workspace' @@ -454,13 +470,13 @@ compdef _terraform terraform 'select:Select a workspace' 'show:Show the name of the current workspace' ) - if [[ "${CURRENT}" -lt 3 ]]; then + if (( CURRENT == 1 )); then _describe -t commands "terraform workspace commands" _workspace_cmds return fi local curcontext="${curcontext}" - cmd="${${_workspace_cmds[(r)$words[2]:*]%%:*}}" + cmd="${${_workspace_cmds[(r)$words[1]:*]%%:*}}" curcontext="${curcontext%:*:*}:terraform-workspace-${cmd}:" if (( ${+functions[_terraform_workspace_$cmd]} )); then @@ -487,7 +503,7 @@ compdef _terraform terraform _arguments \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ '-lock-timeout=[(0s) Duration to retry a state lock.]' \ - '-state=[(path) Copy an existing state file into the new workspace.]:statefile:_files -g "*.tfstate"' \ + '-state=[(path) Copy an existing state file into the new workspace.]:statefile:_files -W __chdir -g "*.tfstate"' \ '::' \ ':name:' } @@ -506,7 +522,7 @@ compdef _terraform terraform (( ${+functions[__terraform_workspaces]} )) || __terraform_workspaces() { local workspace local -a workspaces - terraform workspace list | while read -r workspace; do + terraform -chdir="${__chdir}" workspace list | while read -r workspace; do if [[ -z "${workspace}" ]]; then continue fi @@ -517,7 +533,7 @@ compdef _terraform terraform _terraform() { _arguments \ - '-chdir=[(DIR) Switch to a different working directory before executing the given subcommand.]:chdir:_files -/' \ + '-chdir=[(DIR) Switch to a different working directory before executing the given subcommand.]:chdir:_files -W __chdir -/' \ '-help[Show this help output, or the help for a specified subcommand.]' \ '-version[An alias for the "version" subcommand.]' \ '*::terraform command:_terraform_commands' From da16258c5c261606d56836c0fce77188515a6c0e Mon Sep 17 00:00:00 2001 From: Maxime Brunet Date: Mon, 4 Mar 2024 07:28:00 +0000 Subject: [PATCH 044/158] fix(terraform): fix completion repeating flags with value (#12256) --- plugins/terraform/_terraform | 68 ++++++++++++++++++------------------ 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/plugins/terraform/_terraform b/plugins/terraform/_terraform index f72f3e552..157495814 100644 --- a/plugins/terraform/_terraform +++ b/plugins/terraform/_terraform @@ -54,25 +54,25 @@ compdef _terraform terraform '-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[Destroy Terraform-managed infrastructure. The command "terraform destroy" is a convenience alias for this option.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-input=[(true) Ask for input for variables if not directly set.]:input:(true false)' \ '-no-color[If specified, output won'\''t contain any color.]' \ - '-parallelism=[(10) Limit the number of parallel resource operations.]' \ + '-parallelism=[(10) Limit the number of parallel resource operations.]:parallelism:' \ '-refresh=[(true) Skip checking for external changes to remote objects while creating the plan. This can potentially make planning faster, but at the expense of possibly planning against a stale record of the remote system state.]:refresh:(true false)' \ '*-replace=[(resource) Force replacement of a particular resource instance using its resource address. If applying would'\''ve normally produced an update or no-op action for this instance, Terraform will replace it instead. You can use this option multiple times to replace more than one object.]:resource:__terraform_state_resources' \ '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '*-target=[(resource) Limit the operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ - '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]:var:' \ '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' \ ':plan:_files -W __chdir -' } (( ${+functions[_terraform_console]} )) || _terraform_console() { _arguments \ - '-state=[(terraform.tfstate) Legacy option for the local backend only. See the local backend'\''s documentation for more information.]' \ + '-state=[(terraform.tfstate) Legacy option for the local backend only. See the local backend'\''s documentation for more information.]:statefile:_files -W __chdir -g "*.tfstate"' \ '-plan[Create a new plan (as if running "terraform plan") and then evaluate expressions against its planned state, instead of evaluating against the current state. You can use this to inspect the effects of configuration changes that haven'\''t been applied yet.]' \ - '*-var=[(for=bar) Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var=[(for=bar) Set a variable in the Terraform configuration. This flag can be set multiple times.]:var:' \ '*-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 -W __chdir -g "*.tfvars{,.json}"' } @@ -82,15 +82,15 @@ compdef _terraform terraform '-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 -W __chdir -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) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-input=[(true) Ask for input for variables if not directly set.]:input:(true false)' \ '-no-color[If specified, output won'\''t contain any color.]' \ - '-parallelism=[(10) Limit the number of parallel resource operations.]' \ + '-parallelism=[(10) Limit the number of parallel resource operations.]:parallelism:' \ '-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]:refresh:(true false)' \ '-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '*-target=[(resource) Limit the operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ - '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]:var:' \ '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' } @@ -121,7 +121,7 @@ compdef _terraform terraform (( ${+functions[_terraform_graph]} )) || _terraform_graph() { _arguments \ '-draw-cycles[Highlight any cycles in the graph with colored edges. This helps when diagnosing cycle errors. This option is supported only when illustrating a real evaluation graph, selected using the -type=TYPE option.]' \ - '-module-depth=[(-1) (deprecated) In prior versions of Terraform, specified the depth of modules to show in the output.]' \ + '-module-depth=[(-1) (deprecated) In prior versions of Terraform, specified the depth of modules to show in the output.]:module_depth:' \ '-plan=[Render graph using the specified plan file instead of the configuration in the current directory. Implies -type=apply.]:plan:_files -W __chdir -' \ '-type=[(plan) Type of operation graph to output. Can be: plan, plan-refresh-only, plan-destroy, or apply. By default Terraform just summarizes the relationships between the resources in your configuration, without any particular operation in mind. Full operation graphs are more detailed but therefore often harder to read.]:type:(plan plan-refresh-only plan-destroy apply)' } @@ -132,11 +132,11 @@ compdef _terraform terraform '-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.]:config:_files -W __chdir -/' \ '-input=[(true) Disable interactive input prompts.]:input:(true false)' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-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 -W __chdir -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 -W __chdir -g "*.tfstate"' \ - '*-var=[(for=bar) Set a variable in the Terraform configuration. This flag can be set multiple times. This is only useful with the "-config" flag.]' \ + '*-var=[(for=bar) Set a variable in the Terraform configuration. This flag can be set multiple times. This is only useful with the "-config" flag.]:var:' \ '*-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 -W __chdir -g "*.tfvars{,.json}"' \ ':addr:' \ ':id:' @@ -151,7 +151,7 @@ compdef _terraform terraform '-get=[(true) Disable downloading modules for this configuration.]:get:(true false)' \ '-input=[(true) Disable interactive prompts. Note that some actions may require interactive prompts and will error if input is disabled.]:input:(true false)' \ '-lock=[(true) Don'\''t hold a state lock during backend migration. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-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 -W __chdir -/' \ '-reconfigure[Reconfigure the backend, ignoring any saved configuration.]' \ @@ -218,18 +218,18 @@ compdef _terraform terraform '-destroy[Select the "destroy" planning mode, which creates a plan to destroy all objects currently managed by this Terraform configuration instead of the usual behavior.]' \ '-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.]:input:(true false)' \ - '-generate-config-out=[(path) (Experimental) If import blocks are present in configuration, instructs Terraform to generate HCL for any imported resources not already present. The configuration is written to a new file at PATH, which must not already exist. Terraform may still attempt to write configuration if the plan errors.]' \ + '-generate-config-out=[(path) (Experimental) If import blocks are present in configuration, instructs Terraform to generate HCL for any imported resources not already present. The configuration is written to a new file at PATH, which must not already exist. Terraform may still attempt to write configuration if the plan errors.]:generate_config_out:' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-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.]' \ + '-out=[(path) Write a plan file to the given path. This can be used as input to the "apply" command.]:out:' \ + '-parallelism=[(10) Limit the number of concurrent operations.]:parallelism:' \ '-refresh=[(true) Skip checking for external changes to remote objects while creating the plan. This can potentially make planning faster, but at the expense of possibly planning against a stale record of the remote system state.]:refresh:(true false)' \ '-refresh-only[Select the "refresh only" planning mode, which checks whether remote objects still match the outcome of the most recent Terraform apply but does not propose any actions to undo any changes made outside of Terraform.]' \ '*-replace=[(resource) Force replacement of a particular resource instance using its resource address. If the plan would'\''ve normally produced an update or no-op action for this instance, Terraform will plan to replace it instead. You can use this option multiple times to replace more than one object.]:replace:__terraform_state_resources' \ '-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 -W __chdir -g "*.tfstate"' \ '*-target=[(resource) Limit the planning operation to only the given module, resource, or resource instance and all of its dependencies. You can use this option multiple times to include more than one object. This is for exceptional use only.]:target:__terraform_state_resources' \ - '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]:var:' \ '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' } @@ -265,14 +265,14 @@ compdef _terraform terraform (( ${+functions[_terraform_providers_lock]} )) || _terraform_providers_lock() { _arguments \ '-fs-mirror=[(dir) Consult the given filesystem mirror directory instead of the origin registry for each of the given providers.]:fs_mirror:_files -W __chdir -/' \ - '-net-mirror=[(url) Consult the given network mirror (given as a base URL) instead of the origin registry for each of the given providers.]' \ - '*-platform=[(os_arch) Choose a target platform to request package checksums for.]' \ + '-net-mirror=[(url) Consult the given network mirror (given as a base URL) instead of the origin registry for each of the given providers.]:net_mirror:' \ + '*-platform=[(os_arch) Choose a target platform to request package checksums for.]:platform:' \ '*:provider:' } (( ${+functions[_terraform_providers_mirror]} )) || _terraform_providers_mirror() { _arguments \ - '*-platform=[(os_arch) Choose which target platform to build a mirror for.]' \ + '*-platform=[(os_arch) Choose which target platform to build a mirror for.]:platform:' \ '::' \ ':target_dir:_files -W __chdir -/' } @@ -288,13 +288,13 @@ compdef _terraform terraform '-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.]:input:(true false)' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-no-color[If specified, output will not contain any color.]' \ - '-parallelism=[(10) Limit the number of parallel resource operations.]' \ + '-parallelism=[(10) Limit the number of parallel resource operations.]:parallelism:' \ '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -W __chdir -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 -W __chdir -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:__terraform_state_resources' \ - '*-var=[(for=bar) Set a variable in the Terraform configuration. This flag can be set multiple times.]' \ + '*-var=[(for=bar) Set a variable in the Terraform configuration. This flag can be set multiple times.]:var:' \ '*-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 -W __chdir -g "*.tfvars{,.json}"' } @@ -340,7 +340,7 @@ compdef _terraform terraform (( ${+functions[_terraform_state_list]} )) || _terraform_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.]:statefile:_files -W __chdir -g "*.tfstate"' \ - '-id=[(id) Filters the results to include only instances whose resource types have an attribute named id whose value equals the given id string.]' \ + '-id=[(id) Filters the results to include only instances whose resource types have an attribute named id whose value equals the given id string.]:id:' \ '*:address:__terraform_state_resources' } @@ -351,7 +351,7 @@ compdef _terraform terraform '-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 -W __chdir -g "*.backup"' \ '-ignore-remote-version[A rare option used for the remote backend only. See the remote backend documentation for more information.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-state=[(path) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -W __chdir -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 -W __chdir -g "*.tfstate"' \ '::' \ @@ -363,7 +363,7 @@ compdef _terraform terraform _arguments \ '-force[Write the state even if lineages don'\''t match or the remote serial is higher.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '::' \ ':destination:_files' } @@ -373,7 +373,7 @@ compdef _terraform terraform '-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 -W __chdir -g "*.backup"' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -W __chdir -g "*.tfstate"' \ '::' \ ':from_provider_fqn:' \ @@ -386,7 +386,7 @@ compdef _terraform terraform '-backup=[(PATH) Path where Terraform should write the backup for the original state.]::backupfile:_files -W __chdir -g "*.backup"' \ '-ignore-remote-version[Continue even if remote and local Terraform versions are incompatible. This may result in an unusable workspace, and should be used with extreme caution.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-state=[(PATH) Path to the state file to update. Defaults to the current workspace state.]:statefile:_files -W __chdir -g "*.tfstate"' \ '*:address:__terraform_state_resources' } @@ -412,7 +412,7 @@ compdef _terraform terraform '-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 -W __chdir -g "*.backup"' \ '-ignore-remote-version[A rare option used for the remote backend only. See the remote backend documentation for more information.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -W __chdir -g "*.tfstate"' \ '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -W __chdir -g "*.tfstate"' \ '*:address:__terraform_state_resources' @@ -420,12 +420,12 @@ compdef _terraform terraform (( ${+functions[_terraform_test]} )) || _terraform_test() { _arguments \ - '-cloud-run=[(source) If specified, Terraform will execute this test run remotely using Terraform Cloud. You must specify the source of a module registered in a private module registry as the argument to this flag. This allows Terraform to associate the cloud run with the correct Terraform Cloud module and organization.]' \ + '-cloud-run=[(source) If specified, Terraform will execute this test run remotely using Terraform Cloud. You must specify the source of a module registered in a private module registry as the argument to this flag. This allows Terraform to associate the cloud run with the correct Terraform Cloud module and organization.]:cloud_run:' \ '*-filter=[(testfile) If specified, Terraform will only execute the test files specified by this flag. You can use this option multiple times to execute more than one test file.]:testfile:_files -W __chdir -g "*.tftest.hcl"' \ '-json[If specified, machine readable output will be printed in JSON format]' \ '-no-color[If specified, machine readable output will be printed in JSON format]' \ '-test-directory=[(path) Set the Terraform test directory, defaults to "tests".]:test_directory:_files -W __chdir -/' \ - '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]' \ + '*-var=[(for=bar) Set a value for one of the input variables in the root module of the configuration. Use this option more than once to set more than one variable.]:var:' \ '*-var-file=[(foo) Load variable values from the given file, in addition to the default files terraform.tfvars and *.auto.tfvars. Use this option more than once to include more than one variables file.]:file:_files -W __chdir -g "*.tfvars{,.json}"' \ '-verbose[Print the plan or state for each test run block as it executes.]' \ } @@ -435,7 +435,7 @@ compdef _terraform terraform '-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 -W __chdir -g "*.backup"' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -W __chdir -g "*.tfstate"' \ '-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -W __chdir -g "*.tfstate"' \ ':name:__terraform_state_resources' @@ -490,7 +490,7 @@ compdef _terraform terraform _arguments \ '-force[Remove a workspace even if it is managing resources. Terraform can no longer track or manage the workspace'\''s infrastructure.]' \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '::' \ ':name:__terraform_workspaces' } @@ -502,7 +502,7 @@ compdef _terraform terraform (( ${+functions[_terraform_workspace_new]} )) || _terraform_workspace_new() { _arguments \ '-lock=[(true) Don'\''t hold a state lock during the operation. This is dangerous if others might concurrently run commands against the same workspace.]:lock:(true false)' \ - '-lock-timeout=[(0s) Duration to retry a state lock.]' \ + '-lock-timeout=[(0s) Duration to retry a state lock.]:lock_timeout:' \ '-state=[(path) Copy an existing state file into the new workspace.]:statefile:_files -W __chdir -g "*.tfstate"' \ '::' \ ':name:' From 0ea0d14288d68aba026d47517009233846c7b409 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 4 Mar 2024 10:47:34 +0100 Subject: [PATCH 045/158] fix(nvm): remove zsh completion We rely on official bash completion now on. --- plugins/nvm/_nvm | 34 ---------------------------------- 1 file changed, 34 deletions(-) delete mode 100644 plugins/nvm/_nvm diff --git a/plugins/nvm/_nvm b/plugins/nvm/_nvm deleted file mode 100644 index e292a8d8c..000000000 --- a/plugins/nvm/_nvm +++ /dev/null @@ -1,34 +0,0 @@ -#compdef nvm -#autoload - -[[ -f "$NVM_DIR/nvm.sh" ]] || return 0 - -local -a _1st_arguments -_1st_arguments=( - 'help:show help' - '--version:print out the latest released version of nvm' - 'install:download and install a version in ' - 'install-latest-npm:download and install the latest npm version' - 'uninstall:uninstall a version' - 'use:modify PATH to use . Uses .nvmrc if available' - 'exec:run on . Uses .nvmrc if available' - 'run:run `node` on with as arguments. Uses .nvmrc if available' - 'current:list installed versions' - 'ls:list installed versions or versions matching a given description' - 'version:resolve the given description to a single local version' - 'version-remote:resolve the given description to a single remote version' - 'ls-remote:list remote versions available for install' - 'deactivate:undo effects of `nvm` on current shell' - 'alias:show or set aliases' - 'unalias:deletes an alias' - 'reinstall-packages:reinstall global `npm` packages contained in to current version' - 'unload:unload `nvm` from shell' - 'which:display path to installed node version. Uses .nvmrc if available' -) - -_arguments -C '*:: :->subcmds' && return 0 - -if (( CURRENT == 1 )); then - _describe -t commands "nvm subcommand" _1st_arguments - return -fi From 94aa49c0b96fed98d2751107301c16f32de13383 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 4 Mar 2024 11:02:37 +0100 Subject: [PATCH 046/158] feat(nvm)!: make `lazy` and `autoload` options compatible BREAKING CHANGE: Prior to this commit, if `lazy` and `autoload` options were enabled at the same time, `lazy` was getting overriden and only `autoload` was taken into account. Now they work together and `autoload` will be enabled after `nvm` has been lazy-loaded. Closes #11690 --- plugins/nvm/README.md | 3 +- plugins/nvm/nvm.plugin.zsh | 95 +++++++++++++++++++++----------------- 2 files changed, 54 insertions(+), 44 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index b5ef221d3..e88ce0158 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -43,8 +43,7 @@ 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._ +Note: _if used at the same time as `lazy`, `autoload` will start working only after nvm has been lazy-loaded_ 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 diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 94b666175..084b4846f 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -1,3 +1,7 @@ +# Don't try to load nvm if command already available +# Note: nvm is a function so we need to use `which` +which nvm &>/dev/null && return + # See https://github.com/nvm-sh/nvm#installation-and-update if [[ -z "$NVM_DIR" ]]; then if [[ -d "$HOME/.nvm" ]]; then @@ -12,39 +16,34 @@ if [[ -z "$NVM_DIR" ]]; then fi fi -# Don't try to load nvm if command already available -# Note: nvm is a function so we need to use `which` -which nvm &>/dev/null && return - if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then 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 - nvm_lazy_cmd=(nvm node npm npx pnpm yarn $nvm_lazy_cmd) # default values - eval " - function $nvm_lazy_cmd { - for func in $nvm_lazy_cmd; do - if (( \$+functions[\$func] )); then - unfunction \$func - fi - done - # Load nvm if it exists in \$NVM_DIR - [[ -f \"\$NVM_DIR/nvm.sh\" ]] && source \"\$NVM_DIR/nvm.sh\" - \"\$0\" \"\$@\" - } - " - unset nvm_lazy_cmd -else - source "$NVM_DIR/nvm.sh" -fi +function _omz_load_nvm_completion { + local _nvm_completion + # Load nvm bash completion + for _nvm_completion in "$NVM_DIR/bash_completion" "$NVM_HOMEBREW/etc/bash_completion.d/nvm"; do + if [[ -f "$_nvm_completion" ]]; then + # Load bashcompinit + autoload -U +X bashcompinit && bashcompinit + # Bypass compinit call in nvm bash completion script. See: + # https://github.com/nvm-sh/nvm/blob/4436638/bash_completion#L86-L93 + ZSH_VERSION= source "$_nvm_completion" + break + fi + done + unfunction _omz_load_nvm_completion +} -# 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 +function _omz_setup_autoload { + if ! zstyle -t ':omz:plugins:nvm' autoload; then + unfunction _omz_setup_autoload + return + fi + + # Autoload nvm when finding a .nvmrc file in the current directory + # Adapted from: https://github.com/nvm-sh/nvm#zsh function load-nvmrc { local node_version="$(nvm version)" local nvmrc_path="$(nvm_find_nvmrc)" @@ -72,18 +71,30 @@ if zstyle -t ':omz:plugins:nvm' autoload; then add-zsh-hook chpwd load-nvmrc load-nvmrc + unfunction _omz_setup_autoload +} + +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 + nvm_lazy_cmd=(nvm node npm npx pnpm yarn $nvm_lazy_cmd) # default values + eval " + function $nvm_lazy_cmd { + for func in $nvm_lazy_cmd; do + if (( \$+functions[\$func] )); then + unfunction \$func + fi + done + # Load nvm if it exists in \$NVM_DIR + [[ -f \"\$NVM_DIR/nvm.sh\" ]] && source \"\$NVM_DIR/nvm.sh\" + _omz_load_nvm_completion + _omz_setup_autoload + \"\$0\" \"\$@\" + } + " + unset nvm_lazy_cmd +else + source "$NVM_DIR/nvm.sh" + _omz_load_nvm_completion + _omz_setup_autoload fi - -# Load nvm bash completion -for nvm_completion in "$NVM_DIR/bash_completion" "$NVM_HOMEBREW/etc/bash_completion.d/nvm"; do - if [[ -f "$nvm_completion" ]]; then - # Load bashcompinit - autoload -U +X bashcompinit && bashcompinit - # Bypass compinit call in nvm bash completion script. See: - # https://github.com/nvm-sh/nvm/blob/4436638/bash_completion#L86-L93 - ZSH_VERSION= source "$nvm_completion" - break - fi -done - -unset NVM_HOMEBREW nvm_completion From fd01fd66ce27c669e5ffaea94460a37423d1e134 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 4 Mar 2024 11:08:49 +0100 Subject: [PATCH 047/158] perf(nvm): don't call `nvm version` on every cd Now we only call `nvm version` in case we changed directory and we are not anymore in a `.nvmrc` directory. See https://github.com/nvm-sh/nvm/pull/2874 --- plugins/nvm/nvm.plugin.zsh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 084b4846f..6a5afecfa 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -45,7 +45,6 @@ function _omz_setup_autoload { # Autoload nvm when finding a .nvmrc file in the current directory # Adapted from: https://github.com/nvm-sh/nvm#zsh 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" @@ -58,10 +57,8 @@ function _omz_setup_autoload { elif [[ "$nvmrc_node_version" != "$node_version" ]]; then nvm use $nvm_silent fi - elif [[ "$node_version" != "$(nvm version default)" ]]; then - if [[ -z $nvm_silent ]]; then - echo "Reverting to nvm default version" - fi + elif [[ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ]] && [[ "$(nvm version)" != "$(nvm version default)" ]]; then + [[ -z $nvm_silent ]] && echo "Reverting to nvm default version" nvm use default $nvm_silent fi From 2a71aa50170db6892abb3e173ba425c554744b37 Mon Sep 17 00:00:00 2001 From: Felipe Contreras Date: Thu, 7 Mar 2024 02:47:15 -0600 Subject: [PATCH 048/158] chore(gitfast): remove update script (#12262) Co-authored-by: Carlo Sala --- .github/dependencies.yml | 2 +- plugins/gitfast/README.md | 6 ------ plugins/gitfast/gitfast.plugin.zsh | 2 +- plugins/gitfast/update | 8 -------- 4 files changed, 2 insertions(+), 16 deletions(-) delete mode 100755 plugins/gitfast/update diff --git a/.github/dependencies.yml b/.github/dependencies.yml index 12beaecbb..d60ab2c92 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -2,7 +2,7 @@ dependencies: plugins/gitfast: repo: felipec/git-completion branch: master - version: tag:v2.0 + version: tag:v2.1 postcopy: | set -e rm -rf git-completion.plugin.zsh Makefile README.adoc t tools diff --git a/plugins/gitfast/README.md b/plugins/gitfast/README.md index fed4b120a..60b84a23c 100644 --- a/plugins/gitfast/README.md +++ b/plugins/gitfast/README.md @@ -7,9 +7,3 @@ To use it, add `gitfast` to the plugins array in your zshrc file: ```zsh plugins=(... gitfast) ``` - -## Aliases - -An earlier version of the plugin also loaded the git plugin. If you want to keep those -aliases enable the [git plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git) -as well. diff --git a/plugins/gitfast/gitfast.plugin.zsh b/plugins/gitfast/gitfast.plugin.zsh index a6db0c6bd..c456eff7f 100644 --- a/plugins/gitfast/gitfast.plugin.zsh +++ b/plugins/gitfast/gitfast.plugin.zsh @@ -1,6 +1,6 @@ # 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="${ZERO:-${${0:#$ZSH_ARGZERO}:-${(%):-%N}}}" 0="${${(M)0:#/*}:-$PWD/$0}" source "${0:A:h}/git-prompt.sh" diff --git a/plugins/gitfast/update b/plugins/gitfast/update deleted file mode 100755 index feb13ff7e..000000000 --- a/plugins/gitfast/update +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -url="https://raw.githubusercontent.com/felipec/git-completion" -version="1.3.7" - -curl -s -o _git "${url}/v${version}/git-completion.zsh" && -curl -s -o git-completion.bash "${url}/v${version}/git-completion.bash" && -curl -s -o git-prompt.sh "${url}/v${version}/git-prompt.sh" From 4fca7ccb55eb4904f515806ffca51d27ee1cc670 Mon Sep 17 00:00:00 2001 From: Ross Williams Date: Thu, 7 Mar 2024 03:54:43 -0500 Subject: [PATCH 049/158] feat(tools): update `supports_hyperlinks` (#12258) Update to https://github.com/zkat/supports-hyperlinks/releases/tag/v3.0.0 --- tools/changelog.sh | 11 ++++++++--- tools/install.sh | 11 ++++++++--- tools/upgrade.sh | 11 ++++++++--- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/tools/changelog.sh b/tools/changelog.sh index 3ad8fe786..c4b26079e 100755 --- a/tools/changelog.sh +++ b/tools/changelog.sh @@ -221,11 +221,16 @@ supports_hyperlinks() { # If $TERM_PROGRAM is set, these terminals support hyperlinks case "$TERM_PROGRAM" in - Hyper|iTerm.app|terminology|WezTerm) return 0 ;; + Hyper|iTerm.app|terminology|WezTerm|vscode) return 0 ;; esac - # kitty supports hyperlinks - if [ "$TERM" = xterm-kitty ]; then + # These termcap entries support hyperlinks + case "$TERM" in + xterm-kitty|alacritty|alacritty-direct) return 0 ;; + esac + + # xfce4-terminal supports hyperlinks + if [ "$COLORTERM" = "xfce4-terminal" ]; then return 0 fi diff --git a/tools/install.sh b/tools/install.sh index 508fc2f77..e3613a28b 100755 --- a/tools/install.sh +++ b/tools/install.sh @@ -166,11 +166,16 @@ supports_hyperlinks() { # If $TERM_PROGRAM is set, these terminals support hyperlinks case "$TERM_PROGRAM" in - Hyper|iTerm.app|terminology|WezTerm) return 0 ;; + Hyper|iTerm.app|terminology|WezTerm|vscode) return 0 ;; esac - # kitty supports hyperlinks - if [ "$TERM" = xterm-kitty ]; then + # These termcap entries support hyperlinks + case "$TERM" in + xterm-kitty|alacritty|alacritty-direct) return 0 ;; + esac + + # xfce4-terminal supports hyperlinks + if [ "$COLORTERM" = "xfce4-terminal" ]; then return 0 fi diff --git a/tools/upgrade.sh b/tools/upgrade.sh index f7a263d66..d7016aa44 100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -90,11 +90,16 @@ supports_hyperlinks() { # If $TERM_PROGRAM is set, these terminals support hyperlinks case "$TERM_PROGRAM" in - Hyper|iTerm.app|terminology|WezTerm) return 0 ;; + Hyper|iTerm.app|terminology|WezTerm|vscode) return 0 ;; esac - # kitty supports hyperlinks - if [ "$TERM" = xterm-kitty ]; then + # These termcap entries support hyperlinks + case "$TERM" in + xterm-kitty|alacritty|alacritty-direct) return 0 ;; + esac + + # xfce4-terminal supports hyperlinks + if [ "$COLORTERM" = "xfce4-terminal" ]; then return 0 fi From 083cc2c8e8742bab8cce8c73a3e96f398e6b2da7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 7 Mar 2024 14:39:05 +0100 Subject: [PATCH 050/158] feat(async)!: implement async prompt API and apply to git prompt (#12257) BREAKING CHANGE: the `git_prompt_info` prompt function has been reworked by default to use the new async prompt feature. If you're experiencing issues see #12257. Co-authored-by: Carlo Sala --- lib/async_prompt.zsh | 140 +++++++++++++++++++++++++++++++++++++++++++ lib/git.zsh | 22 ++++++- 2 files changed, 160 insertions(+), 2 deletions(-) create mode 100644 lib/async_prompt.zsh diff --git a/lib/async_prompt.zsh b/lib/async_prompt.zsh new file mode 100644 index 000000000..c6d03328b --- /dev/null +++ b/lib/async_prompt.zsh @@ -0,0 +1,140 @@ +# The async code is taken from +# https://github.com/zsh-users/zsh-autosuggestions/blob/master/src/async.zsh +# https://github.com/woefe/git-prompt.zsh/blob/master/git-prompt.zsh + +zmodload zsh/system + +# For now, async prompt function handlers are set up like so: +# First, define the async function handler and add the function name +# to the _omz_async_functions array: +# +# function _git_prompt_status_async { +# # Do some expensive operation that outputs to stdout +# } +# _omz_register_handler _git_prompt_status_async +# +# Then add a stub prompt function in `$PROMPT` or similar prompt variables, +# which will show the output of "$_OMZ_ASYNC_OUTPUT[handler_name]": +# +# function git_prompt_status { +# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status] +# } +# +# RPROMPT='$(git_prompt_status)' +# +# This API is subject to change and optimization. Rely on it at your own risk. + +function _omz_register_handler { + setopt localoptions noksharrays + typeset -ga _omz_async_functions + # we want to do nothing if there's no $1 function or we already set it up + if [[ -z "$1" ]] || (( ! ${+functions[$1]} )) \ + || (( ${_omz_async_functions[(Ie)$1]} )); then + return + fi + _omz_async_functions+=("$1") + # let's add the hook to async_request if it's not there yet + if (( ! ${precmd_functions[(Ie)_omz_async_request]} )) \ + && (( ${+functions[_omz_async_request]})); then + autoload -Uz add-zsh-hook + add-zsh-hook precmd _omz_async_request + fi +} + +# Set up async handlers and callbacks +function _omz_async_request { + typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT + + # executor runs a subshell for all async requests based on key + local handler + for handler in ${_omz_async_functions}; do + (( ${+functions[$handler]} )) || continue + + local fd=${_OMZ_ASYNC_FDS[$handler]:--1} + local pid=${_OMZ_ASYNC_PIDS[$handler]:--1} + + # If we've got a pending request, cancel it + if (( fd != -1 && pid != -1 )) && { true <&$fd } 2>/dev/null; then + # Close the file descriptor and remove the handler + exec {fd}<&- + zle -F $fd + + # Zsh will make a new process group for the child process only if job + # control is enabled (MONITOR option) + if [[ -o MONITOR ]]; then + # Send the signal to the process group to kill any processes that may + # have been forked by the async function handler + kill -TERM -$pid 2>/dev/null + else + # Kill just the child process since it wasn't placed in a new process + # group. If the async function handler forked any child processes they may + # be orphaned and left behind. + kill -TERM $pid 2>/dev/null + fi + fi + + # Define global variables to store the file descriptor, PID and output + _OMZ_ASYNC_FDS[$handler]=-1 + _OMZ_ASYNC_PIDS[$handler]=-1 + + # Fork a process to fetch the git status and open a pipe to read from it + exec {fd}< <( + # Tell parent process our PID + builtin echo ${sysparams[pid]} + # Store handler name for callback + builtin echo $handler + # Run the async function handler + $handler + ) + + # Save FD for handler + _OMZ_ASYNC_FDS[$handler]=$fd + + # There's a weird bug here where ^C stops working unless we force a fork + # See https://github.com/zsh-users/zsh-autosuggestions/issues/364 + command true + + # Save the PID from the handler child process + read pid <&$fd + _OMZ_ASYNC_PIDS[$handler]=$pid + + # When the fd is readable, call the response handler + zle -F "$fd" _omz_async_callback + done +} + +# Called when new data is ready to be read from the pipe +function _omz_async_callback() { + emulate -L zsh + + local fd=$1 # First arg will be fd ready for reading + local err=$2 # Second arg will be passed in case of error + + if [[ -z "$err" || "$err" == "hup" ]]; then + # Get handler name from first line + local handler + read handler <&$fd + + # Store old output which is supposed to be already printed + local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}" + + # Read output from fd + _OMZ_ASYNC_OUTPUT[$handler]="$(cat <&$fd)" + + # Repaint prompt if output has changed + if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then + zle reset-prompt + zle -R + fi + + # Close the fd + exec {fd}<&- + fi + + # Always remove the handler + zle -F "$fd" + + # Unset global FD variable to prevent closing user created FDs in the precmd hook + _OMZ_ASYNC_FDS[$handler]=-1 + _OMZ_ASYNC_PIDS[$handler]=-1 +} diff --git a/lib/git.zsh b/lib/git.zsh index f049f73c2..6f4823458 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -9,14 +9,18 @@ function __git_prompt_git() { GIT_OPTIONAL_LOCKS=0 command git "$@" } -function git_prompt_info() { +function _omz_git_prompt_status() { # If we are on a folder not tracked by git, get out. # Otherwise, check for hide-info at global and local repository level if ! __git_prompt_git rev-parse --git-dir &> /dev/null \ - || [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then + || [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then return 0 fi + # Get either: + # - the current branch name + # - the tag name if we are on a tag + # - the short SHA of the current commit local ref ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \ || ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \ @@ -33,6 +37,20 @@ function git_prompt_info() { echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" } +# Enable async prompt by default unless the setting is at false / no +if zstyle -T ':omz:alpha:lib:git' async-prompt; then + function git_prompt_info() { + _omz_register_handler _omz_git_prompt_status + if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then + echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" + fi + } +else + function git_prompt_info() { + _omz_git_prompt_status + } +fi + # Checks if working tree is dirty function parse_git_dirty() { local STATUS From 32d4389aa6e896b27d9786d142a5c44163104056 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 7 Mar 2024 17:17:27 +0100 Subject: [PATCH 051/158] fix(git): disable temporarely async prompt --- lib/git.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/git.zsh b/lib/git.zsh index 6f4823458..8fe999095 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -38,7 +38,7 @@ function _omz_git_prompt_status() { } # Enable async prompt by default unless the setting is at false / no -if zstyle -T ':omz:alpha:lib:git' async-prompt; then +if zstyle -t ':omz:alpha:lib:git' async-prompt; then function git_prompt_info() { _omz_register_handler _omz_git_prompt_status if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then From 06753e8146332aa787857fc5cc41caa2b5f753f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sat, 9 Mar 2024 18:22:35 +0100 Subject: [PATCH 052/158] fix(async): register the git prompt async handler correctly (#12267) This fix conditionally registers the git prompt async handler only if `git_prompt_info` is used anywhere in the prompt variables. This is done in the proper order, so that the async request is processed once the handler has been registered. This fix also passes the return value of the previous command to each of the async handlers, in case they are needed. --- lib/async_prompt.zsh | 12 +++++++++--- lib/git.zsh | 20 +++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/lib/async_prompt.zsh b/lib/async_prompt.zsh index c6d03328b..384e49d33 100644 --- a/lib/async_prompt.zsh +++ b/lib/async_prompt.zsh @@ -5,8 +5,8 @@ zmodload zsh/system # For now, async prompt function handlers are set up like so: -# First, define the async function handler and add the function name -# to the _omz_async_functions array: +# First, define the async function handler and register the handler +# with _omz_register_handler: # # function _git_prompt_status_async { # # Do some expensive operation that outputs to stdout @@ -17,7 +17,7 @@ zmodload zsh/system # which will show the output of "$_OMZ_ASYNC_OUTPUT[handler_name]": # # function git_prompt_status { -# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status] +# echo -n $_OMZ_ASYNC_OUTPUT[_git_prompt_status_async] # } # # RPROMPT='$(git_prompt_status)' @@ -43,6 +43,7 @@ function _omz_register_handler { # Set up async handlers and callbacks function _omz_async_request { + local -i ret=$? typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT # executor runs a subshell for all async requests based on key @@ -83,6 +84,8 @@ function _omz_async_request { builtin echo ${sysparams[pid]} # Store handler name for callback builtin echo $handler + # Set exit code for the handler if used + (exit $ret) # Run the async function handler $handler ) @@ -138,3 +141,6 @@ function _omz_async_callback() { _OMZ_ASYNC_FDS[$handler]=-1 _OMZ_ASYNC_PIDS[$handler]=-1 } + +autoload -Uz add-zsh-hook +add-zsh-hook precmd _omz_async_request diff --git a/lib/git.zsh b/lib/git.zsh index 8fe999095..96df5589d 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -40,11 +40,29 @@ function _omz_git_prompt_status() { # Enable async prompt by default unless the setting is at false / no if zstyle -t ':omz:alpha:lib:git' async-prompt; then function git_prompt_info() { - _omz_register_handler _omz_git_prompt_status if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" fi } + + # Conditionally register the async handler, only if it's needed in $PROMPT + # or any of the other prompt variables + function _defer_async_git_register() { + # Check if git_prompt_info is used in a prompt variable + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in + *(\$\(git_prompt_info\)|\`git_prompt_info\`)*) + _omz_register_handler _omz_git_prompt_status + return + ;; + esac + + add-zsh-hook -d precmd _defer_async_git_register + unset -f _defer_async_git_register + } + + # Register the async handler first. This needs to be done before + # the async request prompt is run + precmd_functions=(_defer_async_git_register $precmd_functions) else function git_prompt_info() { _omz_git_prompt_status From 4fd2af0a82e2826317d9551ecd8d5f44553828d7 Mon Sep 17 00:00:00 2001 From: Misaka Date: Sun, 10 Mar 2024 10:16:16 +0800 Subject: [PATCH 053/158] feat(fzf): add default fzf_base for msys2 (#12274) --- 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 b253a23d2..7312e3d26 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -8,6 +8,7 @@ function fzf_setup_using_base_dir() { "${HOME}/.fzf" "${HOME}/.nix-profile/share/fzf" "${XDG_DATA_HOME:-$HOME/.local/share}/fzf" + "${MSYSTEM_PREFIX}/share/fzf" "/usr/local/opt/fzf" "/opt/homebrew/opt/fzf" "/usr/share/fzf" From 1cc41576d4d2ffe2f63bb893a40ef864dc7f2c98 Mon Sep 17 00:00:00 2001 From: webstar <814566123@qq.com> Date: Tue, 12 Mar 2024 10:43:08 +0800 Subject: [PATCH 054/158] docs(readme): add contributor list (#12236) --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 98743432d..b3561a833 100644 --- a/README.md +++ b/README.md @@ -449,6 +449,10 @@ Oh My Zsh has a vibrant community of happy users and delightful contributors. Wi Thank you so much! + + + + ## Follow Us We're on social media: From 4ad09ab0b10adc90730476bd27f24f93d94728ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ing=2E=20Jan=20Kal=C3=A1b?= Date: Tue, 12 Mar 2024 18:23:08 +0100 Subject: [PATCH 055/158] feat(extract): prefer using `pbzip2` instead of `bunzip2` (#12280) --- plugins/extract/extract.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 88d8b0740..80ca50c50 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -70,7 +70,7 @@ EOF (*.tar.lz4) lz4 -c -d "$full_path" | tar xvf - ;; (*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$full_path" ;; (*.gz) (( $+commands[pigz] )) && pigz -cdk "$full_path" > "${file:t:r}" || gunzip -ck "$full_path" > "${file:t:r}" ;; - (*.bz2) bunzip2 "$full_path" ;; + (*.bz2) (( $+commands[pbzip2] )) && pbzip2 -d "$full_path" || bunzip2 "$full_path" ;; (*.xz) unxz "$full_path" ;; (*.lrz) (( $+commands[lrunzip] )) && lrunzip "$full_path" ;; (*.lz4) lz4 -d "$full_path" ;; From 6780b19329501b66bc87274928f0a65cc7e5f473 Mon Sep 17 00:00:00 2001 From: guangwu Date: Thu, 14 Mar 2024 18:37:06 +0800 Subject: [PATCH 056/158] docs(pyenv): fix typo (#12283) --- plugins/pyenv/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/pyenv/README.md b/plugins/pyenv/README.md index f1ca3d288..f18fc8cfb 100644 --- a/plugins/pyenv/README.md +++ b/plugins/pyenv/README.md @@ -10,7 +10,7 @@ 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: +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 achieved by adding the following earlier in the `.zshrc` file than the `plugins=(...)` line: ```zsh export PYENV_ROOT="$HOME/.pyenv" From c8ba08581dff43c18c1b0d9e7312ca32e6d97124 Mon Sep 17 00:00:00 2001 From: shuangcui Date: Fri, 15 Mar 2024 00:07:39 +0800 Subject: [PATCH 057/158] docs: fix typos (#12284) --- lib/cli.zsh | 2 +- plugins/catimg/README.md | 2 +- plugins/emacs/README.md | 2 +- plugins/emacs/emacs.plugin.zsh | 2 +- plugins/ipfs/_ipfs | 2 +- plugins/nomad/_nomad | 2 +- plugins/per-directory-history/per-directory-history.zsh | 2 +- plugins/ssh-agent/README.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/cli.zsh b/lib/cli.zsh index 561c1b98b..aa36a6ab5 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -448,7 +448,7 @@ function _omz::plugin::load { if [[ ! -f "$base/_$plugin" && ! -f "$base/$plugin.plugin.zsh" ]]; then _omz::log warn "'$plugin' is not a valid plugin" continue - # It it is a valid plugin, add its directory to $fpath unless it is already there + # It is a valid plugin, add its directory to $fpath unless it is already there elif (( ! ${fpath[(Ie)$base]} )); then fpath=("$base" $fpath) fi diff --git a/plugins/catimg/README.md b/plugins/catimg/README.md index 8f2688050..68dc33c1f 100644 --- a/plugins/catimg/README.md +++ b/plugins/catimg/README.md @@ -1,6 +1,6 @@ # catimg -Plugin for displaying images on the terminal using the the `catimg.sh` script provided by [posva](https://github.com/posva/catimg) +Plugin for displaying images on the terminal using the `catimg.sh` script provided by [posva](https://github.com/posva/catimg) To use it, add `catimg` to the plugins array in your zshrc file: diff --git a/plugins/emacs/README.md b/plugins/emacs/README.md index 8ed4a1473..47c7644ab 100644 --- a/plugins/emacs/README.md +++ b/plugins/emacs/README.md @@ -27,4 +27,4 @@ The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that | eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs | | 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 | +| ecd | - | Print the directory of the file open in the current buffer | diff --git a/plugins/emacs/emacs.plugin.zsh b/plugins/emacs/emacs.plugin.zsh index 4747f035b..5aa621803 100644 --- a/plugins/emacs/emacs.plugin.zsh +++ b/plugins/emacs/emacs.plugin.zsh @@ -60,7 +60,7 @@ function efile { } # Write to standard output the directory of the file -# opened in the the current buffer +# opened in the current buffer function ecd { local file file="$(efile)" || return $? diff --git a/plugins/ipfs/_ipfs b/plugins/ipfs/_ipfs index 8771bc4ba..5b8b05b98 100644 --- a/plugins/ipfs/_ipfs +++ b/plugins/ipfs/_ipfs @@ -202,7 +202,7 @@ _ipfs_subcommand(){ _arguments \ '--resolve[Check if the given path can be resolved before publishing. Default: true.]' \ '(-t --lifetime)'{-t,--lifetime}'[Time duration that the record will be valid for. Default: 24h.]' \ - '--allow-offline[When offline, save the IPNS record to the the local datastore without broadcasting to the network instead of simply failing.]' \ + '--allow-offline[When offline, save the IPNS record to the local datastore without broadcasting to the network instead of simply failing.]' \ '--ttl[Time duration this record should be cached for. Uses the same syntax as the lifetime option. (caution: experimental).]' \ '(-k --key)'{-k,--key}"[Name of the key to be used or a valid PeerID, as listed by 'ipfs key list -l'. Default: self.]" \ '(-Q --quieter)'{-Q,--quieter}'[Write only final hash.]' \ diff --git a/plugins/nomad/_nomad b/plugins/nomad/_nomad index 1c935a02e..4c6cb2fcb 100644 --- a/plugins/nomad/_nomad +++ b/plugins/nomad/_nomad @@ -97,7 +97,7 @@ __run() { '-address=[(addr) The address of the Nomad server. Overrides the NOMAD_ADDR environment variable if set. Default = http://127.0.0.1:4646]' \ '-region=[(region) The region of the Nomad servers to forward commands to. Overrides the NOMAD_REGION environment variable if set. Defaults to the Agent s local region.]' \ '-no-color[Disables colored command output.]' \ - '-check-index[If set, the job is only registered or updated if the the passed job modify index matches the server side version. If a check-index value of zero is passed, the job is only registered if it does not yet exist. If a non-zero value is passed, it ensures that the job is being updated from a known state. The use of this flag is most common in conjunction with plan command.]' \ + '-check-index[If set, the job is only registered or updated if the passed job modify index matches the server side version. If a check-index value of zero is passed, the job is only registered if it does not yet exist. If a non-zero value is passed, it ensures that the job is being updated from a known state. The use of this flag is most common in conjunction with plan command.]' \ '-detach[Return immediately instead of entering monitor mode. After job submission, the evaluation ID will be printed to the screen, which can be used to examine the evaluation using the eval-status command.]' \ '-output[Output the JSON that would be submitted to the HTTP API without submitting the job.]' \ '-verbose[Show full information.]' diff --git a/plugins/per-directory-history/per-directory-history.zsh b/plugins/per-directory-history/per-directory-history.zsh index b33e0b5dd..926373ae0 100644 --- a/plugins/per-directory-history/per-directory-history.zsh +++ b/plugins/per-directory-history/per-directory-history.zsh @@ -21,7 +21,7 @@ #------------------------------------------------------------------------------- # # The idea/inspiration for a per directory history is from Stewart MacArthur[1] -# and Dieter[2], the implementation idea is from Bart Schaefer on the the zsh +# and Dieter[2], the implementation idea is from Bart Schaefer on the zsh # mailing list[3]. The implementation is by Jim Hester in September 2012. # # [1]: http://www.compbiome.com/2010/07/bash-per-directory-bash-history.html diff --git a/plugins/ssh-agent/README.md b/plugins/ssh-agent/README.md index 8c118e65b..0afa80cc8 100644 --- a/plugins/ssh-agent/README.md +++ b/plugins/ssh-agent/README.md @@ -90,7 +90,7 @@ use the `ssh-add-args` setting. You can pass multiple arguments separated by spa zstyle :omz:plugins:ssh-agent ssh-add-args -K -c -a /run/user/1000/ssh-auth ``` -These will then be passed the the `ssh-add` call as if written directly. The example +These will then be passed the `ssh-add` call as if written directly. The example above will turn into: ```zsh From fff9ab7619fc26341908f63b18341f113805967a Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 15 Mar 2024 19:49:24 +0700 Subject: [PATCH 058/158] feat(dependencies): enable gradle plugin --- .github/dependencies.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/dependencies.yml b/.github/dependencies.yml index d60ab2c92..add39f7f3 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -29,3 +29,10 @@ dependencies: postcopy: | set -e test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md + plugins/gradle: + repo: gradle/gradle-completion + branch: master + version: ea018400d86610d0f79f84debbb33c2d2ef5dbec + precopy: | + set -e + find . ! -name _gradle -delete From 8940fa29134e5b06bbe383e8f741dbe097244626 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 15 Mar 2024 19:53:43 +0700 Subject: [PATCH 059/158] fix(dependencies): copy gradle LICENSE --- .github/dependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/dependencies.yml b/.github/dependencies.yml index add39f7f3..98b52ffa9 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -35,4 +35,4 @@ dependencies: version: ea018400d86610d0f79f84debbb33c2d2ef5dbec precopy: | set -e - find . ! -name _gradle -delete + find . ! -name _gradle ! -name LICENSE -delete From d0bddee6e3703e78f588d037078606d41a4d6237 Mon Sep 17 00:00:00 2001 From: "ohmyzsh[bot]" <54982679+ohmyzsh[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 19:55:43 +0700 Subject: [PATCH 060/158] feat(gradle): update completion to version 25da917c (#12287) Co-authored-by: ohmyzsh[bot] <54982679+ohmyzsh[bot]@users.noreply.github.com> --- .github/dependencies.yml | 2 +- plugins/gradle/LICENSE | 19 +++++++++++++++++++ plugins/gradle/_gradle | 30 +++--------------------------- 3 files changed, 23 insertions(+), 28 deletions(-) create mode 100644 plugins/gradle/LICENSE diff --git a/.github/dependencies.yml b/.github/dependencies.yml index 98b52ffa9..f760ddcef 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -32,7 +32,7 @@ dependencies: plugins/gradle: repo: gradle/gradle-completion branch: master - version: ea018400d86610d0f79f84debbb33c2d2ef5dbec + version: 25da917cf5a88f3e58f05be3868a7b2748c8afe6 precopy: | set -e find . ! -name _gradle ! -name LICENSE -delete diff --git a/plugins/gradle/LICENSE b/plugins/gradle/LICENSE new file mode 100644 index 000000000..06edf4af2 --- /dev/null +++ b/plugins/gradle/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 Eric Wendelin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/gradle/_gradle b/plugins/gradle/_gradle index f8df928b4..ca13fd0b0 100644 --- a/plugins/gradle/_gradle +++ b/plugins/gradle/_gradle @@ -1,28 +1,4 @@ #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 -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -# of the Software, and to permit persons to whom the Software is furnished to do -# so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# Terms __gradle-set-project-root-dir() { local dir=`pwd` @@ -38,7 +14,7 @@ __gradle-set-project-root-dir() { } __gradle-init-cache-dir() { - cache_dir="$HOME/.gradle/completion" + cache_dir="${GRADLE_USER_HOME:-$HOME/.gradle}/completion" mkdir -p $cache_dir } @@ -98,7 +74,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 | egrep -v "$script_exclude_pattern") ) + gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | grep -E -v "$script_exclude_pattern") ) printf "%s\n" "${gradle_build_scripts[@]}" >| $cache_dir/$cache_name fi } @@ -125,7 +101,7 @@ __gradle-generate-tasks-cache() { local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line local -a match for output_line in ${(f)"$(printf "%s\n" "${gradle_tasks_output[@]}")"}; do - if [[ $output_line =~ ^([[:lower:]][[:alnum:][:punct:]]*)([[:space:]]-[[:space:]]([[:print:]]*))? ]]; then + if [[ $output_line =~ ^([[:alpha:]][[:alnum:][:punct:]]*)([[:space:]]-[[:space:]]([[:print:]]*))? ]]; then local task_name="${match[1]}" local task_description="${match[3]}" # Completion for subproject tasks with ':' prefix From 0fed36688f9a60d8b1f2182f27de7fdc8a1e6b72 Mon Sep 17 00:00:00 2001 From: Colin Barnabas <1637663+colin-barnabas@users.noreply.github.com> Date: Fri, 15 Mar 2024 21:26:48 -0700 Subject: [PATCH 061/158] fix(docker-compose): completion regression (#12288) --- plugins/docker-compose/_docker-compose | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/docker-compose/_docker-compose b/plugins/docker-compose/_docker-compose index c6b733500..d0ebfe515 100644 --- a/plugins/docker-compose/_docker-compose +++ b/plugins/docker-compose/_docker-compose @@ -128,7 +128,7 @@ __docker-compose_subcommand() { '--resolve-image-digests[Pin image tags to digests.]' \ '--services[Print the service names, one per line.]' \ '--volumes[Print the volume names, one per line.]' \ - '--hash[Print the service config hash, one per line. Set "service1,service2" for a list of specified services.]' \ && ret=0 + '--hash[Print the service config hash, one per line. Set "service1,service2" for a list of specified services.]' && ret=0 ;; (create) _arguments \ From d157fc60c93fa59e757921b503e9594bd23b422c Mon Sep 17 00:00:00 2001 From: Ben Woodward Date: Thu, 21 Mar 2024 19:46:40 +0000 Subject: [PATCH 062/158] fix(mise): update environment when loading the plugin (#12294) --- plugins/mise/mise.plugin.zsh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/mise/mise.plugin.zsh b/plugins/mise/mise.plugin.zsh index 1b4d3ae81..357174d91 100644 --- a/plugins/mise/mise.plugin.zsh +++ b/plugins/mise/mise.plugin.zsh @@ -11,6 +11,9 @@ fi # Load mise hooks eval "$($__mise activate zsh)" +# Hook mise into current environment +eval "$($__mise hook-env -s zsh)" + # If the completion file doesn't exist yet, we need to autoload it and # bind it to `mise`. Otherwise, compinit will have already done that. if [[ ! -f "$ZSH_CACHE_DIR/completions/_$__mise" ]]; then From 3e05befaeee60a0f8522f470292c75046b05ceb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20Schl=C3=BCter?= Date: Mon, 25 Mar 2024 12:27:21 +0100 Subject: [PATCH 063/158] fix(ssh-agent): don't start new agent if screen/tmux symlink exists (#12297) --- plugins/ssh-agent/ssh-agent.plugin.zsh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/ssh-agent/ssh-agent.plugin.zsh b/plugins/ssh-agent/ssh-agent.plugin.zsh index 49ad95a11..77c422ce1 100644 --- a/plugins/ssh-agent/ssh-agent.plugin.zsh +++ b/plugins/ssh-agent/ssh-agent.plugin.zsh @@ -98,8 +98,10 @@ function _add_identities() { # Add a nifty symlink for screen/tmux if agent forwarding is enabled if zstyle -t :omz:plugins:ssh-agent agent-forwarding \ - && [[ -n "$SSH_AUTH_SOCK" && ! -L "$SSH_AUTH_SOCK" ]]; then - ln -sf "$SSH_AUTH_SOCK" /tmp/ssh-agent-$USERNAME-screen + && [[ -n "$SSH_AUTH_SOCK" ]]; then + if [[ ! -L "$SSH_AUTH_SOCK" ]]; then + ln -sf "$SSH_AUTH_SOCK" /tmp/ssh-agent-$USERNAME-screen + fi else _start_agent fi From 7647c79bae1542b5f4dddc85b16058df7f83fc6c Mon Sep 17 00:00:00 2001 From: Jim Weller <31997291+jimweller@users.noreply.github.com> Date: Tue, 26 Mar 2024 01:48:14 -0700 Subject: [PATCH 064/158] feat(jira): add help/usage cmd (#12293) Co-authored-by: Carlo Sala --- plugins/jira/README.md | 5 ++++- plugins/jira/_jira | 1 + plugins/jira/jira.plugin.zsh | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/plugins/jira/README.md b/plugins/jira/README.md index d78ea15a4..b1d8a8bc6 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -16,18 +16,21 @@ This plugin supplies one command, `jira`, through which all its features are exp ## Commands +`jira help` or `jira usage` will print the below usage instructions + | 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 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 help` | Prints usage instructions | ### Jira Branch usage notes diff --git a/plugins/jira/_jira b/plugins/jira/_jira index 0e37b7e9d..5f7dcd09d 100644 --- a/plugins/jira/_jira +++ b/plugins/jira/_jira @@ -11,6 +11,7 @@ _1st_arguments=( 'assigned:search for issues assigned to a user' 'branch:open the issue named after the git branch of the current directory' 'dumpconfig:display effective jira configuration' + 'help:print usage help to stdout' ) _arguments -C \ diff --git a/plugins/jira/jira.plugin.zsh b/plugins/jira/jira.plugin.zsh index b6ee9f100..9bcf4cc7b 100644 --- a/plugins/jira/jira.plugin.zsh +++ b/plugins/jira/jira.plugin.zsh @@ -2,6 +2,21 @@ # # See README.md for details +function _jira_usage() { +cat < Date: Tue, 26 Mar 2024 09:52:01 +0100 Subject: [PATCH 065/158] feat(terraform): add `tft` (`terraform test`) (#12299) --- plugins/terraform/README.md | 27 +++++++++++++------------- plugins/terraform/terraform.plugin.zsh | 1 + 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md index 135fd78ef..2b535517c 100644 --- a/plugins/terraform/README.md +++ b/plugins/terraform/README.md @@ -15,19 +15,20 @@ plugins=(... terraform) ## Aliases -| Alias | Command | -| ----- | -------------------- | -| `tf` | `terraform` | -| `tfa` | `terraform apply` | -| `tfc` | `terraform console` | -| `tfd` | `terraform destroy` | -| `tff` | `terraform fmt` | -| `tfi` | `terraform init` | -| `tfo` | `terraform output` | -| `tfp` | `terraform plan` | -| `tfv` | `terraform validate` | -| `tfs` | `terraform state` | -| `tfsh`| `terraform show` | +| Alias | Command | +| ------ | -------------------- | +| `tf` | `terraform` | +| `tfa` | `terraform apply` | +| `tfc` | `terraform console` | +| `tfd` | `terraform destroy` | +| `tff` | `terraform fmt` | +| `tfi` | `terraform init` | +| `tfo` | `terraform output` | +| `tfp` | `terraform plan` | +| `tfv` | `terraform validate` | +| `tfs` | `terraform state` | +| `tft` | `terraform test` | +| `tfsh` | `terraform show` | ## Prompt function diff --git a/plugins/terraform/terraform.plugin.zsh b/plugins/terraform/terraform.plugin.zsh index f66a8eac9..8ef392efd 100644 --- a/plugins/terraform/terraform.plugin.zsh +++ b/plugins/terraform/terraform.plugin.zsh @@ -25,4 +25,5 @@ alias tfo='terraform output' alias tfp='terraform plan' alias tfv='terraform validate' alias tfs='terraform state' +alias tft='terraform test' alias tfsh='terraform show' From a168efe73e467c7164ef9b49dea61e9aefd27a48 Mon Sep 17 00:00:00 2001 From: Zikoeng Xi Date: Tue, 26 Mar 2024 16:54:04 +0800 Subject: [PATCH 066/158] fix(poetry-env): activate only if env exists (#12301) --- plugins/poetry-env/poetry-env.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/poetry-env/poetry-env.plugin.zsh b/plugins/poetry-env/poetry-env.plugin.zsh index 86e5fad4e..97ca52492 100644 --- a/plugins/poetry-env/poetry-env.plugin.zsh +++ b/plugins/poetry-env/poetry-env.plugin.zsh @@ -14,10 +14,10 @@ _togglePoetryShell() { # 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 + if grep -q 'tool.poetry' "$PWD/pyproject.toml" && venv_dir=$(poetry env info --path); then export poetry_active=1 export poetry_dir="$PWD" - source "$(poetry env info --path)/bin/activate" + source "${venv_dir}/bin/activate" fi fi fi From 1d09c6bb0a950756a65b02457842933e3aa493eb Mon Sep 17 00:00:00 2001 From: vladislav doster <10052309+vladdoster@users.noreply.github.com> Date: Tue, 26 Mar 2024 03:55:16 -0500 Subject: [PATCH 067/158] style: remove trailing whitespace (#12303) --- custom/example.zsh | 6 ++--- custom/themes/example.zsh-theme | 2 +- lib/compfix.zsh | 2 +- lib/diagnostics.zsh | 24 +++++++++---------- oh-my-zsh.sh | 2 +- plugins/ansible/README.md | 2 +- plugins/aws/aws.plugin.zsh | 2 +- plugins/branch/README.md | 2 +- plugins/chruby/chruby.plugin.zsh | 4 ++-- plugins/cloudfoundry/README.md | 2 +- plugins/coffee/README.md | 2 +- plugins/compleat/compleat.plugin.zsh | 4 ++-- plugins/copybuffer/copybuffer.plugin.zsh | 2 +- plugins/dash/README.md | 2 +- plugins/dotnet/dotnet.plugin.zsh | 2 +- plugins/emoji/emoji.plugin.zsh | 18 +++++++------- plugins/emotty/emotty.plugin.zsh | 2 +- plugins/encode64/README.md | 2 +- plugins/fancy-ctrl-z/README.md | 8 +++---- plugins/fastfile/README.md | 4 ++-- plugins/forklift/forklift.plugin.zsh | 4 ++-- plugins/fzf/fzf.plugin.zsh | 2 +- plugins/gnu-utils/gnu-utils.plugin.zsh | 4 ++-- plugins/grails/grails.plugin.zsh | 14 +++++------ plugins/history-substring-search/README.md | 8 +++---- plugins/ionic/ionic.plugin.zsh | 12 +++++----- plugins/iterm2/README.md | 2 +- plugins/iterm2/iterm2.plugin.zsh | 2 +- plugins/iterm2/iterm2_shell_integration.zsh | 4 ++-- plugins/jira/README.md | 2 +- plugins/juju/juju.plugin.zsh | 2 +- plugins/kn/kn.plugin.zsh | 2 +- plugins/macports/_port | 8 +++---- plugins/marked2/README.md | 2 +- plugins/marktext/README.md | 2 +- plugins/mongo-atlas/README.md | 2 +- plugins/n98-magerun/n98-magerun.plugin.zsh | 2 +- plugins/nmap/nmap.plugin.zsh | 2 +- plugins/nomad/_nomad | 2 +- plugins/npm/npm.plugin.zsh | 2 +- plugins/nvm/nvm.plugin.zsh | 2 +- plugins/otp/README.md | 2 +- plugins/pm2/_pm2 | 2 +- plugins/poetry-env/README.md | 2 +- plugins/ros/_ros | 2 +- plugins/sbt/sbt.plugin.zsh | 2 +- plugins/screen/screen.plugin.zsh | 2 +- plugins/singlechar/singlechar.plugin.zsh | 2 +- plugins/systemadmin/README.md | 2 +- plugins/thor/README.md | 2 +- plugins/ufw/README.md | 2 +- plugins/vagrant-prompt/README.md | 2 +- plugins/vi-mode/README.md | 2 +- plugins/vim-interaction/README.md | 2 +- .../vim-interaction.plugin.zsh | 2 +- .../virtualenvwrapper.plugin.zsh | 2 +- plugins/wd/README.md | 2 +- plugins/wd/_wd.sh | 2 +- plugins/z/MANUAL.md | 2 +- themes/Soliah.zsh-theme | 10 ++++---- themes/adben.zsh-theme | 2 +- themes/agnoster.zsh-theme | 2 +- themes/avit.zsh-theme | 2 +- themes/crunch.zsh-theme | 6 ++--- themes/eastwood.zsh-theme | 2 +- themes/emotty.zsh-theme | 4 ++-- themes/essembeh.zsh-theme | 4 ++-- themes/josh.zsh-theme | 8 +++---- themes/junkfood.zsh-theme | 4 ++-- themes/mlh.zsh-theme | 2 +- themes/mortalscumbag.zsh-theme | 2 +- themes/sonicradish.zsh-theme | 2 +- themes/wedisagree.zsh-theme | 14 +++++------ 73 files changed, 138 insertions(+), 138 deletions(-) diff --git a/custom/example.zsh b/custom/example.zsh index 21a8d8be7..c194f49d7 100644 --- a/custom/example.zsh +++ b/custom/example.zsh @@ -1,12 +1,12 @@ # 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/themes/example.zsh-theme b/custom/themes/example.zsh-theme index 494d029e8..5551207f8 100644 --- a/custom/themes/example.zsh-theme +++ b/custom/themes/example.zsh-theme @@ -1,6 +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%}%% " diff --git a/lib/compfix.zsh b/lib/compfix.zsh index b09b283f2..2fe9d9e64 100644 --- a/lib/compfix.zsh +++ b/lib/compfix.zsh @@ -13,7 +13,7 @@ function handle_completion_insecurities() { # /usr/share/zsh/5.0.6 # # Since the ignorable first line is printed to stderr and thus not captured, - # stderr is squelched to prevent this output from leaking to the user. + # stderr is squelched to prevent this output from leaking to the user. local -aU insecure_dirs insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} ) diff --git a/lib/diagnostics.zsh b/lib/diagnostics.zsh index eaeba7d23..d67e6fab4 100644 --- a/lib/diagnostics.zsh +++ b/lib/diagnostics.zsh @@ -30,7 +30,7 @@ # # This is written in a defensive style so it still works (and can detect) cases when # basic functionality like echo and which have been redefined. In particular, almost -# everything is invoked with "builtin" or "command", to work in the face of user +# everything is invoked with "builtin" or "command", to work in the face of user # redefinitions. # # OPTIONS @@ -59,7 +59,7 @@ function omz_diagnostic_dump() { emulate -L zsh builtin echo "Generating diagnostic dump; please be patient..." - + local thisfcn=omz_diagnostic_dump local -A opts local opt_verbose opt_noverbose opt_outfile @@ -90,7 +90,7 @@ function omz_diagnostic_dump() { builtin echo builtin echo Diagnostic dump file created at: "$outfile" builtin echo - builtin echo To share this with OMZ developers, post it as a gist on GitHub + builtin echo To share this with OMZ developers, post it as a gist on GitHub builtin echo at "https://gist.github.com" and share the link to the gist. builtin echo builtin echo "WARNING: This dump file contains all your zsh and omz configuration files," @@ -105,8 +105,8 @@ function _omz_diag_dump_one_big_text() { builtin echo oh-my-zsh diagnostic dump builtin echo builtin echo $outfile - builtin echo - + builtin echo + # Basic system and zsh information command date command uname -a @@ -151,7 +151,7 @@ function _omz_diag_dump_one_big_text() { # Core command definitions _omz_diag_dump_check_core_commands || return 1 - builtin echo + builtin echo # ZSH Process state builtin echo Process state: @@ -167,7 +167,7 @@ function _omz_diag_dump_one_big_text() { #TODO: Should this include `env` instead of or in addition to `export`? builtin echo Exported: builtin echo $(builtin export | command sed 's/=.*//') - builtin echo + builtin echo builtin echo Locale: command locale builtin echo @@ -181,7 +181,7 @@ function _omz_diag_dump_one_big_text() { builtin echo builtin echo 'compaudit output:' compaudit - builtin echo + builtin echo builtin echo '$fpath directories:' command ls -lad $fpath builtin echo @@ -224,7 +224,7 @@ function _omz_diag_dump_one_big_text() { local cfgfile cfgfiles # Some files for bash that zsh does not use are intentionally included # to help with diagnosing behavior differences between bash and zsh - cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout + cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout $zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout ~/.zsh.pre-oh-my-zsh /etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout ) @@ -258,8 +258,8 @@ function _omz_diag_dump_check_core_commands() { # (For back-compatibility, if any of these are newish, they should be removed, # or at least made conditional on the version of the current running zsh.) # "history" is also excluded because OMZ is known to redefine that - reserved_words=( do done esac then elif else fi for case if while function - repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}' + reserved_words=( do done esac then elif else fi for case if while function + repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}' ) builtins=( alias autoload bg bindkey break builtin bye cd chdir command comparguments compcall compctl compdescribe compfiles compgroups compquote comptags @@ -331,7 +331,7 @@ function _omz_diag_dump_os_specific_version() { case "$OSTYPE" in darwin*) osname=$(command sw_vers -productName) - osver=$(command sw_vers -productVersion) + osver=$(command sw_vers -productVersion) builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)" ;; cygwin) diff --git a/oh-my-zsh.sh b/oh-my-zsh.sh index 137ca3b6f..2fb20298a 100644 --- a/oh-my-zsh.sh +++ b/oh-my-zsh.sh @@ -152,7 +152,7 @@ unset zcompdump_revision zcompdump_fpath zcompdump_refresh # zcompile the completion dump file if the .zwc is older or missing. 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" + command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock" fi _omz_source() { diff --git a/plugins/ansible/README.md b/plugins/ansible/README.md index ce21e7075..dd0e1ce03 100644 --- a/plugins/ansible/README.md +++ b/plugins/ansible/README.md @@ -28,6 +28,6 @@ plugins=(... ansible) ## Maintainer -### [Deepankumar](https://github.com/deepan10) +### [Deepankumar](https://github.com/deepan10) [https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin) diff --git a/plugins/aws/aws.plugin.zsh b/plugins/aws/aws.plugin.zsh index 071dd1f0b..0c43031df 100644 --- a/plugins/aws/aws.plugin.zsh +++ b/plugins/aws/aws.plugin.zsh @@ -280,7 +280,7 @@ if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then test -s "${AWS_STATE_FILE}" || return aws_state=($(cat $AWS_STATE_FILE)) - + export AWS_DEFAULT_PROFILE="${aws_state[1]}" export AWS_PROFILE="$AWS_DEFAULT_PROFILE" export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE" diff --git a/plugins/branch/README.md b/plugins/branch/README.md index a15dd22df..2b6d12d29 100644 --- a/plugins/branch/README.md +++ b/plugins/branch/README.md @@ -39,7 +39,7 @@ index 2fd5f2cd..9d89a464 100644 PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )" -PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)' +PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)' - + ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}" ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} " ``` diff --git a/plugins/chruby/chruby.plugin.zsh b/plugins/chruby/chruby.plugin.zsh index d7a28d4e2..1210897c4 100644 --- a/plugins/chruby/chruby.plugin.zsh +++ b/plugins/chruby/chruby.plugin.zsh @@ -2,7 +2,7 @@ _source-from-omz-settings() { local _chruby_path _chruby_auto - + zstyle -s :omz:plugins:chruby path _chruby_path || return 1 zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1 @@ -23,7 +23,7 @@ _source-from-homebrew() { if [[ -h /usr/local/opt/chruby ]];then _brew_prefix="/usr/local/opt/chruby" else - # ok , it is not default prefix + # ok , it is not default prefix # this call to brew is expensive ( about 400 ms ), so at least let's make it only once _brew_prefix=$(brew --prefix chruby) fi diff --git a/plugins/cloudfoundry/README.md b/plugins/cloudfoundry/README.md index 89dd9d1ce..567a9056b 100644 --- a/plugins/cloudfoundry/README.md +++ b/plugins/cloudfoundry/README.md @@ -50,7 +50,7 @@ Alternatively, seek out the [online documentation][3]. And don't forget, there a ## Contributors -Contributed to `oh_my_zsh` by [benwilcock][2]. +Contributed to `oh_my_zsh` by [benwilcock][2]. [1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html [2]: https://github.com/benwilcock diff --git a/plugins/coffee/README.md b/plugins/coffee/README.md index 2baade844..c2ab192b6 100644 --- a/plugins/coffee/README.md +++ b/plugins/coffee/README.md @@ -24,7 +24,7 @@ Also provides the following aliases: * **cfc:** Copies the compiled JS to your clipboard. Very useful when you want to run the code in a JS console. -* **cfp:** Compiles from your currently copied clipboard. Useful when you want +* **cfp:** Compiles from your currently copied clipboard. Useful when you want to compile large/multi-line snippets * **cfpc:** Paste coffeescript from clipboard, compile to JS, then copy the diff --git a/plugins/compleat/compleat.plugin.zsh b/plugins/compleat/compleat.plugin.zsh index 38f1b396a..7fbd2b953 100644 --- a/plugins/compleat/compleat.plugin.zsh +++ b/plugins/compleat/compleat.plugin.zsh @@ -7,7 +7,7 @@ if (( ${+commands[compleat]} )); then local prefix="${commands[compleat]:h:h}" - local setup="${prefix}/share/compleat-1.0/compleat_setup" + local setup="${prefix}/share/compleat-1.0/compleat_setup" if [[ -f "$setup" ]]; then if ! bashcompinit >/dev/null 2>&1; then @@ -15,6 +15,6 @@ if (( ${+commands[compleat]} )); then bashcompinit -i fi - source "$setup" + source "$setup" fi fi diff --git a/plugins/copybuffer/copybuffer.plugin.zsh b/plugins/copybuffer/copybuffer.plugin.zsh index e67f920f0..88bda32a0 100644 --- a/plugins/copybuffer/copybuffer.plugin.zsh +++ b/plugins/copybuffer/copybuffer.plugin.zsh @@ -1,4 +1,4 @@ -# copy the active line from the command line buffer +# copy the active line from the command line buffer # onto the system clipboard copybuffer () { diff --git a/plugins/dash/README.md b/plugins/dash/README.md index 0ca3e4e44..970c6541f 100644 --- a/plugins/dash/README.md +++ b/plugins/dash/README.md @@ -19,7 +19,7 @@ dash - Query for something in dash app: `dash query` ``` -dash golang +dash golang ``` - You can optionally provide a keyword: `dash [keyword:]query` diff --git a/plugins/dotnet/dotnet.plugin.zsh b/plugins/dotnet/dotnet.plugin.zsh index 40ee7efae..ed7c55024 100644 --- a/plugins/dotnet/dotnet.plugin.zsh +++ b/plugins/dotnet/dotnet.plugin.zsh @@ -11,7 +11,7 @@ _dotnet_completion() { compdef _dotnet_completion dotnet # Aliases bellow are here for backwards compatibility -# added by Shaun Tabone (https://github.com/xontab) +# added by Shaun Tabone (https://github.com/xontab) alias dn='dotnet new' alias dr='dotnet run' diff --git a/plugins/emoji/emoji.plugin.zsh b/plugins/emoji/emoji.plugin.zsh index f9e476ebf..f7be56cf7 100644 --- a/plugins/emoji/emoji.plugin.zsh +++ b/plugins/emoji/emoji.plugin.zsh @@ -24,7 +24,7 @@ unset _omz_emoji_plugin_dir # This is a combining character that can be placed after any other character to surround # it in a "keycap" symbol. -# The digits 0-9 are already in the emoji table as keycap_digit_, keycap_ten, etc. +# The digits 0-9 are already in the emoji table as keycap_digit_, keycap_ten, etc. # It's unclear whether this should be in the $emoji array, because those characters are all ones # which can be displayed on their own. @@ -63,9 +63,9 @@ function random_emoji() { [[ $list_size -eq 0 ]] && return 1 local random_index=$(( ( RANDOM % $list_size ) + 1 )) local name=${names[$random_index]} - if [[ "$group" == "flags" ]]; then + if [[ "$group" == "flags" ]]; then echo ${emoji_flags[$name]} - else + else echo ${emoji[$name]} fi } @@ -86,22 +86,22 @@ function display_emoji() { # terminals treat these emoji chars as single-width. local counter=1 for i in $names; do - if [[ "$group" == "flags" ]]; then + if [[ "$group" == "flags" ]]; then printf '%s ' "$emoji_flags[$i]" - else - printf '%s ' "$emoji[$i]" + else + printf '%s ' "$emoji[$i]" fi # New line every 20 emoji, to avoid weirdnesses if (($counter % 20 == 0)); then - printf "\n" + printf "\n" fi let counter=$counter+1 done print for i in $names; do - if [[ "$group" == "flags" ]]; then + if [[ "$group" == "flags" ]]; then echo "${emoji_flags[$i]} = $i" - else + else echo "${emoji[$i]} = $i" fi done diff --git a/plugins/emotty/emotty.plugin.zsh b/plugins/emotty/emotty.plugin.zsh index 661169a8b..b48d121dc 100644 --- a/plugins/emotty/emotty.plugin.zsh +++ b/plugins/emotty/emotty.plugin.zsh @@ -4,7 +4,7 @@ # AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net) # VERSION: 1.0.0 # DEPENDS: emoji plugin -# +# # There are different sets of emoji characters available, to choose a different # set export emotty_set to the name of the set you would like to use, e.g.: # % export emotty_set=nature diff --git a/plugins/encode64/README.md b/plugins/encode64/README.md index 7cdf8c3f3..e3e25a742 100644 --- a/plugins/encode64/README.md +++ b/plugins/encode64/README.md @@ -40,7 +40,7 @@ plugins=(... encode64) ### Encoding a file -Encode a file's contents to base64 and save output to text file. +Encode a file's contents to base64 and save output to text file. **NOTE:** Takes provided file and saves encoded content as new file with `.txt` extension - From parameter diff --git a/plugins/fancy-ctrl-z/README.md b/plugins/fancy-ctrl-z/README.md index f1b1dfa5c..82a4fd75e 100644 --- a/plugins/fancy-ctrl-z/README.md +++ b/plugins/fancy-ctrl-z/README.md @@ -1,14 +1,14 @@ # Use Ctrl-Z to switch back to Vim -I frequently need to execute random commands in my shell. To achieve it I pause +I frequently need to execute random commands in my shell. To achieve it I pause Vim by pressing Ctrl-z, type command and press fg to switch back to Vim. -The fg part really hurts me. I just wanted to hit Ctrl-z once again to get back -to Vim. I could not find a solution, so I developed one on my own that +The fg part really hurts me. I just wanted to hit Ctrl-z once again to get back +to Vim. I could not find a solution, so I developed one on my own that works wonderfully with ZSH. Source: http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/ -Credits: +Credits: - original idea by @sheerun - added to OMZ by @mbologna diff --git a/plugins/fastfile/README.md b/plugins/fastfile/README.md index 32f619ffd..7291fde38 100644 --- a/plugins/fastfile/README.md +++ b/plugins/fastfile/README.md @@ -71,13 +71,13 @@ them, add `=` to your zshrc file, before Oh My Zsh is sourced. For example: `fastfile_var_prefix='@'`. - `fastfile_var_prefix`: prefix for the global aliases created. Controls the prefix of the - created global aliases. + created global aliases. **Default:** `§` (section sign), easy to type in a german keyboard via the combination [`⇧ Shift`+`3`](https://en.wikipedia.org/wiki/German_keyboard_layout#/media/File:KB_Germany.svg), or using `⌥ Option`+`6` in macOS. - `fastfile_dir`: directory where the fastfile shortcuts are stored. Needs to end - with a trailing slash. + with a trailing slash. **Default:** `$HOME/.fastfile/`. ## Author diff --git a/plugins/forklift/forklift.plugin.zsh b/plugins/forklift/forklift.plugin.zsh index 85889481b..848aedabf 100644 --- a/plugins/forklift/forklift.plugin.zsh +++ b/plugins/forklift/forklift.plugin.zsh @@ -58,7 +58,7 @@ function fl { tell application forkLiftSetapp activate set forkLiftVersion to version - end tell + end tell else if forkLift3 is not null and application forkLift3 is running then tell application forkLift3 activate @@ -84,7 +84,7 @@ function fl { else if forkLift is not null then set appName to forkLift end if - + tell application appName activate set forkLiftVersion to version diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 7312e3d26..9e372f498 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -62,7 +62,7 @@ function fzf_setup_using_base_dir() { function fzf_setup_using_debian() { if (( ! $+commands[apt] && ! $+commands[apt-get] )); then - # Not a debian based distro + # Not a debian based distro return 1 fi diff --git a/plugins/gnu-utils/gnu-utils.plugin.zsh b/plugins/gnu-utils/gnu-utils.plugin.zsh index 6023bf2b4..adc2bd3bb 100644 --- a/plugins/gnu-utils/gnu-utils.plugin.zsh +++ b/plugins/gnu-utils/gnu-utils.plugin.zsh @@ -14,7 +14,7 @@ __gnu_utils() { local -a gcmds local gcmd - # coreutils + # coreutils gcmds=('g[' 'gbase64' 'gbasename' 'gcat' 'gchcon' 'gchgrp' 'gchmod' 'gchown' 'gchroot' 'gcksum' 'gcomm' 'gcp' 'gcsplit' 'gcut' 'gdate' 'gdd' 'gdf' 'gdir' 'gdircolors' 'gdirname' 'gdu' 'gecho' 'genv' 'gexpand' @@ -41,7 +41,7 @@ __gnu_utils() { for gcmd in "${gcmds[@]}"; do # Do nothing if the command isn't found (( ${+commands[$gcmd]} )) || continue - + # This method allows for builtin commands to be primary but it's # lost if hash -r or rehash is executed, or if $PATH is updated. # Thus, a preexec hook is needed, which will only run if whoami diff --git a/plugins/grails/grails.plugin.zsh b/plugins/grails/grails.plugin.zsh index ddc257428..e5dceb530 100644 --- a/plugins/grails/grails.plugin.zsh +++ b/plugins/grails/grails.plugin.zsh @@ -7,7 +7,7 @@ _enumerateGrailsScripts() { then directories+=(plugins/*/scripts) fi - + # Enumerate all of the Groovy files files=() for dir in $directories; @@ -17,13 +17,13 @@ _enumerateGrailsScripts() { files+=($dir/[^_]*.groovy) fi done - + # Don't try to basename () if [ ${#files} -eq 0 ]; then return fi - + scripts=() for file in $files do @@ -42,19 +42,19 @@ _enumerateGrailsScripts() { done echo $scripts } - + _grails() { if (( CURRENT == 2 )); then scripts=( $(_enumerateGrailsScripts) ) - + if [ ${#scripts} -ne 0 ]; then _multi_parts / scripts return fi fi - + _files } - + compdef _grails grails diff --git a/plugins/history-substring-search/README.md b/plugins/history-substring-search/README.md index 71a389535..4be744c4c 100644 --- a/plugins/history-substring-search/README.md +++ b/plugins/history-substring-search/README.md @@ -57,13 +57,13 @@ Using [antigen](https://github.com/zsh-users/antigen): 1. Add the `antigen bundle` command just before `antigen apply`, like this: -``` +``` antigen bundle zsh-users/zsh-history-substring-search antigen apply ``` - + 2. Then, **after** `antigen apply`, add the key binding configurations, like this: - + ``` # zsh-history-substring-search configuration bindkey '^[[A' history-substring-search-up # or '\eOA' @@ -120,7 +120,7 @@ Usage bindkey "$terminfo[kcuu1]" history-substring-search-up bindkey "$terminfo[kcud1]" history-substring-search-down - Users have also observed that `[OA` and `[OB` are correct values, + Users have also observed that `[OA` and `[OB` are correct values, _even if_ these were not the observed values. If you are having trouble with the observed values, give these a try. diff --git a/plugins/ionic/ionic.plugin.zsh b/plugins/ionic/ionic.plugin.zsh index cf388af1b..e3913b549 100644 --- a/plugins/ionic/ionic.plugin.zsh +++ b/plugins/ionic/ionic.plugin.zsh @@ -3,13 +3,13 @@ alias ih="ionic --help" alias ist="ionic start" alias ii="ionic info" alias is="ionic serve" -alias icba="ionic cordova build android" -alias icbi="ionic cordova build ios" -alias icra="ionic cordova run android" -alias icri="ionic cordova run ios" -alias icrsa="ionic cordova resources android" +alias icba="ionic cordova build android" +alias icbi="ionic cordova build ios" +alias icra="ionic cordova run android" +alias icri="ionic cordova run ios" +alias icrsa="ionic cordova resources android" alias icrsi="ionic cordova resources ios" -alias icpaa="ionic cordova platform add android" +alias icpaa="ionic cordova platform add android" alias icpai="ionic cordova platform add ios" alias icpra="ionic cordova platform rm android" alias icpri="ionic cordova platform rm ios" diff --git a/plugins/iterm2/README.md b/plugins/iterm2/README.md index 3d11622df..86bd77f1d 100644 --- a/plugins/iterm2/README.md +++ b/plugins/iterm2/README.md @@ -9,7 +9,7 @@ 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 +You can enable the integration with zstyle. It's important to add this line before the line sourcing oh-my-zsh: ``` diff --git a/plugins/iterm2/iterm2.plugin.zsh b/plugins/iterm2/iterm2.plugin.zsh index d00232a30..03a63a70c 100644 --- a/plugins/iterm2/iterm2.plugin.zsh +++ b/plugins/iterm2/iterm2.plugin.zsh @@ -8,7 +8,7 @@ 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 + 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}}" diff --git a/plugins/iterm2/iterm2_shell_integration.zsh b/plugins/iterm2/iterm2_shell_integration.zsh index 7871ddded..281332e0d 100644 --- a/plugins/iterm2/iterm2_shell_integration.zsh +++ b/plugins/iterm2/iterm2_shell_integration.zsh @@ -2,12 +2,12 @@ # 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. diff --git a/plugins/jira/README.md b/plugins/jira/README.md index b1d8a8bc6..1c6930298 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -35,7 +35,7 @@ This plugin supplies one command, `jira`, through which all its features are exp ### Jira Branch usage notes -The branch name may have prefixes ending in "/": "feature/MP-1234", and also suffixes +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", diff --git a/plugins/juju/juju.plugin.zsh b/plugins/juju/juju.plugin.zsh index a82ebaf84..3c159da22 100644 --- a/plugins/juju/juju.plugin.zsh +++ b/plugins/juju/juju.plugin.zsh @@ -184,7 +184,7 @@ jmodel() { fi local model="$(yq e ".controllers.$(jcontroller).current-model" < ~/.local/share/juju/models.yaml | cut -d/ -f2)" - + if [[ -z "$model" ]]; then echo "--" return 1 diff --git a/plugins/kn/kn.plugin.zsh b/plugins/kn/kn.plugin.zsh index f60177dd9..483d1d68c 100644 --- a/plugins/kn/kn.plugin.zsh +++ b/plugins/kn/kn.plugin.zsh @@ -4,5 +4,5 @@ if [ $commands[kn] ]; then source <(kn completion zsh) - compdef _kn kn + compdef _kn kn fi diff --git a/plugins/macports/_port b/plugins/macports/_port index 897598a46..f40f6550b 100644 --- a/plugins/macports/_port +++ b/plugins/macports/_port @@ -1,6 +1,6 @@ #compdef port -local subcmds +local subcmds # we cache the list of ports # we shall use some cache policy to avoid problems with new ports @@ -31,8 +31,8 @@ subcmds=( 'file' 'help' 'info' -'install' -'installed' +'install' +'installed' 'list' 'livecheck' 'location' @@ -51,7 +51,7 @@ subcmds=( 'test' 'unarchive' 'uninstall' -'upgrade' +'upgrade' 'variants' 'version' ) diff --git a/plugins/marked2/README.md b/plugins/marked2/README.md index 101343abb..2f825bc4a 100644 --- a/plugins/marked2/README.md +++ b/plugins/marked2/README.md @@ -1,6 +1,6 @@ ## marked2 -Plugin for Marked 2, a previewer for Markdown files on Mac OS X +Plugin for Marked 2, a previewer for Markdown files on Mac OS X ### Requirements diff --git a/plugins/marktext/README.md b/plugins/marktext/README.md index 71d287451..254e4e7ac 100644 --- a/plugins/marktext/README.md +++ b/plugins/marktext/README.md @@ -1,6 +1,6 @@ ## marktext -Plugin for MarkText, a previewer for Markdown files on Mac OS X +Plugin for MarkText, a previewer for Markdown files on Mac OS X ### Requirements diff --git a/plugins/mongo-atlas/README.md b/plugins/mongo-atlas/README.md index ef1b5e0d2..94183c544 100644 --- a/plugins/mongo-atlas/README.md +++ b/plugins/mongo-atlas/README.md @@ -1,6 +1,6 @@ # MongoDB Atlas plugin -This plugin adds completion for [Atlas](https://www.mongodb.com/docs/atlas/cli/stable/) a command line interface built specifically for +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: diff --git a/plugins/n98-magerun/n98-magerun.plugin.zsh b/plugins/n98-magerun/n98-magerun.plugin.zsh index d79aee7eb..2744ad96e 100644 --- a/plugins/n98-magerun/n98-magerun.plugin.zsh +++ b/plugins/n98-magerun/n98-magerun.plugin.zsh @@ -1,6 +1,6 @@ # ------------------------------------------------------------------------------ # FILE: n98-magerun.plugin.zsh -# DESCRIPTION: oh-my-zsh n98-magerun plugin file. Adapted from composer plugin +# DESCRIPTION: oh-my-zsh n98-magerun plugin file. Adapted from composer plugin # AUTHOR: Andrew Dwyer (andrewrdwyer at gmail dot com) # AUTHOR: Jisse Reitsma (jisse at yireo dot com) # VERSION: 1.1.0 diff --git a/plugins/nmap/nmap.plugin.zsh b/plugins/nmap/nmap.plugin.zsh index 406870f00..f649dafc2 100644 --- a/plugins/nmap/nmap.plugin.zsh +++ b/plugins/nmap/nmap.plugin.zsh @@ -27,6 +27,6 @@ alias nmap_detect_versions="sudo nmap -sV -p1-65535 -O --osscan-guess -T4 -Pn" alias nmap_check_for_vulns="nmap --script=vuln" alias nmap_full_udp="sudo nmap -sS -sU -T4 -A -v -PE -PS22,25,80 -PA21,23,80,443,3389 " alias nmap_traceroute="sudo nmap -sP -PE -PS22,25,80 -PA21,23,80,3389 -PU -PO --traceroute " -alias nmap_full_with_scripts="sudo nmap -sS -sU -T4 -A -v -PE -PP -PS21,22,23,25,80,113,31339 -PA80,113,443,10042 -PO --script all " +alias nmap_full_with_scripts="sudo nmap -sS -sU -T4 -A -v -PE -PP -PS21,22,23,25,80,113,31339 -PA80,113,443,10042 -PO --script all " alias nmap_web_safe_osscan="sudo nmap -p 80,443 -O -v --osscan-guess --fuzzy " alias nmap_ping_scan="nmap -n -sP" diff --git a/plugins/nomad/_nomad b/plugins/nomad/_nomad index 4c6cb2fcb..87f80aa84 100644 --- a/plugins/nomad/_nomad +++ b/plugins/nomad/_nomad @@ -89,7 +89,7 @@ __plan() { '-address=[(addr) The address of the Nomad server. Overrides the NOMAD_ADDR environment variable if set. Default = http://127.0.0.1:4646]' \ '-region=[(region) The region of the Nomad servers to forward commands to. Overrides the NOMAD_REGION environment variable if set. Defaults to the Agent s local region.]' \ '-no-color[Disables colored command output.]' \ - '-diff[Determines whether the diff between the remote job and planned job is shown. Defaults to true.]' + '-diff[Determines whether the diff between the remote job and planned job is shown. Defaults to true.]' } __run() { diff --git a/plugins/npm/npm.plugin.zsh b/plugins/npm/npm.plugin.zsh index 23377b085..c333f76ed 100644 --- a/plugins/npm/npm.plugin.zsh +++ b/plugins/npm/npm.plugin.zsh @@ -58,7 +58,7 @@ alias npmt="npm test" # Run npm scripts alias npmR="npm run" -# Run npm publish +# Run npm publish alias npmP="npm publish" # Run npm init diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index 6a5afecfa..c2e8de94b 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -16,7 +16,7 @@ if [[ -z "$NVM_DIR" ]]; then fi fi -if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then +if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then return fi diff --git a/plugins/otp/README.md b/plugins/otp/README.md index 8331fd02b..52ad9525b 100644 --- a/plugins/otp/README.md +++ b/plugins/otp/README.md @@ -16,7 +16,7 @@ Provided aliases: email address). Then the OTP key needs to be pasted, followed by a CTRL+D character inserted on an empty line. -- `ot`: generates a MFA code based on the given key and copies it to the clipboard +- `ot`: generates a MFA code based on the given key and copies it to the clipboard (on Linux it relies on xsel, on MacOS X it uses pbcopy instead). The plugin uses `$HOME/.otp` to store its internal files. diff --git a/plugins/pm2/_pm2 b/plugins/pm2/_pm2 index faa6a3404..66320b810 100644 --- a/plugins/pm2/_pm2 +++ b/plugins/pm2/_pm2 @@ -79,7 +79,7 @@ _id_names() { local app_list app_list=`pm2 list -m` - local -a names ids + local -a names ids names=(`echo $app_list | grep '+---' | awk '{print $2}'`) ids=(`echo $app_list | grep 'pm2 id' | awk '{print $4}'`) diff --git a/plugins/poetry-env/README.md b/plugins/poetry-env/README.md index a7d16563e..bd99d2a91 100644 --- a/plugins/poetry-env/README.md +++ b/plugins/poetry-env/README.md @@ -1,6 +1,6 @@ # Poetry Environment Plugin -This plugin automatically changes poetry environment when you cd into or out of the project directory. +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: diff --git a/plugins/ros/_ros b/plugins/ros/_ros index 6a04d3c8f..c73a7b353 100644 --- a/plugins/ros/_ros +++ b/plugins/ros/_ros @@ -18,7 +18,7 @@ _1st_arguments=( 'config:Get and set options' 'version:Show the roswell version information' "help:Use \"ros help [command]\" for more information about a command."$'\n\t\t'"Use \"ros help [topic]\" for more information about the topic." -) +) #local expl diff --git a/plugins/sbt/sbt.plugin.zsh b/plugins/sbt/sbt.plugin.zsh index 851302c68..1e977140b 100644 --- a/plugins/sbt/sbt.plugin.zsh +++ b/plugins/sbt/sbt.plugin.zsh @@ -4,7 +4,7 @@ # AUTHOR: Mirko Caserta (mirko.caserta@gmail.com) # VERSION: 1.0.2 # ------------------------------------------------------------------------------ - + # aliases - mnemonic: prefix is 'sb' alias sbc='sbt compile' alias sbcc='sbt clean compile' diff --git a/plugins/screen/screen.plugin.zsh b/plugins/screen/screen.plugin.zsh index c1db8ad92..26531c40b 100644 --- a/plugins/screen/screen.plugin.zsh +++ b/plugins/screen/screen.plugin.zsh @@ -8,7 +8,7 @@ if [[ "$TERM" == screen* ]]; then _GET_HOST='echo $HOST | sed "s/\..*//"' fi - # use the current user as the prefix of the current tab title + # use the current user as the prefix of the current tab title TAB_TITLE_PREFIX='"`'$_GET_HOST'`:`'$_GET_PATH' | sed "s:..*/::"`$PROMPT_CHAR"' # when at the shell prompt, show a truncated version of the current path (with # standard ~ replacement) as the rest of the title. diff --git a/plugins/singlechar/singlechar.plugin.zsh b/plugins/singlechar/singlechar.plugin.zsh index d4b0b6735..6d785d9e1 100644 --- a/plugins/singlechar/singlechar.plugin.zsh +++ b/plugins/singlechar/singlechar.plugin.zsh @@ -1,5 +1,5 @@ ########################### -# Settings +# Settings # These can be overwritten any time. # If they are not set yet, they will be diff --git a/plugins/systemadmin/README.md b/plugins/systemadmin/README.md index 3a9d9de66..bd6b08760 100644 --- a/plugins/systemadmin/README.md +++ b/plugins/systemadmin/README.md @@ -1,7 +1,7 @@ # Systemadmin plugin This plugin adds a series of aliases and functions which make a System Administrator's life easier. - + To use it, add `systemadmin` to the plugins array in your zshrc file: ```zsh diff --git a/plugins/thor/README.md b/plugins/thor/README.md index 09c705d9a..484c88b84 100644 --- a/plugins/thor/README.md +++ b/plugins/thor/README.md @@ -1,6 +1,6 @@ # Thor plugin -This plugin adds completion for [Thor](http://whatisthor.com/), +This plugin adds completion for [Thor](http://whatisthor.com/), a ruby toolkit for building powerful command-line interfaces. To use it, add `thor` to the plugins array in your zshrc file: diff --git a/plugins/ufw/README.md b/plugins/ufw/README.md index ac377cd17..ffcc6d6f7 100644 --- a/plugins/ufw/README.md +++ b/plugins/ufw/README.md @@ -10,7 +10,7 @@ plugins=(... ufw) Some of the commands include: -* `allow /` add an allow rule +* `allow /` add an allow rule * `default` set default policy * `delete /` delete RULE * `deny /` add deny rule diff --git a/plugins/vagrant-prompt/README.md b/plugins/vagrant-prompt/README.md index c5bc55d17..dd0ca363b 100644 --- a/plugins/vagrant-prompt/README.md +++ b/plugins/vagrant-prompt/README.md @@ -1,6 +1,6 @@ This plugin prompts the status of the Vagrant VMs. It supports single-host and multi-host configurations as well. -Look inside the source for documentation about custom variables. +Look inside the source for documentation about custom variables. Alberto Re diff --git a/plugins/vi-mode/README.md b/plugins/vi-mode/README.md index 84ba30105..6e781f296 100644 --- a/plugins/vi-mode/README.md +++ b/plugins/vi-mode/README.md @@ -55,7 +55,7 @@ INSERT_MODE_INDICATOR="%F{yellow}+%f" ### Adding mode indicators to your prompt -`Vi-mode` by default will add mode indicators to `RPROMPT` **unless** that is defined by +`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. diff --git a/plugins/vim-interaction/README.md b/plugins/vim-interaction/README.md index 681648018..c2b45f1d8 100644 --- a/plugins/vim-interaction/README.md +++ b/plugins/vim-interaction/README.md @@ -3,7 +3,7 @@ The plugin presents a function called `callvim` whose usage is: usage: callvim [-b cmd] [-a cmd] [file ... fileN] - + -b cmd Run this command in GVIM before editing the first file -a cmd Run this command in GVIM after editing the first file file The file to edit diff --git a/plugins/vim-interaction/vim-interaction.plugin.zsh b/plugins/vim-interaction/vim-interaction.plugin.zsh index b73f9b4da..a12b52bd5 100644 --- a/plugins/vim-interaction/vim-interaction.plugin.zsh +++ b/plugins/vim-interaction/vim-interaction.plugin.zsh @@ -2,7 +2,7 @@ # See README.md # # Derek Wyatt (derek@{myfirstnamemylastname}.org -# +# function callvim { if [[ $# == 0 ]]; then diff --git a/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh b/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh index e037241e4..1a3ae37b8 100644 --- a/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh +++ b/plugins/virtualenvwrapper/virtualenvwrapper.plugin.zsh @@ -52,7 +52,7 @@ if [[ ! $DISABLE_VENV_CD -eq 1 ]]; then else ENV_NAME="" fi - + if [[ -n $CD_VIRTUAL_ENV && "$ENV_NAME" != "$CD_VIRTUAL_ENV" ]]; then # We've just left the repo, deactivate the environment # Note: this only happens if the virtualenv was activated automatically diff --git a/plugins/wd/README.md b/plugins/wd/README.md index 1d1980632..0ad74e805 100644 --- a/plugins/wd/README.md +++ b/plugins/wd/README.md @@ -153,7 +153,7 @@ wd .. wd ... ``` -This is a wrapper for the zsh's `dirs` function. +This is a wrapper for the zsh's `dirs` function. _You might need to add `setopt AUTO_PUSHD` to your `.zshrc` if you are not using [oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh)._ * Remove warp point: diff --git a/plugins/wd/_wd.sh b/plugins/wd/_wd.sh index 8d5cf15a2..52ecb12e6 100644 --- a/plugins/wd/_wd.sh +++ b/plugins/wd/_wd.sh @@ -77,7 +77,7 @@ function _wd() { # complete sub directories from the warp point _path_files -W "(${points[$target]})" -/ && ret=0 fi - + # don't complete anything if warp point is not valid ;; esac diff --git a/plugins/z/MANUAL.md b/plugins/z/MANUAL.md index 67a207dbb..106d8c107 100644 --- a/plugins/z/MANUAL.md +++ b/plugins/z/MANUAL.md @@ -188,7 +188,7 @@ Add a backslash to the end of the last line add `'zsh-z'` to the list, e.g., Then relaunch `zsh`. ### For [zcomet](https://github.com/agkozak/zcomet) users - + Simply add zcomet load agkozak/zsh-z diff --git a/themes/Soliah.zsh-theme b/themes/Soliah.zsh-theme index c3dd6af89..e297fe9ca 100644 --- a/themes/Soliah.zsh-theme +++ b/themes/Soliah.zsh-theme @@ -5,10 +5,10 @@ ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[white]%}" ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%})" # Text to display if the branch is dirty -ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}" +ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[red]%}*%{$reset_color%}" # Text to display if the branch is clean -ZSH_THEME_GIT_PROMPT_CLEAN="" +ZSH_THEME_GIT_PROMPT_CLEAN="" # Colors vary depending on time lapsed. ZSH_THEME_GIT_TIME_SINCE_COMMIT_SHORT="%{$fg[green]%}" @@ -36,7 +36,7 @@ function rvm_gemset() { GEMSET=`rvm gemset list | grep '=>' | cut -b4-` if [[ -n $GEMSET ]]; then echo "%{$fg[yellow]%}$GEMSET%{$reset_color%}|" - fi + fi fi } @@ -52,12 +52,12 @@ function git_time_since_commit() { # Totals MINUTES=$((seconds_since_last_commit / 60)) HOURS=$((seconds_since_last_commit/3600)) - + # Sub-hours and sub-minutes DAYS=$((seconds_since_last_commit / 86400)) SUB_HOURS=$((HOURS % 24)) SUB_MINUTES=$((MINUTES % 60)) - + if [[ -n $(git status -s 2> /dev/null) ]]; then if [ "$MINUTES" -gt 30 ]; then COLOR="$ZSH_THEME_GIT_TIME_SINCE_COMMIT_LONG" diff --git a/themes/adben.zsh-theme b/themes/adben.zsh-theme index c2fdbed23..cc097057f 100644 --- a/themes/adben.zsh-theme +++ b/themes/adben.zsh-theme @@ -79,7 +79,7 @@ ps1_command_tip() { command wget -qO- https://www.commandlinefu.com/commands/random/plaintext elif (( ${+commands[curl]} )); then command curl -fsL https://www.commandlinefu.com/commands/random/plaintext - fi + fi } | sed '1d;/^$/d' } diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index aa274a5bb..bd0405efb 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -111,7 +111,7 @@ prompt_git() { dirty=$(parse_git_dirty) 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)" + ref="➦ $(git rev-parse --short HEAD 2> /dev/null)" if [[ -n $dirty ]]; then prompt_segment yellow black else diff --git a/themes/avit.zsh-theme b/themes/avit.zsh-theme index 206274462..0e39d9077 100644 --- a/themes/avit.zsh-theme +++ b/themes/avit.zsh-theme @@ -15,7 +15,7 @@ __RPROMPT='$(vi_mode_prompt_info)%{$(echotc UP 1)%}$(_git_time_since_commit) $(g if [[ -z $RPROMPT ]]; then RPROMPT=$__RPROMPT else - RPROMPT="${RPROMPT} ${__RPROMPT}" + RPROMPT="${RPROMPT} ${__RPROMPT}" fi function _user_host() { diff --git a/themes/crunch.zsh-theme b/themes/crunch.zsh-theme index 8278661ab..d86ce1e4a 100644 --- a/themes/crunch.zsh-theme +++ b/themes/crunch.zsh-theme @@ -1,15 +1,15 @@ # CRUNCH - created from Steve Eley's cat waxing. # Initially hacked from the Dallas theme. Thanks, Dallas Reedy. # -# This theme assumes you do most of your oh-my-zsh'ed "colorful" work at a single machine, -# and eschews the standard space-consuming user and hostname info. Instead, only the +# This theme assumes you do most of your oh-my-zsh'ed "colorful" work at a single machine, +# and eschews the standard space-consuming user and hostname info. Instead, only the # things that vary in my own workflow are shown: # # * The time (not the date) # * The RVM version and gemset (omitting the 'ruby' name if it's MRI) # * The current directory # * The Git branch and its 'dirty' state -# +# # Colors are at the top so you can mess with those separately if you like. # For the most part I stuck with Dallas's. diff --git a/themes/eastwood.zsh-theme b/themes/eastwood.zsh-theme index 88134f8e6..31e24fa7f 100644 --- a/themes/eastwood.zsh-theme +++ b/themes/eastwood.zsh-theme @@ -1,5 +1,5 @@ # RVM settings -if [[ -s ~/.rvm/scripts/rvm ]] ; then +if [[ -s ~/.rvm/scripts/rvm ]] ; then RPS1="%{$fg[yellow]%}rvm:%{$reset_color%}%{$fg[red]%}\$(~/.rvm/bin/rvm-prompt)%{$reset_color%} $EPS1" else if which rbenv &> /dev/null; then diff --git a/themes/emotty.zsh-theme b/themes/emotty.zsh-theme index ba0840950..0fea7d916 100644 --- a/themes/emotty.zsh-theme +++ b/themes/emotty.zsh-theme @@ -11,7 +11,7 @@ # # There are pre-defined different emoji sets to choose from, e.g.: # emoji, stellar, floral, zodiac, love (see emotty plugin). -# +# # To choose a different emotty set than the default (emoji) # % export emotty_set=nature # @@ -95,7 +95,7 @@ zstyle ':vcs_info:*' stagedstr "${green}${vcs_staged_glyph}" # %(k|f) reset (back|fore)ground color zstyle ':vcs_info:*' max-exports 3 zstyle ':vcs_info:*' nvcsformats "${prompt_glyph}" '%3~' '' -zstyle ':vcs_info:*' formats "${yellow}%u%c%b${vcs_branch_glyph}%f" '%S|' "$FX[bold]%r$FX[no-bold]" +zstyle ':vcs_info:*' formats "${yellow}%u%c%b${vcs_branch_glyph}%f" '%S|' "$FX[bold]%r$FX[no-bold]" zstyle ':vcs_info:*' actionformats "${red}%K{white}%a${vcs_action_glyph}%k%f" '%S|' "$FX[bold]%r$FX[no-bold]" red_if_root="%(!.%F{red}.)" diff --git a/themes/essembeh.zsh-theme b/themes/essembeh.zsh-theme index 43d4093b1..50b3f7772 100644 --- a/themes/essembeh.zsh-theme +++ b/themes/essembeh.zsh-theme @@ -8,7 +8,7 @@ # - prefix to detect docker containers or chroot # - git plugin to display current branch and status -# git plugin +# git plugin ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg[cyan]%}(" ZSH_THEME_GIT_PROMPT_SUFFIX=") %{$reset_color%}" ZSH_THEME_GIT_PROMPT_UNTRACKED="%%" @@ -35,7 +35,7 @@ if [[ -n "$SSH_CONNECTION" ]]; then ZSH_ESSEMBEH_PREFIX="%{$fg[yellow]%}[$(echo $SSH_CONNECTION | awk '{print $1}')]%{$reset_color%} " # use red color to highlight a remote connection ZSH_ESSEMBEH_COLOR="red" -elif [[ -r /etc/debian_chroot ]]; then +elif [[ -r /etc/debian_chroot ]]; then # prefix prompt in case of chroot ZSH_ESSEMBEH_PREFIX="%{$fg[yellow]%}[chroot:$(cat /etc/debian_chroot)]%{$reset_color%} " elif [[ -r /.dockerenv ]]; then diff --git a/themes/josh.zsh-theme b/themes/josh.zsh-theme index ea051c58e..df59280d7 100644 --- a/themes/josh.zsh-theme +++ b/themes/josh.zsh-theme @@ -15,7 +15,7 @@ function josh_prompt { branch_size=${#branch} ruby_size=${#ruby_version} user_machine_size=${#${(%):-%n@%m-}} - + if [[ ${#branch} -eq 0 ]] then (( ruby_size = ruby_size + 1 )) else @@ -24,15 +24,15 @@ function josh_prompt { (( branch_size = branch_size + 2 )) fi fi - + (( spare_width = ${spare_width} - (${user_machine_size} + ${path_size} + ${branch_size} + ${ruby_size}) )) while [ ${#prompt} -lt $spare_width ]; do prompt=" $prompt" done - + prompt="%{%F{green}%}$PWD$prompt%{%F{red}%}$(ruby_prompt_info)%{$reset_color%} $(git_current_branch)" - + echo $prompt } diff --git a/themes/junkfood.zsh-theme b/themes/junkfood.zsh-theme index 01fae4b95..e3b746c7a 100644 --- a/themes/junkfood.zsh-theme +++ b/themes/junkfood.zsh-theme @@ -3,10 +3,10 @@ # Grab the current date (%W) and time (%t): JUNKFOOD_TIME_="%{$fg_bold[red]%}#%{$fg_bold[white]%}( %{$fg_bold[yellow]%}%W%{$reset_color%}@%{$fg_bold[white]%}%t )( %{$reset_color%}" -# Grab the current machine name +# Grab the current machine name JUNKFOOD_MACHINE_="%{$fg_bold[blue]%}%m%{$fg[white]%} ):%{$reset_color%}" -# Grab the current username +# Grab the current username JUNKFOOD_CURRENT_USER_="%{$fg_bold[green]%}%n%{$reset_color%}" # Grab the current filepath, use shortcuts: ~/Desktop diff --git a/themes/mlh.zsh-theme b/themes/mlh.zsh-theme index c059bf850..94718f8f2 100644 --- a/themes/mlh.zsh-theme +++ b/themes/mlh.zsh-theme @@ -15,7 +15,7 @@ # To customize symbols (e.g MLH_AT_SYMBOL), simply set them as environment variables # for example in your ~/.zshrc file, like this: # MLH_AT_SYMBOL=" at " -# +# # Settings *must* be set before sourcing oh-my-zsh.sh the .zshrc file. # # To easily discover colors and their codes, type `spectrum_ls` in the terminal diff --git a/themes/mortalscumbag.zsh-theme b/themes/mortalscumbag.zsh-theme index 36301cb76..c9994c0f9 100644 --- a/themes/mortalscumbag.zsh-theme +++ b/themes/mortalscumbag.zsh-theme @@ -1,6 +1,6 @@ function my_git_prompt() { tester=$(git rev-parse --git-dir 2> /dev/null) || return - + INDEX=$(git status --porcelain 2> /dev/null) STATUS="" diff --git a/themes/sonicradish.zsh-theme b/themes/sonicradish.zsh-theme index 508611830..db6170969 100644 --- a/themes/sonicradish.zsh-theme +++ b/themes/sonicradish.zsh-theme @@ -1,4 +1,4 @@ -#!/usr/bin/env zsh +#!/usr/bin/env zsh #local return_code="%(?..%{$fg[red]%}%? ↵%{$reset_color%})" setopt promptsubst diff --git a/themes/wedisagree.zsh-theme b/themes/wedisagree.zsh-theme index e9e9d6ef8..358891992 100644 --- a/themes/wedisagree.zsh-theme +++ b/themes/wedisagree.zsh-theme @@ -5,9 +5,9 @@ # - Place that bundle in ~/Library/Application\ Support/SIMBL/Plugins (create that folder if it doesn't exist) # - Open Terminal preferences. Go to Settings -> Text -> More # - Change default colours to your liking. -# +# # Here are the colours from Textmate's Monokai theme: -# +# # Black: 0, 0, 0 # Red: 229, 34, 34 # Green: 166, 227, 45 @@ -28,7 +28,7 @@ PROMPT='%{$fg[magenta]%}[%c] %{$reset_color%}' RPROMPT='${time} %{$fg[magenta]%}$(git_prompt_info)%{$reset_color%}$(git_prompt_status)%{$reset_color%}$(git_prompt_ahead)%{$reset_color%}' # Add this at the start of RPROMPT to include rvm info showing ruby-version@gemset-name -# $(ruby_prompt_info) +# $(ruby_prompt_info) # local time, color coded by last return code time_enabled="%(?.%{$fg[green]%}.%{$fg[red]%})%*%{$reset_color%}" @@ -53,7 +53,7 @@ ZSH_THEME_RUBY_PROMPT_SUFFIX="%{$reset_color%}" # More symbols to choose from: # ☀ ✹ ☄ ♆ ♀ ♁ ♐ ♇ ♈ ♉ ♚ ♛ ♜ ♝ ♞ ♟ ♠ ♣ ⚢ ⚲ ⚳ ⚴ ⚥ ⚤ ⚦ ⚒ ⚑ ⚐ ♺ ♻ ♼ ☰ ☱ ☲ ☳ ☴ ☵ ☶ ☷ -# ✡ ✔ ✖ ✚ ✱ ✤ ✦ ❤ ➜ ➟ ➼ ✂ ✎ ✐ ⨀ ⨁ ⨂ ⨍ ⨎ ⨏ ⨷ ⩚ ⩛ ⩡ ⩱ ⩲ ⩵ ⩶ ⨠ +# ✡ ✔ ✖ ✚ ✱ ✤ ✦ ❤ ➜ ➟ ➼ ✂ ✎ ✐ ⨀ ⨁ ⨂ ⨍ ⨎ ⨏ ⨷ ⩚ ⩛ ⩡ ⩱ ⩲ ⩵ ⩶ ⨠ # ⬅ ⬆ ⬇ ⬈ ⬉ ⬊ ⬋ ⬒ ⬓ ⬔ ⬕ ⬖ ⬗ ⬘ ⬙ ⬟ ⬤ 〒 ǀ ǁ ǂ ĭ Ť Ŧ # Determine if we are using a gemset. @@ -61,7 +61,7 @@ function rvm_gemset() { GEMSET=`rvm gemset list | grep '=>' | cut -b4-` if [[ -n $GEMSET ]]; then echo "%{$fg[yellow]%}$GEMSET%{$reset_color%}|" - fi + fi } # Determine the time since last commit. If branch is clean, @@ -76,12 +76,12 @@ function git_time_since_commit() { # Totals MINUTES=$((seconds_since_last_commit / 60)) HOURS=$((seconds_since_last_commit/3600)) - + # Sub-hours and sub-minutes DAYS=$((seconds_since_last_commit / 86400)) SUB_HOURS=$((HOURS % 24)) SUB_MINUTES=$((MINUTES % 60)) - + if [[ -n $(git status -s 2> /dev/null) ]]; then if [ "$MINUTES" -gt 30 ]; then COLOR="$ZSH_THEME_GIT_TIME_SINCE_COMMIT_LONG" From 62a76353ab73532c2681c6b168623f7f1e7d96ae Mon Sep 17 00:00:00 2001 From: Masaru Iritani <25241373+masaru-iritani@users.noreply.github.com> Date: Sat, 30 Mar 2024 16:25:34 +0900 Subject: [PATCH 068/158] fix(starship): keep `ZSH_THEME` if not installed (#12309) --- plugins/starship/starship.plugin.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/starship/starship.plugin.zsh b/plugins/starship/starship.plugin.zsh index 8c5d9135e..fc415e64c 100644 --- a/plugins/starship/starship.plugin.zsh +++ b/plugins/starship/starship.plugin.zsh @@ -1,7 +1,7 @@ -# ignore oh-my-zsh theme -unset ZSH_THEME - if (( $+commands[starship] )); then + # ignore oh-my-zsh theme + unset ZSH_THEME + eval "$(starship init zsh)" else echo '[oh-my-zsh] starship not found, please install it from https://starship.rs' From 6dfa9507ce0eb0f4d386bd03268e33943ea55c0f Mon Sep 17 00:00:00 2001 From: Jason D'Amour Date: Sat, 30 Mar 2024 00:26:14 -0700 Subject: [PATCH 069/158] feat(gcloud): add homebrew installation path (#12308) --- 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 cf3d650ea..fa8f884a4 100644 --- a/plugins/gcloud/gcloud.plugin.zsh +++ b/plugins/gcloud/gcloud.plugin.zsh @@ -9,6 +9,7 @@ if [[ -z "${CLOUDSDK_HOME}" ]]; then "/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" + "/opt/homebrew/share/google-cloud-sdk" "/usr/share/google-cloud-sdk" "/snap/google-cloud-sdk/current" "/snap/google-cloud-cli/current" From 130002a79e8567befa409177990bb2724b8edefc Mon Sep 17 00:00:00 2001 From: Gregory Reshetniak Date: Wed, 3 Apr 2024 09:10:33 +0200 Subject: [PATCH 070/158] feat(httpie): complete https command (#12314) --- plugins/httpie/_httpie | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/httpie/_httpie b/plugins/httpie/_httpie index 11bc8e1f8..2c0db229f 100644 --- a/plugins/httpie/_httpie +++ b/plugins/httpie/_httpie @@ -1,4 +1,4 @@ -#compdef http +#compdef http https # ------------------------------------------------------------------------------ # Copyright (c) 2015 GitHub zsh-users - http://github.com/zsh-users # All rights reserved. From b43b84abc77850a3734c127c38afdd7cf7739dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= Date: Wed, 3 Apr 2024 19:42:47 +0200 Subject: [PATCH 071/158] fix(async): avoid blocking the shell while waiting (#12304) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- lib/async_prompt.zsh | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/lib/async_prompt.zsh b/lib/async_prompt.zsh index 384e49d33..ac95bcd73 100644 --- a/lib/async_prompt.zsh +++ b/lib/async_prompt.zsh @@ -82,10 +82,8 @@ function _omz_async_request { exec {fd}< <( # Tell parent process our PID builtin echo ${sysparams[pid]} - # Store handler name for callback - builtin echo $handler # Set exit code for the handler if used - (exit $ret) + () { return $ret } # Run the async function handler $handler ) @@ -98,8 +96,7 @@ function _omz_async_request { command true # Save the PID from the handler child process - read pid <&$fd - _OMZ_ASYNC_PIDS[$handler]=$pid + read -u $fd "_OMZ_ASYNC_PIDS[$handler]" # When the fd is readable, call the response handler zle -F "$fd" _omz_async_callback @@ -114,15 +111,14 @@ function _omz_async_callback() { local err=$2 # Second arg will be passed in case of error if [[ -z "$err" || "$err" == "hup" ]]; then - # Get handler name from first line - local handler - read handler <&$fd + # Get handler name from fd + local handler="${(k)_OMZ_ASYNC_FDS[(r)$fd]}" # Store old output which is supposed to be already printed local old_output="${_OMZ_ASYNC_OUTPUT[$handler]}" # Read output from fd - _OMZ_ASYNC_OUTPUT[$handler]="$(cat <&$fd)" + IFS= read -r -u $fd -d '' "_OMZ_ASYNC_OUTPUT[$handler]" # Repaint prompt if output has changed if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then From ec1afe9dd683c36e6384db25fc1e95acbb0cbc7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 3 Apr 2024 19:55:46 +0200 Subject: [PATCH 072/158] feat(git)!: enable async git prompt (now for real) BREAKING CHANGE: the new async prompt feature will render prompt information asyncronously and degrade nicely when the calls take too long to finish, as the prompt will already be first drawn and interactive. This is enabled by default for the git prompt and themes that use it (`git_prompt_info`). If you find that it's not working for you, please open an issue if one is not already opened, and see https://github.com/ohmyzsh/ohmyzsh#disable-async-git-prompt for how to turn it off. --- README.md | 12 ++++++++++++ lib/git.zsh | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b3561a833..2ba374335 100644 --- a/README.md +++ b/README.md @@ -43,6 +43,7 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twi - [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) + - [Disable async git prompt](#disable-async-git-prompt) - [Getting Updates](#getting-updates) - [Updates Verbosity](#updates-verbosity) - [Manual Updates](#manual-updates) @@ -361,6 +362,17 @@ Instead, you can now use the following: zstyle ':omz:lib:directories' aliases no ``` +### Disable async git prompt + +Async prompt functions are an experimental feature (included on April 3, 2024) that allows Oh My Zsh to render prompt information +asyncronously. This can improve prompt rendering performance, but it might not work well with some setups. We hope that's not an +issue, but if you're seeing problems with this new feature, you can turn it of by setting the following in your .zshrc file, +before Oh My Zsh is sourced: + +```sh +zstyle ':omz:alpha:lib:git' async-prompt no +``` + #### Notice > This feature is currently in a testing phase and it may be subject to change in the future. diff --git a/lib/git.zsh b/lib/git.zsh index 96df5589d..4d6681c5b 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -38,7 +38,7 @@ function _omz_git_prompt_status() { } # Enable async prompt by default unless the setting is at false / no -if zstyle -t ':omz:alpha:lib:git' async-prompt; then +if zstyle -T ':omz:alpha:lib:git' async-prompt; then function git_prompt_info() { if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" From 04007a0e5d0a458efff23da896cf70dc40df585d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= Date: Wed, 3 Apr 2024 21:32:16 +0200 Subject: [PATCH 073/158] feat(git): implement async completion for `git_prompt_status` (#12319) This is important for themes using it, since it is usually a little slower than git_prompt_info. Also two small fixes : - the handler for git_prompt_info was incorrectly named _omz_git_prompt_status - _defer_async_git_register was kept in precmd, there is no need to call it on each prompt --- lib/git.zsh | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/git.zsh b/lib/git.zsh index 4d6681c5b..76b3778db 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -9,7 +9,7 @@ function __git_prompt_git() { GIT_OPTIONAL_LOCKS=0 command git "$@" } -function _omz_git_prompt_status() { +function _omz_git_prompt_info() { # If we are on a folder not tracked by git, get out. # Otherwise, check for hide-info at global and local repository level if ! __git_prompt_git rev-parse --git-dir &> /dev/null \ @@ -40,6 +40,12 @@ function _omz_git_prompt_status() { # Enable async prompt by default unless the setting is at false / no if zstyle -T ':omz:alpha:lib:git' async-prompt; then function git_prompt_info() { + if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" ]]; then + echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" + fi + } + + function git_prompt_status() { if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" fi @@ -51,8 +57,13 @@ if zstyle -T ':omz:alpha:lib:git' async-prompt; then # Check if git_prompt_info is used in a prompt variable case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in *(\$\(git_prompt_info\)|\`git_prompt_info\`)*) + _omz_register_handler _omz_git_prompt_info + ;; + esac + + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in + *(\$\(git_prompt_status\)|\`git_prompt_status\`)*) _omz_register_handler _omz_git_prompt_status - return ;; esac @@ -65,6 +76,9 @@ if zstyle -T ':omz:alpha:lib:git' async-prompt; then precmd_functions=(_defer_async_git_register $precmd_functions) else function git_prompt_info() { + _omz_git_prompt_info + } + function git_prompt_status() { _omz_git_prompt_status } fi @@ -197,7 +211,7 @@ function git_prompt_long_sha() { SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" } -function git_prompt_status() { +function _omz_git_prompt_status() { [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return # Maps a git status prefix to an internal constant From 6d0362ef2f355a05cf945fae882ad1fa95428991 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 4 Apr 2024 10:08:28 +0200 Subject: [PATCH 074/158] fix(archlinux): make `upgrade` work with non-english Closes #12316 --- plugins/archlinux/archlinux.plugin.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/archlinux/archlinux.plugin.zsh b/plugins/archlinux/archlinux.plugin.zsh index fca6548c0..e20a31156 100644 --- a/plugins/archlinux/archlinux.plugin.zsh +++ b/plugins/archlinux/archlinux.plugin.zsh @@ -179,8 +179,8 @@ fi # Check Arch Linux PGP Keyring before System Upgrade to prevent failure. function upgrade() { 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 : ).*')" + local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')" + local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')" if [ $installedver != $currentver ]; then echo " Arch Linux PGP Keyring is out of date." echo " Updating before full system upgrade." From 114b58ed4e93faee352187779c7151f8580f24fe Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 4 Apr 2024 11:58:43 +0200 Subject: [PATCH 075/158] fix(git): disable locally `ksharrays` Fixes #12321 --- lib/git.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/git.zsh b/lib/git.zsh index 76b3778db..23d11db2d 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -40,12 +40,14 @@ function _omz_git_prompt_info() { # Enable async prompt by default unless the setting is at false / no if zstyle -T ':omz:alpha:lib:git' async-prompt; then function git_prompt_info() { + setopt localoptions noksharrays if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" ]]; then echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" fi } function git_prompt_status() { + setopt localoptions noksharrays if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" fi From 9d529c41cc82580d0a947ce8bcf5ff7775585fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Yhuel?= Date: Thu, 4 Apr 2024 16:20:20 +0200 Subject: [PATCH 076/158] perf(async): avoid executing `true` if not required (#12318) The issue which required "command true" was fixed in zsh 5.8. --- lib/async_prompt.zsh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/async_prompt.zsh b/lib/async_prompt.zsh index ac95bcd73..a83c57f35 100644 --- a/lib/async_prompt.zsh +++ b/lib/async_prompt.zsh @@ -3,6 +3,7 @@ # https://github.com/woefe/git-prompt.zsh/blob/master/git-prompt.zsh zmodload zsh/system +autoload -Uz is-at-least # For now, async prompt function handlers are set up like so: # First, define the async function handler and register the handler @@ -93,7 +94,8 @@ function _omz_async_request { # There's a weird bug here where ^C stops working unless we force a fork # See https://github.com/zsh-users/zsh-autosuggestions/issues/364 - command true + # and https://github.com/zsh-users/zsh-autosuggestions/pull/612 + is-at-least 5.8 || command true # Save the PID from the handler child process read -u $fd "_OMZ_ASYNC_PIDS[$handler]" From 038931039030911852d456215d6f39385d5b7a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 5 Apr 2024 07:38:36 +0200 Subject: [PATCH 077/158] fix(lib/git): fix detection of function use in prompt RPS1 and RPROMPT are not equivalent, though they have the same effect. Added both to detect if `git_prompt_*` is used. Fixes #12325 --- lib/git.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/git.zsh b/lib/git.zsh index 23d11db2d..c4265970b 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -57,13 +57,13 @@ if zstyle -T ':omz:alpha:lib:git' async-prompt; then # or any of the other prompt variables function _defer_async_git_register() { # Check if git_prompt_info is used in a prompt variable - case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in *(\$\(git_prompt_info\)|\`git_prompt_info\`)*) _omz_register_handler _omz_git_prompt_info ;; esac - case "${PS1}:${PS2}:${PS3}:${PS4}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in + case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT}:${RPS1}:${RPS2}:${RPS3}:${RPS4}" in *(\$\(git_prompt_status\)|\`git_prompt_status\`)*) _omz_register_handler _omz_git_prompt_status ;; From d893dd9b83d518f2b2bd4b9a5b6a92ca0e4e33e2 Mon Sep 17 00:00:00 2001 From: Dee'Kej Date: Sat, 6 Apr 2024 19:12:05 +0200 Subject: [PATCH 078/158] fix(autojump): add macOS 'pkgsrc' installation location (#12329) --- plugins/autojump/autojump.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh index 84333a89f..5a52e3067 100644 --- a/plugins/autojump/autojump.plugin.zsh +++ b/plugins/autojump/autojump.plugin.zsh @@ -13,6 +13,7 @@ autojump_paths=( /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) + /opt/pkg/share/autojump/autojump.zsh # macOS with pkgsrc /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes ) From bf713e2c112ee1f0daf10deffa1215c982513f9b Mon Sep 17 00:00:00 2001 From: David Chin Date: Sun, 7 Apr 2024 01:23:19 +0800 Subject: [PATCH 079/158] Update README for git-prompt to clarify how to use (#10922) * Add note about need to customise theme. It may not be obvious that the theme needs to be customised. See: https://github.com/ohmyzsh/ohmyzsh/issues/9395 * Clarify type of theme customisation needed. --- plugins/git-prompt/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/git-prompt/README.md b/plugins/git-prompt/README.md index 05208d72f..8f42c6842 100644 --- a/plugins/git-prompt/README.md +++ b/plugins/git-prompt/README.md @@ -9,6 +9,10 @@ To use it, add `git-prompt` to the plugins array in your zshrc file: plugins=(... git-prompt) ``` +You may also need to [customize your theme](https://github.com/ohmyzsh/ohmyzsh/issues/9395#issuecomment-1027130429) +to change the way the prompt is built. See the +[OMZ wiki on customizing themes](https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes). + See the [original repository](https://github.com/olivierverdier/zsh-git-prompt). ## Requirements From a6ce40df49e0b219372517273c4edce1d34e49a2 Mon Sep 17 00:00:00 2001 From: Matheus Richard Date: Mon, 8 Apr 2024 12:48:57 -0300 Subject: [PATCH 080/158] feat(git): introduce `gwipe` alias (#12302) `gpristine` might be too much on several occasions, given that it removes all untracked files. This might not be ideal because it will delete important things like environment files and encryption keys. With that in mind, this commit introduces `gwipe` as a way to get a "clean slate" but still have your dev environment working. --- plugins/git/git.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 692a36a73..545ccc541 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -349,6 +349,7 @@ 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 gwipe='git reset --hard && git clean --force -df' alias groh='git reset origin/$(git_current_branch) --hard' alias grs='git restore' alias grss='git restore --source' From 5bff59f78e607e77f2ed924c1e93ccc09a6ccb7e Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 8 Apr 2024 22:05:23 +0200 Subject: [PATCH 081/158] docs(git): add `gwipe` alias --- plugins/git/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 4acb0c858..181de37fc 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -166,6 +166,7 @@ plugins=(... git) | `grhk` | `git reset --keep` | | `grhs` | `git reset --soft` | | `gpristine` | `git reset --hard && git clean --force -dfx` | +| `gwipe` | `git reset --hard && git clean --force -df` | | `groh` | `git reset origin/$(git_current_branch) --hard` | | `grs` | `git restore` | | `grss` | `git restore --source` | From 982ea721bde90c1fca233419e2c5b6e90fd10225 Mon Sep 17 00:00:00 2001 From: Reza Askari Date: Tue, 9 Apr 2024 00:06:38 +0330 Subject: [PATCH 082/158] feat(laravel): add `artisan test` alias (`pats`) (#12310) --- plugins/laravel/README.md | 1 + plugins/laravel/laravel.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/laravel/README.md b/plugins/laravel/README.md index 95f590191..a831a86b6 100644 --- a/plugins/laravel/README.md +++ b/plugins/laravel/README.md @@ -10,6 +10,7 @@ plugins=(... laravel) |:-:|:-:| | `artisan` | `php artisan` | | `pas` | `php artisan serve` | +| `pats` | `php artisan test` | ## Database diff --git a/plugins/laravel/laravel.plugin.zsh b/plugins/laravel/laravel.plugin.zsh index a8382d3c9..319946f07 100644 --- a/plugins/laravel/laravel.plugin.zsh +++ b/plugins/laravel/laravel.plugin.zsh @@ -4,6 +4,7 @@ alias bob='php artisan bob::build' # Development alias pas='php artisan serve' +alias pats='php artisan test' # Database alias pam='php artisan migrate' From 3e2a5742cdb4deae4d7f10351d59c7f2933e3555 Mon Sep 17 00:00:00 2001 From: Soo Philip Jason Kim Date: Tue, 9 Apr 2024 05:40:15 +0900 Subject: [PATCH 083/158] feat(git): add alias `gmc` for `git merge --continue` (#12326) Co-authored-by: PJ Kim --- 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 181de37fc..4c005ad2f 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -111,6 +111,7 @@ plugins=(... git) | `gfg` | `git ls-files \| grep` | | `gm` | `git merge` | | `gma` | `git merge --abort` | +| `gmc` | `git merge --continue` | | `gms` | `git merge --squash` | | `gmom` | `git merge origin/$(git_main_branch)` | | `gmum` | `git merge upstream/$(git_main_branch)` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 545ccc541..146f4a512 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -252,6 +252,7 @@ alias gignored='git ls-files -v | grep "^[[:lower:]]"' alias gfg='git ls-files | grep' alias gm='git merge' alias gma='git merge --abort' +alias gmc='git merge --continue' alias gms="git merge --squash" alias gmom='git merge origin/$(git_main_branch)' alias gmum='git merge upstream/$(git_main_branch)' From a8f7f9f707ca5fb9ac7bedb088748b09db2fd3bd Mon Sep 17 00:00:00 2001 From: MoAlkhateeb <110918029+MoAlkhateeb@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:07:57 +0300 Subject: [PATCH 084/158] fix(history)!: fix arg passing to `fc` for `history` command (#12338) BREAKING CHANGE: we have fixed a bug in the `history` wrapper for OMZ which means that running just history will now not show all the history since the 1st command, but only recent ones. To get the previous behavior, you can run `history 1` to get all the command history, or other commands such as `history -30` to get the last 30 commands. --- lib/history.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/history.zsh b/lib/history.zsh index 794076904..c39c8c866 100644 --- a/lib/history.zsh +++ b/lib/history.zsh @@ -12,8 +12,8 @@ function omz_history { # if -l provided, run as if calling `fc' directly builtin fc "$@" else - # unless a number is provided, show all history events (starting from 1) - [[ ${@[-1]-} = *[0-9]* ]] && builtin fc -l "$@" || builtin fc -l "$@" 1 + # otherwise, run `fc -l` with a custom format + builtin fc -l "$@" fi } From ef402864830ba2e23720e3a6ee6f6b4f0e05d692 Mon Sep 17 00:00:00 2001 From: Taekin Kim Date: Tue, 9 Apr 2024 19:18:05 +0900 Subject: [PATCH 085/158] docs: fix typo (#12339) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2ba374335..dea36fda7 100644 --- a/README.md +++ b/README.md @@ -366,7 +366,7 @@ zstyle ':omz:lib:directories' aliases no Async prompt functions are an experimental feature (included on April 3, 2024) that allows Oh My Zsh to render prompt information asyncronously. This can improve prompt rendering performance, but it might not work well with some setups. We hope that's not an -issue, but if you're seeing problems with this new feature, you can turn it of by setting the following in your .zshrc file, +issue, but if you're seeing problems with this new feature, you can turn it off by setting the following in your .zshrc file, before Oh My Zsh is sourced: ```sh From f85f501bcf3dc771c64f4b2ec7609fc542d4d031 Mon Sep 17 00:00:00 2001 From: Bartek Pacia Date: Tue, 9 Apr 2024 11:19:14 +0100 Subject: [PATCH 086/158] feat(macos): `ofd` now opens any directory (#12337) Co-authored-by: Carlo Sala --- plugins/macos/README.md | 2 +- plugins/macos/macos.plugin.zsh | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/plugins/macos/README.md b/plugins/macos/README.md index 1cb9b395d..2c52ec8a7 100644 --- a/plugins/macos/README.md +++ b/plugins/macos/README.md @@ -17,7 +17,7 @@ Original author: [Sorin Ionescu](https://github.com/sorin-ionescu) | `tab` | Open the current directory in a new tab | | `split_tab` | Split the current terminal tab horizontally | | `vsplit_tab` | Split the current terminal tab vertically | -| `ofd` | Open the current directory in a Finder window | +| `ofd` | Open passed directories (or $PWD by default) in Finder | | `pfd` | Return the path of the frontmost Finder window | | `pfs` | Return the current Finder selection | | `cdf` | `cd` to the current Finder directory | diff --git a/plugins/macos/macos.plugin.zsh b/plugins/macos/macos.plugin.zsh index a4347005e..2702a1901 100644 --- a/plugins/macos/macos.plugin.zsh +++ b/plugins/macos/macos.plugin.zsh @@ -3,8 +3,15 @@ 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${(M)0:#/*}:-$PWD/$0}" -# Open the current directory in a Finder window -alias ofd='open_command $PWD' +# Open in Finder the directories passed as arguments, or the current directory if +# no directories are passed +function ofd { + if (( ! $# )); then + open_command $PWD + else + open_command $@ + fi +} # Show/hide hidden files in the Finder alias showfiles="defaults write com.apple.finder AppleShowAllFiles -bool true && killall Finder" From 605d76616aa47b2e5abe25eb26c4c9c1554f93d5 Mon Sep 17 00:00:00 2001 From: MoAlkhateeb <110918029+MoAlkhateeb@users.noreply.github.com> Date: Tue, 9 Apr 2024 19:09:26 +0300 Subject: [PATCH 087/158] fix(history): revert to old behavior when no args passed (#12341) * Fixed a bug in *omz_history* where it would automatically create a file when run with the -p flag * Reverted old history behaviour while fixing parsing bug --- lib/history.zsh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/history.zsh b/lib/history.zsh index c39c8c866..56dda2462 100644 --- a/lib/history.zsh +++ b/lib/history.zsh @@ -3,7 +3,10 @@ function omz_history { local clear list zparseopts -E c=clear l=list - if [[ -n "$clear" ]]; then + if [[ $# -eq 0 ]]; then + # if no arguments provided, show full history starting from 1 + builtin fc -l 1 + elif [[ -n "$clear" ]]; then # if -c provided, clobber the history file echo -n >| "$HISTFILE" fc -p "$HISTFILE" From 53c4c4671a931d9f7a3b39fe9131c6f84fe27ca5 Mon Sep 17 00:00:00 2001 From: Ruize Tang <1466040111@qq.com> Date: Wed, 10 Apr 2024 21:39:19 +0800 Subject: [PATCH 088/158] fix(shell-proxy): support ssh-proxy using http proxy in cygwin (#12340) --- plugins/shell-proxy/ssh-proxy.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/shell-proxy/ssh-proxy.py b/plugins/shell-proxy/ssh-proxy.py index a498c84bc..4b692f9e4 100755 --- a/plugins/shell-proxy/ssh-proxy.py +++ b/plugins/shell-proxy/ssh-proxy.py @@ -22,7 +22,8 @@ if parsed.scheme not in proxy_protocols: def make_argv(): yield "nc" - if sys.platform == 'linux': + if sys.platform in {'linux', 'cygwin'}: + # caveats: the built-in netcat of most linux distributions and cygwin support proxy type # caveats: macOS built-in netcat command not supported proxy-type yield "-X" # --proxy-type # Supported protocols are 4 (SOCKS v4), 5 (SOCKS v5) and connect (HTTP proxy). From 6e9d57d5abdb33b0c22f8979dc529c1a046d7aa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?jo=C3=A9l=20hawkins=20torres?= Date: Thu, 11 Apr 2024 10:27:29 -0700 Subject: [PATCH 089/158] fix(yarn): use `builtin cd` in completion (#12347) --- plugins/yarn/_yarn | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/yarn/_yarn b/plugins/yarn/_yarn index f15756ff4..9ffe5660c 100644 --- a/plugins/yarn/_yarn +++ b/plugins/yarn/_yarn @@ -86,7 +86,7 @@ _global_commands=( ) _yarn_find_package_json() { - local dir=$(cd "$1" && pwd) + local dir=$(builtin cd "$1" && pwd) while true do @@ -109,7 +109,7 @@ _yarn_commands_scripts() { if [[ -n $opt_args[--cwd] ]]; then packageJson=$(_yarn_find_package_json $opt_args[--cwd]) - binaries=($(cd $opt_args[--cwd] && echo node_modules/.bin/*(x:t))) + binaries=($(builtin cd $opt_args[--cwd] && echo node_modules/.bin/*(x:t))) else packageJson=$(_yarn_find_package_json $pwd) binaries=($(echo node_modules/.bin/*(x:t))) @@ -130,9 +130,9 @@ _yarn_scripts() { if [[ -n $_yarn_run_cwd ]]; then packageJson=$(_yarn_find_package_json $_yarn_run_cwd) if [[ -d "${_yarn_run_cwd}/node_modules" ]]; then - binaries=($(cd $_yarn_run_cwd && echo node_modules/.bin/*(x:t))) + binaries=($(builtin cd $_yarn_run_cwd && echo node_modules/.bin/*(x:t))) else - binaries=($(cd $_yarn_run_cwd && yarn bin | perl -wln -e 'm{^[^:]+: (\S+)$} and print $1')) + binaries=($(builtin cd $_yarn_run_cwd && yarn bin | perl -wln -e 'm{^[^:]+: (\S+)$} and print $1')) fi else packageJson=$(_yarn_find_package_json $pwd) From 31f2025e0fa963788655fe197e0179c47588b175 Mon Sep 17 00:00:00 2001 From: Kate Sullivan <75387802+katesullivan@users.noreply.github.com> Date: Fri, 12 Apr 2024 02:24:54 -0500 Subject: [PATCH 090/158] feat(poetry-env): support changing between two venv dirs (#12346) Co-authored-by: Carlo Sala --- plugins/poetry-env/poetry-env.plugin.zsh | 38 ++++++++++++------------ 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/plugins/poetry-env/poetry-env.plugin.zsh b/plugins/poetry-env/poetry-env.plugin.zsh index 97ca52492..f98c177b4 100644 --- a/plugins/poetry-env/poetry-env.plugin.zsh +++ b/plugins/poetry-env/poetry-env.plugin.zsh @@ -1,27 +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 + # Determine if currently in a Poetry-managed directory + local in_poetry_dir=0 + if [[ -f "$PWD/pyproject.toml" ]] && grep -q 'tool.poetry' "$PWD/pyproject.toml"; then + in_poetry_dir=1 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" && venv_dir=$(poetry env info --path); then - export poetry_active=1 - export poetry_dir="$PWD" - source "${venv_dir}/bin/activate" - fi + # Deactivate the current environment if moving out of a Poetry directory or into a different Poetry directory + if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] || [[ "$PWD" != "$poetry_dir"* ]]; }; then + export poetry_active=0 + unset poetry_dir + deactivate + fi + + # Activate the environment if in a Poetry directory and no environment is currently active + if [[ $in_poetry_dir -eq 1 ]] && [[ $poetry_active -ne 1 ]]; then + venv_dir=$(poetry env info --path 2>/dev/null) + if [[ -n "$venv_dir" ]]; then + export poetry_active=1 + export poetry_dir="$PWD" + source "${venv_dir}/bin/activate" fi fi } autoload -U add-zsh-hook add-zsh-hook chpwd _togglePoetryShell -_togglePoetryShell +_togglePoetryShell # Initial call to check the current directory at shell startup From b26000d1685fa61bddddea42e2a606b2a0d64e25 Mon Sep 17 00:00:00 2001 From: Jhon Pedroza Date: Tue, 16 Apr 2024 02:52:12 -0500 Subject: [PATCH 091/158] feat(tmux): sessions named as current dir (#12351) --- plugins/tmux/README.md | 1 + plugins/tmux/tmux.plugin.zsh | 24 ++++++++++++++++++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md index 50f8b2c2f..09952a9f5 100644 --- a/plugins/tmux/README.md +++ b/plugins/tmux/README.md @@ -37,6 +37,7 @@ The plugin also supports the following: | `ZSH_TMUX_AUTOQUIT` | Automatically closes terminal once tmux exits (default: `ZSH_TMUX_AUTOSTART`) | | `ZSH_TMUX_CONFIG` | Set the configuration path (default: `$HOME/.tmux.conf`, `$XDG_CONFIG_HOME/tmux/tmux.conf`) | | `ZSH_TMUX_DEFAULT_SESSION_NAME` | Set tmux default session name when autostart is enabled | +| `ZSH_TMUX_AUTONAME_SESSION` | Automatically name new sessions based on the basename of `$PWD` (default: `false`) | | `ZSH_TMUX_DETACHED` | Set the detached mode (default: `false`) | | `ZSH_TMUX_FIXTERM` | Sets `$TERM` to 256-color term or not based on current terminal support | | `ZSH_TMUX_FIXTERM_WITHOUT_256COLOR` | `$TERM` to use for non 256-color terminals (default: `tmux` if available, `screen` otherwise) | diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index 791592d8f..f65598358 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -13,6 +13,8 @@ fi : ${ZSH_TMUX_AUTOCONNECT:=true} # Automatically close the terminal when tmux exits : ${ZSH_TMUX_AUTOQUIT:=$ZSH_TMUX_AUTOSTART} +# Automatically name the new session based on the basename of PWD +: ${ZSH_TMUX_AUTONAME_SESSION:=false} # Set term to screen or screen-256color based on current terminal support : ${ZSH_TMUX_DETACHED:=false} # Set detached mode @@ -102,9 +104,22 @@ function _zsh_tmux_plugin_run() { local _detached="" [[ "$ZSH_TMUX_DETACHED" == "true" ]] && _detached="-d" + + local session_name + if [[ "$ZSH_TMUX_AUTONAME_SESSION" == "true" ]]; then + # Name the session after the basename of the current directory + session_name=${PWD##*/} + # If the current directory is the home directory, name it 'HOME' + [[ "$PWD" == "$HOME" ]] && session_name="HOME" + # If the current directory is the root directory, name it 'ROOT' + [[ "$PWD" == "/" ]] && session_name="ROOT" + else + session_name="$ZSH_TMUX_DEFAULT_SESSION_NAME" + fi + # Try to connect to an existing session. - if [[ -n "$ZSH_TMUX_DEFAULT_SESSION_NAME" ]]; then - [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached -t $ZSH_TMUX_DEFAULT_SESSION_NAME + if [[ -n "$session_name" ]]; then + [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached -t "$session_name" else [[ "$ZSH_TMUX_AUTOCONNECT" == "true" ]] && $tmux_cmd attach $_detached fi @@ -116,8 +131,9 @@ function _zsh_tmux_plugin_run() { elif [[ -e "$ZSH_TMUX_CONFIG" ]]; then 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 + + if [[ -n "$session_name" ]]; then + $tmux_cmd new-session -s "$session_name" else $tmux_cmd new-session fi From efa8de0b52dda6b51bded60c0b26b6dce2dfa354 Mon Sep 17 00:00:00 2001 From: Martin Hans Date: Tue, 16 Apr 2024 19:38:58 +0200 Subject: [PATCH 092/158] fix(history): fix edge cases introduced in #12341 (#12357) --- lib/history.zsh | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/history.zsh b/lib/history.zsh index 56dda2462..ec89bc15e 100644 --- a/lib/history.zsh +++ b/lib/history.zsh @@ -1,22 +1,20 @@ ## History wrapper function omz_history { - local clear list - zparseopts -E c=clear l=list + # parse arguments and remove from $@ + local clear list stamp + zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp if [[ $# -eq 0 ]]; then # if no arguments provided, show full history starting from 1 - builtin fc -l 1 + builtin fc $stamp -l 1 elif [[ -n "$clear" ]]; then # if -c provided, clobber the history file echo -n >| "$HISTFILE" fc -p "$HISTFILE" echo >&2 History file deleted. - elif [[ -n "$list" ]]; then - # if -l provided, run as if calling `fc' directly - builtin fc "$@" else # otherwise, run `fc -l` with a custom format - builtin fc -l "$@" + builtin fc $stamp -l "$@" fi } From 7ef3f49f97ff34db3785b1cea444eb4972b1937b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 16 Apr 2024 20:04:25 +0200 Subject: [PATCH 093/158] fix(agnoster): prevent accidental alias use --- themes/agnoster.zsh-theme | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index bd0405efb..c2a542163 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -96,7 +96,7 @@ prompt_context() { # Git: branch/detached head, dirty status prompt_git() { (( $+commands[git] )) || return - if [[ "$(git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then + if [[ "$(command git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]]; then return fi local PL_BRANCH_CHAR @@ -106,12 +106,12 @@ prompt_git() { } local ref dirty mode repo_path - if [[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then - repo_path=$(git rev-parse --git-dir 2>/dev/null) + if [[ "$(command git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]]; then + repo_path=$(command git rev-parse --git-dir 2>/dev/null) dirty=$(parse_git_dirty) - 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)" + ref=$(command git symbolic-ref HEAD 2> /dev/null) || \ + ref="◈ $(command git describe --exact-match --tags HEAD 2> /dev/null)" || \ + ref="➦ $(command git rev-parse --short HEAD 2> /dev/null)" if [[ -n $dirty ]]; then prompt_segment yellow black else @@ -119,8 +119,8 @@ prompt_git() { fi local ahead behind - ahead=$(git log --oneline @{upstream}.. 2>/dev/null) - behind=$(git log --oneline ..@{upstream} 2>/dev/null) + ahead=$(command git log --oneline @{upstream}.. 2>/dev/null) + behind=$(command git log --oneline ..@{upstream} 2>/dev/null) if [[ -n "$ahead" ]] && [[ -n "$behind" ]]; then PL_BRANCH_CHAR=$'\u21c5' elif [[ -n "$ahead" ]]; then @@ -163,10 +163,10 @@ prompt_bzr() { done local bzr_status status_mod status_all revision - if bzr_status=$(bzr status 2>&1); then + if bzr_status=$(command bzr status 2>&1); then status_mod=$(echo -n "$bzr_status" | head -n1 | grep "modified" | wc -m) status_all=$(echo -n "$bzr_status" | head -n1 | wc -m) - revision=${$(bzr log -r-1 --log-format line | cut -d: -f1):gs/%/%%} + revision=${$(command bzr log -r-1 --log-format line | cut -d: -f1):gs/%/%%} if [[ $status_mod -gt 0 ]] ; then prompt_segment yellow black "bzr@$revision ✚" else @@ -182,13 +182,13 @@ prompt_bzr() { prompt_hg() { (( $+commands[hg] )) || return local rev st branch - if $(hg id >/dev/null 2>&1); then - if $(hg prompt >/dev/null 2>&1); then - if [[ $(hg prompt "{status|unknown}") = "?" ]]; then + if $(command hg id >/dev/null 2>&1); then + if $(command hg prompt >/dev/null 2>&1); then + if [[ $(command hg prompt "{status|unknown}") = "?" ]]; then # if files are not added prompt_segment red white st='±' - elif [[ -n $(hg prompt "{status|modified}") ]]; then + elif [[ -n $(command hg prompt "{status|modified}") ]]; then # if any modification prompt_segment yellow black st='±' @@ -196,15 +196,15 @@ prompt_hg() { # if working copy is clean prompt_segment green $CURRENT_FG fi - echo -n ${$(hg prompt "☿ {rev}@{branch}"):gs/%/%%} $st + echo -n ${$(command hg prompt "☿ {rev}@{branch}"):gs/%/%%} $st else st="" - rev=$(hg id -n 2>/dev/null | sed 's/[^-0-9]//g') - branch=$(hg id -b 2>/dev/null) - if `hg st | grep -q "^\?"`; then + rev=$(command hg id -n 2>/dev/null | sed 's/[^-0-9]//g') + branch=$(command hg id -b 2>/dev/null) + if command hg st | command grep -q "^\?"; then prompt_segment red black st='±' - elif `hg st | grep -q "^[MA]"`; then + elif command hg st | command grep -q "^[MA]"; then prompt_segment yellow black st='±' else From 1ed8d4b55530888bfa723e7dc6226a798260bdc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 17 Apr 2024 20:21:18 +0200 Subject: [PATCH 094/158] fix(git): turn off async prompt by default on zsh < 5.0.6 (#12331) See https://github.com/ohmyzsh/ohmyzsh/issues/12331#issuecomment-2059460268 --- lib/git.zsh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/git.zsh b/lib/git.zsh index c4265970b..277c0b3e8 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -1,3 +1,5 @@ +autoload -Uz is-at-least + # The git prompt's git commands are read-only and should not interfere with # other processes. This environment variable is equivalent to running with `git # --no-optional-locks`, but falls back gracefully for older versions of git. @@ -37,8 +39,10 @@ function _omz_git_prompt_info() { echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" } -# Enable async prompt by default unless the setting is at false / no -if zstyle -T ':omz:alpha:lib:git' async-prompt; then +# Use async version if setting is enabled, or undefined but zsh version is at least 5.0.6 +# https://github.com/ohmyzsh/ohmyzsh/issues/12331#issuecomment-2059460268 +if zstyle -t ':omz:alpha:lib:git' async-prompt \ + || { is-at-least 5.0.6 && zstyle -T ':omz:alpha:lib:git' async-prompt }; then function git_prompt_info() { setopt localoptions noksharrays if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" ]]; then From eafa78217d836115a99f80bddfcd0a8901a15f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 18 Apr 2024 07:12:32 +0200 Subject: [PATCH 095/158] fix(history): fix `history -c` (#12362) Fixes #12362 --- lib/history.zsh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/history.zsh b/lib/history.zsh index ec89bc15e..aace78aa1 100644 --- a/lib/history.zsh +++ b/lib/history.zsh @@ -4,14 +4,14 @@ function omz_history { local clear list stamp zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp - if [[ $# -eq 0 ]]; then - # if no arguments provided, show full history starting from 1 - builtin fc $stamp -l 1 - elif [[ -n "$clear" ]]; then + if [[ -n "$clear" ]]; then # if -c provided, clobber the history file echo -n >| "$HISTFILE" fc -p "$HISTFILE" echo >&2 History file deleted. + elif [[ $# -eq 0 ]]; then + # if no arguments provided, show full history starting from 1 + builtin fc $stamp -l 1 else # otherwise, run `fc -l` with a custom format builtin fc $stamp -l "$@" From c262ffbb68e6dfc30b619e6ce6bdbd00f27b8a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 18 Apr 2024 07:16:42 +0200 Subject: [PATCH 096/158] fix(update): define `$ZSH` if undefined (#12273) Fixes #12273 Fixes https://github.com/topgrade-rs/topgrade/issues/519 --- tools/upgrade.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tools/upgrade.sh b/tools/upgrade.sh index d7016aa44..5eb90ab41 100755 --- a/tools/upgrade.sh +++ b/tools/upgrade.sh @@ -10,9 +10,14 @@ fi # Protect against unwanted sourcing case "$ZSH_EVAL_CONTEXT" in - *:file) echo "error: this file should not be sourced" && return ;; + *:file) echo "error: this file should not be sourced" && return 1 ;; esac +# Define "$ZSH" if not defined -- in theory this should be `export`ed by the calling script +if [[ -z "$ZSH" ]]; then + ZSH="${0:a:h:h}" +fi + cd "$ZSH" verbose_mode="default" From 56cfcb44e7ff730c10c5a00b58f38c33c984c52e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 18 Apr 2024 07:33:13 +0200 Subject: [PATCH 097/158] fix(updater): abort update if `$ZSH` is not a git repository Fixes #12298 --- lib/cli.zsh | 12 +++++++++++- tools/check_for_upgrade.sh | 10 ++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/lib/cli.zsh b/lib/cli.zsh index aa36a6ab5..4a8d4d127 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -773,7 +773,17 @@ function _omz::theme::use { } function _omz::update { - local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD) + # Check if git command is available + (( $+commands[git] )) || { + _omz::log error "git is not installed. Aborting..." + return 1 + } + + local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null) + [[ $? -eq 0 ]] || { + _omz::log error "\`$ZSH\` is not a git directory. Aborting..." + return 1 + } # Run update script zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default diff --git a/tools/check_for_upgrade.sh b/tools/check_for_upgrade.sh index 1cc193bde..a5d2112f6 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -20,14 +20,16 @@ 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. +# - 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. +# - git is unavailable on the system +# - $ZSH is not a git repository if [[ "$update_mode" = disabled ]] \ || [[ ! -w "$ZSH" || ! -O "$ZSH" ]] \ || [[ ! -t 1 ]] \ - || ! command git --version 2>&1 >/dev/null; then + || ! command git --version 2>&1 >/dev/null + || (builtin cd -q "$ZSH"; ! command git rev-parse --is-inside-work-tree &>/dev/null); then unset update_mode return fi From 80a651a6dfafc40630b47ad2f173d326844d6925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 18 Apr 2024 07:48:33 +0200 Subject: [PATCH 098/158] chore(updater): small typo --- 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 a5d2112f6..1ecab5c0b 100644 --- a/tools/check_for_upgrade.sh +++ b/tools/check_for_upgrade.sh @@ -28,7 +28,7 @@ zstyle -s ':omz:update' mode update_mode || { if [[ "$update_mode" = disabled ]] \ || [[ ! -w "$ZSH" || ! -O "$ZSH" ]] \ || [[ ! -t 1 ]] \ - || ! command git --version 2>&1 >/dev/null + || ! command git --version 2>&1 >/dev/null \ || (builtin cd -q "$ZSH"; ! command git rev-parse --is-inside-work-tree &>/dev/null); then unset update_mode return From d17ca487a4357923d8b8681b9e40c2bb2d2fadea Mon Sep 17 00:00:00 2001 From: Martin Hans Date: Thu, 18 Apr 2024 10:49:34 +0200 Subject: [PATCH 099/158] fix(history): add `t` option to history wrapper (#12365) The `t` option takes a strftime format specification as argument. This fixes cases in which $HIST_STAMPS is set to a value other than `mm/dd/yyyy|dd.mm.yyyy|yyyy-mm-dd`. --- lib/history.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/history.zsh b/lib/history.zsh index aace78aa1..a8431fd5a 100644 --- a/lib/history.zsh +++ b/lib/history.zsh @@ -2,7 +2,7 @@ function omz_history { # parse arguments and remove from $@ local clear list stamp - zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp + zparseopts -E -D c=clear l=list f=stamp E=stamp i=stamp t:=stamp if [[ -n "$clear" ]]; then # if -c provided, clobber the history file From 1b5503a3eefeb3e248bbc07a2f4e4b7591924307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 19 Apr 2024 21:57:46 +0200 Subject: [PATCH 100/158] feat(fzf): support fzf setup for 0.48.0 and older (#12367) Fixes #12355 --- plugins/fzf/fzf.plugin.zsh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 9e372f498..ac4370596 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -1,3 +1,12 @@ +function fzf_setup_using_fzf() { + (( ${+commands[fzf]} )) || return 1 + + local fzf_ver=${$(fzf --version)[1]} + is-at-least 0.48.0 $fzf_ver || return 1 + + eval "$(fzf --zsh)" +} + function fzf_setup_using_base_dir() { local fzf_base fzf_shell fzfdirs dir @@ -217,7 +226,8 @@ Please add `export FZF_BASE=/path/to/fzf/install/dir` to your .zshrc EOF } -fzf_setup_using_openbsd \ +fzf_setup_using_fzf \ + || fzf_setup_using_openbsd \ || fzf_setup_using_debian \ || fzf_setup_using_opensuse \ || fzf_setup_using_cygwin \ From f78c6b90fc18e2d0bb119ff549207463ce1d57a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 16 Apr 2024 18:07:10 +0200 Subject: [PATCH 101/158] fix(async): fix crash on zsh < 5.0.6 (#12358) --- lib/async_prompt.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/async_prompt.zsh b/lib/async_prompt.zsh index a83c57f35..db48446e7 100644 --- a/lib/async_prompt.zsh +++ b/lib/async_prompt.zsh @@ -124,7 +124,7 @@ function _omz_async_callback() { # Repaint prompt if output has changed if [[ "$old_output" != "${_OMZ_ASYNC_OUTPUT[$handler]}" ]]; then - zle reset-prompt + zle .reset-prompt zle -R fi From 0c80a063c3ad9513b83589d377c501a8d85d63a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 19 Apr 2024 18:47:21 +0200 Subject: [PATCH 102/158] chore(async): reenable async prompt by default on zsh < 5.0.6 (#12358) Fixes #12331 --- lib/git.zsh | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/lib/git.zsh b/lib/git.zsh index 277c0b3e8..b257d01a4 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -39,21 +39,17 @@ function _omz_git_prompt_info() { echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" } -# Use async version if setting is enabled, or undefined but zsh version is at least 5.0.6 -# https://github.com/ohmyzsh/ohmyzsh/issues/12331#issuecomment-2059460268 -if zstyle -t ':omz:alpha:lib:git' async-prompt \ - || { is-at-least 5.0.6 && zstyle -T ':omz:alpha:lib:git' async-prompt }; then +# Use async version if setting is enabled or undefined +if zstyle -T ':omz:alpha:lib:git' async-prompt; then function git_prompt_info() { - setopt localoptions noksharrays - if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" ]]; then - echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]" + if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" ]]; then + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_info]}" fi } function git_prompt_status() { - setopt localoptions noksharrays - if [[ -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" ]]; then - echo -n "$_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]" + if [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" ]]; then + echo -n "${_OMZ_ASYNC_OUTPUT[_omz_git_prompt_status]}" fi } From 67581c53c6458566e174620361e84b364b9034d2 Mon Sep 17 00:00:00 2001 From: Zikoeng Xi Date: Tue, 23 Apr 2024 03:37:17 +0800 Subject: [PATCH 103/158] fix(ssh-agent): add identity only if identity exists (#12371) --- plugins/ssh-agent/ssh-agent.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ssh-agent/ssh-agent.plugin.zsh b/plugins/ssh-agent/ssh-agent.plugin.zsh index 77c422ce1..1da54d4dd 100644 --- a/plugins/ssh-agent/ssh-agent.plugin.zsh +++ b/plugins/ssh-agent/ssh-agent.plugin.zsh @@ -62,7 +62,7 @@ function _add_identities() { # if id is an absolute path, make file equal to id [[ "$id" = /* ]] && file="$id" || file="$HOME/.ssh/$id" # check for filename match, otherwise try for signature match - if [[ ${loaded_ids[(I)$file]} -le 0 ]]; then + if [[ -f $file && ${loaded_ids[(I)$file]} -le 0 ]]; then sig="$(ssh-keygen -lf "$file" | awk '{print $2}')" [[ ${loaded_sigs[(I)$sig]} -le 0 ]] && not_loaded+=("$file") fi From ee69c14beb24c652707b2f6b2a9db0fa8b238d05 Mon Sep 17 00:00:00 2001 From: John Matczak <50644033+cidrmill@users.noreply.github.com> Date: Tue, 23 Apr 2024 01:54:00 -0700 Subject: [PATCH 104/158] feat(fishy): add color to username (#12369) --- themes/fishy.zsh-theme | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/themes/fishy.zsh-theme b/themes/fishy.zsh-theme index 2b8d559e5..3b975c8f4 100644 --- a/themes/fishy.zsh-theme +++ b/themes/fishy.zsh-theme @@ -16,7 +16,8 @@ _fishy_collapsed_wd() { } local user_color='green'; [ $UID -eq 0 ] && user_color='red' -PROMPT='%n@%m %{$fg[$user_color]%}$(_fishy_collapsed_wd)%{$reset_color%}%(!.#.>) ' +local host_color='white'; [ -n "$SSH_CLIENT" ] || [ -n "$SSH_TTY" ] && host_color='yellow' +PROMPT='%{$fg[$user_color]%}%n%{$reset_color%}@%{$fg[$host_color]%}%m %{$fg[$user_color]%}$(_fishy_collapsed_wd)%{$reset_color%}%(!.#.>) ' PROMPT2='%{$fg[red]%}\ %{$reset_color%}' local return_status="%{$fg_bold[red]%}%(?..%?)%{$reset_color%}" From 5d2d35cd1741af19553007fe0cc5324744fc58fa Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 23 Apr 2024 16:21:21 +0200 Subject: [PATCH 105/158] fix(poetry-env): do not deactivate in a subdir Closes #12377 --- plugins/poetry-env/poetry-env.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/poetry-env/poetry-env.plugin.zsh b/plugins/poetry-env/poetry-env.plugin.zsh index f98c177b4..be46717d8 100644 --- a/plugins/poetry-env/poetry-env.plugin.zsh +++ b/plugins/poetry-env/poetry-env.plugin.zsh @@ -6,7 +6,7 @@ _togglePoetryShell() { fi # Deactivate the current environment if moving out of a Poetry directory or into a different Poetry directory - if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] || [[ "$PWD" != "$poetry_dir"* ]]; }; then + if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] && [[ "$PWD" != "$poetry_dir"* ]]; }; then export poetry_active=0 unset poetry_dir deactivate From 803e1a784cd520f101d126b47deea3297e6a82fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 25 Apr 2024 08:04:18 +0200 Subject: [PATCH 106/158] fix(copybuffer): prevent `which` alias usage (#12379) --- plugins/copybuffer/copybuffer.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/copybuffer/copybuffer.plugin.zsh b/plugins/copybuffer/copybuffer.plugin.zsh index 88bda32a0..e636d9730 100644 --- a/plugins/copybuffer/copybuffer.plugin.zsh +++ b/plugins/copybuffer/copybuffer.plugin.zsh @@ -2,7 +2,7 @@ # onto the system clipboard copybuffer () { - if which clipcopy &>/dev/null; then + if builtin which clipcopy &>/dev/null; then printf "%s" "$BUFFER" | clipcopy else zle -M "clipcopy not found. Please make sure you have Oh My Zsh installed correctly." From 21963f4f678e69fb3154a1d43a33d531a5b3566d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 30 Apr 2024 12:56:02 +0200 Subject: [PATCH 107/158] fix(fzf): support old `fzf` versions Closes #12387 --- plugins/fzf/fzf.plugin.zsh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index ac4370596..3d29f1762 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -1,8 +1,10 @@ function fzf_setup_using_fzf() { (( ${+commands[fzf]} )) || return 1 - local fzf_ver=${$(fzf --version)[1]} - is-at-least 0.48.0 $fzf_ver || return 1 + # we remove "fzf " prefix, this fixes really old fzf versions behaviour + # see https://github.com/ohmyzsh/ohmyzsh/issues/12387 + local fzf_ver=${"$(fzf --version)"#fzf } + is-at-least 0.48.0 ${${(s: :)fzf_ver}[1]} || return 1 eval "$(fzf --zsh)" } From 8581ecd462ab2714936398c54433ed1deddb2926 Mon Sep 17 00:00:00 2001 From: Antoine Date: Wed, 1 May 2024 11:04:12 +0200 Subject: [PATCH 108/158] feat(autojump): add `nix-darwin` install path (#12389) --- plugins/autojump/autojump.plugin.zsh | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/autojump/autojump.plugin.zsh b/plugins/autojump/autojump.plugin.zsh index 5a52e3067..e385a2de8 100644 --- a/plugins/autojump/autojump.plugin.zsh +++ b/plugins/autojump/autojump.plugin.zsh @@ -15,6 +15,7 @@ autojump_paths=( /opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs) /opt/pkg/share/autojump/autojump.zsh # macOS with pkgsrc /etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes + /nix/var/nix/gcroots/current-system/sw/share/zsh/site-functions/autojump.zsh # macOS Nix, nix-darwin ) for file in $autojump_paths; do From 529f77a344de5fd53ea2235547cefd5d15d02723 Mon Sep 17 00:00:00 2001 From: stefan Date: Thu, 2 May 2024 15:11:18 +0200 Subject: [PATCH 109/158] feat(termsupport): support `alacritty*` TERM (#12392) Closes #12391 --- lib/termsupport.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/termsupport.zsh b/lib/termsupport.zsh index d170ffcbf..087bae9bb 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 ;; @@ -129,7 +129,7 @@ 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*) ;; + xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty*|screen*|tmux*) ;; contour*|foot*) ;; *) # Terminal.app and iTerm2 process OSC 7 correctly From 668ca3a32dae5ff5d164fc3be565f1e2ece248db Mon Sep 17 00:00:00 2001 From: Shai Coleman Date: Fri, 3 May 2024 20:43:53 +0100 Subject: [PATCH 110/158] fix(extract): `zst` now extracts as expected (#12395) --- plugins/extract/extract.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 80ca50c50..1c7599195 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -87,7 +87,7 @@ EOF builtin cd -q control; extract ../control.tar.* builtin cd -q ../data; extract ../data.tar.* builtin cd -q ..; command rm *.tar.* debian-binary ;; - (*.zst) unzstd "$full_path" ;; + (*.zst) unzstd --stdout "$full_path" > "${file:t:r}" ;; (*.cab|*.exe) cabextract "$full_path" ;; (*.cpio|*.obscpio) cpio -idmvF "$full_path" ;; (*.zpaq) zpaq x "$full_path" ;; From 22bbc233e90f18ad7a02625c66d1867a5486fcbb Mon Sep 17 00:00:00 2001 From: Michael Gonzo Date: Tue, 7 May 2024 21:30:23 +0200 Subject: [PATCH 111/158] feat(python): autovenv keeps activated on subdirs (#12396) Co-authored-by: Carlo Sala --- plugins/python/README.md | 7 ++++--- plugins/python/python.plugin.zsh | 19 ++++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/plugins/python/README.md b/plugins/python/README.md index c99697b22..b990a26b9 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -32,8 +32,9 @@ virtual environments: `venv`) in the current directory. - `auto_vrun`: Automatically activate the venv virtual environment when entering a directory containing - `/bin/activate`, and automatically deactivate it when navigating out of it (including - subdirectories!). + `/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated + in subdirectories). - To enable the feature, set `export PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. - - The default virtual environment name is `venv`. To use a different name, set + - Plugin activates first virtual environment in lexicographic order whose name begins with ``. + The default virtual environment name is `venv`. To use a different name, set `export PYTHON_VENV_NAME=`. For example: `export PYTHON_VENV_NAME=".venv"` diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index f6ea85027..7256aa04f 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -86,11 +86,20 @@ function mkv() { if [[ "$PYTHON_AUTO_VRUN" == "true" ]]; then # Automatically activate venv when changing dir - auto_vrun() { - if [[ -f "${PYTHON_VENV_NAME}/bin/activate" ]]; then - source "${PYTHON_VENV_NAME}/bin/activate" > /dev/null 2>&1 - else - (( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 + function auto_vrun() { + # deactivate if we're on a different dir than VIRTUAL_ENV states + # we don't deactivate subdirectories! + if (( $+functions[deactivate] )) && [[ $PWD != ${VIRTUAL_ENV:h}* ]]; then + deactivate > /dev/null 2>&1 + fi + + if [[ $PWD != ${VIRTUAL_ENV:h} ]]; then + for _file in "${PYTHON_VENV_NAME}"*/bin/activate(N.); do + # make sure we're not in a venv already + (( $+functions[deactivate] )) && deactivate > /dev/null 2>&1 + source $_file > /dev/null 2>&1 + break + done fi } add-zsh-hook chpwd auto_vrun From 8c5f64cc2f0e75399a1e906e39713ed25b65ece1 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Mon, 6 May 2024 09:49:21 +0200 Subject: [PATCH 112/158] feat(nvm): add `corepack` to `lazy_cmd` --- plugins/nvm/README.md | 6 +++--- plugins/nvm/nvm.plugin.zsh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index e88ce0158..eb1e236ee 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -26,9 +26,9 @@ 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`, `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: +nvm script only when using it, and will create a function for `node`, `npm`, `npx`, `pnpm`, `yarn`, `corepack` +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 diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index c2e8de94b..95c94030a 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -72,9 +72,9 @@ function _omz_setup_autoload { } if zstyle -t ':omz:plugins:nvm' lazy; then - # Call nvm when first using nvm, node, npm, pnpm, yarn or other commands in lazy-cmd + # Call nvm when first using nvm, node, npm, pnpm, yarn, corepack or other commands in lazy-cmd zstyle -a ':omz:plugins:nvm' lazy-cmd nvm_lazy_cmd - nvm_lazy_cmd=(nvm node npm npx pnpm yarn $nvm_lazy_cmd) # default values + nvm_lazy_cmd=(nvm node npm npx pnpm yarn corepack $nvm_lazy_cmd) # default values eval " function $nvm_lazy_cmd { for func in $nvm_lazy_cmd; do From b0561d28b5a3efbbcca4700626fa32e62c23959b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Wed, 8 May 2024 22:20:42 +0200 Subject: [PATCH 113/158] fix(cli): fix edge cases in `omz plugin disable` command (#12401) Also introduces tests, which will be refactored into the proper place when a test system is finally designed. Fixes #12400 --- lib/cli.zsh | 14 +++- lib/tests/cli.test.zsh | 169 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 lib/tests/cli.test.zsh diff --git a/lib/cli.zsh b/lib/cli.zsh index 4a8d4d127..383b0cfb0 100644 --- a/lib/cli.zsh +++ b/lib/cli.zsh @@ -241,10 +241,18 @@ function _omz::plugin::disable { # Remove plugins substitution awk script local awk_subst_plugins="\ - gsub(/[ \t]+(${(j:|:)dis_plugins})/, \"\") # with spaces before - gsub(/(${(j:|:)dis_plugins})[ \t]+/, \"\") # with spaces after - gsub(/\((${(j:|:)dis_plugins})\)/, \"\") # without spaces (only plugin) + gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after + gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL + gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after + + gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after + gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after + gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses + + gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis + gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL " + # Disable plugins awk script local awk_script=" # if plugins=() is in oneline form, substitute disabled plugins and go to next line diff --git a/lib/tests/cli.test.zsh b/lib/tests/cli.test.zsh new file mode 100644 index 000000000..9ee5cd219 --- /dev/null +++ b/lib/tests/cli.test.zsh @@ -0,0 +1,169 @@ +#!/usr/bin/zsh -df + +run_awk() { + local -a dis_plugins=(${=1}) + local input_text="$2" + + (( ! DEBUG )) || set -xv + + local awk_subst_plugins="\ + gsub(/[ \t]+(${(j:|:)dis_plugins})[ \t]+/, \" \") # with spaces before or after + gsub(/[ \t]+(${(j:|:)dis_plugins})$/, \"\") # with spaces before and EOL + gsub(/^(${(j:|:)dis_plugins})[ \t]+/, \"\") # with BOL and spaces after + + gsub(/\((${(j:|:)dis_plugins})[ \t]+/, \"(\") # with parenthesis before and spaces after + gsub(/[ \t]+(${(j:|:)dis_plugins})\)/, \")\") # with spaces before or parenthesis after + gsub(/\((${(j:|:)dis_plugins})\)/, \"()\") # with only parentheses + + gsub(/^(${(j:|:)dis_plugins})\)/, \")\") # with BOL and closing parenthesis + gsub(/\((${(j:|:)dis_plugins})$/, \"(\") # with opening parenthesis and EOL + " + # Disable plugins awk script + local awk_script=" + # if plugins=() is in oneline form, substitute disabled plugins and go to next line + /^[ \t]*plugins=\([^#]+\).*\$/ { + $awk_subst_plugins + print \$0 + next + } + + # if plugins=() is in multiline form, enable multi flag and disable plugins if they're there + /^[ \t]*plugins=\(/ { + multi=1 + $awk_subst_plugins + print \$0 + next + } + + # if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag + multi == 1 && /^[^#]*\)/ { + multi=0 + $awk_subst_plugins + print \$0 + next + } + + multi == 1 && length(\$0) > 0 { + $awk_subst_plugins + if (length(\$0) > 0) print \$0 + next + } + + { print \$0 } + " + + command awk "$awk_script" <<< "$input_text" + + (( ! DEBUG )) || set +xv +} + +# runs awk against stdin, checks if the resulting file is not empty and then checks if the file has valid zsh syntax +run_awk_and_test() { + local description="$1" + local plugins_to_disable="$2" + local input_text="$3" + local expected_output="$4" + + local tmpfile==(:) + + { + print -u2 "Test: $description" + DEBUG=0 run_awk "$plugins_to_disable" "$input_text" >| $tmpfile + + if [[ ! -s "$tmpfile" ]]; then + print -u2 "\e[31mError\e[0m: output file empty" + return 1 + fi + + if ! zsh -n $tmpfile; then + print -u2 "\e[31mError\e[0m: zsh syntax error" + diff -u $tmpfile <(echo "$expected_output") + return 1 + fi + + if ! diff -u --color=always $tmpfile <(echo "$expected_output"); then + if (( DEBUG )); then + print -u2 "" + DEBUG=1 run_awk "$plugins_to_disable" "$input_text" + print -u2 "" + fi + print -u2 "\e[31mError\e[0m: output file does not match expected output" + return 1 + fi + + print -u2 "\e[32mSuccess\e[0m" + } always { + print -u2 "" + command rm -f "$tmpfile" + } +} + +# These tests are for the `omz plugin disable` command +run_awk_and_test \ + "it should delete a single plugin in oneline format" \ + "git" \ + "plugins=(git)" \ + "plugins=()" + +run_awk_and_test \ + "it should delete a single plugin in multiline format" \ + "github" \ +"plugins=( + github +)" \ +"plugins=( +)" + +run_awk_and_test \ + "it should delete multiple plugins in oneline format" \ + "github git z" \ + "plugins=(github git z)" \ + "plugins=()" + +run_awk_and_test \ + "it should delete multiple plugins in multiline format" \ + "github git z" \ +"plugins=( + github + git + z +)" \ +"plugins=( +)" + +run_awk_and_test \ + "it should delete a single plugin among multiple in oneline format" \ + "git" \ + "plugins=(github git z)" \ + "plugins=(github z)" + +run_awk_and_test \ + "it should delete a single plugin among multiple in multiline format" \ + "git" \ +"plugins=( + github + git + z +)" \ +"plugins=( + github + z +)" + +run_awk_and_test \ + "it should delete multiple plugins in mixed format" \ + "git z" \ +"plugins=(github +git z)" \ +"plugins=(github +)" + +run_awk_and_test \ + "it should delete multiple plugins in mixed format 2" \ + "github z" \ +"plugins=(github + git +z)" \ +"plugins=( + git +)" From 5947c3c3c91d04fa0bff45866938027b85b56c6e Mon Sep 17 00:00:00 2001 From: Atk Date: Thu, 9 May 2024 15:57:30 +0100 Subject: [PATCH 114/158] feat(dependencies): add `wd` (#12405) Co-authored-by: Carlo Sala --- .github/dependencies.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/dependencies.yml b/.github/dependencies.yml index f760ddcef..a105f440d 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -36,3 +36,11 @@ dependencies: precopy: | set -e find . ! -name _gradle ! -name LICENSE -delete + plugins/wd: + repo: mfaerevaag/wd + branch: master + version: tag:v0.6.0 + precopy: | + set -e + rm -r test + rm install.sh tty.gif wd.1 From b1af78d64d81ade60d74f301c877d6a6394a12ab Mon Sep 17 00:00:00 2001 From: Kiran Koirala Date: Fri, 10 May 2024 13:12:47 +0545 Subject: [PATCH 115/158] fix(nvm): use `nvm version` when needed (#12409) --- 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 95c94030a..8ca82fe83 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -54,7 +54,7 @@ function _omz_setup_autoload { if [[ "$nvmrc_node_version" = "N/A" ]]; then nvm install - elif [[ "$nvmrc_node_version" != "$node_version" ]]; then + elif [[ "$nvmrc_node_version" != "$(nvm version)" ]]; then nvm use $nvm_silent fi elif [[ -n "$(PWD=$OLDPWD nvm_find_nvmrc)" ]] && [[ "$(nvm version)" != "$(nvm version default)" ]]; then From 9af7ebcf36c20e1490a50fa5bab6319275859c17 Mon Sep 17 00:00:00 2001 From: Kiran Koirala Date: Fri, 10 May 2024 15:53:35 +0545 Subject: [PATCH 116/158] fix(nvm): use `command cat` to avoid alias (#12410) --- 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 8ca82fe83..f36182eda 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -50,7 +50,7 @@ function _omz_setup_autoload { 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:]')) + local nvmrc_node_version=$(nvm version $(command cat "$nvmrc_path" | tr -dc '[:print:]')) if [[ "$nvmrc_node_version" = "N/A" ]]; then nvm install From d2cf10c29f2ebcbdbcc70ed3569aa3333d70d00d Mon Sep 17 00:00:00 2001 From: Ilya <68309482+Str1kez@users.noreply.github.com> Date: Fri, 10 May 2024 20:16:45 +0300 Subject: [PATCH 117/158] feat(procs): add completions plugin (#12406) --- plugins/procs/README.md | 9 +++++++++ plugins/procs/procs.plugin.zsh | 13 +++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 plugins/procs/README.md create mode 100644 plugins/procs/procs.plugin.zsh diff --git a/plugins/procs/README.md b/plugins/procs/README.md new file mode 100644 index 000000000..f1e663d9b --- /dev/null +++ b/plugins/procs/README.md @@ -0,0 +1,9 @@ +# procs + +This plugin provides completion for [procs](https://github.com/dalance/procs). + +To use it, add `procs` to the plugins array in your zshrc file. + +``` +plugins=(... procs) +``` diff --git a/plugins/procs/procs.plugin.zsh b/plugins/procs/procs.plugin.zsh new file mode 100644 index 000000000..332985bf9 --- /dev/null +++ b/plugins/procs/procs.plugin.zsh @@ -0,0 +1,13 @@ +if (( ! $+commands[procs] )); then + return +fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `minikube`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then + typeset -g -A _comps + autoload -Uz _procs + _comps[procs]=_procs +fi + +procs --gen-completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs" &| From 0fabd5f22f4e0378b09c92607789fdb17cab3c20 Mon Sep 17 00:00:00 2001 From: Francesco Ilario Date: Fri, 10 May 2024 19:17:18 +0200 Subject: [PATCH 118/158] fix(git): add checked-out branch support to `gbg*` (#12397) --- 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 4c005ad2f..4022f8c62 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -41,8 +41,8 @@ plugins=(... git) | `gba` | `git branch --all` | | `gbd` | `git branch --delete` | | `gbD` | `git branch --delete --force` | -| `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` | +| `gbgd` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| cut -c 3- \| awk '"'"'{print $1}'"'"' \| xargs git branch -d` | +| `gbgD` | `LANG=C git branch --no-color -vv \| grep ": gone\]" \| cut -c 3- \| awk '"'"'{print $1}'"'"' \| xargs git branch -D` | | `gbm` | `git branch --move` | | `gbnm` | `git branch --no-merged` | | `gbr` | `git branch --remote` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 146f4a512..c48e365b5 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -147,8 +147,8 @@ function gbds() { 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 gbgd='LANG=C git branch --no-color -vv | grep ": gone\]" | cut -c 3- | awk '"'"'{print $1}'"'"' | xargs git branch -d' +alias gbgD='LANG=C git branch --no-color -vv | grep ": gone\]" | cut -c 3- | awk '"'"'{print $1}'"'"' | xargs git branch -D' alias gbm='git branch --move' alias gbnm='git branch --no-merged' alias gbr='git branch --remote' From d91f4e83efc5759a3347a2e1ae919ce0a6dda07f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 12 May 2024 09:44:11 +0200 Subject: [PATCH 119/158] fix(fzf): fix missing `is-at-least` error in setup (#12412) Fixes #12412 --- plugins/fzf/fzf.plugin.zsh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 3d29f1762..48fea4f63 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -4,6 +4,8 @@ function fzf_setup_using_fzf() { # we remove "fzf " prefix, this fixes really old fzf versions behaviour # see https://github.com/ohmyzsh/ohmyzsh/issues/12387 local fzf_ver=${"$(fzf --version)"#fzf } + + autoload -Uz is-at-least is-at-least 0.48.0 ${${(s: :)fzf_ver}[1]} || return 1 eval "$(fzf --zsh)" From 83110e8ce16cd3c6bd85e7f96a920d114f598df1 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 9 May 2024 17:19:43 +0200 Subject: [PATCH 120/158] chore(dependencies): update requirements.txt --- .github/workflows/dependencies/requirements.txt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index 3c4c149ea..0ef3e54ca 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -1,2 +1,6 @@ -PyYAML~=6.0.1 -requests~=2.31.0 +certifi==2024.2.2 +charset-normalizer==3.3.2 +idna==3.7 +PyYAML==6.0.1 +requests==2.31.0 +urllib3==2.2.1 From 13c8a10e39d60c078193d403b253270cdc4abc80 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 9 May 2024 17:20:09 +0200 Subject: [PATCH 121/158] style(dependencies): run `ruff` formatter --- .editorconfig | 3 + .github/workflows/dependencies/updater.py | 704 ++++++++++++---------- 2 files changed, 378 insertions(+), 329 deletions(-) diff --git a/.editorconfig b/.editorconfig index b5321de59..b349bcc42 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,3 +6,6 @@ insert_final_newline = true charset = utf-8 indent_size = 2 indent_style = space + +[*.py] +indent_size = 4 diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index f54d316f9..765cb26fe 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -1,12 +1,14 @@ import os +import shutil import subprocess import sys -import requests -import shutil -import yaml +import timeit from copy import deepcopy from typing import Optional, TypedDict +import requests +import yaml + # Get TMP_DIR variable from environment TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh") # Relative path to dependencies.yml file @@ -14,28 +16,29 @@ DEPS_YAML_FILE = ".github/dependencies.yml" # Dry run flag DRY_RUN = os.environ.get("DRY_RUN", "0") == "1" -import timeit + class CodeTimer: - def __init__(self, name=None): - self.name = " '" + name + "'" if name else '' + def __init__(self, name=None): + self.name = " '" + name + "'" if name else "" - def __enter__(self): - self.start = timeit.default_timer() + def __enter__(self): + self.start = timeit.default_timer() - def __exit__(self, exc_type, exc_value, traceback): - self.took = (timeit.default_timer() - self.start) * 1000.0 - print('Code block' + self.name + ' took: ' + str(self.took) + ' ms') + def __exit__(self, exc_type, exc_value, traceback): + self.took = (timeit.default_timer() - self.start) * 1000.0 + print("Code block" + self.name + " took: " + str(self.took) + " ms") ### YAML representation def str_presenter(dumper, data): - """ - Configures yaml for dumping multiline strings - Ref: https://stackoverflow.com/a/33300001 - """ - if len(data.splitlines()) > 1: # check for multiline string - return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|') - return dumper.represent_scalar('tag:yaml.org,2002:str', data) + """ + Configures yaml for dumping multiline strings + Ref: https://stackoverflow.com/a/33300001 + """ + if len(data.splitlines()) > 1: # check for multiline string + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") + return dumper.represent_scalar("tag:yaml.org,2002:str", data) + yaml.add_representer(str, str_presenter) yaml.representer.SafeRepresenter.add_representer(str, str_presenter) @@ -43,408 +46,451 @@ yaml.representer.SafeRepresenter.add_representer(str, str_presenter) # Types class DependencyDict(TypedDict): - repo: str - branch: str - version: str - precopy: Optional[str] - postcopy: Optional[str] + repo: str + branch: str + version: str + precopy: Optional[str] + postcopy: Optional[str] + class DependencyYAML(TypedDict): - dependencies: dict[str, DependencyDict] + dependencies: dict[str, DependencyDict] + class UpdateStatus(TypedDict): - has_updates: bool - version: Optional[str] - compare_url: Optional[str] - head_ref: Optional[str] - head_url: Optional[str] + has_updates: bool + version: Optional[str] + compare_url: Optional[str] + head_ref: Optional[str] + head_url: Optional[str] class CommandRunner: - class Exception(Exception): - def __init__(self, message, returncode, stage, stdout, stderr): - super().__init__(message) - self.returncode = returncode - self.stage = stage - self.stdout = stdout - self.stderr = stderr + class Exception(Exception): + def __init__(self, message, returncode, stage, stdout, stderr): + super().__init__(message) + self.returncode = returncode + self.stage = stage + self.stdout = stdout + self.stderr = stderr - @staticmethod - def run_or_fail(command: list[str], stage: str, *args, **kwargs): - if DRY_RUN and command[0] == "gh": - command.insert(0, "echo") + @staticmethod + def run_or_fail(command: list[str], stage: str, *args, **kwargs): + if DRY_RUN and command[0] == "gh": + command.insert(0, "echo") - result = subprocess.run(command, *args, capture_output=True, **kwargs) + result = subprocess.run(command, *args, capture_output=True, **kwargs) - if result.returncode != 0: - raise CommandRunner.Exception( - f"{stage} command failed with exit code {result.returncode}", returncode=result.returncode, - stage=stage, - stdout=result.stdout.decode("utf-8"), - stderr=result.stderr.decode("utf-8") - ) + if result.returncode != 0: + raise CommandRunner.Exception( + f"{stage} command failed with exit code {result.returncode}", + returncode=result.returncode, + stage=stage, + stdout=result.stdout.decode("utf-8"), + stderr=result.stderr.decode("utf-8"), + ) - return result + return result class DependencyStore: - store: DependencyYAML = { - "dependencies": {} - } + store: DependencyYAML = {"dependencies": {}} - @staticmethod - def set(data: DependencyYAML): - DependencyStore.store = data + @staticmethod + def set(data: DependencyYAML): + DependencyStore.store = data - @staticmethod - def update_dependency_version(path: str, version: str) -> DependencyYAML: - with CodeTimer(f"store deepcopy: {path}"): - store_copy = deepcopy(DependencyStore.store) + @staticmethod + def update_dependency_version(path: str, version: str) -> DependencyYAML: + with CodeTimer(f"store deepcopy: {path}"): + store_copy = deepcopy(DependencyStore.store) - dependency = store_copy["dependencies"].get(path, {}) - dependency["version"] = version - store_copy["dependencies"][path] = dependency + dependency = store_copy["dependencies"].get(path, {}) + dependency["version"] = version + store_copy["dependencies"][path] = dependency - return store_copy + return store_copy - @staticmethod - def write_store(file: str, data: DependencyYAML): - with open(file, "w") as yaml_file: - yaml.safe_dump(data, yaml_file, sort_keys=False) + @staticmethod + def write_store(file: str, data: DependencyYAML): + with open(file, "w") as yaml_file: + yaml.safe_dump(data, yaml_file, sort_keys=False) class Dependency: - def __init__(self, path: str, values: DependencyDict): - self.path = path - self.values = values + def __init__(self, path: str, values: DependencyDict): + self.path = path + self.values = values - self.name: str = "" - self.desc: str = "" - self.kind: str = "" + self.name: str = "" + self.desc: str = "" + self.kind: str = "" - match path.split("/"): - case ["plugins", name]: - self.name = name - self.kind = "plugin" - self.desc = f"{name} plugin" - case ["themes", name]: - self.name = name.replace(".zsh-theme", "") - self.kind = "theme" - self.desc = f"{self.name} theme" - case _: - self.name = self.desc = path + match path.split("/"): + case ["plugins", name]: + self.name = name + self.kind = "plugin" + self.desc = f"{name} plugin" + case ["themes", name]: + self.name = name.replace(".zsh-theme", "") + self.kind = "theme" + self.desc = f"{self.name} theme" + case _: + self.name = self.desc = path - def __str__(self): - output: str = "" - for key in DependencyDict.__dict__['__annotations__'].keys(): - if key not in self.values: - output += f"{key}: None\n" - continue + def __str__(self): + output: str = "" + for key in DependencyDict.__dict__["__annotations__"].keys(): + if key not in self.values: + output += f"{key}: None\n" + continue - value = self.values[key] - if "\n" not in value: - output += f"{key}: {value}\n" - else: - output += f"{key}:\n " - output += value.replace("\n", "\n ", value.count("\n") - 1) - return output + value = self.values[key] + if "\n" not in value: + output += f"{key}: {value}\n" + else: + output += f"{key}:\n " + output += value.replace("\n", "\n ", value.count("\n") - 1) + return output - def update_or_notify(self): - # Print dependency settings - print(f"Processing {self.desc}...", file=sys.stderr) - print(self, file=sys.stderr) + def update_or_notify(self): + # Print dependency settings + print(f"Processing {self.desc}...", file=sys.stderr) + print(self, file=sys.stderr) - # Check for updates - repo = self.values["repo"] - remote_branch = self.values["branch"] - version = self.values["version"] - is_tag = version.startswith("tag:") - - try: - with CodeTimer(f"update check: {repo}"): - if is_tag: - status = GitHub.check_newer_tag(repo, version.replace("tag:", "")) - else: - status = GitHub.check_updates(repo, remote_branch, version) - - if status["has_updates"]: - short_sha = status["head_ref"][:8] - new_version = status["version"] if is_tag else short_sha + # Check for updates + repo = self.values["repo"] + remote_branch = self.values["branch"] + version = self.values["version"] + is_tag = version.startswith("tag:") try: - # Create new branch - branch = Git.create_branch(self.path, new_version) + with CodeTimer(f"update check: {repo}"): + if is_tag: + status = GitHub.check_newer_tag(repo, version.replace("tag:", "")) + else: + status = GitHub.check_updates(repo, remote_branch, version) - # Update dependencies.yml file - self.__update_yaml(f"tag:{new_version}" if is_tag else status["version"]) + if status["has_updates"]: + short_sha = status["head_ref"][:8] + new_version = status["version"] if is_tag else short_sha - # Update dependency files - self.__apply_upstream_changes() + try: + # Create new branch + branch = Git.create_branch(self.path, new_version) - # Add all changes and commit - Git.add_and_commit(self.name, short_sha) + # Update dependencies.yml file + self.__update_yaml( + f"tag:{new_version}" if is_tag else status["version"] + ) - # Push changes to remote - Git.push(branch) + # Update dependency files + self.__apply_upstream_changes() - # Create GitHub PR - GitHub.create_pr( - branch, - f"feat({self.name}): update to version {new_version}", - f"""## Description + # Add all changes and commit + Git.add_and_commit(self.name, short_sha) + + # Push changes to remote + Git.push(branch) + + # Create GitHub PR + GitHub.create_pr( + branch, + f"feat({self.name}): update to version {new_version}", + f"""## Description Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). Check out the [list of changes]({status['compare_url']}). -""" - ) +""", + ) - # Clean up repository - Git.clean_repo() - except (CommandRunner.Exception, shutil.Error) as e: - # Handle exception on automatic update - match type(e): - case CommandRunner.Exception: - # Print error message - print(f"Error running {e.stage} command: {e.returncode}", file=sys.stderr) - print(e.stderr, file=sys.stderr) - case shutil.Error: - print(f"Error copying files: {e}", file=sys.stderr) + # Clean up repository + Git.clean_repo() + except (CommandRunner.Exception, shutil.Error) as e: + # Handle exception on automatic update + match type(e): + case CommandRunner.Exception: + # Print error message + print( + f"Error running {e.stage} command: {e.returncode}", + file=sys.stderr, + ) + print(e.stderr, file=sys.stderr) + case shutil.Error: + print(f"Error copying files: {e}", file=sys.stderr) - try: - Git.clean_repo() - except CommandRunner.Exception as e: - print(f"Error reverting repository to clean state: {e}", file=sys.stderr) - sys.exit(1) + try: + Git.clean_repo() + except CommandRunner.Exception as e: + print( + f"Error reverting repository to clean state: {e}", + file=sys.stderr, + ) + sys.exit(1) - # Create a GitHub issue to notify maintainer - title = f"{self.path}: update to {new_version}" - body = ( - f"""## Description + # Create a GitHub issue to notify maintainer + title = f"{self.path}: update to {new_version}" + body = f"""## Description There is a new version of `{self.name}` {self.kind} available. New version: [{new_version}]({status['head_url']}) Check out the [list of changes]({status['compare_url']}). """ - ) - print(f"Creating GitHub issue", file=sys.stderr) - print(f"{title}\n\n{body}", file=sys.stderr) - GitHub.create_issue(title, body) - except Exception as e: - print(e, file=sys.stderr) + print("Creating GitHub issue", file=sys.stderr) + print(f"{title}\n\n{body}", file=sys.stderr) + GitHub.create_issue(title, body) + except Exception as e: + print(e, file=sys.stderr) - def __update_yaml(self, new_version: str) -> None: - dep_yaml = DependencyStore.update_dependency_version(self.path, new_version) - DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml) + def __update_yaml(self, new_version: str) -> None: + dep_yaml = DependencyStore.update_dependency_version(self.path, new_version) + DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml) - def __apply_upstream_changes(self) -> None: - # Patterns to ignore in copying files from upstream repo - GLOBAL_IGNORE = [ - ".git", - ".github", - ".gitignore" - ] + def __apply_upstream_changes(self) -> None: + # Patterns to ignore in copying files from upstream repo + GLOBAL_IGNORE = [".git", ".github", ".gitignore"] - path = os.path.abspath(self.path) - precopy = self.values.get("precopy") - postcopy = self.values.get("postcopy") + path = os.path.abspath(self.path) + precopy = self.values.get("precopy") + postcopy = self.values.get("postcopy") - repo = self.values["repo"] - branch = self.values["branch"] - remote_url = f"https://github.com/{repo}.git" - repo_dir = os.path.join(TMP_DIR, repo) + repo = self.values["repo"] + branch = self.values["branch"] + remote_url = f"https://github.com/{repo}.git" + repo_dir = os.path.join(TMP_DIR, repo) - # Clone repository - Git.clone(remote_url, branch, repo_dir, reclone=True) + # Clone repository + Git.clone(remote_url, branch, repo_dir, reclone=True) - # Run precopy on tmp repo - if precopy is not None: - print("Running precopy script:", end="\n ", file=sys.stderr) - print(precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr) - CommandRunner.run_or_fail(["bash", "-c", precopy], cwd=repo_dir, stage="Precopy") + # Run precopy on tmp repo + if precopy is not None: + print("Running precopy script:", end="\n ", file=sys.stderr) + print( + precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr + ) + CommandRunner.run_or_fail( + ["bash", "-c", precopy], cwd=repo_dir, stage="Precopy" + ) - # Copy files from upstream repo - print(f"Copying files from {repo_dir} to {path}", file=sys.stderr) - shutil.copytree(repo_dir, path, dirs_exist_ok=True, ignore=shutil.ignore_patterns(*GLOBAL_IGNORE)) + # Copy files from upstream repo + print(f"Copying files from {repo_dir} to {path}", file=sys.stderr) + shutil.copytree( + repo_dir, + path, + dirs_exist_ok=True, + ignore=shutil.ignore_patterns(*GLOBAL_IGNORE), + ) - # Run postcopy on our repository - if postcopy is not None: - print("Running postcopy script:", end="\n ", file=sys.stderr) - print(postcopy.replace("\n", "\n ", postcopy.count("\n") - 1), file=sys.stderr) - CommandRunner.run_or_fail(["bash", "-c", postcopy], cwd=path, stage="Postcopy") + # Run postcopy on our repository + if postcopy is not None: + print("Running postcopy script:", end="\n ", file=sys.stderr) + print( + postcopy.replace("\n", "\n ", postcopy.count("\n") - 1), + file=sys.stderr, + ) + CommandRunner.run_or_fail( + ["bash", "-c", postcopy], cwd=path, stage="Postcopy" + ) class Git: - default_branch = "master" + default_branch = "master" - @staticmethod - def clone(remote_url: str, branch: str, repo_dir: str, reclone=False): - # If repo needs to be fresh - if reclone and os.path.exists(repo_dir): - shutil.rmtree(repo_dir) + @staticmethod + def clone(remote_url: str, branch: str, repo_dir: str, reclone=False): + # If repo needs to be fresh + if reclone and os.path.exists(repo_dir): + shutil.rmtree(repo_dir) - # Clone repo in tmp directory and checkout branch - if not os.path.exists(repo_dir): - print(f"Cloning {remote_url} to {repo_dir} and checking out {branch}", file=sys.stderr) - CommandRunner.run_or_fail(["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir], stage="Clone") + # Clone repo in tmp directory and checkout branch + if not os.path.exists(repo_dir): + print( + f"Cloning {remote_url} to {repo_dir} and checking out {branch}", + file=sys.stderr, + ) + CommandRunner.run_or_fail( + ["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir], + stage="Clone", + ) - @staticmethod - def create_branch(path: str, version: str): - # Get current branch name - result = CommandRunner.run_or_fail(["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch") - Git.default_branch = result.stdout.decode("utf-8").strip() + @staticmethod + def create_branch(path: str, version: str): + # Get current branch name + result = CommandRunner.run_or_fail( + ["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch" + ) + Git.default_branch = result.stdout.decode("utf-8").strip() - # Create new branch and return created branch name - branch_name = f"update/{path}/{version}" - CommandRunner.run_or_fail(["git", "checkout", "-b", branch_name], stage="CreateBranch") - return branch_name + # Create new branch and return created branch name + branch_name = f"update/{path}/{version}" + CommandRunner.run_or_fail( + ["git", "checkout", "-b", branch_name], stage="CreateBranch" + ) + return branch_name - @staticmethod - def add_and_commit(scope: str, version: str): - user_name = os.environ.get("GIT_APP_NAME") - user_email = os.environ.get("GIT_APP_EMAIL") + @staticmethod + def add_and_commit(scope: str, version: str): + user_name = os.environ.get("GIT_APP_NAME") + user_email = os.environ.get("GIT_APP_EMAIL") - # Add all files to git staging - CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles") + # Add all files to git staging + CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles") - # Reset environment and git config - clean_env = os.environ.copy() - clean_env["LANG"]="C.UTF-8" - clean_env["GIT_CONFIG_GLOBAL"]="/dev/null" - clean_env["GIT_CONFIG_NOSYSTEM"]="1" + # Reset environment and git config + clean_env = os.environ.copy() + clean_env["LANG"] = "C.UTF-8" + clean_env["GIT_CONFIG_GLOBAL"] = "/dev/null" + clean_env["GIT_CONFIG_NOSYSTEM"] = "1" - # Commit with settings above - CommandRunner.run_or_fail([ - "git", - "-c", f"user.name={user_name}", - "-c", f"user.email={user_email}", - "commit", - "-m", f"feat({scope}): update to {version}" - ], stage="CreateCommit", env=clean_env) + # Commit with settings above + CommandRunner.run_or_fail( + [ + "git", + "-c", + f"user.name={user_name}", + "-c", + f"user.email={user_email}", + "commit", + "-m", + f"feat({scope}): update to {version}", + ], + stage="CreateCommit", + env=clean_env, + ) - @staticmethod - def push(branch: str): - CommandRunner.run_or_fail(["git", "push", "-u", "origin", branch], stage="PushBranch") + @staticmethod + def push(branch: str): + CommandRunner.run_or_fail( + ["git", "push", "-u", "origin", branch], stage="PushBranch" + ) - @staticmethod - def clean_repo(): - CommandRunner.run_or_fail(["git", "reset", "--hard", "HEAD"], stage="ResetRepository") - CommandRunner.run_or_fail(["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch") + @staticmethod + def clean_repo(): + CommandRunner.run_or_fail( + ["git", "reset", "--hard", "HEAD"], stage="ResetRepository" + ) + CommandRunner.run_or_fail( + ["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch" + ) class GitHub: - @staticmethod - def check_newer_tag(repo, current_tag) -> UpdateStatus: - # GET /repos/:owner/:repo/git/refs/tags - url = f"https://api.github.com/repos/{repo}/git/refs/tags" + @staticmethod + def check_newer_tag(repo, current_tag) -> UpdateStatus: + # GET /repos/:owner/:repo/git/refs/tags + url = f"https://api.github.com/repos/{repo}/git/refs/tags" - # Send a GET request to the GitHub API - response = requests.get(url) + # Send a GET request to the GitHub API + response = requests.get(url) - # If the request was successful - if response.status_code == 200: - # Parse the JSON response - data = response.json() + # If the request was successful + if response.status_code == 200: + # Parse the JSON response + data = response.json() - if len(data) == 0: - return { - "has_updates": False, - } + if len(data) == 0: + return { + "has_updates": False, + } - latest_ref = data[-1] - latest_tag = latest_ref["ref"].replace("refs/tags/", "") + latest_ref = data[-1] + latest_tag = latest_ref["ref"].replace("refs/tags/", "") - if latest_tag == current_tag: - return { - "has_updates": False, - } + if latest_tag == current_tag: + return { + "has_updates": False, + } - return { - "has_updates": True, - "version": latest_tag, - "compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}", - "head_ref": latest_ref["object"]["sha"], - "head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}", - } - else: - # If the request was not successful, raise an exception - raise Exception(f"GitHub API request failed with status code {response.status_code}: {response.json()}") + return { + "has_updates": True, + "version": latest_tag, + "compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}", + "head_ref": latest_ref["object"]["sha"], + "head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}", + } + else: + # If the request was not successful, raise an exception + raise Exception( + f"GitHub API request failed with status code {response.status_code}: {response.json()}" + ) - @staticmethod - def check_updates(repo, branch, version) -> UpdateStatus: - # TODO: add support for semver updating (based on tags) - # Check if upstream github repo has a new version - # GitHub API URL for comparing two commits - url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}" + @staticmethod + def check_updates(repo, branch, version) -> UpdateStatus: + # TODO: add support for semver updating (based on tags) + # Check if upstream github repo has a new version + # GitHub API URL for comparing two commits + url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}" - # Send a GET request to the GitHub API - response = requests.get(url) + # Send a GET request to the GitHub API + response = requests.get(url) - # If the request was successful - if response.status_code == 200: - # Parse the JSON response - data = response.json() + # If the request was successful + if response.status_code == 200: + # Parse the JSON response + data = response.json() - # If the base is behind the head, there is a newer version - has_updates = data["status"] != "identical" + # If the base is behind the head, there is a newer version + has_updates = data["status"] != "identical" - if not has_updates: - return { - "has_updates": False, - } + if not has_updates: + return { + "has_updates": False, + } - return { - "has_updates": data["status"] != "identical", - "version": data["commits"][-1]["sha"], - "compare_url": data["permalink_url"], - "head_ref": data["commits"][-1]["sha"], - "head_url": data["commits"][-1]["html_url"] - } - else: - # If the request was not successful, raise an exception - raise Exception(f"GitHub API request failed with status code {response.status_code}: {response.json()}") + return { + "has_updates": data["status"] != "identical", + "version": data["commits"][-1]["sha"], + "compare_url": data["permalink_url"], + "head_ref": data["commits"][-1]["sha"], + "head_url": data["commits"][-1]["html_url"], + } + else: + # If the request was not successful, raise an exception + raise Exception( + f"GitHub API request failed with status code {response.status_code}: {response.json()}" + ) - @staticmethod - def create_issue(title: str, body: str) -> None: - cmd = [ - "gh", - "issue", - "create", - "-t", title, - "-b", body - ] - CommandRunner.run_or_fail(cmd, stage="CreateIssue") + @staticmethod + def create_issue(title: str, body: str) -> None: + cmd = ["gh", "issue", "create", "-t", title, "-b", body] + CommandRunner.run_or_fail(cmd, stage="CreateIssue") - @staticmethod - def create_pr(branch: str, title: str, body: str) -> None: - cmd = [ - "gh", - "pr", - "create", - "-B", Git.default_branch, - "-H", branch, - "-t", title, - "-b", body - ] - CommandRunner.run_or_fail(cmd, stage="CreatePullRequest") + @staticmethod + def create_pr(branch: str, title: str, body: str) -> None: + cmd = [ + "gh", + "pr", + "create", + "-B", + Git.default_branch, + "-H", + branch, + "-t", + title, + "-b", + body, + ] + CommandRunner.run_or_fail(cmd, stage="CreatePullRequest") def main(): - # Load the YAML file - with open(DEPS_YAML_FILE, "r") as yaml_file: - data: DependencyYAML = yaml.safe_load(yaml_file) + # Load the YAML file + with open(DEPS_YAML_FILE, "r") as yaml_file: + data: DependencyYAML = yaml.safe_load(yaml_file) - if "dependencies" not in data: - raise Exception(f"dependencies.yml not properly formatted") + if "dependencies" not in data: + raise Exception("dependencies.yml not properly formatted") - # Cache YAML version - DependencyStore.set(data) + # Cache YAML version + DependencyStore.set(data) + + dependencies = data["dependencies"] + for path in dependencies: + dependency = Dependency(path, dependencies[path]) + dependency.update_or_notify() - dependencies = data["dependencies"] - for path in dependencies: - dependency = Dependency(path, dependencies[path]) - dependency.update_or_notify() if __name__ == "__main__": - main() + main() From a258eb4547e610899162526f754ce1bf88027112 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 9 May 2024 18:27:01 +0200 Subject: [PATCH 122/158] fix(dependencies): improve typing --- .github/workflows/dependencies/updater.py | 36 +++++++++++++---------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index 765cb26fe..9754cdf83 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -4,7 +4,7 @@ import subprocess import sys import timeit from copy import deepcopy -from typing import Optional, TypedDict +from typing import Literal, NotRequired, TypedDict import requests import yaml @@ -49,20 +49,24 @@ class DependencyDict(TypedDict): repo: str branch: str version: str - precopy: Optional[str] - postcopy: Optional[str] + precopy: NotRequired[str] + postcopy: NotRequired[str] class DependencyYAML(TypedDict): dependencies: dict[str, DependencyDict] -class UpdateStatus(TypedDict): - has_updates: bool - version: Optional[str] - compare_url: Optional[str] - head_ref: Optional[str] - head_url: Optional[str] +class UpdateStatusFalse(TypedDict): + has_updates: Literal[False] + + +class UpdateStatusTrue(TypedDict): + has_updates: Literal[True] + version: str + compare_url: str + head_ref: str + head_url: str class CommandRunner: @@ -105,7 +109,9 @@ class DependencyStore: with CodeTimer(f"store deepcopy: {path}"): store_copy = deepcopy(DependencyStore.store) - dependency = store_copy["dependencies"].get(path, {}) + dependency = store_copy["dependencies"].get(path) + if dependency is None: + raise ValueError(f"Dependency {path} {version} not found") dependency["version"] = version store_copy["dependencies"][path] = dependency @@ -171,7 +177,7 @@ class Dependency: else: status = GitHub.check_updates(repo, remote_branch, version) - if status["has_updates"]: + if status["has_updates"] is True: short_sha = status["head_ref"][:8] new_version = status["version"] if is_tag else short_sha @@ -212,10 +218,10 @@ Check out the [list of changes]({status['compare_url']}). case CommandRunner.Exception: # Print error message print( - f"Error running {e.stage} command: {e.returncode}", + f"Error running {e.stage} command: {e.returncode}", # pyright: ignore[reportAttributeAccessIssue] file=sys.stderr, ) - print(e.stderr, file=sys.stderr) + print(e.stderr, file=sys.stderr) # pyright: ignore[reportAttributeAccessIssue] case shutil.Error: print(f"Error copying files: {e}", file=sys.stderr) @@ -378,7 +384,7 @@ class Git: class GitHub: @staticmethod - def check_newer_tag(repo, current_tag) -> UpdateStatus: + def check_newer_tag(repo, current_tag) -> UpdateStatusFalse | UpdateStatusTrue: # GET /repos/:owner/:repo/git/refs/tags url = f"https://api.github.com/repos/{repo}/git/refs/tags" @@ -417,7 +423,7 @@ class GitHub: ) @staticmethod - def check_updates(repo, branch, version) -> UpdateStatus: + def check_updates(repo, branch, version) -> UpdateStatusFalse | UpdateStatusTrue: # TODO: add support for semver updating (based on tags) # Check if upstream github repo has a new version # GitHub API URL for comparing two commits From 423b9a8ded10b0d4a81d6134c4045d0b7e077eb5 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 9 May 2024 19:20:11 +0200 Subject: [PATCH 123/158] feat(dependencies): add support for semver tags --- .../workflows/dependencies/requirements.txt | 1 + .github/workflows/dependencies/updater.py | 62 +++++++++++++++++-- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index 0ef3e54ca..7e840a74c 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -3,4 +3,5 @@ charset-normalizer==3.3.2 idna==3.7 PyYAML==6.0.1 requests==2.31.0 +semver==3.0.2 urllib3==2.2.1 diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index 9754cdf83..7e8e92ca9 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -1,13 +1,15 @@ import os +import re import shutil import subprocess import sys import timeit from copy import deepcopy -from typing import Literal, NotRequired, TypedDict +from typing import Literal, NotRequired, Optional, TypedDict import requests import yaml +from semver import Version # Get TMP_DIR variable from environment TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh") @@ -16,6 +18,35 @@ DEPS_YAML_FILE = ".github/dependencies.yml" # Dry run flag DRY_RUN = os.environ.get("DRY_RUN", "0") == "1" +# utils for tag comparison +BASEVERSION = re.compile( + r"""[vV]? + (?P(0|[1-9])\d*) + (\. + (?P(0|[1-9])\d*) + (\. + (?P(0|[1-9])\d*) + )? + )? + """, + re.VERBOSE, +) + + +def coerce(version: str) -> Optional[Version]: + match = BASEVERSION.search(version) + if not match: + return None + + # BASEVERSION looks for `MAJOR.minor.patch` in the string given + # it fills with None if any of them is missing (for example `2.1`) + ver = { + key: 0 if value is None else value for key, value in match.groupdict().items() + } + # Version takes `major`, `minor`, `patch` arguments + ver = Version(**ver) # pyright: ignore[reportArgumentType] + return ver + class CodeTimer: def __init__(self, name=None): @@ -390,6 +421,11 @@ class GitHub: # Send a GET request to the GitHub API response = requests.get(url) + current_version = coerce(current_tag) + if current_version is None: + raise ValueError( + f"Stored {current_version} from {repo} does not follow semver" + ) # If the request was successful if response.status_code == 200: @@ -401,10 +437,27 @@ class GitHub: "has_updates": False, } - latest_ref = data[-1] + latest_ref = None + latest_version: Optional[Version] = None + for ref in data: + # we find the tag since GitHub returns it as plain git ref + tag_version = coerce(ref["ref"].replace("refs/tags/", "")) + if tag_version is None: + # we skip every tag that is not semver-complaint + continue + if latest_version is None or tag_version.compare(latest_version) > 0: + # if we have a "greater" semver version, set it as latest + latest_version = tag_version + latest_ref = ref + + # raise if no valid semver tag is found + if latest_ref is None or latest_version is None: + raise ValueError(f"No tags following semver found in {repo}") + + # we get the tag since GitHub returns it as plain git ref latest_tag = latest_ref["ref"].replace("refs/tags/", "") - if latest_tag == current_tag: + if latest_version.compare(current_version) <= 0: return { "has_updates": False, } @@ -424,9 +477,6 @@ class GitHub: @staticmethod def check_updates(repo, branch, version) -> UpdateStatusFalse | UpdateStatusTrue: - # TODO: add support for semver updating (based on tags) - # Check if upstream github repo has a new version - # GitHub API URL for comparing two commits url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}" # Send a GET request to the GitHub API From eb2ff84a2c8ae45b90d36e367c6bd6bc01f8464d Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 9 May 2024 19:52:50 +0200 Subject: [PATCH 124/158] fix(dependencies): avoid creating PR if it's already there --- .github/workflows/dependencies/updater.py | 42 +++++++++++++++++++---- 1 file changed, 36 insertions(+), 6 deletions(-) diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index 7e8e92ca9..6fa32e378 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -1,3 +1,4 @@ +import json import os import re import shutil @@ -213,8 +214,10 @@ class Dependency: new_version = status["version"] if is_tag else short_sha try: + branch_name = f"update/{self.path}/{new_version}" + # Create new branch - branch = Git.create_branch(self.path, new_version) + branch = Git.checkout_or_create_branch(branch_name) # Update dependencies.yml file self.__update_yaml( @@ -353,7 +356,7 @@ class Git: ) @staticmethod - def create_branch(path: str, version: str): + def checkout_or_create_branch(branch_name: str): # Get current branch name result = CommandRunner.run_or_fail( ["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch" @@ -361,10 +364,16 @@ class Git: Git.default_branch = result.stdout.decode("utf-8").strip() # Create new branch and return created branch name - branch_name = f"update/{path}/{version}" - CommandRunner.run_or_fail( - ["git", "checkout", "-b", branch_name], stage="CreateBranch" - ) + try: + # try to checkout already existing branch + CommandRunner.run_or_fail( + ["git", "checkout", branch_name], stage="CreateBranch" + ) + except CommandRunner.Exception: + # otherwise create new branch + CommandRunner.run_or_fail( + ["git", "checkout", "-b", branch_name], stage="CreateBranch" + ) return branch_name @staticmethod @@ -515,6 +524,27 @@ class GitHub: @staticmethod def create_pr(branch: str, title: str, body: str) -> None: + # first of all let's check if PR is already open + check_cmd = [ + "gh", + "pr", + "list", + "--state", + "open", + "--head", + branch, + "--json", + "title", + ] + # returncode is 0 also if no PRs are found + output = json.loads( + CommandRunner.run_or_fail(check_cmd, stage="CheckPullRequestOpen") + .stdout.decode("utf-8") + .strip() + ) + # we have PR in this case! + if len(output) > 0: + return cmd = [ "gh", "pr", From eff648aab021df0407dcd86126d2ab9db950d0f2 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 9 May 2024 17:41:59 +0200 Subject: [PATCH 125/158] ci(dependencies): use `setup-python` and enable cron-based jobs --- .github/workflows/dependencies.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 2e2217e1c..fce666e4c 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -1,8 +1,8 @@ name: Update dependencies on: workflow_dispatch: {} - # schedule: - # - cron: '34 3 * * */8' + schedule: + - cron: '34 3 * * */8' jobs: check: @@ -18,6 +18,11 @@ jobs: with: app_id: ${{ secrets.OHMYZSH_APP_ID }} private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + cache: "pip" - name: Process dependencies env: GH_TOKEN: ${{ steps.generate_token.outputs.token }} From 1d31ff603706007e69aefe2c9ca198658e35b5dc Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sun, 12 May 2024 12:30:22 +0200 Subject: [PATCH 126/158] ci(dependencies): fetch all branches --- .github/workflows/dependencies.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index fce666e4c..6bc8dc74d 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -2,7 +2,7 @@ name: Update dependencies on: workflow_dispatch: {} schedule: - - cron: '34 3 * * */8' + - cron: "34 3 * * */8" jobs: check: @@ -12,6 +12,8 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Authenticate as @ohmyzsh id: generate_token uses: ohmyzsh/github-app-token@v2 From 0493eab8ce02c4988a16cbe27ad61a20ed8a89df Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sun, 12 May 2024 12:40:45 +0200 Subject: [PATCH 127/158] fix(dependencies): check if repo is clean before committing --- .github/workflows/dependencies/updater.py | 36 +++++++++++++---------- 1 file changed, 21 insertions(+), 15 deletions(-) diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index 6fa32e378..4533b7aeb 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -390,21 +390,27 @@ class Git: clean_env["GIT_CONFIG_GLOBAL"] = "/dev/null" clean_env["GIT_CONFIG_NOSYSTEM"] = "1" - # Commit with settings above - CommandRunner.run_or_fail( - [ - "git", - "-c", - f"user.name={user_name}", - "-c", - f"user.email={user_email}", - "commit", - "-m", - f"feat({scope}): update to {version}", - ], - stage="CreateCommit", - env=clean_env, - ) + # check if repo is clean (clean => no error, no commit) + try: + CommandRunner.run_or_fail( + ["git", "diff", "--exit-code"], stage="CheckRepoClean", env=clean_env + ) + except CommandRunner.Exception: + # Commit with settings above + CommandRunner.run_or_fail( + [ + "git", + "-c", + f"user.name={user_name}", + "-c", + f"user.email={user_email}", + "commit", + "-m", + f"feat({scope}): update to {version}", + ], + stage="CreateCommit", + env=clean_env, + ) @staticmethod def push(branch: str): From b1c5315a5fbc33624525e434ddbaec3bb30030e2 Mon Sep 17 00:00:00 2001 From: "ohmyzsh[bot]" <54982679+ohmyzsh[bot]@users.noreply.github.com> Date: Sun, 12 May 2024 12:42:59 +0200 Subject: [PATCH 128/158] feat(wd): update to version v0.6.1 (#12413) Co-authored-by: ohmyzsh[bot] <54982679+ohmyzsh[bot]@users.noreply.github.com> --- .github/dependencies.yml | 2 +- plugins/wd/README.md | 28 +++++++++++++++++++++++++++- plugins/wd/wd.plugin.zsh | 7 ++++++- plugins/wd/wd.sh | 37 +++++++++++++++++++++++++++++-------- 4 files changed, 63 insertions(+), 11 deletions(-) mode change 100644 => 100755 plugins/wd/wd.sh diff --git a/.github/dependencies.yml b/.github/dependencies.yml index a105f440d..6ae97ad4e 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -39,7 +39,7 @@ dependencies: plugins/wd: repo: mfaerevaag/wd branch: master - version: tag:v0.6.0 + version: tag:v0.6.1 precopy: | set -e rm -r test diff --git a/plugins/wd/README.md b/plugins/wd/README.md index 0ad74e805..0c71c0565 100644 --- a/plugins/wd/README.md +++ b/plugins/wd/README.md @@ -57,6 +57,24 @@ wd() { } ``` +### [Home Manager](https://github.com/nix-community/home-manager) + +Add the following to your `home.nix` then run `home-manager switch`: + +```nix +programs.zsh.plugins = [ + { + name = "wd"; + src = pkgs.fetchFromGitHub { + owner = "mfaerevaag"; + repo = "wd"; + rev = "v0.5.2"; + sha256 = "sha256-4yJ1qhqhNULbQmt6Z9G22gURfDLe30uV1ascbzqgdhg="; + }; + } +]; +``` + ### [zplug](https://github.com/zplug/zplug) ```zsh @@ -119,6 +137,14 @@ Also, you may have to force a rebuild of `zcompdump` by running: rm -f ~/.zcompdump; compinit ``` +## Browse + +If you want to make use of the `fzf`-powered browse feature to fuzzy search through all your warp points, set up a keybind in your `.zshrc`: + +```zsh +bindkey '^G' wd_browse +``` + ## Usage * Add warp point to current working directory: @@ -153,7 +179,7 @@ wd .. wd ... ``` -This is a wrapper for the zsh's `dirs` function. +This is a wrapper for the zsh's `dirs` function. _You might need to add `setopt AUTO_PUSHD` to your `.zshrc` if you are not using [oh-my-zsh](https://github.com/ohmyzsh/ohmyzsh)._ * Remove warp point: diff --git a/plugins/wd/wd.plugin.zsh b/plugins/wd/wd.plugin.zsh index ca2ca7c65..9e0c7ff13 100644 --- a/plugins/wd/wd.plugin.zsh +++ b/plugins/wd/wd.plugin.zsh @@ -8,8 +8,13 @@ # @github.com/mfaerevaag/wd # Handle $0 according to the standard: -# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html +# # https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${(M)0:#/*}:-$PWD/$0}" eval "wd() { source '${0:A:h}/wd.sh' }" +wd > /dev/null +# Register the function as a Zsh widget +zle -N wd_browse +# Bind the widget to a key combination +bindkey '^G' wd_browse diff --git a/plugins/wd/wd.sh b/plugins/wd/wd.sh old mode 100644 new mode 100755 index 840e92d61..c4f422cbf --- a/plugins/wd/wd.sh +++ b/plugins/wd/wd.sh @@ -8,7 +8,7 @@ # @github.com/mfaerevaag/wd # version -readonly WD_VERSION=0.5.0 +readonly WD_VERSION=0.6.1 # colors readonly WD_BLUE="\033[96m" @@ -57,12 +57,11 @@ wd_print_msg() { if [[ -z $wd_quiet_mode ]] then - local color=$1 - local msg=$2 + local color="${1:-$WD_BLUE}" # Default to blue if no color is provided + local msg="$2" - if [[ $color == "" || $msg == "" ]] - then - print " ${WD_RED}*${WD_NOC} Could not print message. Sorry!" + if [[ -z "$msg" ]]; then + print "${WD_RED}*${WD_NOC} Could not print message. Sorry!" else print " ${color}*${WD_NOC} ${msg}" fi @@ -230,6 +229,20 @@ wd_remove() done } +wd_browse() { + if ! command -v fzf >/dev/null; then + echo "This functionality requires fzf. Please install fzf first." + return 1 + fi + local entries=("${(@f)$(sed "s:${HOME}:~:g" "$WD_CONFIG" | awk -F ':' '{print $1 " -> " $2}')}") + local selected_entry=$(printf '%s\n' "${entries[@]}" | fzf --height 40% --reverse) + if [[ -n $selected_entry ]]; then + local selected_point="${selected_entry%% ->*}" + selected_point=$(echo "$selected_point" | xargs) + wd $selected_point + fi +} + wd_list_all() { wd_print_msg "$WD_BLUE" "All warp points:" @@ -396,7 +409,9 @@ fi # disable extendedglob for the complete wd execution time setopt | grep -q extendedglob wd_extglob_is_set=$? -(( ! $wd_extglob_is_set )) && setopt noextendedglob +if (( wd_extglob_is_set == 0 )); then + setopt noextendedglob +fi # load warp points typeset -A points @@ -436,6 +451,10 @@ else wd_add "$2" "$wd_force_mode" break ;; + "-b"|"browse") + wd_browse + break + ;; "-e"|"export") wd_export_static_named_directories break @@ -484,7 +503,9 @@ fi # if not, next time warp will pick up variables from this run # remember, there's no sub shell -(( ! $wd_extglob_is_set )) && setopt extendedglob +if (( wd_extglob_is_set == 0 )); then + setopt extendedglob +fi unset wd_extglob_is_set unset wd_warp From a8a747e18abe41b26de0b892e888ad5c386abc3f Mon Sep 17 00:00:00 2001 From: Juho Kuisma Date: Wed, 15 May 2024 20:14:11 +0300 Subject: [PATCH 129/158] feat(fzf): add support for Fedora package (#12421) --- plugins/fzf/fzf.plugin.zsh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/plugins/fzf/fzf.plugin.zsh b/plugins/fzf/fzf.plugin.zsh index 48fea4f63..e244b4cfb 100644 --- a/plugins/fzf/fzf.plugin.zsh +++ b/plugins/fzf/fzf.plugin.zsh @@ -148,6 +148,27 @@ function fzf_setup_using_opensuse() { return 0 } +function fzf_setup_using_fedora() { + (( $+commands[fzf] )) || return 1 + + local completions="/usr/share/zsh/site-functions/fzf" + local key_bindings="/usr/share/fzf/shell/key-bindings.zsh" + + if [[ ! -f "$completions" || ! -f "$key_bindings" ]]; then + return 1 + fi + + if [[ -o interactive && "$DISABLE_FZF_AUTO_COMPLETION" != "true" ]]; then + source "$completions" 2>/dev/null + fi + + if [[ "$DISABLE_FZF_KEY_BINDINGS" != "true" ]]; then + source "$key_bindings" 2>/dev/null + fi + + return 0 +} + function fzf_setup_using_openbsd() { # openBSD installs fzf in /usr/local/bin/fzf if [[ "$OSTYPE" != openbsd* ]] || (( ! $+commands[fzf] )); then @@ -234,6 +255,7 @@ fzf_setup_using_fzf \ || fzf_setup_using_openbsd \ || fzf_setup_using_debian \ || fzf_setup_using_opensuse \ + || fzf_setup_using_fedora \ || fzf_setup_using_cygwin \ || fzf_setup_using_macports \ || fzf_setup_using_base_dir \ From fb91ca27a2d65b834e98a3986cfee73ad82ea412 Mon Sep 17 00:00:00 2001 From: Fritz Reichwald Date: Wed, 15 May 2024 19:27:21 +0200 Subject: [PATCH 130/158] feat(amuse): add whitespace before virtualenv (#12423) --- themes/amuse.zsh-theme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/themes/amuse.zsh-theme b/themes/amuse.zsh-theme index d787fdaa4..cddbcd40d 100644 --- a/themes/amuse.zsh-theme +++ b/themes/amuse.zsh-theme @@ -17,7 +17,7 @@ $ ' RPROMPT='$(ruby_prompt_info)' VIRTUAL_ENV_DISABLE_PROMPT=0 -ZSH_THEME_VIRTUAL_ENV_PROMPT_PREFIX=" %{$fg[green]%}🐍" +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 a779d6563ffb2f0093b4b74c8d5ff0982fa3e930 Mon Sep 17 00:00:00 2001 From: Alessandro Miliucci Date: Thu, 16 May 2024 22:13:36 +0200 Subject: [PATCH 131/158] chore(template): propose add `.local/bin` to PATH (#12417) --- templates/zshrc.zsh-template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/zshrc.zsh-template b/templates/zshrc.zsh-template index 7e1c7997c..a73d60799 100644 --- a/templates/zshrc.zsh-template +++ b/templates/zshrc.zsh-template @@ -1,5 +1,5 @@ # If you come from bash you might have to change your $PATH. -# export PATH=$HOME/bin:/usr/local/bin:$PATH +# export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH # Path to your oh-my-zsh installation. export ZSH=$HOME/.oh-my-zsh From 309129f651eeeca62c3a3b7f6817f0ac601db9f0 Mon Sep 17 00:00:00 2001 From: Daniel Ochoja <37149152+Ochoja@users.noreply.github.com> Date: Tue, 21 May 2024 19:36:07 +0100 Subject: [PATCH 132/158] feat(agnoster): add `anaconda` env information (#12434) --- themes/agnoster.zsh-theme | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index c2a542163..767a4ed50 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -227,6 +227,14 @@ prompt_virtualenv() { fi } +# Conda Virtualenv +promp_conda_virtualenv() { + if [[ -n $CONDA_PROMPT_MODIFIER ]]; then + prompt_segment black default ${CONDA_PROMPT_MODIFIER:1:-2} + fi +} + + # Status: # - was there an error # - am I root @@ -266,6 +274,7 @@ build_prompt() { prompt_bzr prompt_hg prompt_end + promp_conda_virtualenv } PROMPT='%{%f%b%k%}$(build_prompt) ' From 0621944db50aec931850806644b673e39b650163 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 21 May 2024 20:43:26 +0200 Subject: [PATCH 133/158] fix(dependencies): only open PR if there are changes --- .github/workflows/dependencies/updater.py | 78 +++++++++++++---------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index 4533b7aeb..e64d69939 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -228,21 +228,22 @@ class Dependency: self.__apply_upstream_changes() # Add all changes and commit - Git.add_and_commit(self.name, short_sha) + has_new_commit = Git.add_and_commit(self.name, short_sha) - # Push changes to remote - Git.push(branch) + if has_new_commit: + # Push changes to remote + Git.push(branch) - # Create GitHub PR - GitHub.create_pr( - branch, - f"feat({self.name}): update to version {new_version}", - f"""## Description + # Create GitHub PR + GitHub.create_pr( + branch, + f"feat({self.name}): update to version {new_version}", + f"""## Description -Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). -Check out the [list of changes]({status['compare_url']}). -""", - ) + Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). + Check out the [list of changes]({status['compare_url']}). + """, + ) # Clean up repository Git.clean_repo() @@ -377,7 +378,21 @@ class Git: return branch_name @staticmethod - def add_and_commit(scope: str, version: str): + def add_and_commit(scope: str, version: str) -> bool: + """ + Returns `True` if there were changes and were indeed commited. + Returns `False` if the repo was clean and no changes were commited. + """ + # check if repo is clean (clean => no error, no commit) + try: + CommandRunner.run_or_fail( + ["git", "diff", "--exit-code"], stage="CheckRepoClean" + ) + return False + except CommandRunner.Exception: + # if it's other kind of error just throw! + pass + user_name = os.environ.get("GIT_APP_NAME") user_email = os.environ.get("GIT_APP_EMAIL") @@ -390,27 +405,22 @@ class Git: clean_env["GIT_CONFIG_GLOBAL"] = "/dev/null" clean_env["GIT_CONFIG_NOSYSTEM"] = "1" - # check if repo is clean (clean => no error, no commit) - try: - CommandRunner.run_or_fail( - ["git", "diff", "--exit-code"], stage="CheckRepoClean", env=clean_env - ) - except CommandRunner.Exception: - # Commit with settings above - CommandRunner.run_or_fail( - [ - "git", - "-c", - f"user.name={user_name}", - "-c", - f"user.email={user_email}", - "commit", - "-m", - f"feat({scope}): update to {version}", - ], - stage="CreateCommit", - env=clean_env, - ) + # Commit with settings above + CommandRunner.run_or_fail( + [ + "git", + "-c", + f"user.name={user_name}", + "-c", + f"user.email={user_email}", + "commit", + "-m", + f"feat({scope}): update to {version}", + ], + stage="CreateCommit", + env=clean_env, + ) + return True @staticmethod def push(branch: str): From 04b66b230857fb9bc28af5e7590b09ff79f888fa Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 21 May 2024 20:46:54 +0200 Subject: [PATCH 134/158] chore(dependencies): PR wording --- .github/workflows/dependencies/updater.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dependencies/updater.py b/.github/workflows/dependencies/updater.py index e64d69939..f85c9eda7 100644 --- a/.github/workflows/dependencies/updater.py +++ b/.github/workflows/dependencies/updater.py @@ -240,9 +240,9 @@ class Dependency: f"feat({self.name}): update to version {new_version}", f"""## Description - Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). - Check out the [list of changes]({status['compare_url']}). - """, +Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}). +Check out the [list of changes]({status['compare_url']}). +""", ) # Clean up repository From f6b3fc84d192274f245a7322c3994767c5e68691 Mon Sep 17 00:00:00 2001 From: "ohmyzsh[bot]" <54982679+ohmyzsh[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 20:48:54 +0200 Subject: [PATCH 135/158] feat(wd): update to version v0.7.0 (#12436) Co-authored-by: ohmyzsh[bot] <54982679+ohmyzsh[bot]@users.noreply.github.com> --- .github/dependencies.yml | 2 +- plugins/wd/README.md | 15 ++++++- plugins/wd/_wd.sh | 4 ++ plugins/wd/wd.plugin.zsh | 9 +++-- plugins/wd/wd.sh | 87 ++++++++++++++++++++++++++++++++-------- 5 files changed, 95 insertions(+), 22 deletions(-) diff --git a/.github/dependencies.yml b/.github/dependencies.yml index 6ae97ad4e..d3b269361 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -39,7 +39,7 @@ dependencies: plugins/wd: repo: mfaerevaag/wd branch: master - version: tag:v0.6.1 + version: tag:v0.7.0 precopy: | set -e rm -r test diff --git a/plugins/wd/README.md b/plugins/wd/README.md index 0c71c0565..bf19031f8 100644 --- a/plugins/wd/README.md +++ b/plugins/wd/README.md @@ -142,7 +142,7 @@ rm -f ~/.zcompdump; compinit If you want to make use of the `fzf`-powered browse feature to fuzzy search through all your warp points, set up a keybind in your `.zshrc`: ```zsh -bindkey '^G' wd_browse +bindkey ${FZF_WD_BINDKEY:-'^B'} fuzzy_wd_widget ``` ## Usage @@ -158,6 +158,19 @@ If a warp point with the same name exists, use `wd add foo --force` to overwrite **Note:** a warp point cannot contain colons, or consist of only spaces and dots. The first will conflict in how `wd` stores the warp points, and the second will conflict with other features, as below. +* Add warp point to any directory with default name: + +```zsh +wd addcd /foo/ bar +``` + +* Add warp point to any directory with a custom name: + +```zsh +wd addcd /foo/ +``` + + You can omit point name to automatically use the current directory's name instead. * From any directory, warp to `foo` with: diff --git a/plugins/wd/_wd.sh b/plugins/wd/_wd.sh index 52ecb12e6..46b032f78 100644 --- a/plugins/wd/_wd.sh +++ b/plugins/wd/_wd.sh @@ -31,6 +31,7 @@ function _wd() { commands=( 'add:Adds the current working directory to your warp points' + 'addcd:Adds a directory to your warp points' 'add!:Overwrites existing warp point' 'export:Export warp points as static named directories' 'rm:Removes the given warp point' @@ -63,6 +64,9 @@ function _wd() { add) _message 'Write the name of your warp point' && ret=0 ;; + addcd) + _message 'Write the name of your path' && ret=0 + ;; show) _describe -t points "Warp points" warp_points && ret=0 ;; diff --git a/plugins/wd/wd.plugin.zsh b/plugins/wd/wd.plugin.zsh index 9e0c7ff13..9910cb968 100644 --- a/plugins/wd/wd.plugin.zsh +++ b/plugins/wd/wd.plugin.zsh @@ -14,7 +14,8 @@ eval "wd() { source '${0:A:h}/wd.sh' }" wd > /dev/null -# Register the function as a Zsh widget -zle -N wd_browse -# Bind the widget to a key combination -bindkey '^G' wd_browse +zle -N wd_browse_widget +zle -N wd_restore_buffer +autoload -Uz add-zle-hook-widget +add-zle-hook-widget line-init wd_restore_buffer +bindkey ${FZF_WD_BINDKEY:-'^B'} wd_browse_widget diff --git a/plugins/wd/wd.sh b/plugins/wd/wd.sh index c4f422cbf..160ab3be3 100755 --- a/plugins/wd/wd.sh +++ b/plugins/wd/wd.sh @@ -8,7 +8,7 @@ # @github.com/mfaerevaag/wd # version -readonly WD_VERSION=0.6.1 +readonly WD_VERSION=0.7.0 # colors readonly WD_BLUE="\033[96m" @@ -59,7 +59,7 @@ wd_print_msg() then local color="${1:-$WD_BLUE}" # Default to blue if no color is provided local msg="$2" - + if [[ -z "$msg" ]]; then print "${WD_RED}*${WD_NOC} Could not print message. Sorry!" else @@ -74,18 +74,20 @@ wd_print_usage() Usage: wd [command] [point] Commands: - Warps to the directory specified by the warp point - Warps to the directory specified by the warp point with path appended - add Adds the current working directory to your warp points - add Adds the current working directory to your warp points with current directory's name - rm Removes the given warp point - rm Removes the given warp point with current directory's name - show Print path to given warp point - show Print warp points to current directory - list Print all stored warp points - ls Show files from given warp point (ls) - path Show the path to given warp point (pwd) - clean Remove points warping to nonexistent directories (will prompt unless --force is used) + Warps to the directory specified by the warp point + Warps to the directory specified by the warp point with path appended + add Adds the current working directory to your warp points + add Adds the current working directory to your warp points with current directory's name + addcd Adds a path to your warp points with the directory's name + addcd Adds a path to your warp points with a custom name + rm Removes the given warp point + rm Removes the given warp point with current directory's name + show Print path to given warp point + show Print warp points to current directory + list Print all stored warp points + ls Show files from given warp point (ls) + path Show the path to given warp point (pwd) + clean Remove points warping to nonexistent directories (will prompt unless --force is used) -v | --version Print version -d | --debug Exit after execution with exit codes (for testing) @@ -203,6 +205,28 @@ wd_add() fi } +wd_addcd() { + local folder="$1" + local point=$2 + local force=$3 + local currentdir=$PWD + + if [[ -z "$folder" ]]; then + wd_exit_fail "You must specify a path" + return + fi + + if [[ ! -d "$folder" ]]; then + wd_exit_fail "The directory does not exist" + return + fi + + cd "$folder" || return + wd_add "$point" "$force" + cd "$currentdir" || return +} + + wd_remove() { local point_list=$1 @@ -235,7 +259,15 @@ wd_browse() { return 1 fi local entries=("${(@f)$(sed "s:${HOME}:~:g" "$WD_CONFIG" | awk -F ':' '{print $1 " -> " $2}')}") - local selected_entry=$(printf '%s\n' "${entries[@]}" | fzf --height 40% --reverse) + local script_path="${${(%):-%x}:h}" + local wd_remove_output=$(mktemp "${TMPDIR:-/tmp}/wd.XXXXXXXXXX") + local entries_with_headers=("All warp points:" "Press enter to select. Press delete to remove" "${entries[@]}") + local fzf_bind="delete:execute(echo {} | awk -F ' -> ' '{print \$1}' | xargs -I {} "$script_path/wd.sh" rm {} > "$wd_remove_output")+abort" + local fzf_command=$(printf '%s\n' "${entries_with_headers[@]}" | fzf --height 100% --reverse --header-lines=2 --bind="$fzf_bind") + if [[ -e $wd_remove_output ]]; then + cat "$wd_remove_output" + rm "$wd_remove_output" + fi if [[ -n $selected_entry ]]; then local selected_point="${selected_entry%% ->*}" selected_point=$(echo "$selected_point" | xargs) @@ -243,6 +275,24 @@ wd_browse() { fi } +wd_browse_widget() { + if [[ -e $WD_CONFIG ]]; then + wd_browse + saved_buffer=$BUFFER + saved_cursor=$CURSOR + BUFFER= + zle redisplay + zle accept-line + fi +} + +wd_restore_buffer() { + BUFFER=$saved_buffer + CURSOR=$saved_cursor + saved_buffer= + saved_cursor=1 +} + wd_list_all() { wd_print_msg "$WD_BLUE" "All warp points:" @@ -371,7 +421,7 @@ wd_export_static_named_directories() { fi } -local WD_CONFIG=${WD_CONFIG:-$HOME/.warprc} +WD_CONFIG=${WD_CONFIG:-$HOME/.warprc} local WD_QUIET=0 local WD_EXIT_CODE=0 local WD_DEBUG=0 @@ -455,6 +505,10 @@ else wd_browse break ;; + "-c"|"--addcd"|"addcd") + wd_addcd "$2" "$3" "$wd_force_mode" + break + ;; "-e"|"export") wd_export_static_named_directories break @@ -510,6 +564,7 @@ fi unset wd_extglob_is_set unset wd_warp unset wd_add +unset wd_addcd unset wd_remove unset wd_show unset wd_list_all From dfb436b54a10c84156a548dded0506d474050a43 Mon Sep 17 00:00:00 2001 From: danielwerg <35052399+danielwerg@users.noreply.github.com> Date: Tue, 21 May 2024 21:58:43 +0300 Subject: [PATCH 136/158] feat(tldr): add tldr plugin (#12429) --- plugins/tldr/README.md | 15 +++++++++++++++ plugins/tldr/tldr.plugin.zsh | 19 +++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 plugins/tldr/README.md create mode 100644 plugins/tldr/tldr.plugin.zsh diff --git a/plugins/tldr/README.md b/plugins/tldr/README.md new file mode 100644 index 000000000..fb91d9d1f --- /dev/null +++ b/plugins/tldr/README.md @@ -0,0 +1,15 @@ +# tldr plugin + +This plugin adds a shortcut to insert tldr before the previous command. +Heavily inspired from [Man plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/man). + +To use it, add `tldr` to the plugins array in your zshrc file: + +```zsh +plugins=(... tldr) +``` + +# Keyboard Shortcuts +| Shortcut | Description | +|------------------------------------|----------------------------------------------------------------------------| +| Esc + tldr | add tldr before the previous command to see the tldr page for this command | diff --git a/plugins/tldr/tldr.plugin.zsh b/plugins/tldr/tldr.plugin.zsh new file mode 100644 index 000000000..9f3de5f0c --- /dev/null +++ b/plugins/tldr/tldr.plugin.zsh @@ -0,0 +1,19 @@ +tldr-command-line() { + # if there is no command typed, use the last command + [[ -z "$BUFFER" ]] && zle up-history + + # if typed command begins with tldr, do nothing + [[ "$BUFFER" = tldr\ * ]] && return + + # get command and possible subcommand + # http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags + local -a args + args=(${${(Az)BUFFER}[1]} ${${(Az)BUFFER}[2]}) + + BUFFER="tldr ${args[1]}" +} + +zle -N tldr-command-line +# Defined shortcut keys: [Esc]tldr +bindkey "\e"tldr tldr-command-line + From bbfb9853591312c180a0c417226e4ef899d4cf3a Mon Sep 17 00:00:00 2001 From: robinverduijn Date: Tue, 21 May 2024 22:39:12 -0700 Subject: [PATCH 137/158] chore(agnoster): typo (#12437) --- themes/agnoster.zsh-theme | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index 767a4ed50..4445ad4a4 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -228,7 +228,7 @@ prompt_virtualenv() { } # Conda Virtualenv -promp_conda_virtualenv() { +prompt_conda_virtualenv() { if [[ -n $CONDA_PROMPT_MODIFIER ]]; then prompt_segment black default ${CONDA_PROMPT_MODIFIER:1:-2} fi @@ -274,7 +274,7 @@ build_prompt() { prompt_bzr prompt_hg prompt_end - promp_conda_virtualenv + prompt_conda_virtualenv } PROMPT='%{%f%b%k%}$(build_prompt) ' From c77a01dbe28acaa13e53c7dc78d6b798f3f42fc2 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 22 May 2024 09:15:11 +0200 Subject: [PATCH 138/158] Revert "feat(agnoster): add `anaconda` env information (#12434)" This reverts commit 309129f651eeeca62c3a3b7f6817f0ac601db9f0. --- themes/agnoster.zsh-theme | 9 --------- 1 file changed, 9 deletions(-) diff --git a/themes/agnoster.zsh-theme b/themes/agnoster.zsh-theme index 4445ad4a4..c2a542163 100644 --- a/themes/agnoster.zsh-theme +++ b/themes/agnoster.zsh-theme @@ -227,14 +227,6 @@ prompt_virtualenv() { fi } -# Conda Virtualenv -prompt_conda_virtualenv() { - if [[ -n $CONDA_PROMPT_MODIFIER ]]; then - prompt_segment black default ${CONDA_PROMPT_MODIFIER:1:-2} - fi -} - - # Status: # - was there an error # - am I root @@ -274,7 +266,6 @@ build_prompt() { prompt_bzr prompt_hg prompt_end - prompt_conda_virtualenv } PROMPT='%{%f%b%k%}$(build_prompt) ' From 41d2029dec256b9ef3869cb83699d88b94eb3c1d Mon Sep 17 00:00:00 2001 From: Rizky Ilham Pratama Date: Wed, 22 May 2024 15:17:06 +0800 Subject: [PATCH 139/158] feat(laravel): add aliases laravel 11 (#12354) --- plugins/laravel/README.md | 4 ++++ plugins/laravel/laravel.plugin.zsh | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/plugins/laravel/README.md b/plugins/laravel/README.md index a831a86b6..21eb89373 100644 --- a/plugins/laravel/README.md +++ b/plugins/laravel/README.md @@ -36,6 +36,10 @@ plugins=(... laravel) | `pamj` | `php artisan make:job` | | `paml` | `php artisan make:listener` | | `pamn` | `php artisan make:notification` | +| `pamcl` | `php artisan make:class` | +| `pamen` | `php artisan make:enum` | +| `pami` | `php artisan make:interface` | +| `pamtr` | `php artisan make:trait` | ## Clears diff --git a/plugins/laravel/laravel.plugin.zsh b/plugins/laravel/laravel.plugin.zsh index 319946f07..86ae27299 100644 --- a/plugins/laravel/laravel.plugin.zsh +++ b/plugins/laravel/laravel.plugin.zsh @@ -25,6 +25,10 @@ alias pamj='php artisan make:job' alias paml='php artisan make:listener' alias pamn='php artisan make:notification' alias pampp='php artisan make:provider' +alias pamcl='php artisan make:class' +alias pamen='php artisan make:enum' +alias pami='php artisan make:interface' +alias pamtr='php artisan make:trait' # Clears From 203369b0f9ec284e06b73f555a14fa5f02be5a0a Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 22 May 2024 15:36:03 +0200 Subject: [PATCH 140/158] ci(dependencies): run on sunday CET morning --- .github/workflows/dependencies.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies.yml b/.github/workflows/dependencies.yml index 6bc8dc74d..6c7387089 100644 --- a/.github/workflows/dependencies.yml +++ b/.github/workflows/dependencies.yml @@ -2,7 +2,7 @@ name: Update dependencies on: workflow_dispatch: {} schedule: - - cron: "34 3 * * */8" + - cron: "0 6 * * 0" jobs: check: From 1b29fd3a460e43d4a7581d6a6a7e5a1877a39068 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Miguel=20Benito=20Calzada?= Date: Thu, 23 May 2024 12:51:02 +0200 Subject: [PATCH 141/158] feat(git): support `stable` in `git_main_branch` (#12447) --- 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 c48e365b5..1e65a7acc 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -35,7 +35,7 @@ function git_develop_branch() { 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,master}; do + for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,stable,master}; do if command git show-ref -q --verify $ref; then echo ${ref:t} return 0 From 5e59d21e5465ec0694441f41ff0acf1ddf4de187 Mon Sep 17 00:00:00 2001 From: theredcmdcraft <57496807+theredcmdcraft@users.noreply.github.com> Date: Sun, 26 May 2024 21:53:03 +0200 Subject: [PATCH 142/158] Add Support for Tabby Terminal in Macos Plugin (#12451) * Added Support for Tabby in Macos-Plugin * Update README.md Added Supported Terminal List * chore(macos): Update README to link to terminals Linking to the supported terminals, moving reference to the original author to the Acknowledgements section --------- Co-authored-by: Robby Russell --- plugins/macos/README.md | 10 ++++++++-- plugins/macos/macos.plugin.zsh | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/plugins/macos/README.md b/plugins/macos/README.md index 2c52ec8a7..8245e211f 100644 --- a/plugins/macos/README.md +++ b/plugins/macos/README.md @@ -8,7 +8,11 @@ To start using it, add the `macos` plugin to your plugins array in `~/.zshrc`: plugins=(... macos) ``` -Original author: [Sorin Ionescu](https://github.com/sorin-ionescu) +## Supported Terminals +- [iTerm](https://iterm.sourceforge.net/) +- [iTerm2](https://iterm2.com/) +- [Hyper](https://hyper.is/) +- [Tabby](https://tabby.sh/) ## Commands @@ -37,7 +41,9 @@ Original author: [Sorin Ionescu](https://github.com/sorin-ionescu) ## Acknowledgements -This application makes use of the following third party scripts: +Original author: [Sorin Ionescu](https://github.com/sorin-ionescu) + +This application makes use of the following third-party scripts: [shpotify](https://github.com/hnarayanan/shpotify) diff --git a/plugins/macos/macos.plugin.zsh b/plugins/macos/macos.plugin.zsh index 2702a1901..b951a289f 100644 --- a/plugins/macos/macos.plugin.zsh +++ b/plugins/macos/macos.plugin.zsh @@ -79,6 +79,13 @@ EOF key code 36 #(presses enter) end tell EOF + + elif [[ "$the_app" == 'Tabby' ]]; then + osascript >/dev/null <&2 return 1 @@ -126,6 +133,12 @@ EOF delay 1 keystroke "${command} \n" end tell +EOF + elif [[ "$the_app" == 'Tabby' ]]; then + osascript >/dev/null <&2 @@ -175,6 +188,12 @@ EOF delay 1 keystroke "${command} \n" end tell +EOF + elif [[ "$the_app" == 'Tabby' ]]; then + osascript >/dev/null <&2 From 071b8f8921cb2bbb1fcabbf3d271e77af0b12a7d Mon Sep 17 00:00:00 2001 From: Ian Chesal Date: Tue, 28 May 2024 17:40:30 -0400 Subject: [PATCH 143/158] feat(kitty): add plugin for the kitty terminal (#10994) * A plugin for the Kitty terminal Provides a handful of useful aliases for anyone working in a Kitty terminal. In particular, the kssh command is handy for ensuring that terminfo is set correctly on remote hosts when you ssh to them. * Guard kitty configuration We should only load these aliases into a terminal that's identifying itself as an xterm-kitty terminal. They're not useful in any other situation. --- plugins/kitty/README.md | 23 +++++++++++++++++++++++ plugins/kitty/kitty.plugin.zsh | 16 ++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 plugins/kitty/README.md create mode 100644 plugins/kitty/kitty.plugin.zsh diff --git a/plugins/kitty/README.md b/plugins/kitty/README.md new file mode 100644 index 000000000..ec9e375de --- /dev/null +++ b/plugins/kitty/README.md @@ -0,0 +1,23 @@ +# Kitty plugin + +This plugin adds a few aliases and functions that are useful for users of the [Kitty](https://sw.kovidgoyal.net/kitty/) terminal. + +To use it, add _kitty_ to the plugins array of your zshrc file: +``` +plugins=(... kitty) +``` + +## Plugin commands + +* `kssh` + Runs a kitten ssh session that ensures your terminfo settings are copied + correctly to the remote hose. +* `kssh-slow` + A slower form of `kssh` that should always work. Use this if `kssh` fails + to set terminfo correctly for you on the remote host. +* `kitty-theme` + Browse and change the theme of your Kitty terminal. + +## Contributors + +- [Ian Chesal](https://github.com/ianchesal) diff --git a/plugins/kitty/kitty.plugin.zsh b/plugins/kitty/kitty.plugin.zsh new file mode 100644 index 000000000..1094236a7 --- /dev/null +++ b/plugins/kitty/kitty.plugin.zsh @@ -0,0 +1,16 @@ +##################################################### +# Kitty plugin for oh-my-zsh # +##################################################### + +if [[ "$TERM" == 'xterm-kitty' ]]; then + ## kssh + # Use this when your terminfo isn't recognized on remote hosts. + # See: https://sw.kovidgoyal.net/kitty/faq/#i-get-errors-about-the-terminal-being-unknown-or-opening-the-terminal-failing-when-sshing-into-a-different-computer + alias kssh="kitty +kitten ssh" + compdef kssh='ssh' + # Use this if kssh fails + alias kssh-slow="infocmp -a xterm-kitty | ssh myserver tic -x -o \~/.terminfo /dev/stdin" + + # Change the colour theme + alias kitty-theme="kitty +kitten themes" +fi From a4424dfefd68e4d23badb2f86087184f9e06fab4 Mon Sep 17 00:00:00 2001 From: Lukas Grimm Date: Thu, 30 May 2024 17:05:50 +0200 Subject: [PATCH 144/158] fix(pass): completion for multiple repositories (#12464) --- plugins/pass/_pass | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/pass/_pass b/plugins/pass/_pass index d911e122f..c66d99318 100644 --- a/plugins/pass/_pass +++ b/plugins/pass/_pass @@ -20,6 +20,8 @@ _pass () { local cmd + local rootcontext + rootcontext=$curcontext if (( CURRENT > 2)); then cmd=${words[2]} # Set the context for the subcommand. @@ -123,8 +125,9 @@ _pass_cmd_show () { _pass_complete_entries_helper () { local IFS=$'\n' local prefix - zstyle -s ":completion:${curcontext}:" prefix prefix || prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}" - _values -C 'passwords' ${$(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" -e 's#\.gpg##' -e 's#\\#\\\\#g' -e 's#:#\\:#g' | sort):-""} + zstyle -s ":completion:${rootcontext}:" prefix prefix || +prefix="${PASSWORD_STORE_DIR:-$HOME/.password-store}" + _values -C 'passwords' ${$(find -L "$prefix" \( -name .git -o -name .gpg-id \) -prune -o $@ -print 2>/dev/null | sed -e "s#${prefix}/\{0,1\}##" -e 's#\.gpg##' -e 's#\\#\\\\#g' -e 's#:#\\:#g' | sort):-""} } _pass_complete_entries_with_subdirs () { From 2c08d2b8423d6fc38d4d6e3be3aaebc3522b1555 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 30 May 2024 20:21:17 +0200 Subject: [PATCH 145/158] fix(kubectl): load completion properly in functions Closes #12427 --- plugins/kubectl/kubectl.plugin.zsh | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh index 0dd4e691a..a96e409c6 100644 --- a/plugins/kubectl/kubectl.plugin.zsh +++ b/plugins/kubectl/kubectl.plugin.zsh @@ -180,13 +180,11 @@ alias kej='kubectl edit job' alias kdj='kubectl describe job' alias kdelj='kubectl delete job' -# Only run if the user actually has kubectl installed -if (( ${+_comps[kubectl]} )); then - function kj() { kubectl "$@" -o json | jq; } - function kjx() { kubectl "$@" -o json | fx; } - function ky() { kubectl "$@" -o yaml | yh; } - - compdef kj=kubectl - compdef kjx=kubectl - compdef ky=kubectl +function kj() { kubectl "$@" -o json | jq; } +function kjx() { kubectl "$@" -o json | fx; } +function ky() { kubectl "$@" -o yaml | yh; } +if (( ${+functions[compdef]} )); then + compdef _kubectl kj + compdef _kubectl kjx + compdef _kubectl ky fi From 189774c5d0d989ab45c0765f646803926e08e013 Mon Sep 17 00:00:00 2001 From: Jeroen Claassens Date: Thu, 30 May 2024 20:31:39 +0200 Subject: [PATCH 146/158] feat(yarn)!: add optional support for yarn berry (#12374) BREAKING CHANGE: some `yarn` aliases changed . Please see README for further information. Co-authored-by: Carlo Sala --- plugins/yarn/README.md | 96 +++++++++++++++++++++--------------- plugins/yarn/yarn.plugin.zsh | 36 +++++++++++--- 2 files changed, 84 insertions(+), 48 deletions(-) diff --git a/plugins/yarn/README.md b/plugins/yarn/README.md index 5c7c7f323..f1d089b1f 100644 --- a/plugins/yarn/README.md +++ b/plugins/yarn/README.md @@ -1,7 +1,7 @@ # Yarn plugin -This plugin adds completion for the [Yarn package manager](https://yarnpkg.com/en/), -as well as some aliases for common Yarn commands. +This plugin adds completion for the [Yarn package manager](https://yarnpkg.com/en/), as well as some aliases +for common Yarn commands. To use it, add `yarn` to the plugins array in your zshrc file: @@ -11,48 +11,64 @@ plugins=(... yarn) ## Global scripts directory -It also adds `yarn` global scripts dir (commonly `~/.yarn/bin`) to the `$PATH`. -To disable this feature, set the following style in your `.zshrc`: +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 no ``` +## Yarn Berry + +If you are using Yarn berry (a.k.a. Yarn version 2 or higher) as your global Yarn version you should configure +this plugin to configure its aliases accordingly, set the following style in your `.zshrc`: + +```zsh +zstyle ':omz:plugins:yarn' berry yes +``` + ## Aliases -| Alias | Command | Description | -| ----- | ----------------------------------------- | ----------------------------------------------------------------------------- | -| y | `yarn` | The Yarn command | -| ya | `yarn add` | Install a package in dependencies (`package.json`) | -| yad | `yarn add --dev` | Install a package in devDependencies (`package.json`) | -| yap | `yarn add --peer` | Install a package in peerDependencies (`package.json`) | -| 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 | -| ygu | `yarn global upgrade` | Upgrade packages installed globally to their latest version | -| yh | `yarn help` | Show help for a yarn command | -| yi | `yarn init` | Interactively creates or updates a package.json file | -| yin | `yarn install` | Install dependencies defined in `package.json` | -| yln | `yarn lint` | Run the lint script defined in `package.json` | -| ylnf | `yarn lint --fix` | Run the lint script defined in `package.json`to automatically fix problems | -| yls | `yarn list` | List installed packages | -| yout | `yarn outdated` | Check for outdated package dependencies | -| yp | `yarn pack` | Create a compressed gzip archive of package dependencies | -| yrm | `yarn remove` | Remove installed packages | -| yrun | `yarn run` | Run a defined package script | -| ys | `yarn serve` | Start the dev server | -| yst | `yarn start` | Run the start script defined in `package.json` | -| yt | `yarn test` | Run the test script defined in `package.json` | -| ytc | `yarn test --coverage` | Run the test script defined in `package.json` with coverage | -| yuc | `yarn global upgrade && yarn cache clean` | Upgrade global packages and clean yarn's global cache | -| yui | `yarn upgrade-interactive` | Prompt for which outdated packages to upgrade | -| yuil | `yarn upgrade-interactive --latest` | Prompt for which outdated packages to upgrade to the latest available version | -| yup | `yarn upgrade` | Upgrade packages to their latest version | -| 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 | +- Aliases marked with `*` are only available when using Yarn v1 (non-berry) +- Aliases marked with `b` are only available when using Yarn berry + +| Alias | Command | Description | +| ------------------ | ----------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- | +| y | `yarn` | The Yarn command | +| ya | `yarn add` | Install a package in dependencies (`package.json`) | +| yad | `yarn add --dev` | Install a package in devDependencies (`package.json`) | +| yap | `yarn add --peer` | Install a package in peerDependencies (`package.json`) | +| 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` | +| yh | `yarn help` | Show help for a yarn command | +| yi | `yarn init` | Interactively creates or updates a package.json file | +| yin | `yarn install` | Install dependencies defined in `package.json` | +| yln | `yarn lint` | Run the lint script defined in `package.json` | +| ylnf | `yarn lint --fix` | Run the lint script defined in `package.json`to automatically fix problems | +| yp | `yarn pack` | Create a compressed gzip archive of package dependencies | +| yrm | `yarn remove` | Remove installed packages | +| yrun | `yarn run` | Run a defined package script | +| ys | `yarn serve` | Start the dev server | +| yst | `yarn start` | Run the start script defined in `package.json` | +| yt | `yarn test` | Run the test script defined in `package.json` | +| ytc | `yarn test --coverage` | Run the test script defined in `package.json` with coverage | +| yui | `yarn upgrade-interactive` | Prompt for which outdated packages to upgrade | +| yuil | `yarn upgrade-interactive --latest` (or see `yui` when using [yarn berry](#yarn-berry)) | Prompt for which outdated packages to upgrade to the latest available version | +| yii | `yarn install --frozen-lockfile` (or `yarn install --immutable` when using [yarn berry](#yarn-berry)) | Install dependencies and abort if the lockfile was to be modified | +| yifl | `yii` | Install dependencies and abort if the lockfile was to be modified | +| yup | `yarn upgrade` | Upgrade packages to their latest version | +| 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 | +| 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 | +| ygu`*` | `yarn global upgrade` | Upgrade packages installed globally to their latest version | +| yls`*` | `yarn list` | List installed packages | +| yout`*` | `yarn outdated` | Check for outdated package dependencies | +| yuca`*` | `yarn global upgrade && yarn cache clean` | Upgrade global packages and clean yarn's global cache | +| ydlx`b` | `yarn dlx` | Run a package in a temporary environment. | +| yn`b` | `yarn node` | Run node with the hook already setup. | diff --git a/plugins/yarn/yarn.plugin.zsh b/plugins/yarn/yarn.plugin.zsh index 157044d71..b7d64770d 100644 --- a/plugins/yarn/yarn.plugin.zsh +++ b/plugins/yarn/yarn.plugin.zsh @@ -18,17 +18,11 @@ 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" -alias ygu="yarn global upgrade" alias yh="yarn help" alias yi="yarn init" alias yin="yarn install" alias yln="yarn lint" alias ylnf="yarn lint --fix" -alias yls="yarn list" -alias yout="yarn outdated" alias yp="yarn pack" alias yrm="yarn remove" alias yrun="yarn run" @@ -36,11 +30,37 @@ alias ys="yarn serve" alias yst="yarn start" alias yt="yarn test" alias ytc="yarn test --coverage" -alias yuc="yarn global upgrade && yarn cache clean" alias yui="yarn upgrade-interactive" -alias yuil="yarn upgrade-interactive --latest" alias yup="yarn upgrade" alias yv="yarn version" alias yw="yarn workspace" alias yws="yarn workspaces" alias yy="yarn why" + +# Commands that are specific to the yarn version being used +if zstyle -t ':omz:plugins:yarn' berry; then + # aliases that differ + alias yuil='yui' # --latest flag was removed in yarn berry + alias yii='yarn install --immutable' + alias yifl='yarn install --immutable' + + # unique aliases + alias ydlx="yarn dlx" + alias yn="yarn node" +else + # aliases that differ + alias yuil='yarn upgrade-interactive --latest' + alias yii='yarn install --frozen-lockfile' + alias yifl='yarn install --frozen-lockfile' + + # unique aliases + alias yga="yarn global add" + alias ygls="yarn global list" + alias ygrm="yarn global remove" + alias ygu="yarn global upgrade" + alias yls="yarn list" + alias yout="yarn outdated" + alias yuca="yarn global upgrade && yarn cache clean" +fi + +unset is_yarn_berry From e0c6cb147030350c8e27dbdeda6e8a4d367d1e66 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Fri, 31 May 2024 08:55:53 +0200 Subject: [PATCH 147/158] chore(yarn): remove unneeded line --- plugins/yarn/yarn.plugin.zsh | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/yarn/yarn.plugin.zsh b/plugins/yarn/yarn.plugin.zsh index b7d64770d..5dd329698 100644 --- a/plugins/yarn/yarn.plugin.zsh +++ b/plugins/yarn/yarn.plugin.zsh @@ -62,5 +62,3 @@ else alias yout="yarn outdated" alias yuca="yarn global upgrade && yarn cache clean" fi - -unset is_yarn_berry From 56afe7b3685be8a1ddef25a742016dc76c0a5f8f Mon Sep 17 00:00:00 2001 From: MoetaYuko Date: Mon, 3 Jun 2024 18:53:27 +0800 Subject: [PATCH 148/158] fix(tmux): add completion for alias functions (#12468) --- plugins/tmux/tmux.plugin.zsh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/plugins/tmux/tmux.plugin.zsh b/plugins/tmux/tmux.plugin.zsh index f65598358..399de1ccc 100644 --- a/plugins/tmux/tmux.plugin.zsh +++ b/plugins/tmux/tmux.plugin.zsh @@ -57,6 +57,19 @@ function _build_tmux_alias { tmux $2 $3 \"\$@\" fi }" + + local f s + f="_omz_tmux_alias_${1}" + s=(${(z)2}) + + eval "function ${f}() { + shift words; + words=(tmux ${@:2} \$words); + ((CURRENT+=${#s[@]}+1)) + _tmux + }" + + compdef "$f" "$1" } alias tksv='tmux kill-server' From 695c7456d1a84697e9b86e11e839d5178cae743a Mon Sep 17 00:00:00 2001 From: Albert <87888006+MustCodeAl@users.noreply.github.com> Date: Mon, 3 Jun 2024 05:59:01 -0500 Subject: [PATCH 149/158] docs(stripe): fix typo (#12470) --- plugins/stripe/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/stripe/README.md b/plugins/stripe/README.md index 9f0f32bc2..7e7944d63 100644 --- a/plugins/stripe/README.md +++ b/plugins/stripe/README.md @@ -1,4 +1,4 @@ -# Struoe +# Stripe This plugin provides completion for the [Stripe CLI](https://stripe.com/docs/stripe-cli). From 228d44d55d812725c3c0c26655b28c72eddb4ba6 Mon Sep 17 00:00:00 2001 From: EraPartner <152506497+EraPartner@users.noreply.github.com> Date: Tue, 4 Jun 2024 13:54:42 +0000 Subject: [PATCH 150/158] feat(eza): add icons option (#12469) Co-authored-by: Computer --- plugins/eza/README.md | 10 ++++++++++ plugins/eza/eza.plugin.zsh | 3 +++ 2 files changed, 13 insertions(+) diff --git a/plugins/eza/README.md b/plugins/eza/README.md index 5de935c2c..6fc113eba 100644 --- a/plugins/eza/README.md +++ b/plugins/eza/README.md @@ -55,6 +55,16 @@ If `yes` (default), always add `-g` flag to show the group ownership. Default: `yes` +### `icons` + +```zsh +zstyle ':omz:plugins:eza' 'icons' yes|no +``` + +If `yes`, sets the `--icons` option of `eza`, adding icons for files and folders. + +Default: `no` + ### `size-prefix` ```zsh diff --git a/plugins/eza/eza.plugin.zsh b/plugins/eza/eza.plugin.zsh index 6d7f720bd..79f5a0f71 100644 --- a/plugins/eza/eza.plugin.zsh +++ b/plugins/eza/eza.plugin.zsh @@ -31,6 +31,9 @@ function _configure_eza() { if zstyle -t ':omz:plugins:eza' 'git-status'; then _EZA_TAIL+=("--git") fi + if zstyle -t ':omz:plugins:eza' 'icons'; then + _EZA_TAIL+=("--icons") + fi zstyle -s ':omz:plugins:eza' 'time-style' _val if [[ $_val ]]; then _EZA_TAIL+=("--time-style='$_val'") From e53edd712f28170a0843ce1d2a61efe335484ad4 Mon Sep 17 00:00:00 2001 From: David LJ Date: Tue, 4 Jun 2024 15:55:08 +0200 Subject: [PATCH 151/158] fix(bgnotify): use terminal-notifier args properly (#12467) --- plugins/bgnotify/bgnotify.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index 0e3f2c640..7de6f9a91 100644 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -117,7 +117,7 @@ function bgnotify { local icon="$3" if (( ${+commands[terminal-notifier]} )); then # macOS local term_id=$(bgnotify_programid) - terminal-notifier -message "$message" -title "$title" ${=icon:+-appIcon "$icon"} ${=term_id:+-activate "$term_id" -sender "$term_id"} &>/dev/null + terminal-notifier -message "$message" -title "$title" ${=icon:+-appIcon "$icon"} ${=term_id:+-activate "$term_id"} &>/dev/null elif (( ${+commands[growlnotify]} )); then # macOS growl growlnotify -m "$title" "$message" elif (( ${+commands[notify-send]} )); then From de2e3d9cd3840a1052132d502868aca263debc26 Mon Sep 17 00:00:00 2001 From: "K.B.Dharun Krishna" Date: Tue, 4 Jun 2024 19:26:34 +0530 Subject: [PATCH 152/158] docs: reword alternative installer mirror (#12474) --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index dea36fda7..2d873c514 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,7 @@ Oh My Zsh is installed by running one of the following commands in your terminal | **wget** | `sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | | **fetch** | `sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` | -Alternatively, the installer is also mirrored outside GitHub. Using this URL instead may be required if you're in a country like India or China, that blocks `raw.githubusercontent.com`: +Alternatively, the installer is also mirrored outside GitHub. Using this URL instead may be required if you're in a country like China or India (for certain ISPs), that blocks `raw.githubusercontent.com`: | Method | Command | | :-------- | :------------------------------------------------------------------------------------------------ | @@ -235,7 +235,7 @@ If you're in China, India, or another country that blocks `raw.githubusercontent #### Installing From A Forked Repository -The install script also accepts these variables to allow installation of a different repository: +The install script also accepts these variables to allow the installation of a different repository: - `REPO` (default: `ohmyzsh/ohmyzsh`): this takes the form of `owner/repository`. If you set this variable, the installer will look for a repository at `https://github.com/{owner}/{repository}`. @@ -309,7 +309,7 @@ If you would like to override the functionality of a plugin distributed with Oh -The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and freeBSD systems. If GNU `ls` is installed +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`: @@ -342,7 +342,7 @@ zstyle ':omz:plugins:*' aliases no zstyle ':omz:plugins:git' aliases no ``` -You can combine these in other ways taking into account that more specific scopes takes precedence: +You can combine these in other ways taking into account that more specific scopes take precedence: ```sh # Skip all plugin aliases, except for the git plugin @@ -365,7 +365,7 @@ zstyle ':omz:lib:directories' aliases no ### Disable async git prompt Async prompt functions are an experimental feature (included on April 3, 2024) that allows Oh My Zsh to render prompt information -asyncronously. This can improve prompt rendering performance, but it might not work well with some setups. We hope that's not an +asynchronously. This can improve prompt rendering performance, but it might not work well with some setups. We hope that's not an issue, but if you're seeing problems with this new feature, you can turn it off by setting the following in your .zshrc file, before Oh My Zsh is sourced: From efdfe2f29ac57a9de76391b4e5548edab6a43241 Mon Sep 17 00:00:00 2001 From: "K.B.Dharun Krishna" Date: Tue, 4 Jun 2024 19:27:08 +0530 Subject: [PATCH 153/158] feat(golang): add alias for `go mod tidy` (#12473) --- plugins/golang/README.md | 1 + plugins/golang/golang.plugin.zsh | 1 + 2 files changed, 2 insertions(+) diff --git a/plugins/golang/README.md b/plugins/golang/README.md index 128cc7fbb..80f8cf3b5 100644 --- a/plugins/golang/README.md +++ b/plugins/golang/README.md @@ -25,6 +25,7 @@ plugins=(... golang) | goi | `go install` | Compiles and installs packages to $GOPATH | | gol | `go list` | Lists Go packages | | gom | `go mod` | Access to operations on modules | +| gomt | `go mod tidy` | Tidies up the go.mod file | | gopa | `cd $GOPATH` | Takes you to `$GOPATH` | | gopb | `cd $GOPATH/bin` | Takes you to `$GOPATH/bin` | | gops | `cd $GOPATH/src` | Takes you to `$GOPATH/src` | diff --git a/plugins/golang/golang.plugin.zsh b/plugins/golang/golang.plugin.zsh index 45ccd3a1c..dc4d91845 100644 --- a/plugins/golang/golang.plugin.zsh +++ b/plugins/golang/golang.plugin.zsh @@ -22,6 +22,7 @@ alias goga='go get ./...' alias goi='go install' alias gol='go list' alias gom='go mod' +alias gomt='go mod tidy' alias gopa='cd $GOPATH' alias gopb='cd $GOPATH/bin' alias gops='cd $GOPATH/src' From e898de066473eb725d582a10483d9a2570d221f8 Mon Sep 17 00:00:00 2001 From: Martin Bjeldbak Madsen Date: Sat, 8 Jun 2024 18:47:51 +1000 Subject: [PATCH 154/158] fix(eza): icons tab completion (#12483) --- plugins/eza/eza.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/eza/eza.plugin.zsh b/plugins/eza/eza.plugin.zsh index 79f5a0f71..e95b14749 100644 --- a/plugins/eza/eza.plugin.zsh +++ b/plugins/eza/eza.plugin.zsh @@ -32,7 +32,7 @@ function _configure_eza() { _EZA_TAIL+=("--git") fi if zstyle -t ':omz:plugins:eza' 'icons'; then - _EZA_TAIL+=("--icons") + _EZA_TAIL+=("--icons=auto") fi zstyle -s ':omz:plugins:eza' 'time-style' _val if [[ $_val ]]; then From 4e8099175ef2559f00e8ab5954adccd940a8fd4a Mon Sep 17 00:00:00 2001 From: vincent Date: Sat, 8 Jun 2024 16:48:33 +0800 Subject: [PATCH 155/158] feat(extract): add support for multi-part 7z (#12484) --- plugins/extract/extract.plugin.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index 1c7599195..e2b3111d5 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -80,7 +80,7 @@ EOF (*.rar) unrar x -ad "$full_path" ;; (*.rpm) rpm2cpio "$full_path" | cpio --quiet -id ;; - (*.7z) 7za x "$full_path" ;; + (*.7z | *.7z.[0-9]*) 7za x "$full_path" ;; (*.deb) command mkdir -p "control" "data" ar vx "$full_path" > /dev/null From 8510847ff38a142850e4a065dc3cf09555260ff7 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Sat, 8 Jun 2024 13:32:27 +0200 Subject: [PATCH 156/158] fix(bundler): add completion for `bundler` bin as well Closes #12482 --- plugins/bundler/_bundler | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/bundler/_bundler b/plugins/bundler/_bundler index 51678dd7c..6613cc68a 100644 --- a/plugins/bundler/_bundler +++ b/plugins/bundler/_bundler @@ -1,4 +1,4 @@ -#compdef bundle +#compdef bundle bundler local curcontext="$curcontext" state line _gems _opts ret=1 From cedbb9e22846eb4b1fff0c47c3c4dbafb73601f0 Mon Sep 17 00:00:00 2001 From: "ohmyzsh[bot]" <54982679+ohmyzsh[bot]@users.noreply.github.com> Date: Sun, 9 Jun 2024 08:43:02 +0200 Subject: [PATCH 157/158] feat(history-substring-search): update to 87ce96b1 (#12486) Co-authored-by: ohmyzsh[bot] <54982679+ohmyzsh[bot]@users.noreply.github.com> --- .github/dependencies.yml | 2 +- plugins/history-substring-search/README.md | 8 ++++---- .../history-substring-search/history-substring-search.zsh | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/dependencies.yml b/.github/dependencies.yml index d3b269361..ce28e34c9 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -21,7 +21,7 @@ dependencies: plugins/history-substring-search: repo: zsh-users/zsh-history-substring-search branch: master - version: 8dd05bfcc12b0cd1ee9ea64be725b3d9f713cf64 + version: 87ce96b1862928d84b1afe7c173316614b30e301 precopy: | set -e rm -f zsh-history-substring-search.plugin.zsh diff --git a/plugins/history-substring-search/README.md b/plugins/history-substring-search/README.md index 4be744c4c..71a389535 100644 --- a/plugins/history-substring-search/README.md +++ b/plugins/history-substring-search/README.md @@ -57,13 +57,13 @@ Using [antigen](https://github.com/zsh-users/antigen): 1. Add the `antigen bundle` command just before `antigen apply`, like this: -``` +``` antigen bundle zsh-users/zsh-history-substring-search antigen apply ``` - + 2. Then, **after** `antigen apply`, add the key binding configurations, like this: - + ``` # zsh-history-substring-search configuration bindkey '^[[A' history-substring-search-up # or '\eOA' @@ -120,7 +120,7 @@ Usage bindkey "$terminfo[kcuu1]" history-substring-search-up bindkey "$terminfo[kcud1]" history-substring-search-down - Users have also observed that `[OA` and `[OB` are correct values, + Users have also observed that `[OA` and `[OB` are correct values, _even if_ these were not the observed values. If you are having trouble with the observed values, give these a try. diff --git a/plugins/history-substring-search/history-substring-search.zsh b/plugins/history-substring-search/history-substring-search.zsh index 471cc9ad1..2137b7950 100644 --- a/plugins/history-substring-search/history-substring-search.zsh +++ b/plugins/history-substring-search/history-substring-search.zsh @@ -406,7 +406,7 @@ _history-substring-search-end() { # For debugging purposes: # zle -R "mn: "$_history_substring_search_match_index" m#: "${#_history_substring_search_matches} - # read -k -t 200 && zle -U $REPLY + # read -k -t 200 && zle -U -- "$REPLY" # # When this function returns, z-sy-h runs its line-pre-redraw hook. It has no @@ -421,7 +421,7 @@ _history-substring-search-end() { # before removing search highlight and exiting. This ensures no highlights # are left lingering after search is finished. # - read -k -t ${HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_TIMEOUT:-1} && zle -U $REPLY + read -k -t ${HISTORY_SUBSTRING_SEARCH_HIGHLIGHT_TIMEOUT:-1} && zle -U -- "$REPLY" region_highlight=( "${(@)region_highlight:#*${highlight_memo}*}" ) fi From 5a5d5eb85b245e0c6bc561134fdb0fd0bf9bbe10 Mon Sep 17 00:00:00 2001 From: Michal Szymanski <55950820+misiektoja@users.noreply.github.com> Date: Tue, 11 Jun 2024 01:25:53 +0200 Subject: [PATCH 158/158] feat(forklift): add support for ForkLift 4 (#12490) (#12491) --- plugins/forklift/forklift.plugin.zsh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/forklift/forklift.plugin.zsh b/plugins/forklift/forklift.plugin.zsh index 848aedabf..4bc74958d 100644 --- a/plugins/forklift/forklift.plugin.zsh +++ b/plugins/forklift/forklift.plugin.zsh @@ -2,6 +2,7 @@ # Author: Adam Strzelecki nanoant.com, modified by Bodo Tasche bitboxer.de # Updated to support ForkLift 2 and ForkLift 3 by Johan Kaving # Updated to support ForkLift from Setapp by Paul Rudkin +# Updated to support ForkLift 4 by Michal Szymanski (misiektoja) # # Usage: # fl [] @@ -110,6 +111,11 @@ function fl { tell pop over of list of group of splitter group of splitter group of topWindow set value of text field 1 to "$PWD" end tell + else if forkLiftVersion starts with "4" then + tell pop over of list of group of splitter group of splitter group of topWindow + keystroke "$PWD" + delay 0.1 + end tell else tell sheet 1 of topWindow set value of text field 1 to "$PWD"