mirror of
https://github.com/robbyrussell/oh-my-zsh.git
synced 2026-09-21 18:46:06 +02:00
Compare commits
83
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ee67f0428 | ||
|
|
ec2901b7d0 | ||
|
|
1396cdd674 | ||
|
|
2ea948e05b | ||
|
|
6cd3a0baf6 | ||
|
|
fcf965912c | ||
|
|
c648271b6b | ||
|
|
53f663f3d8 | ||
|
|
e995678ca8 | ||
|
|
aea374f522 | ||
|
|
6553f90c45 | ||
|
|
9bf43f682c | ||
|
|
1b72d609b4 | ||
|
|
3258baa8b4 | ||
|
|
ee78d3aedd | ||
|
|
2b48fa42f9 | ||
|
|
be8da5c771 | ||
|
|
c6e66edee8 | ||
|
|
a1115e6eb8 | ||
|
|
24d629f7f1 | ||
|
|
d6f3106269 | ||
|
|
e6561f578f | ||
|
|
9bb15d681a | ||
|
|
ee2acd0e44 | ||
|
|
d5fa35e453 | ||
|
|
2c911e3f80 | ||
|
|
cd320b5506 | ||
|
|
e8b1cca662 | ||
|
|
8e5f198226 | ||
|
|
391cafc4cf | ||
|
|
3079e2f0b5 | ||
|
|
129de5a05f | ||
|
|
bd77419b2a | ||
|
|
d217d05374 | ||
|
|
c891b750b0 | ||
|
|
6aa16696d5 | ||
|
|
8d10cc9488 | ||
|
|
bf77e350e0 | ||
|
|
07351f99fc | ||
|
|
39334a08e9 | ||
|
|
cba369e090 | ||
|
|
0da7919339 | ||
|
|
992edcc17d | ||
|
|
78cbb3fe5e | ||
|
|
76ac9fcddc | ||
|
|
17bbf5fdac | ||
|
|
704f7d59d8 | ||
|
|
0b235c54de | ||
|
|
426650fbe8 | ||
|
|
8a5b393088 | ||
|
|
87d4d40418 | ||
|
|
593e8ed6c8 | ||
|
|
747123823c | ||
|
|
daaa103cec | ||
|
|
4bdcaad01a | ||
|
|
5b5265d677 | ||
|
|
421d95782d | ||
|
|
7079eaf80d | ||
|
|
b842e5e63e | ||
|
|
c76b3002b6 | ||
|
|
3f84a2ae4a | ||
|
|
9112b53fa8 | ||
|
|
a5ecff7560 | ||
|
|
233ec5c507 | ||
|
|
91ad6c5c4c | ||
|
|
b5d75fc565 | ||
|
|
44ce832bbd | ||
|
|
b23f11ce1e | ||
|
|
4b657407c9 | ||
|
|
9b26410d99 | ||
|
|
58f87ce1e9 | ||
|
|
146461f7c6 | ||
|
|
ec03bc620c | ||
|
|
67462daf46 | ||
|
|
effdcb7572 | ||
|
|
830a5bcfd2 | ||
|
|
d42209f2af | ||
|
|
1b2b604c48 | ||
|
|
97e11051e2 | ||
|
|
178813b7b9 | ||
|
|
0e98520c5b | ||
|
|
b54a719775 | ||
|
|
1f9511f132 |
@@ -12,7 +12,7 @@ dependencies:
|
||||
plugins/gradle:
|
||||
repo: gradle/gradle-completion
|
||||
branch: master
|
||||
version: 63578c9bc56134b80766e88957ba0239e6be2343
|
||||
version: e7c881dbef7462bc35ad05328397e1582fe25cb8
|
||||
precopy: |
|
||||
set -e
|
||||
find . ! -name _gradle ! -name LICENSE -delete
|
||||
@@ -30,7 +30,7 @@ dependencies:
|
||||
plugins/kube-ps1:
|
||||
repo: jonmosco/kube-ps1
|
||||
branch: master
|
||||
version: 04af46f7fe888ad287abcab6699b9bb10234bc3d
|
||||
version: b4cd09ec8d4dc007173e28da40aeebf8eff8c87f
|
||||
precopy: |
|
||||
set -e
|
||||
find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete
|
||||
@@ -46,11 +46,55 @@ dependencies:
|
||||
plugins/z:
|
||||
branch: master
|
||||
repo: agkozak/zsh-z
|
||||
version: acd0e1984df350c189f8f9c4956ec586b6c73fca
|
||||
version: 102fb78036ed76feedf623907483691777a1d510
|
||||
precopy: |
|
||||
set -e
|
||||
rm -r tests
|
||||
test -e README.md && mv -f README.md MANUAL.md
|
||||
postcopy: |
|
||||
set -e
|
||||
test -e _zshz && mv -f _zshz _z
|
||||
test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh
|
||||
plugins/zsh-autosuggestions:
|
||||
repo: zsh-users/zsh-autosuggestions
|
||||
branch: master
|
||||
version: 85919cd1ffa7d2d5412f6d3fe437ebdbeeec4fc5
|
||||
precopy: |
|
||||
set -e
|
||||
test -e README.md && mv -f README.md MANUAL.md
|
||||
sed -i 's|\[INSTALL.md\](INSTALL.md)|[the Oh My Zsh plugin README](README.md)|' MANUAL.md
|
||||
rm -f zsh-autosuggestions.plugin.zsh
|
||||
mv -f zsh-autosuggestions.zsh zsh-autosuggestions.plugin.zsh
|
||||
find . -depth -mindepth 1 \
|
||||
! -path './LICENSE' \
|
||||
! -path './MANUAL.md' \
|
||||
! -path './src' \
|
||||
! -path './src/*' \
|
||||
! -path './zsh-autosuggestions.plugin.zsh' \
|
||||
-delete
|
||||
plugins/zsh-syntax-highlighting:
|
||||
repo: zsh-users/zsh-syntax-highlighting
|
||||
branch: master
|
||||
version: 2fc57d63067c18b1100ecdbf684fa5baf49459d1
|
||||
precopy: |
|
||||
set -e
|
||||
version=$(<.version)
|
||||
test -e README.md && mv -f README.md MANUAL.md
|
||||
sed -i 's|\[INSTALL.md\](INSTALL.md)|[the Oh My Zsh plugin README](README.md)|' MANUAL.md
|
||||
rm -f zsh-syntax-highlighting.plugin.zsh
|
||||
mv -f zsh-syntax-highlighting.zsh zsh-syntax-highlighting.plugin.zsh
|
||||
mv -f COPYING.md LICENSE
|
||||
sed -i "s|typeset -g ZSH_HIGHLIGHT_VERSION=.*|typeset -g ZSH_HIGHLIGHT_VERSION=$version|" zsh-syntax-highlighting.plugin.zsh
|
||||
sed -i 's|typeset -g ZSH_HIGHLIGHT_REVISION=.*|typeset -g ZSH_HIGHLIGHT_REVISION=HEAD|' zsh-syntax-highlighting.plugin.zsh
|
||||
find highlighters -type d -name test-data -prune -exec rm -rf {} +
|
||||
find . -depth -mindepth 1 \
|
||||
! -path './LICENSE' \
|
||||
! -path './MANUAL.md' \
|
||||
! -path './docs' \
|
||||
! -path './docs/*' \
|
||||
! -path './highlighters' \
|
||||
! -path './highlighters/*' \
|
||||
! -path './images' \
|
||||
! -path './images/*' \
|
||||
! -path './zsh-syntax-highlighting.plugin.zsh' \
|
||||
-delete
|
||||
|
||||
@@ -16,7 +16,7 @@ jobs:
|
||||
contents: write # this is needed to push commits and branches
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
certifi==2026.7.22
|
||||
charset-normalizer==3.4.9
|
||||
idna==3.18
|
||||
charset-normalizer==3.5.1
|
||||
idna==3.19
|
||||
PyYAML==6.0.3
|
||||
requests==2.34.2
|
||||
semver==3.0.4
|
||||
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
- macos-latest
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
- test
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
- name: Authenticate as @ohmyzsh
|
||||
|
||||
@@ -36,7 +36,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Harden the runner (Audit all outbound calls)
|
||||
uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
|
||||
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
@@ -60,6 +60,6 @@ jobs:
|
||||
retention-days: 5
|
||||
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@5595ccaf912efad79be6eef63a5619ff05969be3 # v4.37.6
|
||||
uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
||||
@@ -23,6 +23,14 @@ Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
|
||||
[](https://mstdn.social/@ohmyzsh)
|
||||
[](https://discord.gg/ohmyzsh)
|
||||
|
||||
<a href="https://commitgoods.com/collections/oh-my-zsh?utm_source=github">
|
||||
<picture>
|
||||
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.shopify.com/s/files/1/0101/8752/files/commitgoods-badge-stacked-navy-dark.svg">
|
||||
<img src="https://cdn.shopify.com/s/files/1/0101/8752/files/commitgoods-badge-stacked-navy.svg" height="28" alt="Official merch on commitgoods.com">
|
||||
</picture>
|
||||
</a>
|
||||
|
||||
|
||||
<details>
|
||||
<summary>Table of Contents</summary>
|
||||
|
||||
@@ -466,6 +474,22 @@ zstyle ':omz:update' frequency 7
|
||||
zstyle ':omz:update' frequency 0
|
||||
```
|
||||
|
||||
By default, updates always pull the latest changes. If you'd rather let others kick the tires first
|
||||
before an update reaches your machine, you can set a cooldown (in days). You'll still get everything —
|
||||
just a little later:
|
||||
|
||||
```sh
|
||||
# Only apply updates that are at least 10 days old
|
||||
zstyle ':omz:update' cooldown 10
|
||||
```
|
||||
|
||||
`omz update` honors this setting. If you call `upgrade.sh` directly, pass the same
|
||||
value with `-c`, because that script does not read your `.zshrc`:
|
||||
|
||||
```sh
|
||||
$ZSH/tools/upgrade.sh -c 10
|
||||
```
|
||||
|
||||
### Updates Verbosity
|
||||
|
||||
You can also limit the update verbosity with the following settings:
|
||||
|
||||
+11
-2
@@ -519,7 +519,7 @@ function _omz::plugin::load {
|
||||
# Check if it has completion to reload compinit
|
||||
local -a comp_files
|
||||
comp_files=($base/_*(N))
|
||||
has_completion=$(( $#comp_files > 0 ))
|
||||
(( has_completion )) || has_completion=$(( $#comp_files > 0 ))
|
||||
|
||||
# Load the plugin
|
||||
if [[ -f "$base/$plugin.plugin.zsh" ]]; then
|
||||
@@ -738,6 +738,9 @@ function _omz::reload {
|
||||
|
||||
# Old zsh versions don't have ZSH_ARGZERO
|
||||
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
|
||||
# ZSH_ARGZERO is how zsh was invoked, not the path to it, so re-resolve
|
||||
# anything that is not absolute (see #13919)
|
||||
[[ "${zsh#-}" != /* ]] && (( $+commands[zsh] )) && zsh="$commands[zsh]"
|
||||
# Check whether to run a login shell
|
||||
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
|
||||
}
|
||||
@@ -903,8 +906,11 @@ function _omz::update {
|
||||
}
|
||||
|
||||
# Run update script
|
||||
local verbose_mode cooldown_days
|
||||
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
|
||||
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
|
||||
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0
|
||||
[[ $cooldown_days == <-> ]] || cooldown_days=0
|
||||
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode -c $cooldown_days || return $?
|
||||
|
||||
# Update last updated file
|
||||
zmodload zsh/datetime
|
||||
@@ -916,6 +922,9 @@ function _omz::update {
|
||||
if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
|
||||
# Old zsh versions don't have ZSH_ARGZERO
|
||||
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
|
||||
# ZSH_ARGZERO is how zsh was invoked, not the path to it, so re-resolve
|
||||
# anything that is not absolute (see #13919)
|
||||
[[ "${zsh#-}" != /* ]] && (( $+commands[zsh] )) && zsh="$commands[zsh]"
|
||||
# Check whether to run a login shell
|
||||
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
|
||||
fi
|
||||
|
||||
+1
-1
@@ -271,7 +271,7 @@ function _omz_diag_dump_check_core_commands() {
|
||||
unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile
|
||||
zle zmodload zparseopts zregexparse zstyle )
|
||||
if is-at-least 5.1; then
|
||||
reserved_word+=( declare export integer float local readonly typeset )
|
||||
reserved_words+=( declare export integer float local readonly typeset )
|
||||
else
|
||||
builtins+=( declare export integer float local readonly typeset )
|
||||
fi
|
||||
|
||||
+43
-21
@@ -12,10 +12,16 @@ function __git_prompt_git() {
|
||||
}
|
||||
|
||||
function _omz_git_prompt_info() {
|
||||
# If we are on a folder not tracked by git, get out.
|
||||
# Otherwise, check for hide-info at global and local repository level
|
||||
if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
|
||||
|| [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
|
||||
# Get the git dir and the current branch name in one call. Outside a repo
|
||||
# there is no output. On a detached HEAD the branch is "HEAD". On an unborn
|
||||
# branch git exits non-zero after printing the git dir.
|
||||
local -a info
|
||||
info=("${(@f)$(__git_prompt_git rev-parse --git-dir --abbrev-ref HEAD 2> /dev/null)}")
|
||||
local unborn=$(( $? != 0 ))
|
||||
[[ -n "$info[1]" ]] || return 0
|
||||
|
||||
# Check for hide-info at global and local repository level
|
||||
if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
@@ -23,11 +29,15 @@ function _omz_git_prompt_info() {
|
||||
# - the current branch name
|
||||
# - the tag name if we are on a tag
|
||||
# - the short SHA of the current commit
|
||||
local ref
|
||||
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
|
||||
|| ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|
||||
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|
||||
|| return 0
|
||||
# a git dir path may contain newlines, so the branch is the last line
|
||||
local ref="$info[-1]"
|
||||
if (( unborn )); then
|
||||
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) || return 0
|
||||
elif [[ "$ref" == HEAD ]]; then
|
||||
ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|
||||
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|
||||
|| return 0
|
||||
fi
|
||||
|
||||
# Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info
|
||||
local upstream
|
||||
@@ -39,16 +49,27 @@ function _omz_git_prompt_info() {
|
||||
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref//\%/%%}${upstream//\%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
|
||||
}
|
||||
|
||||
function _omz_git_prompt_status() {
|
||||
# OHMYZSH-13330: avoid "regex matching error: illegal byte sequence".
|
||||
# zsh's "=~" operator delegates to the C library regex, which aborts with
|
||||
# REG_ILLSEQ when the subject contains an invalid byte sequence under a
|
||||
# multibyte locale (e.g. a filename with non-UTF-8 bytes in `git status`
|
||||
# output). Forcing the C locale makes every byte a valid character, so the
|
||||
# regex matching below never fails that way. `git status --porcelain` is
|
||||
# locale-independent, so this does not change the parsed output.
|
||||
# Match an extended regular expression against a subject, forcing the C locale
|
||||
# only for the duration of the call.
|
||||
#
|
||||
# OHMYZSH-13330: zsh's "=~" operator delegates to the C library regex, which
|
||||
# aborts with REG_ILLSEQ when the subject contains an invalid byte sequence
|
||||
# under a multibyte locale (e.g. a filename with non-UTF-8 bytes in `git
|
||||
# status` output). Forcing the C locale makes every byte a valid character,
|
||||
# so the regex matching never fails that way. `git status --porcelain` is
|
||||
# locale-independent, so this does not change the parsed output.
|
||||
#
|
||||
# OHMYZSH-13985: the locale must be scoped to this function and not set for
|
||||
# the whole caller. Assigning LC_ALL makes zsh re-run setlocale() right away,
|
||||
# so leaving it set while the rest of the caller runs breaks multibyte
|
||||
# handling there — most visibly, `echo` refuses to expand Unicode escapes in
|
||||
# theme prompt symbols ("character not in range").
|
||||
function _omz_git_prompt_status_match() {
|
||||
local -x LC_ALL=C
|
||||
[[ "$1" =~ "$2" ]]
|
||||
}
|
||||
|
||||
function _omz_git_prompt_status() {
|
||||
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
|
||||
|
||||
# Maps a git status prefix to an internal constant
|
||||
@@ -113,11 +134,11 @@ function _omz_git_prompt_status() {
|
||||
status_lines=("${(@f)${status_text}}")
|
||||
|
||||
# If the tracking line exists, get and parse it
|
||||
if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
|
||||
if _omz_git_prompt_status_match "$status_lines[1]" "^## [^ ]+ \[(.*)\]"; then
|
||||
local branch_statuses
|
||||
branch_statuses=("${(@s/,/)match}")
|
||||
for branch_status in $branch_statuses; do
|
||||
if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
|
||||
if ! _omz_git_prompt_status_match "$branch_status" "(behind|diverged|ahead) ([0-9]+)?"; then
|
||||
continue
|
||||
fi
|
||||
local last_parsed_status=$prefix_constant_map[$match[1]]
|
||||
@@ -130,7 +151,7 @@ function _omz_git_prompt_status() {
|
||||
local status_constant="${prefix_constant_map[$status_prefix]}"
|
||||
local status_regex=$'(^|\n)'"$status_prefix"
|
||||
|
||||
if [[ "$status_text" =~ $status_regex ]]; then
|
||||
if _omz_git_prompt_status_match "$status_text" "$status_regex"; then
|
||||
statuses_seen[$status_constant]=1
|
||||
fi
|
||||
done
|
||||
@@ -233,7 +254,8 @@ function parse_git_dirty() {
|
||||
FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}"
|
||||
;;
|
||||
esac
|
||||
STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1)
|
||||
# only non-emptiness matters, so keep one line instead of the whole list
|
||||
__git_prompt_git status ${FLAGS} 2> /dev/null | read -r STATUS
|
||||
fi
|
||||
if [[ -n $STATUS ]]; then
|
||||
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
|
||||
|
||||
@@ -21,6 +21,7 @@ function chruby_prompt_info \
|
||||
azure_prompt_info \
|
||||
tf_prompt_info \
|
||||
conda_prompt_info \
|
||||
go_prompt_info \
|
||||
{
|
||||
return 1
|
||||
}
|
||||
|
||||
+10
-4
@@ -14,10 +14,16 @@ FX=(
|
||||
reverse "%{[07m%}" no-reverse "%{[27m%}"
|
||||
)
|
||||
|
||||
for color in {000..255}; do
|
||||
FG[$color]="%{[38;5;${color}m%}"
|
||||
BG[$color]="%{[48;5;${color}m%}"
|
||||
done
|
||||
# Build the tables with array operations instead of a 256-iteration loop
|
||||
() {
|
||||
setopt localoptions noksharrays
|
||||
local -a codes fg bg
|
||||
codes=({000..255})
|
||||
fg=( "%{"$'\e'"[38;5;"${^codes}"m%}" )
|
||||
bg=( "%{"$'\e'"[48;5;"${^codes}"m%}" )
|
||||
FG=( ${codes:^fg} )
|
||||
BG=( ${codes:^bg} )
|
||||
}
|
||||
|
||||
# Show all 256 colors with color number
|
||||
function spectrum_ls() {
|
||||
|
||||
+8
-2
@@ -22,7 +22,8 @@ function title {
|
||||
print -Pn "\e]1;${1:q}\a" # set tab name
|
||||
;;
|
||||
screen*|tmux*)
|
||||
print -Pn "\ek${1:q}\e\\" # set screen hardstatus
|
||||
print -Pn "\e]2;${2:q}\e\\" # set tmux pane title
|
||||
print -Pn "\ek${1:q}\e\\" # set screen hardstatus/tmux window name if `allow-rename` is on
|
||||
;;
|
||||
*)
|
||||
if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
|
||||
@@ -31,7 +32,12 @@ function title {
|
||||
else
|
||||
# Try to use terminfo to set the title if the feature is available
|
||||
if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then
|
||||
print -Pn "${terminfo[tsl]}$1${terminfo[fsl]}"
|
||||
# Emit the capabilities with echoti so terminfo does its own parameter
|
||||
# substitution: some terminals (vt320) take a column argument, and
|
||||
# running prompt expansion over the capability string mangles it.
|
||||
echoti tsl 0
|
||||
print -Pn "$1"
|
||||
echoti fsl
|
||||
fi
|
||||
fi
|
||||
;;
|
||||
|
||||
+17
-7
@@ -64,7 +64,7 @@ if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
|
||||
fi
|
||||
|
||||
# Create cache and completions dir and add to $fpath
|
||||
mkdir -p "$ZSH_CACHE_DIR/completions"
|
||||
[[ -d "$ZSH_CACHE_DIR/completions" ]] || mkdir -p "$ZSH_CACHE_DIR/completions"
|
||||
(( ${fpath[(Ie)$ZSH_CACHE_DIR/completions]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
|
||||
|
||||
# Check for updates on initial load...
|
||||
@@ -114,9 +114,17 @@ fi
|
||||
zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
|
||||
zcompdump_fpath="#omz fpath: $fpath"
|
||||
|
||||
# Check whether the zcompdump file carries the current OMZ metadata lines
|
||||
_omz_compdump_has_metadata() {
|
||||
local -a lines
|
||||
[[ -r "$ZSH_COMPDUMP" ]] || return 1
|
||||
lines=("${(@f)$(<"$ZSH_COMPDUMP")}")
|
||||
(( ${lines[(Ie)$zcompdump_revision]} && ${lines[(Ie)$zcompdump_fpath]} ))
|
||||
}
|
||||
|
||||
# Delete the zcompdump file if OMZ zcompdump metadata changed
|
||||
if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
|
||||
|| ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then
|
||||
zcompdump_refresh=0
|
||||
if ! _omz_compdump_has_metadata; then
|
||||
command rm -f "$ZSH_COMPDUMP"
|
||||
zcompdump_refresh=1
|
||||
fi
|
||||
@@ -134,9 +142,8 @@ else
|
||||
compinit -u -d "$ZSH_COMPDUMP"
|
||||
fi
|
||||
|
||||
# Append zcompdump metadata if missing
|
||||
if (( $zcompdump_refresh )) \
|
||||
|| ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null; then
|
||||
# Append zcompdump metadata if missing (compinit may have regenerated the file)
|
||||
if (( zcompdump_refresh )) || ! _omz_compdump_has_metadata; then
|
||||
# Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error
|
||||
# See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489
|
||||
tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF
|
||||
@@ -146,9 +153,12 @@ $zcompdump_fpath
|
||||
EOF
|
||||
fi
|
||||
unset zcompdump_revision zcompdump_fpath zcompdump_refresh
|
||||
unset -f _omz_compdump_has_metadata
|
||||
|
||||
# zcompile the completion dump file if the .zwc is older or missing.
|
||||
if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
|
||||
# Test that first so the lock directory and zrecompile are skipped when it's fresh.
|
||||
if [[ ! "${ZSH_COMPDUMP}.zwc" -nt "$ZSH_COMPDUMP" ]] \
|
||||
&& command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
|
||||
zrecompile -q -p "$ZSH_COMPDUMP"
|
||||
command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
|
||||
fi
|
||||
|
||||
@@ -9,7 +9,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_op" ]]; then
|
||||
_comps[op]=_op
|
||||
fi
|
||||
|
||||
op completion zsh >| "$ZSH_CACHE_DIR/completions/_op" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_op"
|
||||
zf_mv -f -- =( op completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# Load opswd function
|
||||
autoload -Uz opswd
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
# AppSignal CLI plugin
|
||||
|
||||
This plugin adds aliases, guard rails and completion for the
|
||||
[AppSignal CLI](https://docs.appsignal.com/cli).
|
||||
|
||||
To use it, add `appsignal-cli` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... appsignal-cli)
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
[AppSignal CLI](https://docs.appsignal.com/cli) 2.1 or newer, installed and on
|
||||
your `PATH`. The plugin does nothing if it is not:
|
||||
|
||||
```zsh
|
||||
brew install appsignal/appsignal-cli/appsignal-cli
|
||||
# or
|
||||
curl -sSL https://github.com/appsignal/appsignal-cli/releases/latest/download/install.sh | sudo sh
|
||||
```
|
||||
|
||||
Most commands need `appsignal-cli auth login` first.
|
||||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command | Description |
|
||||
| :------ | :----------------------------- | :--------------------------------- |
|
||||
| `asig` | `appsignal-cli` | The AppSignal CLI itself |
|
||||
| `aslog` | `appsignal-cli logs tail` | Stream log lines as they arrive |
|
||||
| `asinc` | `appsignal-cli incidents list` | List incidents for an application |
|
||||
|
||||
`aslog` and `asinc` complete like the commands they stand in for, so
|
||||
`aslog --<TAB>` offers the flags of `appsignal-cli logs tail`.
|
||||
|
||||
## Functions
|
||||
|
||||
| Function | Description |
|
||||
| :-------------- | :----------------------------------------------------------------- |
|
||||
| `appsignal-cli` | Wraps the CLI to confirm before irreversible commands. See Settings |
|
||||
|
||||
## Completion
|
||||
|
||||
Every command completes with a description of what it does, at every level, and
|
||||
so do their flags and allowed values: incident states and severities, sort
|
||||
orders, log severities, trigger fields and comparison operators, output formats
|
||||
and skill targets. `samples` and `sample` complete like `traces`, as they do in
|
||||
the CLI itself.
|
||||
|
||||
`--org` completes offline from the `org` key of your project's
|
||||
`.appsignal.toml` and of the global config.
|
||||
|
||||
The AppSignal CLI ships no completion generator of its own, so `_appsignal-cli`
|
||||
is written from its command definitions and kept in this repository. It targets
|
||||
AppSignal CLI 2.1.x.
|
||||
|
||||
## Settings
|
||||
|
||||
Set these with `zstyle` in your zshrc, before Oh My Zsh is sourced.
|
||||
|
||||
### Confirming destructive commands
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:plugins:appsignal-cli' confirm-destructive no
|
||||
```
|
||||
|
||||
By default the plugin asks for confirmation before four operations that the CLI
|
||||
itself performs without a prompt:
|
||||
|
||||
- `appsignal-cli logs metrics delete`
|
||||
- `appsignal-cli logs triggers delete`
|
||||
- `appsignal-cli triggers archive`, which also closes the trigger's alerts and
|
||||
incidents
|
||||
- `appsignal-cli incidents update --state CLOSED` when it names more than one
|
||||
incident, since that flag accepts a comma-separated list
|
||||
|
||||
Nothing else is intercepted, and the prompt is skipped when stdin is not a
|
||||
terminal, so scripts, pipelines and CI are unaffected. Set the style to `no` to
|
||||
turn the prompt off entirely, or run `command appsignal-cli` for a single
|
||||
invocation.
|
||||
|
||||
### Completing applications
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:plugins:appsignal-cli' dynamic-app-completion yes
|
||||
```
|
||||
|
||||
Off by default. When enabled, `--app`, `--app-id` and `--environment` are
|
||||
completed from `appsignal-cli apps list --output json`, showing each
|
||||
application's name and environment 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:appsignal-cli' aliases no
|
||||
```
|
||||
|
||||
## Caveats
|
||||
|
||||
- `appsignal-cli` and the AppSignal Ruby gem's `appsignal` command are different
|
||||
tools. The gem's command installs and diagnoses the agent inside your app;
|
||||
this one queries your data. The plugin deliberately leaves `appsignal` alone,
|
||||
so it keeps working in projects that use the gem.
|
||||
- `appsignal-cli` is a shell function here. Run `command appsignal-cli` to reach
|
||||
the binary directly.
|
||||
- Most commands need exactly one of `--app-id` or `--app`. `--environment` only
|
||||
narrows `--app`; it does nothing next to `--app-id`.
|
||||
- `appsignal-cli project init` writes `.appsignal.toml`, and `auth login` then
|
||||
stores OAuth tokens in it. Do not commit that file.
|
||||
- `incidents delete-note`, `auth logout` and the `--clear-*` flags of
|
||||
`logs metrics update` and `logs triggers update` are destructive too, but are
|
||||
not prompted for: each affects a single note, login or field.
|
||||
- `triggers create` and `triggers update` have their own `--format`, for the
|
||||
format of the metric value. Everywhere else `--format` is a synonym for
|
||||
`--output`.
|
||||
- The CLI sends usage telemetry by default. `APPSIGNAL_CLI_TELEMETRY=0` turns it
|
||||
off, and `APPSIGNAL_CLI_DEBUG=1` shows internal errors.
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,108 @@
|
||||
# AppSignal CLI: completion, aliases and guard rails.
|
||||
# https://docs.appsignal.com/cli
|
||||
|
||||
if (( ! $+commands[appsignal-cli] )); then
|
||||
return
|
||||
fi
|
||||
|
||||
# Does this invocation need confirming? Sets REPLY to the reason.
|
||||
#
|
||||
# The command path is collected from the leading bare words. Only the global
|
||||
# flags may precede a subcommand, so the first other flag ends the path: that
|
||||
# way an option value such as `--app "My App"` is never mistaken for one.
|
||||
function _appsignal_cli_is_destructive() {
|
||||
zstyle -T ':omz:plugins:appsignal-cli' confirm-destructive || return 1
|
||||
|
||||
# Nobody to answer: CI and pipelines are unaffected.
|
||||
[[ -t 0 ]] || return 1
|
||||
|
||||
local -a args=("$@") path numbers
|
||||
local arg state=""
|
||||
integer i=1 n=$# path_done=0
|
||||
|
||||
while (( i <= n )); do
|
||||
arg="$args[i]"
|
||||
case "$arg" in
|
||||
--) break ;;
|
||||
--state=*) state="${arg#--state=}"; path_done=1 ;;
|
||||
--state) state="$args[i+1]"; (( i++ )); path_done=1 ;;
|
||||
--number=*) numbers+=(${(s:,:)${arg#--number=}}); path_done=1 ;;
|
||||
# --number takes one or more values, comma-separated or repeated.
|
||||
--number)
|
||||
path_done=1
|
||||
while (( i < n )) && [[ "$args[i+1]" != -* ]]; do
|
||||
(( i++ ))
|
||||
numbers+=(${(s:,:)args[i]})
|
||||
done
|
||||
;;
|
||||
# The output flag is global, so it can appear before the subcommand.
|
||||
-o|--output|--format) (( i++ )) ;;
|
||||
-o*|--output=*|--format=*) ;;
|
||||
-*) path_done=1 ;;
|
||||
*) (( path_done )) || path+=("$arg") ;;
|
||||
esac
|
||||
(( i++ ))
|
||||
done
|
||||
|
||||
case "${(j: :)path[1,3]}" in
|
||||
"logs metrics delete")
|
||||
REPLY="deleting a log-derived metric cannot be undone."
|
||||
return 0
|
||||
;;
|
||||
"logs triggers delete")
|
||||
REPLY="deleting a log-based trigger cannot be undone."
|
||||
return 0
|
||||
;;
|
||||
"triggers archive")
|
||||
REPLY="archiving a trigger also closes its alerts and incidents."
|
||||
return 0
|
||||
;;
|
||||
"incidents update")
|
||||
if [[ "${(U)state}" == CLOSED ]] && (( $#numbers > 1 )); then
|
||||
REPLY="this closes $#numbers incidents at once."
|
||||
return 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
# Adds a confirmation prompt before irreversible operations. Everything else
|
||||
# passes straight through, so `logs tail` keeps streaming and pipes stay clean.
|
||||
function appsignal-cli() {
|
||||
local REPLY
|
||||
if _appsignal_cli_is_destructive "$@"; then
|
||||
print -u2 -- "appsignal-cli: $REPLY"
|
||||
if ! read -q "?Continue? [y/N] "; then
|
||||
print -u2 -- ""
|
||||
return 130
|
||||
fi
|
||||
print -u2 -- ""
|
||||
fi
|
||||
|
||||
command appsignal-cli "$@"
|
||||
}
|
||||
|
||||
# Complete the aliases like the commands they stand in for.
|
||||
if (( $+functions[compdef] )); then
|
||||
_aslog() {
|
||||
words=(appsignal-cli logs tail ${words[2,-1]})
|
||||
(( CURRENT += 2 ))
|
||||
_appsignal-cli
|
||||
}
|
||||
|
||||
_asinc() {
|
||||
words=(appsignal-cli incidents list ${words[2,-1]})
|
||||
(( CURRENT += 2 ))
|
||||
_appsignal-cli
|
||||
}
|
||||
|
||||
compdef _appsignal-cli asig
|
||||
compdef _aslog aslog
|
||||
compdef _asinc asinc
|
||||
fi
|
||||
|
||||
alias asig='appsignal-cli'
|
||||
alias aslog='appsignal-cli logs tail'
|
||||
alias asinc='appsignal-cli incidents list'
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_arduino-cli" ]]; then
|
||||
fi
|
||||
|
||||
# Generate and load arduino-cli completion
|
||||
arduino-cli completion zsh >! "$ZSH_CACHE_DIR/completions/_arduino-cli" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_arduino-cli"
|
||||
zf_mv -f -- =( arduino-cli completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then
|
||||
_comps[argocd]=_argocd
|
||||
fi
|
||||
|
||||
argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_argocd"
|
||||
zf_mv -f -- =( argocd completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -12,4 +12,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
|
||||
autoload -Uz _asdf
|
||||
_comps[asdf]=_asdf
|
||||
fi
|
||||
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_asdf"
|
||||
zf_mv -f -- =( asdf completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -241,7 +241,7 @@ function aws_regions() {
|
||||
function aws_profiles() {
|
||||
aws --no-cli-pager configure list-profiles 2> /dev/null && return
|
||||
[[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
|
||||
grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g'
|
||||
command grep -Eo '^[[:space:]]*\[[[:space:]]*(profile[[:space:]]+)?[^][:space:]]+[[:space:]]*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | command sed -E 's/^[[:space:]]*\[[[:space:]]*(profile[[:space:]]+)?([^][:space:]]+)[[:space:]]*\]$/\2/'
|
||||
}
|
||||
|
||||
function _aws_regions() {
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_buf" ]]; then
|
||||
fi
|
||||
|
||||
# Generate and load buf completion
|
||||
buf completion zsh >! "$ZSH_CACHE_DIR/completions/_buf" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_buf"
|
||||
zf_mv -f -- =( buf completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then
|
||||
_comps[bun]=_bun
|
||||
fi
|
||||
|
||||
SHELL=zsh bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_bun"
|
||||
zf_mv -f -- =( SHELL=zsh bun completions ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_charm" ]]; then
|
||||
_comps[charm]=_charm
|
||||
fi
|
||||
|
||||
charm completion zsh >| "$ZSH_CACHE_DIR/completions/_charm" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_charm"
|
||||
zf_mv -f -- =( charm completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_chezmoi" ]]; then
|
||||
_comps[chezmoi]=_chezmoi
|
||||
fi
|
||||
|
||||
chezmoi completion zsh >| "$ZSH_CACHE_DIR/completions/_chezmoi" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_chezmoi"
|
||||
zf_mv -f -- =( chezmoi completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_codex" ]]; then
|
||||
_comps[codex]=_codex
|
||||
fi
|
||||
|
||||
codex completion zsh < /dev/null 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_codex" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_codex"
|
||||
zf_mv -f -- =( codex completion zsh < /dev/null 2> /dev/null ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -99,18 +99,21 @@ $ find . -type f 2>/dev/null
|
||||
## File extension aliases
|
||||
|
||||
These are special aliases that are triggered when a file name is passed as the command. For example,
|
||||
if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf`
|
||||
that file will be open with `acroread`.
|
||||
if the pdf file extension is aliased to `open_command`, running `file.pdf` opens that file with
|
||||
whatever application your system uses for PDFs.
|
||||
|
||||
### Reading Docs
|
||||
|
||||
| Alias | Command | Description |
|
||||
| ----- | ---------- | ---------------------------------- |
|
||||
| pdf | `acroread` | Opens up a document using acroread |
|
||||
| ps | `gv` | Opens up a .ps file using gv |
|
||||
| dvi | `xdvi` | Opens up a .dvi file using xdvi |
|
||||
| chm | `xchm` | Opens up a .chm file using xchm |
|
||||
| djvu | `djview` | Opens up a .djvu file using djview |
|
||||
These use `open_command`, which picks the right opener for your platform: `open` on macOS,
|
||||
`xdg-open` on Linux, `cygstart` on Cygwin.
|
||||
|
||||
| Alias | Command | Description |
|
||||
| ----- | -------------- | ----------------------------------------------- |
|
||||
| pdf | `open_command` | Opens up a .pdf file in your default viewer |
|
||||
| ps | `open_command` | Opens up a .ps file in your default viewer |
|
||||
| dvi | `open_command` | Opens up a .dvi file in your default viewer |
|
||||
| chm | `open_command` | Opens up a .chm file in your default viewer |
|
||||
| djvu | `open_command` | Opens up a .djvu file in your default viewer |
|
||||
|
||||
### Listing files inside a packed file
|
||||
|
||||
|
||||
@@ -71,12 +71,9 @@ if is-at-least 4.2.0; then
|
||||
_media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm)
|
||||
for ft in $_media_fts; do alias -s $ft=mplayer; done
|
||||
|
||||
#read documents
|
||||
alias -s pdf=acroread
|
||||
alias -s ps=gv
|
||||
alias -s dvi=xdvi
|
||||
alias -s chm=xchm
|
||||
alias -s djvu=djview
|
||||
# read documents with the platform's default application
|
||||
_doc_fts=(pdf ps dvi chm djvu)
|
||||
for ft in $_doc_fts; do alias -s $ft=open_command; done
|
||||
|
||||
#list what's inside packed file
|
||||
alias -s zip="unzip -l"
|
||||
|
||||
@@ -25,4 +25,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_deno" ]]; then
|
||||
_comps[deno]=_deno
|
||||
fi
|
||||
|
||||
deno completions zsh >| "$ZSH_CACHE_DIR/completions/_deno" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_deno"
|
||||
zf_mv -f -- =( deno completions zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some
|
||||
aliases for frequent docker-compose commands.
|
||||
This plugin chooses automatically between the legacy `docker-compose` command and the modern
|
||||
This plugin chooses automatically between the legacy `docker-compose` command and the modern
|
||||
`docker compose` subcommand, preferring `docker-compose` when both are available.
|
||||
|
||||
To use it, add docker-compose to the plugins array of your zshrc file:
|
||||
@@ -17,6 +17,7 @@ plugins=(... docker-compose)
|
||||
|-----------|----------------------------------|----------------------------------------------------------------------------------|
|
||||
| dco | `docker-compose` | Docker-compose main command |
|
||||
| dcb | `docker-compose build` | Build containers |
|
||||
| dcc | `docker-compose config` | Parse, resolve and render compose file in canonical format |
|
||||
| dce | `docker-compose exec` | Execute command inside a container |
|
||||
| dcps | `docker-compose ps` | List containers |
|
||||
| dcrestart | `docker-compose restart` | Restart container |
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
|
||||
alias dco="$dccmd"
|
||||
alias dcb="$dccmd build"
|
||||
alias dcc="$dccmd config"
|
||||
alias dce="$dccmd exec"
|
||||
alias dcps="$dccmd ps"
|
||||
alias dcrestart="$dccmd restart"
|
||||
|
||||
@@ -56,14 +56,19 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then
|
||||
_comps[docker]=_docker
|
||||
fi
|
||||
|
||||
{
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
|
||||
local plugin_dir="$1"
|
||||
|
||||
# `docker completion` is only available from 23.0.0 on
|
||||
# docker version returns `Docker version 24.0.2, build cb74dfcd85`
|
||||
# with `s:,:` remove the comma after the version, and select third word of it
|
||||
if zstyle -t ':omz:plugins:docker' legacy-completion || \
|
||||
! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then
|
||||
command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
|
||||
command cp "${plugin_dir}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
|
||||
else
|
||||
command docker completion zsh | tee "$ZSH_CACHE_DIR/completions/_docker" > /dev/null
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_docker"
|
||||
zf_mv -f -- =( command docker completion zsh ) "$TMPPREFIX"
|
||||
fi
|
||||
} &|
|
||||
} "${0:A:h}" &|
|
||||
|
||||
@@ -14,4 +14,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then
|
||||
_comps[doctl]=_doctl
|
||||
fi
|
||||
|
||||
doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_doctl"
|
||||
zf_mv -f -- =( doctl completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -1,14 +1,33 @@
|
||||
#!/bin/sh
|
||||
|
||||
emacsfun() {
|
||||
local cmd frames
|
||||
local cmd frames arg tty
|
||||
|
||||
# Build the Emacs Lisp command to check for suitable frames
|
||||
# See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep
|
||||
case "$*" in
|
||||
*-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames
|
||||
*) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns)
|
||||
esac
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
-t|--tty|-nw) tty=1; break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ -n "$tty" ]; then
|
||||
cmd="(memq 't (mapcar 'framep (frame-list)))" # if != nil, there are tty frames
|
||||
else
|
||||
cmd="(delete 't (mapcar 'framep (frame-list)))" # if != nil, there are graphical terminals (x, w32, ns)
|
||||
fi
|
||||
|
||||
# A tty frame needs the client to stay attached, so drop the --no-wait the
|
||||
# `emacs` alias adds. Otherwise emacsclient returns at once and nothing opens.
|
||||
if [ -n "$tty" ]; then
|
||||
for arg do
|
||||
shift
|
||||
case "$arg" in
|
||||
--no-wait) continue ;;
|
||||
esac
|
||||
set -- "$@" "$arg"
|
||||
done
|
||||
fi
|
||||
|
||||
# Check if there are suitable frames
|
||||
frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )"
|
||||
|
||||
@@ -52,8 +52,13 @@ function _configure_eza() {
|
||||
if [[ $_val ]]; then
|
||||
_EZA_TAIL+=("--time-style='$_val'")
|
||||
fi
|
||||
if zstyle -t ":omz:plugins:eza" "hyperlink"; then
|
||||
_EZA_TAIL+=("--hyperlink")
|
||||
if zstyle -t ':omz:plugins:eza' 'hyperlink'; then
|
||||
# eza >= 0.23 needs an explicit WHEN value
|
||||
if command eza --hyperlink=auto --version &>/dev/null; then
|
||||
_EZA_TAIL+=("--hyperlink=auto")
|
||||
else
|
||||
_EZA_TAIL+=("--hyperlink")
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -30,4 +30,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_flutter" ]]; then
|
||||
_comps[flutter]=_flutter
|
||||
fi
|
||||
|
||||
flutter zsh-completion < /dev/null >| "$ZSH_CACHE_DIR/completions/_flutter" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_flutter"
|
||||
zf_mv -f -- =( flutter zsh-completion < /dev/null ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_flux" ]]; then
|
||||
_comps[flux]=_flux
|
||||
fi
|
||||
|
||||
flux completion zsh >| "$ZSH_CACHE_DIR/completions/_flux" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_flux"
|
||||
zf_mv -f -- =( flux completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -10,7 +10,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_fnm" ]]; then
|
||||
_comps[fnm]=_fnm
|
||||
fi
|
||||
|
||||
fnm completions --shell=zsh >| "$ZSH_CACHE_DIR/completions/_fnm" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_fnm"
|
||||
zf_mv -f -- =( fnm completions --shell=zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
if zstyle -t ':omz:plugins:fnm' autostart; then
|
||||
local -a fnm_env_cmd
|
||||
|
||||
@@ -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"
|
||||
} &|
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_gh" ]]; then
|
||||
_comps[gh]=_gh
|
||||
fi
|
||||
|
||||
gh completion --shell zsh >| "$ZSH_CACHE_DIR/completions/_gh" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_gh"
|
||||
zf_mv -f -- =( gh completion --shell zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -103,6 +103,7 @@ plugins=(... git)
|
||||
| `glods` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short` |
|
||||
| `glol` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
|
||||
| `glola` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all` |
|
||||
| `glolm` | `git log $(git_main_branch) --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
|
||||
| `glols` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat` |
|
||||
| `glo` | `git log --oneline --decorate` |
|
||||
| `glog` | `git log --oneline --decorate --graph` |
|
||||
@@ -254,6 +255,7 @@ receive further support.
|
||||
| `git_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) |
|
||||
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
|
||||
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise |
|
||||
| `gbcopy` | Copies current branch name to clipboard |
|
||||
| `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote |
|
||||
| `gbda` | Deletes all merged branches |
|
||||
| `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) |
|
||||
|
||||
@@ -49,6 +49,16 @@ function git_main_branch() {
|
||||
return 1
|
||||
}
|
||||
|
||||
function gbcopy() {
|
||||
command git rev-parse --git-dir &>/dev/null || return
|
||||
|
||||
local branch
|
||||
branch="$(git_current_branch)" || return
|
||||
[[ -n "$branch" ]] || return 1
|
||||
|
||||
print -rn -- "$branch" | clipcopy
|
||||
}
|
||||
|
||||
function grename() {
|
||||
if [[ -z "$1" || -z "$2" ]]; then
|
||||
echo "Usage: $0 old_branch new_branch"
|
||||
@@ -137,8 +147,9 @@ function gbda() {
|
||||
# Copied and modified from James Roeder (jmaroeder) under MIT License
|
||||
# https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish
|
||||
function gbds() {
|
||||
local default_branch=$(git_main_branch)
|
||||
(( ! $? )) || default_branch=$(git_develop_branch)
|
||||
local default_branch
|
||||
default_branch=$(git_main_branch) \
|
||||
|| default_branch=$(git_develop_branch)
|
||||
|
||||
git for-each-ref refs/heads/ "--format=%(refname:short)" | \
|
||||
while read branch; do
|
||||
@@ -238,6 +249,7 @@ alias glod='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgre
|
||||
alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all'
|
||||
alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat'
|
||||
alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
|
||||
alias glolm='git log $(git_main_branch) --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
|
||||
alias glo='git log --oneline --decorate'
|
||||
alias glog='git log --oneline --decorate --graph'
|
||||
alias gloga='git log --oneline --decorate --graph --all'
|
||||
|
||||
@@ -39,3 +39,18 @@ plugins=(... golang)
|
||||
| gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
|
||||
| gove | `go version` | Prints Go version |
|
||||
| gow | `go work` | Work provides access to operations on workspaces |
|
||||
|
||||
## Prompt
|
||||
|
||||
This plugin provides the `go_prompt_info` function to add the installed Go
|
||||
version to your prompt.
|
||||
|
||||
For example:
|
||||
```
|
||||
PROMPT="%~$ "
|
||||
RPROMPT='$(go_prompt_info)'
|
||||
```
|
||||
changes your prompt to:
|
||||
```
|
||||
~/go/project$ ▋ 1.22.3
|
||||
```
|
||||
|
||||
+95
-11
@@ -81,6 +81,7 @@ _go() {
|
||||
'tool[run specified go tool]'
|
||||
'version[print Go version]'
|
||||
'vet[run go tool vet on packages]'
|
||||
'work[workspace maintenance]'
|
||||
)
|
||||
if (( CURRENT == 2 )); then
|
||||
# explain go commands
|
||||
@@ -88,19 +89,38 @@ _go() {
|
||||
return
|
||||
fi
|
||||
build_flags=(
|
||||
'-a[force reinstallation of packages that are already up to date]'
|
||||
'-C[change to dir before running the command]:directory:_path_files -/'
|
||||
'-a[force rebuilding of packages that are already up-to-date]'
|
||||
'-n[print the commands but do not run them]'
|
||||
'-p[number of parallel builds]:number'
|
||||
'-race[enable data race detection]'
|
||||
'-x[print the commands]'
|
||||
'-msan[enable interoperation with memory sanitizer]'
|
||||
'-asan[enable interoperation with address sanitizer]'
|
||||
'-cover[enable code coverage instrumentation]'
|
||||
'-covermode[set the mode for coverage analysis]:mode:(set count atomic)'
|
||||
'-coverpkg[apply coverage analysis to matching packages]:pattern'
|
||||
'-v[print the names of packages as they are compiled]'
|
||||
'-work[print temporary directory name and keep it]'
|
||||
'-ccflags[flags for 5c/6c/8c]:flags'
|
||||
'-gcflags[flags for 5g/6g/8g]:flags'
|
||||
'-ldflags[flags for 5l/6l/8l]:flags'
|
||||
'-gccgoflags[flags for gccgo]:flags'
|
||||
'-compiler[name of compiler to use]:name'
|
||||
'-installsuffix[suffix to add to package directory]:suffix'
|
||||
'-x[print the commands]'
|
||||
'-asmflags[arguments to pass on each go tool asm invocation]:flags'
|
||||
'-buildmode[build mode to use]:mode:(archive c-archive c-shared default shared exe pie plugin)'
|
||||
'-buildvcs[stamp binaries with version control information]:mode:(true false auto)'
|
||||
'-compiler[name of compiler to use]:name:(gccgo gc)'
|
||||
'-gccgoflags[arguments to pass on each gccgo compiler/linker invocation]:flags'
|
||||
'-gcflags[arguments to pass on each go tool compile invocation]:flags'
|
||||
'-installsuffix[suffix to use in the package installation directory]:suffix'
|
||||
'-json[emit build output in JSON suitable for automated processing]'
|
||||
'-ldflags[arguments to pass on each go tool link invocation]:flags'
|
||||
'-linkshared[build code that will be linked against shared libraries]'
|
||||
'-mod[module download mode to use]:mode:(readonly vendor mod)'
|
||||
'-modcacherw[leave newly-created directories in the module cache read-write]'
|
||||
'-modfile[read and write an alternate go.mod file]:file:_files -g "*.mod"'
|
||||
'-overlay[read a JSON config file that provides an overlay for build operations]:file:_files -g "*.json"'
|
||||
'-pgo[specify the file path of a profile for profile-guided optimization]:file:_files'
|
||||
'-pkgdir[install and load all packages from dir]:directory:_path_files -/'
|
||||
'-tags[list of build tags to consider satisfied]:tags'
|
||||
'-trimpath[remove all file system paths from the resulting executable]'
|
||||
'-toolexec[program to use to invoke toolchain programs]:command'
|
||||
)
|
||||
|
||||
case ${words[2]} in
|
||||
@@ -125,17 +145,20 @@ _go() {
|
||||
;;
|
||||
install)
|
||||
_arguments -s -w : ${build_flags[@]} \
|
||||
"-v[show package names]" \
|
||||
'*:importpaths:__go_packages'
|
||||
;;
|
||||
get)
|
||||
_arguments -s -w : \
|
||||
${build_flags[@]}
|
||||
${build_flags[@]} \
|
||||
"-t[consider modules needed to build tests of packages]" \
|
||||
"-u[update modules providing dependencies to newer minor or patch releases]" \
|
||||
"-u=[update modules providing dependencies to patch releases]:mode:(patch)" \
|
||||
"-tool[add a matching tool line to go.mod for each listed package]" \
|
||||
"*:importpaths:__go_packages"
|
||||
;;
|
||||
build)
|
||||
_arguments -s -w : \
|
||||
${build_flags[@]} \
|
||||
"-v[show package names]" \
|
||||
"-o[output file]:file:_files" \
|
||||
"*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
|
||||
;;
|
||||
@@ -238,6 +261,60 @@ _go() {
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
work)
|
||||
local -a work_commands
|
||||
work_commands+=(
|
||||
'edit[edit go.work from tools or scripts]'
|
||||
'init[initialize workspace file]'
|
||||
'sync[sync workspace build list to modules]'
|
||||
'use[add modules to workspace file]'
|
||||
'vendor[make vendored copy of dependencies]'
|
||||
)
|
||||
|
||||
if (( CURRENT == 3 )); then
|
||||
_values 'go work commands' ${work_commands[@]} "help[display help]"
|
||||
return
|
||||
fi
|
||||
|
||||
case ${words[3]} in
|
||||
help)
|
||||
_values 'go work commands' ${work_commands[@]}
|
||||
;;
|
||||
edit)
|
||||
_arguments -s -w : \
|
||||
"-fmt[reformat the go.work file]" \
|
||||
"-godebug[=key=value add a godebug key=value line]:key=value" \
|
||||
"-dropgodebug[=key drop an existing godebug line]:key" \
|
||||
"-use[=path add a use directive]:directory:_path_files -/" \
|
||||
"-dropuse[=path drop a use directive]:directory:_path_files -/" \
|
||||
"-replace[=old{@v}=new{@v} add a replacement of the given module path and version pair]:name" \
|
||||
"-dropreplace[=old{@v} drop a replacement of the given module path and version pair]:name" \
|
||||
"-go[={version} set the expected Go language version]:number" \
|
||||
"-toolchain[=name set the Go toolchain to use]:name" \
|
||||
"-print[print the final go.work in its text format]" \
|
||||
"-json[print the final go.work file in JSON format]" \
|
||||
"1:go.work file:_files -g 'go.work'"
|
||||
;;
|
||||
init)
|
||||
_arguments -s -w : \
|
||||
"*:module directories:_path_files -/"
|
||||
;;
|
||||
sync)
|
||||
;;
|
||||
use)
|
||||
_arguments -s -w : \
|
||||
"-r[search recursively for modules in the argument directories]" \
|
||||
"*:module directories:_path_files -/"
|
||||
;;
|
||||
vendor)
|
||||
_arguments -s -w : \
|
||||
"-e[attempt to proceed despite errors encountered while loading packages]" \
|
||||
"-v[print the names of vendored modules and packages]" \
|
||||
"-o[create the vendor directory at the given path]:output directory:_path_files -/" \
|
||||
"*:flags"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
help)
|
||||
_values "${commands[@]}" \
|
||||
'environment[show Go environment variables available]' \
|
||||
@@ -247,6 +324,13 @@ _go() {
|
||||
'testflag[description of testing flags]' \
|
||||
'testfunc[description of testing functions]'
|
||||
;;
|
||||
version)
|
||||
_arguments -s -w : \
|
||||
"-m[print module version information]" \
|
||||
"-v[report unrecognized files]" \
|
||||
"-json[print module version information in JSON format]" \
|
||||
"*:file:_files"
|
||||
;;
|
||||
run)
|
||||
_arguments -s -w : \
|
||||
${build_flags[@]} \
|
||||
|
||||
@@ -36,3 +36,12 @@ alias gotofx='go tool fix'
|
||||
alias gov='go vet'
|
||||
alias gove='go version'
|
||||
alias gow='go work'
|
||||
|
||||
## prompt
|
||||
function go_prompt_info() {
|
||||
(( $+commands[go] )) || return
|
||||
local go_prompt
|
||||
go_prompt=$(go version | awk '{ print substr($3, 3) }')
|
||||
[[ -z "${go_prompt}" ]] && return
|
||||
echo "${ZSH_THEME_GO_PROMPT_PREFIX}${go_prompt:gs/%/%%}${ZSH_THEME_GO_PROMPT_SUFFIX}"
|
||||
}
|
||||
|
||||
+10
-4
@@ -284,6 +284,9 @@ __gradle_subcommand() {
|
||||
'-Dorg.gradle.debug.suspend=[]' \
|
||||
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \
|
||||
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \
|
||||
'-Dorg.gradle.isolated-projects.dangerously-ignore-problems=[]' \
|
||||
'-Dorg.gradle.isolated-projects.diagnostics=[]' \
|
||||
'-Dorg.gradle.isolated-projects=[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`.]' \
|
||||
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \
|
||||
'-Dorg.gradle.java.installations.auto-detect=[]' \
|
||||
'-Dorg.gradle.java.installations.auto-download=[]' \
|
||||
@@ -299,8 +302,6 @@ __gradle_subcommand() {
|
||||
'-Dorg.gradle.problems.report=[Enables the HTML problems report.]' \
|
||||
'-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \
|
||||
'-Dorg.gradle.tooling.parallel=[]' \
|
||||
'-Dorg.gradle.unsafe.isolated-projects.diagnostics=[]' \
|
||||
'-Dorg.gradle.unsafe.isolated-projects=[]' \
|
||||
'-Dorg.gradle.vfs.verbose=[]' \
|
||||
'-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false)' \
|
||||
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]' \
|
||||
@@ -328,12 +329,14 @@ __gradle_subcommand() {
|
||||
\*'--include-build[Includes the specified build in the composite.]:include build:_directories' \
|
||||
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \
|
||||
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts)' \
|
||||
(--no-isolated-projects)'--isolated-projects[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`. (incubating)]' \
|
||||
'--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]' \
|
||||
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
|
||||
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
|
||||
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
|
||||
(--continue)'--no-continue[Stops task execution after a task failure.]' \
|
||||
(--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
|
||||
(--isolated-projects)'--no-isolated-projects[Disables Isolated Projects. (incubating)]' \
|
||||
(--parallel)'--no-parallel[Disables parallel project execution.]' \
|
||||
(--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \
|
||||
{-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \
|
||||
@@ -421,6 +424,9 @@ _gradle() {
|
||||
'-Dorg.gradle.debug.suspend=[]:->argument-expected' \
|
||||
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false):->argument-expected' \
|
||||
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off):->argument-expected' \
|
||||
'-Dorg.gradle.isolated-projects.dangerously-ignore-problems=[]:->argument-expected' \
|
||||
'-Dorg.gradle.isolated-projects.diagnostics=[]:->argument-expected' \
|
||||
'-Dorg.gradle.isolated-projects=[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`.]:->argument-expected' \
|
||||
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories:->argument-expected' \
|
||||
'-Dorg.gradle.java.installations.auto-detect=[]:->argument-expected' \
|
||||
'-Dorg.gradle.java.installations.auto-download=[]:->argument-expected' \
|
||||
@@ -436,8 +442,6 @@ _gradle() {
|
||||
'-Dorg.gradle.problems.report=[Enables the HTML problems report.]:->argument-expected' \
|
||||
'-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories:->argument-expected' \
|
||||
'-Dorg.gradle.tooling.parallel=[]:->argument-expected' \
|
||||
'-Dorg.gradle.unsafe.isolated-projects.diagnostics=[]:->argument-expected' \
|
||||
'-Dorg.gradle.unsafe.isolated-projects=[]:->argument-expected' \
|
||||
'-Dorg.gradle.vfs.verbose=[]:->argument-expected' \
|
||||
'-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false):->argument-expected' \
|
||||
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]:->argument-expected' \
|
||||
@@ -466,12 +470,14 @@ _gradle() {
|
||||
\*'--include-build[Includes the specified build in the composite.]:include build:_directories:->argument-expected' \
|
||||
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \
|
||||
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts):->argument-expected' \
|
||||
(--no-isolated-projects)'--isolated-projects[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`. (incubating)]' \
|
||||
'--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
|
||||
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
|
||||
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
|
||||
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
|
||||
(--continue)'--no-continue[Stops task execution after a task failure.]' \
|
||||
(--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
|
||||
(--isolated-projects)'--no-isolated-projects[Disables Isolated Projects. (incubating)]' \
|
||||
(--parallel)'--no-parallel[Disables parallel project execution.]' \
|
||||
(--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \
|
||||
{-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \
|
||||
|
||||
@@ -9,5 +9,9 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_hasura" ]]; then
|
||||
source "$ZSH_CACHE_DIR/completions/_hasura"
|
||||
else
|
||||
source "$ZSH_CACHE_DIR/completions/_hasura"
|
||||
hasura completion zsh --file "$ZSH_CACHE_DIR/completions/_hasura" >/dev/null &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_hasura"
|
||||
zf_mv -f -- =( hasura completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
fi
|
||||
|
||||
@@ -13,7 +13,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_hcloud" ]]; then
|
||||
_comps[hcloud]=_hcloud
|
||||
fi
|
||||
|
||||
hcloud completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_hcloud" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_hcloud"
|
||||
zf_mv -f -- =( hcloud completion zsh 2> /dev/null ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# Main alias
|
||||
alias hc='hcloud'
|
||||
|
||||
@@ -9,7 +9,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_helm" ]]; then
|
||||
source "$ZSH_CACHE_DIR/completions/_helm"
|
||||
else
|
||||
source "$ZSH_CACHE_DIR/completions/_helm"
|
||||
helm completion zsh | tee "$ZSH_CACHE_DIR/completions/_helm" >/dev/null &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_helm"
|
||||
zf_mv -f -- =( helm completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
fi
|
||||
|
||||
alias h='helm'
|
||||
|
||||
@@ -0,0 +1,163 @@
|
||||
# herdr plugin
|
||||
|
||||
This plugin adds completion, aliases, an interactive session picker and a prompt
|
||||
function for [herdr](https://herdr.dev), the runtime your
|
||||
coding agents live on. herdr keeps agent terminals running in the background across
|
||||
projects and machines, so you can close your terminal, reconnect later, and pick up
|
||||
where the agents left off.
|
||||
|
||||
To use it, add `herdr` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... herdr)
|
||||
```
|
||||
|
||||
Install herdr first if you have not already:
|
||||
|
||||
```sh
|
||||
curl -fsSL https://herdr.dev/install.sh | sh # or: brew install herdr
|
||||
```
|
||||
|
||||
## Learning herdr from the terminal
|
||||
|
||||
The fastest way to explore herdr is tab completion. Every command group and flag shows a
|
||||
short description, so you can discover what is available without leaving the shell:
|
||||
|
||||
```
|
||||
$ herdr <TAB>
|
||||
agent -- Control and inspect agent panes
|
||||
session -- Manage named persistent sessions
|
||||
workspace -- Manage workspaces over the socket API
|
||||
worktree -- Manage Git worktree-backed workspaces
|
||||
...
|
||||
$ herdr agent <TAB>
|
||||
list -- List agents
|
||||
prompt -- Submit a prompt to an agent
|
||||
start -- Start a supported interactive agent in an existing pane
|
||||
wait -- Wait until an agent reaches one of the requested states
|
||||
...
|
||||
```
|
||||
|
||||
A few other ways to learn as you go:
|
||||
|
||||
- `herdr <group>` with no subcommand prints that group's help, for example `herdr pane`.
|
||||
- `herdr --skill` prints the instructions herdr gives to agents that drive it. It is a
|
||||
good tour of the full command surface.
|
||||
- Most control commands return JSON, so you can pipe them into `jq` in scripts.
|
||||
|
||||
## Common workflows
|
||||
|
||||
### Start and reconnect
|
||||
|
||||
```sh
|
||||
herdr # launch, or attach to the default session
|
||||
herdr --session work # use or create a named session
|
||||
herdr session list # see running and stopped sessions
|
||||
herdr session attach work # reconnect to a named session
|
||||
herdr status # check the local client and running server
|
||||
herdr update # install the latest release
|
||||
```
|
||||
|
||||
### Organize work into workspaces and tabs
|
||||
|
||||
```sh
|
||||
herdr workspace list
|
||||
herdr workspace create --cwd ~/projects/app
|
||||
herdr tab create
|
||||
herdr pane split --direction right
|
||||
herdr worktree create --branch feature/login # open a Git worktree in its own workspace
|
||||
```
|
||||
|
||||
### Run and watch agents
|
||||
|
||||
```sh
|
||||
herdr agent list # what is running, and is it idle, working or blocked
|
||||
herdr agent start reviewer --kind claude --pane w1:p2
|
||||
herdr agent prompt reviewer "review the last commit" --wait
|
||||
herdr agent read reviewer # read the agent's terminal output
|
||||
herdr agent wait reviewer --until idle
|
||||
herdr agent attach reviewer # jump straight into that terminal
|
||||
```
|
||||
|
||||
### Work across machines
|
||||
|
||||
```sh
|
||||
herdr --remote user@build-box # attach through SSH with your local keybindings
|
||||
```
|
||||
|
||||
### Keep the server healthy
|
||||
|
||||
```sh
|
||||
herdr config check # validate config.toml
|
||||
herdr server reload-config # apply config changes without restarting panes
|
||||
herdr server stop
|
||||
herdr channel set preview # switch between stable and preview releases
|
||||
herdr integration status # which agent CLIs have herdr hooks installed
|
||||
```
|
||||
|
||||
See the [CLI reference](https://herdr.dev/docs/cli-reference/) for every command and flag.
|
||||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command |
|
||||
| ------- | ----------------------------- |
|
||||
| `hrdr` | `herdr` |
|
||||
| `hrdrst` | `herdr status` |
|
||||
| `hrdrup` | `herdr update` |
|
||||
| `hrdrsl` | `herdr session list` |
|
||||
| `hrdrsa` | `herdr session attach` |
|
||||
| `hrdrr` | `herdr --remote` |
|
||||
| `hrdral` | `herdr agent list` |
|
||||
| `hrdrwl` | `herdr workspace list` |
|
||||
| `hrdrwc` | `herdr workspace create` |
|
||||
| `hrdrwt` | `herdr worktree create` |
|
||||
| `hrdrps` | `herdr pane split` |
|
||||
| `hrdrrc` | `herdr server reload-config` |
|
||||
|
||||
Tab completion works through the aliases too, so `hrdr agent <TAB>` completes the same
|
||||
way `herdr agent <TAB>` does.
|
||||
|
||||
## Session picker
|
||||
|
||||
`hrdrs` lists your herdr sessions and attaches to the one you pick. It uses
|
||||
[fzf](https://github.com/junegunn/fzf) when it is installed and falls back to a numbered
|
||||
menu otherwise, so it works everywhere.
|
||||
|
||||
```
|
||||
$ hrdrs
|
||||
name status directory
|
||||
1) default running /Users/me/.config/herdr
|
||||
2) work stopped /Users/me/projects/app
|
||||
Attach to session: 2
|
||||
```
|
||||
|
||||
## Prompt
|
||||
|
||||
This plugin provides the `herdr_prompt_info` function to show the current pane ID in
|
||||
your prompt when the shell is running inside herdr. It reads environment variables only,
|
||||
so it adds no cost to prompt rendering.
|
||||
|
||||
For example:
|
||||
```
|
||||
PROMPT="%~$ "
|
||||
RPROMPT='$(herdr_prompt_info)'
|
||||
```
|
||||
changes your prompt inside a herdr pane to:
|
||||
```
|
||||
~/projects/app$ ▋ w1:p4
|
||||
```
|
||||
and shows nothing outside herdr.
|
||||
|
||||
Wrap it with `ZSH_THEME_HERDR_PROMPT_PREFIX` and `ZSH_THEME_HERDR_PROMPT_SUFFIX`, for
|
||||
example:
|
||||
```
|
||||
ZSH_THEME_HERDR_PROMPT_PREFIX="%{$fg[cyan]%}[herdr "
|
||||
ZSH_THEME_HERDR_PROMPT_SUFFIX="]%{$reset_color%}"
|
||||
```
|
||||
|
||||
## 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/_herdr`.
|
||||
@@ -0,0 +1,68 @@
|
||||
# Aliases, helpers and completion for herdr (https://herdr.dev), the runtime for coding agents.
|
||||
|
||||
# PROMPT
|
||||
# Defined before the herdr check so themes can reference it on machines without herdr.
|
||||
function herdr_prompt_info {
|
||||
[[ "$HERDR_ENV" == 1 ]] || return
|
||||
echo "${ZSH_THEME_HERDR_PROMPT_PREFIX}${HERDR_PANE_ID:gs/%/%%}${ZSH_THEME_HERDR_PROMPT_SUFFIX}"
|
||||
}
|
||||
|
||||
if (( ! $+commands[herdr] )); then
|
||||
return
|
||||
fi
|
||||
|
||||
# ALIASES
|
||||
alias hrdr='herdr'
|
||||
alias hrdrst='herdr status'
|
||||
alias hrdrup='herdr update'
|
||||
alias hrdrsl='herdr session list'
|
||||
alias hrdrsa='herdr session attach'
|
||||
alias hrdrr='herdr --remote'
|
||||
alias hrdral='herdr agent list'
|
||||
alias hrdrwl='herdr workspace list'
|
||||
alias hrdrwc='herdr workspace create'
|
||||
alias hrdrwt='herdr worktree create'
|
||||
alias hrdrps='herdr pane split'
|
||||
alias hrdrrc='herdr server reload-config'
|
||||
|
||||
# FUNCTIONS
|
||||
# Pick a session and attach to it, with fzf if available or a numbered menu otherwise.
|
||||
function hrdrs {
|
||||
setopt localoptions extendedglob
|
||||
local -a lines
|
||||
lines=("${(@f)$(herdr session list 2>/dev/null)}")
|
||||
lines=("${(@)lines%%[[:space:]]#[^[:space:]]#}") # drop the socket column
|
||||
if (( $#lines < 2 )); then
|
||||
print "hrdrs: no herdr sessions found" >&2
|
||||
return 1
|
||||
fi
|
||||
|
||||
local choice
|
||||
if (( $+commands[fzf] )); then
|
||||
choice=$(print -l -- "${lines[@]}" | fzf --header-lines=1 --prompt='herdr session> ') || return
|
||||
else
|
||||
print -- "${lines[1]}"
|
||||
local PS3="Attach to session: "
|
||||
select choice in "${lines[@]:1}"; do
|
||||
[[ -n "$choice" ]] && break
|
||||
done
|
||||
fi
|
||||
[[ -n "$choice" ]] || return 1
|
||||
|
||||
herdr session attach "${${(z)choice}[1]}"
|
||||
}
|
||||
|
||||
# COMPLETION
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `herdr`. Otherwise, compinit will have already done that.
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_herdr" ]]; then
|
||||
typeset -g -A _comps
|
||||
autoload -Uz _herdr
|
||||
_comps[herdr]=_herdr
|
||||
fi
|
||||
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_herdr"
|
||||
zf_mv -f -- =( herdr completion zsh < /dev/null 2> /dev/null ) "$TMPPREFIX"
|
||||
} &|
|
||||
+24
-5
@@ -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()"` |
|
||||
| jjrbm | `jj rebase -o "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
|
||||
|
||||
@@ -101,10 +120,10 @@ that.
|
||||
|
||||
### Git async-prompt compatibility
|
||||
|
||||
If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with
|
||||
the default git async-prompt mode. This is because async-prompt only registers its background worker
|
||||
when it detects `$(git_prompt_info)` literally in your prompt variables. A wrapper like
|
||||
`$(_my_theme_vcs_info)` won't match, so the async output stays empty.
|
||||
If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with the default
|
||||
git async-prompt mode. This is because async-prompt only registers its background worker when it detects
|
||||
`$(git_prompt_info)` literally in your prompt variables. A wrapper like `$(_my_theme_vcs_info)` won't match,
|
||||
so the async output stays empty.
|
||||
|
||||
To fix this, add one of the following to your `.zshrc` **before** Oh My Zsh is sourced:
|
||||
|
||||
|
||||
@@ -11,7 +11,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_jj" ]]; then
|
||||
_comps[jj]=_jj
|
||||
fi
|
||||
|
||||
COMPLETE=zsh jj >| "$ZSH_CACHE_DIR/completions/_jj" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_jj"
|
||||
zf_mv -f -- =( COMPLETE=zsh jj ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
function __jj_prompt_jj() {
|
||||
local -a flags
|
||||
@@ -41,35 +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 jjrbm='jj rebase -o "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'
|
||||
|
||||
@@ -35,6 +35,7 @@ alias jdlr='juju debug-log --ms --replay'
|
||||
alias jcon='juju consume'
|
||||
alias jeb='juju export-bundle'
|
||||
alias jex='juju expose'
|
||||
alias junex='juju unexpose'
|
||||
alias jh='juju help'
|
||||
alias jkc='juju kill-controller -y -t 0'
|
||||
alias jm='juju models'
|
||||
|
||||
@@ -11,4 +11,8 @@ fi
|
||||
|
||||
# and then generate it in the background. On first completion,
|
||||
# the actual completion file will be loaded.
|
||||
k9s completion zsh >| "$ZSH_CACHE_DIR/completions/_k9s" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_k9s"
|
||||
zf_mv -f -- =( k9s completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,7 +11,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_kind" ]]; then
|
||||
fi
|
||||
|
||||
# Generate and load kind completion
|
||||
kind completion zsh >! "$ZSH_CACHE_DIR/completions/_kind" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_kind"
|
||||
zf_mv -f -- =( kind completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# Register aliases
|
||||
alias kicc="kind create cluster"
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Kubernetes prompt helper for bash/zsh
|
||||
# Kubernetes prompt info for bash, fish, and zsh
|
||||
# Displays current context and namespace
|
||||
|
||||
# Copyright 2026 Jon Mosco
|
||||
@@ -121,7 +121,7 @@ _kube_ps1_color_fg() {
|
||||
if [[ "${_KUBE_PS1_TPUT_AVAILABLE}" == "true" ]]; then
|
||||
_KUBE_PS1_FG_CODE="$(tput setaf "${_KUBE_PS1_FG_CODE}")"
|
||||
elif [[ $_KUBE_PS1_FG_CODE -ge 0 ]] && [[ $_KUBE_PS1_FG_CODE -le 255 ]]; then
|
||||
_KUBE_PS1_FG_CODE="\033[38;5;${_KUBE_PS1_FG_CODE}m"
|
||||
_KUBE_PS1_FG_CODE=$'\033'"[38;5;${_KUBE_PS1_FG_CODE}m"
|
||||
else
|
||||
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||
fi
|
||||
@@ -154,7 +154,7 @@ _kube_ps1_color_bg() {
|
||||
if [[ "${_KUBE_PS1_TPUT_AVAILABLE}" == "true" ]]; then
|
||||
_KUBE_PS1_BG_CODE="$(tput setab "${_KUBE_PS1_BG_CODE}")"
|
||||
elif [[ $_KUBE_PS1_BG_CODE -ge 0 ]] && [[ $_KUBE_PS1_BG_CODE -le 255 ]]; then
|
||||
_KUBE_PS1_BG_CODE="\033[48;5;${_KUBE_PS1_BG_CODE}m"
|
||||
_KUBE_PS1_BG_CODE=$'\033'"[48;5;${_KUBE_PS1_BG_CODE}m"
|
||||
else
|
||||
_KUBE_PS1_BG_CODE="${_KUBE_PS1_DEFAULT_BG}"
|
||||
fi
|
||||
@@ -412,6 +412,8 @@ kube_ps1() {
|
||||
|
||||
local KUBE_PS1
|
||||
local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}"
|
||||
local ctx_color="${KUBE_PS1_CTX_COLOR-red}"
|
||||
local ns_color="${KUBE_PS1_NS_COLOR-cyan}"
|
||||
|
||||
# Background Color
|
||||
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")"
|
||||
@@ -432,22 +434,29 @@ kube_ps1() {
|
||||
|
||||
# Context
|
||||
if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||
local ctx_color="${KUBE_PS1_CTX_COLOR:-red}"
|
||||
|
||||
# Allow custom function to override color based on context
|
||||
if [[ -n "${KUBE_PS1_CTX_COLOR_FUNCTION}" ]]; then
|
||||
ctx_color="$("${KUBE_PS1_CTX_COLOR_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
|
||||
fi
|
||||
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
|
||||
if [[ -n "${ctx_color}" ]]; then
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
|
||||
else
|
||||
KUBE_PS1+="${KUBE_PS1_CONTEXT}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Namespace
|
||||
if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then
|
||||
if [[ -n "${KUBE_PS1_DIVIDER}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||
if [[ -n "${KUBE_PS1_DIVIDER}" && "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||
KUBE_PS1+="${KUBE_PS1_DIVIDER}"
|
||||
fi
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_NS_COLOR:-cyan}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
|
||||
|
||||
if [[ -n "${ns_color}" ]]; then
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${ns_color}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
|
||||
else
|
||||
KUBE_PS1+="${KUBE_PS1_NAMESPACE}"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Suffix
|
||||
@@ -460,5 +469,5 @@ kube_ps1() {
|
||||
# Close Background color if defined
|
||||
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_BG}${_KUBE_PS1_CLOSE_ESC}"
|
||||
|
||||
echo "${KUBE_PS1}"
|
||||
printf '%s' "${KUBE_PS1}"
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ plugins=(... kubectl)
|
||||
| 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 |
|
||||
| kcrc | `kubectl config rename-context` | Rename a context from the kubeconfig file |
|
||||
| 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 |
|
||||
@@ -71,6 +72,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** |
|
||||
@@ -129,7 +131,7 @@ plugins=(... kubectl)
|
||||
| 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 |
|
||||
| krsss | `kubectl rollout status statefulset` | Check the rollout status of a statefulset |
|
||||
| krrss | `kubectl rollout restart statefulset` | Rollout restart a statefulset |
|
||||
| | | **Service Accounts management** |
|
||||
| kdsa | `kubectl describe sa` | Describe a service account in details |
|
||||
|
||||
@@ -10,7 +10,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then
|
||||
_comps[kubectl]=_kubectl
|
||||
fi
|
||||
|
||||
kubectl completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_kubectl" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_kubectl"
|
||||
zf_mv -f -- =( kubectl completion zsh 2> /dev/null ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# This command is used a LOT both below and in daily life
|
||||
alias k=kubectl
|
||||
@@ -32,6 +36,7 @@ alias kcuc='kubectl config use-context'
|
||||
alias kcsc='kubectl config set-context'
|
||||
alias kcdc='kubectl config delete-context'
|
||||
alias kccc='kubectl config current-context'
|
||||
alias kcrc='kubectl config rename-context'
|
||||
|
||||
# List all contexts
|
||||
alias kcgc='kubectl config get-contexts'
|
||||
@@ -89,6 +94,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'
|
||||
|
||||
|
||||
@@ -22,6 +22,21 @@ RPS1='$(kubectx_prompt_info)'
|
||||
PROMPT="$PROMPT"'$(kubectx_prompt_info)'
|
||||
```
|
||||
|
||||
The context is loaded asynchronously on supported versions of zsh so that
|
||||
`kubectl` does not block the prompt. To restore synchronous behavior, add this
|
||||
before Oh My Zsh is sourced:
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:alpha:plugins:kubectx' async-prompt no
|
||||
```
|
||||
|
||||
If your theme calls `kubectx_prompt_info` indirectly through another function,
|
||||
force registration of the async handler instead:
|
||||
|
||||
```zsh
|
||||
zstyle ':omz:alpha:plugins:kubectx' async-prompt force
|
||||
```
|
||||
|
||||
### Custom context names
|
||||
|
||||
You can rename the default context name for better readability or additional formatting.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
typeset -g -A kubectx_mapping
|
||||
|
||||
function kubectx_prompt_info() {
|
||||
function _omz_kubectx_prompt_info() {
|
||||
(( $+commands[kubectl] )) || return
|
||||
|
||||
local current_ctx=$(kubectl config current-context 2> /dev/null)
|
||||
@@ -13,3 +13,34 @@ function kubectx_prompt_info() {
|
||||
# the context name, as it could contain a % character.
|
||||
echo "${kubectx_mapping[$current_ctx]:-${current_ctx:gs/%/%%}}"
|
||||
}
|
||||
|
||||
function kubectx_prompt_info() {
|
||||
if (( ${+_OMZ_ASYNC_OUTPUT} )) \
|
||||
&& [[ -n "${_OMZ_ASYNC_OUTPUT[_omz_kubectx_prompt_info]-}" ]]; then
|
||||
echo -n "${_OMZ_ASYNC_OUTPUT[_omz_kubectx_prompt_info]}"
|
||||
fi
|
||||
}
|
||||
|
||||
local _style
|
||||
if zstyle -t ':omz:alpha:plugins:kubectx' async-prompt \
|
||||
|| { is-at-least 5.0.6 && zstyle -T ':omz:alpha:plugins:kubectx' async-prompt }; then
|
||||
function _defer_async_kubectx_register() {
|
||||
case "${PS1}:${PS2}:${PS3}:${PS4}:${RPROMPT-}:${RPS1-}:${RPS2-}:${RPS3-}:${RPS4-}" in
|
||||
*(\$\(kubectx_prompt_info\)|\`kubectx_prompt_info\`)*)
|
||||
_omz_register_handler _omz_kubectx_prompt_info
|
||||
;;
|
||||
esac
|
||||
|
||||
add-zsh-hook -d precmd _defer_async_kubectx_register
|
||||
unset -f _defer_async_kubectx_register
|
||||
}
|
||||
|
||||
autoload -Uz add-zsh-hook
|
||||
precmd_functions=(_defer_async_kubectx_register $precmd_functions)
|
||||
elif zstyle -s ':omz:alpha:plugins:kubectx' async-prompt _style && [[ $_style == "force" ]]; then
|
||||
_omz_register_handler _omz_kubectx_prompt_info
|
||||
else
|
||||
function kubectx_prompt_info() {
|
||||
_omz_kubectx_prompt_info
|
||||
}
|
||||
fi
|
||||
|
||||
@@ -10,6 +10,7 @@ plugins=(... laravel)
|
||||
|:-:|:-:|
|
||||
| `artisan` | `php artisan` |
|
||||
| `pas` | `php artisan serve` |
|
||||
| `pad` | `php artisan dev` |
|
||||
| `pats` | `php artisan test` |
|
||||
|
||||
## Database
|
||||
@@ -41,6 +42,8 @@ plugins=(... laravel)
|
||||
| `pamen` | `php artisan make:enum` |
|
||||
| `pami` | `php artisan make:interface` |
|
||||
| `pamtr` | `php artisan make:trait` |
|
||||
| `pamv` | `php artisan make:view` |
|
||||
| `pammig` | `php artisan make:migration` |
|
||||
|
||||
## Clears
|
||||
|
||||
|
||||
@@ -4,6 +4,7 @@ alias bob='php artisan bob::build'
|
||||
|
||||
# Development
|
||||
alias pas='php artisan serve'
|
||||
alias pad='php artisan dev'
|
||||
alias pats='php artisan test'
|
||||
|
||||
# Database
|
||||
@@ -30,6 +31,8 @@ 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'
|
||||
alias pammig='php artisan make:migration'
|
||||
|
||||
|
||||
# Clears
|
||||
|
||||
@@ -10,4 +10,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_minikube" ]]; then
|
||||
_comps[minikube]=_minikube
|
||||
fi
|
||||
|
||||
minikube completion zsh >| "$ZSH_CACHE_DIR/completions/_minikube" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_minikube"
|
||||
zf_mv -f -- =( minikube completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
if (( ! $+commands[mise] )); then
|
||||
if (( $+commands[mise] )); then
|
||||
_mise_bin=mise
|
||||
elif [[ -x ~/.local/bin/mise ]]; then
|
||||
_mise_bin=~/.local/bin/mise
|
||||
else
|
||||
return
|
||||
fi
|
||||
|
||||
# Load mise hooks
|
||||
eval "$(mise activate zsh)"
|
||||
eval "$($_mise_bin activate zsh)"
|
||||
unset _mise_bin
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `mise`. Otherwise, compinit will have already done that.
|
||||
@@ -14,4 +19,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_mise" ]]; then
|
||||
fi
|
||||
|
||||
# Generate and load mise completion
|
||||
mise completion zsh >| "$ZSH_CACHE_DIR/completions/_mise" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_mise"
|
||||
zf_mv -f -- =( mise completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
+2
-2
@@ -157,13 +157,13 @@ case $state in
|
||||
'*::file:_files'
|
||||
;;
|
||||
(test)
|
||||
_files
|
||||
_path_files -X "All tests" -g "test/**/*_test.exs" -g "apps/*/test/**/*_test.exs"
|
||||
;;
|
||||
(test.watch)
|
||||
_files
|
||||
;;
|
||||
(run)
|
||||
_files
|
||||
_files -g "*.(exs|ex)"
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
|
||||
@@ -11,7 +11,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_molecule" ]]; then
|
||||
_comps[molecule]=_molecule
|
||||
fi
|
||||
|
||||
_MOLECULE_COMPLETE=zsh_source molecule >| "$ZSH_CACHE_DIR/completions/_molecule" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_molecule"
|
||||
zf_mv -f -- =( _MOLECULE_COMPLETE=zsh_source molecule ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# Alias
|
||||
# molecule: https://docs.ansible.com/projects/molecule/
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_atlas" ]]; then
|
||||
_comps[atlas]=_atlas
|
||||
fi
|
||||
|
||||
atlas completion zsh >| "$ZSH_CACHE_DIR/completions/atlas" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_atlas"
|
||||
zf_mv -f -- =( atlas completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -7,7 +7,11 @@ if (( $+commands[nsc] )); then
|
||||
_comps[nsc]=_nsc
|
||||
fi
|
||||
|
||||
nsc completion zsh >| "$ZSH_CACHE_DIR/completions/_nsc" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_nsc"
|
||||
zf_mv -f -- =( nsc completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
fi
|
||||
|
||||
if (( $+commands[nats] )); then
|
||||
@@ -19,5 +23,9 @@ if (( $+commands[nats] )); then
|
||||
_comps[nats]=_nats
|
||||
fi
|
||||
|
||||
nats --completion-script-zsh >| "$ZSH_CACHE_DIR/completions/_nats" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_nats"
|
||||
zf_mv -f -- =( nats --completion-script-zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
fi
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_ngrok" ]]; then
|
||||
_comps[ngrok]=_ngrok
|
||||
fi
|
||||
|
||||
ngrok completion zsh >| "$ZSH_CACHE_DIR/completions/_ngrok" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_ngrok"
|
||||
zf_mv -f -- =( ngrok completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_pass-cli" ]]; then
|
||||
_comps[pass-cli]=_pass-cli
|
||||
fi
|
||||
|
||||
pass-cli completions zsh >| "$ZSH_CACHE_DIR/completions/_pass-cli" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_pass-cli"
|
||||
zf_mv -f -- =( pass-cli completions zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -43,7 +43,11 @@ else
|
||||
_comps[pipenv]=_pipenv
|
||||
fi
|
||||
|
||||
_PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_pipenv"
|
||||
zf_mv -f -- =( _PIPENV_COMPLETE=zsh_source pipenv ) "$TMPPREFIX"
|
||||
} &|
|
||||
fi
|
||||
|
||||
if zstyle -T ':omz:plugins:pipenv' auto-shell; then
|
||||
@@ -52,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
|
||||
}
|
||||
|
||||
@@ -23,6 +23,16 @@ plugins=(... podman)
|
||||
| pirm | `podman image rm` | Remove one or more images |
|
||||
| pit | `podman image tag` | Add a name and tag to a particular image |
|
||||
| plo | `podman container logs` | Fetch the logs of a podman container |
|
||||
| pmif | `podman machine info` | Display machine host info |
|
||||
| pmit | `podman machine init` | Initialize a virtual machine |
|
||||
| pmis | `podman machine inspect` | Inspect an existing machine |
|
||||
| pml | `podman machine list` | List machines |
|
||||
| pmo | `podman machine os` | Manage a Podman virtual machine's OS |
|
||||
| pmrm | `podman machine rm` | Remove an existing machine |
|
||||
| pms | `podman machine set` | Set a virtual machine setting |
|
||||
| pmss | `podman machine ssh` | SSH into an existing machine |
|
||||
| pmst | `podman machine start` | Start an existing machine |
|
||||
| pmsp | `podman machine stop` | Stop an existing machine |
|
||||
| pnc | `podman network create` | Create a new network |
|
||||
| pncn | `podman network connect` | Connect a container to a network |
|
||||
| pndcn | `podman network disconnect` | Disconnect a container from a network |
|
||||
|
||||
@@ -10,7 +10,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_podman" ]]; then
|
||||
_comps[podman]=_podman
|
||||
fi
|
||||
|
||||
podman completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_podman" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_podman"
|
||||
zf_mv -f -- =( podman completion zsh 2> /dev/null ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
alias pbl='podman build'
|
||||
alias pcin='podman container inspect'
|
||||
@@ -22,6 +26,16 @@ alias pils='podman image ls'
|
||||
alias pipu='podman image push'
|
||||
alias pirm='podman image rm'
|
||||
alias pit='podman image tag'
|
||||
alias pmif='podman machine info'
|
||||
alias pmit='podman machine init'
|
||||
alias pmis='podman machine inspect'
|
||||
alias pml='podman machine list'
|
||||
alias pmo='podman machine os'
|
||||
alias pmrm='podman machine rm'
|
||||
alias pms='podman machine set'
|
||||
alias pmss='podman machine ssh'
|
||||
alias pmst='podman machine start'
|
||||
alias pmsp='podman machine stop'
|
||||
alias plo='podman container logs'
|
||||
alias pnc='podman network create'
|
||||
alias pncn='podman network connect'
|
||||
|
||||
@@ -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,20 +1,29 @@
|
||||
_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
|
||||
if [[ $in_poetry_dir -eq 1 ]] && [[ $poetry_active -ne 1 ]]; then
|
||||
venv_dir=$(poetry env info --path 2>/dev/null)
|
||||
local venv_dir=$(poetry env info --path 2>/dev/null)
|
||||
# Handle case where poetry returns "." for in-project virtual environments
|
||||
if [[ "$venv_dir" == "." ]]; then
|
||||
venv_dir="$PWD/.venv"
|
||||
|
||||
@@ -39,4 +39,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_poetry" ]]; then
|
||||
_comps[poetry]=_poetry
|
||||
fi
|
||||
|
||||
poetry completions zsh >| "$ZSH_CACHE_DIR/completions/_poetry" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_poetry"
|
||||
zf_mv -f -- =( poetry completions zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -10,12 +10,16 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then
|
||||
_comps[procs]=_procs
|
||||
fi
|
||||
|
||||
{
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_procs"
|
||||
autoload -Uz is-at-least
|
||||
local _version=$(procs --version)
|
||||
if is-at-least "0.14" "${_version#procs }"; then
|
||||
procs --gen-completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs"
|
||||
else
|
||||
procs --completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs"
|
||||
fi
|
||||
zf_mv -f -- =(
|
||||
if is-at-least "0.14" "${_version#procs }"; then
|
||||
procs --gen-completion-out zsh
|
||||
else
|
||||
procs --completion-out zsh
|
||||
fi
|
||||
) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -10,7 +10,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_pulumi" ]]; then
|
||||
_comps[pulumi]=_pulumi
|
||||
fi
|
||||
|
||||
pulumi gen-completion zsh >| "$ZSH_CACHE_DIR/completions/_pulumi" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_pulumi"
|
||||
zf_mv -f -- =( pulumi gen-completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# Aliases
|
||||
alias pul='pulumi'
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_qodana" ]]; then
|
||||
_comps[qodana]=_qodana
|
||||
fi
|
||||
|
||||
qodana completion zsh >| "$ZSH_CACHE_DIR/completions/_qodana" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_qodana"
|
||||
zf_mv -f -- =( qodana completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -54,6 +54,33 @@ plugins=(... rails)
|
||||
| `rta` | `rails test:all` | Runs all Rails tests, including system tests |
|
||||
| `ru` | `rails runner` | Run Ruby code in the context of Rails |
|
||||
|
||||
### Multiple databases
|
||||
|
||||
Rails applications can define more than one database (`primary`, `cache`, `cable`,
|
||||
`queue`, ...), and each one gets its own namespaced task. These commands accept an
|
||||
optional database name as the first argument:
|
||||
|
||||
`rdc`, `rdd`, `rdm`, `rdmd`, `rdmr`, `rdms`, `rdmu`, `rdr`, `rdrs`, `rdsl`
|
||||
|
||||
```zsh
|
||||
rdm # rails db:migrate
|
||||
rdm cache # rails db:migrate:cache
|
||||
rdm VERSION=20231225 # rails db:migrate VERSION=20231225
|
||||
rdm cache STEP=2 # rails db:migrate:cache STEP=2
|
||||
rdm --trace # rails db:migrate --trace
|
||||
```
|
||||
|
||||
The first argument is read as a database name only when it is a bare word. Flags
|
||||
(`--trace`), variables (`STEP=2`) and other tasks (`db:seed`) are passed through to
|
||||
`rails` unchanged, so previous usage keeps working. When a database name is given,
|
||||
the resolved command is printed so it is clear which database is being used.
|
||||
|
||||
`rdmrs` is not in the list above because Rails does not define a per-database
|
||||
`db:migrate:reset` task.
|
||||
|
||||
Note that these are implemented as shell functions rather than aliases, so they will
|
||||
not appear in the output of `alias`.
|
||||
|
||||
### Foreman
|
||||
|
||||
| Alias | Command | Description |
|
||||
|
||||
@@ -47,19 +47,9 @@ alias rc='rails console'
|
||||
alias rcs='rails console --sandbox'
|
||||
alias rd='rails destroy'
|
||||
alias rdb='rails dbconsole'
|
||||
alias rdc='rails db:create'
|
||||
alias rdd='rails db:drop'
|
||||
alias rdm='rails db:migrate'
|
||||
alias rdmd='rails db:migrate:down'
|
||||
alias rdmr='rails db:migrate:redo'
|
||||
alias rdmrs='rails db:migrate:reset'
|
||||
alias rdms='rails db:migrate:status'
|
||||
alias rdmtc='rails db:migrate db:test:clone'
|
||||
alias rdmu='rails db:migrate:up'
|
||||
alias rdr='rails db:rollback'
|
||||
alias rdrs='rails db:reset'
|
||||
alias rds='rails db:seed'
|
||||
alias rdsl='rails db:schema:load'
|
||||
alias rdtc='rails db:test:clone'
|
||||
alias rdtp='rails db:test:prepare'
|
||||
alias rgen='rails generate'
|
||||
@@ -106,9 +96,49 @@ alias rkn='rake notes'
|
||||
alias rksts='rake stats'
|
||||
alias rkt='rake test'
|
||||
|
||||
# Database tasks
|
||||
#
|
||||
# Rails applications can define more than one database (primary, cache, cable,
|
||||
# queue, ...). Each one gets its own namespaced task, e.g. `db:migrate:cache`.
|
||||
# The functions below take an optional database name as the first argument:
|
||||
#
|
||||
# rdm -> rails db:migrate
|
||||
# rdm cache -> rails db:migrate:cache
|
||||
# rdm VERSION=20231225 -> rails db:migrate VERSION=20231225
|
||||
# rdm cache STEP=2 -> rails db:migrate:cache STEP=2
|
||||
# rdm --trace -> rails db:migrate --trace
|
||||
#
|
||||
# The first argument is read as a database name only when it is a bare word.
|
||||
# Flags (--trace), variables (STEP=2) and other tasks (db:seed) are passed
|
||||
# through to rails untouched, so the previous alias behavior still works.
|
||||
function _rails_db_command() {
|
||||
local task="$1"
|
||||
shift
|
||||
|
||||
if [[ $# -gt 0 && "$1" != -* && "$1" != *=* && "$1" != *:* ]]; then
|
||||
task="$task:$1"
|
||||
shift
|
||||
# Echo the resolved task so it is clear which database is being used
|
||||
local -a cmd=(rails "$task" "$@")
|
||||
print -u2 -r -- "Running: ${cmd[*]}"
|
||||
fi
|
||||
|
||||
rails "$task" "$@"
|
||||
}
|
||||
|
||||
function rdc() { _rails_db_command db:create "$@" }
|
||||
function rdd() { _rails_db_command db:drop "$@" }
|
||||
function rdm() { _rails_db_command db:migrate "$@" }
|
||||
function rdmd() { _rails_db_command db:migrate:down "$@" }
|
||||
function rdmr() { _rails_db_command db:migrate:redo "$@" }
|
||||
function rdms() { _rails_db_command db:migrate:status "$@" }
|
||||
function rdmu() { _rails_db_command db:migrate:up "$@" }
|
||||
function rdr() { _rails_db_command db:rollback "$@" }
|
||||
function rdrs() { _rails_db_command db:reset "$@" }
|
||||
function rdsl() { _rails_db_command db:schema:load "$@" }
|
||||
|
||||
# legacy stuff
|
||||
alias sc='ruby script/console'
|
||||
alias sd='ruby script/destroy'
|
||||
alias sd='ruby script/server --debugger'
|
||||
alias sg='ruby script/generate'
|
||||
alias sp='ruby script/plugin'
|
||||
|
||||
@@ -10,7 +10,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_rbw" ]]; then
|
||||
_comps[rbw]=_rbw
|
||||
fi
|
||||
|
||||
rbw gen-completions zsh >| "$ZSH_CACHE_DIR/completions/_rbw" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_rbw"
|
||||
zf_mv -f -- =( rbw gen-completions zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
# rbwpw function copies the password of a service to the clipboard
|
||||
# and clears it after 20 seconds
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_rclone" ]]; then
|
||||
_comps[rclone]=_rclone
|
||||
fi
|
||||
|
||||
rclone completion zsh - >| "$ZSH_CACHE_DIR/completions/_rclone" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_rclone"
|
||||
zf_mv -f -- =( rclone completion zsh - ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -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"
|
||||
} &|
|
||||
@@ -19,7 +19,11 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_rustup" ]]; then
|
||||
fi
|
||||
|
||||
# Generate completion files in the background
|
||||
rustup completions zsh >| "$ZSH_CACHE_DIR/completions/_rustup" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_rustup"
|
||||
zf_mv -f -- =( rustup completions zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
cat >| "$ZSH_CACHE_DIR/completions/_cargo" <<'EOF'
|
||||
#compdef cargo
|
||||
source "$(rustup run ${${(z)$(rustup default)}[1]} rustc --print sysroot)"/share/zsh/site-functions/_cargo
|
||||
|
||||
@@ -11,7 +11,6 @@
|
||||
# Load bracketed-paste-magic if zsh version is >= 5.1
|
||||
autoload -Uz is-at-least
|
||||
if is-at-least 5.1; then
|
||||
set zle_bracketed_paste # Explicitly restore this zsh default
|
||||
autoload -Uz bracketed-paste-magic
|
||||
zle -N bracketed-paste bracketed-paste-magic
|
||||
return ### The rest of this file is NOT executed on zsh version >= 5.1 ###
|
||||
|
||||
@@ -34,6 +34,8 @@ if [[ "$TERM" == screen* ]]; then
|
||||
# tell GNU screen what the tab window title ($1) and the hardstatus($2) should be
|
||||
function screen_set()
|
||||
{
|
||||
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0
|
||||
|
||||
# set the tab window title (%t) for screen
|
||||
print -nR $'\033k'$1$'\033'\\\
|
||||
|
||||
|
||||
@@ -0,0 +1,112 @@
|
||||
# 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
@@ -0,0 +1,203 @@
|
||||
# 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'
|
||||
@@ -12,7 +12,11 @@ function install_autocompletion {
|
||||
_comps[$1]=_$1
|
||||
fi
|
||||
|
||||
$1 completion zsh >| "$ZSH_CACHE_DIR/completions/_$1" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_$1"
|
||||
zf_mv -f -- =( $1 completion zsh ) "$TMPPREFIX"
|
||||
} "$1" &|
|
||||
}
|
||||
|
||||
install_autocompletion cosign
|
||||
|
||||
@@ -11,4 +11,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_skaffold" ]]; then
|
||||
_comps[skaffold]=_skaffold
|
||||
fi
|
||||
|
||||
skaffold completion zsh >| "$ZSH_CACHE_DIR/completions/_skaffold" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_skaffold"
|
||||
zf_mv -f -- =( skaffold completion zsh ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
@@ -21,6 +21,18 @@ To enable **agent forwarding support** add the following to your zshrc file:
|
||||
zstyle :omz:plugins:ssh-agent agent-forwarding yes
|
||||
```
|
||||
|
||||
### `honor-existing`
|
||||
|
||||
If your session already provides an ssh-agent — a desktop keyring, `gpg-agent`,
|
||||
KeePassXC, or an agent forwarded over SSH — the plugin normally ignores it and
|
||||
starts one of its own, which leaves you with two agents. Set this to reuse the
|
||||
running agent instead, and only start a new one when `$SSH_AUTH_SOCK` is empty
|
||||
or does not answer:
|
||||
|
||||
```zsh
|
||||
zstyle :omz:plugins:ssh-agent honor-existing yes
|
||||
```
|
||||
|
||||
### `helper`
|
||||
|
||||
To set an **external helper** to ask for the passwords and possibly store
|
||||
|
||||
@@ -1,16 +1,28 @@
|
||||
# Get the filename to store/lookup the environment from
|
||||
ssh_env_cache="$HOME/.ssh/environment-$SHORT_HOST"
|
||||
|
||||
# Test if $SSH_AUTH_SOCK points at a listening agent
|
||||
function _is_agent_running() {
|
||||
local REPLY
|
||||
[[ -n "$SSH_AUTH_SOCK" && -S "$SSH_AUTH_SOCK" ]] || return 1
|
||||
zmodload zsh/net/socket 2>/dev/null || return 1
|
||||
zsocket "$SSH_AUTH_SOCK" 2>/dev/null || return 1
|
||||
exec {REPLY}>&- # close the probe connection
|
||||
return 0
|
||||
}
|
||||
|
||||
function _start_agent() {
|
||||
# Reuse an agent the session already provides, if enabled
|
||||
if zstyle -t :omz:plugins:ssh-agent honor-existing && _is_agent_running; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Check if ssh-agent is already running
|
||||
if [[ -f "$ssh_env_cache" ]]; then
|
||||
. "$ssh_env_cache" > /dev/null
|
||||
|
||||
# Test if $SSH_AUTH_SOCK is visible
|
||||
zmodload zsh/net/socket
|
||||
if [[ -S "$SSH_AUTH_SOCK" ]] && zsocket "$SSH_AUTH_SOCK" 2>/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
_is_agent_running && return 0
|
||||
fi
|
||||
|
||||
if [[ ! -d "$HOME/.ssh" ]]; then
|
||||
@@ -101,10 +113,18 @@ if zstyle -t :omz:plugins:ssh-agent agent-forwarding \
|
||||
&& [[ -n "$SSH_AUTH_SOCK" ]]; then
|
||||
if [[ ! -L "$SSH_AUTH_SOCK" ]]; then
|
||||
if [[ -n "$TERMUX_VERSION" ]]; then
|
||||
ln -sf "$SSH_AUTH_SOCK" "$PREFIX"/tmp/ssh-agent-$USERNAME-screen
|
||||
_omz_ssh_agent_link="$PREFIX"/tmp/ssh-agent-$USERNAME-screen
|
||||
else
|
||||
ln -sf "$SSH_AUTH_SOCK" /tmp/ssh-agent-$USERNAME-screen
|
||||
_omz_ssh_agent_link=/tmp/ssh-agent-$USERNAME-screen
|
||||
fi
|
||||
# `ln -sf` unlinks the old symlink and then creates the new one: two
|
||||
# syscalls, no atomic swap. Shells starting concurrently (a tmux window
|
||||
# opening several panes at once) interleave those steps and all but one
|
||||
# fail with "ln: ...: File exists". Stage the link under a PID-unique
|
||||
# name and move it into place, since rename(2) is atomic.
|
||||
command ln -sf "$SSH_AUTH_SOCK" "$_omz_ssh_agent_link.$$" \
|
||||
&& command mv -f "$_omz_ssh_agent_link.$$" "$_omz_ssh_agent_link"
|
||||
unset _omz_ssh_agent_link
|
||||
fi
|
||||
else
|
||||
_start_agent
|
||||
@@ -116,4 +136,4 @@ if ! zstyle -t :omz:plugins:ssh-agent lazy; then
|
||||
fi
|
||||
|
||||
unset agent_forwarding ssh_env_cache
|
||||
unfunction _start_agent _add_identities
|
||||
unfunction _start_agent _add_identities _is_agent_running
|
||||
|
||||
@@ -10,4 +10,8 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_stripe" ]]; then
|
||||
_comps[stripe]=_stripe
|
||||
fi
|
||||
|
||||
stripe completion --shell zsh --write-to-stdout >| "$ZSH_CACHE_DIR/completions/_stripe" &|
|
||||
zmodload -F zsh/files b:zf_mv
|
||||
() {
|
||||
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_stripe"
|
||||
zf_mv -f -- =( stripe completion --shell zsh --write-to-stdout ) "$TMPPREFIX"
|
||||
} &|
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user