Merge branch 'ohmyzsh:master' into master

This commit is contained in:
Shubham Tiwary 2025-06-07 13:42:16 +05:30 committed by GitHub
commit 6c43e25ae2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
65 changed files with 1390 additions and 417 deletions

View file

@ -36,14 +36,18 @@ alias-finder() {
# make filter to find only shorter results than current cmd
if [[ $cheaper == true ]]; then
cmdLen=$(echo -n "$cmd" | wc -c)
filter="^'{0,1}.{0,$((cmdLen - 1))}="
if [[ $cmdLen -le 1 ]]; then
return
fi
filter="^'?.{1,$((cmdLen - 1))}'?=" # some aliases is surrounded by single quotes
fi
alias | grep -E "$filter" | grep -E "=$finder"
if [[ $exact == true ]]; then
break # because exact case is only one
elif [[ $longer = true ]]; then
elif [[ $longer == true ]]; then
break # because above grep command already found every longer aliases during first cycle
fi

View file

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

View file

@ -1,32 +1,48 @@
## asdf
# asdf
Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more.
### Installation
## Installation
1. [Download asdf](https://asdf-vm.com/guide/getting-started.html#_2-download-asdf) by running the following:
```
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
```
2. [Enable asdf](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf) by adding it to your `plugins` definition in `~/.zshrc`.
```
plugins=(asdf)
```
### Usage
See the [asdf documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to use asdf:
1. [Install](https://asdf-vm.com/guide/getting-started.html#_1-install-asdf) asdf and ensure that's it's discoverable on `$PATH`;
2. Enable it by adding it to your `plugins` definition in `~/.zshrc`:
```sh
plugins=(asdf)
```
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
## Usage
Refer to the [asdf plugin documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to add a plugin and install the many runtime versions for it.
Example for installing the nodejs plugin and the many runtimes for it:
```sh
# Add plugin to asdf
asdf plugin add nodejs
# Install the latest available version
asdf install nodejs latest
asdf global nodejs latest
asdf local nodejs latest
# Uninstall the latest version
asdf uninstall nodejs latest
# Install a specific version
asdf install nodejs 16.5.0
# Set the latest version in .tool-versions of the `current directory`
asdf set nodejs latest
# Set a specific version in the `parent directory`
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
```
### Maintainer
For more commands, run `asdf help` or refer to the
[asdf CLI documentation](https://asdf-vm.com/manage/commands.html#all-commands).
## Maintainer
- [@RobLoach](https://github.com/RobLoach)

View file

@ -1,48 +1,13 @@
if (( $+commands[asdf] )); then
export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
path=("$ASDF_DATA_DIR/shims" $path)
(( ! $+commands[asdf] )) && return
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `asdf`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
typeset -g -A _comps
autoload -Uz _asdf
_comps[asdf]=_asdf
fi
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|
export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
path=("$ASDF_DATA_DIR/shims" $path)
return
fi
# TODO:(2025-02-12): remove deprecated asdf <0.16 code
# Find where asdf should be installed
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
ASDF_COMPLETIONS="$ASDF_DIR/completions"
if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/_asdf" ]]; then
# If not found, check for archlinux/AUR package (/opt/asdf-vm/)
if [[ -f "/opt/asdf-vm/asdf.sh" ]]; then
ASDF_DIR="/opt/asdf-vm"
ASDF_COMPLETIONS="$ASDF_DIR"
# If not found, check for Homebrew package
elif (( $+commands[brew] )); then
_ASDF_PREFIX="$(brew --prefix asdf)"
ASDF_DIR="${_ASDF_PREFIX}/libexec"
ASDF_COMPLETIONS="${_ASDF_PREFIX}/share/zsh/site-functions"
unset _ASDF_PREFIX
else
return
fi
fi
# Load command
if [[ -f "$ASDF_DIR/asdf.sh" ]]; then
source "$ASDF_DIR/asdf.sh"
# Load completions
if [[ -f "$ASDF_COMPLETIONS/_asdf" ]]; then
fpath+=("$ASDF_COMPLETIONS")
autoload -Uz _asdf
compdef _asdf asdf # compdef is already loaded before loading plugins
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `asdf`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
typeset -g -A _comps
autoload -Uz _asdf
_comps[asdf]=_asdf
fi
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|

View file

@ -62,7 +62,7 @@ function bgnotify_formatted {
function bgnotify_appid {
if (( ${+commands[osascript]} )); then
osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null
elif [[ -n $WAYLAND_DISPLAY ]] && (( ${+commands[swaymsg]} )); then # wayland+sway
elif [[ -n $WAYLAND_DISPLAY ]] && ([[ -n $SWAYSOCK ]] || [[ -n $I3SOCK ]]) && (( ${+commands[swaymsg]} )); then # wayland+sway
local app_id=$(bgnotify_find_sway_appid)
[[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS
elif [[ -z $WAYLAND_DISPLAY ]] && [[ -n $DISPLAY ]] && (( ${+commands[xprop]} )); then

View file

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

View file

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

View file

@ -60,3 +60,46 @@ to `/usr` again.
After that, <kbd>Alt</kbd> + <kbd>Down</kbd> will probably go to `/usr/bin` if `bin` is the first directory in alphabetical
order (depends on your `/usr` folder structure). <kbd>Alt</kbd> + <kbd>Up</kbd> will return to `/usr`, and once more will get
you to the root folder (`/`).
### cde
This plugin also provides a `cde` alias that allows you to change to a directory without clearing the next directory stack.
This changes the default behavior of `dirhistory`, which is to clear the next directory stack when changing directories.
For example, if the shell was started, and the following commands were entered:
```shell
cd ~
cd /usr
cd share
cd doc
# <Alt + Left>
# <Alt + Left>
```
The directory stack would look like this:
```sh
➜ /usr typeset -pm dirhistory_\*
typeset -ax dirhistory_past=( /home/user /usr )
typeset -ax dirhistory_future=( /usr/share/doc /usr/share )
```
This means that pressing <kbd>Alt</kbd> + <kbd>Right</kbd>, you'd go to `/usr/share` and `/usr/share/doc` (the "future" directories).
If you run `cd /usr/bin`, the "future" directories will be removed, and you won't be able to access them with <kbd>Alt</kbd> + <kbd>Right</kbd>:
```sh
➜ /u/bin typeset -pm dirhistory_\*
typeset -ax dirhistory_past=( /home/user /usr )
typeset -ax dirhistory_future=( /usr/bin )
```
If you instead run `cde /usr/bin`, the "future" directories will be preserved:
```sh
➜ /u/bin typeset -pm dirhistory_\*
typeset -ax dirhistory_past=( /home/user /usr /usr/bin )
typeset -ax dirhistory_future=( /usr/share/doc /usr/share )
```

View file

@ -11,9 +11,10 @@ dirhistory_past=($PWD)
dirhistory_future=()
export dirhistory_past
export dirhistory_future
export DIRHISTORY_SIZE=30
alias cde='dirhistory_cd'
# Pop the last element of dirhistory_past.
# Pass the name of the variable to return the result in.
# Returns the element if the array was not empty,
@ -136,7 +137,11 @@ for keymap in emacs vicmd viins; do
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[D" dirhistory_zle_dirhistory_back ;; # iTerm2
ghostty) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # ghostty
iTerm.app)
bindkey -M $keymap "^[^[[D" dirhistory_zle_dirhistory_back
bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back
;;
esac
if (( ${+terminfo[kcub1]} )); then
@ -151,7 +156,11 @@ for keymap in emacs vicmd viins; do
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[C" dirhistory_zle_dirhistory_future ;; # iTerm2
ghostty) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # ghostty
iTerm.app)
bindkey -M $keymap "^[^[[C" dirhistory_zle_dirhistory_future
bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future
;;
esac
if (( ${+terminfo[kcuf1]} )); then
@ -200,6 +209,7 @@ for keymap in emacs vicmd viins; do
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[[A" dirhistory_zle_dirhistory_up ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[A" dirhistory_zle_dirhistory_up ;; # iTerm2
ghostty) bindkey -M $keymap "^[[1;3A" dirhistory_zle_dirhistory_up ;; # ghostty
esac
if (( ${+terminfo[kcuu1]} )); then
@ -215,6 +225,7 @@ for keymap in emacs vicmd viins; do
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[[B" dirhistory_zle_dirhistory_down ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[B" dirhistory_zle_dirhistory_down ;; # iTerm2
ghostty) bindkey -M $keymap "^[[1;3B" dirhistory_zle_dirhistory_down ;; # ghostty
esac
if (( ${+terminfo[kcud1]} )); then

View file

@ -38,7 +38,7 @@ _dnf5_rpm_files() {
_dnf5_packages_or_rpms() {
if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
_dnf_rpm_files
_dnf5_rpm_files
else
_dnf5_packages "$@"
fi

View file

@ -39,6 +39,10 @@ following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more
zstyle ':omz:plugins:docker' legacy-completion yes
```
### For Podman's Docker wrapper users
If you use Podman's Docker wrapper, you need to enable legacy completion. See above section.
## Aliases
| Alias | Command | Description |
@ -73,6 +77,7 @@ zstyle ':omz:plugins:docker' legacy-completion yes
| drs | `docker container restart` | Restart one or more containers |
| dsta | `docker stop $(docker ps -q)` | Stop all running containers |
| dstp | `docker container stop` | Stop one or more running containers |
| dsts | `docker stats` | Display real-time streaming statistics for containers |
| dtop | `docker top` | Display the running processes of a container |
| dvi | `docker volume inspect` | Display detailed information about one or more volumes |
| dvls | `docker volume ls` | List all the volumes known to docker |

View file

@ -28,6 +28,7 @@ alias dst='docker container start'
alias drs='docker container restart'
alias dsta='docker stop $(docker ps -q)'
alias dstp='docker container stop'
alias dsts='docker stats'
alias dtop='docker top'
alias dvi='docker volume inspect'
alias dvls='docker volume ls'

View file

@ -23,3 +23,4 @@ plugins=(... dotnet)
| dp | dotnet pack | Create a NuGet package. |
| dng | dotnet nuget | Provides additional NuGet commands. |
| 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 dng='dotnet nuget'
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'
# Emacs ANSI Term tracking
if [[ -n "$INSIDE_EMACS" ]]; then
if [[ -n "$INSIDE_EMACS" ]] && [[ "$INSIDE_EMACS" != "vterm" ]]; then
chpwd_emacs() { print -P "\033AnSiTc %d"; }
print -P "\033AnSiTc %d" # Track current working directory
print -P "\033AnSiTu %n" # Track username

View file

@ -23,9 +23,10 @@ def get_tagname_or_hash():
return hash_
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():
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()
stash_file = '%s%s' % (so.decode('utf-8').rstrip(), '/logs/refs/stash')
@ -35,7 +36,6 @@ def get_stash():
except IOError:
return 0
# `git status --porcelain --branch` can collect all information
# 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)

View file

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

View file

@ -26,6 +26,7 @@ This plugin supplies one command, `jira`, through which all its features are exp
| `jira new` | Opens a new Jira issue dialogue |
| `jira ABC-123` | Opens an existing issue |
| `jira ABC-123 m` | Opens an existing issue for adding a comment |
| `jira project ABC` | Opens JIRA project summary |
| `jira dashboard [rapid_view]` | Opens your JIRA dashboard |
| `jira mine` | Queries for your own issues |
| `jira tempo` | Opens your JIRA Tempo |

View file

@ -5,6 +5,7 @@ local -a _1st_arguments
_1st_arguments=(
'new:create a new issue'
'mine:open my issues'
'project:open the project'
'dashboard:open the dashboard'
'tempo:open the tempo'
'reported:search for issues reported by a user'

View file

@ -8,6 +8,7 @@ jira Performs the default action
jira new Opens a new Jira issue dialogue
jira ABC-123 Opens an existing issue
jira ABC-123 m Opens an existing issue for adding a comment
jira project ABC Opens JIRA project summary
jira dashboard [rapid_view] Opens your JIRA dashboard
jira mine Queries for your own issues
jira tempo Opens your JIRA Tempo
@ -88,6 +89,9 @@ function jira() {
elif [[ "$action" == "mine" ]]; then
echo "Opening my issues"
open_command "${jira_url}/issues/?filter=-1"
elif [[ "$action" == "project" ]]; then
echo "Opening project"
open_command "${jira_url}/jira/software/c/projects/${2}/summary"
elif [[ "$action" == "dashboard" ]]; then
echo "Opening dashboard"
if [[ "$JIRA_RAPID_BOARD" == "true" ]]; then

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -13,6 +13,7 @@ plugins=(... macos)
- [iTerm2](https://iterm2.com/)
- [Hyper](https://hyper.is/)
- [Tabby](https://tabby.sh/)
- [Ghostty](https://ghostty.org)
## Commands

View file

@ -85,6 +85,12 @@ EOF
tell application "System Events"
tell process "Tabby" to keystroke "t" using command down
end tell
EOF
elif [[ "$the_app" == 'ghostty' ]]; then
osascript >/dev/null <<EOF
tell application "System Events"
tell process "Ghostty" to keystroke "t" using command down
end tell
EOF
else
echo "$0: unsupported terminal app: $the_app" >&2
@ -139,6 +145,12 @@ EOF
tell application "System Events"
tell process "Tabby" to keystroke "D" using command down
end tell
EOF
elif [[ "$the_app" == 'ghostty' ]]; then
osascript >/dev/null <<EOF
tell application "System Events"
tell process "Ghostty" to keystroke "D" using command down
end tell
EOF
else
echo "$0: unsupported terminal app: $the_app" >&2
@ -194,6 +206,12 @@ EOF
tell application "System Events"
tell process "Tabby" to keystroke "d" using command down
end tell
EOF
elif [[ "$the_app" == 'ghostty' ]]; then
osascript >/dev/null <<EOF
tell application "System Events"
tell process "Ghostty" to keystroke "d" using command down
end tell
EOF
else
echo "$0: unsupported terminal app: $the_app" >&2
@ -253,7 +271,7 @@ function man-preview() {
[[ $# -eq 0 ]] && >&2 echo "Usage: $0 command1 [command2 ...]" && return 1
local page
for page in "${(@f)"$(man -w $@)"}"; do
for page in "${(@f)"$(command man -w $@)"}"; do
command mandoc -Tpdf $page | open -f -a Preview
done
}

View file

@ -146,6 +146,16 @@ case $state in
(help)
_arguments ':feature:__task_list'
;;
(format)
_arguments -C \
'--check-formatted' \
'--dot-formatter' \
'--dry-run' \
'--force' \
'--migrate' \
'--no-exit' \
'*::file:_files'
;;
(test)
_files
;;

View file

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

View file

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

View file

@ -20,17 +20,17 @@ the next time you autocomplete `pip install`.
## Aliases
| Alias | Description |
| :------- | :-------------------------------------------- |
| pipi | Install packages |
| pipig | Install package from GitHub repository |
| pipigb | Install package from GitHub branch |
| pipigp | Install package from GitHub pull request |
| pipu | Upgrade packages |
| pipun | Uninstall packages |
| pipgi | Grep through installed packages |
| piplo | List outdated packages |
| pipreq | Create requirements file |
| pipir | Install packages from `requirements.txt` file |
| pipupall | Update all installed packages |
| pipunall | Uninstall all installed packages |
| Alias | Command | Description |
| :--------|:----------------------------------------------------------------------------------|:--------------------------------------------- |
| pipi | `pip install` | Install packages |
| pipig | `pip install "git+https://github.com/user/repo.git"` | Install package from GitHub repository |
| pipigb | `pip install "git+https://github.com/user/repo.git@branch"` | Install package from GitHub branch |
| pipigp | `pip install "git+https://github.com/user/repo.git@refs/pull/PR_NUMBER/head"` | Install package from GitHub pull request |
| pipu | `pip install --upgrade` | Upgrade packages |
| pipun | `pip uninstall` | Uninstall packages |
| pipgi | `pip freeze \| grep` | Grep through installed packages |
| piplo | `pip list --outdated` | List outdated packages |
| pipreq | `pip freeze > requirements.txt` | Create requirements file |
| pipir | `pip install -r requirements.txt` | Install packages from `requirements.txt` file |
| pipupall | `pip list --outdated \| awk 'NR > 2 { print $1 }' \| xargs pip install --upgrade` | Update 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
# 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
typeset -g -A _comps
autoload -Uz _procs
_comps[procs]=_procs
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
in subdirectories).
- 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
`PYTHON_VENV_NAME=<venv-name>`. For example: `PYTHON_VENV_NAME=".venv"`

View file

@ -8,7 +8,7 @@ function quote {
# Get random quote data
local data
data="$(command curl -s --connect-timeout 2 "http://www.quotationspage.com/random.php" \
data="$(command curl -s --connect-timeout 2 "https://www.quotationspage.com/random.php" \
| iconv -c -f ISO-8859-1 -t UTF-8 \
| command grep -a -m 1 'dt class="quote"')"

View file

@ -1,16 +1,26 @@
# 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
plugins=(... rsync)
```
| Alias | Command |
| ------------------- | ------------------------------------------------ |
| *rsync-copy* | `rsync -avz --progress -h` |
| *rsync-move* | `rsync -avz --progress -h --remove-source-files` |
| *rsync-update* | `rsync -avzu --progress -h` |
| *rsync-synchronize* | `rsync -avzu --delete --progress -h` |
| Alias | Command | Description |
| ------------------- | ------------------------------------------------ | ------------|
| `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` | Same as rsync-copy, but removes the source files after a successful transfer (effectively performing a move). |
| `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` | 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
| Alias | Command |
|---------|----------------------------------|
| `tf` | `terraform` |
| `tfa` | `terraform apply` |
| `tfaa` | `terraform apply -auto-approve` |
| `tfc` | `terraform console` |
| `tfd` | `terraform destroy` |
| `tfd!` | `terraform destroy -auto-approve`|
| `tff` | `terraform fmt` |
| `tffr` | `terraform fmt -recursive` |
| `tfi` | `terraform init` |
| `tfiu` | `terraform init -upgrade` |
| `tfo` | `terraform output` |
| `tfp` | `terraform plan` |
| `tfv` | `terraform validate` |
| `tfs` | `terraform state` |
| `tft` | `terraform test` |
| `tfsh` | `terraform show` |
| Alias | Command |
| ------- | -------------------------------------- |
| `tf` | `terraform` |
| `tfa` | `terraform apply` |
| `tfaa` | `terraform apply -auto-approve` |
| `tfc` | `terraform console` |
| `tfd` | `terraform destroy` |
| `tfd!` | `terraform destroy -auto-approve` |
| `tff` | `terraform fmt` |
| `tffr` | `terraform fmt -recursive` |
| `tfi` | `terraform init` |
| `tfir` | `terraform init -reconfigure` |
| `tfiu` | `terraform init -upgrade` |
| `tfiur` | `terraform init -upgrade -reconfigure` |
| `tfo` | `terraform output` |
| `tfp` | `terraform plan` |
| `tfv` | `terraform validate` |
| `tfs` | `terraform state` |
| `tft` | `terraform test` |
| `tfsh` | `terraform show` |
## Prompt function

View file

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

View file

@ -31,6 +31,7 @@ The plugin also supports the following:
| Variable | Description |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `ZSH_TMUX_AUTOREFRESH` | Automatically refresh global environments (default: `false`) |
| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) |
| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) |
| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) |

View file

@ -15,6 +15,8 @@ fi
: ${ZSH_TMUX_AUTOQUIT:=$ZSH_TMUX_AUTOSTART}
# Automatically name the new session based on the basename of PWD
: ${ZSH_TMUX_AUTONAME_SESSION:=false}
# Automatically pick up tmux environments
: ${ZSH_TMUX_AUTOREFRESH:=false}
# Set term to screen or screen-256color based on current terminal support
: ${ZSH_TMUX_DETACHED:=false}
# Set detached mode
@ -158,6 +160,15 @@ function _zsh_tmux_plugin_run() {
fi
}
# Refresh tmux environment variables.
function _zsh_tmux_plugin_preexec()
{
local -a tmux_cmd
tmux_cmd=(command tmux)
eval $($tmux_cmd show-environment -s)
}
# Use the completions for tmux for our function
compdef _tmux _zsh_tmux_plugin_run
# Alias tmux to our wrapper function.
@ -184,3 +195,9 @@ if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z
_zsh_tmux_plugin_run
fi
fi
# Automatically refresh tmux environments if tmux is running.
if [[ -n "$TMUX" && "$ZSH_TMUX_AUTOREFRESH" == "true" ]] && tmux ls >/dev/null 2>/dev/null; then
autoload -U add-zsh-hook
add-zsh-hook preexec _zsh_tmux_plugin_preexec
fi

View file

@ -1,46 +1,76 @@
# universalarchive plugin
Lets you compress files by a command `ua <format> <files>`, supporting various
compression formats (e.g. 7z, tar.gz, lzma, ...).
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.
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
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
Run `ua <format> <files>` to compress `<files>` into an archive file using `<format>`.
For example:
Basic command format:
```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 |
|:-----------------|:-------------------------------|
| `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 |
If the output file already exists, a unique filename is generated using `mktemp`.
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

@ -3,6 +3,8 @@ if (( ! ${+commands[uv]} )); then
return
fi
alias uv="noglob uv"
alias uva='uv add'
alias uvexp='uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet'
alias uvl='uv lock'

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
`INSERT_MODE_INDICATORS` (*Insert mode*) variables.
This settings support Prompt Expansion sequences. For example:
These settings support Prompt Expansion sequences. For example:
```zsh
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
(`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
### Low `$KEYTIMEOUT`

View file

@ -37,6 +37,7 @@ function _wd() {
'rm:Removes the given warp point'
'list:Outputs all stored warp points'
'ls:Show files from given warp point'
'open:Open warp point in the default file explorer'
'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'
'help:Show this extremely helpful text'
@ -73,6 +74,9 @@ function _wd() {
ls)
_describe -t points "Warp points" warp_points && ret=0
;;
open)
_describe -t points "Warp points" warp_points && ret=0
;;
path)
_describe -t points "Warp points" warp_points && ret=0
;;

View file

@ -8,7 +8,7 @@
# @github.com/mfaerevaag/wd
# version
readonly WD_VERSION=0.9.3
readonly WD_VERSION=0.10.0
# colors
readonly WD_BLUE="\033[96m"
@ -86,6 +86,7 @@ Commands:
show Print warp points to current directory
list Print all stored warp points
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)
clean Remove points warping to nonexistent directories (will prompt unless --force is used)
@ -377,6 +378,21 @@ wd_ls()
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_getdir "$1"
@ -521,7 +537,7 @@ do
done < "$wd_config_file"
# 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
if [[ ($? -ne 0 || $#* -eq 0) && -z $wd_print_version ]]
@ -571,6 +587,10 @@ else
wd_ls "$2"
break
;;
"-o"|"--open"|"open")
wd_open "$2"
break
;;
"-p"|"--path"|"path")
wd_path "$2"
break

View file

@ -1,6 +1,6 @@
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
of this software and associated documentation files (the "Software"), to deal

View file

@ -4,7 +4,7 @@
#
# 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
# of this software and associated documentation files (the "Software"), to deal
@ -294,7 +294,16 @@ zshz() {
owner=${ZSHZ_OWNER:-${_Z_OWNER}}
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
${ZSHZ[CHOWN]} ${owner}:"$(id -ng ${owner})" "$datafile"