mirror of
https://github.com/robbyrussell/oh-my-zsh.git
synced 2026-09-27 21:46:08 +02:00
Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
61f12e078f | ||
|
|
e4172614e8 | ||
|
|
3fe8d6d6af | ||
|
|
a0fa610df3 | ||
|
|
426650fbe8 | ||
|
|
8a5b393088 | ||
|
|
87d4d40418 | ||
|
|
593e8ed6c8 | ||
|
|
747123823c | ||
|
|
daaa103cec | ||
|
|
4bdcaad01a | ||
|
|
5b5265d677 | ||
|
|
421d95782d | ||
|
|
7079eaf80d | ||
|
|
b842e5e63e | ||
|
|
c76b3002b6 |
+42
-11
@@ -38,16 +38,47 @@
|
||||
# due to malicious input as a consequence of CVE-2021-45444, which affects
|
||||
# zsh versions from 5.0.3 to 5.8.
|
||||
#
|
||||
autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0
|
||||
# The patch is applied when VCS_INFO_formats is first called, since loading
|
||||
# and patching it on every startup costs time in shells that never use
|
||||
# vcs_info. `autoload` doesn't replace an already defined function, so this
|
||||
# wrapper survives a later `autoload -Uz vcs_info` in a theme or .zshrc, and
|
||||
# vcs_info's own `autoload -Uz VCS_INFO_formats`.
|
||||
if (( $+functions[VCS_INFO_formats] )); then
|
||||
() {
|
||||
autoload -Uz +X regexp-replace 2>/dev/null || return 1
|
||||
|
||||
# We use $tmp here because it's already a local variable in VCS_INFO_formats
|
||||
typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
|
||||
# Unique string to avoid reapplying the patch if this code gets called twice
|
||||
typeset PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
|
||||
# Only patch the VCS_INFO_formats function if not already patched
|
||||
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
|
||||
regexp-replace 'functions[VCS_INFO_formats]' \
|
||||
"VCS_INFO_hook 'post-backend'" \
|
||||
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
|
||||
# We use $tmp here because it's already a local variable in VCS_INFO_formats
|
||||
local PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
|
||||
# Unique string to avoid reapplying the patch if this code gets called twice
|
||||
local PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
|
||||
# Only patch the VCS_INFO_formats function if not already patched
|
||||
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
|
||||
regexp-replace 'functions[VCS_INFO_formats]' \
|
||||
"VCS_INFO_hook 'post-backend'" \
|
||||
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
|
||||
fi
|
||||
}
|
||||
else
|
||||
function VCS_INFO_formats {
|
||||
local loaded_function="$(
|
||||
unfunction VCS_INFO_formats 2>/dev/null
|
||||
autoload -Uz +X VCS_INFO_formats 2>/dev/null || return 1
|
||||
print -r -- "$functions[VCS_INFO_formats]"
|
||||
)" || return 1
|
||||
functions[VCS_INFO_formats]="$loaded_function"
|
||||
autoload -Uz +X regexp-replace 2>/dev/null || return 1
|
||||
|
||||
# We use $tmp here because it's already a local variable in VCS_INFO_formats
|
||||
local PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
|
||||
# Unique string to avoid reapplying the patch if this code gets called twice
|
||||
local PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
|
||||
# Only patch the VCS_INFO_formats function if not already patched
|
||||
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
|
||||
regexp-replace 'functions[VCS_INFO_formats]' \
|
||||
"VCS_INFO_hook 'post-backend'" \
|
||||
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
|
||||
fi
|
||||
|
||||
VCS_INFO_formats "$@"
|
||||
}
|
||||
fi
|
||||
unset PATCH PATCH_ID
|
||||
|
||||
@@ -69,7 +69,7 @@ function asr() {
|
||||
local -a available_regions
|
||||
available_regions=($(aws_regions))
|
||||
if [[ -z "${available_regions[(r)$1]}" ]]; then
|
||||
echo "${fg[red]}Available regions: \n$(aws_regions)"
|
||||
echo "${fg[red]}Available regions: \n$(aws_regions)${reset_color}" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Grafana CLI plugin
|
||||
|
||||
This plugin adds completion for the [Grafana CLI (gcx)](https://github.com/grafana/gcx).
|
||||
|
||||
To use it, add `gcx` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... gcx)
|
||||
```
|
||||
|
||||
This plugin does not add any aliases.
|
||||
|
||||
## Cache
|
||||
|
||||
This plugin caches the completion script and automatically updates it when the
|
||||
plugin is loaded, which is usually when you start a new terminal emulator.
|
||||
|
||||
The cache is stored at `$ZSH_CACHE_DIR/completions/_gcx`.
|
||||
@@ -0,0 +1,18 @@
|
||||
# Autocompletion for the Grafana CLI (gcx).
|
||||
if (( ! $+commands[gcx] )); then
|
||||
return
|
||||
fi
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `gcx`. Otherwise, compinit will have already done that.
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_gcx" ]]; then
|
||||
typeset -g -A _comps
|
||||
autoload -Uz _gcx
|
||||
_comps[gcx]=_gcx
|
||||
fi
|
||||
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_gcx"
|
||||
zf_mv -f -- =( gcx completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
@@ -19,35 +19,54 @@ plugins=(... jj)
|
||||
| jjbd | `jj bookmark delete` |
|
||||
| jjbf | `jj bookmark forget` |
|
||||
| jjbl | `jj bookmark list` |
|
||||
| jjblt | `jj bookmark list --tracked` |
|
||||
| jjbm | `jj bookmark move` |
|
||||
| jjbr | `jj bookmark rename` |
|
||||
| jjbs | `jj bookmark set` |
|
||||
| jjbt | `jj bookmark track` |
|
||||
| jjbu | `jj bookmark untrack` |
|
||||
| jjc | `jj commit` |
|
||||
| jjcfg | `jj config` |
|
||||
| jjcfgl | `jj config list` |
|
||||
| jjcmsg | `jj commit --message` |
|
||||
| jjd | `jj diff` |
|
||||
| jjdmsg | `jj desc --message` |
|
||||
| jjds | `jj desc` |
|
||||
| jjdst | `jj diff --stat` |
|
||||
| jje | `jj edit` |
|
||||
| jjev | `jj evolog` |
|
||||
| jjf | `jj file` |
|
||||
| jjfl | `jj file list` |
|
||||
| jjg | `jj git` |
|
||||
| jjgcl | `jj git clone` |
|
||||
| jjgf | `jj git fetch` |
|
||||
| jjgfa | `jj git fetch --all-remotes` |
|
||||
| jjgi | `jj git init` |
|
||||
| jjgp | `jj git push` |
|
||||
| jjgpa | `jj git push --all` |
|
||||
| jjgpd | `jj git push --deleted` |
|
||||
| jjgpt | `jj git push --tracked` |
|
||||
| jjgrl | `jj git remote list` |
|
||||
| jjl | `jj log` |
|
||||
| jjla | `jj log -r "all()"` |
|
||||
| jjn | `jj new` |
|
||||
| jjnt | `jj new "trunk()"` |
|
||||
| jjop | `jj op` |
|
||||
| jjopl | `jj op log` |
|
||||
| jjor | `jj op restore` |
|
||||
| jjrb | `jj rebase` |
|
||||
| jjrbm | `jj rebase -d "trunk()"` |
|
||||
| jjrs | `jj restore` |
|
||||
| jjrt | `cd "$(jj root \|\| echo .)"` |
|
||||
| jjs | `jj show` |
|
||||
| jjsp | `jj split` |
|
||||
| jjsq | `jj squash` |
|
||||
| jjst | `jj status` |
|
||||
| jju | `jj undo` |
|
||||
| jjw | `jj workspace` |
|
||||
| jjwa | `jj workspace add` |
|
||||
| jjwf | `jj workspace forget` |
|
||||
| jjwl | `jj workspace list` |
|
||||
|
||||
## Prompt usage
|
||||
|
||||
|
||||
@@ -45,34 +45,51 @@ alias jjbc='jj bookmark create'
|
||||
alias jjbd='jj bookmark delete'
|
||||
alias jjbf='jj bookmark forget'
|
||||
alias jjbl='jj bookmark list'
|
||||
alias jjblt='jj bookmark list --tracked'
|
||||
alias jjbm='jj bookmark move'
|
||||
alias jjbr='jj bookmark rename'
|
||||
alias jjbs='jj bookmark set'
|
||||
alias jjbt='jj bookmark track'
|
||||
alias jjbu='jj bookmark untrack'
|
||||
alias jjc='jj commit'
|
||||
alias jjcfg='jj config'
|
||||
alias jjcfgl='jj config list'
|
||||
alias jjcmsg='jj commit --message'
|
||||
alias jjd='jj diff'
|
||||
alias jjdmsg='jj desc --message'
|
||||
alias jjds='jj desc'
|
||||
alias jjdst='jj diff --stat'
|
||||
alias jje='jj edit'
|
||||
alias jjev='jj evolog'
|
||||
alias jjf='jj file'
|
||||
alias jjfl='jj file list'
|
||||
alias jjg='jj git'
|
||||
alias jjgcl='jj git clone'
|
||||
alias jjgf='jj git fetch'
|
||||
alias jjgfa='jj git fetch --all-remotes'
|
||||
alias jjgi='jj git init'
|
||||
alias jjgp='jj git push'
|
||||
alias jjgpa='jj git push --all'
|
||||
alias jjgpd='jj git push --deleted'
|
||||
alias jjgpt='jj git push --tracked'
|
||||
alias jjgrl='jj git remote list'
|
||||
alias jjl='jj log'
|
||||
alias jjla='jj log -r "all()"'
|
||||
alias jjn='jj new'
|
||||
alias jjnt='jj new "trunk()"'
|
||||
alias jjop='jj op'
|
||||
alias jjopl='jj op log'
|
||||
alias jjor='jj op restore'
|
||||
alias jjrb='jj rebase'
|
||||
alias jjrbm='jj rebase -d "trunk()"'
|
||||
alias jjrs='jj restore'
|
||||
alias jjrt='cd "$(jj root || echo .)"'
|
||||
alias jjs='jj show'
|
||||
alias jjsp='jj split'
|
||||
alias jjsq='jj squash'
|
||||
alias jjst='jj status'
|
||||
alias jju='jj undo'
|
||||
alias jjw='jj workspace'
|
||||
alias jjwa='jj workspace add'
|
||||
alias jjwf='jj workspace forget'
|
||||
alias jjwl='jj workspace list'
|
||||
|
||||
@@ -71,6 +71,7 @@ plugins=(... kubectl)
|
||||
| | | **Secret management** |
|
||||
| kgsec | `kubectl get secret` | Get secret for decoding |
|
||||
| kgseca | `kubectl get secret --all-namespaces` | List secrets across all namespaces |
|
||||
| kesec | `kubectl edit secret` | Edit secret resource |
|
||||
| kdsec | `kubectl describe secret` | Describe secret resource in detail |
|
||||
| kdelsec | `kubectl delete secret` | Delete the secret |
|
||||
| | | **Deployment management** |
|
||||
|
||||
@@ -93,6 +93,7 @@ alias kdelcm='kubectl delete configmap'
|
||||
# Secret management
|
||||
alias kgsec='kubectl get secret'
|
||||
alias kgseca='kubectl get secret --all-namespaces'
|
||||
alias kesec='kubectl edit secret'
|
||||
alias kdsec='kubectl describe secret'
|
||||
alias kdelsec='kubectl delete secret'
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ plugins=(... laravel)
|
||||
| `pamen` | `php artisan make:enum` |
|
||||
| `pami` | `php artisan make:interface` |
|
||||
| `pamtr` | `php artisan make:trait` |
|
||||
| `pamv` | `php artisan make:view` |
|
||||
|
||||
## Clears
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ alias pamcl='php artisan make:class'
|
||||
alias pamen='php artisan make:enum'
|
||||
alias pami='php artisan make:interface'
|
||||
alias pamtr='php artisan make:trait'
|
||||
alias pamv='php artisan make:view'
|
||||
|
||||
|
||||
# Clears
|
||||
|
||||
@@ -56,19 +56,26 @@ if zstyle -T ':omz:plugins:pipenv' auto-shell; then
|
||||
# deactivate shell if Pipfile doesn't exist and not in a subdir
|
||||
if [[ ! -f "$PWD/Pipfile" ]]; then
|
||||
if [[ "$PIPENV_ACTIVE" == 1 ]]; then
|
||||
if [[ "$PWD" != "$pipfile_dir"* ]]; then
|
||||
# Compare whole path components: `$pipfile_dir"*` also matches unrelated
|
||||
# siblings that merely start with the same text (…/proj -> …/proj-docs),
|
||||
# which would keep the virtualenv active outside the project.
|
||||
local project_dir="${pipfile_dir%/}"
|
||||
if [[ "$PWD" != "$project_dir" && "$PWD" != "$project_dir"/* ]]; then
|
||||
unset PIPENV_ACTIVE pipfile_dir
|
||||
deactivate
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# activate the shell if Pipfile exists
|
||||
# activate the shell if Pipfile exists and its virtualenv is usable
|
||||
if [[ "$PIPENV_ACTIVE" != 1 ]]; then
|
||||
if [[ -f "$PWD/Pipfile" ]]; then
|
||||
export pipfile_dir="$PWD"
|
||||
source "$(pipenv --venv)/bin/activate"
|
||||
export PIPENV_ACTIVE=1
|
||||
local venv_path
|
||||
if venv_path="$(pipenv --venv 2>/dev/null)" && [[ -n "$venv_path" && -f "$venv_path/bin/activate" ]]; then
|
||||
export pipfile_dir="$PWD"
|
||||
source "$venv_path/bin/activate"
|
||||
export PIPENV_ACTIVE=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# Poetry Environment Plugin
|
||||
|
||||
This plugin automatically changes poetry environment when you cd into or out of the project directory.
|
||||
Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment
|
||||
This plugin automatically activates a Poetry environment when you enter a
|
||||
directory containing both `pyproject.toml` and `poetry.lock`. It keeps the
|
||||
environment active in project subdirectories, switches to nested Poetry
|
||||
projects, and deactivates it when you leave the project tree.
|
||||
|
||||
To use it, add `poetry-env` to the plugins array in your zshrc file:
|
||||
|
||||
|
||||
@@ -1,15 +1,24 @@
|
||||
_togglePoetryShell() {
|
||||
# Determine if currently in a Poetry-managed directory
|
||||
local in_poetry_dir=0
|
||||
local in_active_poetry_dir=0
|
||||
if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then
|
||||
in_poetry_dir=1
|
||||
fi
|
||||
|
||||
# Deactivate the current environment if moving out of a Poetry directory or into a different Poetry directory
|
||||
if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] || [[ "$PWD" != "$poetry_dir"* ]]; }; then
|
||||
export poetry_active=0
|
||||
unset poetry_dir
|
||||
(( $+functions[deactivate] )) && deactivate
|
||||
# Deactivate when leaving the active project or entering a nested project
|
||||
if [[ $poetry_active -eq 1 ]]; then
|
||||
local project_dir="${poetry_dir%/}"
|
||||
if [[ "$PWD" == "$project_dir" || "$PWD" == "$project_dir"/* ]]; then
|
||||
in_active_poetry_dir=1
|
||||
fi
|
||||
|
||||
if [[ $in_active_poetry_dir -eq 0 ]] ||
|
||||
{ [[ $in_poetry_dir -eq 1 ]] && [[ "$PWD" != "$poetry_dir" ]]; }; then
|
||||
export poetry_active=0
|
||||
unset poetry_dir
|
||||
(( $+functions[deactivate] )) && deactivate
|
||||
fi
|
||||
fi
|
||||
|
||||
# Activate the environment if in a Poetry directory and no environment is currently active
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
# ruff plugin
|
||||
|
||||
This plugin automatically installs [ruff](https://github.com/astral-sh/ruff)'s completions for you,
|
||||
and keeps them up to date. It also adds convenient aliases for common usage.
|
||||
|
||||
To use it, add `ruff` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... ruff)
|
||||
```
|
||||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command | Description |
|
||||
| :---- | -------------------- | :----------------------------------------------------------- |
|
||||
| ruc | `ruff check` | Run Ruff linter on the given files or directories |
|
||||
| rucf | `ruff check --fix` | Run Ruff linter and fix auto-fixable issues |
|
||||
| ruf | `ruff format` | Run the Ruff formatter on the given files or directories |
|
||||
| rufc | `ruff format --check`| Check if files are already formatted without making changes |
|
||||
| rur | `ruff rule` | Explain a rule (or all rules) |
|
||||
| rul | `ruff linter` | List all supported upstream linters |
|
||||
| rucl | `ruff clean` | Clear any caches in the current directory and subdirectories |
|
||||
@@ -0,0 +1,27 @@
|
||||
# Return immediately if ruff is not found
|
||||
if (( ! ${+commands[ruff]} )); then
|
||||
return
|
||||
fi
|
||||
|
||||
alias ruc='ruff check'
|
||||
alias rucf='ruff check --fix'
|
||||
alias ruf='ruff format'
|
||||
alias rufc='ruff format --check'
|
||||
alias rur='ruff rule'
|
||||
alias rul='ruff linter'
|
||||
alias rucl='ruff clean'
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it. Otherwise, compinit will have already done that.
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_ruff" ]]; then
|
||||
typeset -g -A _comps
|
||||
autoload -Uz _ruff
|
||||
_comps[ruff]=_ruff
|
||||
fi
|
||||
|
||||
# Overwrites the file each time as completions might change with ruff versions.
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_ruff"
|
||||
zf_mv -f -- =( ruff generate-shell-completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
@@ -1,112 +0,0 @@
|
||||
# Shopify CLI plugin
|
||||
|
||||
This plugin adds aliases, helper functions and completion for the
|
||||
[Shopify CLI](https://shopify.dev/docs/api/shopify-cli).
|
||||
|
||||
To use it, add `shopify` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... shopify)
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
[Shopify CLI](https://shopify.dev/docs/api/shopify-cli) 4.0 or newer, installed
|
||||
and on your `PATH`. The plugin does nothing if it is not:
|
||||
|
||||
```zsh
|
||||
npm install -g @shopify/cli
|
||||
# or
|
||||
brew tap shopify/shopify && brew install shopify-cli
|
||||
```
|
||||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command | Description |
|
||||
| :----- | :-------- | :--------------------- |
|
||||
| `shop` | `shopify` | The Shopify CLI itself |
|
||||
|
||||
## Functions
|
||||
|
||||
| Function | Description |
|
||||
| :------------- | :--------------------------------------------------------------------------------- |
|
||||
| `shopd` | Runs `theme dev`, `app dev` or `hydrogen dev`, whichever fits the current project |
|
||||
| `shopi` | Shows what the current project is connected to |
|
||||
| `shopify_here` | Prints the kind of Shopify project you are in and the commands worth running in it |
|
||||
| `shopify` | Wraps the CLI to confirm before irreversible commands. See Settings |
|
||||
|
||||
`shopd` and `shopi` work out which topic applies by looking at the project you
|
||||
are standing in, so you do not have to remember whether this directory is a
|
||||
theme, an app or a Hydrogen storefront. They complete like the command they
|
||||
stand in for, so in a theme `shopd --<TAB>` offers the flags of
|
||||
`shopify theme dev`.
|
||||
|
||||
## Completion
|
||||
|
||||
Every command completes with a description of what it does, at every level, and
|
||||
so do their flags, short forms and allowed values. `--environment` completes
|
||||
from the `[environments.*]` sections of your local `shopify.theme.toml` or
|
||||
`shopify.app.toml`.
|
||||
|
||||
The Shopify CLI ships no completion generator of its own, so `_shopify` is
|
||||
generated from `shopify commands --json` and kept in this repository. It targets
|
||||
Shopify CLI 4.x.
|
||||
|
||||
## Settings
|
||||
|
||||
Set these with `zstyle` in your zshrc, before Oh My Zsh is sourced.
|
||||
|
||||
### Confirming destructive commands
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:plugins:shopify' confirm-destructive no
|
||||
```
|
||||
|
||||
By default the plugin asks for confirmation before three irreversible
|
||||
operations:
|
||||
|
||||
- `shopify theme push` with `--live`/`-l` or `--publish`/`-p`, which overwrites
|
||||
or publishes the live storefront
|
||||
- `shopify theme delete`, which the CLI's own help describes as impossible to
|
||||
undo
|
||||
- `shopify app deploy --allow-deletes`, which can permanently remove extensions
|
||||
|
||||
Nothing else is intercepted, and the prompt is skipped when the command already
|
||||
carries `--force`/`-f` or when stdin is not a terminal, so scripts, pipelines
|
||||
and CI are unaffected. Set the style to `no` to turn the prompt off entirely.
|
||||
|
||||
### Completing theme IDs
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:plugins:shopify' dynamic-theme-completion yes
|
||||
```
|
||||
|
||||
Off by default. When enabled, `--theme` is completed from
|
||||
`shopify theme list --json`, showing each theme's name and role next to its ID
|
||||
instead of making you copy IDs by hand. It is opt-in because it runs the CLI and
|
||||
makes a network call when you press <kbd>Tab</kbd>, and because it needs you to
|
||||
be authenticated. Results are cached for five minutes.
|
||||
|
||||
### Disabling the aliases
|
||||
|
||||
This works for every Oh My Zsh plugin:
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:plugins:shopify' aliases no
|
||||
```
|
||||
|
||||
## Caveats
|
||||
|
||||
- `shopify` is a shell function here. Run `command shopify` to reach the binary
|
||||
directly.
|
||||
- When a project has its own copy of the CLI in `node_modules/.bin/shopify`,
|
||||
that one is used in preference to the global install. App and Hydrogen
|
||||
projects normally pin the CLI in `package.json`, and running a different
|
||||
global version against them is a common source of confusing errors.
|
||||
- `--password` and `--store-password` are unrelated, and you often need both.
|
||||
`--password` is the CLI's own authentication token, from the Theme Access app
|
||||
or the Admin API. `--store-password` is the password for a
|
||||
password-protected storefront.
|
||||
- `shopify theme push` deletes remote files that are missing locally, and
|
||||
`shopify theme pull` deletes local files that are missing remotely, unless you
|
||||
pass `--nodelete`/`-n`. The plugin does not prompt for these.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,203 +0,0 @@
|
||||
# Shopify CLI: completion, aliases and guard rails.
|
||||
# https://shopify.dev/docs/api/shopify-cli
|
||||
|
||||
if (( ! $+commands[shopify] )); then
|
||||
return
|
||||
fi
|
||||
|
||||
# Prefer a project-local CLI: app and Hydrogen projects pin their own version.
|
||||
# The walk stops at $HOME so a stray ~/node_modules cannot hijack every project.
|
||||
# $commands avoids resolving back to the wrapper function below.
|
||||
function _shopify_bin() {
|
||||
local dir="$PWD"
|
||||
while [[ -n "$dir" && "$dir" != "/" && "$dir" != "$HOME" ]]; do
|
||||
if [[ -x "$dir/node_modules/.bin/shopify" ]]; then
|
||||
print -r -- "$dir/node_modules/.bin/shopify"
|
||||
return 0
|
||||
fi
|
||||
dir="${dir:h}"
|
||||
done
|
||||
print -r -- "$commands[shopify]"
|
||||
}
|
||||
|
||||
# Print the project type in $PWD: hydrogen, app or theme.
|
||||
# Hydrogen is tested first because those projects usually carry a
|
||||
# shopify.app.toml too. shopify.theme.toml is not a theme marker: it only
|
||||
# exists once environments are configured.
|
||||
function _shopify_project_type() {
|
||||
local dir="$PWD"
|
||||
local -a app_config
|
||||
|
||||
while [[ -n "$dir" && "$dir" != "/" && "$dir" != "$HOME" ]]; do
|
||||
if [[ -x "$dir/node_modules/.bin/h2" ]] ||
|
||||
[[ -r "$dir/package.json" && "$(<"$dir/package.json")" == *'"@shopify/hydrogen"'* ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
app_config=("$dir"/shopify.app*.toml(N))
|
||||
if (( $#app_config )); then
|
||||
print -r -- app
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [[ -f "$dir/config/settings_schema.json" && -f "$dir/layout/theme.liquid" ]]; then
|
||||
print -r -- theme
|
||||
return 0
|
||||
fi
|
||||
|
||||
dir="${dir:h}"
|
||||
done
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Does this invocation need confirming? Sets REPLY to the reason.
|
||||
function _shopify_is_destructive() {
|
||||
zstyle -T ':omz:plugins:shopify' confirm-destructive || return 1
|
||||
|
||||
# Nobody to answer: CI and pipelines are unaffected.
|
||||
[[ -t 0 ]] || return 1
|
||||
|
||||
local topic="$1" subcommand="$2" arg
|
||||
local -a long
|
||||
local short=""
|
||||
|
||||
# Short flags can be bundled, so collect them as characters: -al counts as l.
|
||||
for arg in "${@[3,-1]}"; do
|
||||
[[ "$arg" == "--" ]] && break
|
||||
case "$arg" in
|
||||
--*) long+=("${arg%%=*}") ;;
|
||||
-?*) short+="${${arg%%=*}#-}" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# An explicit force flag states the intent already.
|
||||
if (( long[(I)--force] )) || [[ "$short" == *f* ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
case "$topic $subcommand" in
|
||||
"theme push")
|
||||
if (( long[(I)--live] || long[(I)--publish] )) || [[ "$short" == *[lp]* ]]; then
|
||||
REPLY="this overwrites or publishes the live theme on the storefront."
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
"theme delete")
|
||||
REPLY="deleting a theme cannot be undone."
|
||||
return 0
|
||||
;;
|
||||
"app deploy")
|
||||
if (( long[(I)--allow-deletes] )); then
|
||||
REPLY="this can permanently remove app extensions."
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Adds a confirmation prompt before irreversible operations. Everything else
|
||||
# passes straight through, so `theme dev` stays interactive and pipes stay clean.
|
||||
function shopify() {
|
||||
local REPLY
|
||||
if _shopify_is_destructive "$@"; then
|
||||
print -u2 -- "shopify: $REPLY"
|
||||
if ! read -q "?Continue? [y/N] "; then
|
||||
print -u2 -- ""
|
||||
return 130
|
||||
fi
|
||||
print -u2 -- ""
|
||||
fi
|
||||
|
||||
"$(_shopify_bin)" "$@"
|
||||
}
|
||||
|
||||
# Print the commands worth running in the current directory.
|
||||
function shopify_here() {
|
||||
local project_type
|
||||
project_type="$(_shopify_project_type)"
|
||||
|
||||
case "$project_type" in
|
||||
theme)
|
||||
print -- "Shopify theme project."
|
||||
print -- " shopify theme dev Preview locally with live reload"
|
||||
print -- " shopify theme check Lint the theme"
|
||||
print -- " shopify theme list List the themes on the store"
|
||||
print -- " shopify theme pull Download a remote theme into this folder"
|
||||
print -- " shopify theme push Upload this folder to a remote theme"
|
||||
;;
|
||||
app)
|
||||
print -- "Shopify app project."
|
||||
print -- " shopify app dev Run the app against a development store"
|
||||
print -- " shopify app info Show how the app is configured"
|
||||
print -- " shopify app deploy Deploy the app and its extensions"
|
||||
print -- " shopify app logs Stream app logs"
|
||||
;;
|
||||
hydrogen)
|
||||
print -- "Hydrogen storefront."
|
||||
print -- " shopify hydrogen dev Run the storefront locally"
|
||||
print -- " shopify hydrogen build Build for production"
|
||||
print -- " shopify hydrogen deploy Deploy to Oxygen"
|
||||
print -- " shopify hydrogen link Link this project to a storefront"
|
||||
;;
|
||||
*)
|
||||
print -- "No Shopify project found here."
|
||||
print -- " shopify theme init Start a new theme"
|
||||
print -- " shopify app init Start a new app"
|
||||
print -- " shopify hydrogen init Start a new Hydrogen storefront"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Run the dev server for whichever kind of project this is.
|
||||
function shopd() {
|
||||
local project_type
|
||||
if ! project_type="$(_shopify_project_type)"; then
|
||||
print -u2 -- "shopd: not inside a Shopify theme, app or Hydrogen project."
|
||||
return 1
|
||||
fi
|
||||
shopify "$project_type" dev "$@"
|
||||
}
|
||||
|
||||
# Show what the current project is connected to.
|
||||
function shopi() {
|
||||
local project_type
|
||||
if ! project_type="$(_shopify_project_type)"; then
|
||||
print -u2 -- "shopi: not inside a Shopify theme, app or Hydrogen project."
|
||||
return 1
|
||||
fi
|
||||
case "$project_type" in
|
||||
hydrogen) shopify hydrogen list "$@" ;;
|
||||
*) shopify "$project_type" info "$@" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Complete the helpers like the commands they stand in for.
|
||||
if (( $+functions[compdef] )); then
|
||||
_shopd() {
|
||||
local project_type
|
||||
project_type="$(_shopify_project_type)" || return 1
|
||||
words=(shopify "$project_type" dev ${words[2,-1]})
|
||||
(( CURRENT += 2 ))
|
||||
_shopify
|
||||
}
|
||||
|
||||
_shopi() {
|
||||
local project_type
|
||||
project_type="$(_shopify_project_type)" || return 1
|
||||
if [[ "$project_type" == hydrogen ]]; then
|
||||
words=(shopify hydrogen list ${words[2,-1]})
|
||||
else
|
||||
words=(shopify "$project_type" info ${words[2,-1]})
|
||||
fi
|
||||
(( CURRENT += 2 ))
|
||||
_shopify
|
||||
}
|
||||
|
||||
compdef _shopd shopd
|
||||
compdef _shopi shopi
|
||||
fi
|
||||
|
||||
alias shop='shopify'
|
||||
@@ -19,6 +19,7 @@
|
||||
ssm_run_sudo() {sudo $_sublime_merge_path "$@" >/dev/null 2>&1}
|
||||
alias ssm=ssm_run_sudo
|
||||
alias sm=sm_run
|
||||
alias smerge="'$_sublime_merge_path'"
|
||||
break
|
||||
fi
|
||||
done
|
||||
@@ -33,6 +34,7 @@
|
||||
if [[ -a $_sublime_merge_path ]]; then
|
||||
subm () { "$_sublime_merge_path" "$@" }
|
||||
alias sm=subm
|
||||
alias smerge="'$_sublime_merge_path'"
|
||||
break
|
||||
fi
|
||||
done
|
||||
@@ -45,6 +47,7 @@
|
||||
if [[ -a $_sublime_merge_path ]]; then
|
||||
subm () { "$_sublime_merge_path" "$@" }
|
||||
alias sm=subm
|
||||
alias smerge="'$_sublime_merge_path'"
|
||||
break
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -15,8 +15,8 @@
|
||||
# - https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Console/Resources/completion.bash
|
||||
#
|
||||
_sf_console() {
|
||||
local lastParam flagPrefix requestComp out comp
|
||||
local -a completions
|
||||
local lastParam out comp sf_cmd
|
||||
local -a completions flagPrefix requestComp inputs
|
||||
|
||||
# The user could have moved the cursor backwards on the command-line.
|
||||
# We need to trigger completion from the $CURRENT location, so we need
|
||||
@@ -29,11 +29,20 @@ _sf_console() {
|
||||
setopt local_options BASH_REMATCH
|
||||
if [[ "${lastParam}" =~ '-.*=' ]]; then
|
||||
# We are dealing with a flag with an =
|
||||
flagPrefix="-P ${BASH_REMATCH}"
|
||||
flagPrefix=(-P "${BASH_REMATCH}")
|
||||
fi
|
||||
|
||||
# Prepare the command to obtain completions
|
||||
requestComp="${words[0]} ${words[1]} _complete --no-interaction -szsh -a1 -c$((CURRENT-1))" i=""
|
||||
# Prepare the command to obtain completions. An alias is resolved here,
|
||||
# because the request is no longer read again by the shell.
|
||||
sf_cmd="${words[1]}"
|
||||
if [[ -n "${aliases[$sf_cmd]}" ]]; then
|
||||
requestComp=(${(z)aliases[$sf_cmd]})
|
||||
else
|
||||
requestComp=(${~sf_cmd})
|
||||
fi
|
||||
|
||||
requestComp+=(_complete --no-interaction -szsh -a1 "-c$((CURRENT-1))")
|
||||
|
||||
for w in ${words[@]}; do
|
||||
w=$(printf -- '%b' "$w")
|
||||
# remove quotes from typed values
|
||||
@@ -47,19 +56,18 @@ _sf_console() {
|
||||
fi
|
||||
# empty values are ignored
|
||||
if [ ! -z "$w" ]; then
|
||||
i="${i}-i${w} "
|
||||
inputs+=("-i$w")
|
||||
fi
|
||||
done
|
||||
|
||||
# Ensure at least 1 input
|
||||
if [ "${i}" = "" ]; then
|
||||
requestComp="${requestComp} -i\" \""
|
||||
else
|
||||
requestComp="${requestComp} ${i}"
|
||||
if (( ! $#inputs )); then
|
||||
inputs=(-i' ')
|
||||
fi
|
||||
|
||||
# Use eval to handle any environment variables and such
|
||||
out=$(eval ${requestComp} 2>/dev/null)
|
||||
# The request is run without being read again by the shell, so that a
|
||||
# "$(...)" or a backtick typed on the command line is not executed
|
||||
out=$(SHELL_VERBOSITY=0 "${requestComp[@]}" "${inputs[@]}" 2>/dev/null)
|
||||
|
||||
while IFS='\n' read -r comp; do
|
||||
if [ -n "$comp" ]; then
|
||||
@@ -75,7 +83,7 @@ _sf_console() {
|
||||
done < <(printf "%s\n" "${out[@]}")
|
||||
|
||||
# Let inbuilt _describe handle completions
|
||||
eval _describe "completions" completions $flagPrefix
|
||||
_describe "completions" completions "${flagPrefix[@]}"
|
||||
return $?
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
# uv Environment Plugin
|
||||
|
||||
This plugin automatically activates the uv virtual environment when you cd into a project directory, and deactivates it when you cd out.
|
||||
Note: Script looks for pyproject.toml and uv.lock files to determine if it's a uv project
|
||||
|
||||
To use it, add `uv-env` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... uv-env)
|
||||
```
|
||||
@@ -0,0 +1,26 @@
|
||||
_toggleUvShell() {
|
||||
local in_uv_dir=0
|
||||
if [[ -f "$PWD/pyproject.toml" && -f "$PWD/uv.lock" ]]; then
|
||||
in_uv_dir=1
|
||||
fi
|
||||
|
||||
if [[ $uv_active -eq 1 ]] && { [[ $in_uv_dir -eq 0 ]] || [[ "$PWD" != "$uv_dir" && "$PWD" != "$uv_dir"/* ]]; }; then
|
||||
typeset -g uv_active=0
|
||||
unset uv_dir
|
||||
(( $+functions[deactivate] )) && deactivate
|
||||
fi
|
||||
|
||||
if [[ $in_uv_dir -eq 1 ]] && [[ $uv_active -ne 1 ]]; then
|
||||
local venv_dir="${UV_PROJECT_ENVIRONMENT:-$PWD/.venv}"
|
||||
[[ "$venv_dir" != /* ]] && venv_dir="$PWD/$venv_dir"
|
||||
|
||||
if [[ -f "${venv_dir}/bin/activate" ]]; then
|
||||
typeset -g uv_active=1
|
||||
typeset -g uv_dir="$PWD"
|
||||
source "${venv_dir}/bin/activate"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
autoload -Uz add-zsh-hook
|
||||
add-zsh-hook chpwd _toggleUvShell
|
||||
_toggleUvShell
|
||||
@@ -47,6 +47,7 @@ _box_arguments=(
|
||||
'help:COMMAND List subcommands'
|
||||
'list:Lists all installed boxes'
|
||||
'outdated:Checks if a box has newer version'
|
||||
'prune:Removes old versions of installed boxes'
|
||||
'remove:NAME Removes a box from the system'
|
||||
'repackage:NAME PROVIDER VERSION Repackages an installed box into a `.box` file'
|
||||
'update:Updates box to a newer version, if available'
|
||||
|
||||
Reference in New Issue
Block a user