From f91dd252838ceceaa54da95ff6d335e07d335e3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 8 Aug 2024 20:40:13 +0200 Subject: [PATCH 01/47] refactor(vault)!: remove deprecated `vault` plugin in favor of official completion BREAKING CHANGE: the `vault` plugin added completion for the `vault` CLI. Since a while back there is already official completion. This change removes the deprecated plugin. --- plugins/vault/README.md | 15 -- plugins/vault/_vault | 400 ---------------------------------------- 2 files changed, 415 deletions(-) delete mode 100644 plugins/vault/README.md delete mode 100644 plugins/vault/_vault diff --git a/plugins/vault/README.md b/plugins/vault/README.md deleted file mode 100644 index 69051d2b2..000000000 --- a/plugins/vault/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Vault plugin - -Note: this plugin is deprecated. Use the [official autocompletion](https://www.vaultproject.io/docs/commands/index.html#autocompletion) instead. - -------- - -Adds autocomplete options for all [vault](https://www.vaultproject.io) commands. - -To use it, add `vault` to the plugins array in your zshrc file: - -```zsh -plugins=(... vault) -``` - -Crafted with <3 by Valentin Bud ([@valentinbud](https://twitter.com/valentinbud)) diff --git a/plugins/vault/_vault b/plugins/vault/_vault deleted file mode 100644 index f6bd3517e..000000000 --- a/plugins/vault/_vault +++ /dev/null @@ -1,400 +0,0 @@ -#compdef vault - -typeset -a main_args -main_args=( - '(-version)-version[Prints the Vault version]' - '(-help)-help[Prints Vault Help]' -) - -typeset -a general_args -general_args=( - '(-help)-help[Prints Help]' - '(-address)-address=-[The address of the Vault server. Overrides the VAULT_ADDR environment variable if set.]:address:' - '(-ca-cert)-ca-cert=-[Path to a PEM encoded CA cert file to use to verify the Vault server SSL certificate. Overrides the VAULT_CACERT environment variable if set.]:file:_files -g "*.pem"' - '(-ca-path)-ca-path=-[Path to a directory of PEM encoded CA cert files to verify the Vault server SSL certificate. If both -ca-cert and -ca-path are specified, -ca-path is used.Overrides the VAULT_CAPATH environment variable if set.]:directory:_directories' - '(-client-cert)-client-cert=-[Path to a PEM encoded client certificate for TLS authentication to the Vault server. Must also specify -client-key. Overrides the VAULT_CLIENT_CERT environment variable if set.]:file:_files -g "*.pem"' - '(-client-key)-client-key=-[Path to an unencrypted PEM encoded private key matching the client certificate from -client-cert. Overrides the VAULT_CLIENT_KEY environment variable if set.]:file:_files -g "*.pem"' - '(-tls-skip-verify)-tls-skip-verify[Do not verify TLS certificate. This is highly not recommended. Verification will also be skipped if VAULT_SKIP_VERIFY is set.]' -) - -typeset -a audit_enable_args -audit_enable_args=( - '(-description)-description=-[A human-friendly description for the backend. This shows up only when querying the enabled backends.]:description:' - '(-id)-id=-[Specify a unique ID for this audit backend. This is purely for referencing this audit backend. By default this will be the backend type.]:id:' -) - -typeset -a auth_args -auth_args=( - '(-method)-method=-[Outputs help for the authentication method with the given name for the remote server. If this authentication method is not available, exit with code 1.]:method:(cert ldap github userpass app-id)' - '(-method-help)-method-help[If set, the help for the selected method will be shown.]' - '(-methods)-methods[List the available auth methods.]' - '(-no-verify)-no-verify[Do not verify the token after creation; avoids a use count]' -) - -typeset -a auth_enable_args -auth_enable_args=( - '(-description)-description=-[Human-friendly description of the purpose for the auth provider. This shows up in the auth-list command.]:description:' - '(-path)-path=-[Mount point for the auth provider. This defaults to the type of the mount. This will make the auth provider available at "/auth/"]:path:' -) - -typeset -a init_args -init_args=( - '(-key-shares)-key-shares=-[(default: 5) The number of key shares to split the master key into.]:keyshares:' - '(-key-threshold)-key-threshold=-[(default: 3) The number of key shares required to reconstruct the master key.]:keythreshold:' - '(-pgp-keys)-pgp-keys[If provided, must be a comma-separated list of files on disk containing binary- or base64-format public PGP keys. The number of files must match "key-shares". The output unseal keys will encrypted and hex-encoded, in order, with the given public keys. If you want to use them with the "vault unseal" command, you will need to hex decode and decrypt; this will be the plaintext unseal key.]:pgpkeys:_files' -) - -typeset -a mount_tune_args -mount_tune_args=( - '(-default-lease-ttl)-default-lease-ttl=-[Default lease time-to-live for this backend. If not specified, uses the system default, or the previously set value. Set to "system" to explicitly set it to use the system default.]:defaultleasettl:' - '(-max-lease-ttl)-max-lease-ttl=-[Max lease time-to-live for this backend. If not specified, uses the system default, or the previously set value. Set to "system" to explicitly set it to use the system default.]:maxleasettl:' -) - -typeset -a mount_args -mount_args=( - $mount_tune_args - '(-path)-path=-[Mount point for the logical backend. This defaults to the type of the mount.]:path:' - '(-description)-description=-[Human-friendly description of the purpose for the mount. This shows up in the mounts command.]:description:' -) - -typeset -a rekey_args -rekey_args=( - $init_args - '(-init)-init[Initialize the rekey operation by setting the desired number of shares and the key threshold. This can only be done if no rekey is already initiated.]:init:' - '(-cancel)-cancel[Reset the rekey process by throwing away prior keys and the rekey configuration.]:cancel:' - '(-status)-status[Prints the status of the current rekey operation. This can be used to see the status without attempting to provide an unseal key.]:status:' -) - -typeset -a ssh_args -ssh_args=( - '(-role)-role[Role to be used to create the key. ]:role:' - '(-no-exec)-no-exec[Shows the credentials but does not establish connection.]:noexec:' - '(-mount-point)-mount-point[Mount point of SSH backend. If the backend is mounted at "ssh", which is the default as well, this parameter can be skipped.]:mountpoint:' - '(-format)-format[If no-exec option is enabled, then the credentials will be printed out and SSH connection will not be established. The format of the output can be "json" or "table". JSON output is useful when writing scripts. Default is "table".]:format:(json table)' -) - -typeset -a token_create_args -token_create_args=( - '(-id)-id=-[The token value that clients will use to authenticate with vault. If not provided this defaults to a 36 character UUID. A root token is required to specify the ID of a token.]:id:' - '(-display-name)-display-name=-[A display name to associate with this token. This is a non-security sensitive value used to help identify created secrets, i.e. prefixes.]:displayname:' - '(-ttl)-ttl=-[TTL to associate with the token. This option enables the tokens to be renewable.]:ttl:' - '*-metadata=-[Metadata to associate with the token. This shows up in the audit log. This can be specified multiple times.]:metadata:' - '(-orphan)-orphan[If specified, the token will have no parent. Only root tokens can create orphan tokens. This prevents the new token from being revoked with your token.]:orphan:' - '(-no-default-policy)-no-default-policy[If specified, the token will not have the "default" policy included in its policy set.]:nodefaultpolicy:' - '*-policy=-[Policy to associate with this token. This can be specified multiple times.]:policy:__vault_policies' - '(-use-limit)-use-limit=-[The number of times this token can be used until it is automatically revoked.]:uselimit:' - '(-format)-format=-[The format for output. By default it is a whitespace-delimited table. This can also be json.]:format:(json table)' -) - -typeset -a server_args -server_args=( - '*-config=-[Path to the configuration file or directory. This can be specified multiple times. If it is a directory, all files with a ".hcl" or ".json" suffix will be loaded.]:config:_files' - '-dev[Enables Dev mode. In this mode, Vault is completely in-memory and unsealed. Do not run the Dev server in production!]:dev:' - '-log-level=-[Log verbosity. Defaults to "info", will be outputtedto stderr. Supported values: "trace", "debug", "info", "warn", "err"]:loglevel:(trace debug info warn err)' -) - -_vault_audit-list() { - _arguments : \ - ${general_args[@]} && ret=0 -} - -_vault_audit-disable() { - # vault audit-list doesn't print the backend id so for now - # no *smart* autocompletion for this subcommand. - _arguments : \ - ${general_args[@]} \ - ':::(file syslog)' && ret=0 -} - -_vault_audit-enable() { - _arguments : \ - ${general_args[@]} \ - ${audit_enable_args[@]} \ - ': :->backends' \ - '*:: :->backendconfig' && ret=0 - - case $state in - backends) - local -a backends - backends=( - 'file:The "file" audit backend writes audit logs to a file.' - 'syslog:The "syslog" audit backend writes audit logs to syslog.' - ) - _describe -t backends 'vault audit backends' backends && ret=0 - ;; - backendconfig) - case ${line[1]} in - file) - _values -w "Audit Backend File" \ - 'path[(required) - The path to where the file will be written. If this path exists, the audit backend will append to it.]:file:_files' \ - 'log_raw[(optional) Should security sensitive information be logged raw. Defaults to "false".]:log_raw:(true false)' && ret=0 - ;; - syslog) - _values -w "Audit Backend Syslog" \ - 'facility[(optional) - The syslog facility to use. Defaults to "AUTH".]:facility:(kern user mail daemon auth syslog lpr news uucp authpriv ftp cron local0 local1 local2 local3 local4 local5 local6 local7)' \ - 'tag[(optional) - The syslog tag to use. Defaults to "vault".]:tag:' \ - 'log_raw[(optional) Should security sensitive information be logged raw.]:log_raw:(true false)' && ret=0 - ;; - esac - ;; - esac -} - -_vault_auth() { - _arguments : \ - ${general_args[@]} \ - ${auth_args[@]} && ret=0 -} - -_vault_auth-enable() { - _arguments : \ - ${general_args[@]} \ - ${auth_enable_args[@]} \ - ':::(cert ldap github userpass app-id)' && ret=0 -} - -__vault_auth_methods() { - local -a authmethods - authmethods=($(vault auth -methods | awk 'NR>1{split ($1,a,"/"); print a[1]":["$2"]"}')) - _describe -t authmethods 'authmethods' authmethods && ret=0 -} - -_vault_auth-disable() { - _arguments : \ - ${general_args[@]} \ - ':::__vault_auth_methods' && ret=0 - -} - -_vault_init() { - _arguments : \ - ${general_args[@]} \ - ${init_args[@]} && ret=0 -} - -_vault_key-status() { - _arguments : \ - ${general_args[@]} && ret=0 -} - -__vault_mounts() { - local -a mounts - mounts=($(vault mounts | awk 'NR>1{split ($1,a,"/"); print a[1]":["$2"]"}')) - _describe -t mounts 'mounts' mounts && ret=0 -} - -_vault_mounts() { - _arguments : \ - ${general_args[@]} && ret=0 -} - -_vault_mount() { - # to find out how many types of backends are there - _arguments : \ - ${general_args[@]} \ - ${mount_args[@]} \ - ':::(generic ssh)' && ret=0 -} - -_vault_mount-tune() { - _arguments : \ - ${general_args[@]} \ - ${mount_tune_args[@]} \ - ':::__vault_mounts' && ret=0 -} - -_vault_unmount() { - _arguments : \ - ${general_args[@]} \ - ':::__vault_mounts' && ret=0 -} - -_vault_remount() { - _arguments : \ - ${general_args[@]} \ - ':::__vault_mounts' \ - ':::' && ret=0 -} - -__vault_policies() { - local -a policies - policies=($(vault policies | awk '{print $1":["$1"]"}')) - _describe -t policies 'policies' policies && ret=0 -} - -_vault_policies() { - _arguments : \ - ${general_args[@]} \ - ':::__vault_policies' && ret=0 -} - -_vault_policy-delete() { - _arguments : \ - ${general_args[@]} \ - ':::__vault_policies' && ret=0 -} - -_vault_policy-write() { - _arguments : \ - ${general_args[@]} \ - ': ::' \ - '::policy:_files' && ret=0 -} - -_vault_status() { - _arguments : \ - ${general_args[@]} && ret=0 -} - -_vault_rekey() { - _arguments : \ - ${general_args[@]} \ - ${rekey_args[@]} \ - ': ::' && ret=0 -} - -_vault_rotate() { - _arguments : \ - ${general_args[@]} && ret=0 -} - -_vault_seal() { - _arguments : \ - ${general_args[@]} && ret=0 -} - -_vault_ssh() { - _arguments : \ - ${general_args[@]} \ - ${ssh_args[@]} \ - ': ::' && ret=0 -} - -_vault_token-create() { - _arguments : \ - ${general_args[@]} \ - ${token_create_args[@]} && ret=0 -} - -_vault_token-renew() { - _arguments : \ - ${general_args[@]} \ - '(-format)-format=-[The format for output. By default it is a whitespace-delimited table. This can also be json.]:format:(json table)' \ - ': ::' \ - ': ::' && ret=0 -} - -_vault_token-revoke() { - _arguments : \ - ${general_args[@]} \ - '(-mode)-mode=-[The type of revocation to do. See the documentation above for more information.]:mode:( orphan path)' \ - ': ::' && ret=0 -} - -_vault_unseal() { - _arguments : \ - ${general_args[@]} \ - '(-reset)-reset[Reset the unsealing process by throwing away prior keys in process to unseal the vault.]:reset:' \ - ': ::' && ret=0 -} - -_vault_version() { - # no args -} - -_vault_delete() { - _arguments : \ - ${general_args[@]} \ - ': ::' && ret=0 -} - -_vault_path-help() { - _arguments : \ - ${general_args[@]} \ - ': ::' && ret=0 -} - -_vault_revoke() { - _arguments : \ - ${general_args[@]} \ - '(-format)-format=-[The format for output. By default it is a whitespace-delimited table. This can also be json.]:format:(json table)' \ - ': ::' \ - ': ::' && ret=0 -} - -_vault_server() { - _arguments : \ - ${server_args[@]} && ret=0 - -} - -_vault_write() { - _arguments : \ - ${general_args[@]} \ - '(-f -force)'{-f,-force}'[Force the write to continue without any data values specified. This allows writing to keys that do not need or expect any fields to be specified.]:force:' \ - ': ::' \ - ': ::' && ret=0 -} - -_vault_read() { - _arguments : \ - ${general_args[@]} \ - '(-format)-format=-[The format for output. By default it is a whitespace-delimited table. This can also be json.]:format:(json table)' \ - '(-field)-field=-[If included, the raw value of the specified field will be output raw to stdout.]:field:' \ - ': ::' && ret=0 -} - -_vault_commands() { - local -a commands - - commands=( - "delete":"Delete operation on secrets in Vault" - "path-help":"Look up the help for a path" - "read":"Read data or secrets from Vault" - "renew":"Renew the lease of a secret" - "revoke":"Revoke a secret" - "server":"Start a Vault server" - "status":"Outputs status of whether Vault is sealed and if HA mode is enabled" - "write":"Write secrets or configuration into Vault" - "audit-disable":"Disable an audit backend" - "audit-enable":"Enable an audit backend" - "audit-list":"Lists enabled audit backends in Vault" - "auth":"Prints information about how to authenticate with Vault" - "auth-disable":"Disable an auth provider" - "auth-enable":"Enable a new auth provider" - "init":"Initialize a new Vault server" - "key-status":"Provides information about the active encryption key" - "mount":"Mount a logical backend" - "mount-tune":"Tune mount configuration parameters" - "mounts":"Lists mounted backends in Vault" - "policies":"List the policies on the server" - "policy-delete":"Delete a policy from the server" - "policy-write":"Write a policy to the server" - "rekey":"Rekeys Vault to generate new unseal keys" - "remount":"Remount a secret backend to a new path" - "rotate":"Rotates the backend encryption key used to persist data" - "seal":"Seals the vault server" - "ssh":"Initiate a SSH session" - "token-create":"Create a new auth token" - "token-renew":"Renew an auth token if there is an associated lease" - "token-revoke":"Revoke one or more auth tokens" - "unmount":"Unmount a secret backend" - "unseal":"Unseals the vault server" - "version":"Prints the Vault version" - ) - - _describe -t commands 'vault command' commands && ret=0 -} - -local curcontext=$curcontext ret=1 -_arguments : \ - ${main_args[@]} \ - '*:: :->subcommands' && ret=0 -if ((CURRENT == 1 )); then - _vault_commands && ret=0 -fi -if [[ $state == subcommands ]]; then - # (( CURRENT -- )) - curcontext="${curcontext%:*:*}:vault-$words[1]:" - _call_function ret _vault_$words[1] -fi From ff62d39f023fbe2872078ce82ea9704b1bf09ea6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 8 Aug 2024 20:41:36 +0200 Subject: [PATCH 02/47] refactor(docker-machine)!: remove plugin for unsupported Docker Machine BREAKING CHANGE: the `docker-machine` plugin is removed as it was deprecated and unsupported years ago. Use Docker Desktop instead. --- plugins/docker-machine/README.md | 19 - plugins/docker-machine/_docker-machine | 359 ------------------ .../docker-machine/docker-machine.plugin.zsh | 33 -- 3 files changed, 411 deletions(-) delete mode 100644 plugins/docker-machine/README.md delete mode 100644 plugins/docker-machine/_docker-machine delete mode 100644 plugins/docker-machine/docker-machine.plugin.zsh diff --git a/plugins/docker-machine/README.md b/plugins/docker-machine/README.md deleted file mode 100644 index 308a6cfdb..000000000 --- a/plugins/docker-machine/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# docker-machine plugin for oh my zsh - -### Usage - -#### docker-vm -Will create a docker-machine with the name "dev" (required only once) -To create a second machine call "docker-vm foobar" or pass any other name - -#### docker-up -This will start your "dev" docker-machine (if necessary) and set it as the active one -To start a named machine use "docker-up foobar" - -#### docker-switch dev -Use this to activate a running docker-machine (or to switch between multiple machines) -You need to call either this or docker-up when opening a new terminal - -#### docker-stop -This will stop your "dev" docker-machine -To stop a named machine use "docker-stop foobar" \ No newline at end of file diff --git a/plugins/docker-machine/_docker-machine b/plugins/docker-machine/_docker-machine deleted file mode 100644 index 17bcd3598..000000000 --- a/plugins/docker-machine/_docker-machine +++ /dev/null @@ -1,359 +0,0 @@ -#compdef docker-machine -# Description -# ----------- -# zsh completion for docker-machine -# https://github.com/leonhartX/docker-machine-zsh-completion -# ------------------------------------------------------------------------- -# Version -# ------- -# 0.1.1 -# ------------------------------------------------------------------------- -# Authors -# ------- -# * Ke Xu -# ------------------------------------------------------------------------- -# Inspiration -# ----------- -# * @sdurrheimer docker-compose-zsh-completion https://github.com/sdurrheimer/docker-compose-zsh-completion -# * @ilkka _docker-machine - - -__docker-machine_get_hosts() { - [[ $PREFIX = -* ]] && return 1 - local state - declare -a hosts - state=$1; shift - if [[ $state != all ]]; then - hosts=(${(f)"$(_call_program commands docker-machine ls -q --filter state=$state)"}) - else - hosts=(${(f)"$(_call_program commands docker-machine ls -q)"}) - fi - _describe 'host' hosts "$@" && ret=0 - return ret -} - -__docker-machine_hosts_with_state() { - declare -a hosts - hosts=(${(f)"$(_call_program commands docker-machine ls -f '{{.Name}}\:{{.DriverName}}\({{.State}}\)\ {{.URL}}')"}) - _describe 'host' hosts -} - -__docker-machine_hosts_all() { - __docker-machine_get_hosts all "$@" -} - -__docker-machine_hosts_running() { - __docker-machine_get_hosts Running "$@" -} - -__docker-machine_get_swarm() { - declare -a swarms - swarms=(${(f)"$(_call_program commands docker-machine ls -f {{.Swarm}} | awk '{print $1}')"}) - _describe 'swarm' swarms -} - -__docker-machine_hosts_and_files() { - _alternative "hosts:host:__docker-machine_hosts_all -qS ':'" 'files:files:_path_files' -} - -__docker-machine_filters() { - [[ $PREFIX = -* ]] && return 1 - integer ret=1 - - if compset -P '*='; then - case "${${words[-1]%=*}#*=}" in - (driver) - _describe -t driver-filter-opts "driver filter" opts_driver && ret=0 - ;; - (swarm) - __docker-machine_get_swarm && ret=0 - ;; - (state) - opts_state=('Running' 'Paused' 'Saved' 'Stopped' 'Stopping' 'Starting' 'Error') - _describe -t state-filter-opts "state filter" opts_state && ret=0 - ;; - (name) - __docker-machine_hosts_all && ret=0 - ;; - (label) - _message 'label' && ret=0 - ;; - *) - _message 'value' && ret=0 - ;; - esac - else - opts=('driver' 'swarm' 'state' 'name' 'label') - _describe -t filter-opts "filter" opts -qS "=" && ret=0 - fi - return ret -} - -__get_swarm_discovery() { - declare -a masters services - local service - services=() - masters=($(docker-machine ls -f {{.Swarm}} |grep '(master)' |awk '{print $1}')) - for master in $masters; do - service=${${${(f)"$(_call_program commands docker-machine inspect -f '{{.HostOptions.SwarmOptions.Discovery}}:{{.Name}}' $master)"}/:/\\:}} - services=($services $service) - done - _describe -t services "swarm service" services && ret=0 - return ret -} - -__get_create_argument() { - typeset -g docker_machine_driver - if [[ CURRENT -le 2 ]]; then - docker_machine_driver="none" - elif [[ CURRENT > 2 && $words[CURRENT-2] = '-d' || $words[CURRENT-2] = '--driver' ]]; then - docker_machine_driver=$words[CURRENT-1] - elif [[ $words[CURRENT-1] =~ '^(-d|--driver)=' ]]; then - docker_machine_driver=${${words[CURRENT-1]}/*=/} - fi - local driver_opt_cmd - local -a opts_provider opts_common opts_read_argument - opts_read_argument=( - ": :->argument" - ) - opts_common=( - $opts_help \ - '(--driver -d)'{--driver=,-d=}'[Driver to create machine with]:dirver:->driver-option' \ - '--engine-install-url=[Custom URL to use for engine installation]:url' \ - '*--engine-opt=[Specify arbitrary flags to include with the created engine in the form flag=value]:flag' \ - '*--engine-insecure-registry=[Specify insecure registries to allow with the created engine]:registry' \ - '*--engine-registry-mirror=[Specify registry mirrors to use]:mirror' \ - '*--engine-label=[Specify labels for the created engine]:label' \ - '--engine-storage-driver=[Specify a storage driver to use with the engine]:storage-driver:->storage-driver-option' \ - '*--engine-env=[Specify environment variables to set in the engine]:environment' \ - '--swarm[Configure Machine with Swarm]' \ - '--swarm-image=[Specify Docker image to use for Swarm]:image' \ - '--swarm-master[Configure Machine to be a Swarm master]' \ - '--swarm-discovery=[Discovery service to use with Swarm]:service:->swarm-service' \ - '--swarm-strategy=[Define a default scheduling strategy for Swarm]:strategy:(spread binpack random)' \ - '*--swarm-opt=[Define arbitrary flags for swarm]:flag' \ - '*--swarm-join-opt=[Define arbitrary flags for Swarm join]:flag' \ - '--swarm-host=[ip/socket to listen on for Swarm master]:host' \ - '--swarm-addr=[addr to advertise for Swarm (default: detect and use the machine IP)]:address' \ - '--swarm-experimental[Enable Swarm experimental features]' \ - '*--tls-san=[Support extra SANs for TLS certs]:option' - ) - driver_opt_cmd="docker-machine create -d $docker_machine_driver | grep $docker_machine_driver | sed -e 's/\(--.*\)\ *\[\1[^]]*\]/*\1/g' -e 's/\(\[[^]]*\)/\\\\\\1\\\\/g' -e 's/\".*\"\(.*\)/\1/g' | awk '{printf \"%s[\", \$1; for(i=2;i<=NF;i++) {printf \"%s \", \$i}; print \"]\"}'" - if [[ $docker_machine_driver != "none" ]]; then - opts_provider=(${(f)"$(_call_program commands $driver_opt_cmd)"}) - _arguments \ - $opts_provider \ - $opts_read_argument \ - $opts_common && ret=0 - else - _arguments $opts_common && ret=0 - fi - case $state in - (driver-option) - _describe -t driver-option "driver" opts_driver && ret=0 - ;; - (storage-driver-option) - _describe -t storage-driver-option "storage driver" opts_storage_driver && ret=0 - ;; - (swarm-service) - __get_swarm_discovery && ret=0 - ;; - (argument) - ret=0 - ;; - esac - return ret -} - - -__docker-machine_subcommand() { - local -a opts_help - opts_help=("(- :)--help[Print usage]") - local -a opts_only_host opts_driver opts_storage_driver opts_state - opts_only_host=( - "$opts_help" - "*:host:__docker-machine_hosts_all" - ) - opts_driver=('amazonec2' 'azure' 'digitalocean' 'exoscale' 'generic' 'google' 'hyperv' 'none' 'openstack' 'rackspace' 'softlayer' 'virtualbox' 'vmwarefusion' 'vmwarevcloudair' 'vmwarevsphere') - opts_storage_driver=('overlay' 'aufs' 'btrfs' 'devicemapper' 'vfs' 'zfs') - integer ret=1 - - case "$words[1]" in - (active) - _arguments \ - $opts_help \ - '(--timeout -t)'{--timeout=,-t=}'[Timeout in seconds, default to 10s]:seconds' && ret=0 - ;; - (config) - _arguments \ - $opts_help \ - '--swarm[Display the Swarm config instead of the Docker daemon]' \ - "*:host:__docker-machine_hosts_all" && ret=0 - ;; - (create) - __get_create_argument - ;; - (env) - _arguments \ - $opts_help \ - '--swarm[Display the Swarm config instead of the Docker daemon]' \ - '--shell=[Force environment to be configured for a specified shell: \[fish, cmd, powershell\], default is auto-detect]:shell' \ - '(--unset -u)'{--unset,-u}'[Unset variables instead of setting them]' \ - '--no-proxy[Add machine IP to NO_PROXY environment variable]' \ - '*:host:__docker-machine_hosts_running' && ret=0 - ;; - (help) - _arguments ':subcommand:__docker-machine_commands' && ret=0 - ;; - (inspect) - _arguments \ - $opts_help \ - '(--format -f)'{--format=,-f=}'[Format the output using the given go template]:template' \ - '*:host:__docker-machine_hosts_all' && ret=0 - ;; - (ip) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_running' && ret=0 - ;; - (kill) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_with_state' && ret=0 - ;; - (ls) - _arguments \ - $opts_help \ - '(--quiet -q)'{--quiet,-q}'[Enable quiet mode]' \ - '*--filter=[Filter output based on conditions provided]:filter:->filter-options' \ - '(--timeout -t)'{--timeout=,-t=}'[Timeout in seconds, default to 10s]:seconds' \ - '(--format -f)'{--format=,-f=}'[Pretty-print machines using a Go template]:template' && ret=0 - case $state in - (filter-options) - __docker-machine_filters && ret=0 - ;; - esac - ;; - (provision) - _arguments $opts_only_host && ret=0 - ;; - (regenerate-certs) - _arguments \ - $opts_help \ - '(--force -f)'{--force,-f}'[Force rebuild and do not prompt]' \ - '*:host:__docker-machine_hosts_all' && ret=0 - ;; - (restart) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_with_state' && ret=0 - ;; - (rm) - _arguments \ - $opts_help \ - '(--force -f)'{--force,-f}'[Remove local configuration even if machine cannot be removed, also implies an automatic yes (`-y`)]' \ - '-y[Assumes automatic yes to proceed with remove, without prompting further user confirmation]' \ - '*:host:__docker-machine_hosts_with_state' && ret=0 - ;; - (scp) - _arguments \ - $opts_help \ - '(--recursive -r)'{--recursive,-r}'[Copy files recursively (required to copy directories))]' \ - '*:files:__docker-machine_hosts_and_files' && ret=0 - ;; - (ssh) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_running' && ret=0 - ;; - (start) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_with_state' && ret=0 - ;; - (status) - _arguments $opts_only_host && ret=0 - ;; - (stop) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_with_state' && ret=0 - ;; - (upgrade) - _arguments $opts_only_host && ret=0 - ;; - (url) - _arguments \ - $opts_help \ - '*:host:__docker-machine_hosts_running' && ret=0 - ;; - esac - - return ret -} - - -__docker-machine_commands() { - local cache_policy - - zstyle -s ":completion:${curcontext}:" cache-policy cache_policy - if [[ -z "$cache_policy" ]]; then - zstyle ":completion:${curcontext}:" cache-policy __docker-machine_caching_policy - fi - - if ( [[ ${+_docker_machine_subcommands} -eq 0 ]] || _cache_invalid docker_machine_subcommands) \ - && ! _retrieve_cache docker_machine_subcommands; - then - local -a lines - lines=(${(f)"$(_call_program commands docker-machine 2>&1)"}) - _docker_machine_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/$'\t'##/:}) - (( $#_docker_machine_subcommands > 0 )) && _store_cache docker_machine_subcommands _docker_machine_subcommands - fi - _describe -t docker-machine-commands "docker-machine command" _docker_machine_subcommands -} - -__docker-machine_caching_policy() { - oldp=( "$1"(Nmh+1) ) - (( $#oldp )) -} - -_docker-machine() { - if [[ $service != docker-machine ]]; then - _call_function - _$service - return - fi - - local curcontext="$curcontext" state line - integer ret=1 - typeset -A opt_args - - _arguments -C \ - "(- :)"{-h,--help}"[Show help]" \ - "(-D --debug)"{-D,--debug}"[Enable debug mode]" \ - '(-s --storage-path)'{-s,--storage-path}'[Configures storage path]:file:_files' \ - '--tls-ca-cert[CA to verify remotes against]:file:_files' \ - '--tls-ca-key[Private key to generate certificates]:file:_files' \ - '--tls-client-cert[Client cert to use for TLS]:file:_files' \ - '--tls-client-key[Private key used in client TLS auth]:file:_files' \ - '--github-api-token[Token to use for requests to the GitHub API]' \ - '--native-ssh[Use the native (Go-based) SSH implementation.]' \ - '--bugsnag-api-token[Bugsnag API token for crash reporting]' \ - '(- :)'{-v,--version}'[Print the version]' \ - "(-): :->command" \ - "(-)*:: :->option-or-argument" && ret=0 - - case $state in - (command) - __docker-machine_commands && ret=0 - ;; - (option-or-argument) - curcontext=${curcontext%:*:*}:docker-machine-$words[1]: - __docker-machine_subcommand && ret=0 - ret=0 - ;; - esac - - return ret -} - -_docker-machine "$@" diff --git a/plugins/docker-machine/docker-machine.plugin.zsh b/plugins/docker-machine/docker-machine.plugin.zsh deleted file mode 100644 index 235d90ee8..000000000 --- a/plugins/docker-machine/docker-machine.plugin.zsh +++ /dev/null @@ -1,33 +0,0 @@ -DEFAULT_MACHINE="default" - -docker-up() { - if [ -z "$1" ] - then - docker-machine start "${DEFAULT_MACHINE}" - eval $(docker-machine env "${DEFAULT_MACHINE}") - else - docker-machine start $1 - eval $(docker-machine env $1) - fi - echo $DOCKER_HOST -} -docker-stop() { - if [ -z "$1" ] - then - docker-machine stop "${DEFAULT_MACHINE}" - else - docker-machine stop $1 - fi -} -docker-switch() { - eval $(docker-machine env $1) - echo $DOCKER_HOST -} -docker-vm() { - if [ -z "$1" ] - then - docker-machine create -d virtualbox --virtualbox-disk-size 20000 --virtualbox-memory 4096 --virtualbox-cpu-count 2 "${DEFAULT_MACHINE}" - else - docker-machine create -d virtualbox --virtualbox-disk-size 20000 --virtualbox-memory 4096 --virtualbox-cpu-count 2 $1 - fi -} \ No newline at end of file From fccaaf2fc60149baab966acaeae35f55325e6f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 8 Aug 2024 20:43:20 +0200 Subject: [PATCH 03/47] fix(heroku-alias): fix loading `heroku-alias` plugin and rework docs --- plugins/heroku-alias/README.md | 223 +++++++++--------- ...eroku.alias.sh => heroku-alias.plugin.zsh} | 0 2 files changed, 118 insertions(+), 105 deletions(-) rename plugins/heroku-alias/{heroku.alias.sh => heroku-alias.plugin.zsh} (100%) diff --git a/plugins/heroku-alias/README.md b/plugins/heroku-alias/README.md index 4b7b953fd..4ecb07a23 100644 --- a/plugins/heroku-alias/README.md +++ b/plugins/heroku-alias/README.md @@ -1,127 +1,140 @@ # heroku-alias -🧬 Full alias for heroku cli -|🚀 last maj|📡 source| -|---|---| -|02/06/2020|[heroku cli doc](https://devcenter.heroku.com/articles/heroku-cli-commands)| +Full alias list for Heroku CLI. -# Alias list +To use it, add `heroku-alias` to the plugins array in your zshrc file: -## general -| Alias | Command | -| ------------- | ------------- | -| h | heroku | -| hauto | heroku autocomplete $(echo $SHELL) | -| hl | heroku local | - -## config -| Alias | Command | -| ------------- | ------------- | -| hc | heroku config | -| hca | heroku config -a | -| hcr | heroku config -r | -| hcs | heroku config:set | -| hcu | heroku config:unset | -| hcfile | function hcfile bellow | - -```sh -hcfile() { - echo " Which platform [-r/a name] ? " - read platform - echo " Which file ? " - read file - while read line; - do heroku config:set "$platform" "$line"; - done < "$file" -} +```zsh +plugins=(... heroku-alias) ``` -## apps and favorites -| Alias | Command | -| ------------- | ------------- | -| ha | heroku apps | -| hpop | heroku create | -| hkill | heroku apps:destroy | -| hlog | heroku apps:errors | -| hfav | heroku apps:favorites | -| hfava | heroku apps:favorites:add | -| hfavr | heroku apps:favorites:remove | -| hai | heroku apps:info | -| hair | heroku apps:info -r | -| haia | heroku apps:info -a | +## Requirements -# auth -| Alias | Command | -| ------------- | ------------- | -| h2fa | heroku auth:2fa | +- [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) + +| 🚀 last maj | 📡 source | +| ---------- | --------------------------------------------------------------------------- | +| 02/06/2020 | [heroku cli doc](https://devcenter.heroku.com/articles/heroku-cli-commands) | + +## Aliases + +### general + +| Alias | Command | +| ----- | ---------------------------------- | +| h | heroku | +| hauto | heroku autocomplete $(echo $SHELL) | +| hl | heroku local | + +### config + +| Alias | Command | +| ------ | ---------------------- | +| hc | heroku config | +| hca | heroku config -a | +| hcr | heroku config -r | +| hcs | heroku config:set | +| hcu | heroku config:unset | + +Also, you can use the `hcfile` function to set multiple config variables from a file, +which asks you for a platform and a config file to read the configuration from. + +### apps and favorites + +| Alias | Command | +| ----- | ---------------------------- | +| ha | heroku apps | +| hpop | heroku create | +| hkill | heroku apps:destroy | +| hlog | heroku apps:errors | +| hfav | heroku apps:favorites | +| hfava | heroku apps:favorites:add | +| hfavr | heroku apps:favorites:remove | +| hai | heroku apps:info | +| hair | heroku apps:info -r | +| haia | heroku apps:info -a | + +## auth + +| Alias | Command | +| ----- | ----------------------- | +| h2fa | heroku auth:2fa | | h2far | heroku auth:2fa:disable | -# access -| Alias | Command | -| ------------- | ------------- | -| hac | heroku access | -| hacr | heroku access -r | -| haca | heroku access -a | -| hadd | heroku access:add | -| hdel | heroku access:remove | -| hup | heroku access:update | +## access -## addons -| Alias | Command | -| ------------- | ------------- | -| hads | heroku addons -A | -| hada | heroku addons -a | -| hadr | heroku addons -r | -| hadat | heroku addons:attach | -| hadc | heroku addons:create | +| Alias | Command | +| ----- | -------------------- | +| hac | heroku access | +| hacr | heroku access -r | +| haca | heroku access -a | +| hadd | heroku access:add | +| hdel | heroku access:remove | +| hup | heroku access:update | + +### addons + +| Alias | Command | +| ----- | --------------------- | +| hads | heroku addons -A | +| hada | heroku addons -a | +| hadr | heroku addons -r | +| hadat | heroku addons:attach | +| hadc | heroku addons:create | | hadel | heroku addons:destroy | -| hadde | heroku addons:detach | -| hadoc | heroku addons:docs | +| hadde | heroku addons:detach | +| hadoc | heroku addons:docs | -## login -| Alias | Command | -| ------------- | ------------- | -| hin | heroku login | -| hout | heroku logout | -| hi | heroku login -i | -| hwho | heroku auth:whoami | +### login -## authorizations -| Alias | Command | -| ------------- | ------------- | -| hth | heroku authorizations | +| Alias | Command | +| ----- | ------------------ | +| hin | heroku login | +| hout | heroku logout | +| hi | heroku login -i | +| hwho | heroku auth:whoami | + +### authorizations + +| Alias | Command | +| ------ | ---------------------------- | +| hth | heroku authorizations | | hthadd | heroku authorizations:create | -| hthif | heroku authorizations:info | +| hthif | heroku authorizations:info | | hthdel | heroku authorizations:revoke | | hthrot | heroku authorizations:rotate | -| hthup | heroku authorizations:update | +| hthup | heroku authorizations:update | -## plugins -| Alias | Command | -| ------------- | ------------- | -| hp | heroku plugins | +### plugins -# log -| Alias | Command | -| ------------- | ------------- | -|hg | heroku logs| -| hgt | heroku log tail | +| Alias | Command | +| ----- | -------------- | +| hp | heroku plugins | -# database -| Alias | Command | -| ------------- | ------------- | -| hpg | heroku pg | -| hpsql | heroku pg:psql | -| hpb | heroku pg:backups | -| hpbc | heroku pg:backups:capture | -| hpbd | heroku pg:backups:download | -| hpbr | heroku pg:backups:restore | +### log -# certs -| Alias | Command | -| ------------- | ------------- | -| hssl | heroku certs | -| hssli | heroku certs:info | -| hssla | heroku certs:add | +| Alias | Command | +| ----- | --------------- | +| hg | heroku logs | +| hgt | heroku log tail | + +### database + +| Alias | Command | +| ----- | -------------------------- | +| hpg | heroku pg | +| hpsql | heroku pg:psql | +| hpb | heroku pg:backups | +| hpbc | heroku pg:backups:capture | +| hpbd | heroku pg:backups:download | +| hpbr | heroku pg:backups:restore | + +### certs + +| Alias | Command | +| ----- | ------------------- | +| hssl | heroku certs | +| hssli | heroku certs:info | +| hssla | heroku certs:add | | hsslu | heroku certs:update | | hsslr | heroku certs:remove | diff --git a/plugins/heroku-alias/heroku.alias.sh b/plugins/heroku-alias/heroku-alias.plugin.zsh similarity index 100% rename from plugins/heroku-alias/heroku.alias.sh rename to plugins/heroku-alias/heroku-alias.plugin.zsh From efafef8495f030501e0df59ccb76a598bbce3ae1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 9 Aug 2024 09:44:46 +0200 Subject: [PATCH 04/47] docs: improve several plugin READMEs and add one for `ssh` plugin --- plugins/aliases/README.md | 4 +- plugins/ansible/README.md | 2 - plugins/arduino-cli/README.md | 1 + plugins/asdf/README.md | 6 ++- plugins/chucknorris/README.md | 2 +- plugins/dbt/README.md | 6 +-- plugins/fancy-ctrl-z/README.md | 12 ++++- plugins/gatsby/README.md | 2 +- plugins/isodate/README.md | 4 +- plugins/jira/README.md | 48 ++++++++++--------- plugins/kube-ps1/README.md | 3 +- plugins/per-directory-history/README.md | 3 +- plugins/pipenv/README.md | 4 +- plugins/spring/README.md | 14 ++---- plugins/ssh/README.md | 16 +++++++ plugins/suse/README.md | 8 ++-- plugins/swiftpm/README.md | 2 - plugins/vagrant-prompt/README.md | 31 +++++++++++- .../vagrant-prompt/vagrant-prompt.plugin.zsh | 17 ------- plugins/vim-interaction/README.md | 16 +++---- plugins/xcode/README.md | 2 - plugins/yii2/README.md | 4 +- plugins/zsh-interactive-cd/README.md | 8 +++- 23 files changed, 124 insertions(+), 91 deletions(-) create mode 100644 plugins/ssh/README.md diff --git a/plugins/aliases/README.md b/plugins/aliases/README.md index 14f9c5c53..5a7e7dfc6 100644 --- a/plugins/aliases/README.md +++ b/plugins/aliases/README.md @@ -1,7 +1,5 @@ # Aliases cheatsheet -**Maintainer:** [@hqingyi](https://github.com/hqingyi) - With lots of 3rd-party amazing aliases installed, this plugin helps list the shortcuts that are currently available based on the plugins you have enabled. @@ -13,6 +11,8 @@ plugins=(aliases) Requirements: Python needs to be installed. +**Maintainer:** [@hqingyi](https://github.com/hqingyi) + ## Usage - `als`: show all aliases by group diff --git a/plugins/ansible/README.md b/plugins/ansible/README.md index dd0e1ce03..6a06962ee 100644 --- a/plugins/ansible/README.md +++ b/plugins/ansible/README.md @@ -1,7 +1,5 @@ # ansible plugin -## Introduction - The `ansible plugin` adds several aliases for useful [ansible](https://docs.ansible.com/ansible/latest/index.html) commands and [aliases](#aliases). To use it, add `ansible` to the plugins array of your zshrc file: diff --git a/plugins/arduino-cli/README.md b/plugins/arduino-cli/README.md index 91bda9067..821d72bbf 100644 --- a/plugins/arduino-cli/README.md +++ b/plugins/arduino-cli/README.md @@ -1,6 +1,7 @@ # Arduino CLI plugin This plugin adds completion for the [arduino-cli](https://github.com/arduino/arduino-cli) tool. + To use it, add `arduino-cli` to the plugins array in your zshrc file: ```zsh diff --git a/plugins/asdf/README.md b/plugins/asdf/README.md index f047860e2..4af69a75c 100644 --- a/plugins/asdf/README.md +++ b/plugins/asdf/README.md @@ -1,7 +1,5 @@ ## asdf -**Maintainer:** [@RobLoach](https://github.com/RobLoach) - Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more. ### Installation @@ -28,3 +26,7 @@ asdf install nodejs latest asdf global nodejs latest asdf local nodejs latest ``` + +### Maintainer + +- [@RobLoach](https://github.com/RobLoach) diff --git a/plugins/chucknorris/README.md b/plugins/chucknorris/README.md index b51875de9..0562b3b59 100644 --- a/plugins/chucknorris/README.md +++ b/plugins/chucknorris/README.md @@ -1,6 +1,6 @@ # chucknorris -Chuck Norris fortunes plugin for Oh My Zsh. Perfectly suitable as MOTD. +Fortunes plugin for Chuck Norris for Oh My Zsh. Perfectly suitable as MOTD. To use it add `chucknorris` to the plugins array in you zshrc file. diff --git a/plugins/dbt/README.md b/plugins/dbt/README.md index e05d79cc3..74ae631cd 100644 --- a/plugins/dbt/README.md +++ b/plugins/dbt/README.md @@ -1,13 +1,11 @@ # dbt plugin -## Introduction - The `dbt plugin` adds several aliases for useful [dbt](https://docs.getdbt.com/) commands and [aliases](#aliases). To use it, add `dbt` to the plugins array of your zshrc file: -``` +```zsh plugins=(... dbt) ``` @@ -26,4 +24,4 @@ plugins=(... dbt) ## Maintainer -### [msempere](https://github.com/msempere) +- [msempere](https://github.com/msempere) diff --git a/plugins/fancy-ctrl-z/README.md b/plugins/fancy-ctrl-z/README.md index 82a4fd75e..7766c51eb 100644 --- a/plugins/fancy-ctrl-z/README.md +++ b/plugins/fancy-ctrl-z/README.md @@ -1,4 +1,14 @@ -# Use Ctrl-Z to switch back to Vim +# fancy-ctrl-z + +Allows pressing Ctrl-Z again to switch back to a background job. + +To use it, add `fancy-ctrl-z` to the plugins array in your zshrc file: + +```zsh +plugins=(... fancy-ctrl-z) +``` + +## Motivation 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. diff --git a/plugins/gatsby/README.md b/plugins/gatsby/README.md index 36846a228..cc1bd392e 100644 --- a/plugins/gatsby/README.md +++ b/plugins/gatsby/README.md @@ -1,6 +1,6 @@ # gatsby autocomplete plugin -* Adds autocomplete options for all gatsby commands. +Adds autocomplete options for all gatsby commands. ## Requirements diff --git a/plugins/isodate/README.md b/plugins/isodate/README.md index 1ec75b2d4..5329310c2 100644 --- a/plugins/isodate/README.md +++ b/plugins/isodate/README.md @@ -1,7 +1,5 @@ # Isodate plugin -**Maintainer:** [@Frani](https://github.com/frani) - This plugin adds completion for the [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601), as well as some aliases for common Date commands. @@ -11,6 +9,8 @@ To use it, add `isodate` to the plugins array in your zshrc file: plugins=(... isodate) ``` +**Maintainer:** [@Frani](https://github.com/frani) + ## Aliases | Alias | Command | Description | diff --git a/plugins/jira/README.md b/plugins/jira/README.md index 1c6930298..7cfb81b19 100644 --- a/plugins/jira/README.md +++ b/plugins/jira/README.md @@ -1,16 +1,18 @@ -# Jira plugin # - -CLI support for JIRA interaction - -## Description ## +# Jira plugin This plugin provides command line tools for interacting with Atlassian's [JIRA](https://www.atlassian.com/software/jira) bug tracking software. +To use it, add `jira` to the plugins array in your zshrc file: + +```zsh +plugins=(... jira) +``` + The interaction is all done through the web. No local installation of JIRA is necessary. In this document, "JIRA" refers to the JIRA issue tracking server, and `jira` refers to the command this plugin supplies. -## Usage ## +## Usage This plugin supplies one command, `jira`, through which all its features are exposed. Most forms of this command open a JIRA page in your web browser. @@ -18,19 +20,19 @@ This plugin supplies one command, `jira`, through which all its features are exp `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 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 | +| Command | Description | +| :---------------------------- | :------------------------------------------------------- | +| `jira` | Performs the default action | +| `jira new` | Opens a new Jira issue dialogue | +| `jira ABC-123` | Opens an existing issue | +| `jira ABC-123 m` | Opens an existing issue for adding a comment | +| `jira dashboard [rapid_view]` | Opens your JIRA dashboard | +| `jira mine` | Queries for your own issues | +| `jira tempo` | Opens your JIRA Tempo | +| `jira reported [username]` | Queries for issues reported by a user | +| `jira assigned [username]` | Queries for issues assigned to a user | +| `jira branch` | Opens an existing issue matching the current branch name | +| `jira help` | Prints usage instructions | ### Jira Branch usage notes @@ -43,7 +45,7 @@ This is also checks if the prefix is in the name, and adds it if not, so: "MP-12 -#### Debugging usage #### +#### Debugging usage These calling forms are for developers' use, and may change at any time. @@ -51,7 +53,7 @@ These calling forms are for developers' use, and may change at any time. jira dumpconfig # displays the effective configuration ``` -## Setup ## +## Setup The URL for your JIRA instance is set by `$JIRA_URL` or a `.jira_url` file. @@ -68,7 +70,7 @@ echo "https://jira.atlassian.com" >> .jira-url (Note: The current implementation only looks in the current directory for `.jira-url` and `.jira-prefix`, not up the path, so if you are in a subdirectory of your project, it will fall back to your default JIRA URL. This will probably change in the future though.) -### Variables ### +### Variables * `$JIRA_URL` - Your JIRA instance's URL * `$JIRA_NAME` - Your JIRA username; used as the default user for `assigned`/`reported` searches @@ -79,6 +81,6 @@ echo "https://jira.atlassian.com" >> .jira-url * `$JIRA_TEMPO_PATH` - Your JIRA tempo url path; defaults to "/secure/Tempo.jspa" -### Browser ### +### Browser Your default web browser, as determined by how `open_command` handles `http://` URLs, is used for interacting with the JIRA instance. If you change your system's URL handler associations, it will change the browser that `jira` uses. diff --git a/plugins/kube-ps1/README.md b/plugins/kube-ps1/README.md index dd49eff39..be3c184be 100644 --- a/plugins/kube-ps1/README.md +++ b/plugins/kube-ps1/README.md @@ -1,5 +1,4 @@ -kube-ps1: Kubernetes prompt for bash and zsh -============================================ +# kube-ps1: Kubernetes prompt for bash and zsh A script that lets you add the current Kubernetes context and namespace configured on `kubectl` to your Bash/Zsh prompt strings (i.e. the `$PS1`). diff --git a/plugins/per-directory-history/README.md b/plugins/per-directory-history/README.md index 11150b059..2816c11ba 100644 --- a/plugins/per-directory-history/README.md +++ b/plugins/per-directory-history/README.md @@ -1,5 +1,4 @@ -per-directory-history plugin ----------------------------- +# per-directory-history plugin This plugin adds per-directory history for zsh, as well as a global history, and the ability to toggle between them with a keyboard shortcut. This is a diff --git a/plugins/pipenv/README.md b/plugins/pipenv/README.md index e78ef0e3b..429b6f186 100644 --- a/plugins/pipenv/README.md +++ b/plugins/pipenv/README.md @@ -1,6 +1,6 @@ # Pipenv -## Installation +This plugin provides some features to simplify the use of [Pipenv](https://pipenv.pypa.io/) while working on ZSH. In your `.zshrc` file, add `pipenv` to the plugins section @@ -10,8 +10,6 @@ plugins=(... pipenv ...) ## Features -This plugin provides some features to simplify the use of Pipenv while working on ZSH. - - Adds completion for pipenv - Auto activates and deactivates pipenv shell - Adds short aliases for common pipenv commands diff --git a/plugins/spring/README.md b/plugins/spring/README.md index 816181326..b93402000 100644 --- a/plugins/spring/README.md +++ b/plugins/spring/README.md @@ -1,16 +1,12 @@ # Spring Boot oh-my-zsh plugin -oh-my-zsh Spring Boot plugin -## Spring Boot autocomplete plugin +Adds autocomplete options for all [Spring Boot](https://spring.io/projects/spring-boot) commands. -- Adds autocomplete options for all spring boot commands. +To use it, add `spring` to the plugins array in your zshrc file: -## Manual Install - - $ cd ~/.oh-my-zsh/plugins - $ git clone git@github.com:linux-china/oh-my-zsh-spring-boot-plugin.git spring - -Adjust your .zshrc file and add spring to plugins=(...) +```zsh +plugins=(... spring) +``` ## Tips diff --git a/plugins/ssh/README.md b/plugins/ssh/README.md new file mode 100644 index 000000000..3dd32ec76 --- /dev/null +++ b/plugins/ssh/README.md @@ -0,0 +1,16 @@ +# ssh plugin + +This plugin provides host completion based off of your `~/.ssh/config` file, and adds +some utility functions to work with SSH keys. + +To use it, add `ssh` to the plugins array in your zshrc file: + +```zsh +plugins=(... ssh) +``` + +## Functions + +- `ssh_rmhkey`: remove host key from known hosts based on a host section name from `.ssh/config`. +- `ssh_load_key`: load SSH key into agent. +- `ssh_unload_key`: remove SSH key from agent. diff --git a/plugins/suse/README.md b/plugins/suse/README.md index f37ec1695..e1e3aad29 100644 --- a/plugins/suse/README.md +++ b/plugins/suse/README.md @@ -1,8 +1,6 @@ # suse -**Maintainer**: [r-darwish](https://github.com/r-darwish) - -Alias for Zypper according to the official Zypper's alias +Aliases for [Zypper](https://en.opensuse.org/Portal:Zypper) according to the official Zypper's alias To use it add `suse` to the plugins array in you zshrc file. @@ -10,6 +8,8 @@ To use it add `suse` to the plugins array in you zshrc file. plugins=(... suse) ``` +**Maintainer**: [r-darwish](https://github.com/r-darwish) + ## Main commands | Alias | Commands | Description | @@ -79,6 +79,7 @@ Related: [#9798](https://github.com/ohmyzsh/ohmyzsh/pull/9798). | zrr | `sudo zypper rr` | remove repositories | ## Services commands + | Alias | Commands | Description | | ----- | ------------------ | -------------------------------------------------------------- | | zas | `sudo zypper as` | adds a service specified by URI to the system | @@ -88,6 +89,7 @@ Related: [#9798](https://github.com/ohmyzsh/ohmyzsh/pull/9798). | zls | `zypper ls` | list services defined on the system | ## Package Locks Management commands + | Alias | Commands | Description | | ----- | ---------------- | ----------------------------------- | | zal | `sudo zypper al` | add a package lock | diff --git a/plugins/swiftpm/README.md b/plugins/swiftpm/README.md index e5b4752e4..babbf4d66 100644 --- a/plugins/swiftpm/README.md +++ b/plugins/swiftpm/README.md @@ -1,7 +1,5 @@ # Swift Package Manager -## Description - This plugin provides a few utilities that make you faster on your daily work with the [Swift Package Manager](https://github.com/apple/swift-package-manager), as well as autocompletion for Swift 5.9. To start using it, add the `swiftpm` plugin to your `plugins` array in `~/.zshrc`: diff --git a/plugins/vagrant-prompt/README.md b/plugins/vagrant-prompt/README.md index dd0ca363b..0720f4bde 100644 --- a/plugins/vagrant-prompt/README.md +++ b/plugins/vagrant-prompt/README.md @@ -1,6 +1,33 @@ +# vagrant-prompt + 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. +To use it, add `vagrant-prompt` to the plugins array in your zshrc file: -Alberto Re +```zsh +plugins=(... vagrant-prompt) +``` + +**Alberto Re ** + +## Usage + +To display Vagrant info on your prompt add the `vagrant_prompt_info` to the +`$PROMPT` or `$RPROMPT` variable in your theme. Example: + +```zsh +PROMPT='%{$fg[$NCOLOR]%}%B%n%b%{$reset_color%}:%{$fg[blue]%}%B%c/%b%{$reset_color%} $(vagrant_prompt_info)$(svn_prompt_info)$(git_prompt_info)%(!.#.$) ' +``` + +`vagrant_prompt_info` makes use of some custom variables. This is an example +definition: + +```zsh +ZSH_THEME_VAGRANT_PROMPT_PREFIX="%{$fg_bold[blue]%}[" +ZSH_THEME_VAGRANT_PROMPT_SUFFIX="%{$fg_bold[blue]%}]%{$reset_color%} " +ZSH_THEME_VAGRANT_PROMPT_RUNNING="%{$fg_no_bold[green]%}●" +ZSH_THEME_VAGRANT_PROMPT_POWEROFF="%{$fg_no_bold[red]%}●" +ZSH_THEME_VAGRANT_PROMPT_SUSPENDED="%{$fg_no_bold[yellow]%}●" +ZSH_THEME_VAGRANT_PROMPT_NOT_CREATED="%{$fg_no_bold[white]%}○" +``` diff --git a/plugins/vagrant-prompt/vagrant-prompt.plugin.zsh b/plugins/vagrant-prompt/vagrant-prompt.plugin.zsh index d7c76c3c9..29f4038c5 100644 --- a/plugins/vagrant-prompt/vagrant-prompt.plugin.zsh +++ b/plugins/vagrant-prompt/vagrant-prompt.plugin.zsh @@ -1,20 +1,3 @@ -# vim:ft=zsh ts=2 sw=2 sts=2 -# -# To display Vagrant infos on your prompt add the vagrant_prompt_info to the -# $PROMPT variable in your theme. Example: -# -# PROMPT='%{$fg[$NCOLOR]%}%B%n%b%{$reset_color%}:%{$fg[blue]%}%B%c/%b%{$reset_color%} $(vagrant_prompt_info)$(svn_prompt_info)$(git_prompt_info)%(!.#.$) ' -# -# `vagrant_prompt_info` makes use of some custom variables. This is an example -# definition: -# -# ZSH_THEME_VAGRANT_PROMPT_PREFIX="%{$fg_bold[blue]%}[" -# ZSH_THEME_VAGRANT_PROMPT_SUFFIX="%{$fg_bold[blue]%}]%{$reset_color%} " -# ZSH_THEME_VAGRANT_PROMPT_RUNNING="%{$fg_no_bold[green]%}●" -# ZSH_THEME_VAGRANT_PROMPT_POWEROFF="%{$fg_no_bold[red]%}●" -# ZSH_THEME_VAGRANT_PROMPT_SUSPENDED="%{$fg_no_bold[yellow]%}●" -# ZSH_THEME_VAGRANT_PROMPT_NOT_CREATED="%{$fg_no_bold[white]%}○" - function vagrant_prompt_info() { local vm_states vm_state if [[ -d .vagrant && -f Vagrantfile ]]; then diff --git a/plugins/vim-interaction/README.md b/plugins/vim-interaction/README.md index c2b45f1d8..437b48d99 100644 --- a/plugins/vim-interaction/README.md +++ b/plugins/vim-interaction/README.md @@ -1,5 +1,13 @@ # Vim Interaction # +The idea for this script is to give you some decent interaction with a running +GVim session. Normally you'll be running around your filesystem doing any +number of amazing things and you'll need to load some files into GVim for +editing, inspecting, destruction, or other bits of mayhem. This script lets you +do that. + +## Usage + The plugin presents a function called `callvim` whose usage is: usage: callvim [-b cmd] [-a cmd] [file ... fileN] @@ -9,14 +17,6 @@ The plugin presents a function called `callvim` whose usage is: file The file to edit ... fileN The other files to add to the argslist -## Rationale ## - -The idea for this script is to give you some decent interaction with a running -GVim session. Normally you'll be running around your filesystem doing any -number of amazing things and you'll need to load some files into GVim for -editing, inspecting, destruction, or other bits of mayhem. This script lets you -do that. - ## Aliases ## There are a few aliases presented as well: diff --git a/plugins/xcode/README.md b/plugins/xcode/README.md index 27d6a228b..ac79f728d 100644 --- a/plugins/xcode/README.md +++ b/plugins/xcode/README.md @@ -1,7 +1,5 @@ # Xcode -## Description - This plugin provides a few utilities that can help you on your daily use of Xcode and iOS development. To start using it, add the `xcode` plugin to your `plugins` array in `~/.zshrc`: diff --git a/plugins/yii2/README.md b/plugins/yii2/README.md index 345b66eb6..e6c71f23e 100644 --- a/plugins/yii2/README.md +++ b/plugins/yii2/README.md @@ -1,7 +1,7 @@ # Yii2 autocomplete plugin -* Adds autocomplete commands and subcommands for yii. +Adds autocomplete commands and subcommands for [yii](https://www.yiiframework.com/). ## Requirements -Autocomplete works from directory where your `yii` file contains. +Autocomplete works from directory where your `yii` file is contained. diff --git a/plugins/zsh-interactive-cd/README.md b/plugins/zsh-interactive-cd/README.md index 4bffbf04a..29812a295 100644 --- a/plugins/zsh-interactive-cd/README.md +++ b/plugins/zsh-interactive-cd/README.md @@ -1,5 +1,7 @@ # zsh-interactive-cd +This plugin provides an interactive way to change directories in zsh using fzf. + ## Demo ![demo](demo.gif) @@ -8,7 +10,11 @@ 1. Install [fzf](https://github.com/junegunn/fzf) by following its [installation instruction](https://github.com/junegunn/fzf#installation). -2. Source `zsh-interactive-cd.plugin.zsh` in `.zshrc`. +2. Add `zsh-interactive-cd` to your plugin list in `~/.zshrc`: + + ```zsh + plugins=(... zsh-interactive-cd) + ``` ## Usage From f1764f8a569a84264ad5a6182721f6ae3bba835d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 11 Aug 2024 19:51:32 +0200 Subject: [PATCH 05/47] chore(deps): bump pyyaml from 6.0.1 to 6.0.2 in /.github/workflows/dependencies (#12610) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependencies/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index f125da542..2a383e14b 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -1,7 +1,7 @@ certifi==2024.7.4 charset-normalizer==3.3.2 idna==3.7 -PyYAML==6.0.1 +PyYAML==6.0.2 requests==2.32.3 semver==3.0.2 urllib3==2.2.2 From 47767bd03cae60bc4b3d8ab4ba8e6b6c78bc17ed Mon Sep 17 00:00:00 2001 From: August Feng <46177585+augustfengd@users.noreply.github.com> Date: Sun, 11 Aug 2024 14:01:39 -0400 Subject: [PATCH 06/47] fix(colorize): support args when input is stdin (#11038) Co-authored-by: August Feng --- plugins/colorize/colorize.plugin.zsh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/colorize/colorize.plugin.zsh b/plugins/colorize/colorize.plugin.zsh index 12841e0ee..c49acd864 100644 --- a/plugins/colorize/colorize.plugin.zsh +++ b/plugins/colorize/colorize.plugin.zsh @@ -42,12 +42,12 @@ colorize_cat() { ZSH_COLORIZE_STYLE="emacs" fi - # Use stdin if no arguments have been passed. - if [ $# -eq 0 ]; then + # Use stdin if stdin is not attached to a terminal. + if [ ! -t 0 ]; then if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then pygmentize -O style="$ZSH_COLORIZE_STYLE" -g else - chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" + chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" "$@" fi return $? fi From d6f84f3e7d2515cee8ba776d05ee2009ffd471d7 Mon Sep 17 00:00:00 2001 From: Gentoo <43550690+maxutka99@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:46:16 +0300 Subject: [PATCH 07/47] fix(catimg): add support to `magick` binary (#12608) Co-authored-by: Carlo Sala --- plugins/catimg/README.md | 5 +++-- plugins/catimg/catimg.plugin.zsh | 8 +++++--- plugins/catimg/catimg.sh | 14 +++++++++----- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/plugins/catimg/README.md b/plugins/catimg/README.md index 68dc33c1f..4cfda0e25 100644 --- a/plugins/catimg/README.md +++ b/plugins/catimg/README.md @@ -1,6 +1,7 @@ # catimg -Plugin for displaying images on the terminal using 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: @@ -10,7 +11,7 @@ plugins=(... catimg) ## Requirements -- `convert` (ImageMagick) +- `magick convert` (ImageMagick) ## Functions diff --git a/plugins/catimg/catimg.plugin.zsh b/plugins/catimg/catimg.plugin.zsh index f4ff6f856..ad10d8574 100644 --- a/plugins/catimg/catimg.plugin.zsh +++ b/plugins/catimg/catimg.plugin.zsh @@ -9,9 +9,11 @@ function catimg() { - if [[ -x `which convert` ]]; then - zsh $ZSH/plugins/catimg/catimg.sh $@ + if (( $+commands[magick] )); then + CONVERT_CMD="magick" zsh $ZSH/plugins/catimg/catimg.sh $@ + elif (( $+commands[convert] )); then + CONVERT_CMD="convert" zsh $ZSH/plugins/catimg/catimg.sh $@ else - echo "catimg need convert (ImageMagick) to work)" + echo "catimg need magick/convert (ImageMagick) to work)" fi } diff --git a/plugins/catimg/catimg.sh b/plugins/catimg/catimg.sh index f58392428..7946ad16e 100644 --- a/plugins/catimg/catimg.sh +++ b/plugins/catimg/catimg.sh @@ -7,6 +7,10 @@ # GitHub: https://github.com/posva/catimg # ################################################################################ +# this should come from outside, either `magick` or `convert` +# from imagemagick v7 and ahead `convert` is deprecated +: ${CONVERT_CMD:=convert} + function help() { echo "Usage catimg [-h] [-w width] [-c char] img" echo "By default char is \" \" and w is the terminal width" @@ -43,23 +47,23 @@ if [ ! "$WIDTH" ]; then else COLS=$(expr $WIDTH "/" $(echo -n "$CHAR" | wc -c)) fi -WIDTH=$(convert "$IMG" -print "%w\n" /dev/null) +WIDTH=$($CONVERT_CMD "$IMG" -print "%w\n" /dev/null) if [ "$WIDTH" -gt "$COLS" ]; then WIDTH=$COLS fi REMAP="" -if convert "$IMG" -resize $COLS\> +dither -remap $COLOR_FILE /dev/null ; then +if $CONVERT_CMD "$IMG" -resize $COLS\> +dither -remap $COLOR_FILE /dev/null ; then REMAP="-remap $COLOR_FILE" else echo "The version of convert is too old, don't expect good results :(" >&2 - #convert "$IMG" -colors 256 PNG8:tmp.png - #IMG="tmp.png" + # $CONVERT_CMD "$IMG" -colors 256 PNG8:tmp.png + # IMG="tmp.png" fi # Display the image I=0 -convert "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- 2>/dev/null | +$CONVERT_CMD "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- 2>/dev/null | sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' | while read R G B f; do if [ ! "$R" = "NO" ]; then From 9ba6daa1b5d0b60c89525d679eb30fe3ed9947de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20M=C3=BCller?= Date: Sun, 21 Oct 2018 13:00:03 +0200 Subject: [PATCH 08/47] feat(conda): add `conda` aliases plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #7318 Closed #9691 Co-authored-by: garywei944 <33930674+garywei944@users.noreply.github.com> Co-authored-by: Marc Cornellà --- plugins/conda/README.md | 37 ++++++++++++++++++++++++++++++++++ plugins/conda/conda.plugin.zsh | 23 +++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 plugins/conda/README.md create mode 100644 plugins/conda/conda.plugin.zsh diff --git a/plugins/conda/README.md b/plugins/conda/README.md new file mode 100644 index 000000000..70530d01e --- /dev/null +++ b/plugins/conda/README.md @@ -0,0 +1,37 @@ +# conda plugin + +The conda plugin provides [aliases](#aliases) for `conda`, usually installed via [anaconda](https://www.anaconda.com/) or [miniconda](https://docs.conda.io/en/latest/miniconda.html). + +To use it, add `conda` to the plugins array in your zshrc file: + +```zsh +plugins=(... conda) +``` + +## Aliases + +| Alias | Command | Description | +| :------- | :-------------------------------------- | :------------------------------------------------------------------------------ | +| `cna` | `conda activate` | Activate the specified conda environment | +| `cnab` | `conda activate base` | Activate the base conda environment | +| `cncf` | `conda env create -f` | Create a new conda environment from a YAML file | +| `cncn` | `conda create -y -n` | Create a new conda environment with the given name | +| `cnconf` | `conda config` | View or modify conda configuration | +| `cncp` | `conda create -y -p` | Create a new conda environment with the given prefix | +| `cncr` | `conda create -n` | Create new virtual environment with given name | +| `cncss` | `conda config --show-source` | Show the locations of conda configuration sources | +| `cnde` | `conda deactivate` | Deactivate the current conda environment | +| `cnel` | `conda env list` | List all available conda environments | +| `cni` | `conda install` | Install given package | +| `cniy` | `conda install -y` | Install given package without confirmation | +| `cnl` | `conda list` | List installed packages in the current environment | +| `cnle` | `conda list --export` | Export the list of installed packages in the current environment | +| `cnles` | `conda list --explicit > spec-file.txt` | Export the list of installed packages in the current environment to a spec file | +| `cnr` | `conda remove` | Remove given package | +| `cnrn` | `conda remove -y -all -n` | Remove all packages in the specified environment | +| `cnrp` | `conda remove -y -all -p` | Remove all packages in the specified prefix | +| `cnry` | `conda remove -y` | Remove given package without confirmation | +| `cnsr` | `conda search` | Search conda repositories for package | +| `cnu` | `conda update` | Update conda package manager | +| `cnua` | `conda update --all` | Update all installed packages | +| `cnuc` | `conda update conda` | Update conda package manager | diff --git a/plugins/conda/conda.plugin.zsh b/plugins/conda/conda.plugin.zsh new file mode 100644 index 000000000..a93ceeb95 --- /dev/null +++ b/plugins/conda/conda.plugin.zsh @@ -0,0 +1,23 @@ +alias cna='conda activate' +alias cnab='conda activate base' +alias cncf='conda env create -f' +alias cncn='conda create -y -n' +alias cnconf='conda config' +alias cncp='conda create -y -p' +alias cncr='conda create -n' +alias cncss='conda config --show-source' +alias cnde='conda deactivate' +alias cnel='conda env list' +alias cni='conda install' +alias cniy='conda install -y' +alias cnl='conda list' +alias cnle='conda list --export' +alias cnles='conda list --explicit > spec-file.txt' +alias cnr='conda remove' +alias cnrn='conda remove -y -all -n' +alias cnrp='conda remove -y -all -p' +alias cnry='conda remove -y' +alias cnsr='conda search' +alias cnu='conda update' +alias cnua='conda update --all' +alias cnuc='conda update conda' From d26c4a276610445670fb71d415804625cebd7ccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 15 Aug 2024 16:26:46 +0200 Subject: [PATCH 09/47] chore(tmux): add link to iTerm2 integration docs --- plugins/tmux/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/plugins/tmux/README.md b/plugins/tmux/README.md index 09952a9f5..28ad3558a 100644 --- a/plugins/tmux/README.md +++ b/plugins/tmux/README.md @@ -29,18 +29,18 @@ 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_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) | -| `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 | +| 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_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) | +| `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](https://iterm2.com/documentation-tmux-integration.html) (default: `false`) | +| `ZSH_TMUX_UNICODE` | Set `tmux -u` option to support unicode | From c13795d4c40fe075ec8b4450bb78b65ecf8108b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 15 Aug 2024 16:48:03 +0200 Subject: [PATCH 10/47] feat(git)!: ask for confirmation in `gpf` alias (#10169) - Rename `git push --force-with-lease ...` to `gpff` - Add a y/n confirmation prompt to `gpf` before running `git push --force-with-lease ...` BREAKING CHANGE: this change adds a confirmation prompt to the `gpf` alias before running the potentially destructive `git push --force-with-lease` command. If you want to force-run the command without having to confirm it, run `gpff`. --- plugins/git/README.md | 8 +++++--- plugins/git/git.plugin.zsh | 9 ++++++--- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index bcd9aca96..592840f87 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -89,7 +89,7 @@ plugins=(... git) | `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` | | `gdt` | `git diff-tree --no-commit-id --name-only -r` | | `gf` | `git fetch` | -| `gfa` | `git fetch --all --tags --prune` | +| `gfa` | `git fetch --all --tags --prune` | | `gfo` | `git fetch origin` | | `gg` | `git gui citool` | | `gga` | `git gui citool --amend` | @@ -133,8 +133,10 @@ plugins=(... git) | `gpd` | `git push --dry-run` | | `gpf!` | `git push --force` | | `ggf` | `git push --force origin $(current_branch)` | -| `gpf` | On Git >= 2.30: `git push --force-with-lease --force-if-includes` | -| `gpf` | On Git < 2.30: `git push --force-with-lease` | +| `gpf` | On Git >= 2.30: after confirmation, `git push --force-with-lease --force-if-includes` | +| `gpf` | On Git < 2.30: after confirmation, `git push --force-with-lease` | +| `gpff` | On Git >= 2.30: `git push --force-with-lease --force-if-includes` | +| `gpff` | On Git < 2.30: `git push --force-with-lease` | | `ggfl` | `git push --force-with-lease origin $(current_branch)` | | `gpsup` | `git push --set-upstream origin $(git_current_branch)` | | `gpsupf` | On Git >= 2.30: `git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 0a26399a2..99f640e88 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -297,10 +297,13 @@ function ggf() { } compdef _git ggf=git-checkout -alias gpf!='git push --force' +alias 'gpf!'='git push --force' is-at-least 2.30 "$git_version" \ - && alias gpf='git push --force-with-lease --force-if-includes' \ - || alias gpf='git push --force-with-lease' + && alias gpf='read -k 1 -q "?Continue force-push? [y/N] " && echo && git push --force-with-lease --force-if-includes' \ + || alias gpf='read -k 1 -q "?Continue force-push? [y/N] " && echo && git push --force-with-lease' +is-at-least 2.30 "$git_version" \ + && alias gpff='git push --force-with-lease --force-if-includes' \ + || alias gpff='git push --force-with-lease' function ggfl() { [[ "$#" != 1 ]] && local b="$(git_current_branch)" From f30df6c855d1df077adc6b226219629312015ec6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 15 Aug 2024 17:04:50 +0200 Subject: [PATCH 11/47] docs: document disclaimer about theme appearance --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index dc4f36864..0f20fd065 100644 --- a/README.md +++ b/README.md @@ -167,7 +167,15 @@ ZSH_THEME="agnoster" # (this is one of the fancy ones) # see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster ``` -_Note: many themes require installing a [Powerline Font](https://github.com/powerline/fonts) or a [Nerd Font](https://github.com/ryanoasis/nerd-fonts) in order to render properly. Without them, these themes will render [weird prompt symbols](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#i-have-a-weird-character-in-my-prompt)_ +> [!NOTE] +> You will many times see screenshots for a zsh theme, and try it out, and find that it doesn't look the same for you. +> +> This is because many themes require installing a [Powerline Font](https://github.com/powerline/fonts) or a [Nerd Font](https://github.com/ryanoasis/nerd-fonts) in order to render properly. +> Without them, these themes will render weird prompt symbols. Check out [the FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#i-have-a-weird-character-in-my-prompt) for more information. +> +> Also, beware that themes only control what your prompt looks like. This is, the text you see before or after your cursor, where you'll type your commands. +> Themes don't control things such as the colors of your terminal window (known as _color scheme_) or the font of your terminal. These are settings that you can change in your terminal emulator. +> For more information, see [what is a zsh theme](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#what-is-a-zsh-theme). Open up a new terminal window and your prompt should look something like this: From b0204f78394d84771436a7717aafee6cad140319 Mon Sep 17 00:00:00 2001 From: whisperity Date: Thu, 15 Aug 2024 17:53:03 +0200 Subject: [PATCH 12/47] feat(git): add `gmff`, `gprum(i)`, `grbum` aliases to work with `upstream` remotes (#11428) --- plugins/git/README.md | 4 ++++ plugins/git/git.plugin.zsh | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/plugins/git/README.md b/plugins/git/README.md index 592840f87..d3a927f23 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -114,6 +114,7 @@ plugins=(... git) | `gma` | `git merge --abort` | | `gmc` | `git merge --continue` | | `gms` | `git merge --squash` | +| `gmff` | `git merge --ff-only` | | `gmom` | `git merge origin/$(git_main_branch)` | | `gmum` | `git merge upstream/$(git_main_branch)` | | `gmtl` | `git mergetool --no-prompt` | @@ -125,6 +126,8 @@ plugins=(... git) | `gprav` | `git pull --rebase --autostash -v` | | `gprom` | `git pull --rebase origin $(git_main_branch)` | | `gpromi` | `git pull --rebase=interactive origin $(git_main_branch)` | +| `gprum` | `git pull --rebase upstream $(git_main_branch)` | +| `gprumi` | `git pull --rebase=interactive upstream $(git_main_branch)` | | `ggpull` | `git pull origin "$(git_current_branch)"` | | `ggl` | `git pull origin $(current_branch)` | | `gluc` | `git pull upstream $(git_current_branch)` | @@ -156,6 +159,7 @@ plugins=(... git) | `grbd` | `git rebase $(git_develop_branch)` | | `grbm` | `git rebase $(git_main_branch)` | | `grbom` | `git rebase origin/$(git_main_branch)` | +| `grbum` | `git rebase upstream/$(git_main_branch)` | | `grf` | `git reflog` | | `gr` | `git remote` | | `grv` | `git remote --verbose` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 99f640e88..8436fb440 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -255,6 +255,7 @@ alias gm='git merge' alias gma='git merge --abort' alias gmc='git merge --continue' alias gms="git merge --squash" +alias gmff="git merge --ff-only" alias gmom='git merge origin/$(git_main_branch)' alias gmum='git merge upstream/$(git_main_branch)' alias gmtl='git mergetool --no-prompt' @@ -274,6 +275,8 @@ compdef _git ggu=git-checkout alias gprom='git pull --rebase origin $(git_main_branch)' alias gpromi='git pull --rebase=interactive origin $(git_main_branch)' +alias gprum='git pull --rebase upstream $(git_main_branch)' +alias gprumi='git pull --rebase=interactive upstream $(git_main_branch)' alias ggpull='git pull origin "$(git_current_branch)"' function ggl() { @@ -340,6 +343,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 grbum='git rebase upstream/$(git_main_branch)' alias grf='git reflog' alias gr='git remote' alias grv='git remote --verbose' From 2056aeeeaddd977eb205619c6f236b94dac896be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 18 Aug 2024 11:22:30 +0200 Subject: [PATCH 13/47] Revert "feat(git)!: ask for confirmation in `gpf` alias (#10169)" This reverts commit c13795d4c40fe075ec8b4450bb78b65ecf8108b2. --- plugins/git/README.md | 8 +++----- plugins/git/git.plugin.zsh | 9 +++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/plugins/git/README.md b/plugins/git/README.md index d3a927f23..e03f204f7 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -89,7 +89,7 @@ plugins=(... git) | `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` | | `gdt` | `git diff-tree --no-commit-id --name-only -r` | | `gf` | `git fetch` | -| `gfa` | `git fetch --all --tags --prune` | +| `gfa` | `git fetch --all --tags --prune` | | `gfo` | `git fetch origin` | | `gg` | `git gui citool` | | `gga` | `git gui citool --amend` | @@ -136,10 +136,8 @@ plugins=(... git) | `gpd` | `git push --dry-run` | | `gpf!` | `git push --force` | | `ggf` | `git push --force origin $(current_branch)` | -| `gpf` | On Git >= 2.30: after confirmation, `git push --force-with-lease --force-if-includes` | -| `gpf` | On Git < 2.30: after confirmation, `git push --force-with-lease` | -| `gpff` | On Git >= 2.30: `git push --force-with-lease --force-if-includes` | -| `gpff` | On Git < 2.30: `git push --force-with-lease` | +| `gpf` | On Git >= 2.30: `git push --force-with-lease --force-if-includes` | +| `gpf` | On Git < 2.30: `git push --force-with-lease` | | `ggfl` | `git push --force-with-lease origin $(current_branch)` | | `gpsup` | `git push --set-upstream origin $(git_current_branch)` | | `gpsupf` | On Git >= 2.30: `git push --set-upstream origin $(git_current_branch) --force-with-lease --force-if-includes` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 8436fb440..28d5cb314 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -300,13 +300,10 @@ function ggf() { } compdef _git ggf=git-checkout -alias 'gpf!'='git push --force' +alias gpf!='git push --force' is-at-least 2.30 "$git_version" \ - && alias gpf='read -k 1 -q "?Continue force-push? [y/N] " && echo && git push --force-with-lease --force-if-includes' \ - || alias gpf='read -k 1 -q "?Continue force-push? [y/N] " && echo && git push --force-with-lease' -is-at-least 2.30 "$git_version" \ - && alias gpff='git push --force-with-lease --force-if-includes' \ - || alias gpff='git push --force-with-lease' + && alias gpf='git push --force-with-lease --force-if-includes' \ + || alias gpf='git push --force-with-lease' function ggfl() { [[ "$#" != 1 ]] && local b="$(git_current_branch)" From c10a99406a779606fe32eb9b824c90a91f95c842 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Tue, 20 Aug 2024 16:34:08 +0200 Subject: [PATCH 14/47] chore: typo --- 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 930015798..3546ed82b 100644 --- a/templates/zshrc.zsh-template +++ b/templates/zshrc.zsh-template @@ -85,7 +85,7 @@ source $ZSH/oh-my-zsh.sh # if [[ -n $SSH_CONNECTION ]]; then # export EDITOR='vim' # else -# export EDITOR='mvim' +# export EDITOR='nvim' # fi # Compilation flags From ebb479e5e2395d26fc368c9b9d534e935a292740 Mon Sep 17 00:00:00 2001 From: Mathias Date: Wed, 21 Aug 2024 18:50:42 +0300 Subject: [PATCH 15/47] feat(mix): add mix plugin test.watch (#10963) --- plugins/mix/README.md | 1 + plugins/mix/_mix | 6 +++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/mix/README.md b/plugins/mix/README.md index f0258fe88..9bbe53a41 100644 --- a/plugins/mix/README.md +++ b/plugins/mix/README.md @@ -17,3 +17,4 @@ plugins=(... mix) | Ecto | [Ecto](https://hexdocs.pm/ecto/Ecto.html) | | Hex | [Hex](https://hex.pm/) | | Nerves | [Nerves](https://nerves-project.org/) | +| mix_test_watch | [mix_test_watch](https://hex.pm/packages/mix_test_watch) | diff --git a/plugins/mix/_mix b/plugins/mix/_mix index 7940ff1c9..656c7fe19 100644 --- a/plugins/mix/_mix +++ b/plugins/mix/_mix @@ -109,6 +109,7 @@ _1st_arguments=( 'release.init:Generates sample files for releases' 'run:Run the given file or expression' "test:Run a project's tests" + "test.watch:Run a project's tests continuously using hex package mix_test_watch" 'test.coverage:Build report from exported test coverage' 'xref:Prints cross reference information' '--help:Describe available tasks' @@ -120,7 +121,7 @@ __task_list () local expl declare -a tasks - tasks=(app.config app.start app.tree archive archive.build archive.install archive.uninstall clean cmd compile compile.protocols deps deps.clean deps.compile deps.get deps.tree deps.unlock deps.update do ecto.create ecto.drop ecto.dump ecto.gen.migration ecto.gen.repo ecto.load ecto.migrate ecto.migrations ecto.rollback escript escript.build escript.install escript.uninstall firmware firmware.burn firmware.image format help hex hex.audit hex.build hex.config hex.docs hex.info hex.organization hex.key hex.outdated hex.owner hex.package hex.publish hex.registry hex.repo hex.retire hex.search hex.sponsor hex.user loadconfig local local.hex local.phoenix local.phx local.public_keys local.rebar nerves.artifact nerves.artifact.get nerves.info nerves.new nerves.release.init new phoenix.digest phoenix.gen.channel phoenix.gen.html phoenix.gen.json phoenix.gen.model phoenix.gen.secret phoenix.new phoenix.routes phoenix.server phx.digest phx.digest.clean phx.gen.auth phx.gen.cert phx.gen.channel phx.gen.context phx.gen.embedded phx.gen.html phx.gen.json phx.gen.live phx.gen.notifier phx.gen.presence phx.gen.schema phx.gen.secret phx.gen.socket phx.new phx.new.ecto phx.new.web phx.routes phx.server profile.cprof profile.eprof profile.fprof release release.init run test test.coverage xref) + tasks=(app.config app.start app.tree archive archive.build archive.install archive.uninstall clean cmd compile compile.protocols deps deps.clean deps.compile deps.get deps.tree deps.unlock deps.update do ecto.create ecto.drop ecto.dump ecto.gen.migration ecto.gen.repo ecto.load ecto.migrate ecto.migrations ecto.rollback escript escript.build escript.install escript.uninstall firmware firmware.burn firmware.image format help hex hex.audit hex.build hex.config hex.docs hex.info hex.organization hex.key hex.outdated hex.owner hex.package hex.publish hex.registry hex.repo hex.retire hex.search hex.sponsor hex.user loadconfig local local.hex local.phoenix local.phx local.public_keys local.rebar nerves.artifact nerves.artifact.get nerves.info nerves.new nerves.release.init new phoenix.digest phoenix.gen.channel phoenix.gen.html phoenix.gen.json phoenix.gen.model phoenix.gen.secret phoenix.new phoenix.routes phoenix.server phx.digest phx.digest.clean phx.gen.auth phx.gen.cert phx.gen.channel phx.gen.context phx.gen.embedded phx.gen.html phx.gen.json phx.gen.live phx.gen.notifier phx.gen.presence phx.gen.schema phx.gen.secret phx.gen.socket phx.new phx.new.ecto phx.new.web phx.routes phx.server profile.cprof profile.eprof profile.fprof release release.init run test test.watch test.coverage xref) _wanted tasks expl 'help' compadd $tasks } @@ -148,6 +149,9 @@ case $state in (test) _files ;; + (test.watch) + _files + ;; (run) _files ;; From f622e6a6367b5142c868f554fda968982226e5df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 25 Aug 2024 17:15:23 +0200 Subject: [PATCH 16/47] chore(deps): bump idna from 3.7 to 3.8 in /.github/workflows/dependencies (#12638) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependencies/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index 2a383e14b..81a119844 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -1,6 +1,6 @@ certifi==2024.7.4 charset-normalizer==3.3.2 -idna==3.7 +idna==3.8 PyYAML==6.0.2 requests==2.32.3 semver==3.0.2 From efe21261d031b4836f64112a899706322acd26b0 Mon Sep 17 00:00:00 2001 From: robertoaceves Date: Tue, 27 Aug 2024 02:13:47 -0400 Subject: [PATCH 17/47] fix(grep): remove duplicate options (#12639) --- lib/grep.zsh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/grep.zsh b/lib/grep.zsh index 54e0f694e..5b3dec87e 100644 --- a/lib/grep.zsh +++ b/lib/grep.zsh @@ -24,8 +24,8 @@ else if [[ -n "$GREP_OPTIONS" ]]; then # export grep, egrep and fgrep settings alias grep="grep $GREP_OPTIONS" - alias egrep="grep -E $GREP_OPTIONS" - alias fgrep="grep -F $GREP_OPTIONS" + alias egrep="grep -E" + alias fgrep="grep -F" # write to cache file if cache directory is writable if [[ -w "$ZSH_CACHE_DIR" ]]; then From a3dfe290363c5f0ac6add41a1126d7c842a4d7c4 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 28 Aug 2024 10:34:25 +0200 Subject: [PATCH 18/47] feat(nvm): add `pnpx` as lazy cmd --- plugins/nvm/README.md | 7 ++++--- plugins/nvm/nvm.plugin.zsh | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index eb1e236ee..fe91cc3b2 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -26,9 +26,10 @@ 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`, `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: +nvm script only when using it, and will create a function for `node`, `npm`, `npx`, `pnpm`, `pnpx`, `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 f36182eda..a00c2e117 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -74,7 +74,7 @@ function _omz_setup_autoload { if zstyle -t ':omz:plugins:nvm' lazy; then # 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 corepack $nvm_lazy_cmd) # default values + nvm_lazy_cmd=(nvm node npm npx pnpm pnpx yarn corepack $nvm_lazy_cmd) # default values eval " function $nvm_lazy_cmd { for func in $nvm_lazy_cmd; do From c80050d6f538d6d8d8942068ea9bf1d4de2b14e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C5=82a=C5=BCej=20Sowa?= Date: Wed, 28 Aug 2024 14:27:50 +0200 Subject: [PATCH 19/47] fix(scd): avoid hardcoded binary path (#12641) Co-authored-by: Carlo Sala --- plugins/scd/scd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scd/scd b/plugins/scd/scd index 7e9654b44..c79de4538 100755 --- a/plugins/scd/scd +++ b/plugins/scd/scd @@ -445,7 +445,7 @@ _scd_Y19oug_match() { # build a list of matching directories reverse-sorted by their probabilities dmatching=( ${(f)"$( builtin printf "%s %s\n" ${(Oakv)drank} | - /usr/bin/sort -grk1 )"} + command sort -grk1 )"} ) dmatching=( ${dmatching#*[[:blank:]]} ) From e2ba73af6342fed58c1b26391f105a447110d520 Mon Sep 17 00:00:00 2001 From: Luke Ashe-Browne Date: Wed, 28 Aug 2024 23:01:36 +0100 Subject: [PATCH 20/47] feat(tailscale): new tailscale plugin (#12523) --- plugins/tailscale/README.md | 11 +++++++++++ plugins/tailscale/tailscale.plugin.zsh | 4 ++++ 2 files changed, 15 insertions(+) create mode 100644 plugins/tailscale/README.md create mode 100644 plugins/tailscale/tailscale.plugin.zsh diff --git a/plugins/tailscale/README.md b/plugins/tailscale/README.md new file mode 100644 index 000000000..be5a62137 --- /dev/null +++ b/plugins/tailscale/README.md @@ -0,0 +1,11 @@ +# tailscale + +This plugin provides completion for [tailscale](https://tailscale.com/) (Easy software-defined networks using an implementation of wireguard). + +To use it, add `tailscale` to the plugins array in your zshrc file. + +``` +plugins=(... tailscale) +``` + +**Author:** [@lukeab](https://github.com/lukeab) diff --git a/plugins/tailscale/tailscale.plugin.zsh b/plugins/tailscale/tailscale.plugin.zsh new file mode 100644 index 000000000..ae664a665 --- /dev/null +++ b/plugins/tailscale/tailscale.plugin.zsh @@ -0,0 +1,4 @@ + +if [ $commands[tailscale] ]; then + source <(tailscale completion zsh) +fi From ea8068aa3eeecc785249f2e83289e8a9294b9d6b Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 29 Aug 2024 12:19:19 +0200 Subject: [PATCH 21/47] fix(tailscale): make completion loading async --- plugins/tailscale/tailscale.plugin.zsh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/plugins/tailscale/tailscale.plugin.zsh b/plugins/tailscale/tailscale.plugin.zsh index ae664a665..7f0b1414a 100644 --- a/plugins/tailscale/tailscale.plugin.zsh +++ b/plugins/tailscale/tailscale.plugin.zsh @@ -1,4 +1,13 @@ - -if [ $commands[tailscale] ]; then - source <(tailscale completion zsh) +if (( ! $+commands[tailscale] )); then + return fi + +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `tailscale`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_tailscale" ]]; then + typeset -g -A _comps + autoload -Uz _tailscale + _comps[tailscale]=_tailscale +fi + +tailscale completion zsh >| "$ZSH_CACHE_DIR/completions/_tailscale" &| From c68ff8aeedc2b779ae42d745457ecd443e22e212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Fri, 30 Aug 2024 14:30:57 +0200 Subject: [PATCH 22/47] feat(extract): add support for .vsix files (VS Code extension) (#12643) --- plugins/extract/README.md | 1 + plugins/extract/extract.plugin.zsh | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/extract/README.md b/plugins/extract/README.md index c8d98b229..e0f571521 100644 --- a/plugins/extract/README.md +++ b/plugins/extract/README.md @@ -52,6 +52,7 @@ plugins=(... extract) | `tlz` | Tarball with lzma compression | | `txz` | Tarball with lzma2 compression | | `tzst` | Tarball with zstd compression | +| `vsix` | VS Code extension zip file | | `war` | Web Application archive (Java-based) | | `whl` | Python wheel file | | `xpi` | Mozilla XPI module file | diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index e2b3111d5..f2eebf4d6 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -76,7 +76,7 @@ EOF (*.lz4) lz4 -d "$full_path" ;; (*.lzma) unlzma "$full_path" ;; (*.z) uncompress "$full_path" ;; - (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$full_path" ;; + (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix) unzip "$full_path" ;; (*.rar) unrar x -ad "$full_path" ;; (*.rpm) rpm2cpio "$full_path" | cpio --quiet -id ;; From d78275fdbb876cee9c55f5c2731b8c1fac7be6d2 Mon Sep 17 00:00:00 2001 From: Alexander Cyon Date: Sun, 1 Sep 2024 21:01:27 +0200 Subject: [PATCH 23/47] chore: fix typos (#12647) --- plugins/bedtools/_bedtools | 2 +- plugins/brew/brew.plugin.zsh | 2 +- plugins/docker/docker.plugin.zsh | 2 +- plugins/emoji/update_emoji.py | 4 ++-- plugins/gem/gem.plugin.zsh | 2 +- plugins/history-substring-search/history-substring-search.zsh | 4 ++-- plugins/hitchhiker/fortunes/hitchhiker | 2 +- plugins/lpass/_lpass | 2 +- plugins/python/python.plugin.zsh | 2 +- plugins/rails/_rails | 4 ++-- plugins/swiftpm/_swift | 2 +- plugins/zsh-navigation-tools/README.md | 2 +- plugins/zsh-navigation-tools/doc/n-preview | 2 +- 13 files changed, 16 insertions(+), 16 deletions(-) diff --git a/plugins/bedtools/_bedtools b/plugins/bedtools/_bedtools index ef6c4179a..15e3dc2ff 100644 --- a/plugins/bedtools/_bedtools +++ b/plugins/bedtools/_bedtools @@ -47,7 +47,7 @@ case $state in "random[Generate random intervals in a genome.]" \ "reldist[Calculate the distribution of relative distances b/w two files.]" \ "sample[Sample random records from file using reservoir sampling.]" \ - "shuffle[Randomly redistrubute intervals in a genome.]" \ + "shuffle[Randomly redistribute intervals in a genome.]" \ "slop[Adjust the size of intervals.]" \ "sort[Order the intervals in a file.]" \ "subtract[Remove intervals based on overlaps b/w two files.]" \ diff --git a/plugins/brew/brew.plugin.zsh b/plugins/brew/brew.plugin.zsh index a138a4827..4dab6f413 100644 --- a/plugins/brew/brew.plugin.zsh +++ b/plugins/brew/brew.plugin.zsh @@ -24,7 +24,7 @@ if (( ! $+commands[brew] )); then fi if [[ -z "$HOMEBREW_PREFIX" ]]; then - # Maintain compatability with potential custom user profiles, where we had + # Maintain compatibility with potential custom user profiles, where we had # previously relied on always sourcing shellenv. OMZ plugins should not rely # on this to be defined due to out of order processing. export HOMEBREW_PREFIX="$(brew --prefix)" diff --git a/plugins/docker/docker.plugin.zsh b/plugins/docker/docker.plugin.zsh index 19269427e..16db77df6 100644 --- a/plugins/docker/docker.plugin.zsh +++ b/plugins/docker/docker.plugin.zsh @@ -39,7 +39,7 @@ if (( ! $+commands[docker] )); then return fi -# Standarized $0 handling +# Standardized $0 handling # https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${(M)0:#/*}:-$PWD/$0}" diff --git a/plugins/emoji/update_emoji.py b/plugins/emoji/update_emoji.py index 18b3c060d..9e115a7fa 100644 --- a/plugins/emoji/update_emoji.py +++ b/plugins/emoji/update_emoji.py @@ -1,6 +1,6 @@ """ Update Emoji.py -Refeshes OMZ emoji database based on the latest Unicode spec +Refreshes OMZ emoji database based on the latest Unicode spec """ import re import json @@ -95,7 +95,7 @@ def name_to_omz(_name, _group, _subgroup, _status): shortname = snake_case(_name) # Special treatment by status # Enables us to have every emoji combination, - # even the one that are not officially sanctionned + # even the one that are not officially sanctioned # and are implemented by, say, only one vendor if _status == "unqualified": shortname += "_unqualified" diff --git a/plugins/gem/gem.plugin.zsh b/plugins/gem/gem.plugin.zsh index b8a49fb56..58716594d 100644 --- a/plugins/gem/gem.plugin.zsh +++ b/plugins/gem/gem.plugin.zsh @@ -23,7 +23,7 @@ if is-at-least 5.5; then fi { - # Standarized $0 handling + # Standardized $0 handling # https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${(M)0:#/*}:-$PWD/$0}" diff --git a/plugins/history-substring-search/history-substring-search.zsh b/plugins/history-substring-search/history-substring-search.zsh index 2137b7950..9f0e0b0d5 100644 --- a/plugins/history-substring-search/history-substring-search.zsh +++ b/plugins/history-substring-search/history-substring-search.zsh @@ -295,8 +295,8 @@ _history-substring-search-begin() { fi # - # Escape and join query parts with wildcard character '*' as seperator - # `(j:CHAR:)` join array to string with CHAR as seperator + # Escape and join query parts with wildcard character '*' as separator + # `(j:CHAR:)` join array to string with CHAR as separator # local search_pattern="${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*" diff --git a/plugins/hitchhiker/fortunes/hitchhiker b/plugins/hitchhiker/fortunes/hitchhiker index 94cc1c835..6620a2a4f 100644 --- a/plugins/hitchhiker/fortunes/hitchhiker +++ b/plugins/hitchhiker/fortunes/hitchhiker @@ -42,7 +42,7 @@ - Zaphod. % -"`In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Aplha Centauri.'" +"`In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Alpha Centauri.'" - The Book getting all nostalgic. % diff --git a/plugins/lpass/_lpass b/plugins/lpass/_lpass index 621a7bcd7..e312fb9a3 100644 --- a/plugins/lpass/_lpass +++ b/plugins/lpass/_lpass @@ -78,7 +78,7 @@ _lpass() { has_sync=1 ;; status) - _arguments : '(-q --quiet)'{-q,--quiet}'[Supress output to stdout]' + _arguments : '(-q --quiet)'{-q,--quiet}'[Suppress output to stdout]' has_color=1 ;; sync) diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 6d7f440aa..811745257 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -74,7 +74,7 @@ function vrun() { } # Create a new virtual environment using the specified name. -# If none specfied, use $PYTHON_VENV_NAME +# If none specified, use $PYTHON_VENV_NAME function mkv() { local name="${1:-$PYTHON_VENV_NAME}" local venvpath="${name:P}" diff --git a/plugins/rails/_rails b/plugins/rails/_rails index 48fd1909e..dbd843c80 100644 --- a/plugins/rails/_rails +++ b/plugins/rails/_rails @@ -366,10 +366,10 @@ _rails_generate() { ;| (controller|job|model|resource|scaffold) opts+=( - '--parent=[The parent class for the generated controler]:parent class' + '--parent=[The parent class for the generated controller]:parent class' ) ;| - (controler|mailer|resource|scaffold|scaffold_controller) + (controller|mailer|resource|scaffold|scaffold_controller) opts+=( '(-e --template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:engine:(erb)' ) diff --git a/plugins/swiftpm/_swift b/plugins/swiftpm/_swift index f9a603f58..358d1dcae 100644 --- a/plugins/swiftpm/_swift +++ b/plugins/swiftpm/_swift @@ -634,7 +634,7 @@ _swift_package_unedit() { integer ret=1 local -a args args+=( - '--force[Unedit the package even if it has uncommited and unpushed changes]' + '--force[Unedit the package even if it has uncommitted and unpushed changes]' ':package-name:' '--version[Show the version.]' '(-help -h --help)'{-help,-h,--help}'[Show help information.]' diff --git a/plugins/zsh-navigation-tools/README.md b/plugins/zsh-navigation-tools/README.md index 4dc9cdba2..6d6c22f4f 100644 --- a/plugins/zsh-navigation-tools/README.md +++ b/plugins/zsh-navigation-tools/README.md @@ -185,7 +185,7 @@ Result is stored as `$reply[REPLY]` (`$` isn't needed before `REPLY` because of arithmetic context inside `[]`). The returned array might be different from input arguments as `n-list` can process them via incremental search or uniq mode. `$REPLY` is the index in that possibly processed array. If `$REPLY` -equals `-1` it means that no selection have been made (user quitted via `q` +equals `-1` it means that no selection have been made (user quit via `q` key). To set up entries that can be jumped to with `[`,`]` keys add their indices to diff --git a/plugins/zsh-navigation-tools/doc/n-preview b/plugins/zsh-navigation-tools/doc/n-preview index 2d8eea3fb..bcbbb88c7 100644 --- a/plugins/zsh-navigation-tools/doc/n-preview +++ b/plugins/zsh-navigation-tools/doc/n-preview @@ -170,7 +170,7 @@ while (( 1 )); do elif [ -n "$keypad" ]; then final_key="$keypad" else - _vpreview_status_msg "Inproper input detected" + _vpreview_status_msg "Improper input detected" zcurses refresh status fi From b8c69d265257fae88fe504ea43cbcf2728bc1308 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 21:02:04 +0200 Subject: [PATCH 24/47] chore(deps): bump certifi in /.github/workflows/dependencies (#12646) Bumps [certifi](https://github.com/certifi/python-certifi) from 2024.7.4 to 2024.8.30. - [Commits](https://github.com/certifi/python-certifi/compare/2024.07.04...2024.08.30) --- updated-dependencies: - dependency-name: certifi dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependencies/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index 81a119844..7cf0b642f 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -1,4 +1,4 @@ -certifi==2024.7.4 +certifi==2024.8.30 charset-normalizer==3.3.2 idna==3.8 PyYAML==6.0.2 From ab3d42a34cd0600b723de0accc248632f2dcf4e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Tue, 3 Sep 2024 23:35:22 +0200 Subject: [PATCH 25/47] Revert "fix(awesomepanda): new line wrap" (#12651) This reverts commit 80c114cb3a64044ea50b623f96a35bc022db5e8d. --- 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 000697397..85036e4ac 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 e50dd3417c8b9e072593b6c14473e1360bd88b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Thu, 5 Sep 2024 12:07:18 +0200 Subject: [PATCH 26/47] feat(extract): add support for `.crx` (Chrome extension format) (#12652) --- plugins/extract/_extract | 49 +++++++++++++++++++++++++++++- plugins/extract/extract.plugin.zsh | 2 +- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/plugins/extract/_extract b/plugins/extract/_extract index 56b17058f..0b43e86bc 100644 --- a/plugins/extract/_extract +++ b/plugins/extract/_extract @@ -1,7 +1,54 @@ #compdef extract #autoload +local -a exts=( + 7z + aar + apk + bz2 + cab + cpio + crx + deb + ear + gz + ipa + ipsw + jar + lrz + lz4 + lzma + obscpio + rar + rpm + sublime-package + tar + tar.bz2 + tar.gz + tar.lrz + tar.lz + tar.lz4 + tar.xz + tar.zma + tar.zst + tbz + tbz2 + tgz + tlz + txz + tzst + vsix + war + whl + xpi + xz + Z + zip + zpaq + zst +) + _arguments \ '(-r --remove)'{-r,--remove}'[Remove archive.]' \ - "*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|obscpio|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst|zpaq)(-.)'" \ + "*::archive file:_files -g '(#i)*.(${(j:|:)exts})(-.)'" \ && return 0 diff --git a/plugins/extract/extract.plugin.zsh b/plugins/extract/extract.plugin.zsh index f2eebf4d6..aa3fd00e6 100644 --- a/plugins/extract/extract.plugin.zsh +++ b/plugins/extract/extract.plugin.zsh @@ -76,7 +76,7 @@ EOF (*.lz4) lz4 -d "$full_path" ;; (*.lzma) unlzma "$full_path" ;; (*.z) uncompress "$full_path" ;; - (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix) unzip "$full_path" ;; + (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx) unzip "$full_path" ;; (*.rar) unrar x -ad "$full_path" ;; (*.rpm) rpm2cpio "$full_path" | cpio --quiet -id ;; From 2acfe1aa0e0c6a9c316fbec508f43dcf9f292ce3 Mon Sep 17 00:00:00 2001 From: Eduardo Dos Santos Vilke Date: Thu, 5 Sep 2024 14:40:19 -0300 Subject: [PATCH 27/47] feat(localstack): add plugin (#12595) --- plugins/localstack/README.md | 24 +++++++++++++++ plugins/localstack/localstack.plugin.zsh | 37 +++++++++++++++++++++++ plugins/localstack/sqs-send-result.png | Bin 0 -> 70661 bytes 3 files changed, 61 insertions(+) create mode 100644 plugins/localstack/README.md create mode 100644 plugins/localstack/localstack.plugin.zsh create mode 100644 plugins/localstack/sqs-send-result.png diff --git a/plugins/localstack/README.md b/plugins/localstack/README.md new file mode 100644 index 000000000..2c71e9edf --- /dev/null +++ b/plugins/localstack/README.md @@ -0,0 +1,24 @@ +# Localstack plugin # + +CLI support for LOCALSTACK interaction + +## Description ## +To use it, add `localstack` to the plugins array in your zshrc file: + +```zsh +plugins=(... localstack) +``` + +## Usage ## + +This plugin supplies one command, `lsk`, through which all its features are exposed. + +## Commands + +| Command | Description | +| :------------ | :-------------------------------------------------------------------- | +| `lsk sqs-send ` | sends a given message in sqs to a given queue | + +## Examples + +![staging](sqs-send-result.png) diff --git a/plugins/localstack/localstack.plugin.zsh b/plugins/localstack/localstack.plugin.zsh new file mode 100644 index 000000000..080b14a54 --- /dev/null +++ b/plugins/localstack/localstack.plugin.zsh @@ -0,0 +1,37 @@ +# CLI support for LOCALSTACK interaction +# +# See README.md for details +lsk() { + case $1 in + sqs-send) + shift + sqs-send "$@" + ;; + *) + echo "Command not found: $1" + return 1 + ;; + esac +} + +# Send SQS function +# +# This function sends a given message in sqs to a given queue, when used Localstack +# +# Use: +# sqs-send +# +# Parameters +# A given queue +# A content of message em json archive +# +# Example +# sqs-send user user.json +sqs-send(){ + if [ -z "$1" ]; then + echo "Use: sqs-send " + return 1 + fi + + curl -X POST "http://localhost:4566/000000000000/$1" -d "Action=SendMessage" -d "MessageBody=$(cat $2)" +} \ No newline at end of file diff --git a/plugins/localstack/sqs-send-result.png b/plugins/localstack/sqs-send-result.png new file mode 100644 index 0000000000000000000000000000000000000000..69eb2a64096b0b3fc476234fce1c50e51ea56b5a GIT binary patch literal 70661 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 Date: Thu, 5 Sep 2024 19:52:39 +0200 Subject: [PATCH 28/47] feat(terraform): add `fmt -recursive` alias (#12637) --- plugins/opentofu/README.md | 33 +++++++++++++------------- plugins/opentofu/opentofu.plugin.zsh | 1 + plugins/terraform/README.md | 31 ++++++++++++------------ plugins/terraform/terraform.plugin.zsh | 1 + 4 files changed, 35 insertions(+), 31 deletions(-) diff --git a/plugins/opentofu/README.md b/plugins/opentofu/README.md index 9c19501aa..9811e2751 100644 --- a/plugins/opentofu/README.md +++ b/plugins/opentofu/README.md @@ -15,22 +15,23 @@ plugins=(... opentofu) ## Aliases -| Alias | Command | -| ----- | --------------- | -| `tt` | `tofu` | -| `tta` | `tofu apply` | -| `ttc` | `tofu console` | -| `ttd` | `tofu destroy` | -| `ttf` | `tofu fmt` | -| `tti` | `tofu init` | -| `tto` | `tofu output` | -| `ttp` | `tofu plan` | -| `ttv` | `tofu validate` | -| `tts` | `tofu state` | -| `ttsh`| `tofu show` | -| `ttr` | `tofu refresh` | -| `ttt` | `tofu test` | -| `ttws`| `tofu workspace`| +| Alias | Command | +|--------|-----------------------| +| `tt` | `tofu` | +| `tta` | `tofu apply` | +| `ttc` | `tofu console` | +| `ttd` | `tofu destroy` | +| `ttf` | `tofu fmt` | +| `ttfr` | `tofu fmt -recursive` | +| `tti` | `tofu init` | +| `tto` | `tofu output` | +| `ttp` | `tofu plan` | +| `ttv` | `tofu validate` | +| `tts` | `tofu state` | +| `ttsh` | `tofu show` | +| `ttr` | `tofu refresh` | +| `ttt` | `tofu test` | +| `ttws` | `tofu workspace` | ## Prompt functions diff --git a/plugins/opentofu/opentofu.plugin.zsh b/plugins/opentofu/opentofu.plugin.zsh index c6844c84a..aa6cac78a 100644 --- a/plugins/opentofu/opentofu.plugin.zsh +++ b/plugins/opentofu/opentofu.plugin.zsh @@ -32,6 +32,7 @@ alias tta='tofu apply' alias ttc='tofu console' alias ttd='tofu destroy' alias ttf='tofu fmt' +alias ttfr='tofu fmt -recursive' alias tti='tofu init' alias tto='tofu output' alias ttp='tofu plan' diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md index b5158b4e9..ca5a771bc 100644 --- a/plugins/terraform/README.md +++ b/plugins/terraform/README.md @@ -15,21 +15,22 @@ plugins=(... terraform) ## Aliases -| Alias | Command | -| ------ | ------------------------- | -| `tf` | `terraform` | -| `tfa` | `terraform apply` | -| `tfc` | `terraform console` | -| `tfd` | `terraform destroy` | -| `tff` | `terraform fmt` | -| `tfi` | `terraform init` | -| `tfiu` | `terraform init -upgrade` | -| `tfo` | `terraform output` | -| `tfp` | `terraform plan` | -| `tfv` | `terraform validate` | -| `tfs` | `terraform state` | -| `tft` | `terraform test` | -| `tfsh` | `terraform show` | +| Alias | Command | +|--------|----------------------------| +| `tf` | `terraform` | +| `tfa` | `terraform apply` | +| `tfc` | `terraform console` | +| `tfd` | `terraform destroy` | +| `tff` | `terraform fmt` | +| `tffr` | `terraform fmt -recursive` | +| `tfi` | `terraform init` | +| `tfiu` | `terraform init -upgrade` | +| `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 71a58b939..181f57b9b 100644 --- a/plugins/terraform/terraform.plugin.zsh +++ b/plugins/terraform/terraform.plugin.zsh @@ -20,6 +20,7 @@ alias tfa='terraform apply' alias tfc='terraform console' alias tfd='terraform destroy' alias tff='terraform fmt' +alias tffr='terraform fmt -recursive' alias tfi='terraform init' alias tfiu='terraform init -upgrade' alias tfo='terraform output' From bc42097900e296a20f979b4ab836d4fd07670778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my?= Date: Thu, 5 Sep 2024 19:57:11 +0200 Subject: [PATCH 29/47] feat(kubectl): show labels in aliases `kgpsl` (get pod) and `kgnosl` (get node) (#12612) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marc Cornellà --- plugins/kubectl/README.md | 234 +++++++++++++++-------------- plugins/kubectl/kubectl.plugin.zsh | 10 +- 2 files changed, 122 insertions(+), 122 deletions(-) diff --git a/plugins/kubectl/README.md b/plugins/kubectl/README.md index 579a90b3b..28a502d11 100644 --- a/plugins/kubectl/README.md +++ b/plugins/kubectl/README.md @@ -11,122 +11,124 @@ plugins=(... kubectl) ## Aliases -| Alias | Command | Description | -|:--------|:------------------------------------|:-------------------------------------------------------------------------------------------------| -| k | `kubectl` | The kubectl command | -| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces | -| kaf | `kubectl apply -f` | Apply a YML file | -| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container | -| | | **Manage configuration quickly to switch contexts between local, dev and staging** | -| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file | -| kcsc | `kubectl config set-context` | Set a context entry in kubeconfig | -| kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig | -| kccc | `kubectl config current-context` | Display the current-context | -| kcgc | `kubectl config get-contexts` | List of contexts available | -| | | **General aliases** | -| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector | -| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument | -| | | **Pod management** | -| kgp | `kubectl get pods` | List all pods in ps output format | -| kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes | -| kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included | -| kep | `kubectl edit pods` | Edit pods from the default editor | -| kdp | `kubectl describe pods` | Describe all pods | -| kdelp | `kubectl delete pods` | Delete all pods matching passed arguments | -| kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` | -| kgpn | `kgp -n` | Get pods by namespace. Example: `kgpn kube-system` | -| | | **Service management** | -| kgs | `kubectl get svc` | List all services in ps output format | -| kgsw | `kgs --watch` | After listing all services, watch for changes | -| kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information | -| kes | `kubectl edit svc` | Edit services(svc) from the default editor | -| kds | `kubectl describe svc` | Describe all services in detail | -| kdels | `kubectl delete svc` | Delete all services matching passed argument | -| | | **Ingress management** | -| kgi | `kubectl get ingress` | List ingress resources in ps output format | -| kei | `kubectl edit ingress` | Edit ingress resource from the default editor | -| kdi | `kubectl describe ingress` | Describe ingress resource in detail | -| kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument | -| | | **Namespace management** | -| kgns | `kubectl get namespaces` | List the current namespaces in a cluster | -| kcn | `kubectl config set-context --current --namespace` | Change current namespace | -| kens | `kubectl edit namespace` | Edit namespace resource from the default editor | -| kdns | `kubectl describe namespace` | Describe namespace resource in detail | -| kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace | -| | | **ConfigMap management** | -| kgcm | `kubectl get configmaps` | List the configmaps in ps output format | -| kecm | `kubectl edit configmap` | Edit configmap resource from the default editor | -| kdcm | `kubectl describe configmap` | Describe configmap resource in detail | -| kdelcm | `kubectl delete configmap` | Delete the configmap | -| | | **Secret management** | -| kgsec | `kubectl get secret` | Get secret for decoding | -| kdsec | `kubectl describe secret` | Describe secret resource in detail | -| kdelsec | `kubectl delete secret` | Delete the secret | -| | | **Deployment management** | -| kgd | `kubectl get deployment` | Get the deployment | -| kgdw | `kgd --watch` | After getting the deployment, watch for changes | -| kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information | -| ked | `kubectl edit deployment` | Edit deployment resource from the default editor | -| kdd | `kubectl describe deployment` | Describe deployment resource in detail | -| kdeld | `kubectl delete deployment` | Delete the deployment | -| ksd | `kubectl scale deployment` | Scale a deployment | -| krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment | -| kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime | -| | | **Rollout management** | -| kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment | -| kdrs | `kubectl describe replicaset` | Describe ReplicaSet in detail | -| kers | `kubectl edit replicaset` | Edit ReplicaSet from the default editor | -| krh | `kubectl rollout history` | Check the revisions of this deployment | -| kru | `kubectl rollout undo` | Rollback to the previous revision | -| | | **Port forwarding** | -| kpf | `kubectl port-forward` | Forward one or more local ports to a pod | -| | | **Tools for accessing all information** | -| kga | `kubectl get all` | List all resources in ps format | -| kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces | -| | | **Logs** | -| kl | `kubectl logs` | Print the logs for a container or resource | -| klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) | -| | | **File copy** | -| kcp | `kubectl cp` | Copy files and directories to and from containers | -| | | **Node management** | -| kgno | `kubectl get nodes` | List the nodes in ps output format | -| keno | `kubectl edit node` | Edit nodes resource from the default editor | -| kdno | `kubectl describe node` | Describe node resource in detail | -| kdelno | `kubectl delete node` | Delete the node | -| | | **Persistent Volume Claim management** | -| kgpvc | `kubectl get pvc` | List all PVCs | -| kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes | -| kepvc | `kubectl edit pvc` | Edit pvcs from the default editor | -| kdpvc | `kubectl describe pvc` | Describe all pvcs | -| kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments | -| | | **StatefulSets management** | -| kgss | `kubectl get statefulset` | List the statefulsets in ps format | -| kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes | -| kgsswide| `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information | -| kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor | -| kdss | `kubectl describe statefulset` | Describe statefulset resource in detail | -| kdelss | `kubectl delete statefulset` | Delete the statefulset | -| ksss | `kubectl scale statefulset` | Scale a statefulset | -| krsss | `kubectl rollout status statefulset`| Check the rollout status of a deployment | -| | | **Service Accounts management** | -| kdsa | `kubectl describe sa` | Describe a service account in details | -| kdelsa | `kubectl delete sa` | Delete the service account | -| | | **DaemonSet management** | -| kgds | `kubectl get daemonset` | List all DaemonSets in ps output format | -| kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes | -| keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor | -| kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail | -| kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument | -| | | **CronJob management** | -| kgcj | `kubectl get cronjob` | List all CronJobs in ps output format | -| kecj | `kubectl edit cronjob` | Edit CronJob from the default editor | -| kdcj | `kubectl describe cronjob` | Describe a CronJob in details | -| kdelcj | `kubectl delete cronjob` | Delete the CronJob | -| | | **Job management** | -| kgj | `kubectl get job` | List all Job in ps output format | -| kej | `kubectl edit job` | Edit a Job in details | -| kdj | `kubectl describe job` | Describe the Job | -| kdelj | `kubectl delete job` | Delete the Job | +| Alias | Command | Description | +| :------- | :------------------------------------------------- | :----------------------------------------------------------------------------------------------- | +| k | `kubectl` | The kubectl command | +| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces | +| kaf | `kubectl apply -f` | Apply a YML file | +| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container | +| | | **Manage configuration quickly to switch contexts between local, dev and staging** | +| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file | +| kcsc | `kubectl config set-context` | Set a context entry in kubeconfig | +| kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig | +| kccc | `kubectl config current-context` | Display the current-context | +| kcgc | `kubectl config get-contexts` | List of contexts available | +| | | **General aliases** | +| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector | +| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument | +| | | **Pod management** | +| kgp | `kubectl get pods` | List all pods in ps output format | +| kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` | +| kgpn | `kgp -n` | Get pods by namespace. Example: `kgpn kube-system` | +| kgpsl | `kubectl get pods --show-labels` | List all pods in ps output format with labels | +| kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes | +| kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included | +| kep | `kubectl edit pods` | Edit pods from the default editor | +| kdp | `kubectl describe pods` | Describe all pods | +| kdelp | `kubectl delete pods` | Delete all pods matching passed arguments | +| | | **Service management** | +| kgs | `kubectl get svc` | List all services in ps output format | +| kgsw | `kgs --watch` | After listing all services, watch for changes | +| kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information | +| kes | `kubectl edit svc` | Edit services(svc) from the default editor | +| kds | `kubectl describe svc` | Describe all services in detail | +| kdels | `kubectl delete svc` | Delete all services matching passed argument | +| | | **Ingress management** | +| kgi | `kubectl get ingress` | List ingress resources in ps output format | +| kei | `kubectl edit ingress` | Edit ingress resource from the default editor | +| kdi | `kubectl describe ingress` | Describe ingress resource in detail | +| kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument | +| | | **Namespace management** | +| kgns | `kubectl get namespaces` | List the current namespaces in a cluster | +| kcn | `kubectl config set-context --current --namespace` | Change current namespace | +| kens | `kubectl edit namespace` | Edit namespace resource from the default editor | +| kdns | `kubectl describe namespace` | Describe namespace resource in detail | +| kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace | +| | | **ConfigMap management** | +| kgcm | `kubectl get configmaps` | List the configmaps in ps output format | +| kecm | `kubectl edit configmap` | Edit configmap resource from the default editor | +| kdcm | `kubectl describe configmap` | Describe configmap resource in detail | +| kdelcm | `kubectl delete configmap` | Delete the configmap | +| | | **Secret management** | +| kgsec | `kubectl get secret` | Get secret for decoding | +| kdsec | `kubectl describe secret` | Describe secret resource in detail | +| kdelsec | `kubectl delete secret` | Delete the secret | +| | | **Deployment management** | +| kgd | `kubectl get deployment` | Get the deployment | +| kgdw | `kgd --watch` | After getting the deployment, watch for changes | +| kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information | +| ked | `kubectl edit deployment` | Edit deployment resource from the default editor | +| kdd | `kubectl describe deployment` | Describe deployment resource in detail | +| kdeld | `kubectl delete deployment` | Delete the deployment | +| ksd | `kubectl scale deployment` | Scale a deployment | +| krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment | +| kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime | +| | | **Rollout management** | +| kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment | +| kdrs | `kubectl describe replicaset` | Describe ReplicaSet in detail | +| kers | `kubectl edit replicaset` | Edit ReplicaSet from the default editor | +| krh | `kubectl rollout history` | Check the revisions of this deployment | +| kru | `kubectl rollout undo` | Rollback to the previous revision | +| | | **Port forwarding** | +| kpf | `kubectl port-forward` | Forward one or more local ports to a pod | +| | | **Tools for accessing all information** | +| kga | `kubectl get all` | List all resources in ps format | +| kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces | +| | | **Logs** | +| kl | `kubectl logs` | Print the logs for a container or resource | +| klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) | +| | | **File copy** | +| kcp | `kubectl cp` | Copy files and directories to and from containers | +| | | **Node management** | +| kgno | `kubectl get nodes` | List the nodes in ps output format | +| kgnosl | `kubectl get nodes --show-labels` | List the nodes in ps output format with labels | +| keno | `kubectl edit node` | Edit nodes resource from the default editor | +| kdno | `kubectl describe node` | Describe node resource in detail | +| kdelno | `kubectl delete node` | Delete the node | +| | | **Persistent Volume Claim management** | +| kgpvc | `kubectl get pvc` | List all PVCs | +| kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes | +| kepvc | `kubectl edit pvc` | Edit pvcs from the default editor | +| kdpvc | `kubectl describe pvc` | Describe all pvcs | +| kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments | +| | | **StatefulSets management** | +| kgss | `kubectl get statefulset` | List the statefulsets in ps format | +| kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes | +| kgsswide | `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information | +| kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor | +| kdss | `kubectl describe statefulset` | Describe statefulset resource in detail | +| kdelss | `kubectl delete statefulset` | Delete the statefulset | +| ksss | `kubectl scale statefulset` | Scale a statefulset | +| krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment | +| | | **Service Accounts management** | +| kdsa | `kubectl describe sa` | Describe a service account in details | +| kdelsa | `kubectl delete sa` | Delete the service account | +| | | **DaemonSet management** | +| kgds | `kubectl get daemonset` | List all DaemonSets in ps output format | +| kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes | +| keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor | +| kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail | +| kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument | +| | | **CronJob management** | +| kgcj | `kubectl get cronjob` | List all CronJobs in ps output format | +| kecj | `kubectl edit cronjob` | Edit CronJob from the default editor | +| kdcj | `kubectl describe cronjob` | Describe a CronJob in details | +| kdelcj | `kubectl delete cronjob` | Delete the CronJob | +| | | **Job management** | +| kgj | `kubectl get job` | List all Job in ps output format | +| kej | `kubectl edit job` | Edit a Job in details | +| kdj | `kubectl describe job` | Describe the Job | +| kdelj | `kubectl delete job` | Delete the Job | ## Wrappers diff --git a/plugins/kubectl/kubectl.plugin.zsh b/plugins/kubectl/kubectl.plugin.zsh index ad78fedeb..33699bdf9 100644 --- a/plugins/kubectl/kubectl.plugin.zsh +++ b/plugins/kubectl/kubectl.plugin.zsh @@ -39,6 +39,9 @@ alias kdelf='kubectl delete -f' # Pod management. alias kgp='kubectl get pods' +alias kgpl='kgp -l' +alias kgpn='kgp -n' +alias kgpsl='kubectl get pods --show-labels' alias kgpa='kubectl get pods --all-namespaces' alias kgpw='kgp --watch' alias kgpwide='kgp -o wide' @@ -47,12 +50,6 @@ alias kdp='kubectl describe pods' alias kdelp='kubectl delete pods' alias kgpall='kubectl get pods --all-namespaces -o wide' -# get pod by label: kgpl "app=myapp" -n myns -alias kgpl='kgp -l' - -# get pod by namespace: kgpn kube-system" -alias kgpn='kgp -n' - # Service management. alias kgs='kubectl get svc' alias kgsa='kubectl get svc --all-namespaces' @@ -144,6 +141,7 @@ alias kcp='kubectl cp' # Node Management alias kgno='kubectl get nodes' +alias kgnosl='kubectl get nodes --show-labels' alias keno='kubectl edit node' alias kdno='kubectl describe node' alias kdelno='kubectl delete node' From 95579e3ca181036af31c0c9039fe3edc65c231b4 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 5 Sep 2024 20:20:06 +0200 Subject: [PATCH 30/47] feat(1password): make completion loading async --- plugins/1password/1password.plugin.zsh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/plugins/1password/1password.plugin.zsh b/plugins/1password/1password.plugin.zsh index 941523ca8..e8f91f8fe 100644 --- a/plugins/1password/1password.plugin.zsh +++ b/plugins/1password/1password.plugin.zsh @@ -1,9 +1,15 @@ # Do nothing if op is not installed (( ${+commands[op]} )) || return -# Load op completion -eval "$(op completion zsh)" -compdef _op op +# If the completion file doesn't exist yet, we need to autoload it and +# bind it to `op`. Otherwise, compinit will have already done that. +if [[ ! -f "$ZSH_CACHE_DIR/completions/_op" ]]; then + typeset -g -A _comps + autoload -Uz _op + _comps[op]=_op +fi + +op completion zsh >| "$ZSH_CACHE_DIR/completions/_op" &| # Load opswd function autoload -Uz opswd From 80fa5e137672a529f65a05e396b40f0d133b2432 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 5 Sep 2024 20:20:45 +0200 Subject: [PATCH 31/47] fix(1password): copy password properly in `opswd` Closes #12635 --- plugins/1password/opswd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/1password/opswd b/plugins/1password/opswd index 0f667d2ff..753de9f99 100644 --- a/plugins/1password/opswd +++ b/plugins/1password/opswd @@ -27,7 +27,7 @@ function opswd() { local password # Copy the password to the clipboard - if ! password=$(op item get "$service" --fields password 2>/dev/null); then + if ! password=$(op item get "$service" --reveal --fields password 2>/dev/null); then echo "error: could not obtain password for $service" return 1 fi From 2abecedf67f47f0b39ee31b38705630eaa8dc21f Mon Sep 17 00:00:00 2001 From: Mattias Eriksson <6420639+snaggen@users.noreply.github.com> Date: Tue, 10 Sep 2024 11:32:18 +0200 Subject: [PATCH 32/47] feat(ssh-agent): support `id_ed25519_sk` (#12663) --- 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 1da54d4dd..35d06384d 100644 --- a/plugins/ssh-agent/ssh-agent.plugin.zsh +++ b/plugins/ssh-agent/ssh-agent.plugin.zsh @@ -43,7 +43,7 @@ function _add_identities() { # this is to mimic the call to ssh-add with no identities if [[ ${#identities} -eq 0 ]]; then # key list found on `ssh-add` man page's DESCRIPTION section - for id in id_rsa id_dsa id_ecdsa id_ed25519 identity; do + for id in id_rsa id_dsa id_ecdsa id_ed25519 id_ed25519_sk identity; do # check if file exists [[ -f "$HOME/.ssh/$id" ]] && identities+=($id) done From f6cd6a776993b584f4abbdd204c6e4011b7d2f93 Mon Sep 17 00:00:00 2001 From: Tulsi Prasad Date: Tue, 10 Sep 2024 18:53:37 +0530 Subject: [PATCH 33/47] feat(web-search): add chatgpt (#12660) --- plugins/web-search/README.md | 15 ++++++++------- plugins/web-search/web-search.plugin.zsh | 2 ++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/plugins/web-search/README.md b/plugins/web-search/README.md index d21c81ca9..91754ac7f 100644 --- a/plugins/web-search/README.md +++ b/plugins/web-search/README.md @@ -50,16 +50,17 @@ Available search contexts are: | `npmpkg` | `https://www.npmjs.com/search?q=` | | `packagist` | `https://packagist.org/?query=` | | `gopkg` | `https://pkg.go.dev/search?m=package&q=` | +| `chatgpt` | `https://chatgpt.com/?q=` | Also there are aliases for bang-searching DuckDuckGo: -| Context | Bang | -| --------- | ----- | -| `wiki` | `!w` | -| `news` | `!n` | -| `map` | `!m` | -| `image` | `!i` | -| `ducky` | `!` | +| Context | Bang | +| ------- | ---- | +| `wiki` | `!w` | +| `news` | `!n` | +| `map` | `!m` | +| `image` | `!i` | +| `ducky` | `!` | ### Custom search engines diff --git a/plugins/web-search/web-search.plugin.zsh b/plugins/web-search/web-search.plugin.zsh index c602e0623..2f524ba1e 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -31,6 +31,7 @@ function web_search() { npmpkg "https://www.npmjs.com/search?q=" packagist "https://packagist.org/?query=" gopkg "https://pkg.go.dev/search?m=package&q=" + chatgpt "https://chatgpt.com/?q=" ) # check whether the search engine is supported @@ -83,6 +84,7 @@ alias dockerhub='web_search dockerhub' alias npmpkg='web_search npmpkg' alias packagist='web_search packagist' alias gopkg='web_search gopkg' +alias chatgpt='web_search chatgpt' #add your own !bang searches here alias wiki='web_search duckduckgo \!w' From f709cd45484ff7a451414fcd53bca8529323512d Mon Sep 17 00:00:00 2001 From: "ohmyzsh[bot]" <54982679+ohmyzsh[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 08:16:50 +0200 Subject: [PATCH 34/47] feat(wd): update to 7054de2b (#12675) Co-authored-by: ohmyzsh[bot] <54982679+ohmyzsh[bot]@users.noreply.github.com> --- .github/dependencies.yml | 2 +- plugins/wd/README.md | 17 +++++++---------- plugins/wd/wd.plugin.zsh | 3 +-- plugins/wd/wd.sh | 14 +++----------- 4 files changed, 12 insertions(+), 24 deletions(-) diff --git a/.github/dependencies.yml b/.github/dependencies.yml index be2d02cd8..2be4cdfb0 100644 --- a/.github/dependencies.yml +++ b/.github/dependencies.yml @@ -28,7 +28,7 @@ dependencies: plugins/wd: repo: mfaerevaag/wd branch: master - version: tag:v0.7.1 + version: tag:v0.9.0 precopy: | set -e rm -r test diff --git a/plugins/wd/README.md b/plugins/wd/README.md index bf19031f8..b345d65f5 100644 --- a/plugins/wd/README.md +++ b/plugins/wd/README.md @@ -115,9 +115,11 @@ wd() { 3. Install manpage (optional): +Move manpage into an appropriate directory, then trigger `mandb` to discover it + ```zsh -sudo cp ~/.local/wd/wd.1 /usr/share/man/man1/wd.1 -sudo chmod 644 /usr/share/man/man1/wd.1 +sudo install -m 644 ~/.local/wd/wd.1 /usr/share/man/man1/wd.1 +sudo mandb /usr/share/man/man1 ``` **Note:** when pulling and updating `wd`, you'll need to repeat step 3 should the manpage change @@ -139,10 +141,11 @@ 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`: +`wd` comes with an `fzf`-powered browse feature to fuzzy search through all your warp points. It's available through the `wd browse` command. For quick access you can set up an alias or keybind in your `.zshrc`: ```zsh -bindkey ${FZF_WD_BINDKEY:-'^B'} fuzzy_wd_widget +# ctrl-b to open the fzf browser +bindkey ${FZF_WD_BINDKEY:-'^B'} wd_browse_widget ``` ## Usage @@ -255,12 +258,6 @@ wd --version wd --config ./file ``` -* Force `exit` with return code after running. This is not default, as it will *exit your terminal*, though required for testing/debugging. - -```zsh -wd --debug -``` - * Silence all output: ```zsh diff --git a/plugins/wd/wd.plugin.zsh b/plugins/wd/wd.plugin.zsh index 9910cb968..2397e6f31 100644 --- a/plugins/wd/wd.plugin.zsh +++ b/plugins/wd/wd.plugin.zsh @@ -1,4 +1,4 @@ -#!/bin/zsh +#!/usr/bin/env zsh # WARP DIRECTORY # ============== @@ -18,4 +18,3 @@ 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 34f887a0e..ddd31e6f6 100755 --- a/plugins/wd/wd.sh +++ b/plugins/wd/wd.sh @@ -1,4 +1,4 @@ -#!/bin/zsh +#!/usr/bin/env zsh # WARP DIRECTORY # ============== @@ -8,7 +8,7 @@ # @github.com/mfaerevaag/wd # version -readonly WD_VERSION=0.7.0 +readonly WD_VERSION=0.9.0 # colors readonly WD_BLUE="\033[96m" @@ -90,7 +90,6 @@ Commands: 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) -c | --config Specify config file (default ~/.warprc) -q | --quiet Suppress all output -f | --force Allows overwriting without warning (for add & clean) @@ -426,7 +425,6 @@ wd_export_static_named_directories() { WD_CONFIG=${WD_CONFIG:-$HOME/.warprc} local WD_QUIET=0 local WD_EXIT_CODE=0 -local WD_DEBUG=0 # Parse 'meta' options first to avoid the need to have them before # other commands. The `-D` flag consumes recognized options so that @@ -436,7 +434,6 @@ zparseopts -D -E \ c:=wd_alt_config -config:=wd_alt_config \ q=wd_quiet_mode -quiet=wd_quiet_mode \ v=wd_print_version -version=wd_print_version \ - d=wd_debug_mode -debug=wd_debug_mode \ f=wd_force_mode -force=wd_force_mode if [[ ! -z $wd_print_version ]] @@ -583,9 +580,4 @@ unset args unset points unset val &> /dev/null # fixes issue #1 -if [[ -n $wd_debug_mode ]] -then - exit $WD_EXIT_CODE -else - unset wd_debug_mode -fi +return $WD_EXIT_CODE From 33ac2ee30f92183565b30ef2ed847870d0b9b052 Mon Sep 17 00:00:00 2001 From: Saravana J Date: Sun, 15 Sep 2024 11:47:43 +0530 Subject: [PATCH 35/47] fix(git): update prefix map for modified files (#12674) --- lib/git.zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/git.zsh b/lib/git.zsh index db6c9174c..2ad5afe04 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -227,7 +227,7 @@ function _omz_git_prompt_status() { prefix_constant_map=( '\?\? ' 'UNTRACKED' 'A ' 'ADDED' - 'M ' 'ADDED' + 'M ' 'MODIFIED' 'MM ' 'MODIFIED' ' M ' 'MODIFIED' 'AM ' 'MODIFIED' From a84bc2dadd9c0925c2f88e66a1796746e63fa427 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 15 Sep 2024 15:06:47 +0200 Subject: [PATCH 36/47] fix(python)!: remove harmful `ipython` alias (#12676) BREAKING CHANGE: the `ipython` alias was incorrectly trying to manually call ipython from the installed module in the virtual environment, when actually a command already exists when loading the virtual environment. This change removes the unnecessary alias and allows calling the right command. Fixes #12676 --- plugins/python/README.md | 1 - plugins/python/python.plugin.zsh | 3 --- 2 files changed, 4 deletions(-) diff --git a/plugins/python/README.md b/plugins/python/README.md index b990a26b9..8014992de 100644 --- a/plugins/python/README.md +++ b/plugins/python/README.md @@ -13,7 +13,6 @@ plugins=(... python) | Command | Description | | ---------------- | -------------------------------------------------------------------------------------- | | `py` | Runs `python3`. Only set if `py` is not installed. | -| `ipython` | Runs the appropriate `ipython` version according to the activated virtualenv | | `pyfind` | Finds .py files recursively in the current directory | | `pyclean [dirs]` | Deletes byte-code and cache files from a list of directories or the current one | | `pygrep ` | Looks for `text` in `*.py` files in the current directory, recursively | diff --git a/plugins/python/python.plugin.zsh b/plugins/python/python.plugin.zsh index 811745257..63733e1de 100644 --- a/plugins/python/python.plugin.zsh +++ b/plugins/python/python.plugin.zsh @@ -43,9 +43,6 @@ function pyuserpaths() { # Grep among .py files alias pygrep='grep -nr --include="*.py"' -# Run proper IPython regarding current virtualenv (if any) -alias ipython='python3 -c "import sys; del sys.path[0]; import IPython; sys.exit(IPython.start_ipython())"' - # Share local directory as a HTTP server alias pyserver="python3 -m http.server" From e3e80b98b575ab75b9c7d182184faffc0b51c5f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Cornell=C3=A0?= Date: Sun, 15 Sep 2024 15:14:38 +0200 Subject: [PATCH 37/47] chore(jsontools): change link to NDJSON spec (#12671) Fixes #12671 --- plugins/jsontools/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/jsontools/README.md b/plugins/jsontools/README.md index 6a2740014..d92608806 100644 --- a/plugins/jsontools/README.md +++ b/plugins/jsontools/README.md @@ -19,7 +19,7 @@ Usage is simple... just take your json data and pipe it into the appropriate jso ### Supports NDJSON (Newline Delimited JSON) -The plugin also supports [NDJSON](http://ndjson.org/) input, which means all functions +The plugin also supports [NDJSON](https://github.com/ndjson/ndjson-spec) input, which means all functions have an alternative function that reads and processes the input line by line. These functions have the same name except using `ndjson` instead of `json`: From 8c13f021bf3f0315f516f73c8f2555bd7a4313d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 19:36:08 +0200 Subject: [PATCH 38/47] chore(deps): bump idna in /.github/workflows/dependencies (#12678) Bumps [idna](https://github.com/kjd/idna) from 3.8 to 3.9. - [Release notes](https://github.com/kjd/idna/releases) - [Changelog](https://github.com/kjd/idna/blob/master/HISTORY.rst) - [Commits](https://github.com/kjd/idna/compare/v3.8...v3.9) --- updated-dependencies: - dependency-name: idna dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependencies/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index 7cf0b642f..9b5b03ea0 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -1,6 +1,6 @@ certifi==2024.8.30 charset-normalizer==3.3.2 -idna==3.8 +idna==3.9 PyYAML==6.0.2 requests==2.32.3 semver==3.0.2 From ec7d01faf837f17ccdc91249d0e63117ad0585af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 15 Sep 2024 19:36:24 +0200 Subject: [PATCH 39/47] chore(deps): bump urllib3 in /.github/workflows/dependencies (#12677) Bumps [urllib3](https://github.com/urllib3/urllib3) from 2.2.2 to 2.2.3. - [Release notes](https://github.com/urllib3/urllib3/releases) - [Changelog](https://github.com/urllib3/urllib3/blob/main/CHANGES.rst) - [Commits](https://github.com/urllib3/urllib3/compare/2.2.2...2.2.3) --- updated-dependencies: - dependency-name: urllib3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/dependencies/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dependencies/requirements.txt b/.github/workflows/dependencies/requirements.txt index 9b5b03ea0..05b2f27fe 100644 --- a/.github/workflows/dependencies/requirements.txt +++ b/.github/workflows/dependencies/requirements.txt @@ -4,4 +4,4 @@ idna==3.9 PyYAML==6.0.2 requests==2.32.3 semver==3.0.2 -urllib3==2.2.2 +urllib3==2.2.3 From ac325a7caba6630538c39e1c0ffa192d866cdcff Mon Sep 17 00:00:00 2001 From: PukNgae Cryolitia Date: Mon, 16 Sep 2024 05:20:59 +0800 Subject: [PATCH 40/47] feat(bgnotify): add config to pass extra args (#12679) --- plugins/bgnotify/README.md | 1 + plugins/bgnotify/bgnotify.plugin.zsh | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/plugins/bgnotify/README.md b/plugins/bgnotify/README.md index 33d529f15..1389def86 100644 --- a/plugins/bgnotify/README.md +++ b/plugins/bgnotify/README.md @@ -38,6 +38,7 @@ One can configure a few things: - `bgnotify_bell` enabled or disables the terminal bell (default true) - `bgnotify_threshold` sets the notification threshold time (default 6 seconds) - `function bgnotify_formatted` lets you change the notification. You can for instance customize the message and pass in an icon. +- `bgnotify_extraargs` appends extra args to notifier (e.g. `-e` for notify-send to create a transient notification) Use these by adding a function definition before the your call to source. Example: diff --git a/plugins/bgnotify/bgnotify.plugin.zsh b/plugins/bgnotify/bgnotify.plugin.zsh index 7de6f9a91..f6ffb6ed5 100644 --- a/plugins/bgnotify/bgnotify.plugin.zsh +++ b/plugins/bgnotify/bgnotify.plugin.zsh @@ -117,15 +117,15 @@ 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"} &>/dev/null + terminal-notifier -message "$message" -title "$title" ${=icon:+-appIcon "$icon"} ${=term_id:+-activate "$term_id"} ${=bgnotify_extraargs:-} &>/dev/null elif (( ${+commands[growlnotify]} )); then # macOS growl - growlnotify -m "$title" "$message" + growlnotify -m "$title" "$message" ${=bgnotify_extraargs:-} elif (( ${+commands[notify-send]} )); then - notify-send "$title" "$message" ${=icon:+--icon "$icon"} + notify-send "$title" "$message" ${=icon:+--icon "$icon"} ${=bgnotify_extraargs:-} elif (( ${+commands[kdialog]} )); then # KDE - kdialog --title "$title" --passivepopup "$message" 5 + kdialog --title "$title" --passivepopup "$message" 5 ${=bgnotify_extraargs:-} elif (( ${+commands[notifu]} )); then # cygwin - notifu /m "$message" /p "$title" ${=icon:+/i "$icon"} + notifu /m "$message" /p "$title" ${=icon:+/i "$icon"} ${=bgnotify_extraargs:-} fi } From 3151c9c1a330cdea66dd7d1a24810fe805298711 Mon Sep 17 00:00:00 2001 From: Ruslan Tursunov Date: Wed, 18 Sep 2024 13:58:00 +0300 Subject: [PATCH 41/47] fix(git): re-add accidentally removed `gcn` (#12681) --- 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 e03f204f7..bcadc4713 100644 --- a/plugins/git/README.md +++ b/plugins/git/README.md @@ -73,6 +73,7 @@ plugins=(... git) | `gcans!` | `git commit --verbose --all --signoff --no-edit --amend` | | `gcann!` | `git commit --verbose --all --date=now --no-edit --amend` | | `gc!` | `git commit --verbose --amend` | +| `gcn` | `git commit --verbose --no-edit` | | `gcn!` | `git commit --verbose --no-edit --amend` | | `gcs` | `git commit -S` | | `gcss` | `git commit -S -s` | diff --git a/plugins/git/git.plugin.zsh b/plugins/git/git.plugin.zsh index 28d5cb314..f34c0726b 100644 --- a/plugins/git/git.plugin.zsh +++ b/plugins/git/git.plugin.zsh @@ -197,6 +197,7 @@ alias gcan!='git commit --verbose --all --no-edit --amend' alias gcans!='git commit --verbose --all --signoff --no-edit --amend' alias gcann!='git commit --verbose --all --date=now --no-edit --amend' alias gc!='git commit --verbose --amend' +alias gcn='git commit --verbose --no-edit' alias gcn!='git commit --verbose --no-edit --amend' alias gcf='git config --list' alias gdct='git describe --tags $(git rev-list --tags --max-count=1)' From 9bcafe1c27f62f224c095cd2479763280336090b Mon Sep 17 00:00:00 2001 From: Erik Teichmann Date: Wed, 18 Sep 2024 11:26:38 -0700 Subject: [PATCH 42/47] feat(functions): add `takezip` (#12670) --- lib/functions.zsh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/functions.zsh b/lib/functions.zsh index 2e667332e..b68c35c13 100644 --- a/lib/functions.zsh +++ b/lib/functions.zsh @@ -57,6 +57,16 @@ function takeurl() { cd "$thedir" } +function takezip() { + local data thedir + data="$(mktemp)" + curl -L "$1" > "$data" + unzip "$data" -d "./" + thedir="$(unzip -l "$data" | awk 'NR==4 {print $4}' | sed 's/\/.*//')" + rm "$data" + cd "$thedir" +} + function takegit() { git clone "$1" cd "$(basename ${1%%.git})" @@ -65,6 +75,8 @@ function takegit() { function take() { if [[ $1 =~ ^(https?|ftp).*\.(tar\.(gz|bz2|xz)|tgz)$ ]]; then takeurl "$1" + elif [[ $1 =~ ^(https?|ftp).*\.(zip)$ ]]; then + takezip "$1" elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]; then takegit "$1" else From 865291cb7af2fef7e67128fd4294f3ffa9b08c3d Mon Sep 17 00:00:00 2001 From: Tushar Mohod <98651842+tusharmohod@users.noreply.github.com> Date: Thu, 19 Sep 2024 00:10:54 +0530 Subject: [PATCH 43/47] feat (terraform): add `apply -auto-approve` alias (#12658) Closes #12591 --- plugins/terraform/README.md | 33 +++++++++++++------------- plugins/terraform/terraform.plugin.zsh | 1 + 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/plugins/terraform/README.md b/plugins/terraform/README.md index ca5a771bc..3f8ed6dee 100644 --- a/plugins/terraform/README.md +++ b/plugins/terraform/README.md @@ -15,22 +15,23 @@ plugins=(... terraform) ## Aliases -| Alias | Command | -|--------|----------------------------| -| `tf` | `terraform` | -| `tfa` | `terraform apply` | -| `tfc` | `terraform console` | -| `tfd` | `terraform destroy` | -| `tff` | `terraform fmt` | -| `tffr` | `terraform fmt -recursive` | -| `tfi` | `terraform init` | -| `tfiu` | `terraform init -upgrade` | -| `tfo` | `terraform output` | -| `tfp` | `terraform plan` | -| `tfv` | `terraform validate` | -| `tfs` | `terraform state` | -| `tft` | `terraform test` | -| `tfsh` | `terraform show` | +| Alias | Command | +|---------|----------------------------------| +| `tf` | `terraform` | +| `tfa` | `terraform apply` | +| `tfaa` | `terraform apply -auto-approve` | +| `tfc` | `terraform console` | +| `tfd` | `terraform destroy` | +| `tff` | `terraform fmt` | +| `tffr` | `terraform fmt -recursive` | +| `tfi` | `terraform init` | +| `tfiu` | `terraform init -upgrade` | +| `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 181f57b9b..bedd46011 100644 --- a/plugins/terraform/terraform.plugin.zsh +++ b/plugins/terraform/terraform.plugin.zsh @@ -17,6 +17,7 @@ function tf_version_prompt_info() { alias tf='terraform' alias tfa='terraform apply' +alias tfaa='terraform apply -auto-approve' alias tfc='terraform console' alias tfd='terraform destroy' alias tff='terraform fmt' From d91944d47e6f4163da16e6fa71a41e35e2af191e Mon Sep 17 00:00:00 2001 From: rakeshgm Date: Thu, 19 Sep 2024 00:12:18 +0530 Subject: [PATCH 44/47] feat(gnzh): add virtualenv prompt (#12666) --- themes/gnzh.zsh-theme | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/themes/gnzh.zsh-theme b/themes/gnzh.zsh-theme index ca62320e2..0297a6f6f 100644 --- a/themes/gnzh.zsh-theme +++ b/themes/gnzh.zsh-theme @@ -30,8 +30,9 @@ local return_code="%(?..%F{red}%? ↵%f)" local user_host="${PR_USER}%F{cyan}@${PR_HOST}" local current_dir="%B%F{blue}%~%f%b" local git_branch='$(git_prompt_info)' +local venv_prompt='$(virtualenv_prompt_info)' -PROMPT="╭─${user_host} ${current_dir} \$(ruby_prompt_info) ${git_branch} +PROMPT="╭─${venv_prompt}${user_host} ${current_dir} \$(ruby_prompt_info) ${git_branch} ╰─$PR_PROMPT " RPROMPT="${return_code}" @@ -39,5 +40,7 @@ ZSH_THEME_GIT_PROMPT_PREFIX="%F{yellow}‹" ZSH_THEME_GIT_PROMPT_SUFFIX="› %f" ZSH_THEME_RUBY_PROMPT_PREFIX="%F{red}‹" ZSH_THEME_RUBY_PROMPT_SUFFIX="›%f" +ZSH_THEME_VIRTUALENV_PREFIX="%F{red}(" +ZSH_THEME_VIRTUALENV_SUFFIX=")%f " } From e52598a5cc3c73fa907f83c84f4270fdaee9c930 Mon Sep 17 00:00:00 2001 From: Francesco Cataldo <78490028+FraCata00@users.noreply.github.com> Date: Wed, 18 Sep 2024 20:43:52 +0200 Subject: [PATCH 45/47] feat(web-search): add `reddit` (#12664) --- plugins/web-search/README.md | 1 + plugins/web-search/web-search.plugin.zsh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/plugins/web-search/README.md b/plugins/web-search/README.md index 91754ac7f..ad3741fc9 100644 --- a/plugins/web-search/README.md +++ b/plugins/web-search/README.md @@ -51,6 +51,7 @@ Available search contexts are: | `packagist` | `https://packagist.org/?query=` | | `gopkg` | `https://pkg.go.dev/search?m=package&q=` | | `chatgpt` | `https://chatgpt.com/?q=` | +| `reddit` | `https://www.reddit.com/search/?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 2f524ba1e..81eb1c77d 100644 --- a/plugins/web-search/web-search.plugin.zsh +++ b/plugins/web-search/web-search.plugin.zsh @@ -32,6 +32,7 @@ function web_search() { packagist "https://packagist.org/?query=" gopkg "https://pkg.go.dev/search?m=package&q=" chatgpt "https://chatgpt.com/?q=" + reddit "https://www.reddit.com/search/?q=" ) # check whether the search engine is supported @@ -85,6 +86,7 @@ alias npmpkg='web_search npmpkg' alias packagist='web_search packagist' alias gopkg='web_search gopkg' alias chatgpt='web_search chatgpt' +alias reddit='web_search reddit' #add your own !bang searches here alias wiki='web_search duckduckgo \!w' From 99e2c31484bba519925a65b442d0516fc6e01c94 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Wed, 18 Sep 2024 21:05:45 +0200 Subject: [PATCH 46/47] feat(git): add `git_previous_branch` function Closes #12538 --- lib/git.zsh | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/git.zsh b/lib/git.zsh index 2ad5afe04..8237af751 100644 --- a/lib/git.zsh +++ b/lib/git.zsh @@ -162,6 +162,18 @@ function git_current_branch() { echo ${ref#refs/heads/} } +# Outputs the name of the previously checked out branch +# Usage example: git pull origin $(git_current_branch) +# rev-parse --symbolic-full-name @{-1} only prints if it is a branch +function git_previous_branch() { + local ref + ref=$(__git_prompt_git rev-parse --quiet --symbolic-full-name @{-1} 2> /dev/null) + local ret=$? + if [[ $ret != 0 ]] || [[ -z $ref ]]; then + return # no git repo or non-branch previous ref + fi + echo ${ref#refs/heads/} +} # Gets the number of commits ahead from remote function git_commits_ahead() { From 1514145a09140425b914e9cd98fc1d638a8c4003 Mon Sep 17 00:00:00 2001 From: Carlo Sala Date: Thu, 19 Sep 2024 11:44:51 +0200 Subject: [PATCH 47/47] feat(nvm): add `_omz_nvm_load` function --- plugins/nvm/README.md | 2 ++ plugins/nvm/nvm.plugin.zsh | 24 +++++++++++++----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/plugins/nvm/README.md b/plugins/nvm/README.md index fe91cc3b2..1245f66db 100644 --- a/plugins/nvm/README.md +++ b/plugins/nvm/README.md @@ -42,6 +42,8 @@ as you want: zstyle ':omz:plugins:nvm' lazy-cmd eslint prettier typescript ... ``` +There will be a function `_omz_nvm_load` available to load `nvm` without executing any other trigger command. + #### `.nvmrc` autoload Note: _if used at the same time as `lazy`, `autoload` will start working only after nvm has been lazy-loaded_ diff --git a/plugins/nvm/nvm.plugin.zsh b/plugins/nvm/nvm.plugin.zsh index a00c2e117..682bddc47 100644 --- a/plugins/nvm/nvm.plugin.zsh +++ b/plugins/nvm/nvm.plugin.zsh @@ -20,7 +20,7 @@ if [[ -z "$NVM_DIR" ]] || [[ ! -f "$NVM_DIR/nvm.sh" ]]; then return fi -function _omz_load_nvm_completion { +function _omz_nvm_setup_completion { local _nvm_completion # Load nvm bash completion for _nvm_completion in "$NVM_DIR/bash_completion" "$NVM_HOMEBREW/etc/bash_completion.d/nvm"; do @@ -33,12 +33,12 @@ function _omz_load_nvm_completion { break fi done - unfunction _omz_load_nvm_completion + unfunction _omz_nvm_setup_completion } -function _omz_setup_autoload { +function _omz_nvm_setup_autoload { if ! zstyle -t ':omz:plugins:nvm' autoload; then - unfunction _omz_setup_autoload + unfunction _omz_nvm_setup_autoload return fi @@ -68,13 +68,13 @@ function _omz_setup_autoload { add-zsh-hook chpwd load-nvmrc load-nvmrc - unfunction _omz_setup_autoload + unfunction _omz_nvm_setup_autoload } if zstyle -t ':omz:plugins:nvm' lazy; then # 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 pnpx yarn corepack $nvm_lazy_cmd) # default values + nvm_lazy_cmd=(_omz_nvm_load nvm node npm npx pnpm pnpx yarn corepack $nvm_lazy_cmd) # default values eval " function $nvm_lazy_cmd { for func in $nvm_lazy_cmd; do @@ -84,14 +84,16 @@ if zstyle -t ':omz:plugins:nvm' lazy; then 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\" \"\$@\" + _omz_nvm_setup_completion + _omz_nvm_setup_autoload + if [[ \"\$0\" != _omz_nvm_load ]]; then + \"\$0\" \"\$@\" + fi } " unset nvm_lazy_cmd else source "$NVM_DIR/nvm.sh" - _omz_load_nvm_completion - _omz_setup_autoload + _omz_nvm_setup_completion + _omz_nvm_setup_autoload fi