Merge branch 'master' of github.com:ohmyzsh/ohmyzsh

This commit is contained in:
AdminatComposeDAO 2025-05-31 19:20:26 -07:00
commit 5f16e1d9e1
43 changed files with 1219 additions and 339 deletions

View file

@ -30,7 +30,7 @@ dependencies:
plugins/wd: plugins/wd:
repo: mfaerevaag/wd repo: mfaerevaag/wd
branch: master branch: master
version: tag:v0.9.3 version: tag:v0.10.0
precopy: | precopy: |
set -e set -e
rm -r test rm -r test
@ -38,7 +38,7 @@ dependencies:
plugins/z: plugins/z:
branch: master branch: master
repo: agkozak/zsh-z repo: agkozak/zsh-z
version: dd94ef04acc41748ba171eb219971cb455e0040b version: cf9225feebfae55e557e103e95ce20eca5eff270
precopy: | precopy: |
set -e set -e
test -e README.md && mv -f README.md MANUAL.md test -e README.md && mv -f README.md MANUAL.md

View file

@ -1,5 +1,5 @@
certifi==2025.1.31 certifi==2025.4.26
charset-normalizer==3.4.1 charset-normalizer==3.4.2
idna==3.10 idna==3.10
PyYAML==6.0.2 PyYAML==6.0.2
requests==2.32.3 requests==2.32.3

View file

