Merge branch 'master' into patch-1

This commit is contained in:
NanoNova 2025-08-21 12:27:33 +08:00 committed by GitHub
commit 15c79fc9c6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
80 changed files with 1608 additions and 526 deletions

87
.github/INCIDENT_RESPONSE_PLAN.md vendored Normal file
View file

@ -0,0 +1,87 @@
# Incident Response Plan
## Reporting a Vulnerability
Please see [the latest guidelines](https://github.com/ohmyzsh/ohmyzsh/blob/master/SECURITY.md) for instructions.
## Phases
### Triage
1. Is this a valid security vulnerability?
- [ ] It affects our CI/CD or any of our repositories.
- [ ] For ohmyzsh/ohmyzsh, it affects the latest commit.
- [ ] For others, it affects the latest commit on the default branch.
- [ ] It affects a third-party dependency:
- [ ] Zsh or git
- [ ] For a plugin, the vulnerability is a result of our usage of the dependency.
2. What's the scope of the vulnerability?
- [ ] Our codebase.
- [ ] A direct third-party dependency (Zsh, git, other plugins).
- [ ] An indirect third-party dependency.
- [ ] Out of scope, a third-party dependency that is the responsibility of the user.
- [ ] Out of scope, any other case (edit this plan and add the details).
3. Is the vulnerability actionable?
- [ ] Yes, we can submit a fix.
- [ ] Yes, we can disable a feature.
- [ ] Yes, we can mitigate the risk.
- [ ] Yes, we can remove a vulnerable dependency.
- [ ] Yes, we can apply a workaround.
- [ ] Yes, we can apply a patch to a vulnerable dependency ([example for CVE-2021-45444](https://github.com/ohmyzsh/ohmyzsh/blob/cb72d7dcbf08b435c7f8a6470802b207b2aa02c3/lib/vcs_info.zsh)).
- [ ] No, the vulnerability is not actionable.
4. What's the impact of the vulnerability?
Assess using the *CIA* triad:
- **Confidentiality**: example: report or sharing of secrets.
- **Integrity**: affects the integrity of the system (deletion, corruption or encryption of data, OS file corruption, etc.).
- **Availability**: denial of login, deletion of required files to boot / login, etc.
5. What's the exploitability of the vulnerability?
Consider how easy it is to exploit, and if it affects all users or requires specific configurations.
6. What's the severity of the vulnerability?
You can use the [CVSS v3.1](https://www.first.org/cvss/specification-document) to assess the severity of the vulnerability.
7. When was the vulnerability introduced?
- Find the responsible code path.
- Find the commit or Pull Request that introduced the vulnerability.
8. Who are our security contacts?
Assess upstream or downstream contacts, and their desired channels of security.
> TODO: add a list of contacts.
### Mitigation
- **Primary focus:** removing possibility of exploitation fast.
- **Secondary focus:** addressing the root cause.
> [!IMPORTANT]
> Make sure to test that the mitigation works as expected, and does not introduce new vulnerabilities.
> When deploying a patch, make sure not to disclose the vulnerability in the commit message or PR description.
> TODO: introduce a fast-track update process for security patches.
### Disclosure
Primary goal: inform our users about the vulnerability, and whether they are affected or not affected based on information they should be able to check themselves in a straightforward way.
> TODO: add a vulnerability disclosure template.
### Learn
- Document the vulnerability, steps performed, and lessons learned.
- Document the timeline of events.
- Document and address improvements on the Security Incident Response Plan.
- Depending on the severity of the vulnerability, consider disclosing the root cause or not based on likely impact on users and estimated potential victims still affected.

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.1
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

@ -4,6 +4,9 @@ on:
schedule: schedule:
- cron: "0 6 * * 0" - cron: "0 6 * * 0"
permissions:
contents: read
jobs: jobs:
check: check:
name: Check for updates name: Check for updates
@ -11,15 +14,15 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Authenticate as @ohmyzsh - name: Authenticate as @ohmyzsh
id: generate_token id: generate-token
uses: ohmyzsh/github-app-token@v2 uses: actions/create-github-app-token@v2
with: with:
app_id: ${{ secrets.OHMYZSH_APP_ID }} app-id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Setup Python - name: Setup Python
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
@ -27,7 +30,7 @@ jobs:
cache: "pip" cache: "pip"
- name: Process dependencies - name: Process dependencies
env: env:
GH_TOKEN: ${{ steps.generate_token.outputs.token }} GH_TOKEN: ${{ steps.generate-token.outputs.token }}
GIT_APP_NAME: ohmyzsh[bot] GIT_APP_NAME: ohmyzsh[bot]
GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com
TMP_DIR: ${{ runner.temp }} TMP_DIR: ${{ runner.temp }}

View file

@ -1,7 +1,7 @@
certifi==2025.1.31 certifi==2025.8.3
charset-normalizer==3.4.1 charset-normalizer==3.4.3
idna==3.10 idna==3.10
PyYAML==6.0.2 PyYAML==6.0.2
requests==2.32.3 requests==2.32.4
semver==3.0.4 semver==3.0.4
urllib3==2.3.0 urllib3==2.5.0

View file

@ -26,7 +26,7 @@ jobs:
- macos-latest - macos-latest
steps: steps:
- name: Set up git repository - name: Set up git repository
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install zsh - name: Install zsh
if: runner.os == 'Linux' if: runner.os == 'Linux'
run: sudo apt-get update; sudo apt-get install zsh run: sudo apt-get update; sudo apt-get install zsh
@ -42,7 +42,7 @@ jobs:
- test - test
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install Vercel CLI - name: Install Vercel CLI
run: npm install -g vercel run: npm install -g vercel
- name: Setup project and deploy - name: Setup project and deploy

View file

@ -24,7 +24,7 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Set up git repository - name: Set up git repository
uses: actions/checkout@v4 uses: actions/checkout@v5
- name: Install zsh - name: Install zsh
run: sudo apt-get update; sudo apt-get install zsh run: sudo apt-get update; sudo apt-get install zsh
- name: Check syntax - name: Check syntax

View file

@ -17,13 +17,13 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Authenticate as @ohmyzsh - name: Authenticate as @ohmyzsh
id: generate_token id: generate-token
uses: ohmyzsh/github-app-token@v2 uses: actions/create-github-app-token@v2
with: with:
app_id: ${{ secrets.OHMYZSH_APP_ID }} app-id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }} private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Store app token - name: Store app token
run: echo "GH_TOKEN=${{ steps.generate_token.outputs.token }}" >> "$GITHUB_ENV" run: echo "GH_TOKEN=${{ steps.generate-token.outputs.token }}" >> "$GITHUB_ENV"
- name: Read project data - name: Read project data
env: env:
ORGANIZATION: ohmyzsh ORGANIZATION: ohmyzsh

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"/:::))
@ -193,7 +197,7 @@ EOF
return 1 return 1
fi fi
"$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format" ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
} }
function _omz::plugin { function _omz::plugin {
@ -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

@ -40,7 +40,7 @@ fi
# disable named-directories autocompletion # disable named-directories autocompletion
zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories
# Use caching so that commands like apt and dpkg complete are useable # Use caching so that commands like apt and dpkg complete are usable
zstyle ':completion:*' use-cache yes zstyle ':completion:*' use-cache yes
zstyle ':completion:*' cache-path $ZSH_CACHE_DIR zstyle ':completion:*' cache-path $ZSH_CACHE_DIR

View file

@ -23,6 +23,9 @@ function open_command() {
linux*) [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || { linux*) [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || {
open_cmd='cmd.exe /c start ""' open_cmd='cmd.exe /c start ""'
[[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 } [[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 }
[[ "$1" = (http|https)://* ]] && {
1="$(echo "$1" | sed -E 's/([&|()<>^])/^\1/g')" || return 1
}
} ;; } ;;
msys*) open_cmd='start ""' ;; msys*) open_cmd='start ""' ;;
*) echo "Platform $OSTYPE not supported" *) echo "Platform $OSTYPE not supported"

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

@ -117,7 +117,7 @@ bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backwa
bindkey ' ' magic-space # [Space] - don't do history expansion bindkey ' ' magic-space # [Space] - don't do history expansion
# Edit the current command line in $EDITOR # Edit the current command line in $VISUAL (or $EDITOR / `vi` if not set)
autoload -U edit-command-line autoload -U edit-command-line
zle -N edit-command-line zle -N edit-command-line
bindkey '\C-x\C-e' edit-command-line bindkey '\C-x\C-e' edit-command-line

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
;; ;;
@ -53,7 +53,7 @@ function omz_termsupport_precmd {
# Runs before executing the command # Runs before executing the command
function omz_termsupport_preexec { function omz_termsupport_preexec {
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return [[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0
emulate -L zsh emulate -L zsh
setopt extended_glob setopt extended_glob

View file

@ -99,8 +99,8 @@ done
# Figure out the SHORT hostname # Figure out the SHORT hostname
if [[ "$OSTYPE" = darwin* ]]; then if [[ "$OSTYPE" = darwin* ]]; then
# macOS's $HOST changes with dhcp, etc. Use ComputerName if possible. # macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible.
SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}" SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
else else
SHORT_HOST="${HOST/.*/}" SHORT_HOST="${HOST/.*/}"
fi fi
@ -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

@ -11,6 +11,8 @@ plugins=(... alias-finder)
To enable it for every single command, set zstyle in your `~/.zshrc`. To enable it for every single command, set zstyle in your `~/.zshrc`.
If the user has installed `rg`([ripgrep](https://github.com/BurntSushi/ripgrep)), it will be used because it's faster. Otherwise, it will use the `grep` command.
```zsh ```zsh
# ~/.zshrc # ~/.zshrc
@ -28,7 +30,7 @@ When you execute a command alias finder will look at your defined aliases and su
Running the un-aliased `git status` command: Running the un-aliased `git status` command:
```sh ```sh
╭─tim@fox ~/repo/gitopolis main ╭─tim@fox ~/repo/gitopolis main
╰─$ git status ╰─$ git status
gst='git status' # <=== shorter suggestion from alias-finder gst='git status' # <=== shorter suggestion from alias-finder
@ -40,7 +42,7 @@ nothing to commit, working tree clean
Running a shorter `git st` alias from `.gitconfig` that it suggested : Running a shorter `git st` alias from `.gitconfig` that it suggested :
```sh ```sh
╭─tim@fox ~/repo/gitopolis main ╭─tim@fox ~/repo/gitopolis main
╰─$ git st ╰─$ git st
gs='git st' # <=== shorter suggestion from alias-finder gs='git st' # <=== shorter suggestion from alias-finder
## main...origin/main ## main...origin/main
@ -48,7 +50,7 @@ gs='git st' # <=== shorter suggestion from alias-finder
Running the shortest `gs` shell alias that it found: Running the shortest `gs` shell alias that it found:
```sh ```sh
╭─tim@fox ~/repo/gitopolis main ╭─tim@fox ~/repo/gitopolis main
╰─$ gs ╰─$ gs
# <=== no suggestions alias-finder because this is the shortest # <=== no suggestions alias-finder because this is the shortest
## main...origin/main ## main...origin/main

View file

@ -36,14 +36,22 @@ alias-finder() {
# make filter to find only shorter results than current cmd # make filter to find only shorter results than current cmd
if [[ $cheaper == true ]]; then if [[ $cheaper == true ]]; then
cmdLen=$(echo -n "$cmd" | wc -c) 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 fi
alias | grep -E "$filter" | grep -E "=$finder" if (( $+commands[rg] )); then
alias | rg "$filter" | rg "=$finder"
else
alias | grep -E "$filter" | grep -E "=$finder"
fi
if [[ $exact == true ]]; then if [[ $exact == true ]]; then
break # because exact case is only one 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 break # because above grep command already found every longer aliases during first cycle
fi fi

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

@ -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. 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: 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`:
```
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:
```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 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) - [@RobLoach](https://github.com/RobLoach)

View file

@ -1,48 +1,15 @@
if (( $+commands[asdf] )); then (( ! $+commands[asdf] )) && return
export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
path=("$ASDF_DATA_DIR/shims" $path)
# If the completion file doesn't exist yet, we need to autoload it and export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
# 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" &|
return # Add shims to the front of the path, removing if already present.
fi path=("$ASDF_DATA_DIR/shims" ${path:#$ASDF_DATA_DIR/shims})
# TODO:(2025-02-12): remove deprecated asdf <0.16 code # 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.
# Find where asdf should be installed if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}" typeset -g -A _comps
ASDF_COMPLETIONS="$ASDF_DIR/completions" autoload -Uz _asdf
_comps[asdf]=_asdf
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
fi fi
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|

View file

@ -19,6 +19,12 @@ For example:
BATTERY_CHARGING="⚡️" BATTERY_CHARGING="⚡️"
``` ```
You can see the power of your charger using the following setting (MacOS only)
```zsh
BATTERY_SHOW_WATTS=true
```
## Requirements ## Requirements
- On Linux, you must have the `acpi` or `acpitool` commands installed on your operating system. - On Linux, you must have the `acpi` or `acpitool` commands installed on your operating system.

View file

@ -17,8 +17,13 @@
# Modified to add support for OpenBSD # # Modified to add support for OpenBSD #
########################################### ###########################################
: ${BATTERY_SHOW_WATTS:=false}
if [[ "$OSTYPE" = darwin* ]]; then if [[ "$OSTYPE" = darwin* ]]; then
function get_charger_power() {
echo "$(ioreg -rc AppleSmartBattery | grep -o '"Watts"=[0-9]\+' | head -1 | grep -o '[0-9]\+')W "
}
function battery_is_charging() { function battery_is_charging() {
ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes' ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes'
} }
@ -58,7 +63,10 @@ if [[ "$OSTYPE" = darwin* ]]; then
fi fi
echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}" echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}"
else else
echo "${BATTERY_CHARGING-⚡️}" if [[ "${BATTERY_SHOW_WATTS}" = "true" ]] ; then
watts=$(get_charger_power)
fi
echo "${watts}${BATTERY_CHARGING-⚡️}"
fi fi
} }

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

@ -1,7 +1,19 @@
# Copies the contents of a given file to the system or X Windows clipboard # Copies the contents of a given file to the system or X Windows clipboard
# #
# copyfile <file> # Usage: copyfile <file>
function copyfile { function copyfile {
emulate -L zsh emulate -L zsh
if [[ -z "$1" ]]; then
echo "Usage: copyfile <file>"
return 1
fi
if [[ ! -f "$1" ]]; then
echo "Error: '$1' is not a valid file."
return 1
fi
clipcopy $1 clipcopy $1
echo ${(%):-"%B$1%b copied to clipboard."}
} }

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

@ -38,7 +38,7 @@ _dnf5_rpm_files() {
_dnf5_packages_or_rpms() { _dnf5_packages_or_rpms() {
if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
_dnf_rpm_files _dnf5_rpm_files
else else
_dnf5_packages "$@" _dnf5_packages "$@"
fi fi
@ -272,7 +272,7 @@ _dnf5-repoquery() {
for v in enhance obsolete provide recommend require suggest supplement; do for v in enhance obsolete provide recommend require suggest supplement; do
opts+=( "--what${v}s=[limit to packages that $v specified capabilities]:list of capability: ") opts+=( "--what${v}s=[limit to packages that $v specified capabilities]:list of capability: ")
done done
# mutually exclusive formating options # mutually exclusive formatting options
opts+=( opts+=(
+ '(format)' + '(format)'
'--conflicts[display capabilities that the package conflicts with]' '--conflicts[display capabilities that the package conflicts with]'

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 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 ## Aliases
| Alias | Command | Description | | Alias | Command | Description |
@ -73,6 +77,7 @@ zstyle ':omz:plugins:docker' legacy-completion yes
| drs | `docker container restart` | Restart one or more containers | | drs | `docker container restart` | Restart one or more containers |
| dsta | `docker stop $(docker ps -q)` | Stop all running containers | | dsta | `docker stop $(docker ps -q)` | Stop all running containers |
| dstp | `docker container stop` | Stop one or more 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 | | dtop | `docker top` | Display the running processes of a container |
| dvi | `docker volume inspect` | Display detailed information about one or more volumes | | dvi | `docker volume inspect` | Display detailed information about one or more volumes |
| dvls | `docker volume ls` | List all the volumes known to docker | | 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 drs='docker container restart'
alias dsta='docker stop $(docker ps -q)' alias dsta='docker stop $(docker ps -q)'
alias dstp='docker container stop' alias dstp='docker container stop'
alias dsts='docker stats'
alias dtop='docker top' alias dtop='docker top'
alias dvi='docker volume inspect' alias dvi='docker volume inspect'
alias dvls='docker volume ls' alias dvls='docker volume ls'

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

@ -10,7 +10,7 @@ _dotnet_completion() {
compdef _dotnet_completion dotnet compdef _dotnet_completion dotnet
# Aliases bellow are here for backwards compatibility # Aliases below are here for backwards compatibility
# added by Shaun Tabone (https://github.com/xontab) # added by Shaun Tabone (https://github.com/xontab)
alias dn='dotnet new' alias dn='dotnet new'
@ -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

@ -14,53 +14,56 @@ plugins=(... extract)
## Supported file extensions ## Supported file extensions
| Extension | Description | | Extension | Description |
| :---------------- | :----------------------------------- | | :---------------- | :-------------------------------------- |
| `7z` | 7zip file | | `7z` | 7zip file |
| `Z` | Z archive (LZW) | | `apk` | Android app file |
| `apk` | Android app file | | `aar` | Android library file |
| `aar` | Android library file | | `bz2` | Bzip2 file |
| `bz2` | Bzip2 file | | `cab` | Microsoft cabinet archive |
| `cab` | Microsoft cabinet archive | | `cpio` | Cpio archive |
| `cpio` | Cpio archive | | `deb` | Debian package |
| `deb` | Debian package | | `ear` | Enterprise Application aRchive |
| `ear` | Enterprise Application aRchive | | `exe` | Windows executable file |
| `exe` | Windows executable file | | `gz` | Gzip file |
| `gz` | Gzip file | | `ipa` | iOS app package |
| `ipa` | iOS app package | | `ipsw` | iOS firmware file |
| `ipsw` | iOS firmware file | | `jar` | Java Archive |
| `jar` | Java Archive | | `lrz` | LRZ archive |
| `lrz` | LRZ archive | | `lz4` | LZ4 archive |
| `lz4` | LZ4 archive | | `lzma` | LZMA archive |
| `lzma` | LZMA archive | | `obscpio` | cpio archive used on OBS |
| `obscpio` | cpio archive used on OBS | | `pk3` | Renamed Zip archive used by Quake games |
| `rar` | WinRAR archive | | `pk4` | Renamed Zip archive used by Quake games |
| `rpm` | RPM package | | `pk7` | Renamed 7zip file used by Quake games |
| `sublime-package` | Sublime Text package | | `rar` | WinRAR archive |
| `tar` | Tarball | | `rpm` | RPM package |
| `tar.bz2` | Tarball with bzip2 compression | | `sublime-package` | Sublime Text package |
| `tar.gz` | Tarball with gzip compression | | `tar` | Tarball |
| `tar.lrz` | Tarball with lrzip compression | | `tar.bz2` | Tarball with bzip2 compression |
| `tar.lz` | Tarball with lzip compression | | `tar.gz` | Tarball with gzip compression |
| `tar.lz4` | Tarball with lz4 compression | | `tar.lrz` | Tarball with lrzip compression |
| `tar.xz` | Tarball with lzma2 compression | | `tar.lz` | Tarball with lzip compression |
| `tar.zma` | Tarball with lzma compression | | `tar.lz4` | Tarball with lz4 compression |
| `tar.zst` | Tarball with zstd compression | | `tar.xz` | Tarball with lzma2 compression |
| `tbz` | Tarball with bzip compression | | `tar.zma` | Tarball with lzma compression |
| `tbz2` | Tarball with bzip2 compression | | `tar.zst` | Tarball with zstd compression |
| `tgz` | Tarball with gzip compression | | `tbz` | Tarball with bzip compression |
| `tlz` | Tarball with lzma compression | | `tbz2` | Tarball with bzip2 compression |
| `txz` | Tarball with lzma2 compression | | `tgz` | Tarball with gzip compression |
| `tzst` | Tarball with zstd compression | | `tlz` | Tarball with lzma compression |
| `vsix` | VS Code extension zip file | | `txz` | Tarball with lzma2 compression |
| `war` | Web Application archive (Java-based) | | `tzst` | Tarball with zstd compression |
| `whl` | Python wheel file | | `vsix` | VS Code extension zip file |
| `xpi` | Mozilla XPI module file | | `war` | Web Application archive (Java-based) |
| `xz` | LZMA2 archive | | `whl` | Python wheel file |
| `zip` | Zip archive | | `xpi` | Mozilla XPI module file |
| `zlib` | zlib archive | | `xz` | LZMA2 archive |
| `zst` | Zstandard file (zstd) | | `Z` | Z archive (LZW) |
| `zpaq` | Zpaq file | | `zip` | Zip archive |
| `zlib` | zlib archive |
| `zst` | Zstandard file (zstd) |
| `zpaq` | Zpaq file |
See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information
regarding archive formats. regarding archive formats.

View file

@ -19,6 +19,9 @@ local -a exts=(
lz4 lz4
lzma lzma
obscpio obscpio
pk3
pk4
pk7
rar rar
rpm rpm
sublime-package sublime-package

View file

@ -76,11 +76,11 @@ EOF
(*.lz4) lz4 -d "$full_path" ;; (*.lz4) lz4 -d "$full_path" ;;
(*.lzma) unlzma "$full_path" ;; (*.lzma) unlzma "$full_path" ;;
(*.z) uncompress "$full_path" ;; (*.z) uncompress "$full_path" ;;
(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx) unzip "$full_path" ;; (*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx|*.pk3|*.pk4) unzip "$full_path" ;;
(*.rar) unrar x -ad "$full_path" ;; (*.rar) unrar x -ad "$full_path" ;;
(*.rpm) (*.rpm)
rpm2cpio "$full_path" | cpio --quiet -id ;; rpm2cpio "$full_path" | cpio --quiet -id ;;
(*.7z | *.7z.[0-9]*) 7za x "$full_path" ;; (*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;;
(*.deb) (*.deb)
command mkdir -p "control" "data" command mkdir -p "control" "data"
ar vx "$full_path" > /dev/null ar vx "$full_path" > /dev/null

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

@ -86,7 +86,7 @@ function work_in_progress() {
# Aliases # Aliases
# (sorted alphabetically by command) # (sorted alphabetically by command)
# (order should follow README) # (order should follow README)
# (in some cases force the alisas order to match README, like for example gke and gk) # (in some cases force the alias order to match README, like for example gke and gk)
# #
alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
@ -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

@ -19,8 +19,15 @@ function {
# load additional options # load additional options
zstyle -a :omz:plugins:keychain options options zstyle -a :omz:plugins:keychain options options
# start keychain... # Check keychain version to decide whether to use --agents
keychain ${^options:-} --agents ${agents:-gpg} ${^identities} --host $SHORT_HOST local version_string=$(keychain --version 2>&1 | head -n 2 | tail -n 1 | cut -d ' ' -f 4)
# start keychain, only use --agents for versions below 2.9.0
autoload -Uz is-at-least
if is-at-least 2.9 "$version_string"; then
keychain ${^options:-} ${^identities} --host $SHORT_HOST
else
keychain ${^options:-} --agents ${agents:-gpg} ${^identities} --host $SHORT_HOST
fi
# Get the filenames to store/lookup the environment from # Get the filenames to store/lookup the environment from
_keychain_env_sh="$HOME/.keychain/$SHORT_HOST-sh" _keychain_env_sh="$HOME/.keychain/$SHORT_HOST-sh"

View file

@ -11,126 +11,128 @@ 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 |
| kak | `kubectl apply -k` | Apply a kustomization directory | | kak | `kubectl apply -k` | Apply a kustomization directory |
| 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 |
| kdelk | `kubectl delete -k` | Delete all resources defined in a kustomization directory | | kdelk | `kubectl delete -k` | Delete all resources defined in a kustomization directory |
| | | **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

@ -40,6 +40,8 @@ alias kcgc='kubectl config get-contexts'
alias kdel='kubectl delete' alias kdel='kubectl delete'
alias kdelf='kubectl delete -f' alias kdelf='kubectl delete -f'
alias kdelk='kubectl delete -k' alias kdelk='kubectl delete -k'
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

@ -271,7 +271,7 @@ function man-preview() {
[[ $# -eq 0 ]] && >&2 echo "Usage: $0 command1 [command2 ...]" && return 1 [[ $# -eq 0 ]] && >&2 echo "Usage: $0 command1 [command2 ...]" && return 1
local page 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 command mandoc -Tpdf $page | open -f -a Preview
done done
} }

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

@ -1,7 +1,7 @@
_togglePoetryShell() { _togglePoetryShell() {
# Determine if currently in a Poetry-managed directory # Determine if currently in a Poetry-managed directory
local in_poetry_dir=0 local in_poetry_dir=0
if [[ -f "$PWD/pyproject.toml" ]] && grep -q 'tool.poetry' "$PWD/pyproject.toml"; then if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then
in_poetry_dir=1 in_poetry_dir=1
fi fi

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

@ -29,9 +29,24 @@ function rbwpw {
echo "$service not found" echo "$service not found"
return 1 return 1
fi fi
# Generate a random identifier for this call to rbwpw
# so we can check if the clipboard content has changed
local _random="$RANDOM" _cache="$ZSH_CACHE_DIR/.rbwpw"
echo -n "$_random" > "$_cache"
# Use clipcopy to copy the password to the clipboard
echo -n $pw | clipcopy echo -n $pw | clipcopy
echo "password for $service copied!" echo "password for $service copied!"
{sleep 20 && clipcopy </dev/null 2>/dev/null} &|
# Clear the clipboard after 20 seconds, but only if the clipboard hasn't
# changed (if rbwpw hasn't been called again)
{
sleep 20 \
&& [[ "$(<"$_cache")" == "$_random" ]] \
&& clipcopy </dev/null 2>/dev/null \
&& command rm -f "$_cache" &>/dev/null
} &|
} }
function _rbwpw { function _rbwpw {

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

@ -49,4 +49,4 @@ plugins=(... systemadmin)
| geteip | Gather information regarding an external IP address using [icanhazip.com](https://icanhazip.com) | | geteip | Gather information regarding an external IP address using [icanhazip.com](https://icanhazip.com) |
| getip | Determine the local IP Address with `ip addr` or `ifconfig` | | getip | Determine the local IP Address with `ip addr` or `ifconfig` |
| clrz | Clear zombie processes | | clrz | Clear zombie processes |
| conssec | Show number of concurrent connections per second based on ngnix/access.log file or another log file if specified | | conssec | Show number of concurrent connections per second based on nginx/access.log file or another log file if specified |

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

@ -31,7 +31,7 @@ The plugin also supports the following:
| Variable | Description | | Variable | Description |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | | ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `ZSH_TMUX_AUTOREFRESH` | Automatically refresh global environments (default: `true`) | | `ZSH_TMUX_AUTOREFRESH` | Automatically refresh global environments (default: `false`) |
| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (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_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`) | | `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) |

View file

@ -16,7 +16,7 @@ fi
# Automatically name the new session based on the basename of PWD # Automatically name the new session based on the basename of PWD
: ${ZSH_TMUX_AUTONAME_SESSION:=false} : ${ZSH_TMUX_AUTONAME_SESSION:=false}
# Automatically pick up tmux environments # Automatically pick up tmux environments
: ${ZSH_TMUX_AUTOREFRESH:=true} : ${ZSH_TMUX_AUTOREFRESH:=false}
# Set term to screen or screen-256color based on current terminal support # Set term to screen or screen-256color based on current terminal support
: ${ZSH_TMUX_DETACHED:=false} : ${ZSH_TMUX_DETACHED:=false}
# Set detached mode # Set detached mode
@ -188,7 +188,7 @@ function _tmux_directory_session() {
alias tds=_tmux_directory_session alias tds=_tmux_directory_session
# Autostart if not already in tmux and enabled. # Autostart if not already in tmux and enabled.
if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" && -z "$INTELLIJ_ENVIRONMENT_READER" ]]; then if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" && -z "$INTELLIJ_ENVIRONMENT_READER" && -z "$ZED_TERM" ]]; then
# Actually don't autostart if we already did and multiple autostarts are disabled. # Actually don't autostart if we already did and multiple autostarts are disabled.
if [[ "$ZSH_TMUX_AUTOSTART_ONCE" == "false" || "$ZSH_TMUX_AUTOSTARTED" != "true" ]]; then if [[ "$ZSH_TMUX_AUTOSTART_ONCE" == "false" || "$ZSH_TMUX_AUTOSTARTED" != "true" ]]; then
export ZSH_TMUX_AUTOSTARTED=true export ZSH_TMUX_AUTOSTARTED=true

View file

@ -10,10 +10,11 @@ plugins=(... ubuntu)
## Aliases ## Aliases
Commands that use `$APT` will use `apt` if installed or defer to `apt-get` otherwise. Commands that use `$APT` will use `apt-fast` if installed, or `apt` if installed, or defer to `apt-get`
otherwise.
| Alias | Command | Description | | Alias | Command | Description |
|---------|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------| | ------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
| age | `sudo $APT` | Run apt-get with sudo | | age | `sudo $APT` | Run apt-get with sudo |
| acs | `apt-cache search` | Search the apt-cache with the specified criteria | | acs | `apt-cache search` | Search the apt-cache with the specified criteria |
| acsp | `apt-cache showpkg` | Shows information about the listed packages | | acsp | `apt-cache showpkg` | Shows information about the listed packages |
@ -26,7 +27,7 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
| agd | `sudo $APT dselect-upgrade` | Follows dselect choices for package installation | | agd | `sudo $APT dselect-upgrade` | Follows dselect choices for package installation |
| agi | `sudo $APT install <pkg>` | Install the specified package | | agi | `sudo $APT install <pkg>` | Install the specified package |
| agli | `apt list --installed` | List the installed packages | | agli | `apt list --installed` | List the installed packages |
| aglu | `sudo apt-get -u upgrade --assume-no` | Run an apt-get upgrade assuming no to all prompts | | aglu | `apt list --upgradable` | List available updates only |
| agp | `sudo $APT purge <pkg>` | Remove a package including any configuration files | | agp | `sudo $APT purge <pkg>` | Remove a package including any configuration files |
| agr | `sudo $APT remove <pkg>` | Remove a package | | agr | `sudo $APT remove <pkg>` | Remove a package |
| ags | `$APT source <pkg>` | Fetch the source for the specified package | | ags | `$APT source <pkg>` | Fetch the source for the specified package |
@ -36,21 +37,20 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
| agar | `sudo $APT autoremove` | Remove automatically installed packages no longer needed | | agar | `sudo $APT autoremove` | Remove automatically installed packages no longer needed |
| aguu | `sudo $APT update && sudo $APT upgrade` | Update packages list and upgrade available packages | | aguu | `sudo $APT update && sudo $APT upgrade` | Update packages list and upgrade available packages |
| allpkgs | `dpkg --get-selections \| grep -v deinstall` | Print all installed packages | | allpkgs | `dpkg --get-selections \| grep -v deinstall` | Print all installed packages |
| kclean | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` |Remove ALL kernel images and headers EXCEPT the one in use | | kclean | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` | Remove ALL kernel images and headers EXCEPT the one in use |
| mydeb | `time dpkg-buildpackage -rfakeroot -us -uc` | Create a basic .deb package | | mydeb | `time dpkg-buildpackage -rfakeroot -us -uc` | Create a basic .deb package |
| ppap | `sudo ppa-purge <ppa>` | Remove the specified PPA | | ppap | `sudo ppa-purge <ppa>` | Remove the specified PPA |
## Functions ## Functions
| Function | Usage |Description | | Function | Usage | Description |
|-------------------|---------------------------------------|--------------------------------------------------------------------------| | ----------------- | ------------------------------------- | ------------------------------------------------------------------------ |
| aar | `aar ppa:xxxxxx/xxxxxx [packagename]` | apt-add-repository with automatic install/upgrade of the desired package | | aar | `aar ppa:xxxxxx/xxxxxx [packagename]` | apt-add-repository with automatic install/upgrade of the desired package |
| apt-history | `apt-history <action>` | Prints the Apt history of the specified action | | apt-history | `apt-history <action>` | Prints the Apt history of the specified action |
| apt-list-packages | `apt-list-packages` | List packages by size | | apt-list-packages | `apt-list-packages` | List packages by size |
| kerndeb | `kerndeb` | Kernel-package building shortcut | | kerndeb | `kerndeb` | Kernel-package building shortcut |
## Authors: ## Authors
- [@AlexBio](https://github.com/AlexBio) - [@AlexBio](https://github.com/AlexBio)
- [@dbb](https://github.com/dbb) - [@dbb](https://github.com/dbb)
@ -59,3 +59,4 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
- [Nicolas Jonas](https://nextgenthemes.com) - [Nicolas Jonas](https://nextgenthemes.com)
- [@loctauxphilippe](https://github.com/loctauxphilippe) - [@loctauxphilippe](https://github.com/loctauxphilippe)
- [@HaraldNordgren](https://github.com/HaraldNordgren) - [@HaraldNordgren](https://github.com/HaraldNordgren)
- [@AmrElsayyad](https://github.com/AmrElsayyad)

View file

@ -1,11 +1,22 @@
(( $+commands[apt] )) && APT=apt || APT=apt-get # Detect available package manager (prefer apt-fast > apt > apt-get)
if (( $+commands[apt-fast] )); then
APT=apt-fast
elif (( $+commands[apt] )); then
APT=apt
else
APT=apt-get
fi
alias acs='apt-cache search' alias acs='apt-cache search'
alias afs='apt-file search --regexp' alias afs='apt-file search --regexp'
# These are apt/apt-get only # These are apt/apt-get only
alias ags="$APT source" if (( $+commands[apt] )); then
alias ags="apt source"
else
alias ags="apt-get source"
fi
alias acp='apt-cache policy' alias acp='apt-cache policy'

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

@ -1,6 +1,6 @@
function virtualenv_prompt_info(){ function virtualenv_prompt_info(){
[[ -n ${VIRTUAL_ENV} ]] || return [[ -n ${VIRTUAL_ENV} ]] || return
echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV:t:gs/%/%%}${ZSH_THEME_VIRTUALENV_SUFFIX=]}" echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV_PROMPT:-${VIRTUAL_ENV:t:gs/%/%%}}${ZSH_THEME_VIRTUALENV_SUFFIX=]}"
} }
# disables prompt mangling in virtual_env/bin/activate # disables prompt mangling in virtual_env/bin/activate

View file

@ -65,12 +65,9 @@ Add the following to your `home.nix` then run `home-manager switch`:
programs.zsh.plugins = [ programs.zsh.plugins = [
{ {
name = "wd"; name = "wd";
src = pkgs.fetchFromGitHub { src = pkgs.zsh-wd;
owner = "mfaerevaag"; file = "share/wd/wd.plugin.zsh";
repo = "wd"; completions = [ "share/zsh/site-functions" ];
rev = "v0.5.2";
sha256 = "sha256-4yJ1qhqhNULbQmt6Z9G22gURfDLe30uV1ascbzqgdhg=";
};
} }
]; ];
``` ```

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.1
# 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)
@ -173,6 +174,11 @@ wd_add()
point=$(basename "$PWD") point=$(basename "$PWD")
fi fi
if [ ! -w "$wd_config_file" ]; then
wd_exit_fail "\'$wd_config_file\' is not writeable."
return
fi
if [[ $point =~ "^[\.]+$" ]] if [[ $point =~ "^[\.]+$" ]]
then then
wd_exit_fail "Warp point cannot be just dots" wd_exit_fail "Warp point cannot be just dots"
@ -238,6 +244,11 @@ wd_remove()
point_list=$(basename "$PWD") point_list=$(basename "$PWD")
fi fi
if [ ! -w "$wd_config_file" ]; then
wd_exit_fail "\'$wd_config_file\' is not writeable."
return
fi
for point_name in $point_list ; do for point_name in $point_list ; do
if [[ ${points[$point_name]} != "" ]] if [[ ${points[$point_name]} != "" ]]
then then
@ -377,6 +388,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"
@ -424,6 +450,11 @@ wd_clean() {
local count=0 local count=0
local wd_tmp="" local wd_tmp=""
if [ ! -w "$wd_config_file" ]; then
wd_exit_fail "\'$wd_config_file\' is not writeable."
return
fi
while read -r line while read -r line
do do
if [[ $line != "" ]] if [[ $line != "" ]]
@ -521,20 +552,12 @@ 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 ]]
then then
wd_print_usage wd_print_usage
# check if config file is writeable
elif [ ! -w "$wd_config_file" ]
then
# do nothing
# can't run `exit`, as this would exit the executing shell
wd_exit_fail "\'$wd_config_file\' is not writeable."
else else
# parse rest of options # parse rest of options
local wd_o local wd_o
@ -571,6 +594,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

@ -47,12 +47,17 @@ Available search contexts are:
| `youtube` | `https://www.youtube.com/results?search_query=` | | `youtube` | `https://www.youtube.com/results?search_query=` |
| `deepl` | `https://www.deepl.com/translator#auto/auto/` | | `deepl` | `https://www.deepl.com/translator#auto/auto/` |
| `dockerhub` | `https://hub.docker.com/search?q=` | | `dockerhub` | `https://hub.docker.com/search?q=` |
| `gems` | `https://rubygems.org/search?query=` |
| `npmpkg` | `https://www.npmjs.com/search?q=` | | `npmpkg` | `https://www.npmjs.com/search?q=` |
| `packagist` | `https://packagist.org/?query=` | | `packagist` | `https://packagist.org/?query=` |
| `gopkg` | `https://pkg.go.dev/search?m=package&q=` | | `gopkg` | `https://pkg.go.dev/search?m=package&q=` |
| `chatgpt` | `https://chatgpt.com/?q=` | | `chatgpt` | `https://chatgpt.com/?q=` |
| `claudeai` | `https://claude.ai/new?q=` |
| `grok` | `https://grok.com/?q=` |
| `reddit` | `https://www.reddit.com/search/?q=` | | `reddit` | `https://www.reddit.com/search/?q=` |
| `ppai` | `https://www.perplexity.ai/search/new?q=` | | `ppai` | `https://www.perplexity.ai/search/new?q=` |
| `rscrate` | `https://crates.io/search?q=` |
| `rsdoc` | `https://docs.rs/releases/search?query=` |
Also there are aliases for bang-searching DuckDuckGo: Also there are aliases for bang-searching DuckDuckGo:

View file

@ -28,12 +28,17 @@ function web_search() {
youtube "https://www.youtube.com/results?search_query=" youtube "https://www.youtube.com/results?search_query="
deepl "https://www.deepl.com/translator#auto/auto/" deepl "https://www.deepl.com/translator#auto/auto/"
dockerhub "https://hub.docker.com/search?q=" dockerhub "https://hub.docker.com/search?q="
gems "https://rubygems.org/search?query="
npmpkg "https://www.npmjs.com/search?q=" npmpkg "https://www.npmjs.com/search?q="
packagist "https://packagist.org/?query=" packagist "https://packagist.org/?query="
gopkg "https://pkg.go.dev/search?m=package&q=" gopkg "https://pkg.go.dev/search?m=package&q="
chatgpt "https://chatgpt.com/?q=" chatgpt "https://chatgpt.com/?q="
grok "https://grok.com/?q="
claudeai "https://claude.ai/new?q="
reddit "https://www.reddit.com/search/?q=" reddit "https://www.reddit.com/search/?q="
ppai "https://www.perplexity.ai/search/new?q=" ppai "https://www.perplexity.ai/search/new?q="
rscrate "https://crates.io/search?q="
rsdoc "https://docs.rs/releases/search?query="
) )
# check whether the search engine is supported # check whether the search engine is supported
@ -83,12 +88,17 @@ alias ask='web_search ask'
alias youtube='web_search youtube' alias youtube='web_search youtube'
alias deepl='web_search deepl' alias deepl='web_search deepl'
alias dockerhub='web_search dockerhub' alias dockerhub='web_search dockerhub'
alias gems='web_search gems'
alias npmpkg='web_search npmpkg' alias npmpkg='web_search npmpkg'
alias packagist='web_search packagist' alias packagist='web_search packagist'
alias gopkg='web_search gopkg' alias gopkg='web_search gopkg'
alias chatgpt='web_search chatgpt' alias chatgpt='web_search chatgpt'
alias grok='web_search grok'
alias claudeai='web_search claudeai'
alias reddit='web_search reddit' alias reddit='web_search reddit'
alias ppai='web_search ppai' alias ppai='web_search ppai'
alias rscrate='web_search rscrate'
alias rsdoc='web_search rsdoc'
#add your own !bang searches here #add your own !bang searches here
alias wiki='web_search duckduckgo \!w' alias wiki='web_search duckduckgo \!w'
@ -106,3 +116,4 @@ if [[ ${#ZSH_WEB_SEARCH_ENGINES} -gt 0 ]]; then
done done
unset engines key unset engines key
fi fi

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

@ -14,7 +14,7 @@ function afmagic_dashes {
if [[ -n "$python_env" && "$PS1" = *\(${python_env}\)* ]]; then if [[ -n "$python_env" && "$PS1" = *\(${python_env}\)* ]]; then
echo $(( COLUMNS - ${#python_env} - 3 )) echo $(( COLUMNS - ${#python_env} - 3 ))
elif [[ -n "$VIRTUAL_ENV_PROMPT" && "$PS1" = *${VIRTUAL_ENV_PROMPT}* ]]; then elif [[ -n "$VIRTUAL_ENV_PROMPT" && "$PS1" = *${VIRTUAL_ENV_PROMPT}* ]]; then
echo $(( COLUMNS - ${#VIRTUAL_ENV_PROMPT} )) echo $(( COLUMNS - ${#VIRTUAL_ENV_PROMPT} - 3 ))
else else
echo $COLUMNS echo $COLUMNS
fi fi

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
@ -314,6 +314,9 @@ prompt_dir() {
# Virtualenv: current working virtualenv # Virtualenv: current working virtualenv
prompt_virtualenv() { prompt_virtualenv() {
if [ -n "$CONDA_DEFAULT_ENV" ]; then
prompt_segment magenta $CURRENT_FG "🐍 $CONDA_DEFAULT_ENV"
fi
if [[ -n "$VIRTUAL_ENV" && -n "$VIRTUAL_ENV_DISABLE_PROMPT" ]]; then if [[ -n "$VIRTUAL_ENV" && -n "$VIRTUAL_ENV_DISABLE_PROMPT" ]]; then
prompt_segment "$AGNOSTER_VENV_BG" "$AGNOSTER_VENV_FG" "(${VIRTUAL_ENV:t:gs/%/%%})" prompt_segment "$AGNOSTER_VENV_BG" "$AGNOSTER_VENV_FG" "(${VIRTUAL_ENV:t:gs/%/%%})"
fi fi
@ -350,12 +353,19 @@ prompt_aws() {
esac esac
} }
prompt_terraform() {
local terraform_info=$(tf_prompt_info)
[[ -z "$terraform_info" ]] && return
prompt_segment magenta yellow "TF: $terraform_info"
}
## Main prompt ## Main prompt
build_prompt() { build_prompt() {
RETVAL=$? RETVAL=$?
prompt_status prompt_status
prompt_virtualenv prompt_virtualenv
prompt_aws prompt_aws
prompt_terraform
prompt_context prompt_context
prompt_dir prompt_dir
prompt_git prompt_git

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}%}"

View file

@ -8,14 +8,15 @@ function theme_precmd {
local rubypromptsize=${#${(%)$(ruby_prompt_info)}} local rubypromptsize=${#${(%)$(ruby_prompt_info)}}
local pwdsize=${#${(%):-%~}} local pwdsize=${#${(%):-%~}}
local venvpromptsize=$((${#$(virtualenv_prompt_info)})) local venvpromptsize=$((${#$(virtualenv_prompt_info)}))
local condapromptsize=$((${#$(conda_prompt_info)}))
# Truncate the path if it's too long. # Truncate the path if it's too long.
if (( promptsize + rubypromptsize + pwdsize + venvpromptsize > TERMWIDTH )); then if (( promptsize + rubypromptsize + pwdsize + venvpromptsize + condapromptsize > TERMWIDTH )); then
(( PR_PWDLEN = TERMWIDTH - promptsize )) (( PR_PWDLEN = TERMWIDTH - promptsize ))
elif [[ "${langinfo[CODESET]}" = UTF-8 ]]; then elif [[ "${langinfo[CODESET]}" = UTF-8 ]]; then
PR_FILLBAR="\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize ) ))::${PR_HBAR}:)}" PR_FILLBAR="\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize + condapromptsize ) ))::${PR_HBAR}:)}"
else else
PR_FILLBAR="${PR_SHIFT_IN}\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize ) ))::${altchar[q]:--}:)}${PR_SHIFT_OUT}" PR_FILLBAR="${PR_SHIFT_IN}\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize + condapromptsize ) ))::${altchar[q]:--}:)}${PR_SHIFT_OUT}"
fi fi
} }
@ -104,7 +105,7 @@ fi
PROMPT='${PR_SET_CHARSET}${PR_STITLE}${(e)PR_TITLEBAR}\ PROMPT='${PR_SET_CHARSET}${PR_STITLE}${(e)PR_TITLEBAR}\
${PR_CYAN}${PR_ULCORNER}${PR_HBAR}${PR_GREY}(\ ${PR_CYAN}${PR_ULCORNER}${PR_HBAR}${PR_GREY}(\
${PR_GREEN}%${PR_PWDLEN}<...<%~%<<\ ${PR_GREEN}%${PR_PWDLEN}<...<%~%<<\
${PR_GREY})$(virtualenv_prompt_info)$(ruby_prompt_info)${PR_CYAN}${PR_HBAR}${PR_HBAR}${(e)PR_FILLBAR}${PR_HBAR}${PR_GREY}(\ ${PR_GREY})$(virtualenv_prompt_info)$(ruby_prompt_info)$(conda_prompt_info)${PR_CYAN}${PR_HBAR}${PR_HBAR}${(e)PR_FILLBAR}${PR_HBAR}${PR_GREY}(\
${PR_CYAN}%(!.%SROOT%s.%n)${PR_GREY}@${PR_GREEN}%m:%l\ ${PR_CYAN}%(!.%SROOT%s.%n)${PR_GREY}@${PR_GREEN}%m:%l\
${PR_GREY})${PR_CYAN}${PR_HBAR}${PR_URCORNER}\ ${PR_GREY})${PR_CYAN}${PR_HBAR}${PR_URCORNER}\

View file

@ -25,9 +25,10 @@
# BRANCH - branch to check out immediately after install (default: master) # BRANCH - branch to check out immediately after install (default: master)
# #
# Other options: # Other options:
# CHSH - 'no' means the installer will not change the default shell (default: yes) # CHSH - 'no' means the installer will not change the default shell (default: yes)
# RUNZSH - 'no' means the installer will not run zsh after the install (default: yes) # RUNZSH - 'no' means the installer will not run zsh after the install (default: yes)
# KEEP_ZSHRC - 'yes' means the installer will not replace an existing .zshrc (default: no) # KEEP_ZSHRC - 'yes' means the installer will not replace an existing .zshrc (default: no)
# OVERWRITE_CONFIRMATION - 'no' means the installer will not ask for confirmation to overwrite the existing .zshrc (default: yes)
# #
# You can also pass some arguments to the install script to set some these options: # You can also pass some arguments to the install script to set some these options:
# --skip-chsh: has the same behavior as setting CHSH to 'no' # --skip-chsh: has the same behavior as setting CHSH to 'no'
@ -77,6 +78,7 @@ BRANCH=${BRANCH:-master}
CHSH=${CHSH:-yes} CHSH=${CHSH:-yes}
RUNZSH=${RUNZSH:-yes} RUNZSH=${RUNZSH:-yes}
KEEP_ZSHRC=${KEEP_ZSHRC:-no} KEEP_ZSHRC=${KEEP_ZSHRC:-no}
OVERWRITE_CONFIRMATION=${OVERWRITE_CONFIRMATION:-yes}
command_exists() { command_exists() {
@ -341,6 +343,25 @@ setup_zshrc() {
echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}" echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}"
return return
fi fi
if [ $OVERWRITE_CONFIRMATION != "no" ]; then
# Ask user for confirmation before backing up and overwriting
echo "${FMT_YELLOW}Found ${zdot}/.zshrc."
echo "The existing .zshrc will be backed up to .zshrc.pre-oh-my-zsh if overwritten."
echo "Make sure your .zshrc contains the following minimal configuration if you choose not to overwrite it:${FMT_RESET}"
echo "----------------------------------------"
cat "$ZSH/templates/minimal.zshrc"
echo "----------------------------------------"
printf '%sDo you want to overwrite it with the Oh My Zsh template? [Y/n]%s ' \
"$FMT_YELLOW" "$FMT_RESET"
read -r opt
case $opt in
[Yy]*|"") ;;
[Nn]*) echo "Overwrite skipped. Existing .zshrc will be kept."; return ;;
*) echo "Invalid choice. Overwrite skipped. Existing .zshrc will be kept."; return ;;
esac
fi
if [ -e "$OLD_ZSHRC" ]; then if [ -e "$OLD_ZSHRC" ]; then
OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)" OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)"
if [ -e "$OLD_OLD_ZSHRC" ]; then if [ -e "$OLD_OLD_ZSHRC" ]; then
@ -353,7 +374,7 @@ setup_zshrc() {
echo "${FMT_YELLOW}Found old .zshrc.pre-oh-my-zsh." \ echo "${FMT_YELLOW}Found old .zshrc.pre-oh-my-zsh." \
"${FMT_GREEN}Backing up to ${OLD_OLD_ZSHRC}${FMT_RESET}" "${FMT_GREEN}Backing up to ${OLD_OLD_ZSHRC}${FMT_RESET}"
fi fi
echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}" echo "${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}"
mv "$zdot/.zshrc" "$OLD_ZSHRC" mv "$zdot/.zshrc" "$OLD_ZSHRC"
fi fi
@ -493,12 +514,13 @@ main() {
if [ ! -t 0 ]; then if [ ! -t 0 ]; then
RUNZSH=no RUNZSH=no
CHSH=no CHSH=no
OVERWRITE_CONFIRMATION=no
fi fi
# Parse arguments # Parse arguments
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
case $1 in case $1 in
--unattended) RUNZSH=no; CHSH=no ;; --unattended) RUNZSH=no; CHSH=no; OVERWRITE_CONFIRMATION=no ;;
--skip-chsh) CHSH=no ;; --skip-chsh) CHSH=no ;;
--keep-zshrc) KEEP_ZSHRC=yes ;; --keep-zshrc) KEEP_ZSHRC=yes ;;
esac esac

View file

@ -254,7 +254,7 @@ if LANG= git pull --quiet --rebase $remote $branch; then
# Print changelog to the terminal # Print changelog to the terminal
if [[ $interactive == true && $verbose_mode == default ]]; then if [[ $interactive == true && $verbose_mode == default ]]; then
"$ZSH/tools/changelog.sh" HEAD "$last_commit" ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" HEAD "$last_commit"
fi fi
if [[ $verbose_mode != silent ]]; then if [[ $verbose_mode != silent ]]; then