Compare commits

...
Author SHA1 Message Date
copilot-swe-agent[bot]androbbyrussell 6b789c8bd6 fix(git plugin): include git exec path in version cache key
Co-authored-by: robbyrussell <257+robbyrussell@users.noreply.github.com>
2026-09-06 15:49:09 +00:00
Robby RussellandClaude Fable 5.1 984d07a53b perf(git): cache the git version used for alias selection
`git version` was forked on every startup so that four aliases could be
picked according to the installed git. Cache the version in
$ZSH_CACHE_DIR for a day, keyed on the git binary's path and mtime, so a
different or upgraded git is picked up right away and the fork otherwise
happens once a day.

Measured on macOS arm64, zsh 5.9: git.plugin.zsh 9.2 ms -> 2.0 ms per
interactive start.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:06:51 -07:00
Jérôme Tamarelle 426650fbe8 fix(symfony6): don't run command substitutions on tab completion (#14058)
The plugin is a copy of the completion script shipped by symfony/console.
It has not been updated since it was added, and two fixes made upstream
since then are missing.

The completion request was assembled as a string from the raw words of
the command line, then passed to "eval". Any command substitution present
in a word was therefore executed by the completion, before the user
validated the line. The request is now run as an array of arguments,
without being read again by the shell, and "_describe" is called directly
instead of through "eval". The alias of the command is resolved
explicitly, since that was the only useful effect of the "eval".

The request also runs with SHELL_VERBOSITY=0, so that completion keeps
working for users who exported SHELL_VERBOSITY=-1.