@ -163,7 +163,7 @@ adds any) and extra goodies that are included in that particular plugin.
### Themes ### Themes
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme-happy. We have over one
hundred and fifty themes now bundled. Most of them have hundred and fifty themes now bundled. Most of them have
[screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!).
Check them out! Check them out!
@ -218,7 +218,7 @@ terminal window.
ZSH_THEME="random" # (...please let it be pie... please be some pie..) ZSH_THEME="random" # (...please let it be pie... please be some pie..)
``` ```
And if you want to pick random theme from a list of your favorite themes: And if you want to pick a random theme from a list of your favorite themes:
```sh ```sh
ZSH_THEME_RANDOM_CANDIDATES=( ZSH_THEME_RANDOM_CANDIDATES=(
@ -426,7 +426,7 @@ turn it off by setting the following in your .zshrc file, before Oh My Zsh is so
zstyle ':omz:alpha:lib:git' async-prompt no zstyle ':omz:alpha:lib:git' async-prompt no
``` ```
If your problem is that the git prompt just stopped appearing, you can try to force it setting the following If your problem is that the git prompt just stopped appearing, you can try to force it by setting the following
configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your
case. case.

View file

@ -72,6 +72,10 @@ function _omz {
local -aU plugins local -aU plugins
plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t)) plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
_describe 'plugin' plugins ;; _describe 'plugin' plugins ;;
plugin::list)
local -a opts
opts=('--enabled:List enabled plugins only')
_describe -o 'options' opts ;;
theme::(set|use)) theme::(set|use))
local -aU themes local -aU themes
themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::)) themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
@ -206,7 +210,7 @@ Available commands:
disable <plugin> Disable plugin(s) disable <plugin> Disable plugin(s)
enable <plugin> Enable plugin(s) enable <plugin> Enable plugin(s)
info <plugin> Get information of a plugin info <plugin> Get information of a plugin
list List all available Oh My Zsh plugins list [--enabled] List Oh My Zsh plugins
load <plugin> Load plugin(s) load <plugin> Load plugin(s)
EOF EOF
@ -449,8 +453,21 @@ function _omz::plugin::info {
function _omz::plugin::list { function _omz::plugin::list {
local -a custom_plugins builtin_plugins local -a custom_plugins builtin_plugins
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
builtin_plugins=("$ZSH"/plugins/*(-/N:t)) # If --enabled is provided, only list what's enabled
if [[ "$1" == "--enabled" ]]; then
local plugin
for plugin in "${plugins[@]}"; do
if [[ -d "${ZSH_CUSTOM}/plugins/${plugin}" ]]; then
custom_plugins+=("${plugin}")
elif [[ -d "${ZSH}/plugins/${plugin}" ]]; then
builtin_plugins+=("${plugin}")
fi
done
else
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
builtin_plugins=("$ZSH"/plugins/*(-/N:t))
fi
# If the command is being piped, print all found line by line # If the command is being piped, print all found line by line
if [[ ! -t 1 ]]; then if [[ ! -t 1 ]]; then

View file

@ -39,6 +39,105 @@ function _omz_git_prompt_info() {
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
} }
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
# This cannot use the prompt constants, as they may be empty
local -A prefix_constant_map
prefix_constant_map=(
'\?\? ' 'UNTRACKED'
'A ' 'ADDED'
'M ' 'MODIFIED'
'MM ' 'MODIFIED'
' M ' 'MODIFIED'
'AM ' 'MODIFIED'
' T ' 'MODIFIED'
'R ' 'RENAMED'
' D ' 'DELETED'
'D ' 'DELETED'
'UU ' 'UNMERGED'
'ahead' 'AHEAD'
'behind' 'BEHIND'
'diverged' 'DIVERGED'
'stashed' 'STASHED'
)
# Maps the internal constant to the prompt theme
local -A constant_prompt_map
constant_prompt_map=(
'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
)
# The order that the prompt displays should be added to the prompt
local status_constants
status_constants=(
UNTRACKED ADDED MODIFIED RENAMED DELETED
STASHED UNMERGED AHEAD BEHIND DIVERGED
)
local status_text
status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
# Don't continue on a catastrophic failure
if [[ $? -eq 128 ]]; then
return 1
fi
# A lookup table of each git status encountered
local -A statuses_seen
if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
statuses_seen[STASHED]=1
fi
local status_lines
status_lines=("${(@f)${status_text}}")
# If the tracking line exists, get and parse it
if [[ "$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
continue
fi
local last_parsed_status=$prefix_constant_map[$match[1]]
statuses_seen[$last_parsed_status]=$match[2]
done
fi
# For each status prefix, do a regex comparison
for status_prefix in ${(k)prefix_constant_map}; do
local status_constant="${prefix_constant_map[$status_prefix]}"
local status_regex=$'(^|\n)'"$status_prefix"
if [[ "$status_text" =~ $status_regex ]]; then
statuses_seen[$status_constant]=1
fi
done
# Display the seen statuses in the order specified
local status_prompt
for status_constant in $status_constants; do
if (( ${+statuses_seen[$status_constant]} )); then
local next_display=$constant_prompt_map[$status_constant]
status_prompt="$next_display$status_prompt"
fi
done
echo $status_prompt
}
# Use async version if setting is enabled, or unset but zsh version is at least 5.0.6. # Use async version if setting is enabled, or unset but zsh version is at least 5.0.6.
# This avoids async prompt issues caused by previous zsh versions: # This avoids async prompt issues caused by previous zsh versions:
# - https://github.com/ohmyzsh/ohmyzsh/issues/12331 # - https://github.com/ohmyzsh/ohmyzsh/issues/12331
@ -246,105 +345,6 @@ function git_prompt_long_sha() {
SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER" SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
} }
function _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
# This cannot use the prompt constants, as they may be empty
local -A prefix_constant_map
prefix_constant_map=(
'\?\? ' 'UNTRACKED'
'A ' 'ADDED'
'M ' 'MODIFIED'
'MM ' 'MODIFIED'
' M ' 'MODIFIED'
'AM ' 'MODIFIED'
' T ' 'MODIFIED'
'R ' 'RENAMED'
' D ' 'DELETED'
'D ' 'DELETED'
'UU ' 'UNMERGED'
'ahead' 'AHEAD'
'behind' 'BEHIND'
'diverged' 'DIVERGED'
'stashed' 'STASHED'
)
# Maps the internal constant to the prompt theme
local -A constant_prompt_map
constant_prompt_map=(
'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
)
# The order that the prompt displays should be added to the prompt
local status_constants
status_constants=(
UNTRACKED ADDED MODIFIED RENAMED DELETED
STASHED UNMERGED AHEAD BEHIND DIVERGED
)
local status_text
status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
# Don't continue on a catastrophic failure
if [[ $? -eq 128 ]]; then
return 1
fi
# A lookup table of each git status encountered
local -A statuses_seen
if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
statuses_seen[STASHED]=1
fi
local status_lines
status_lines=("${(@f)${status_text}}")
# If the tracking line exists, get and parse it
if [[ "$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
continue
fi
local last_parsed_status=$prefix_constant_map[$match[1]]
statuses_seen[$last_parsed_status]=$match[2]
done
fi
# For each status prefix, do a regex comparison
for status_prefix in ${(k)prefix_constant_map}; do
local status_constant="${prefix_constant_map[$status_prefix]}"
local status_regex=$'(^|\n)'"$status_prefix"
if [[ "$status_text" =~ $status_regex ]]; then
statuses_seen[$status_constant]=1
fi
done
# Display the seen statuses in the order specified
local status_prompt
for status_constant in $status_constants; do
if (( ${+statuses_seen[$status_constant]} )); then
local next_display=$constant_prompt_map[$status_constant]
status_prompt="$next_display$status_prompt"
fi
done
echo $status_prompt
}
# Outputs the name of the current user # Outputs the name of the current user
# Usage example: $(git_current_user_name) # Usage example: $(git_current_user_name)
function git_current_user_name() { function git_current_user_name() {

View file

@ -18,10 +18,10 @@ function omz_history {
print -u2 History file deleted. print -u2 History file deleted.
elif [[ $# -eq 0 ]]; then elif [[ $# -eq 0 ]]; then
# if no arguments provided, show full history starting from 1 # if no arguments provided, show full history starting from 1
builtin fc $stamp -l 1 builtin fc "${stamp[@]}" -l 1
else else
# otherwise, run `fc -l` with a custom format # otherwise, run `fc -l` with a custom format
builtin fc $stamp -l "$@" builtin fc "${stamp[@]}" -l "$@"
fi fi
} }

View file

@ -17,7 +17,7 @@ function title {
: ${2=$1} : ${2=$1}
case "$TERM" in case "$TERM" in
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*) cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*|wezterm*)
print -Pn "\e]2;${2:q}\a" # set window name print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name print -Pn "\e]1;${1:q}\a" # set tab name
;; ;;

View file

@ -192,7 +192,7 @@ _omz_source() {
fi fi
} }
# Load all of the lib files in ~/oh-my-zsh/lib that end in .zsh # Load all of the lib files in ~/.oh-my-zsh/lib that end in .zsh
# TIP: Add files you don't want in git to .gitignore # TIP: Add files you don't want in git to .gitignore
for lib_file ("$ZSH"/lib/*.zsh); do for lib_file ("$ZSH"/lib/*.zsh); do
_omz_source "lib/${lib_file:t}" _omz_source "lib/${lib_file:t}"

View file

@ -178,26 +178,27 @@ fi
# Check Arch Linux PGP Keyring before System Upgrade to prevent failure. # Check Arch Linux PGP Keyring before System Upgrade to prevent failure.
function upgrade() { function upgrade() {
sudo pacman -Sy
echo ":: Checking Arch Linux PGP Keyring..." echo ":: Checking Arch Linux PGP Keyring..."
local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')" local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')"
local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')" local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')"
if [ $installedver != $currentver ]; then if [ $installedver != $currentver ]; then
echo " Arch Linux PGP Keyring is out of date." echo " Arch Linux PGP Keyring is out of date."
echo " Updating before full system upgrade." echo " Updating before full system upgrade."
sudo pacman -Sy --needed --noconfirm archlinux-keyring sudo pacman -S --needed --noconfirm archlinux-keyring
else else
echo " Arch Linux PGP Keyring is up to date." echo " Arch Linux PGP Keyring is up to date."
echo " Proceeding with full system upgrade." echo " Proceeding with full system upgrade."
fi fi
if (( $+commands[yay] )); then if (( $+commands[yay] )); then
yay -Syu yay -Su
elif (( $+commands[trizen] )); then elif (( $+commands[trizen] )); then
trizen -Syu trizen -Su
elif (( $+commands[pacaur] )); then elif (( $+commands[pacaur] )); then
pacaur -Syu pacaur -Su
elif (( $+commands[aura] )); then elif (( $+commands[aura] )); then
sudo aura -Syu sudo aura -Su
else else
sudo pacman -Syu sudo pacman -Su
fi fi
} }

View file

@ -19,21 +19,30 @@ Example for installing the nodejs plugin and the many runtimes for it:
```sh ```sh
# Add plugin to asdf # Add plugin to asdf
asdf plugin add nodejs asdf plugin add nodejs
# Install the latest available nodejs runtime version # Install the latest available version
asdf install nodejs latest asdf install nodejs latest
# Install nodejs v16.5.0 runtime version # Uninstall the latest version
asdf uninstall nodejs latest
# Install a specific version
asdf install nodejs 16.5.0 asdf install nodejs 16.5.0
# Set the latest version in .tools-version in the current working directory # Set the latest version in .tool-versions of the `current directory`
asdf set nodejs latest asdf set nodejs latest
# Set a version globally that will apply to all directories under $HOME # Set a specific version in the `parent directory`
asdf set -u nodejs 16.5.0 asdf set -p nodejs 16.5.0 # -p is shorthand for --parent
# Set a global version under `$HOME`
asdf set -u nodejs 16.5.0 # -u is shorthand for --home
``` ```
For more commands, run `asdf help` or refer to the
[asdf CLI documentation](https://asdf-vm.com/manage/commands.html#all-commands).
## Maintainer ## Maintainer
- [@RobLoach](https://github.com/RobLoach) - [@RobLoach](https://github.com/RobLoach)

View file

@ -8,7 +8,7 @@ function branch_prompt_info() {
while [[ "$dir" != '/' ]]; do while [[ "$dir" != '/' ]]; do
# Found .git directory # Found .git directory
if [[ -d "${dir}/.git" ]]; then if [[ -d "${dir}/.git" ]]; then
branch="${"$(<"${dir}/.git/HEAD")"##*/}" branch="${"$(<"${dir}/.git/HEAD")"##ref: refs/heads/}"
echo '±' "${branch:gs/%/%%}" echo '±' "${branch:gs/%/%%}"
return return
fi fi

View file

@ -83,9 +83,9 @@ else
} }
alias ac="su -ls '$apt_pref clean' root" alias ac="su -ls '$apt_pref clean' root"
alias ad="su -lc '$apt_pref update' root" alias ad="su -lc '$apt_pref update' root"
alias adg="su -lc '$apt_pref update && aptitude $apt_upgr' root" alias adg="su -lc '$apt_pref update && $apt_pref $apt_upgr' root"
alias adu="su -lc '$apt_pref update && aptitude dist-upgrade' root" alias adu="su -lc '$apt_pref update && $apt_pref dist-upgrade' root"
alias afu="su -lc '$apt-file update'" alias afu="su -lc 'apt-file update'"
alias au="su -lc '$apt_pref $apt_upgr' root" alias au="su -lc '$apt_pref $apt_upgr' root"
function ai() { function ai() {
cmd="su -lc '$apt_pref install $@' root" cmd="su -lc '$apt_pref install $@' root"

View file

@ -23,3 +23,4 @@ plugins=(... dotnet)
| dp | dotnet pack | Create a NuGet package. | | dp | dotnet pack | Create a NuGet package. |
| dng | dotnet nuget | Provides additional NuGet commands. | | dng | dotnet nuget | Provides additional NuGet commands. |
| db | dotnet build | Build a .NET project | | db | dotnet build | Build a .NET project |
| dres | dotnet restore | Restore dependencies and project-specific tools for a project. |

View file

@ -24,3 +24,4 @@ alias da='dotnet add'
alias dp='dotnet pack' alias dp='dotnet pack'
alias dng='dotnet nuget' alias dng='dotnet nuget'
alias db='dotnet build' alias db='dotnet build'
alias dres='dotnet restore'

View file

@ -35,7 +35,7 @@ alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
alias eframe='emacsclient --alternate-editor="" --create-frame' alias eframe='emacsclient --alternate-editor="" --create-frame'
# Emacs ANSI Term tracking # Emacs ANSI Term tracking
if [[ -n "$INSIDE_EMACS" ]]; then if [[ -n "$INSIDE_EMACS" ]] && [[ "$INSIDE_EMACS" != "vterm" ]]; then
chpwd_emacs() { print -P "\033AnSiTc %d"; } chpwd_emacs() { print -P "\033AnSiTc %d"; }
print -P "\033AnSiTc %d" # Track current working directory print -P "\033AnSiTc %d" # Track current working directory
print -P "\033AnSiTu %n" # Track username print -P "\033AnSiTu %n" # Track username

View file

@ -23,9 +23,10 @@ def get_tagname_or_hash():
return hash_ return hash_
return None return None
# Re-use method from https://github.com/magicmonty/bash-git-prompt to get stashs count # Re-use method from https://github.com/magicmonty/bash-git-prompt to get stash count
# Use `--git-common-dir` to avoid problems with git worktrees, which don't have individual stashes
def get_stash(): def get_stash():
cmd = Popen(['git', 'rev-parse', '--git-dir'], stdout=PIPE, stderr=PIPE) cmd = Popen(['git', 'rev-parse', '--git-common-dir'], stdout=PIPE, stderr=PIPE)
so, se = cmd.communicate() so, se = cmd.communicate()
stash_file = '%s%s' % (so.decode('utf-8').rstrip(), '/logs/refs/stash') stash_file = '%s%s' % (so.decode('utf-8').rstrip(), '/logs/refs/stash')
@ -35,7 +36,6 @@ def get_stash():
except IOError: except IOError:
return 0 return 0
# `git status --porcelain --branch` can collect all information # `git status --porcelain --branch` can collect all information
# branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind # branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind
po = Popen(['git', 'status', '--porcelain', '--branch'], env=dict(os.environ, LANG="C"), stdout=PIPE, stderr=PIPE) po = Popen(['git', 'status', '--porcelain', '--branch'], env=dict(os.environ, LANG="C"), stdout=PIPE, stderr=PIPE)

View file

@ -79,6 +79,7 @@ plugins=(... git)
| `gcss` | `git commit -S -s` | | `gcss` | `git commit -S -s` |
| `gcssm` | `git commit -S -s -m` | | `gcssm` | `git commit -S -s -m` |
| `gcf` | `git config --list` | | `gcf` | `git config --list` |
| `gcfu` | `git commit --fixup` |
| `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` | | `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` |
| `gd` | `git diff` | | `gd` | `git diff` |
| `gdca` | `git diff --cached` | | `gdca` | `git diff --cached` |

View file

@ -200,6 +200,7 @@ alias gc!='git commit --verbose --amend'
alias gcn='git commit --verbose --no-edit' alias gcn='git commit --verbose --no-edit'
alias gcn!='git commit --verbose --no-edit --amend' alias gcn!='git commit --verbose --no-edit --amend'
alias gcf='git config --list' alias gcf='git config --list'
alias gcfu='git commit --fixup'
alias gdct='git describe --tags $(git rev-list --tags --max-count=1)' alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
alias gd='git diff' alias gd='git diff'
alias gdca='git diff --cached' alias gdca='git diff --cached'

View file

@ -20,6 +20,7 @@ plugins=(... jj)
| jje | `jj edit` | | jje | `jj edit` |
| jjgcl | `jj git clone` | | jjgcl | `jj git clone` |
| jjgf | `jj git fetch` | | jjgf | `jj git fetch` |
| jjgfa | `jj git fetch --all-remotes` |
| jjgp | `jj git push` | | jjgp | `jj git push` |
| jjl | `jj log` | | jjl | `jj log` |
| jjla | `jj log -r "all()"` | | jjla | `jj log -r "all()"` |

View file

@ -42,6 +42,7 @@ alias jjds='jj desc'
alias jje='jj edit' alias jje='jj edit'
alias jjgcl='jj git clone' alias jjgcl='jj git clone'
alias jjgf='jj git fetch' alias jjgf='jj git fetch'
alias jjgfa='jj git fetch --all-remotes'
alias jjgp='jj git push' alias jjgp='jj git push'
alias jjl='jj log' alias jjl='jj log'
alias jjla='jj log -r "all()"' alias jjla='jj log -r "all()"'

16
plugins/kamal/README.md Normal file
View file

@ -0,0 +1,16 @@
# Kamal
This plugin provides completion for [Kamal](https://kamal-deploy.org/) as well as some
aliases for frequent Kamal commands.
To use it, add kamal to the plugins array of your zshrc file:
```zsh
plugins=(... kamal)
```
## Aliase
| Alias | Command | Description |
|-----------|----------------------------------|----------------------------------------------------------------------------------|
| kad | `kamal deploy` | Deploy app to servers |

691
plugins/kamal/_kamal Normal file
View file

@ -0,0 +1,691 @@
#compdef kamal
# Description
# -----------
# zsh completion for Kamal (https://kamal-deploy.org/)
# -------------------------------------------------------------------------
# Authors
# -------
# * Igor Aleksandrov <igor.alexandrov@gmail.com>
# -------------------------------------------------------------------------
# Inspiration
# -----------
# * docker-compose ohmyzsh completion script by @sdurrheimer Steve Durrheimer
# -------------------------------------------------------------------------
# _kamal_commands() {
# # Only initialize if empty
# if (( ${#kamal_commands} == 0 )); then
# kamal_commands=(
# accessory
# app
# audit
# build
# config
# deploy
# details
# docs
# help
# init
# lock
# proxy
# prune
# redeploy
# registry
# remove
# rollback
# secrets
# server
# setup
# upgrade
# version
# )
# fi
# _values 'Kamal commands' $kamal_commands
# }
typeset -gr _kamal_commands=(
'accessory:Control accessory services'
'app:Control application deployment'
'audit:Audit security of deployment'
'build:Build and manage app images'
'config:Show effective configuration'
'deploy:Deploy app to servers'
'details:Show details about deployment'
'docs:Open documentation in browser'
'help:Show command help'
'init:Initialize new Kamal project'
'lock:Manage deployment locks'
'proxy:Control reverse proxy'
'prune:Clean up containers and images'
'redeploy:Redeploy current version'
'registry:Manage Docker registry access'
'remove:Remove app from servers'
'rollback:Rollback to a previous version'
'secrets:Manage deployment secrets'
'server:Control server configuration'
'setup:Setup initial deployment'
'upgrade:Upgrade deployment'
'version:Show Kamal version'
)
# Helper function to display messages
_kamal_message() {
local msg="$1"
_kamal_message "==> $msg"
}
# Helper function to extract destination names from ./config/deploy.*.yml
_kamal_destinations() {
local -a dests
local file
# Check if config directory exists
if [[ ! -d "config" ]]; then
_kamal_message "Cannot find Kamal configuration directory at ./config" && return 1
fi
for file in config/deploy.*.yml(N); do
[[ $file =~ config/deploy\.(.+)\.yml ]] && dests+=("${match[1]}")
done
_values 'Destination' $dests
}
# Define global _kamal_flags array
typeset -ga _kamal_flags
_kamal_flags=(
'(-v --verbose )'{-v,--verbose}'[Detailed logging]'
'(--no-verbose --skip-verbose)'{--no-verbose,--skip-verbose}'[No detailed logging]'
'(-q --quiet --no-quiet --skip-quiet)'{-q,--quiet}'[Minimal logging]'
'(-q --quiet --no-quiet --skip-quiet)'{--no-quiet,--skip-quiet}'[No minimal logging]'
'--version=[Run commands against a specific app version]:version'
'(-p --primary --no-primary --skip-primary)'{-p,--primary}'[Run commands only on primary host instead of all]'
'(-p --primary --no-primary --skip-primary)'{--no-primary,--skip-primary}'[Do not run commands only on primary host]'
'(-h --hosts)'{-h,--hosts=}'[Run commands on these hosts instead of all]:hosts'
'(-r --roles)'{-r,--roles=}'[Run commands on these roles instead of all]:roles'
'(-c --config-file)'{-c,--config-file=}'[Path to config file]:config file:_files'
'(-d --destination)'{-d,--destination=}'[Specify destination to be used for config file]:destination:_kamal_destinations'
'(-H --skip-hooks)'{-H,--skip-hooks}'[Do not run hooks]'
)
_kamal() {
local context state state_descr line curcontext="$curcontext"
typeset -A opt_args
local ret=1
_arguments -C \
$_kamal_flags \
'1: :->command' \
'*:: :->args' && ret=0
case $state in
(command)
# First argument - show available commands
_describe -t kamal-commands "Kamal commands" _kamal_commands && ret=0
;;
(args)
# Subsequent arguments - handle based on the command
case $words[1] in
(accessory)
_kamal_accessory && ret=0
;;
(app)
_kamal_app && ret=0
;;
(audit)
_arguments $_kamal_flags && ret=0
;;
(build)
_kamal_build && ret=0
;;
(config)
_arguments $_kamal_flags && ret=0
;;
(deploy)
_arguments $_kamal_flags && ret=0
;;
(details)
_arguments $_kamal_flags && ret=0
;;
(docs)
_arguments $_kamal_flags && ret=0
;;
(help)
_kamal_help && ret=0
;;
(init)
local -a init_flags
init_flags=(
$_kamal_flags
'(--bundle --no-bundle --skip-bundle)--bundle[Add Kamal to the Gemfile and create a bin/kamal binstub]'
'(--bundle --no-bundle --skip-bundle)--no-bundle[Do not add Kamal to the Gemfile and create a bin/kamal binstub]'
'(--bundle --no-bundle --skip-bundle)--skip-bundle[Skip add Kamal to the Gemfile and create a bin/kamal binstub]'
)
_arguments $init_flags && ret=0
;;
(lock)
_kamal_lock && ret=0
;;
(proxy)
_kamal_proxy && ret=0
;;
(prune)
_kamal_prune && ret=0
;;
(redeploy)
_arguments $_kamal_flags && ret=0
;;
(registry)
_kamal_registry && ret=0
;;
(remove)
local -a remove_flags
remove_flags=(
$_kamal_flags
'(-y --confirmed --no-confirmed --skip-confirmed)'{-y,--confirmed}'[Proceed without confirmation question]'
'(-y --confirmed --no-confirmed --skip-confirmed)--no-confirmed[Proceed without confirmation question]'
'(-y --confirmed --no-confirmed --skip-confirmed)--skip-confirmed[Proceed without confirmation question]'
)
_arguments $remove_flags && ret=0
;;
(rollback)
if (( CURRENT == 2 )); then
_kamal_message "Enter the version to rollback to" && ret=0
else
_values $_kamal_flags && ret=0
fi
;;
(secrets)
_kamal_secrets && ret=0
;;
(server)
_kamal_server && ret=0
;;
(setup)
local -a setup_flags
setup_flags=(
$_kamal_flags
'(-P --skip-push)'{-P,--skip-push}'[Skip image build and push]'
)
_arguments $setup_flags && ret=0
;;
(upgrade)
local -a upgrade_flags
upgrade_flags=(
$_kamal_flags
'(-y --confirmed --no-confirmed --skip-confirmed)'{-y,--confirmed}'[Proceed without confirmation question]'
'(-y --confirmed --no-confirmed --skip-confirmed)--no-confirmed[Do not proceed without confirmation question]'
'(-y --confirmed --no-confirmed --skip-confirmed)--skip-confirmed[Skip confirmation question]'
'(--rolling --no-rolling --skip-rolling)--rolling[Upgrade one host at a time]'
'(--rolling --no-rolling --skip-rolling)--no-rolling[Do not upgrade one host at a time]'
'(--rolling --no-rolling --skip-rolling)--skip-rolling[Skip rolling upgrade]'
)
_arguments $upgrade_flags && ret=0
;;
(version)
_arguments $_kamal_flags && ret=0
esac
;;
esac
return ret
}
_kamal_accessory() {
local context state line
typeset -A opt_args
local ret=1
# Define accessory subcommands
local -a accessory_subcommands
accessory_subcommands=(
"boot:Boot new accessory service on host (use NAME=all to boot all accessories)"
"details:Show details about accessory on host (use NAME=all to show all accessories)"
"exec:Execute a custom command on servers within the accessory container (use --help to show options)"
"help:Describe subcommands or one specific subcommand"
"logs:Show log lines from accessory on host (use --help to show options)"
"reboot:Reboot existing accessory on host (stop container, remove container, start new container; use NAME=all to boot all accessories)"
"remove:Remove accessory container, image and data directory from host (use NAME=all to remove all accessories)"
"restart:Restart existing accessory container on host"
"start:Start existing accessory container on host"
"stop:Stop existing accessory container on host"
"upgrade:Upgrade accessories from Kamal 1.x to 2.0 (restart them in 'kamal' network)"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t accessory-commands "Kamal accessory commands" accessory_subcommands && ret=0
;;
(args)
case $words[1] in
(boot|details|exec|logs|reboot|remove|restart|start|stop)
# These commands require a NAME parameter
if (( CURRENT == 2 )); then
# At the NAME position - we could add accessory name completion here
# if we had a way to list available accessories
_kamal_message "Specify an accessory name (or 'all' for all accessories)" && ret=0
elif [[ "$words[1]" == "exec" && CURRENT == 3 ]]; then
# For exec, the 3rd argument is a command
_kamal_message "Enter a command to execute" && ret=0
elif (( CURRENT > 2 )) && [[ "$words[1]" != "exec" || CURRENT > 3 ]]; then
_values $_kamal_flags && ret=0
fi
;;
(help)
# Remove help itself from the list of commands
accessory_subcommands=("${(@)accessory_subcommands:#help*}")
_describe -t accessory-help-commands "Kamal accessory help commands" accessory_subcommands
;;
(upgrade)
# For upgrade, show flags immediately
_arguments $_kamal_flags && ret=0
;;
esac
;;
esac
return ret
}
_kamal_app() {
local context state line
typeset -A opt_args
local ret=1
local -a app_subcommands
app_subcommands=(
"boot:Boot app on servers (or reboot app if already running)"
"containers:Show app containers on servers"
"details:Show details about app containers"
"exec:Execute a custom command on servers within the app container (use --help to show options)"
"help:Describe subcommands or one specific subcommand"
"images:Show app images on servers"
"logs:Show log lines from app on servers (use --help to show options)"
"remove:Remove app containers and images from servers"
"stale_containers:Detect app stale containers"
"start:Start existing app container on servers"
"stop:Stop app container on servers"
"version:Show app version currently running on servers"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t app-commands "Kamal app commands" app_subcommands && ret=0
;;
(args)
case $words[1] in
(boot|containers|details|images|logs|remove|stale_containers|start|stop)
_arguments $_kamal_flags && ret=0
;;
(exec)
# For exec, the next argument is a command
if (( CURRENT == 2 )); then
_kamal_message "Enter a command to execute" && ret=0
else
_values $_kamal_flags && ret=0
fi
;;
(help)
# Remove help itself from the list of commands
app_subcommands=("${(@)app_subcommands:#help*}")
_describe -t app-help-commands "Kamal app help commands" app_subcommands
;;
esac
;;
esac
return ret
}
_kamal_build() {
local context state line
typeset -A opt_args
local ret=1
local -a build_subcommands
build_subcommands=(
"create:Create a build setup"
"deliver:Build app and push app image to registry then pull image on servers"
"details:Show build setup"
"dev:Build using the working directory, tag it as dirty, and push to local image store."
"help:Describe subcommands or one specific subcommand"
"pull:Pull app image from registry onto servers"
"push:Build and push app image to registry"
"remove:Remove build setup"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t build-commands "Kamal build commands" build_subcommands && ret=0
;;
(args)
case $words[1] in
(create|deliver|details|dev|pull|push|remove)
_arguments $_kamal_flags && ret=0
;;
(help)
# Remove help itself from the list of commands
build_subcommands=("${(@)build_subcommands:#help*}")
_describe -t build-help-commands "Kamal build help commands" build_subcommands
;;
esac
;;
esac
return ret
}
_kamal_help() {
local ret=1
# Make sure kamal_commands is initialized properly
# if (( ${#kamal_commands} == 0 )); then
# _kamal_commands >/dev/null
# fi
# If we already have a command after "help", return without suggestions
if (( CURRENT > 2 )); then
ret=0
else
local -a help_commands
# Filter out help from the list of commands
help_commands=("${(@)_kamal_commands:#help}")
_values 'Kamal help' $help_commands && ret=0
fi
return ret
}
_kamal_lock() {
local context state line
typeset -A opt_args
local ret=1
local -a lock_subcommands
lock_subcommands=(
"acquire:Acquire the deploy lock"
"help:Describe subcommands or one specific subcommand"
"release:Release the deploy lock"
"status:Report lock status"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t lock-commands "Kamal lock commands" lock_subcommands && ret=0
;;
(args)
case $words[1] in
(acquire)
local -a acquire_flags
acquire_flags=(
$_kamal_flags
'(-m --message)'{-m,--message=}'[A lock message]:message:' # Required flag
)
_arguments $acquire_flags && ret=0
;;
(release|status)
_arguments $_kamal_flags && ret=0
;;
(help)
# Remove help itself from the list of commands
lock_subcommands=("${(@)lock_subcommands:#help*}")
_describe -t lock-help-commands "Kamal lock help commands" lock_subcommands
;;
esac
;;
esac
return ret
}
_kamal_proxy() {
local context state line
typeset -A opt_args
local ret=1
local -a proxy_subcommands
proxy_subcommands=(
"boot:Boot proxy on servers"
"boot_config:Manage kamal-proxy boot configuration"
"details:Show details about proxy container from servers"
"help:Describe subcommands or one specific subcommand"
"logs:Show log lines from proxy on servers"
"reboot:Reboot proxy on servers (stop container, remove container, start new container)"
"remove:Remove proxy container and image from servers"
"restart:Restart existing proxy container on servers"
"start:Start existing proxy container on servers"
"stop:Stop existing proxy container on servers"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t proxy-commands "Kamal proxy commands" proxy_subcommands && ret=0
;;
(args)
case $words[1] in
(boot|details|logs|reboot|remove|restart|start|stop)
_arguments $_kamal_flags && ret=0
;;
(boot_config)
if (( CURRENT == 2 )); then
local -a boot_config_commands=(
"set:Set boot configuration"
"get:Get boot configuration"
"reset:Reset boot configuration"
)
_describe -t boot-config-commands "Boot config commands" boot_config_commands && ret=0
else
_values $_kamal_flags && ret=0
fi
;;
(help)
# Remove help itself from the list of commands
proxy_subcommands=("${(@)proxy_subcommands:#help*}")
_describe -t proxy-help-commands "Kamal proxy help commands" proxy_subcommands
;;
esac
;;
esac
return ret
}
_kamal_prune() {
local context state line
typeset -A opt_args
local ret=1
local -a prune_subcommands
prune_subcommands=(
"all:Prune unused images and stopped containers"
"containers:Prune all stopped containers, except the last n (default 5)"
"help:Describe subcommands or one specific subcommand"
"images:Prune unused images"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t prune-commands "Kamal prune commands" prune_subcommands && ret=0
;;
(args)
case $words[1] in
(all|containers|images)
_arguments $_kamal_flags && ret=0
;;
(help)
# Remove help itself from the list of commands
prune_subcommands=("${(@)prune_subcommands:#help*}")
_describe -t prune-help-commands "Kamal prune help commands" prune_subcommands
;;
esac
;;
esac
return ret
}
_kamal_registry() {
local context state line
typeset -A opt_args
local ret=1
local -a registry_subcommands
registry_subcommands=(
"help:Describe subcommands or one specific subcommand"
"login:Log in to registry locally and remotely"
"logout:Log out of registry locally and remotely"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t registry-commands "Kamal registry commands" registry_subcommands && ret=0
;;
(args)
case $words[1] in
(help)
# Remove help itself from the list of commands
registry_subcommands=("${(@)registry_subcommands:#help*}")
_describe -t registry-help-commands "Kamal registry help commands" registry_subcommands
;;
(login|logout)
_arguments $_kamal_flags && ret=0
;;
esac
;;
esac
return ret
}
_kamal_secrets() {
local context state line
typeset -A opt_args
local ret=1
local -a secrets_subcommands
secrets_subcommands=(
"extract:Extract a single secret from the results of a fetch call"
"fetch:Fetch secrets from a vault"
"help:Describe subcommands or one specific subcommand"
"print:Print the secrets (for debugging)"
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t secrets-commands "Kamal secrets commands" secrets_subcommands && ret=0
;;
(args)
case $words[1] in
(fetch)
local -a fetch_flags
fetch_flags=(
$_kamal_flags
'(-a --adapter)'{-a,--adapter=}'[Secret storage adapter]:adapter:(aws-parameter-store)'
)
_arguments $fetch_flags && ret=0
;;
(extract|print)
_arguments $_kamal_flags && ret=0
;;
(help)
# Remove help itself from the list of commands
secrets_subcommands=("${(@)secrets_subcommands:#help*}")
_describe -t secrets-help-commands "Kamal secrets help commands" secrets_subcommands
;;
esac
;;
esac
return ret
}
_kamal_server() {
local context state line
typeset -A opt_args
local ret=1
local -a server_subcommands
server_subcommands=(
"bootstrap:Set up Docker to run Kamal apps"
"exec:Run a custom command on the server (use --help to show options)"
"help:Describe subcommands or one specific subcommand"
)
local -a server_flags
server_flags=(
$_kamal_flags
'(-i --interactive --no-interactive --skip-interactive)'{-i,--interactive}'[Run the command interactively]'
'(-i --interactive --no-interactive --skip-interactive)--no-interactive[Do not run the command interactively]'
'(-i --interactive --no-interactive --skip-interactive)--skip-interactive[Skip interactive mode]'
)
_arguments -C \
'1: :->subcmd' \
'*:: :->args' && ret=0
case $state in
(subcmd)
_describe -t server-commands "Kamal server commands" server_subcommands && ret=0
;;
(args)
case $words[1] in
(bootstrap)
_arguments $server_flags && ret=0
;;
(exec)
if (( CURRENT == 2 )); then
# For exec, the next argument is a command
_kamal_message "Enter a command to execute" && ret=0
else
_values $server_flags && ret=0
fi
;;
(help)
# Remove help itself from the list of commands
server_subcommands=("${(@)server_subcommands:#help*}")
_describe -t server-help-commands "Kamal server help commands" server_subcommands
;;
esac
;;
esac
return ret
}
_kamal "$@"

View file

@ -0,0 +1,25 @@
# Find kamal binary (local ./bin/kamal or global)
function _kamal_command () {
if [ -x "./bin/kamal" ]; then
./bin/kamal "$@"
else
command kamal "$@"
fi
}
function which-kamal() {
if [ -x "./bin/kamal" ]; then
echo "Using local ./bin/kamal"
else
echo "Using global $(command -v kamal)"
fi
}
# Use `_kamal_command`` function for `kamal` command
alias kamal='_kamal_command'
# Aliases
alias kad='kamal deploy'
# Hook up completion
compdef _kamal_command=kamal

View file

@ -11,124 +11,126 @@ plugins=(... kubectl)
## Aliases ## Aliases
| Alias | Command | Description | | Alias | Command | Description |
| :------- | :------------------------------------------------- | :----------------------------------------------------------------------------------------------- | | :------- | :------------------------------------------------------ | :----------------------------------------------------------------------------------------------- |
| k | `kubectl` | The kubectl command | | k | `kubectl` | The kubectl command |
| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces | | kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces |
| kaf | `kubectl apply -f` | Apply a YML file | | kaf | `kubectl apply -f` | Apply a YML file |
| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container | | keti | `kubectl exec -ti` | Drop into an interactive terminal on a container |
| | | **Manage configuration quickly to switch contexts between local, dev and staging** | | | | **Manage configuration quickly to switch contexts between local, dev and staging** |
| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file | | kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file |
| kcsc | `kubectl config set-context` | Set a context entry in kubeconfig | | kcsc | `kubectl config set-context` | Set a context entry in kubeconfig |
| kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig | | kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig |
| kccc | `kubectl config current-context` | Display the current-context | | kccc | `kubectl config current-context` | Display the current-context |
| kcgc | `kubectl config get-contexts` | List of contexts available | | kcgc | `kubectl config get-contexts` | List of contexts available |
| | | **General aliases** | | | | **General aliases** |
| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector | | kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument | | kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument |
| | | **Pod management** | | kge | `kubectl get events --sort-by=".lastTimestamp"` | Get events (sorted by timestamp) |
| kgp | `kubectl get pods` | List all pods in ps output format | | kgew | `kubectl get events --watch --sort-by=".lastTimestamp"` | Get events and watch as they occur (sorted by timestamp) |
| kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` | | | | **Pod management** |
| kgpn | `kgp -n` | Get pods by namespace. Example: `kgpn kube-system` | | kgp | `kubectl get pods` | List all pods in ps output format |
| kgpsl | `kubectl get pods --show-labels` | List all pods in ps output format with labels | | kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` |
| kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes | | kgpn | `kgp -n` | Get pods by namespace. Example: `kgpn kube-system` |
| kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included | | kgpsl | `kubectl get pods --show-labels` | List all pods in ps output format with labels |
| kep | `kubectl edit pods` | Edit pods from the default editor | | kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes |
| kdp | `kubectl describe pods` | Describe all pods | | kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included |
| kdelp | `kubectl delete pods` | Delete all pods matching passed arguments | | kep | `kubectl edit pods` | Edit pods from the default editor |
| | | **Service management** | | kdp | `kubectl describe pods` | Describe all pods |
| kgs | `kubectl get svc` | List all services in ps output format | | kdelp | `kubectl delete pods` | Delete all pods matching passed arguments |
| kgsw | `kgs --watch` | After listing all services, watch for changes | | | | **Service management** |
| kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information | | kgs | `kubectl get svc` | List all services in ps output format |
| kes | `kubectl edit svc` | Edit services(svc) from the default editor | | kgsw | `kgs --watch` | After listing all services, watch for changes |
| kds | `kubectl describe svc` | Describe all services in detail | | kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information |
| kdels | `kubectl delete svc` | Delete all services matching passed argument | | kes | `kubectl edit svc` | Edit services(svc) from the default editor |
| | | **Ingress management** | | kds | `kubectl describe svc` | Describe all services in detail |
| kgi | `kubectl get ingress` | List ingress resources in ps output format | | kdels | `kubectl delete svc` | Delete all services matching passed argument |
| kei | `kubectl edit ingress` | Edit ingress resource from the default editor | | | | **Ingress management** |
| kdi | `kubectl describe ingress` | Describe ingress resource in detail | | kgi | `kubectl get ingress` | List ingress resources in ps output format |
| kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument | | kei | `kubectl edit ingress` | Edit ingress resource from the default editor |
| | | **Namespace management** | | kdi | `kubectl describe ingress` | Describe ingress resource in detail |
| kgns | `kubectl get namespaces` | List the current namespaces in a cluster | | kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument |
| kcn | `kubectl config set-context --current --namespace` | Change current namespace | | | | **Namespace management** |
| kens | `kubectl edit namespace` | Edit namespace resource from the default editor | | kgns | `kubectl get namespaces` | List the current namespaces in a cluster |
| kdns | `kubectl describe namespace` | Describe namespace resource in detail | | kcn | `kubectl config set-context --current --namespace` | Change current namespace |
| kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace | | kens | `kubectl edit namespace` | Edit namespace resource from the default editor |
| | | **ConfigMap management** | | kdns | `kubectl describe namespace` | Describe namespace resource in detail |
| kgcm | `kubectl get configmaps` | List the configmaps in ps output format | | kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace |
| kecm | `kubectl edit configmap` | Edit configmap resource from the default editor | | | | **ConfigMap management** |
| kdcm | `kubectl describe configmap` | Describe configmap resource in detail | | kgcm | `kubectl get configmaps` | List the configmaps in ps output format |
| kdelcm | `kubectl delete configmap` | Delete the configmap | | kecm | `kubectl edit configmap` | Edit configmap resource from the default editor |
| | | **Secret management** | | kdcm | `kubectl describe configmap` | Describe configmap resource in detail |
| kgsec | `kubectl get secret` | Get secret for decoding | | kdelcm | `kubectl delete configmap` | Delete the configmap |
| kdsec | `kubectl describe secret` | Describe secret resource in detail | | | | **Secret management** |
| kdelsec | `kubectl delete secret` | Delete the secret | | kgsec | `kubectl get secret` | Get secret for decoding |
| | | **Deployment management** | | kdsec | `kubectl describe secret` | Describe secret resource in detail |
| kgd | `kubectl get deployment` | Get the deployment | | kdelsec | `kubectl delete secret` | Delete the secret |
| kgdw | `kgd --watch` | After getting the deployment, watch for changes | | | | **Deployment management** |
| kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information | | kgd | `kubectl get deployment` | Get the deployment |
| ked | `kubectl edit deployment` | Edit deployment resource from the default editor | | kgdw | `kgd --watch` | After getting the deployment, watch for changes |
| kdd | `kubectl describe deployment` | Describe deployment resource in detail | | kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information |
| kdeld | `kubectl delete deployment` | Delete the deployment | | ked | `kubectl edit deployment` | Edit deployment resource from the default editor |
| ksd | `kubectl scale deployment` | Scale a deployment | | kdd | `kubectl describe deployment` | Describe deployment resource in detail |
| krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment | | kdeld | `kubectl delete deployment` | Delete the deployment |
| kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime | | ksd | `kubectl scale deployment` | Scale a deployment |
| | | **Rollout management** | | krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment |
| kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment | | kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime |
| kdrs | `kubectl describe replicaset` | Describe ReplicaSet in detail | | | | **Rollout management** |
| kers | `kubectl edit replicaset` | Edit ReplicaSet from the default editor | | kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment |
| krh | `kubectl rollout history` | Check the revisions of this deployment | | kdrs | `kubectl describe replicaset` | Describe ReplicaSet in detail |
| kru | `kubectl rollout undo` | Rollback to the previous revision | | kers | `kubectl edit replicaset` | Edit ReplicaSet from the default editor |
| | | **Port forwarding** | | krh | `kubectl rollout history` | Check the revisions of this deployment |
| kpf | `kubectl port-forward` | Forward one or more local ports to a pod | | kru | `kubectl rollout undo` | Rollback to the previous revision |
| | | **Tools for accessing all information** | | | | **Port forwarding** |
| kga | `kubectl get all` | List all resources in ps format | | kpf | `kubectl port-forward` | Forward one or more local ports to a pod |
| kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces | | | | **Tools for accessing all information** |
| | | **Logs** | | kga | `kubectl get all` | List all resources in ps format |
| kl | `kubectl logs` | Print the logs for a container or resource | | kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces |
| klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) | | | | **Logs** |
| | | **File copy** | | kl | `kubectl logs` | Print the logs for a container or resource |
| kcp | `kubectl cp` | Copy files and directories to and from containers | | klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) |
| | | **Node management** | | | | **File copy** |
| kgno | `kubectl get nodes` | List the nodes in ps output format | | kcp | `kubectl cp` | Copy files and directories to and from containers |
| kgnosl | `kubectl get nodes --show-labels` | List the nodes in ps output format with labels | | | | **Node management** |
| keno | `kubectl edit node` | Edit nodes resource from the default editor | | kgno | `kubectl get nodes` | List the nodes in ps output format |
| kdno | `kubectl describe node` | Describe node resource in detail | | kgnosl | `kubectl get nodes --show-labels` | List the nodes in ps output format with labels |
| kdelno | `kubectl delete node` | Delete the node | | keno | `kubectl edit node` | Edit nodes resource from the default editor |
| | | **Persistent Volume Claim management** | | kdno | `kubectl describe node` | Describe node resource in detail |
| kgpvc | `kubectl get pvc` | List all PVCs | | kdelno | `kubectl delete node` | Delete the node |
| kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes | | | | **Persistent Volume Claim management** |
| kepvc | `kubectl edit pvc` | Edit pvcs from the default editor | | kgpvc | `kubectl get pvc` | List all PVCs |
| kdpvc | `kubectl describe pvc` | Describe all pvcs | | kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes |
| kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments | | kepvc | `kubectl edit pvc` | Edit pvcs from the default editor |
| | | **StatefulSets management** | | kdpvc | `kubectl describe pvc` | Describe all pvcs |
| kgss | `kubectl get statefulset` | List the statefulsets in ps format | | kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments |
| kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes | | | | **StatefulSets management** |
| kgsswide | `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information | | kgss | `kubectl get statefulset` | List the statefulsets in ps format |
| kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor | | kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes |
| kdss | `kubectl describe statefulset` | Describe statefulset resource in detail | | kgsswide | `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information |
| kdelss | `kubectl delete statefulset` | Delete the statefulset | | kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor |
| ksss | `kubectl scale statefulset` | Scale a statefulset | | kdss | `kubectl describe statefulset` | Describe statefulset resource in detail |
| krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment | | kdelss | `kubectl delete statefulset` | Delete the statefulset |
| | | **Service Accounts management** | | ksss | `kubectl scale statefulset` | Scale a statefulset |
| kdsa | `kubectl describe sa` | Describe a service account in details | | krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment |
| kdelsa | `kubectl delete sa` | Delete the service account | | | | **Service Accounts management** |
| | | **DaemonSet management** | | kdsa | `kubectl describe sa` | Describe a service account in details |
| kgds | `kubectl get daemonset` | List all DaemonSets in ps output format | | kdelsa | `kubectl delete sa` | Delete the service account |
| kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes | | | | **DaemonSet management** |
| keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor | | kgds | `kubectl get daemonset` | List all DaemonSets in ps output format |
| kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail | | kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes |
| kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument | | keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor |
| | | **CronJob management** | | kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail |
| kgcj | `kubectl get cronjob` | List all CronJobs in ps output format | | kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument |
| kecj | `kubectl edit cronjob` | Edit CronJob from the default editor | | | | **CronJob management** |
| kdcj | `kubectl describe cronjob` | Describe a CronJob in details | | kgcj | `kubectl get cronjob` | List all CronJobs in ps output format |
| kdelcj | `kubectl delete cronjob` | Delete the CronJob | | kecj | `kubectl edit cronjob` | Edit CronJob from the default editor |
| | | **Job management** | | kdcj | `kubectl describe cronjob` | Describe a CronJob in details |
| kgj | `kubectl get job` | List all Job in ps output format | | kdelcj | `kubectl delete cronjob` | Delete the CronJob |
| kej | `kubectl edit job` | Edit a Job in details | | | | **Job management** |
| kdj | `kubectl describe job` | Describe the Job | | kgj | `kubectl get job` | List all Job in ps output format |
| kdelj | `kubectl delete job` | Delete the Job | | kej | `kubectl edit job` | Edit a Job in details |
| kdj | `kubectl describe job` | Describe the Job |
| kdelj | `kubectl delete job` | Delete the Job |
## Wrappers ## Wrappers

View file

@ -36,6 +36,8 @@ alias kcgc='kubectl config get-contexts'
# General aliases # General aliases
alias kdel='kubectl delete' alias kdel='kubectl delete'
alias kdelf='kubectl delete -f' alias kdelf='kubectl delete -f'
alias kge='kubectl get events --sort-by=".lastTimestamp"'
alias kgew='kubectl get events --sort-by=".lastTimestamp" --watch'
# Pod management. # Pod management.
alias kgp='kubectl get pods' alias kgp='kubectl get pods'

View file

@ -21,6 +21,7 @@ plugins=(... laravel)
| `pamfs` | `php artisan migrate:fresh --seed` | | `pamfs` | `php artisan migrate:fresh --seed` |
| `pamr` | `php artisan migrate:rollback` | | `pamr` | `php artisan migrate:rollback` |
| `pads` | `php artisan db:seed` | | `pads` | `php artisan db:seed` |
| `padw` | `php artisan db:wipe` |
## Makers ## Makers

View file

@ -12,6 +12,7 @@ alias pamf='php artisan migrate:fresh'
alias pamfs='php artisan migrate:fresh --seed' alias pamfs='php artisan migrate:fresh --seed'
alias pamr='php artisan migrate:rollback' alias pamr='php artisan migrate:rollback'
alias pads='php artisan db:seed' alias pads='php artisan db:seed'
alias padw='php artisan db:wipe'
# Makers # Makers
alias pamm='php artisan make:model' alias pamm='php artisan make:model'

View file

@ -33,6 +33,8 @@ if it's found, or the mvn command otherwise.
| `mvnct` | `mvn clean test` | | `mvnct` | `mvn clean test` |
| `mvncv` | `mvn clean verify` | | `mvncv` | `mvn clean verify` |
| `mvncvst` | `mvn clean verify -DskipTests` | | `mvncvst` | `mvn clean verify -DskipTests` |
| `mvnv` | `mvn verify` |
| `mvnvst` | `mvn verify -DskipTests` |
| `mvndp` | `mvn deploy` | | `mvndp` | `mvn deploy` |
| `mvndocs` | `mvn dependency:resolve -Dclassifier=javadoc` | | `mvndocs` | `mvn dependency:resolve -Dclassifier=javadoc` |
| `mvndt` | `mvn dependency:tree` | | `mvndt` | `mvn dependency:tree` |

View file

@ -62,6 +62,8 @@ alias mvncp='mvn clean package'
alias mvnct='mvn clean test' alias mvnct='mvn clean test'
alias mvncv='mvn clean verify' alias mvncv='mvn clean verify'
alias mvncvst='mvn clean verify -DskipTests' alias mvncvst='mvn clean verify -DskipTests'
alias mvnv='mvn verify'
alias mvnvst='mvn verify -DskipTests'
alias mvndp='mvn deploy' alias mvndp='mvn deploy'
alias mvndocs='mvn dependency:resolve -Dclassifier=javadoc' alias mvndocs='mvn dependency:resolve -Dclassifier=javadoc'
alias mvndt='mvn dependency:tree' alias mvndt='mvn dependency:tree'

View file

@ -20,17 +20,17 @@ the next time you autocomplete `pip install`.
## Aliases ## Aliases
| Alias | Description | | Alias | Command | Description |
| :------- | :-------------------------------------------- | | :--------|:----------------------------------------------------------------------------------|:--------------------------------------------- |
| pipi | Install packages | | pipi | `pip install` | Install packages |
| pipig | Install package from GitHub repository | | pipig | `pip install "git+https://github.com/user/repo.git"` | Install package from GitHub repository |
| pipigb | Install package from GitHub branch | | pipigb | `pip install "git+https://github.com/user/repo.git@branch"` | Install package from GitHub branch |
| pipigp | Install package from GitHub pull request | | pipigp | `pip install "git+https://github.com/user/repo.git@refs/pull/PR_NUMBER/head"` | Install package from GitHub pull request |
| pipu | Upgrade packages | | pipu | `pip install --upgrade` | Upgrade packages |
| pipun | Uninstall packages | | pipun | `pip uninstall` | Uninstall packages |
| pipgi | Grep through installed packages | | pipgi | `pip freeze \| grep` | Grep through installed packages |
| piplo | List outdated packages | | piplo | `pip list --outdated` | List outdated packages |
| pipreq | Create requirements file | | pipreq | `pip freeze > requirements.txt` | Create requirements file |
| pipir | Install packages from `requirements.txt` file | | pipir | `pip install -r requirements.txt` | Install packages from `requirements.txt` file |
| pipupall | Update all installed packages | | pipupall | `pip list --outdated \| awk 'NR > 2 { print $1 }' \| xargs pip install --upgrade` | Update all installed packages |
| pipunall | Uninstall all installed packages | | pipunall | `pip list --format freeze \| cut -d= -f1 \| xargs pip uninstall` | Uninstall all installed packages |

View file

@ -3,11 +3,19 @@ if (( ! $+commands[procs] )); then
fi fi
# If the completion file doesn't exist yet, we need to autoload it and # If the completion file doesn't exist yet, we need to autoload it and
# bind it to `minikube`. Otherwise, compinit will have already done that. # bind it to `procs`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then
typeset -g -A _comps typeset -g -A _comps
autoload -Uz _procs autoload -Uz _procs
_comps[procs]=_procs _comps[procs]=_procs
fi fi
procs --gen-completion-out zsh >| "$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
} &|

View file

@ -34,7 +34,7 @@ virtual environments:
`<venv-name>/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated `<venv-name>/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated
in subdirectories). in subdirectories).
- To enable the feature, set `PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh. - To enable the feature, set `PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh.
- The plugin activates the first existing virtual environment, in order, appearing in `$PYTON_VENV_NAMES`. - The plugin activates the first existing virtual environment, in order, appearing in `$PYTHON_VENV_NAMES`.
The default virtual environment name is `venv`. To use a different name, set The default virtual environment name is `venv`. To use a different name, set
`PYTHON_VENV_NAME=<venv-name>`. For example: `PYTHON_VENV_NAME=".venv"` `PYTHON_VENV_NAME=<venv-name>`. For example: `PYTHON_VENV_NAME=".venv"`

View file

@ -1,16 +1,26 @@
# rsync # rsync
This plugin adds aliases for frequent [rsync](https://rsync.samba.org/) commands. This plugin adds aliases for frequent [rsync](https://rsync.samba.org/) commands, simplifying file transfer and synchronization tasks.
To use it add `rsync` to the plugins array in you zshrc file. To use it add `rsync` to the plugins array in you `.zshrc` file.
```zsh ```zsh
plugins=(... rsync) plugins=(... rsync)
``` ```
| Alias | Command | | Alias | Command | Description |
| ------------------- | ------------------------------------------------ | | ------------------- | ------------------------------------------------ | ------------|
| *rsync-copy* | `rsync -avz --progress -h` | | `rsync-copy` | `rsync -avz --progress -h` | Recursively copy files and directories, preserving permissions, timestamps, and symbolic links. Compression is enabled for faster transfers. Progress is displayed in a human-readable format. |
| *rsync-move* | `rsync -avz --progress -h --remove-source-files` | | `rsync-move` | `rsync -avz --progress -h --remove-source-files` | Same as rsync-copy, but removes the source files after a successful transfer (effectively performing a move). |
| *rsync-update* | `rsync -avzu --progress -h` | | `rsync-update` | `rsync -avzu --progress -h` | Like rsync-copy, but only updates files if the source is newer than the destination (or if the destination file is missing). |
| *rsync-synchronize* | `rsync -avzu --delete --progress -h` | | `rsync-synchronize` | `rsync -avzu --delete --progress -h` | Performs bidirectional-style sync: updates files as in rsync-update and deletes files in the destination that no longer exist in the source. Useful for directory synchronization. |
Explanation of Flags:
- -a: Archive mode; preserves symbolic links, permissions, timestamps, etc.
- -v: Verbose; shows details of the transfer process.
- -z: Compress file data during transfer for efficiency.
- -u: Skip files that are newer on the receiver.
- --progress: Show progress during file transfer.
- -h: Output numbers in human-readable format (e.g., 1K, 234M).
- --remove-source-files: Deletes source files after they are copied (used in rsync-move).
- --delete: Deletes files in the destination that are not present in the source (used in rsync-synchronize).

View file

@ -15,25 +15,26 @@ plugins=(... terraform)
## Aliases ## Aliases
| Alias | Command | | Alias | Command |
|---------|----------------------------------| | ------- | -------------------------------------- |
| `tf` | `terraform` | | `tf` | `terraform` |
| `tfa` | `terraform apply` | | `tfa` | `terraform apply` |
| `tfaa` | `terraform apply -auto-approve` | | `tfaa` | `terraform apply -auto-approve` |
| `tfc` | `terraform console` | | `tfc` | `terraform console` |
| `tfd` | `terraform destroy` | | `tfd` | `terraform destroy` |
| `tfd!` | `terraform destroy -auto-approve`| | `tfd!` | `terraform destroy -auto-approve` |
| `tff` | `terraform fmt` | | `tff` | `terraform fmt` |
| `tffr` | `terraform fmt -recursive` | | `tffr` | `terraform fmt -recursive` |
| `tfi` | `terraform init` | | `tfi` | `terraform init` |
| `tfiu` | `terraform init -upgrade` | | `tfir` | `terraform init -reconfigure` |
| `tfo` | `terraform output` | | `tfiu` | `terraform init -upgrade` |
| `tfp` | `terraform plan` | | `tfiur` | `terraform init -upgrade -reconfigure` |
| `tfv` | `terraform validate` | | `tfo` | `terraform output` |
| `tfs` | `terraform state` | | `tfp` | `terraform plan` |
| `tft` | `terraform test` | | `tfv` | `terraform validate` |
| `tfsh` | `terraform show` | | `tfs` | `terraform state` |
| `tft` | `terraform test` |
| `tfsh` | `terraform show` |
## Prompt function ## Prompt function

View file

@ -24,7 +24,9 @@ alias 'tfd!'='terraform destroy -auto-approve'
alias tff='terraform fmt' alias tff='terraform fmt'
alias tffr='terraform fmt -recursive' alias tffr='terraform fmt -recursive'
alias tfi='terraform init' alias tfi='terraform init'
alias tfir='terraform init -reconfigure'
alias tfiu='terraform init -upgrade' alias tfiu='terraform init -upgrade'
alias tfiur='terraform init -upgrade -reconfigure'
alias tfo='terraform output' alias tfo='terraform output'
alias tfp='terraform plan' alias tfp='terraform plan'
alias tfv='terraform validate' alias tfv='terraform validate'

View file

@ -1,46 +1,76 @@
# universalarchive plugin # universalarchive plugin
Lets you compress files by a command `ua <format> <files>`, supporting various The `universalarchive` plugin provides a convenient command-line interface for archiving files and directories using a wide variety of compression formats - without having to remember the exact syntax for each tool.
compression formats (e.g. 7z, tar.gz, lzma, ...).
To enable it, add `universalarchive` to the plugins array in your zshrc file: To enable it, add `universalarchive` to the plugins array in your `.zshrc` file:
```zsh ```zsh
plugins=(... universalarchive) plugins=(... universalarchive)
``` ```
## Features
- Compress files and directories using a simple, unified command: ua <format> <files>
- Automatically detects file/directory names to generate appropriate output names
- Supports fallback naming if an output file already exists
- Works with many common and advanced compression formats
- Designed for simplicity and quick use in the terminal
## Usage ## Usage
Run `ua <format> <files>` to compress `<files>` into an archive file using `<format>`. Basic command format:
For example:
```sh ```sh
ua xz *.html ua <format> <files...>
```
- `<format>`: the archive format to use (e.g., `zip`, `tar.gz`, `xz`, `7z`, etc.)
- `<files...>`: one or more files or directories to compress
## Examples:
Compresses `notes.txt` and `images` into `notes.zip`
```sh
ua zip notes.txt images/
``` ```
this command will compress all `.html` files in directory `folder` into `folder.xz`. Creates `myproject.tar.gz`
```sh
ua tar.gz myproject/
```
This plugin saves you from having to remember which command line arguments compress a file. Compresses all .log files into `current_folder.xz`
```sh
ua xz *.log
```
## Supported compression formats The plugin will generate a default archive filename based on the input:
- For a file, the output is derived from the file name without its extension.
- For a directory, it uses the directory name.
- For multiple files, it uses the name of the common parent directory.
| Extension | Description | If the output file already exists, a unique filename is generated using `mktemp`.
|:-----------------|:-------------------------------|
| `7z` | 7zip file |
| `bz2` | Bzip2 file |
| `gz` | Gzip file |
| `lzma` | LZMA archive |
| `lzo` | LZO archive |
| `rar` | WinRAR archive |
| `tar` | Tarball |
| `tbz`/`tar.bz2` | Tarball with bzip2 compression |
| `tgz`/`tar.gz` | Tarball with gzip compression |
| `tlz`/`tar.lzma` | Tarball with lzma compression |
| `txz`/`tar.xz` | Tarball with lzma2 compression |
| `tZ`/`tar.Z` | Tarball with LZW compression |
| `xz` | LZMA2 archive |
| `Z` | Z archive (LZW) |
| `zip` | Zip archive |
| `zst` | Zstd archive |
See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information regarding the archive formats. ## Supported Archive Formats
| Format | Description | Tool Used |
|:-----------------|:-------------------------------|:-----------------|
| `7z` | 7zip archive | `7z` |
| `bz2` | Bzip2-compressed file | `bzip2` |
| `gz` | Gzip-compressed file | `gzip` |
| `lzma` | LZMA-compressed file | `lzma` |
| `lzo` | LZO-compressed file | `lzop` |
| `rar` | WinRAR archive | `rar` |
| `tar` | Uncompressed tarball | `tar` |
| `tbz`,`tar.bz2` | Tarball compressed with Bzip2 | `tar + bzip2` |
| `tgz`,`tar.gz` | Tarball compressed with Gzip | `tar + gzip` |
| `tlz`,`tar.lzma` | Tarball compressed with LZMA | `tar + lzma` |
| `txz`,`tar.xz` | Tarball compressed with LZMA2 | `tar + xz` |
| `tZ`,`tar.Z` | Tarball compressed with LZW | `tar + compress` |
| `xz` | XZ-compressed file | `xz` |
| `Z` | LZW-compressed file | `compress` |
| `zip` | Standard Zip archive | `zip` |
| `zst` | Zstandard-compressed file | `zstd` |
> Note: Some formats may require specific tools to be installed on your system (e.g. `7z`, `rar`, `lzop`, `zstd`). Make sure these tools are available in your `$PATH`.
## Auto-Completion
The plugin provides tab-completion for supported formats and input files. Type `ua <TAB>` to see available formats, and `ua <format> <TAB>` to browse files.

View file

@ -46,7 +46,7 @@ hasn't been defined by theme, *Insert mode* is not displayed by default.
You can change these indicators by setting the `MODE_INDICATOR` (*Normal mode*) and You can change these indicators by setting the `MODE_INDICATOR` (*Normal mode*) and
`INSERT_MODE_INDICATORS` (*Insert mode*) variables. `INSERT_MODE_INDICATORS` (*Insert mode*) variables.
This settings support Prompt Expansion sequences. For example: These settings support Prompt Expansion sequences. For example:
```zsh ```zsh
MODE_INDICATOR="%F{white}+%f" MODE_INDICATOR="%F{white}+%f"
@ -157,6 +157,27 @@ NOTE: delete/kill commands (`dd`, `D`, `c{motion}`, `C`, `x`,`X`) and yank comma
(`y`, `Y`) will copy to the clipboard. Contents can then be put back using paste commands (`y`, `Y`) will copy to the clipboard. Contents can then be put back using paste commands
(`P`, `p`). (`P`, `p`).
## Text objects
Standard text objects are supported with `i` ("inside") and `a` ("around"), e.g., for words; thus, you can select the word the cursor is in with `viw`, or delete the current word, including surrounding spaces, with `daw`.
For other text objects, you can rely on the built-in functionality of Zsh and enable it accordingly.
For example, for quoted strings, you can copy the commented snippet of <https://sourceforge.net/p/zsh/code/ci/master/tree/Functions/Zle/select-quoted>: place this in your `.zsrhc` file, e.g., after sourcing oh-my-zsh:
```sh
autoload -U select-quoted
zle -N select-quoted
for m in visual viopp; do
for c in {a,i}{\',\",\`}; do
bindkey -M $m $c select-quoted
done
done
```
Now, in normal mode, you can select everything inside a double-quoted string with `vi"`.
Note that this works even if you're not already inside a quoted string.
For example, you can replace everything inside a single-quoted string in the current line, from wherever the cursor is, with `ci'`.
## Known issues ## Known issues
### Low `$KEYTIMEOUT` ### Low `$KEYTIMEOUT`

View file

@ -37,6 +37,7 @@ function _wd() {
'rm:Removes the given warp point' 'rm:Removes the given warp point'
'list:Outputs all stored warp points' 'list:Outputs all stored warp points'
'ls:Show files from given warp point' 'ls:Show files from given warp point'
'open:Open warp point in the default file explorer'
'path:Show path to given warp point' 'path:Show path to given warp point'
'show:Outputs all warp points that point to the current directory or shows a specific target directory for a point' 'show:Outputs all warp points that point to the current directory or shows a specific target directory for a point'
'help:Show this extremely helpful text' 'help:Show this extremely helpful text'
@ -73,6 +74,9 @@ function _wd() {
ls) ls)
_describe -t points "Warp points" warp_points && ret=0 _describe -t points "Warp points" warp_points && ret=0
;; ;;
open)
_describe -t points "Warp points" warp_points && ret=0
;;
path) path)
_describe -t points "Warp points" warp_points && ret=0 _describe -t points "Warp points" warp_points && ret=0
;; ;;

View file

@ -8,7 +8,7 @@
# @github.com/mfaerevaag/wd # @github.com/mfaerevaag/wd
# version # version
readonly WD_VERSION=0.9.3 readonly WD_VERSION=0.10.0
# colors # colors
readonly WD_BLUE="\033[96m" readonly WD_BLUE="\033[96m"
@ -86,6 +86,7 @@ Commands:
show Print warp points to current directory show Print warp points to current directory
list Print all stored warp points list Print all stored warp points
ls <point> Show files from given warp point (ls) ls <point> Show files from given warp point (ls)
open <point> Open the warp point in the default file explorer (open / xdg-open)
path <point> Show the path to given warp point (pwd) path <point> Show the path to given warp point (pwd)
clean Remove points warping to nonexistent directories (will prompt unless --force is used) clean Remove points warping to nonexistent directories (will prompt unless --force is used)
@ -377,6 +378,21 @@ wd_ls()
ls "${dir/#\~/$HOME}" ls "${dir/#\~/$HOME}"
} }
wd_open()
{
wd_getdir "$1"
if command -v open >/dev/null 2>&1; then
# MacOS, Ubuntu (alias)
open "${dir/#\~/$HOME}"
elif command -v xdg-open >/dev/null 2>&1; then
# Most Linux desktops
xdg-open "${dir/#\~/$HOME}"
else
echo "No known file opener found (need 'open' or 'xdg-open')." >&2
exit 1
fi
}
wd_path() wd_path()
{ {
wd_getdir "$1" wd_getdir "$1"
@ -521,7 +537,7 @@ do
done < "$wd_config_file" done < "$wd_config_file"
# get opts # get opts
args=$(getopt -o a:r:c:lhs -l add:,rm:,clean,list,ls:,path:,help,show -- $*) args=$(getopt -o a:r:c:lhs -l add:,rm:,clean,list,ls:,open:,path:,help,show -- $*)
# check if no arguments were given, and that version is not set # check if no arguments were given, and that version is not set
if [[ ($? -ne 0 || $#* -eq 0) && -z $wd_print_version ]] if [[ ($? -ne 0 || $#* -eq 0) && -z $wd_print_version ]]
@ -571,6 +587,10 @@ else
wd_ls "$2" wd_ls "$2"
break break
;; ;;
"-o"|"--open"|"open")
wd_open "$2"
break
;;
"-p"|"--path"|"path") "-p"|"--path"|"path")
wd_path "$2" wd_path "$2"
break break

View file

@ -1,6 +1,6 @@
MIT License MIT License
Copyright (c) 2018-2024 Alexandros Kozak Copyright (c) 2018-2025 Alexandros Kozak
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

View file

@ -4,7 +4,7 @@
# #
# https://github.com/agkozak/zsh-z # https://github.com/agkozak/zsh-z
# #
# Copyright (c) 2018-2024 Alexandros Kozak # Copyright (c) 2018-2025 Alexandros Kozak
# #
# Permission is hereby granted, free of charge, to any person obtaining a copy # Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal # of this software and associated documentation files (the "Software"), to deal
@ -294,7 +294,16 @@ zshz() {
owner=${ZSHZ_OWNER:-${_Z_OWNER}} owner=${ZSHZ_OWNER:-${_Z_OWNER}}
if (( ZSHZ[USE_FLOCK] )); then if (( ZSHZ[USE_FLOCK] )); then
${ZSHZ[MV]} "$tempfile" "$datafile" 2> /dev/null || ${ZSHZ[RM]} -f "$tempfile" # An unsual case: if inside Docker container where datafile could be bind
# mounted
if [[ -r '/proc/1/cgroup' && "$(< '/proc/1/cgroup')" == *docker* ]]; then
print "$(< "$tempfile")" > "$datafile" 2> /dev/null
${ZSHZ[RM]} -f "$tempfile"
# All other cases
else
${ZSHZ[MV]} "$tempfile" "$datafile" 2> /dev/null ||
${ZSHZ[RM]} -f "$tempfile"
fi
if [[ -n $owner ]]; then if [[ -n $owner ]]; then
${ZSHZ[CHOWN]} ${owner}:"$(id -ng ${owner})" "$datafile" ${ZSHZ[CHOWN]} ${owner}:"$(id -ng ${owner})" "$datafile"

View file

@ -36,12 +36,12 @@ CURRENT_BG='NONE'
case ${SOLARIZED_THEME:-dark} in case ${SOLARIZED_THEME:-dark} in
light) light)
CURRENT_FG='white' CURRENT_FG=${CURRENT_FG:-'white'}
CURRENT_DEFAULT_FG='white' CURRENT_DEFAULT_FG=${CURRENT_DEFAULT_FG:-'white'}
;; ;;
*) *)
CURRENT_FG='black' CURRENT_FG=${CURRENT_FG:-'black'}
CURRENT_DEFAULT_FG='default' CURRENT_DEFAULT_FG=${CURRENT_DEFAULT_FG:-'default'}
;; ;;
esac esac

View file

@ -11,11 +11,11 @@ function _prompt_char() {
# This theme works with both the "dark" and "light" variants of the # This theme works with both the "dark" and "light" variants of the
# Solarized color schema. Set the SOLARIZED_THEME variable to one of # Solarized color schema. Set the SOLARIZED_THEME variable to one of
# these two values to choose. If you don't specify, we'll assume you're # these two values to choose. If you don't specify, we'll assume you're
# using the "dark" variant. # using neither variant.
case ${SOLARIZED_THEME:-dark} in case ${SOLARIZED_THEME:-dark} in
light) bkg=white;; light) bkg=white;;
*) bkg=black;; *) bkg=default;;
esac esac
ZSH_THEME_GIT_PROMPT_PREFIX=" [%{%B%F{blue}%}" ZSH_THEME_GIT_PROMPT_PREFIX=" [%{%B%F{blue}%}"