Ported from symfony/symfony#65818 and symfony/symfony#63859.
2026-09-06 07:02:47 -07:00
Robby RussellandMoulick Aggarwal 8a5b393088 feat(kubectl): add kesec alias for editing secrets (#14048)
Secret was the only resource in the plugin with get, describe and delete
aliases but no edit alias, while thirteen other resource types have one.

Closes #8309

Co-authored-by: Moulick Aggarwal <Moulick@users.noreply.github.com>
2026-09-05 23:04:08 -03:00
Josh McKinney 87d4d40418 feat(jj): Add common jj aliases (#13962) 2026-09-05 14:36:14 -07:00
Ting-An Chen 593e8ed6c8 fix(poetry-env): preserve venv in project subdirectories (#13932)
* fix(poetry-env): preserve venv in project subdirectories

Keep the active environment while navigating ordinary project children, but switch when entering a nested Poetry project.

Use a path-component boundary so similarly named sibling projects are not mistaken for subdirectories.

Fixes #12377

* fix(poetry-env): normalize active project root
2026-09-05 12:41:40 -07:00
Morningstar202604 747123823c fix(pipenv): keep activation and the project directory in sync (#14021)
* fix(pipenv): don't activate or leak errors when virtualenv is missing

* fix(pipenv): compare whole path components when deactivating

$PWD
$pipfile_dir is a string-prefix test, so moving from a project to an
unrelated sibling whose path merely starts with the same text (…/proj ->
…/proj-archive, …/projX) does not deactivate: the project's virtualenv
stays active in a directory that has no Pipfile. Require an exact match or
a component boundary instead. Subdirectories of the project keep their
current behaviour, and a project at / still matches everything.
2026-09-05 12:13:51 -07:00
Rasmus Skovgaard Lauritsen daaa103cec feat(gcx): add completion plugin for Grafana's gcx (#13950)
* feat(gcx): add completion plugin

* fix(gcx): write completion cache atomically
2026-09-05 11:19:45 -07:00
Gore Williams 4bdcaad01a feat(ruff): add plugin for Asral's ruff (#13604) 2026-09-05 11:14:48 -07:00
FazleArefin 5b5265d677 feat(uv-env): add plugin for Astral's uv (#13914)
* feat(uv-env): create plugin

This plugin automatically activates/deactivates a uv-managed virtual
environment when you cd into or out of a project directory. It looks
for pyproject.toml and uv.lock to detect a uv project, and reads
UV_PROJECT_ENVIRONMENT to support custom venv locations.

* fix(uv-env): address review feedback from robbyrussell

- Add `local` to venv_dir to prevent leaking into user's shell
- Replace `export` with `typeset -g` for uv_active and uv_dir
- Use `autoload -Uz` to match the style guide
2026-09-05 11:13:45 -07:00
Johan Hammar 421d95782d feat(vagrant): Add vagrant box prune command (#5946) 2026-09-04 16:38:16 -07:00
Raihan Firdaus 7079eaf80d feat: update laravel.plugin add make:view and update README.md (#13674) 2026-09-04 16:18:53 -07:00
Morningstar202604 b842e5e63e fix(aws): send asr() error message to stderr and reset terminal color (#14027)
asp() already writes its "profile not found" error to stderr and ends
with ${reset_color}; asr() printed its region error to stdout without a
reset, leaving the terminal red and mixing diagnostics into piped output.

Mirror asp() so both selection helpers behave the same.

Refs #13949
2026-09-04 15:25:14 -07:00
blag c76b3002b6 Sublime Merge plugin: Add an smerge alias to complement the similar alias in the Sublime Text plugin (#13930) 2026-09-04 14:49:54 -07:00
20 changed files with 237 additions and 27 deletions
+1 -1
View File
@@ -69,7 +69,7 @@ function asr() {
local -a available_regions local -a available_regions
available_regions=($(aws_regions)) available_regions=($(aws_regions))
if [[ -z "${available_regions[(r)$1]}" ]]; then 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 return 1
fi fi
+18
View File
@@ -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`.
+18
View File
@@ -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"
} &|
+20 -1
View File
@@ -1,6 +1,25 @@
# Git version checking # Git version checking
autoload -Uz is-at-least autoload -Uz is-at-least
git_version="${${(As: :)$(git version 2>/dev/null)}[3]}" # Running `git version` forks on every startup, so cache the result for a day
# in $ZSH_CACHE_DIR, keyed on the git command path, mtime, and exec path.
() {
local cache="$ZSH_CACHE_DIR/git-version" key exec_path
local -a stat lines
zmodload -F zsh/stat b:zstat
zstat -A stat +mtime -- "$commands[git]" 2>/dev/null
exec_path="$(git --exec-path 2>/dev/null)"
key="$commands[git] $stat[1] $exec_path"
lines=("$cache"(Nm-1))
(( $#lines )) && lines=("${(@f)$(<"$cache")}")
if [[ "$lines[1]" = "$key" ]]; then
git_version="$lines[2]"
return
fi
git_version="${${(As: :)$(git version 2>/dev/null)}[3]}"
[[ ! -w "$ZSH_CACHE_DIR" ]] || print -rl -- "$key" "$git_version" >| "$cache"
}
# #
# Functions Current # Functions Current
+19
View File
@@ -19,35 +19,54 @@ plugins=(... jj)
| jjbd | `jj bookmark delete` | | jjbd | `jj bookmark delete` |
| jjbf | `jj bookmark forget` | | jjbf | `jj bookmark forget` |
| jjbl | `jj bookmark list` | | jjbl | `jj bookmark list` |
| jjblt | `jj bookmark list --tracked` |
| jjbm | `jj bookmark move` | | jjbm | `jj bookmark move` |
| jjbr | `jj bookmark rename` | | jjbr | `jj bookmark rename` |
| jjbs | `jj bookmark set` | | jjbs | `jj bookmark set` |
| jjbt | `jj bookmark track` | | jjbt | `jj bookmark track` |
| jjbu | `jj bookmark untrack` | | jjbu | `jj bookmark untrack` |
| jjc | `jj commit` | | jjc | `jj commit` |
| jjcfg | `jj config` |
| jjcfgl | `jj config list` |
| jjcmsg | `jj commit --message` | | jjcmsg | `jj commit --message` |
| jjd | `jj diff` | | jjd | `jj diff` |
| jjdmsg | `jj desc --message` | | jjdmsg | `jj desc --message` |
| jjds | `jj desc` | | jjds | `jj desc` |
| jjdst | `jj diff --stat` |
| jje | `jj edit` | | jje | `jj edit` |
| jjev | `jj evolog` |
| jjf | `jj file` |
| jjfl | `jj file list` |
| jjg | `jj git` |
| jjgcl | `jj git clone` | | jjgcl | `jj git clone` |
| jjgf | `jj git fetch` | | jjgf | `jj git fetch` |
| jjgfa | `jj git fetch --all-remotes` | | jjgfa | `jj git fetch --all-remotes` |
| jjgi | `jj git init` |
| jjgp | `jj git push` | | jjgp | `jj git push` |
| jjgpa | `jj git push --all` | | jjgpa | `jj git push --all` |
| jjgpd | `jj git push --deleted` | | jjgpd | `jj git push --deleted` |
| jjgpt | `jj git push --tracked` | | jjgpt | `jj git push --tracked` |
| jjgrl | `jj git remote list` |
| jjl | `jj log` | | jjl | `jj log` |
| jjla | `jj log -r "all()"` | | jjla | `jj log -r "all()"` |
| jjn | `jj new` | | jjn | `jj new` |
| jjnt | `jj new "trunk()"` | | jjnt | `jj new "trunk()"` |
| jjop | `jj op` |
| jjopl | `jj op log` |
| jjor | `jj op restore` |
| jjrb | `jj rebase` | | jjrb | `jj rebase` |
| jjrbm | `jj rebase -d "trunk()"` | | jjrbm | `jj rebase -d "trunk()"` |
| jjrs | `jj restore` | | jjrs | `jj restore` |
| jjrt | `cd "$(jj root \|\| echo .)"` | | jjrt | `cd "$(jj root \|\| echo .)"` |
| jjs | `jj show` |
| jjsp | `jj split` | | jjsp | `jj split` |
| jjsq | `jj squash` | | jjsq | `jj squash` |
| jjst | `jj status` | | jjst | `jj status` |
| jju | `jj undo` |
| jjw | `jj workspace` |
| jjwa | `jj workspace add` |
| jjwf | `jj workspace forget` |
| jjwl | `jj workspace list` |
## Prompt usage ## Prompt usage
+17
View File
@@ -45,34 +45,51 @@ alias jjbc='jj bookmark create'
alias jjbd='jj bookmark delete' alias jjbd='jj bookmark delete'
alias jjbf='jj bookmark forget' alias jjbf='jj bookmark forget'
alias jjbl='jj bookmark list' alias jjbl='jj bookmark list'
alias jjblt='jj bookmark list --tracked'
alias jjbm='jj bookmark move' alias jjbm='jj bookmark move'
alias jjbr='jj bookmark rename' alias jjbr='jj bookmark rename'
alias jjbs='jj bookmark set' alias jjbs='jj bookmark set'
alias jjbt='jj bookmark track' alias jjbt='jj bookmark track'
alias jjbu='jj bookmark untrack' alias jjbu='jj bookmark untrack'
alias jjc='jj commit' alias jjc='jj commit'
alias jjcfg='jj config'
alias jjcfgl='jj config list'
alias jjcmsg='jj commit --message' alias jjcmsg='jj commit --message'
alias jjd='jj diff' alias jjd='jj diff'
alias jjdmsg='jj desc --message' alias jjdmsg='jj desc --message'
alias jjds='jj desc' alias jjds='jj desc'
alias jjdst='jj diff --stat'
alias jje='jj edit' 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 jjgcl='jj git clone'
alias jjgf='jj git fetch' alias jjgf='jj git fetch'
alias jjgfa='jj git fetch --all-remotes' alias jjgfa='jj git fetch --all-remotes'
alias jjgi='jj git init'
alias jjgp='jj git push' alias jjgp='jj git push'
alias jjgpa='jj git push --all' alias jjgpa='jj git push --all'
alias jjgpd='jj git push --deleted' alias jjgpd='jj git push --deleted'
alias jjgpt='jj git push --tracked' alias jjgpt='jj git push --tracked'
alias jjgrl='jj git remote list'
alias jjl='jj log' alias jjl='jj log'
alias jjla='jj log -r "all()"' alias jjla='jj log -r "all()"'
alias jjn='jj new' alias jjn='jj new'
alias jjnt='jj new "trunk()"' alias jjnt='jj new "trunk()"'
alias jjop='jj op'
alias jjopl='jj op log'
alias jjor='jj op restore'
alias jjrb='jj rebase' alias jjrb='jj rebase'
alias jjrbm='jj rebase -d "trunk()"' alias jjrbm='jj rebase -d "trunk()"'
alias jjrs='jj restore' alias jjrs='jj restore'
alias jjrt='cd "$(jj root || echo .)"' alias jjrt='cd "$(jj root || echo .)"'
alias jjs='jj show'
alias jjsp='jj split' alias jjsp='jj split'
alias jjsq='jj squash' alias jjsq='jj squash'
alias jjst='jj status' alias jjst='jj status'
alias jju='jj undo'
alias jjw='jj workspace'
alias jjwa='jj workspace add' alias jjwa='jj workspace add'
alias jjwf='jj workspace forget' alias jjwf='jj workspace forget'
alias jjwl='jj workspace list'
+1
View File
@@ -71,6 +71,7 @@ plugins=(... kubectl)
| | | **Secret management** | | | | **Secret management** |
| kgsec | `kubectl get secret` | Get secret for decoding | | kgsec | `kubectl get secret` | Get secret for decoding |
| kgseca | `kubectl get secret --all-namespaces` | List secrets across all namespaces | | 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 | | kdsec | `kubectl describe secret` | Describe secret resource in detail |
| kdelsec | `kubectl delete secret` | Delete the secret | | kdelsec | `kubectl delete secret` | Delete the secret |
| | | **Deployment management** | | | | **Deployment management** |
+1
View File
@@ -93,6 +93,7 @@ alias kdelcm='kubectl delete configmap'
# Secret management # Secret management
alias kgsec='kubectl get secret' alias kgsec='kubectl get secret'
alias kgseca='kubectl get secret --all-namespaces' alias kgseca='kubectl get secret --all-namespaces'
alias kesec='kubectl edit secret'
alias kdsec='kubectl describe secret' alias kdsec='kubectl describe secret'
alias kdelsec='kubectl delete secret' alias kdelsec='kubectl delete secret'
+1
View File
@@ -42,6 +42,7 @@ plugins=(... laravel)
| `pamen` | `php artisan make:enum` | | `pamen` | `php artisan make:enum` |
| `pami` | `php artisan make:interface` | | `pami` | `php artisan make:interface` |
| `pamtr` | `php artisan make:trait` | | `pamtr` | `php artisan make:trait` |
| `pamv` | `php artisan make:view` |
## Clears ## Clears
+1
View File
@@ -31,6 +31,7 @@ alias pamcl='php artisan make:class'
alias pamen='php artisan make:enum' alias pamen='php artisan make:enum'
alias pami='php artisan make:interface' alias pami='php artisan make:interface'
alias pamtr='php artisan make:trait' alias pamtr='php artisan make:trait'
alias pamv='php artisan make:view'
# Clears # Clears
+12 -5
View File
@@ -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 # deactivate shell if Pipfile doesn't exist and not in a subdir
if [[ ! -f "$PWD/Pipfile" ]]; then if [[ ! -f "$PWD/Pipfile" ]]; then
if [[ "$PIPENV_ACTIVE" == 1 ]]; 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 unset PIPENV_ACTIVE pipfile_dir
deactivate deactivate
fi fi
fi 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 [[ "$PIPENV_ACTIVE" != 1 ]]; then
if [[ -f "$PWD/Pipfile" ]]; then if [[ -f "$PWD/Pipfile" ]]; then
export pipfile_dir="$PWD" local venv_path
source "$(pipenv --venv)/bin/activate" if venv_path="$(pipenv --venv 2>/dev/null)" && [[ -n "$venv_path" && -f "$venv_path/bin/activate" ]]; then
export PIPENV_ACTIVE=1 export pipfile_dir="$PWD"
source "$venv_path/bin/activate"
export PIPENV_ACTIVE=1
fi
fi fi
fi fi
} }
+4 -2
View File
@@ -1,7 +1,9 @@
# Poetry Environment Plugin # Poetry Environment Plugin
This plugin automatically changes poetry environment when you cd into or out of the project directory. This plugin automatically activates a Poetry environment when you enter a
Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment 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: To use it, add `poetry-env` to the plugins array in your zshrc file:
+14 -5
View File
@@ -1,15 +1,24 @@
_togglePoetryShell() { _togglePoetryShell() {
# Determine if currently in a Poetry-managed directory # Determine if currently in a Poetry-managed directory
local in_poetry_dir=0 local in_poetry_dir=0
local in_active_poetry_dir=0
if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then
in_poetry_dir=1 in_poetry_dir=1
fi fi
# Deactivate the current environment if moving out of a Poetry directory or into a different Poetry directory # Deactivate when leaving the active project or entering a nested project
if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] || [[ "$PWD" != "$poetry_dir"* ]]; }; then if [[ $poetry_active -eq 1 ]]; then
export poetry_active=0 local project_dir="${poetry_dir%/}"
unset poetry_dir if [[ "$PWD" == "$project_dir" || "$PWD" == "$project_dir"/* ]]; then
(( $+functions[deactivate] )) && deactivate 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 fi
# Activate the environment if in a Poetry directory and no environment is currently active # Activate the environment if in a Poetry directory and no environment is currently active
+22
View File
@@ -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 |
+27
View File
@@ -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"
} &|
@@ -19,6 +19,7 @@
ssm_run_sudo() {sudo $_sublime_merge_path "$@" >/dev/null 2>&1} ssm_run_sudo() {sudo $_sublime_merge_path "$@" >/dev/null 2>&1}
alias ssm=ssm_run_sudo alias ssm=ssm_run_sudo
alias sm=sm_run alias sm=sm_run
alias smerge="'$_sublime_merge_path'"
break break
fi fi
done done
@@ -33,6 +34,7 @@
if [[ -a $_sublime_merge_path ]]; then if [[ -a $_sublime_merge_path ]]; then
subm () { "$_sublime_merge_path" "$@" } subm () { "$_sublime_merge_path" "$@" }
alias sm=subm alias sm=subm
alias smerge="'$_sublime_merge_path'"
break break
fi fi
done done
@@ -45,6 +47,7 @@
if [[ -a $_sublime_merge_path ]]; then if [[ -a $_sublime_merge_path ]]; then
subm () { "$_sublime_merge_path" "$@" } subm () { "$_sublime_merge_path" "$@" }
alias sm=subm alias sm=subm
alias smerge="'$_sublime_merge_path'"
break break
fi fi
done done
+21 -13
View File
@@ -15,8 +15,8 @@
# - https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Console/Resources/completion.bash # - https://github.com/symfony/symfony/blob/5.4/src/Symfony/Component/Console/Resources/completion.bash
# #
_sf_console() { _sf_console() {
local lastParam flagPrefix requestComp out comp local lastParam out comp sf_cmd
local -a completions local -a completions flagPrefix requestComp inputs
# The user could have moved the cursor backwards on the command-line. # The user could have moved the cursor backwards on the command-line.
# We need to trigger completion from the $CURRENT location, so we need # We need to trigger completion from the $CURRENT location, so we need
@@ -29,11 +29,20 @@ _sf_console() {
setopt local_options BASH_REMATCH setopt local_options BASH_REMATCH
if [[ "${lastParam}" =~ '-.*=' ]]; then if [[ "${lastParam}" =~ '-.*=' ]]; then
# We are dealing with a flag with an = # We are dealing with a flag with an =
flagPrefix="-P ${BASH_REMATCH}" flagPrefix=(-P "${BASH_REMATCH}")
fi fi
# Prepare the command to obtain completions # Prepare the command to obtain completions. An alias is resolved here,
requestComp="${words[0]} ${words[1]} _complete --no-interaction -szsh -a1 -c$((CURRENT-1))" i="" # 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 for w in ${words[@]}; do
w=$(printf -- '%b' "$w") w=$(printf -- '%b' "$w")
# remove quotes from typed values # remove quotes from typed values
@@ -47,19 +56,18 @@ _sf_console() {
fi fi
# empty values are ignored # empty values are ignored
if [ ! -z "$w" ]; then if [ ! -z "$w" ]; then
i="${i}-i${w} " inputs+=("-i$w")
fi fi
done done
# Ensure at least 1 input # Ensure at least 1 input
if [ "${i}" = "" ]; then if (( ! $#inputs )); then
requestComp="${requestComp} -i\" \"" inputs=(-i' ')
else
requestComp="${requestComp} ${i}"
fi fi
# Use eval to handle any environment variables and such # The request is run without being read again by the shell, so that a
out=$(eval ${requestComp} 2>/dev/null) # "$(...)" 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 while IFS='\n' read -r comp; do
if [ -n "$comp" ]; then if [ -n "$comp" ]; then
@@ -75,7 +83,7 @@ _sf_console() {
done < <(printf "%s\n" "${out[@]}") done < <(printf "%s\n" "${out[@]}")
# Let inbuilt _describe handle completions # Let inbuilt _describe handle completions
eval _describe "completions" completions $flagPrefix _describe "completions" completions "${flagPrefix[@]}"
return $? return $?
} }
+10
View File
@@ -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)
```
+26
View File
@@ -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
+1
View File
@@ -47,6 +47,7 @@ _box_arguments=(
'help:COMMAND List subcommands' 'help:COMMAND List subcommands'
'list:Lists all installed boxes' 'list:Lists all installed boxes'
'outdated:Checks if a box has newer version' 'outdated:Checks if a box has newer version'
'prune:Removes old versions of installed boxes'
'remove:NAME Removes a box from the system' 'remove:NAME Removes a box from the system'
'repackage:NAME PROVIDER VERSION Repackages an installed box into a `.box` file' 'repackage:NAME PROVIDER VERSION Repackages an installed box into a `.box` file'
'update:Updates box to a newer version, if available' 'update:Updates box to a newer version, if available'