206 changed files with 857 additions and 10826 deletions
-1
View File
@@ -5,7 +5,6 @@ plugins/eza/ @pepoluan
plugins/genpass/ @atoponce plugins/genpass/ @atoponce
plugins/git-lfs/ @hellovietduc plugins/git-lfs/ @hellovietduc
plugins/gitfast/ @felipec plugins/gitfast/ @felipec
plugins/hermes/ @Uhm-why
plugins/kube-ps1/ @mcornella plugins/kube-ps1/ @mcornella
plugins/kubectl/ @mcornella plugins/kubectl/ @mcornella
plugins/kubectx/ @mcornella plugins/kubectx/ @mcornella
+3 -46
View File
@@ -12,14 +12,14 @@ dependencies:
plugins/gradle: plugins/gradle:
repo: gradle/gradle-completion repo: gradle/gradle-completion
branch: master branch: master
version: e7c881dbef7462bc35ad05328397e1582fe25cb8 version: 63578c9bc56134b80766e88957ba0239e6be2343
precopy: | precopy: |
set -e set -e
find . ! -name _gradle ! -name LICENSE -delete find . ! -name _gradle ! -name LICENSE -delete
plugins/history-substring-search: plugins/history-substring-search:
repo: zsh-users/zsh-history-substring-search repo: zsh-users/zsh-history-substring-search
branch: master branch: master
version: a0bdb0d47dbaba31dba2db7af8c48a5d9c74049a version: 14c8d2e0ffaee98f2df9850b19944f32546fdea5
precopy: | precopy: |
set -e set -e
rm -f zsh-history-substring-search.plugin.zsh rm -f zsh-history-substring-search.plugin.zsh
@@ -30,7 +30,7 @@ dependencies:
plugins/kube-ps1: plugins/kube-ps1:
repo: jonmosco/kube-ps1 repo: jonmosco/kube-ps1
branch: master branch: master
version: b4cd09ec8d4dc007173e28da40aeebf8eff8c87f version: 04af46f7fe888ad287abcab6699b9bb10234bc3d
precopy: | precopy: |
set -e set -e
find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete
@@ -55,46 +55,3 @@ dependencies:
set -e set -e
test -e _zshz && mv -f _zshz _z test -e _zshz && mv -f _zshz _z
test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh
plugins/zsh-autosuggestions:
repo: zsh-users/zsh-autosuggestions
branch: master
version: 85919cd1ffa7d2d5412f6d3fe437ebdbeeec4fc5
precopy: |
set -e
test -e README.md && mv -f README.md MANUAL.md
sed -i 's|\[INSTALL.md\](INSTALL.md)|[the Oh My Zsh plugin README](README.md)|' MANUAL.md
rm -f zsh-autosuggestions.plugin.zsh
mv -f zsh-autosuggestions.zsh zsh-autosuggestions.plugin.zsh
find . -depth -mindepth 1 \
! -path './LICENSE' \
! -path './MANUAL.md' \
! -path './src' \
! -path './src/*' \
! -path './zsh-autosuggestions.plugin.zsh' \
-delete
plugins/zsh-syntax-highlighting:
repo: zsh-users/zsh-syntax-highlighting
branch: master
version: 2fc57d63067c18b1100ecdbf684fa5baf49459d1
precopy: |
set -e
version=$(<.version)
test -e README.md && mv -f README.md MANUAL.md
sed -i 's|\[INSTALL.md\](INSTALL.md)|[the Oh My Zsh plugin README](README.md)|' MANUAL.md
rm -f zsh-syntax-highlighting.plugin.zsh
mv -f zsh-syntax-highlighting.zsh zsh-syntax-highlighting.plugin.zsh
mv -f COPYING.md LICENSE
sed -i "s|typeset -g ZSH_HIGHLIGHT_VERSION=.*|typeset -g ZSH_HIGHLIGHT_VERSION=$version|" zsh-syntax-highlighting.plugin.zsh
sed -i 's|typeset -g ZSH_HIGHLIGHT_REVISION=.*|typeset -g ZSH_HIGHLIGHT_REVISION=HEAD|' zsh-syntax-highlighting.plugin.zsh
find highlighters -type d -name test-data -prune -exec rm -rf {} +
find . -depth -mindepth 1 \
! -path './LICENSE' \
! -path './MANUAL.md' \
! -path './docs' \
! -path './docs/*' \
! -path './highlighters' \
! -path './highlighters/*' \
! -path './images' \
! -path './images/*' \
! -path './zsh-syntax-highlighting.plugin.zsh' \
-delete
+1 -1
View File
@@ -16,7 +16,7 @@ jobs:
contents: write # this is needed to push commits and branches contents: write # this is needed to push commits and branches
steps: steps:
- name: Harden the runner (Audit all outbound calls) - name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1 uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with: with:
egress-policy: audit egress-policy: audit
@@ -1,7 +1,7 @@
certifi==2026.7.22 certifi==2026.7.22
charset-normalizer==3.5.1 charset-normalizer==3.5.0
idna==3.19 idna==3.18
PyYAML==6.0.3 PyYAML==6.0.3
requests==2.34.2 requests==2.34.2
semver==3.1.0 semver==3.0.4
urllib3==2.8.0 urllib3==2.7.0
+2 -2
View File
@@ -26,7 +26,7 @@ jobs:
- macos-latest - macos-latest
steps: steps:
- name: Harden the runner (Audit all outbound calls) - name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1 uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with: with:
egress-policy: audit egress-policy: audit
@@ -47,7 +47,7 @@ jobs:
- test - test
steps: steps:
- name: Harden the runner (Audit all outbound calls) - name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1 uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with: with:
egress-policy: audit egress-policy: audit
+47 -1
View File
@@ -24,7 +24,7 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Harden the runner (Audit all outbound calls) - name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1 uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with: with:
egress-policy: audit egress-policy: audit
@@ -41,3 +41,49 @@ jobs:
./themes/*.zsh-theme; do ./themes/*.zsh-theme; do
zsh -n "$file" || return 1 zsh -n "$file" || return 1
done done
- name: Focused syntax check for bootstrap-adjacent touched files
if: github.event_name == 'pull_request'
run: |
mapfile -t touched < <(
git diff --name-only "${{ github.event.pull_request.base.sha }}" "${{ github.sha }}" \
| grep -E '^(lib/bootstrap\.zsh|lib/tests/bootstrap.*\.zsh|oh-my-zsh\.sh|lib/(completion|compfix|functions|theme-and-appearance)\.zsh|plugins/.+/.+\.plugin\.zsh|themes/.+\.zsh-theme)$' \
|| true
)
if [ "${#touched[@]}" -eq 0 ]; then
echo "No bootstrap-adjacent files touched"
exit 0
fi
for file in "${touched[@]}"; do
echo "Syntax checking $file"
zsh -n "$file"
done
- name: Run bootstrap unit test
if: github.event_name == 'pull_request'
run: zsh ./lib/tests/bootstrap.test.zsh
- name: Run inline bootstrap invariants smoke test
if: github.event_name == 'pull_request'
run: zsh ./lib/tests/bootstrap-inline-ci.test.zsh
plugin-manager-smoke:
name: Plugin manager smoke (${{ matrix.manager }}:${{ matrix.scenario }})
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh' && github.event_name == 'pull_request'
strategy:
fail-fast: false
matrix:
manager: [antigen, zinit]
scenario: [positive, negative]
steps:
- name: Set up git repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install zsh
run: sudo apt-get update; sudo apt-get install zsh
- name: Run plugin-manager bootstrap integration
run: zsh ./lib/tests/plugin-manager-bootstrap-integration.test.zsh "${{ matrix.manager }}" "${{ matrix.scenario }}"
@@ -0,0 +1,37 @@
name: Plugin manager integration (advisory)
on:
schedule:
- cron: '0 6 * * *'
workflow_dispatch:
permissions:
contents: read
jobs:
plugin-manager-matrix:
name: ${{ matrix.manager }}:${{ matrix.scenario }}
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
continue-on-error: true
strategy:
fail-fast: false
matrix:
manager: [antigen, zinit, zgen, zplug, antibody, zulu]
scenario: [positive, negative]
steps:
- name: Set up git repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- name: Install zsh and go
run: sudo apt-get update; sudo apt-get install zsh golang
- name: Run plugin-manager bootstrap integration
run: zsh ./lib/tests/plugin-manager-bootstrap-integration.test.zsh "${{ matrix.manager }}" "${{ matrix.scenario }}"
- name: Rollout note
if: always()
run: |
echo "Phase 2 active: full manager matrix is advisory/nightly."
echo "Phase 3 target: promote full matrix to required after stability window."
+1 -1
View File
@@ -17,7 +17,7 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh' if: github.repository == 'ohmyzsh/ohmyzsh'
steps: steps:
- name: Harden the runner (Audit all outbound calls) - name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1 uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with: with:
egress-policy: audit egress-policy: audit
- name: Authenticate as @ohmyzsh - name: Authenticate as @ohmyzsh
+2 -2
View File
@@ -36,7 +36,7 @@ jobs:
steps: steps:
- name: Harden the runner (Audit all outbound calls) - name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@e14015d583714f6e62063499dc959a02595150a1 # v2.21.1 uses: step-security/harden-runner@b09bb98e06d4d774595224525879c09bc6e98c40 # v2.20.1
with: with:
egress-policy: audit egress-policy: audit
@@ -60,6 +60,6 @@ jobs:
retention-days: 5 retention-days: 5
- name: "Upload to code-scanning" - name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0 uses: github/codeql-action/upload-sarif@ff2f1c621b7f889edc0d3c761ac2e6a3f8cdb0dd # v4.37.7
with: with:
sarif_file: results.sarif sarif_file: results.sarif
+19
View File
@@ -23,6 +23,7 @@ you would make is not already covered.
- [A note on AI-assisted contributions](#a-note-on-ai-assisted-contributions) - [A note on AI-assisted contributions](#a-note-on-ai-assisted-contributions)
- [Use the Search, Luke](#use-the-search-luke) - [Use the Search, Luke](#use-the-search-luke)
- [Commit Guidelines](#commit-guidelines) - [Commit Guidelines](#commit-guidelines)
- [Plugin And Theme Bootstrap Compatibility](#plugin-and-theme-bootstrap-compatibility)
- [Format](#format) - [Format](#format)
- [Style](#style) - [Style](#style)
- [Volunteer](#volunteer) - [Volunteer](#volunteer)
@@ -176,6 +177,24 @@ specification. The automatic changelog tool uses these to automatically generate
a changelog based on the commit messages. Here's a guide to writing a commit message a changelog based on the commit messages. Here's a guide to writing a commit message
to allow this: to allow this:
### Plugin And Theme Bootstrap Compatibility
Oh My Zsh now provides a shared bootstrap entrypoint at `lib/bootstrap.zsh` for plugin-manager setups that don't
source `oh-my-zsh.sh`.
When working on plugins/themes:
- assume bootstrap has already run in manager-driven setups
- rely on bootstrap guarantees (`ZSH*` defaults, cache/completions setup, required `fpath` entries)
- avoid adding per-plugin/per-theme copies of common setup unless truly plugin-specific
Common patterns we should migrate away from over time:
- repeated cache setup logic (`mkdir -p "$ZSH_CACHE_DIR/completions"`)
- repeated base `fpath` bootstrapping for OMZ core/custom directories
If your plugin/theme still needs custom initialization, keep it scoped to that plugin/theme behavior only.
### Format ### Format
``` ```
+115 -24
View File
@@ -23,14 +23,6 @@ Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
[![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh) [![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh)
[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) [![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh)
<a href="https://commitgoods.com/collections/oh-my-zsh?utm_source=github">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://cdn.shopify.com/s/files/1/0101/8752/files/commitgoods-badge-stacked-navy-dark.svg">
<img src="https://cdn.shopify.com/s/files/1/0101/8752/files/commitgoods-badge-stacked-navy.svg" height="28" alt="Official merch on commitgoods.com">
</picture>
</a>
<details> <details>
<summary>Table of Contents</summary> <summary>Table of Contents</summary>
@@ -54,6 +46,7 @@ Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
- [Manual Installation](#manual-installation) - [Manual Installation](#manual-installation)
- [Installation Problems](#installation-problems) - [Installation Problems](#installation-problems)
- [Custom Plugins And Themes](#custom-plugins-and-themes) - [Custom Plugins And Themes](#custom-plugins-and-themes)
- [Using Plugin Managers Without `oh-my-zsh.sh`](#using-plugin-managers-without-oh-my-zshsh)
- [Enable GNU ls In macOS And FreeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems) - [Enable GNU ls In macOS And FreeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems)
- [Skip Aliases](#skip-aliases) - [Skip Aliases](#skip-aliases)
- [Async git prompt](#async-git-prompt) - [Async git prompt](#async-git-prompt)
@@ -357,6 +350,120 @@ If you have many functions that go well together, you can put them as a `XYZ.plu
If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the
same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`.
### Using Plugin Managers Without `oh-my-zsh.sh`
Some plugin managers load individual OMZ plugins/themes directly and do not source `oh-my-zsh.sh`.
For those setups, source this bootstrap entrypoint before loading any OMZ plugin or theme:
```zsh
source "$ZSH/lib/bootstrap.zsh"
```
#### Bootstrap compatibility contract
`lib/bootstrap.zsh` is idempotent and is the only required pre-load step for plugin-manager setups.
It guarantees:
- `ZSH`, `ZSH_CUSTOM`, and `ZSH_CACHE_DIR` defaults
- writable cache fallback to `${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh`
- `$ZSH_CACHE_DIR/completions` directory creation
- required OMZ `fpath` entries for plugins/themes:
- `$ZSH/functions`
- `$ZSH/completions`
- `$ZSH_CUSTOM/functions`
- `$ZSH_CUSTOM/completions`
- `$ZSH_CACHE_DIR/completions`
- public signal: `OMZ_IS_BOOTSTRAPPED=true` (for one-time hook guards)
What still requires `oh-my-zsh.sh`:
- update checks
- plugin auto-discovery from the `plugins=(...)` list
- `compinit`/`compfix` orchestration and zcompdump metadata refresh
- alias filtering via `:omz:*` zstyles during file sourcing
- final full-init signal: `OMZ_IS_LOADED=true`
#### Plugin manager hook guidance
Run bootstrap once, before any OMZ plugin/theme load:
```zsh
[[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"
```
- **Antigen** (pre-bundle hook pattern):
```zsh
omz_preload() { [[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"; }
omz_preload
antigen bundle OMZ::plugins/git
antigen apply
```
- **Zinit** (`atinit` pre-load hook):
```zsh
zinit ice atinit'[[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"'
zinit snippet OMZ::plugins/git/git.plugin.zsh
```
- **zgen** (pre-load hook function called before OMZ loads):
```zsh
omz_preload() { [[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"; }
omz_preload
zgen load ohmyzsh/ohmyzsh plugins/git
```
- **zplug** (run pre-load hook immediately before OMZ entries):
```zsh
omz_preload() { [[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"; }
omz_preload
zplug "plugins/git", from:oh-my-zsh
zplug load
```
- **antibody** (run pre-load hook before `antibody bundle`/`source` output):
```zsh
omz_preload() { [[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"; }
omz_preload
source <(antibody bundle <<'EOF'
ohmyzsh/ohmyzsh path:plugins/git
EOF
)
```
- **zulu** (run pre-load hook before OMZ module loads):
```zsh
omz_preload() { [[ -n "${OMZ_IS_BOOTSTRAPPED:-}" ]] || source "$ZSH/lib/bootstrap.zsh"; }
omz_preload
zulu install oh-my-zsh
```
Compatibility matrix:
| Load mode | `OMZ_IS_BOOTSTRAPPED` | `OMZ_IS_LOADED` | Suitable for |
| :-- | :--: | :--: | :-- |
| `source $ZSH/oh-my-zsh.sh` | ✅ | ✅ | Full OMZ framework features |
| `source $ZSH/lib/bootstrap.zsh` + manager-loaded OMZ plugins/themes | ✅ | ❌ | Plugin/theme prerequisites only |
#### Manager entrypoints and OMZ-side auto-injection limits
Most plugin managers load OMZ by directly sourcing selected plugin/theme/lib entrypoints, not by sourcing
`oh-my-zsh.sh`, so OMZ cannot universally inject bootstrap on its own.
| Manager | Typical OMZ entrypoint(s) it loads | Can OMZ auto-inject bootstrap without user hook? |
| :-- | :-- | :--: |
| Antigen | `antigen bundle ...` targets after `antigen use oh-my-zsh` | ❌ |
| Zinit | `OMZ::`, `OMZL::`, `OMZP::`, `OMZT::` snippets | ❌ |
| zgen | `zgen oh-my-zsh ...` selected OMZ paths | ❌ |
| zplug | `from:oh-my-zsh` selected OMZ entries | ❌ |
| antibody | `ohmyzsh/ohmyzsh path:...` selected OMZ paths | ❌ |
| zulu | OMZ package/module entries selected by zulu | ❌ |
### Enable GNU ls In macOS And FreeBSD Systems ### Enable GNU ls In macOS And FreeBSD Systems
<a name="enable-gnu-ls"></a> <a name="enable-gnu-ls"></a>
@@ -474,22 +581,6 @@ zstyle ':omz:update' frequency 7
zstyle ':omz:update' frequency 0 zstyle ':omz:update' frequency 0
``` ```
By default, updates always pull the latest changes. If you'd rather let others kick the tires first
before an update reaches your machine, you can set a cooldown (in days). You'll still get everything —
just a little later:
```sh
# Only apply updates that are at least 10 days old
zstyle ':omz:update' cooldown 10
```
`omz update` honors this setting. If you call `upgrade.sh` directly, pass the same
value with `-c`, because that script does not read your `.zshrc`:
```sh
$ZSH/tools/upgrade.sh -c 10
```
### Updates Verbosity ### Updates Verbosity
You can also limit the update verbosity with the following settings: You can also limit the update verbosity with the following settings:
+44
View File
@@ -0,0 +1,44 @@
#
# Shared Oh My Zsh bootstrap entrypoint.
#
# This file can be sourced by plugin managers that don't source `oh-my-zsh.sh`.
# It is safe to source multiple times.
#
# Keep source path for callers that invoke omz_bootstrap again later.
typeset -g _OMZ_BOOTSTRAP_SOURCE="${${(%):-%x}:a}"
omz_bootstrap() {
# If ZSH is not defined, infer from this file location.
[[ -n "${ZSH:-}" ]] || export ZSH="${_OMZ_BOOTSTRAP_SOURCE:h:h}"
# Set ZSH_CUSTOM to the path where custom config files and plugins exist.
[[ -n "${ZSH_CUSTOM:-}" ]] || ZSH_CUSTOM="$ZSH/custom"
# Set cache directory.
[[ -n "${ZSH_CACHE_DIR:-}" ]] || ZSH_CACHE_DIR="$ZSH/cache"
# Ensure cache dir is writable, otherwise fallback to a HOME-based cache.
if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh"
fi
# Create cache and completions dir.
command mkdir -p "$ZSH_CACHE_DIR/completions"
# Add required OMZ search paths.
local dir
for dir in \
"$ZSH/functions" \
"$ZSH/completions" \
"$ZSH_CUSTOM/functions" \
"$ZSH_CUSTOM/completions" \
"$ZSH_CACHE_DIR/completions"; do
(( ${fpath[(Ie)$dir]} )) || fpath=("$dir" $fpath)
done
# Public signal: OMZ bootstrap has completed.
typeset -g OMZ_IS_BOOTSTRAPPED=true
}
omz_bootstrap "$@"
+2 -11
View File
@@ -519,7 +519,7 @@ function _omz::plugin::load {
# Check if it has completion to reload compinit # Check if it has completion to reload compinit
local -a comp_files local -a comp_files
comp_files=($base/_*(N)) comp_files=($base/_*(N))
(( has_completion )) || has_completion=$(( $#comp_files > 0 )) has_completion=$(( $#comp_files > 0 ))
# Load the plugin # Load the plugin
if [[ -f "$base/$plugin.plugin.zsh" ]]; then if [[ -f "$base/$plugin.plugin.zsh" ]]; then
@@ -738,9 +738,6 @@ function _omz::reload {
# Old zsh versions don't have ZSH_ARGZERO # Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}" local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# ZSH_ARGZERO is how zsh was invoked, not the path to it, so re-resolve
# anything that is not absolute via $PATH at exec time (see #13919)
[[ "${zsh#-}" != /* ]] && (( $+commands[zsh] )) && zsh="zsh"
# Check whether to run a login shell # Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh" [[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
} }
@@ -906,11 +903,8 @@ function _omz::update {
} }
# Run update script # Run update script
local verbose_mode cooldown_days
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0 ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
[[ $cooldown_days == <-> ]] || cooldown_days=0
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode -c $cooldown_days || return $?
# Update last updated file # Update last updated file
zmodload zsh/datetime zmodload zsh/datetime
@@ -922,9 +916,6 @@ function _omz::update {
if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
# Old zsh versions don't have ZSH_ARGZERO # Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}" local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# ZSH_ARGZERO is how zsh was invoked, not the path to it, so re-resolve
# anything that is not absolute via $PATH at exec time (see #13919)
[[ "${zsh#-}" != /* ]] && (( $+commands[zsh] )) && zsh="zsh"
# Check whether to run a login shell # Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh" [[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
fi fi
+1 -1
View File
@@ -271,7 +271,7 @@ function _omz_diag_dump_check_core_commands() {
unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile
zle zmodload zparseopts zregexparse zstyle ) zle zmodload zparseopts zregexparse zstyle )
if is-at-least 5.1; then if is-at-least 5.1; then
reserved_words+=( declare export integer float local readonly typeset ) reserved_word+=( declare export integer float local readonly typeset )
else else
builtins+=( declare export integer float local readonly typeset ) builtins+=( declare export integer float local readonly typeset )
fi fi
+20 -42
View File
@@ -12,16 +12,10 @@ function __git_prompt_git() {
} }
function _omz_git_prompt_info() { function _omz_git_prompt_info() {
# Get the git dir and the current branch name in one call. Outside a repo # If we are on a folder not tracked by git, get out.
# there is no output. On a detached HEAD the branch is "HEAD". On an unborn # Otherwise, check for hide-info at global and local repository level
# branch git exits non-zero after printing the git dir. if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
local -a info || [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
info=("${(@f)$(__git_prompt_git rev-parse --git-dir --abbrev-ref HEAD 2> /dev/null)}")
local unborn=$(( $? != 0 ))
[[ -n "$info[1]" ]] || return 0
# Check for hide-info at global and local repository level
if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
return 0 return 0
fi fi
@@ -29,15 +23,11 @@ function _omz_git_prompt_info() {
# - the current branch name # - the current branch name
# - the tag name if we are on a tag # - the tag name if we are on a tag
# - the short SHA of the current commit # - the short SHA of the current commit
# a git dir path may contain newlines, so the branch is the last line local ref
local ref="$info[-1]" ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
if (( unborn )); then || ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) || return 0
elif [[ "$ref" == HEAD ]]; then
ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \ || ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|| return 0 || return 0
fi
# Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info # Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info
local upstream local upstream
@@ -49,27 +39,16 @@ function _omz_git_prompt_info() {
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref//\%/%%}${upstream//\%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}" echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref//\%/%%}${upstream//\%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
} }
# Match an extended regular expression against a subject, forcing the C locale
# only for the duration of the call.
#
# OHMYZSH-13330: zsh's "=~" operator delegates to the C library regex, which
# aborts with REG_ILLSEQ when the subject contains an invalid byte sequence
# under a multibyte locale (e.g. a filename with non-UTF-8 bytes in `git
# status` output). Forcing the C locale makes every byte a valid character,
# so the regex matching never fails that way. `git status --porcelain` is
# locale-independent, so this does not change the parsed output.
#
# OHMYZSH-13985: the locale must be scoped to this function and not set for
# the whole caller. Assigning LC_ALL makes zsh re-run setlocale() right away,
# so leaving it set while the rest of the caller runs breaks multibyte
# handling there — most visibly, `echo` refuses to expand Unicode escapes in
# theme prompt symbols ("character not in range").
function _omz_git_prompt_status_match() {
local -x LC_ALL=C
[[ "$1" =~ "$2" ]]
}
function _omz_git_prompt_status() { function _omz_git_prompt_status() {
# OHMYZSH-13330: avoid "regex matching error: illegal byte sequence".
# zsh's "=~" operator delegates to the C library regex, which aborts with
# REG_ILLSEQ when the subject contains an invalid byte sequence under a
# multibyte locale (e.g. a filename with non-UTF-8 bytes in `git status`
# output). Forcing the C locale makes every byte a valid character, so the
# regex matching below never fails that way. `git status --porcelain` is
# locale-independent, so this does not change the parsed output.
local -x LC_ALL=C
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return [[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
# Maps a git status prefix to an internal constant # Maps a git status prefix to an internal constant
@@ -134,11 +113,11 @@ function _omz_git_prompt_status() {
status_lines=("${(@f)${status_text}}") status_lines=("${(@f)${status_text}}")
# If the tracking line exists, get and parse it # If the tracking line exists, get and parse it
if _omz_git_prompt_status_match "$status_lines[1]" "^## [^ ]+ \[(.*)\]"; then if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
local branch_statuses local branch_statuses
branch_statuses=("${(@s/,/)match}") branch_statuses=("${(@s/,/)match}")
for branch_status in $branch_statuses; do for branch_status in $branch_statuses; do
if ! _omz_git_prompt_status_match "$branch_status" "(behind|diverged|ahead) ([0-9]+)?"; then if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
continue continue
fi fi
local last_parsed_status=$prefix_constant_map[$match[1]] local last_parsed_status=$prefix_constant_map[$match[1]]
@@ -151,7 +130,7 @@ function _omz_git_prompt_status() {
local status_constant="${prefix_constant_map[$status_prefix]}" local status_constant="${prefix_constant_map[$status_prefix]}"
local status_regex=$'(^|\n)'"$status_prefix" local status_regex=$'(^|\n)'"$status_prefix"
if _omz_git_prompt_status_match "$status_text" "$status_regex"; then if [[ "$status_text" =~ $status_regex ]]; then
statuses_seen[$status_constant]=1 statuses_seen[$status_constant]=1
fi fi
done done
@@ -254,8 +233,7 @@ function parse_git_dirty() {
FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}" FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}"
;; ;;
esac esac
# only non-emptiness matters, so keep one line instead of the whole list STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1)
__git_prompt_git status ${FLAGS} 2> /dev/null | read -r STATUS
fi fi
if [[ -n $STATUS ]]; then if [[ -n $STATUS ]]; then
echo "$ZSH_THEME_GIT_PROMPT_DIRTY" echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
-1
View File
@@ -21,7 +21,6 @@ function chruby_prompt_info \
azure_prompt_info \ azure_prompt_info \
tf_prompt_info \ tf_prompt_info \
conda_prompt_info \ conda_prompt_info \
go_prompt_info \
{ {
return 1 return 1
} }
+4 -10
View File
@@ -14,16 +14,10 @@ FX=(
reverse "%{%}" no-reverse "%{%}" reverse "%{%}" no-reverse "%{%}"
) )
# Build the tables with array operations instead of a 256-iteration loop for color in {000..255}; do
() { FG[$color]="%{[38;5;${color}m%}"
setopt localoptions noksharrays BG[$color]="%{[48;5;${color}m%}"
local -a codes fg bg done
codes=({000..255})
fg=( "%{"$'\e'"[38;5;"${^codes}"m%}" )
bg=( "%{"$'\e'"[48;5;"${^codes}"m%}" )
FG=( ${codes:^fg} )
BG=( ${codes:^bg} )
}
# Show all 256 colors with color number # Show all 256 colors with color number
function spectrum_ls() { function spectrum_ls() {
+2 -8
View File
@@ -22,8 +22,7 @@ function title {
print -Pn "\e]1;${1:q}\a" # set tab name print -Pn "\e]1;${1:q}\a" # set tab name
;; ;;
screen*|tmux*) screen*|tmux*)
print -Pn "\e]2;${2:q}\e\\" # set tmux pane title print -Pn "\ek${1:q}\e\\" # set screen hardstatus
print -Pn "\ek${1:q}\e\\" # set screen hardstatus/tmux window name if `allow-rename` is on
;; ;;
*) *)
if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
@@ -32,12 +31,7 @@ function title {
else else
# Try to use terminfo to set the title if the feature is available # Try to use terminfo to set the title if the feature is available
if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then
# Emit the capabilities with echoti so terminfo does its own parameter print -Pn "${terminfo[tsl]}$1${terminfo[fsl]}"
# substitution: some terminals (vt320) take a column argument, and
# running prompt expansion over the capability string mangles it.
echoti tsl 0
print -Pn "$1"
echoti fsl
fi fi
fi fi
;; ;;
+35
View File
@@ -0,0 +1,35 @@
#!/usr/bin/zsh -df
set -eu
bootstrap_file="${0:A:h:h}/bootstrap.zsh"
assert() {
local condition="$1" message="$2"
if ! eval "$condition"; then
print -u2 "\e[31mError\e[0m: $message"
exit 1
fi
}
tmp==(:)
mkdir -p "$tmp/ohmyzsh"/{functions,completions,cache} "$tmp/ohmyzsh/custom"/{functions,completions}
export ZSH="$tmp/ohmyzsh"
unset ZSH_CUSTOM ZSH_CACHE_DIR OMZ_IS_BOOTSTRAPPED
fpath=()
source "$bootstrap_file"
assert '[[ "$OMZ_IS_BOOTSTRAPPED" == true ]]' "OMZ bootstrap signal should be true"
assert '[[ -d "$ZSH_CACHE_DIR/completions" ]]' "cache completions directory should exist"
assert '[[ "${fpath[(Ie)$ZSH/functions]}" -gt 0 ]]' "fpath should include OMZ functions"
assert '[[ "${fpath[(Ie)$ZSH/completions]}" -gt 0 ]]' "fpath should include OMZ completions"
assert '[[ "${fpath[(Ie)$ZSH_CUSTOM/functions]}" -gt 0 ]]' "fpath should include custom functions"
assert '[[ "${fpath[(Ie)$ZSH_CUSTOM/completions]}" -gt 0 ]]' "fpath should include custom completions"
assert '[[ "${fpath[(Ie)$ZSH_CACHE_DIR/completions]}" -gt 0 ]]' "fpath should include cache completions"
touch "$ZSH_CACHE_DIR/completions/_bootstrap_ci_smoke"
assert '[[ -f "$ZSH_CACHE_DIR/completions/_bootstrap_ci_smoke" ]]' "completion cache write should succeed"
print -u2 "\e[32mSuccess\e[0m bootstrap inline invariants"
+88
View File
@@ -0,0 +1,88 @@
#!/usr/bin/zsh -df
set -u
bootstrap_file="${0:A:h:h}/bootstrap.zsh"
_assert() {
local condition="$1" message="$2"
if ! eval "$condition"; then
print -u2 "\e[31mError\e[0m: $message"
return 1
fi
}
test_bootstrap_sets_defaults_and_paths() {
local tmp==(:)
mkdir -p "$tmp/ohmyzsh"/{functions,completions,cache} "$tmp/ohmyzsh/custom"/{functions,completions}
(
set -e
export ZSH="$tmp/ohmyzsh"
unset ZSH_CUSTOM ZSH_CACHE_DIR OMZ_IS_BOOTSTRAPPED
fpath=()
source "$bootstrap_file"
_assert '[[ "$ZSH_CUSTOM" == "'"$tmp/ohmyzsh/custom"'" ]]' "ZSH_CUSTOM default should be set"
_assert '[[ "$ZSH_CACHE_DIR" == "'"$tmp/ohmyzsh/cache"'" ]]' "ZSH_CACHE_DIR default should be set"
_assert '[[ -d "'"$tmp/ohmyzsh/cache/completions"'" ]]' "completions dir should be created"
_assert '[[ "${fpath[(Ie)'"$tmp/ohmyzsh/functions"']}" -gt 0 ]]' "fpath should include OMZ functions dir"
_assert '[[ "${fpath[(Ie)'"$tmp/ohmyzsh/completions"']}" -gt 0 ]]' "fpath should include OMZ completions dir"
_assert '[[ "${fpath[(Ie)'"$tmp/ohmyzsh/custom/functions"']}" -gt 0 ]]' "fpath should include custom functions dir"
_assert '[[ "${fpath[(Ie)'"$tmp/ohmyzsh/custom/completions"']}" -gt 0 ]]' "fpath should include custom completions dir"
_assert '[[ "${fpath[(Ie)'"$tmp/ohmyzsh/cache/completions"']}" -gt 0 ]]' "fpath should include cache completions dir"
_assert '[[ "$OMZ_IS_BOOTSTRAPPED" == true ]]' "bootstrap signal should be set"
)
}
test_bootstrap_is_idempotent() {
local tmp==(:)
mkdir -p "$tmp/ohmyzsh"/{functions,completions,cache} "$tmp/ohmyzsh/custom"/{functions,completions}
(
set -e
export ZSH="$tmp/ohmyzsh"
unset ZSH_CUSTOM ZSH_CACHE_DIR OMZ_IS_BOOTSTRAPPED
fpath=()
source "$bootstrap_file"
source "$bootstrap_file"
omz_bootstrap
_assert '[[ ${#fpath} -eq ${#${(u)fpath}} ]]' "fpath entries should not duplicate after repeated bootstrap"
_assert '[[ "$OMZ_IS_BOOTSTRAPPED" == true ]]' "bootstrap signal should remain true"
)
}
test_bootstrap_uses_writable_cache_fallback() {
local tmp==(:)
mkdir -p "$tmp/ohmyzsh"/{functions,completions} "$tmp/ohmyzsh/custom"/{functions,completions}
mkdir -p "$tmp/no-write" "$tmp/xdg-cache"
chmod 0555 "$tmp/no-write"
(
set -e
export ZSH="$tmp/ohmyzsh"
export XDG_CACHE_HOME="$tmp/xdg-cache"
export ZSH_CACHE_DIR="$tmp/no-write"
unset ZSH_CUSTOM OMZ_IS_BOOTSTRAPPED
fpath=()
source "$bootstrap_file"
_assert '[[ "$ZSH_CACHE_DIR" == "'"$tmp/xdg-cache/oh-my-zsh"'" ]]' "cache dir should fallback when not writable"
_assert '[[ -d "'"$tmp/xdg-cache/oh-my-zsh/completions"'" ]]' "fallback completions dir should be created"
_assert '[[ "${fpath[(Ie)'"$tmp/xdg-cache/oh-my-zsh/completions"']}" -gt 0 ]]' "fpath should include fallback completions dir"
)
}
tests=(
test_bootstrap_sets_defaults_and_paths
test_bootstrap_is_idempotent
test_bootstrap_uses_writable_cache_fallback
)
for test_name in $tests; do
print -u2 "Test: $test_name"
"$test_name" || exit 1
print -u2 "\e[32mSuccess\e[0m"
print -u2 ""
done
+104
View File
@@ -0,0 +1,104 @@
#!/usr/bin/zsh -df
set -euo pipefail
if (( $# != 2 )); then
print -u2 "Usage: $0 <manager> <positive|negative>"
exit 1
fi
manager="$1"
scenario="$2"
if [[ "$scenario" != "positive" && "$scenario" != "negative" ]]; then
print -u2 "scenario must be 'positive' or 'negative'"
exit 1
fi
repo_root="${0:A:h:h:h}"
tmp==(:)
workspace="$tmp/workspace"
home_dir="$tmp/home"
cache_dir="$tmp/cache"
zshrc="$tmp/.zshrc"
mkdir -p "$workspace" "$home_dir" "$cache_dir"
manager_install=''
manager_source=''
case "$manager" in
antigen)
manager_install='git clone https://github.com/zsh-users/antigen.git "$MANAGER_HOME/antigen" >/dev/null 2>&1'
manager_source='source "$MANAGER_HOME/antigen/antigen.zsh"'
;;
zinit)
manager_install='git clone https://github.com/zdharma-continuum/zinit.git "$MANAGER_HOME/zinit" >/dev/null 2>&1'
manager_source='source "$MANAGER_HOME/zinit/zinit.zsh"'
;;
zgen)
manager_install='git clone https://github.com/tarjoilija/zgen.git "$MANAGER_HOME/zgen" >/dev/null 2>&1'
manager_source='source "$MANAGER_HOME/zgen/zgen.zsh"'
;;
zplug)
manager_install='git clone https://github.com/zplug/zplug "$MANAGER_HOME/zplug" >/dev/null 2>&1'
manager_source='export ZPLUG_HOME="$MANAGER_HOME/zplug"; source "$ZPLUG_HOME/init.zsh"'
;;
antibody)
manager_install='command -v go >/dev/null 2>&1; export GOBIN="$MANAGER_HOME/bin"; mkdir -p "$GOBIN"; go install github.com/getantibody/antibody@latest >/dev/null 2>&1'
manager_source='"$MANAGER_HOME/bin/antibody" --version >/dev/null 2>&1'
;;
zulu)
manager_install='git clone https://github.com/zulu-zsh/zulu.git "$MANAGER_HOME/zulu" >/dev/null 2>&1'
manager_source='source "$MANAGER_HOME/zulu/zulu.zsh"'
;;
*)
print -u2 "Unsupported manager: $manager"
exit 1
;;
esac
cat > "$zshrc" <<RC
set -eo pipefail
export HOME="$home_dir"
export XDG_CACHE_HOME="$cache_dir"
export OMZ_ROOT="$repo_root"
export ZSH="\$OMZ_ROOT"
export MANAGER_HOME="$workspace/$manager"
mkdir -p "\$MANAGER_HOME"
$manager_install
$manager_source
RC
if [[ "$scenario" == "positive" ]]; then
cat >> "$zshrc" <<'RC'
source "$OMZ_ROOT/lib/bootstrap.zsh"
[[ "${OMZ_IS_BOOTSTRAPPED:-}" == true ]] || { print -u2 "bootstrap signal missing before OMZ load"; return 1; }
RC
else
cat >> "$zshrc" <<'RC'
[[ -z "${OMZ_IS_BOOTSTRAPPED:-}" ]] || { print -u2 "bootstrap signal unexpectedly set without hook"; return 1; }
source "$OMZ_ROOT/lib/bootstrap.zsh"
RC
fi
cat >> "$zshrc" <<RC
[[ "\${OMZ_IS_BOOTSTRAPPED:-}" == true ]] || { print -u2 "bootstrap signal not set before OMZ entrypoint sourcing"; return 1; }
source "\$OMZ_ROOT/lib/functions.zsh"
source "\$OMZ_ROOT/plugins/git/git.plugin.zsh"
autoload -Uz compinit
compinit -i -d "\$ZSH_CACHE_DIR/.zcompdump"
source "\$OMZ_ROOT/themes/robbyrussell.zsh-theme"
[[ -d "\$ZSH_CACHE_DIR/completions" ]] || { print -u2 "completions cache directory missing"; return 1; }
touch "\$ZSH_CACHE_DIR/completions/_ci_${manager}_${scenario}" || { print -u2 "completion cache write failed"; return 1; }
[[ -f "\$ZSH_CACHE_DIR/completions/_ci_${manager}_${scenario}" ]] || { print -u2 "completion cache file missing"; return 1; }
RC
zsh -df "$zshrc"
print -u2 "\e[32mSuccess\e[0m $manager $scenario"
+15 -38
View File
@@ -13,40 +13,13 @@ ZSH_THEME_RUBY_PROMPT_PREFIX="("
ZSH_THEME_RUBY_PROMPT_SUFFIX=")" ZSH_THEME_RUBY_PROMPT_SUFFIX=")"
# The command probes below fork a process each, and their result doesn't change
# from one shell to the next, so they're cached for a day (like lib/grep.zsh).
typeset -A __omz_probes
__omz_probe_cache="$ZSH_CACHE_DIR/appearance-probes"
__omz_probe_cached=("$__omz_probe_cache"(Nm-1))
[[ -z "$__omz_probe_cached" ]] || source "$__omz_probe_cache"
function __omz_test_cmd_args {
# Usage: __omz_test_cmd_args cmd args...
# Runs `cmd args... /dev/null` and remembers whether it succeeded, so a
# command needing two operands passes the first one itself:
# e.g. __omz_test_cmd_args gls --color -> gls --color /dev/null
# __omz_test_cmd_args diff --color /dev/null -> diff --color /dev/null /dev/null
local key="$*"
if (( ! ${+__omz_probes[$key]} )); then
command "$@" /dev/null &>/dev/null
__omz_probes[$key]=$?
if [[ -w "$ZSH_CACHE_DIR" ]]; then
print -r -- "__omz_probes=(" "${(@qqkv)__omz_probes}" ")" >| "$__omz_probe_cache"
fi
fi
return $__omz_probes[$key]
}
# Use diff --color if available # Use diff --color if available
if __omz_test_cmd_args diff --color /dev/null; then if command diff --color /dev/null{,} &>/dev/null; then
function diff { function diff {
command diff --color "$@" command diff --color "$@"
} }
fi fi
# Set up ls coloring. Done in a function so the early return below still
# reaches the cleanup at the end of this file.
() {
# Don't set ls coloring if disabled # Don't set ls coloring if disabled
[[ "$DISABLE_LS_COLORS" != true ]] || return 0 [[ "$DISABLE_LS_COLORS" != true ]] || return 0
@@ -66,39 +39,43 @@ fi
fi fi
fi fi
function test-ls-args {
# Usage: test-ls-args cmd args...
# e.g. test-ls-args gls --color
command "$@" /dev/null &>/dev/null
}
# Find the option for using colors in ls, depending on the version # Find the option for using colors in ls, depending on the version
case "$OSTYPE" in case "$OSTYPE" in
netbsd*) netbsd*)
# On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors); # On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors);
# otherwise, leave ls as is, because NetBSD's ls doesn't support -G # otherwise, leave ls as is, because NetBSD's ls doesn't support -G
__omz_test_cmd_args gls --color && alias ls='gls --color=tty' test-ls-args gls --color && alias ls='gls --color=tty'
;; ;;
openbsd*) openbsd*)
# On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base, # On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base,
# with color and multibyte support) are available from ports. # with color and multibyte support) are available from ports.
# `colorls` will be installed on purpose and can't be pulled in by installing # `colorls` will be installed on purpose and can't be pulled in by installing
# coreutils (which might be installed for ), so prefer it to `gls`. # coreutils (which might be installed for ), so prefer it to `gls`.
__omz_test_cmd_args gls --color && alias ls='gls --color=tty' test-ls-args gls --color && alias ls='gls --color=tty'
__omz_test_cmd_args colorls -G && alias ls='colorls -G' test-ls-args colorls -G && alias ls='colorls -G'
;; ;;
(darwin|freebsd)*) (darwin|freebsd)*)
# This alias works by default just using $LSCOLORS # This alias works by default just using $LSCOLORS
__omz_test_cmd_args ls -G && alias ls='ls -G' test-ls-args ls -G && alias ls='ls -G'
# Only use GNU ls if installed and there are user defaults for $LS_COLORS, # Only use GNU ls if installed and there are user defaults for $LS_COLORS,
# as the default coloring scheme is not very pretty # as the default coloring scheme is not very pretty
zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \ zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \
&& __omz_test_cmd_args gls --color \ && test-ls-args gls --color \
&& alias ls='gls --color=tty' && alias ls='gls --color=tty'
;; ;;
*) *)
if __omz_test_cmd_args ls --color; then if test-ls-args ls --color; then
alias ls='ls --color=tty' alias ls='ls --color=tty'
elif __omz_test_cmd_args ls -G; then elif test-ls-args ls -G; then
alias ls='ls -G' alias ls='ls -G'
fi fi
;; ;;
esac esac
}
unfunction __omz_test_cmd_args unfunction test-ls-args
unset __omz_probes __omz_probe_cache __omz_probe_cached
+14 -139
View File
@@ -50,31 +50,14 @@ unset -f omz_f
# If ZSH is not defined, use the current script's directory. # If ZSH is not defined, use the current script's directory.
[[ -n "$ZSH" ]] || export ZSH="${${(%):-%x}:a:h}" [[ -n "$ZSH" ]] || export ZSH="${${(%):-%x}:a:h}"
# Set ZSH_CUSTOM to the path where your custom config files # Shared, manager-agnostic bootstrap.
# and plugins exists, or else we will use the default custom/ source "$ZSH/lib/bootstrap.zsh"
[[ -n "$ZSH_CUSTOM" ]] || ZSH_CUSTOM="$ZSH/custom"
# Set ZSH_CACHE_DIR to the path where cache files should be created
# or else we will use the default cache/
[[ -n "$ZSH_CACHE_DIR" ]] || ZSH_CACHE_DIR="$ZSH/cache"
# Make sure $ZSH_CACHE_DIR is writable, otherwise use a directory in $HOME
if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh"
fi
# Create cache and completions dir and add to $fpath
[[ -d "$ZSH_CACHE_DIR/completions" ]] || mkdir -p "$ZSH_CACHE_DIR/completions"
(( ${fpath[(Ie)$ZSH_CACHE_DIR/completions]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
# Check for updates on initial load... # Check for updates on initial load...
source "$ZSH/tools/check_for_upgrade.sh" source "$ZSH/tools/check_for_upgrade.sh"
# Initializes Oh My Zsh # Initializes Oh My Zsh
# add a function path
fpath=($ZSH/{functions,completions} $ZSH_CUSTOM/{functions,completions} $fpath)
# Load all stock functions (from $fpath files) called below. # Load all stock functions (from $fpath files) called below.
autoload -U compaudit compinit zrecompile autoload -U compaudit compinit zrecompile
@@ -100,28 +83,7 @@ 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 LocalHostName if possible. # macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible.
# scutil costs a fork on every start, so remember its answer for a day SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
# (like lib/grep.zsh) and re-check sooner if $HOST changes.
__omz_host_cache="$ZSH_CACHE_DIR/localhostname"
__omz_host_cached=("$__omz_host_cache"(Nm-1))
__omz_host_key=
SHORT_HOST=
if [[ -n "$__omz_host_cached" ]]; then
if ! { read -r __omz_host_key && read -r SHORT_HOST } < "$__omz_host_cache"; then
__omz_host_key=
SHORT_HOST=
fi
fi
if [[ "$__omz_host_key" != "$HOST" || -z "$SHORT_HOST" ]]; then
# only cache what scutil actually answered, so a transient failure
# doesn't pin the fallback name for a day
if SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) && [[ -n "$SHORT_HOST" ]]; then
[[ ! -w "$ZSH_CACHE_DIR" ]] || print -rl -- "$HOST" "$SHORT_HOST" >| "$__omz_host_cache"
else
SHORT_HOST="${HOST/.*/}"
fi
fi
unset __omz_host_cache __omz_host_cached __omz_host_key
else else
SHORT_HOST="${HOST/.*/}" SHORT_HOST="${HOST/.*/}"
fi fi
@@ -131,101 +93,13 @@ if [[ -z "$ZSH_COMPDUMP" ]]; then
ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}" ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
fi fi
# Resolve the commit $ZSH is checked out at into $REPLY by reading the git # Construct zcompdump OMZ metadata
# directory, so that no git process is forked on every startup. zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
# Handles .git files (worktrees, submodules), worktree common dirs, detached
# HEADs and packed refs. Returns 1 if anything is unexpected.
_omz_git_head() {
local gitdir="$ZSH/.git" common head ref
local -a lines
REPLY=
# .git may be a file pointing at the real git dir
if [[ -f "$gitdir" ]]; then
read -r head 2>/dev/null < "$gitdir" || return 1
[[ "$head" = "gitdir: "* ]] || return 1
gitdir="${head#gitdir: }"
[[ -n "$gitdir" ]] || return 1
[[ "$gitdir" = /* ]] || gitdir="$ZSH/$gitdir"
fi
# worktrees keep their refs in the common git dir
common="$gitdir"
if [[ -f "$gitdir/commondir" ]]; then
read -r common 2>/dev/null < "$gitdir/commondir" || return 1
[[ "$common" = /* ]] || common="$gitdir/$common"
fi
[[ -r "$gitdir/HEAD" ]] || return 1
read -r head 2>/dev/null < "$gitdir/HEAD" || return 1
if [[ "$head" = ref:\ * ]]; then
ref="${head#ref: }"
# Only use well-formed full ref names as paths. Besides matching Git's ref
# rules, this prevents a malformed HEAD from escaping the git directory.
[[ "$ref" = refs/?* \
&& "$ref" != *..* \
&& "$ref" != *//* \
&& "$ref" != */ \
&& "$ref" != */.* \
&& "$ref" != *.lock \
&& "$ref" != *.lock/* \
&& "$ref" != *. \
&& "$ref" != *'@{'* \
&& "$ref" != *[[:cntrl:]\ \~\^\:\?\*\[\\]* \
]] || return 1
case "$ref" in
# These namespaces are private to each worktree and are never resolved
# from the common directory or its packed-refs file.
refs/bisect/*|refs/worktree/*|refs/rewritten/*)
[[ -r "$gitdir/$ref" ]] || return 1
read -r REPLY 2>/dev/null < "$gitdir/$ref" || return 1
;;
*)
if [[ -r "$common/$ref" ]]; then
read -r REPLY 2>/dev/null < "$common/$ref" || return 1
elif [[ -r "$common/packed-refs" ]]; then
lines=("${(@f)$(<"$common/packed-refs")}")
REPLY="${lines[(r)* ${(b)ref}]%% *}"
else
return 1
fi
;;
esac
else
# detached HEAD: the file holds the commit itself
REPLY="$head"
fi
# only an object ID is a usable answer: a symbolic ref, a malformed file or
# a missed packed entry all fall through to the git fallback instead
[[ -n "$REPLY" && -z "${REPLY//[0-9a-f]/}" ]] \
&& (( ${#REPLY} == 40 || ${#REPLY} == 64 ))
}
# Construct zcompdump OMZ metadata. The helper reports through $REPLY, so
# call it in a scope that keeps that out of the global namespace.
() {
local REPLY
_omz_git_head || REPLY="$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
typeset -g zcompdump_revision="#omz revision: $REPLY"
}
zcompdump_fpath="#omz fpath: $fpath" zcompdump_fpath="#omz fpath: $fpath"
unset -f _omz_git_head
# Check whether the zcompdump file carries the current OMZ metadata lines
_omz_compdump_has_metadata() {
local -a lines
[[ -r "$ZSH_COMPDUMP" ]] || return 1
lines=("${(@f)$(<"$ZSH_COMPDUMP")}")
(( ${lines[(Ie)$zcompdump_revision]} && ${lines[(Ie)$zcompdump_fpath]} ))
}
# Delete the zcompdump file if OMZ zcompdump metadata changed # Delete the zcompdump file if OMZ zcompdump metadata changed
zcompdump_refresh=0 if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
if ! _omz_compdump_has_metadata; then || ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then
command rm -f "$ZSH_COMPDUMP" command rm -f "$ZSH_COMPDUMP"
zcompdump_refresh=1 zcompdump_refresh=1
fi fi
@@ -243,8 +117,9 @@ else
compinit -u -d "$ZSH_COMPDUMP" compinit -u -d "$ZSH_COMPDUMP"
fi fi
# Append zcompdump metadata if missing (compinit may have regenerated the file) # Append zcompdump metadata if missing
if (( zcompdump_refresh )) || ! _omz_compdump_has_metadata; then if (( $zcompdump_refresh )) \
|| ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null; then
# Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error # Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error
# See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489 # See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489
tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF
@@ -254,12 +129,9 @@ $zcompdump_fpath
EOF EOF
fi fi
unset zcompdump_revision zcompdump_fpath zcompdump_refresh unset zcompdump_revision zcompdump_fpath zcompdump_refresh
unset -f _omz_compdump_has_metadata
# zcompile the completion dump file if the .zwc is older or missing. # zcompile the completion dump file if the .zwc is older or missing.
# Test that first so the lock directory and zrecompile are skipped when it's fresh. if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
if [[ ! "${ZSH_COMPDUMP}.zwc" -nt "$ZSH_COMPDUMP" ]] \
&& command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
zrecompile -q -p "$ZSH_COMPDUMP" zrecompile -q -p "$ZSH_COMPDUMP"
command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock" command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
fi fi
@@ -345,3 +217,6 @@ fi
# set completion colors to be the same as `ls`, after theme has been loaded # set completion colors to be the same as `ls`, after theme has been loaded
[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}" [[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"
# Public signal: full Oh My Zsh init script has completed.
typeset -g OMZ_IS_LOADED=true
+1 -5
View File
@@ -9,11 +9,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_op" ]]; then
_comps[op]=_op _comps[op]=_op
fi fi
zmodload -F zsh/files b:zf_mv op completion zsh >| "$ZSH_CACHE_DIR/completions/_op" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_op"
zf_mv -f -- =( op completion zsh ) "$TMPPREFIX"
} &|
# Load opswd function # Load opswd function
autoload -Uz opswd autoload -Uz opswd
-122
View File
@@ -1,122 +0,0 @@
# AppSignal CLI plugin
This plugin adds aliases, guard rails and completion for the
[AppSignal CLI](https://docs.appsignal.com/cli).
To use it, add `appsignal-cli` to the plugins array in your zshrc file:
```zsh
plugins=(... appsignal-cli)
```
## Requirements
[AppSignal CLI](https://docs.appsignal.com/cli) 2.1 or newer, installed and on
your `PATH`. The plugin does nothing if it is not:
```zsh
brew install appsignal/appsignal-cli/appsignal-cli
# or
curl -sSL https://github.com/appsignal/appsignal-cli/releases/latest/download/install.sh | sudo sh
```
Most commands need `appsignal-cli auth login` first.
## Aliases
| Alias | Command | Description |
| :------ | :----------------------------- | :--------------------------------- |
| `asig` | `appsignal-cli` | The AppSignal CLI itself |
| `aslog` | `appsignal-cli logs tail` | Stream log lines as they arrive |
| `asinc` | `appsignal-cli incidents list` | List incidents for an application |
`aslog` and `asinc` complete like the commands they stand in for, so
`aslog --<TAB>` offers the flags of `appsignal-cli logs tail`.
## Functions
| Function | Description |
| :-------------- | :----------------------------------------------------------------- |
| `appsignal-cli` | Wraps the CLI to confirm before irreversible commands. See Settings |
## Completion
Every command completes with a description of what it does, at every level, and
so do their flags and allowed values: incident states and severities, sort
orders, log severities, trigger fields and comparison operators, output formats
and skill targets. `samples` and `sample` complete like `traces`, as they do in
the CLI itself.
`--org` completes offline from the `org` key of your project's
`.appsignal.toml` and of the global config.
The AppSignal CLI ships no completion generator of its own, so `_appsignal-cli`
is written from its command definitions and kept in this repository. It targets
AppSignal CLI 2.1.x.
## Settings
Set these with `zstyle` in your zshrc, before Oh My Zsh is sourced.
### Confirming destructive commands
```zsh
zstyle ':omz:plugins:appsignal-cli' confirm-destructive no
```
By default the plugin asks for confirmation before four operations that the CLI
itself performs without a prompt:
- `appsignal-cli logs metrics delete`
- `appsignal-cli logs triggers delete`
- `appsignal-cli triggers archive`, which also closes the trigger's alerts and
incidents
- `appsignal-cli incidents update --state CLOSED` when it names more than one
incident, since that flag accepts a comma-separated list
Nothing else is intercepted, and the prompt is skipped when stdin is not a
terminal, so scripts, pipelines and CI are unaffected. Set the style to `no` to
turn the prompt off entirely, or run `command appsignal-cli` for a single
invocation.
### Completing applications
```zsh
zstyle ':omz:plugins:appsignal-cli' dynamic-app-completion yes
```
Off by default. When enabled, `--app`, `--app-id` and `--environment` are
completed from `appsignal-cli apps list --output json`, showing each
application's name and environment next to its ID instead of making you copy
IDs by hand. It is opt-in because it runs the CLI and makes a network call when
you press <kbd>Tab</kbd>, and because it needs you to be authenticated. Results
are cached for five minutes.
### Disabling the aliases
This works for every Oh My Zsh plugin:
```zsh
zstyle ':omz:plugins:appsignal-cli' aliases no
```
## Caveats
- `appsignal-cli` and the AppSignal Ruby gem's `appsignal` command are different
tools. The gem's command installs and diagnoses the agent inside your app;
this one queries your data. The plugin deliberately leaves `appsignal` alone,
so it keeps working in projects that use the gem.
- `appsignal-cli` is a shell function here. Run `command appsignal-cli` to reach
the binary directly.
- Most commands need exactly one of `--app-id` or `--app`. `--environment` only
narrows `--app`; it does nothing next to `--app-id`.
- `appsignal-cli project init` writes `.appsignal.toml`, and `auth login` then
stores OAuth tokens in it. Do not commit that file.
- `incidents delete-note`, `auth logout` and the `--clear-*` flags of
`logs metrics update` and `logs triggers update` are destructive too, but are
not prompted for: each affects a single note, login or field.
- `triggers create` and `triggers update` have their own `--format`, for the
format of the metric value. Everywhere else `--format` is a synonym for
`--output`.
- The CLI sends usage telemetry by default. `APPSIGNAL_CLI_TELEMETRY=0` turns it
off, and `APPSIGNAL_CLI_DEBUG=1` shows internal errors.
File diff suppressed because it is too large Load Diff
@@ -1,108 +0,0 @@
# AppSignal CLI: completion, aliases and guard rails.
# https://docs.appsignal.com/cli
if (( ! $+commands[appsignal-cli] )); then
return
fi
# Does this invocation need confirming? Sets REPLY to the reason.
#
# The command path is collected from the leading bare words. Only the global
# flags may precede a subcommand, so the first other flag ends the path: that
# way an option value such as `--app "My App"` is never mistaken for one.
function _appsignal_cli_is_destructive() {
zstyle -T ':omz:plugins:appsignal-cli' confirm-destructive || return 1
# Nobody to answer: CI and pipelines are unaffected.
[[ -t 0 ]] || return 1
local -a args=("$@") path numbers
local arg state=""
integer i=1 n=$# path_done=0
while (( i <= n )); do
arg="$args[i]"
case "$arg" in
--) break ;;
--state=*) state="${arg#--state=}"; path_done=1 ;;
--state) state="$args[i+1]"; (( i++ )); path_done=1 ;;
--number=*) numbers+=(${(s:,:)${arg#--number=}}); path_done=1 ;;
# --number takes one or more values, comma-separated or repeated.
--number)
path_done=1
while (( i < n )) && [[ "$args[i+1]" != -* ]]; do
(( i++ ))
numbers+=(${(s:,:)args[i]})
done
;;
# The output flag is global, so it can appear before the subcommand.
-o|--output|--format) (( i++ )) ;;
-o*|--output=*|--format=*) ;;
-*) path_done=1 ;;
*) (( path_done )) || path+=("$arg") ;;
esac
(( i++ ))
done
case "${(j: :)path[1,3]}" in
"logs metrics delete")
REPLY="deleting a log-derived metric cannot be undone."
return 0
;;
"logs triggers delete")
REPLY="deleting a log-based trigger cannot be undone."
return 0
;;
"triggers archive")
REPLY="archiving a trigger also closes its alerts and incidents."
return 0
;;
"incidents update")
if [[ "${(U)state}" == CLOSED ]] && (( $#numbers > 1 )); then
REPLY="this closes $#numbers incidents at once."
return 0
fi
;;
esac
return 1
}
# Adds a confirmation prompt before irreversible operations. Everything else
# passes straight through, so `logs tail` keeps streaming and pipes stay clean.
function appsignal-cli() {
local REPLY
if _appsignal_cli_is_destructive "$@"; then
print -u2 -- "appsignal-cli: $REPLY"
if ! read -q "?Continue? [y/N] "; then
print -u2 -- ""
return 130
fi
print -u2 -- ""
fi
command appsignal-cli "$@"
}
# Complete the aliases like the commands they stand in for.
if (( $+functions[compdef] )); then
_aslog() {
words=(appsignal-cli logs tail ${words[2,-1]})
(( CURRENT += 2 ))
_appsignal-cli
}
_asinc() {
words=(appsignal-cli incidents list ${words[2,-1]})
(( CURRENT += 2 ))
_appsignal-cli
}
compdef _appsignal-cli asig
compdef _aslog aslog
compdef _asinc asinc
fi
alias asig='appsignal-cli'
alias aslog='appsignal-cli logs tail'
alias asinc='appsignal-cli incidents list'
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_arduino-cli" ]]; then
fi fi
# Generate and load arduino-cli completion # Generate and load arduino-cli completion
zmodload -F zsh/files b:zf_mv arduino-cli completion zsh >! "$ZSH_CACHE_DIR/completions/_arduino-cli" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_arduino-cli"
zf_mv -f -- =( arduino-cli completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then
_comps[argocd]=_argocd _comps[argocd]=_argocd
fi fi
zmodload -F zsh/files b:zf_mv argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_argocd"
zf_mv -f -- =( argocd completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -12,8 +12,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
autoload -Uz _asdf autoload -Uz _asdf
_comps[asdf]=_asdf _comps[asdf]=_asdf
fi fi
zmodload -F zsh/files b:zf_mv asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_asdf"
zf_mv -f -- =( asdf completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -69,7 +69,7 @@ function asr() {
local -a available_regions local -a available_regions
available_regions=($(aws_regions)) available_regions=($(aws_regions))
if [[ -z "${available_regions[(r)$1]}" ]]; then if [[ -z "${available_regions[(r)$1]}" ]]; then
echo "${fg[red]}Available regions: \n$(aws_regions)${reset_color}" >&2 echo "${fg[red]}Available regions: \n$(aws_regions)"
return 1 return 1
fi fi
@@ -241,7 +241,7 @@ function aws_regions() {
function aws_profiles() { function aws_profiles() {
aws --no-cli-pager configure list-profiles 2> /dev/null && return aws --no-cli-pager configure list-profiles 2> /dev/null && return
[[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1 [[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
command grep -Eo '^[[:space:]]*\[[[:space:]]*(profile[[:space:]]+)?[^][:space:]]+[[:space:]]*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | command sed -E 's/^[[:space:]]*\[[[:space:]]*(profile[[:space:]]+)?([^][:space:]]+)[[:space:]]*\]$/\2/' grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g'
} }
function _aws_regions() { function _aws_regions() {
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_buf" ]]; then
fi fi
# Generate and load buf completion # Generate and load buf completion
zmodload -F zsh/files b:zf_mv buf completion zsh >! "$ZSH_CACHE_DIR/completions/_buf" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_buf"
zf_mv -f -- =( buf completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then
_comps[bun]=_bun _comps[bun]=_bun
fi fi
zmodload -F zsh/files b:zf_mv SHELL=zsh bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_bun"
zf_mv -f -- =( SHELL=zsh bun completions ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_charm" ]]; then
_comps[charm]=_charm _comps[charm]=_charm
fi fi
zmodload -F zsh/files b:zf_mv charm completion zsh >| "$ZSH_CACHE_DIR/completions/_charm" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_charm"
zf_mv -f -- =( charm completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_chezmoi" ]]; then
_comps[chezmoi]=_chezmoi _comps[chezmoi]=_chezmoi
fi fi
zmodload -F zsh/files b:zf_mv chezmoi completion zsh >| "$ZSH_CACHE_DIR/completions/_chezmoi" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_chezmoi"
zf_mv -f -- =( chezmoi completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_codex" ]]; then
_comps[codex]=_codex _comps[codex]=_codex
fi fi
zmodload -F zsh/files b:zf_mv codex completion zsh < /dev/null 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_codex" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_codex"
zf_mv -f -- =( codex completion zsh < /dev/null 2> /dev/null ) "$TMPPREFIX"
} &|
+8 -11
View File
@@ -99,21 +99,18 @@ $ find . -type f 2>/dev/null
## File extension aliases ## File extension aliases
These are special aliases that are triggered when a file name is passed as the command. For example, These are special aliases that are triggered when a file name is passed as the command. For example,
if the pdf file extension is aliased to `open_command`, running `file.pdf` opens that file with if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf`
whatever application your system uses for PDFs. that file will be open with `acroread`.
### Reading Docs ### Reading Docs
These use `open_command`, which picks the right opener for your platform: `open` on macOS,
`xdg-open` on Linux, `cygstart` on Cygwin.
| Alias | Command | Description | | Alias | Command | Description |
| ----- | -------------- | ----------------------------------------------- | | ----- | ---------- | ---------------------------------- |
| pdf | `open_command` | Opens up a .pdf file in your default viewer | | pdf | `acroread` | Opens up a document using acroread |
| ps | `open_command` | Opens up a .ps file in your default viewer | | ps | `gv` | Opens up a .ps file using gv |
| dvi | `open_command` | Opens up a .dvi file in your default viewer | | dvi | `xdvi` | Opens up a .dvi file using xdvi |
| chm | `open_command` | Opens up a .chm file in your default viewer | | chm | `xchm` | Opens up a .chm file using xchm |
| djvu | `open_command` | Opens up a .djvu file in your default viewer | | djvu | `djview` | Opens up a .djvu file using djview |
### Listing files inside a packed file ### Listing files inside a packed file
@@ -71,9 +71,12 @@ if is-at-least 4.2.0; then
_media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm) _media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm)
for ft in $_media_fts; do alias -s $ft=mplayer; done for ft in $_media_fts; do alias -s $ft=mplayer; done
# read documents with the platform's default application #read documents
_doc_fts=(pdf ps dvi chm djvu) alias -s pdf=acroread
for ft in $_doc_fts; do alias -s $ft=open_command; done alias -s ps=gv
alias -s dvi=xdvi
alias -s chm=xchm
alias -s djvu=djview
#list what's inside packed file #list what's inside packed file
alias -s zip="unzip -l" alias -s zip="unzip -l"
+1 -5
View File
@@ -25,8 +25,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_deno" ]]; then
_comps[deno]=_deno _comps[deno]=_deno
fi fi
zmodload -F zsh/files b:zf_mv deno completions zsh >| "$ZSH_CACHE_DIR/completions/_deno" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_deno"
zf_mv -f -- =( deno completions zsh ) "$TMPPREFIX"
} &|
-4
View File
@@ -17,7 +17,6 @@ plugins=(... docker-compose)
|-----------|----------------------------------|----------------------------------------------------------------------------------| |-----------|----------------------------------|----------------------------------------------------------------------------------|
| dco | `docker-compose` | Docker-compose main command | | dco | `docker-compose` | Docker-compose main command |
| dcb | `docker-compose build` | Build containers | | dcb | `docker-compose build` | Build containers |
| dcc | `docker-compose config` | Parse, resolve and render compose file in canonical format |
| dce | `docker-compose exec` | Execute command inside a container | | dce | `docker-compose exec` | Execute command inside a container |
| dcps | `docker-compose ps` | List containers | | dcps | `docker-compose ps` | List containers |
| dcrestart | `docker-compose restart` | Restart container | | dcrestart | `docker-compose restart` | Restart container |
@@ -35,6 +34,3 @@ plugins=(... docker-compose)
| dcpull | `docker-compose pull` | Pull image of a service | | dcpull | `docker-compose pull` | Pull image of a service |
| dcstart | `docker-compose start` | Start a container | | dcstart | `docker-compose start` | Start a container |
| dck | `docker-compose kill` | Kills containers | | dck | `docker-compose kill` | Kills containers |
| dcv | `docker-compose version` | Show version information |
| dcsts | `docker-compose stats` | Show stats of containers |
| dci | `docker-compose images` | List images |
@@ -6,7 +6,6 @@
alias dco="$dccmd" alias dco="$dccmd"
alias dcb="$dccmd build" alias dcb="$dccmd build"
alias dcc="$dccmd config"
alias dce="$dccmd exec" alias dce="$dccmd exec"
alias dcps="$dccmd ps" alias dcps="$dccmd ps"
alias dcrestart="$dccmd restart" alias dcrestart="$dccmd restart"
@@ -24,8 +23,5 @@ alias dclF="$dccmd logs -f --tail 0"
alias dcpull="$dccmd pull" alias dcpull="$dccmd pull"
alias dcstart="$dccmd start" alias dcstart="$dccmd start"
alias dck="$dccmd kill" alias dck="$dccmd kill"
alias dcv="$dccmd version"
alias dcsts="$dccmd stats"
alias dci="$dccmd images"
unset dccmd unset dccmd
+4 -9
View File
@@ -56,19 +56,14 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then
_comps[docker]=_docker _comps[docker]=_docker
fi fi
zmodload -F zsh/files b:zf_mv {
() {
local plugin_dir="$1"
# `docker completion` is only available from 23.0.0 on # `docker completion` is only available from 23.0.0 on
# docker version returns `Docker version 24.0.2, build cb74dfcd85` # docker version returns `Docker version 24.0.2, build cb74dfcd85`
# with `s:,:` remove the comma after the version, and select third word of it # with `s:,:` remove the comma after the version, and select third word of it
if zstyle -t ':omz:plugins:docker' legacy-completion || \ if zstyle -t ':omz:plugins:docker' legacy-completion || \
! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then ! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then
command cp "${plugin_dir}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker" command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
else else
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_docker" command docker completion zsh | tee "$ZSH_CACHE_DIR/completions/_docker" > /dev/null
zf_mv -f -- =( command docker completion zsh ) "$TMPPREFIX"
fi fi
} "${0:A:h}" &| } &|
+1 -5
View File
@@ -14,8 +14,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then
_comps[doctl]=_doctl _comps[doctl]=_doctl
fi fi
zmodload -F zsh/files b:zf_mv doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_doctl"
zf_mv -f -- =( doctl completion zsh ) "$TMPPREFIX"
} &|
+4 -23
View File
@@ -1,33 +1,14 @@
#!/bin/sh #!/bin/sh
emacsfun() { emacsfun() {
local cmd frames arg tty local cmd frames
# Build the Emacs Lisp command to check for suitable frames # Build the Emacs Lisp command to check for suitable frames
# See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep # See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep
for arg in "$@"; do case "$*" in
case "$arg" in *-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames
-t|--tty|-nw) tty=1; break ;; *) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns)
esac esac
done
if [ -n "$tty" ]; then
cmd="(memq 't (mapcar 'framep (frame-list)))" # if != nil, there are tty frames
else
cmd="(delete 't (mapcar 'framep (frame-list)))" # if != nil, there are graphical terminals (x, w32, ns)
fi
# A tty frame needs the client to stay attached, so drop the --no-wait the
# `emacs` alias adds. Otherwise emacsclient returns at once and nothing opens.
if [ -n "$tty" ]; then
for arg do
shift
case "$arg" in
--no-wait) continue ;;
esac
set -- "$@" "$arg"
done
fi
# Check if there are suitable frames # Check if there are suitable frames
frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )" frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )"
-30
View File
@@ -45,36 +45,6 @@ If `yes`, always add `-h` flag to add a header row for each column.
Default: `no` Default: `no`
### `links`
```zsh
zstyle ':omz:plugins:eza' 'links' yes|no
```
If `yes`, always add `-H` flag to show hard links for each file.
Default: `no`
### `octal`
```zsh
zstyle ':omz:plugins:eza' 'octal' yes|no
```
If `yes`, always add `-o` flag to show file permissions as octal numbers.
Default: `no`
### `inodes`
```zsh
zstyle ':omz:plugins:eza' 'inodes' yes|no
```
If `yes`, always add `-i` flag to show the inode for each file.
Default: `no`
### `show-group` ### `show-group`
```zsh ```zsh
+1 -15
View File
@@ -21,15 +21,6 @@ function _configure_eza() {
if zstyle -t ':omz:plugins:eza' 'header'; then if zstyle -t ':omz:plugins:eza' 'header'; then
_EZA_HEAD+=("h") _EZA_HEAD+=("h")
fi fi
if zstyle -t ':omz:plugins:eza' 'links'; then
_EZA_HEAD+=("H")
fi
if zstyle -t ':omz:plugins:eza' 'octal'; then
_EZA_HEAD+=("o")
fi
if zstyle -t ':omz:plugins:eza' 'inodes'; then
_EZA_HEAD+=("i")
fi
zstyle -s ':omz:plugins:eza' 'size-prefix' _val zstyle -s ':omz:plugins:eza' 'size-prefix' _val
case "${_val:l}" in case "${_val:l}" in
binary) binary)
@@ -61,14 +52,9 @@ function _configure_eza() {
if [[ $_val ]]; then if [[ $_val ]]; then
_EZA_TAIL+=("--time-style='$_val'") _EZA_TAIL+=("--time-style='$_val'")
fi fi
if zstyle -t ':omz:plugins:eza' 'hyperlink'; then if zstyle -t ":omz:plugins:eza" "hyperlink"; then
# eza >= 0.23 needs an explicit WHEN value
if command eza --hyperlink=auto --version &>/dev/null; then
_EZA_TAIL+=("--hyperlink=auto")
else
_EZA_TAIL+=("--hyperlink") _EZA_TAIL+=("--hyperlink")
fi fi
fi
} }
_configure_eza _configure_eza
+1 -5
View File
@@ -30,8 +30,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_flutter" ]]; then
_comps[flutter]=_flutter _comps[flutter]=_flutter
fi fi
zmodload -F zsh/files b:zf_mv flutter zsh-completion < /dev/null >| "$ZSH_CACHE_DIR/completions/_flutter" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_flutter"
zf_mv -f -- =( flutter zsh-completion < /dev/null ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_flux" ]]; then
_comps[flux]=_flux _comps[flux]=_flux
fi fi
zmodload -F zsh/files b:zf_mv flux completion zsh >| "$ZSH_CACHE_DIR/completions/_flux" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_flux"
zf_mv -f -- =( flux completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -10,11 +10,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_fnm" ]]; then
_comps[fnm]=_fnm _comps[fnm]=_fnm
fi fi
zmodload -F zsh/files b:zf_mv fnm completions --shell=zsh >| "$ZSH_CACHE_DIR/completions/_fnm" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_fnm"
zf_mv -f -- =( fnm completions --shell=zsh ) "$TMPPREFIX"
} &|
if zstyle -t ':omz:plugins:fnm' autostart; then if zstyle -t ':omz:plugins:fnm' autostart; then
local -a fnm_env_cmd local -a fnm_env_cmd
@@ -57,7 +57,7 @@ function frontend() {
codepen 'https://codepen.io/search/pens?q=' codepen 'https://codepen.io/search/pens?q='
compassdoc 'http://compass-style.org/search?q=' compassdoc 'http://compass-style.org/search?q='
cssflow 'http://www.cssflow.com/search?q=' cssflow 'http://www.cssflow.com/search?q='
dartlang $(_frontend_fallback 'dart.dev') dartlang 'https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/dart:'
emberjs $(_frontend_fallback 'emberjs.com/') emberjs $(_frontend_fallback 'emberjs.com/')
flowtype $(_frontend_fallback 'flow.org/en/docs/') flowtype $(_frontend_fallback 'flow.org/en/docs/')
fontello 'http://fontello.com/#search=' fontello 'http://fontello.com/#search='
-18
View File
@@ -1,18 +0,0 @@
# Grafana CLI plugin
This plugin adds completion for the [Grafana CLI (gcx)](https://github.com/grafana/gcx).
To use it, add `gcx` to the plugins array in your zshrc file:
```zsh
plugins=(... gcx)
```
This plugin does not add any aliases.
## Cache
This plugin caches the completion script and automatically updates it when the
plugin is loaded, which is usually when you start a new terminal emulator.
The cache is stored at `$ZSH_CACHE_DIR/completions/_gcx`.
-18
View File
@@ -1,18 +0,0 @@
# Autocompletion for the Grafana CLI (gcx).
if (( ! $+commands[gcx] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `gcx`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_gcx" ]]; then
typeset -g -A _comps
autoload -Uz _gcx
_comps[gcx]=_gcx
fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_gcx"
zf_mv -f -- =( gcx completion zsh ) "$TMPPREFIX"
} &|
+4 -1
View File
@@ -17,4 +17,7 @@ plugin is loaded, which is usually when you start up a new terminal emulator.
The cache is stored at: The cache is stored at:
- `$ZSH_CACHE_DIR/completions/_gh` completions script - `$ZSH/plugins/gh/_gh` completions script
- `$ZSH_CACHE_DIR/gh_version` version of GitHub CLI, used to invalidate
the cache.
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_gh" ]]; then
_comps[gh]=_gh _comps[gh]=_gh
fi fi
zmodload -F zsh/files b:zf_mv gh completion --shell zsh >| "$ZSH_CACHE_DIR/completions/_gh" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_gh"
zf_mv -f -- =( gh completion --shell zsh ) "$TMPPREFIX"
} &|
-2
View File
@@ -103,7 +103,6 @@ plugins=(... git)
| `glods` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short` | | `glods` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short` |
| `glol` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` | | `glol` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
| `glola` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all` | | `glola` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all` |
| `glolm` | `git log $(git_main_branch) --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
| `glols` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat` | | `glols` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat` |
| `glo` | `git log --oneline --decorate` | | `glo` | `git log --oneline --decorate` |
| `glog` | `git log --oneline --decorate --graph` | | `glog` | `git log --oneline --decorate --graph` |
@@ -255,7 +254,6 @@ receive further support.
| `git_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) | | `git_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) |
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise | | `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise | | `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise |
| `gbcopy` | Copies current branch name to clipboard |
| `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote | | `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote |
| `gbda` | Deletes all merged branches | | `gbda` | Deletes all merged branches |
| `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) | | `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) |
+2 -14
View File
@@ -49,16 +49,6 @@ function git_main_branch() {
return 1 return 1
} }
function gbcopy() {
command git rev-parse --git-dir &>/dev/null || return
local branch
branch="$(git_current_branch)" || return
[[ -n "$branch" ]] || return 1
print -rn -- "$branch" | clipcopy
}
function grename() { function grename() {
if [[ -z "$1" || -z "$2" ]]; then if [[ -z "$1" || -z "$2" ]]; then
echo "Usage: $0 old_branch new_branch" echo "Usage: $0 old_branch new_branch"
@@ -147,9 +137,8 @@ function gbda() {
# Copied and modified from James Roeder (jmaroeder) under MIT License # Copied and modified from James Roeder (jmaroeder) under MIT License
# https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish # https://github.com/jmaroeder/plugin-git/blob/216723ef4f9e8dde399661c39c80bdf73f4076c4/functions/gbda.fish
function gbds() { function gbds() {
local default_branch local default_branch=$(git_main_branch)
default_branch=$(git_main_branch) \ (( ! $? )) || default_branch=$(git_develop_branch)
|| default_branch=$(git_develop_branch)
git for-each-ref refs/heads/ "--format=%(refname:short)" | \ git for-each-ref refs/heads/ "--format=%(refname:short)" | \
while read branch; do while read branch; do
@@ -249,7 +238,6 @@ alias glod='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgre
alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all' alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all'
alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat' alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat'
alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"' alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
alias glolm='git log $(git_main_branch) --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
alias glo='git log --oneline --decorate' alias glo='git log --oneline --decorate'
alias glog='git log --oneline --decorate --graph' alias glog='git log --oneline --decorate --graph'
alias gloga='git log --oneline --decorate --graph --all' alias gloga='git log --oneline --decorate --graph --all'
-18
View File
@@ -1,18 +0,0 @@
# GitLab CLI plugin
This plugin adds completion for the [GitLab CLI](https://docs.gitlab.com/cli/).
To use it, add `glab` to the plugins array in your zshrc file:
```zsh
plugins=(... glab)
```
This plugin does not add any aliases.
## Cache
This plugin caches the completion script at `$ZSH_CACHE_DIR/completions/_glab`.
The cache is regenerated in the background whenever the plugin is loaded, which
usually happens when you start a new Zsh session.
-18
View File
@@ -1,18 +0,0 @@
# Autocompletion for the GitLab CLI (glab).
if (( ! $+commands[glab] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `glab`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_glab" ]]; then
typeset -g -A _comps
autoload -Uz _glab
_comps[glab]=_glab
fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_glab"
zf_mv -f -- =( glab completion -s zsh ) "$TMPPREFIX"
} &|
-15
View File
@@ -39,18 +39,3 @@ plugins=(... golang)
| gov | `go vet` | Vet examines Go source code and reports suspicious constructs | | gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
| gove | `go version` | Prints Go version | | gove | `go version` | Prints Go version |
| gow | `go work` | Work provides access to operations on workspaces | | gow | `go work` | Work provides access to operations on workspaces |
## Prompt
This plugin provides the `go_prompt_info` function to add the installed Go
version to your prompt.
For example:
```
PROMPT="%~$ "
RPROMPT='$(go_prompt_info)'
```
changes your prompt to:
```
~/go/project$ ▋ 1.22.3
```
+11 -95
View File
@@ -81,7 +81,6 @@ _go() {
'tool[run specified go tool]' 'tool[run specified go tool]'
'version[print Go version]' 'version[print Go version]'
'vet[run go tool vet on packages]' 'vet[run go tool vet on packages]'
'work[workspace maintenance]'
) )
if (( CURRENT == 2 )); then if (( CURRENT == 2 )); then
# explain go commands # explain go commands
@@ -89,38 +88,19 @@ _go() {
return return
fi fi
build_flags=( build_flags=(
'-C[change to dir before running the command]:directory:_path_files -/' '-a[force reinstallation of packages that are already up to date]'
'-a[force rebuilding of packages that are already up-to-date]'
'-n[print the commands but do not run them]' '-n[print the commands but do not run them]'
'-p[number of parallel builds]:number' '-p[number of parallel builds]:number'
'-race[enable data race detection]' '-race[enable data race detection]'
'-msan[enable interoperation with memory sanitizer]'
'-asan[enable interoperation with address sanitizer]'
'-cover[enable code coverage instrumentation]'
'-covermode[set the mode for coverage analysis]:mode:(set count atomic)'
'-coverpkg[apply coverage analysis to matching packages]:pattern'
'-v[print the names of packages as they are compiled]'
'-work[print temporary directory name and keep it]'
'-x[print the commands]' '-x[print the commands]'
'-asmflags[arguments to pass on each go tool asm invocation]:flags' '-work[print temporary directory name and keep it]'
'-buildmode[build mode to use]:mode:(archive c-archive c-shared default shared exe pie plugin)' '-ccflags[flags for 5c/6c/8c]:flags'
'-buildvcs[stamp binaries with version control information]:mode:(true false auto)' '-gcflags[flags for 5g/6g/8g]:flags'
'-compiler[name of compiler to use]:name:(gccgo gc)' '-ldflags[flags for 5l/6l/8l]:flags'
'-gccgoflags[arguments to pass on each gccgo compiler/linker invocation]:flags' '-gccgoflags[flags for gccgo]:flags'
'-gcflags[arguments to pass on each go tool compile invocation]:flags' '-compiler[name of compiler to use]:name'
'-installsuffix[suffix to use in the package installation directory]:suffix' '-installsuffix[suffix to add to package directory]:suffix'
'-json[emit build output in JSON suitable for automated processing]'
'-ldflags[arguments to pass on each go tool link invocation]:flags'
'-linkshared[build code that will be linked against shared libraries]'
'-mod[module download mode to use]:mode:(readonly vendor mod)'
'-modcacherw[leave newly-created directories in the module cache read-write]'
'-modfile[read and write an alternate go.mod file]:file:_files -g "*.mod"'
'-overlay[read a JSON config file that provides an overlay for build operations]:file:_files -g "*.json"'
'-pgo[specify the file path of a profile for profile-guided optimization]:file:_files'
'-pkgdir[install and load all packages from dir]:directory:_path_files -/'
'-tags[list of build tags to consider satisfied]:tags' '-tags[list of build tags to consider satisfied]:tags'
'-trimpath[remove all file system paths from the resulting executable]'
'-toolexec[program to use to invoke toolchain programs]:command'
) )
case ${words[2]} in case ${words[2]} in
@@ -145,20 +125,17 @@ _go() {
;; ;;
install) install)
_arguments -s -w : ${build_flags[@]} \ _arguments -s -w : ${build_flags[@]} \
"-v[show package names]" \
'*:importpaths:__go_packages' '*:importpaths:__go_packages'
;; ;;
get) get)
_arguments -s -w : \ _arguments -s -w : \
${build_flags[@]} \ ${build_flags[@]}
"-t[consider modules needed to build tests of packages]" \
"-u[update modules providing dependencies to newer minor or patch releases]" \
"-u=[update modules providing dependencies to patch releases]:mode:(patch)" \
"-tool[add a matching tool line to go.mod for each listed package]" \
"*:importpaths:__go_packages"
;; ;;
build) build)
_arguments -s -w : \ _arguments -s -w : \
${build_flags[@]} \ ${build_flags[@]} \
"-v[show package names]" \
"-o[output file]:file:_files" \ "-o[output file]:file:_files" \
"*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }" "*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
;; ;;
@@ -261,60 +238,6 @@ _go() {
;; ;;
esac esac
;; ;;
work)
local -a work_commands
work_commands+=(
'edit[edit go.work from tools or scripts]'
'init[initialize workspace file]'
'sync[sync workspace build list to modules]'
'use[add modules to workspace file]'
'vendor[make vendored copy of dependencies]'
)
if (( CURRENT == 3 )); then
_values 'go work commands' ${work_commands[@]} "help[display help]"
return
fi
case ${words[3]} in
help)
_values 'go work commands' ${work_commands[@]}
;;
edit)
_arguments -s -w : \
"-fmt[reformat the go.work file]" \
"-godebug[=key=value add a godebug key=value line]:key=value" \
"-dropgodebug[=key drop an existing godebug line]:key" \
"-use[=path add a use directive]:directory:_path_files -/" \
"-dropuse[=path drop a use directive]:directory:_path_files -/" \
"-replace[=old{@v}=new{@v} add a replacement of the given module path and version pair]:name" \
"-dropreplace[=old{@v} drop a replacement of the given module path and version pair]:name" \
"-go[={version} set the expected Go language version]:number" \
"-toolchain[=name set the Go toolchain to use]:name" \
"-print[print the final go.work in its text format]" \
"-json[print the final go.work file in JSON format]" \
"1:go.work file:_files -g 'go.work'"
;;
init)
_arguments -s -w : \
"*:module directories:_path_files -/"
;;
sync)
;;
use)
_arguments -s -w : \
"-r[search recursively for modules in the argument directories]" \
"*:module directories:_path_files -/"
;;
vendor)
_arguments -s -w : \
"-e[attempt to proceed despite errors encountered while loading packages]" \
"-v[print the names of vendored modules and packages]" \
"-o[create the vendor directory at the given path]:output directory:_path_files -/" \
"*:flags"
;;
esac
;;
help) help)
_values "${commands[@]}" \ _values "${commands[@]}" \
'environment[show Go environment variables available]' \ 'environment[show Go environment variables available]' \
@@ -324,13 +247,6 @@ _go() {
'testflag[description of testing flags]' \ 'testflag[description of testing flags]' \
'testfunc[description of testing functions]' 'testfunc[description of testing functions]'
;; ;;
version)
_arguments -s -w : \
"-m[print module version information]" \
"-v[report unrecognized files]" \
"-json[print module version information in JSON format]" \
"*:file:_files"
;;
run) run)
_arguments -s -w : \ _arguments -s -w : \
${build_flags[@]} \ ${build_flags[@]} \
-9
View File
@@ -36,12 +36,3 @@ alias gotofx='go tool fix'
alias gov='go vet' alias gov='go vet'
alias gove='go version' alias gove='go version'
alias gow='go work' alias gow='go work'
## prompt
function go_prompt_info() {
(( $+commands[go] )) || return
local go_prompt
go_prompt=$(go version | awk '{ print substr($3, 3) }')
[[ -z "${go_prompt}" ]] && return
echo "${ZSH_THEME_GO_PROMPT_PREFIX}${go_prompt:gs/%/%%}${ZSH_THEME_GO_PROMPT_SUFFIX}"
}
+4 -10
View File
@@ -284,9 +284,6 @@ __gradle_subcommand() {
'-Dorg.gradle.debug.suspend=[]' \ '-Dorg.gradle.debug.suspend=[]' \
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \ '-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \ '-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \
'-Dorg.gradle.isolated-projects.dangerously-ignore-problems=[]' \
'-Dorg.gradle.isolated-projects.diagnostics=[]' \
'-Dorg.gradle.isolated-projects=[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`.]' \
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \ '-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \
'-Dorg.gradle.java.installations.auto-detect=[]' \ '-Dorg.gradle.java.installations.auto-detect=[]' \
'-Dorg.gradle.java.installations.auto-download=[]' \ '-Dorg.gradle.java.installations.auto-download=[]' \
@@ -302,6 +299,8 @@ __gradle_subcommand() {
'-Dorg.gradle.problems.report=[Enables the HTML problems report.]' \ '-Dorg.gradle.problems.report=[Enables the HTML problems report.]' \
'-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \ '-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \
'-Dorg.gradle.tooling.parallel=[]' \ '-Dorg.gradle.tooling.parallel=[]' \
'-Dorg.gradle.unsafe.isolated-projects.diagnostics=[]' \
'-Dorg.gradle.unsafe.isolated-projects=[]' \
'-Dorg.gradle.vfs.verbose=[]' \ '-Dorg.gradle.vfs.verbose=[]' \
'-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false)' \ '-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false)' \
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]' \ '-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]' \
@@ -329,14 +328,12 @@ __gradle_subcommand() {
\*'--include-build[Includes the specified build in the composite.]:include build:_directories' \ \*'--include-build[Includes the specified build in the composite.]:include build:_directories' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \ (--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts)' \ \*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts)' \
(--no-isolated-projects)'--isolated-projects[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`. (incubating)]' \
'--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]' \ '--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]' \
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \ (--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \ (--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \ (--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
(--continue)'--no-continue[Stops task execution after a task failure.]' \ (--continue)'--no-continue[Stops task execution after a task failure.]' \
(--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \ (--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--isolated-projects)'--no-isolated-projects[Disables Isolated Projects. (incubating)]' \
(--parallel)'--no-parallel[Disables parallel project execution.]' \ (--parallel)'--no-parallel[Disables parallel project execution.]' \
(--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \ (--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \
{-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \ {-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \
@@ -424,9 +421,6 @@ _gradle() {
'-Dorg.gradle.debug.suspend=[]:->argument-expected' \ '-Dorg.gradle.debug.suspend=[]:->argument-expected' \
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false):->argument-expected' \ '-Dorg.gradle.debug=[]:org.gradle.debug:(true false):->argument-expected' \
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off):->argument-expected' \ '-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off):->argument-expected' \
'-Dorg.gradle.isolated-projects.dangerously-ignore-problems=[]:->argument-expected' \
'-Dorg.gradle.isolated-projects.diagnostics=[]:->argument-expected' \
'-Dorg.gradle.isolated-projects=[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`.]:->argument-expected' \
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories:->argument-expected' \ '-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories:->argument-expected' \
'-Dorg.gradle.java.installations.auto-detect=[]:->argument-expected' \ '-Dorg.gradle.java.installations.auto-detect=[]:->argument-expected' \
'-Dorg.gradle.java.installations.auto-download=[]:->argument-expected' \ '-Dorg.gradle.java.installations.auto-download=[]:->argument-expected' \
@@ -442,6 +436,8 @@ _gradle() {
'-Dorg.gradle.problems.report=[Enables the HTML problems report.]:->argument-expected' \ '-Dorg.gradle.problems.report=[Enables the HTML problems report.]:->argument-expected' \
'-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories:->argument-expected' \ '-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories:->argument-expected' \
'-Dorg.gradle.tooling.parallel=[]:->argument-expected' \ '-Dorg.gradle.tooling.parallel=[]:->argument-expected' \
'-Dorg.gradle.unsafe.isolated-projects.diagnostics=[]:->argument-expected' \
'-Dorg.gradle.unsafe.isolated-projects=[]:->argument-expected' \
'-Dorg.gradle.vfs.verbose=[]:->argument-expected' \ '-Dorg.gradle.vfs.verbose=[]:->argument-expected' \
'-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false):->argument-expected' \ '-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false):->argument-expected' \
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]:->argument-expected' \ '-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]:->argument-expected' \
@@ -470,14 +466,12 @@ _gradle() {
\*'--include-build[Includes the specified build in the composite.]:include build:_directories:->argument-expected' \ \*'--include-build[Includes the specified build in the composite.]:include build:_directories:->argument-expected' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \ (--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts):->argument-expected' \ \*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts):->argument-expected' \
(--no-isolated-projects)'--isolated-projects[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`. (incubating)]' \
'--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]:->argument-expected' \ '--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \ (--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \ (--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \ (--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
(--continue)'--no-continue[Stops task execution after a task failure.]' \ (--continue)'--no-continue[Stops task execution after a task failure.]' \
(--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \ (--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--isolated-projects)'--no-isolated-projects[Disables Isolated Projects. (incubating)]' \
(--parallel)'--no-parallel[Disables parallel project execution.]' \ (--parallel)'--no-parallel[Disables parallel project execution.]' \
(--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \ (--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \
{-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \ {-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \
+1
View File
@@ -15,6 +15,7 @@ function gradle-or-gradlew() {
# if gradlew found, run it instead of gradle # if gradlew found, run it instead of gradle
if [[ -f "$project_root/gradlew" ]]; then if [[ -f "$project_root/gradlew" ]]; then
echo "executing gradlew instead of gradle"
"$project_root/gradlew" "$@" "$project_root/gradlew" "$@"
else else
command gradle "$@" command gradle "$@"
+1 -5
View File
@@ -9,9 +9,5 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_hasura" ]]; then
source "$ZSH_CACHE_DIR/completions/_hasura" source "$ZSH_CACHE_DIR/completions/_hasura"
else else
source "$ZSH_CACHE_DIR/completions/_hasura" source "$ZSH_CACHE_DIR/completions/_hasura"
zmodload -F zsh/files b:zf_mv hasura completion zsh --file "$ZSH_CACHE_DIR/completions/_hasura" >/dev/null &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_hasura"
zf_mv -f -- =( hasura completion zsh ) "$TMPPREFIX"
} &|
fi fi
+1 -5
View File
@@ -13,11 +13,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_hcloud" ]]; then
_comps[hcloud]=_hcloud _comps[hcloud]=_hcloud
fi fi
zmodload -F zsh/files b:zf_mv hcloud completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_hcloud" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_hcloud"
zf_mv -f -- =( hcloud completion zsh 2> /dev/null ) "$TMPPREFIX"
} &|
# Main alias # Main alias
alias hc='hcloud' alias hc='hcloud'
+1 -5
View File
@@ -9,11 +9,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_helm" ]]; then
source "$ZSH_CACHE_DIR/completions/_helm" source "$ZSH_CACHE_DIR/completions/_helm"
else else
source "$ZSH_CACHE_DIR/completions/_helm" source "$ZSH_CACHE_DIR/completions/_helm"
zmodload -F zsh/files b:zf_mv helm completion zsh | tee "$ZSH_CACHE_DIR/completions/_helm" >/dev/null &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_helm"
zf_mv -f -- =( helm completion zsh ) "$TMPPREFIX"
} &|
fi fi
alias h='helm' alias h='helm'
-163
View File
@@ -1,163 +0,0 @@
# herdr plugin
This plugin adds completion, aliases, an interactive session picker and a prompt
function for [herdr](https://herdr.dev), the runtime your
coding agents live on. herdr keeps agent terminals running in the background across
projects and machines, so you can close your terminal, reconnect later, and pick up
where the agents left off.
To use it, add `herdr` to the plugins array in your zshrc file:
```zsh
plugins=(... herdr)
```
Install herdr first if you have not already:
```sh
curl -fsSL https://herdr.dev/install.sh | sh # or: brew install herdr
```
## Learning herdr from the terminal
The fastest way to explore herdr is tab completion. Every command group and flag shows a
short description, so you can discover what is available without leaving the shell:
```
$ herdr <TAB>
agent -- Control and inspect agent panes
session -- Manage named persistent sessions
workspace -- Manage workspaces over the socket API
worktree -- Manage Git worktree-backed workspaces
...
$ herdr agent <TAB>
list -- List agents
prompt -- Submit a prompt to an agent
start -- Start a supported interactive agent in an existing pane
wait -- Wait until an agent reaches one of the requested states
...
```
A few other ways to learn as you go:
- `herdr <group>` with no subcommand prints that group's help, for example `herdr pane`.
- `herdr --skill` prints the instructions herdr gives to agents that drive it. It is a
good tour of the full command surface.
- Most control commands return JSON, so you can pipe them into `jq` in scripts.
## Common workflows
### Start and reconnect
```sh
herdr # launch, or attach to the default session
herdr --session work # use or create a named session
herdr session list # see running and stopped sessions
herdr session attach work # reconnect to a named session
herdr status # check the local client and running server
herdr update # install the latest release
```
### Organize work into workspaces and tabs
```sh
herdr workspace list
herdr workspace create --cwd ~/projects/app
herdr tab create
herdr pane split --direction right
herdr worktree create --branch feature/login # open a Git worktree in its own workspace
```
### Run and watch agents
```sh
herdr agent list # what is running, and is it idle, working or blocked
herdr agent start reviewer --kind claude --pane w1:p2
herdr agent prompt reviewer "review the last commit" --wait
herdr agent read reviewer # read the agent's terminal output
herdr agent wait reviewer --until idle
herdr agent attach reviewer # jump straight into that terminal
```
### Work across machines
```sh
herdr --remote user@build-box # attach through SSH with your local keybindings
```
### Keep the server healthy
```sh
herdr config check # validate config.toml
herdr server reload-config # apply config changes without restarting panes
herdr server stop
herdr channel set preview # switch between stable and preview releases
herdr integration status # which agent CLIs have herdr hooks installed
```
See the [CLI reference](https://herdr.dev/docs/cli-reference/) for every command and flag.
## Aliases
| Alias | Command |
| ------- | ----------------------------- |
| `hrdr` | `herdr` |
| `hrdrst` | `herdr status` |
| `hrdrup` | `herdr update` |
| `hrdrsl` | `herdr session list` |
| `hrdrsa` | `herdr session attach` |
| `hrdrr` | `herdr --remote` |
| `hrdral` | `herdr agent list` |
| `hrdrwl` | `herdr workspace list` |
| `hrdrwc` | `herdr workspace create` |
| `hrdrwt` | `herdr worktree create` |
| `hrdrps` | `herdr pane split` |
| `hrdrrc` | `herdr server reload-config` |
Tab completion works through the aliases too, so `hrdr agent <TAB>` completes the same
way `herdr agent <TAB>` does.
## Session picker
`hrdrs` lists your herdr sessions and attaches to the one you pick. It uses
[fzf](https://github.com/junegunn/fzf) when it is installed and falls back to a numbered
menu otherwise, so it works everywhere.
```
$ hrdrs
name status directory
1) default running /Users/me/.config/herdr
2) work stopped /Users/me/projects/app
Attach to session: 2
```
## Prompt
This plugin provides the `herdr_prompt_info` function to show the current pane ID in
your prompt when the shell is running inside herdr. It reads environment variables only,
so it adds no cost to prompt rendering.
For example:
```
PROMPT="%~$ "
RPROMPT='$(herdr_prompt_info)'
```
changes your prompt inside a herdr pane to:
```
~/projects/app$ ▋ w1:p4
```
and shows nothing outside herdr.
Wrap it with `ZSH_THEME_HERDR_PROMPT_PREFIX` and `ZSH_THEME_HERDR_PROMPT_SUFFIX`, for
example:
```
ZSH_THEME_HERDR_PROMPT_PREFIX="%{$fg[cyan]%}[herdr "
ZSH_THEME_HERDR_PROMPT_SUFFIX="]%{$reset_color%}"
```
## Cache
This plugin caches the completion script and automatically updates it when the plugin is
loaded, which is usually when you start a new terminal emulator.
The cache is stored at `$ZSH_CACHE_DIR/completions/_herdr`.
-68
View File
@@ -1,68 +0,0 @@
# Aliases, helpers and completion for herdr (https://herdr.dev), the runtime for coding agents.
# PROMPT
# Defined before the herdr check so themes can reference it on machines without herdr.
function herdr_prompt_info {
[[ "$HERDR_ENV" == 1 ]] || return
echo "${ZSH_THEME_HERDR_PROMPT_PREFIX}${HERDR_PANE_ID:gs/%/%%}${ZSH_THEME_HERDR_PROMPT_SUFFIX}"
}
if (( ! $+commands[herdr] )); then
return
fi
# ALIASES
alias hrdr='herdr'
alias hrdrst='herdr status'
alias hrdrup='herdr update'
alias hrdrsl='herdr session list'
alias hrdrsa='herdr session attach'
alias hrdrr='herdr --remote'
alias hrdral='herdr agent list'
alias hrdrwl='herdr workspace list'
alias hrdrwc='herdr workspace create'
alias hrdrwt='herdr worktree create'
alias hrdrps='herdr pane split'
alias hrdrrc='herdr server reload-config'
# FUNCTIONS
# Pick a session and attach to it, with fzf if available or a numbered menu otherwise.
function hrdrs {
setopt localoptions extendedglob
local -a lines
lines=("${(@f)$(herdr session list 2>/dev/null)}")
lines=("${(@)lines%%[[:space:]]#[^[:space:]]#}") # drop the socket column
if (( $#lines < 2 )); then
print "hrdrs: no herdr sessions found" >&2
return 1
fi
local choice
if (( $+commands[fzf] )); then
choice=$(print -l -- "${lines[@]}" | fzf --header-lines=1 --prompt='herdr session> ') || return
else
print -- "${lines[1]}"
local PS3="Attach to session: "
select choice in "${lines[@]:1}"; do
[[ -n "$choice" ]] && break
done
fi
[[ -n "$choice" ]] || return 1
herdr session attach "${${(z)choice}[1]}"
}
# COMPLETION
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `herdr`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_herdr" ]]; then
typeset -g -A _comps
autoload -Uz _herdr
_comps[herdr]=_herdr
fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_herdr"
zf_mv -f -- =( herdr completion zsh < /dev/null 2> /dev/null ) "$TMPPREFIX"
} &|
-28
View File
@@ -1,28 +0,0 @@
# hermes plugin
This plugin adds completions for the Hermes AI agent.
To use it, add `hermes` to the plugin array in your zshrc file:
```zsh
plugins=(... hermes)
```
## Usage
```zsh
hermes <TAB>
```
## Common Workflows
```zsh
# First time setup/updating overall config
hermes setup
# Starting the tui chat
hermes
# Changing default model
hermes model
```
-15
View File
@@ -1,15 +0,0 @@
if (( ! $+commands[hermes] )); then
return
fi
if [[ ! -f "$ZSH_CACHE_DIR/completions/_hermes" ]]; then
typeset -g -A _comps
autoload -Uz _hermes
_comps[hermes]=_hermes
fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_hermes"
zf_mv -f -- =( hermes completion zsh < /dev/null 2> /dev/null ) "$TMPPREFIX"
} &|
+1 -1
View File
@@ -75,7 +75,7 @@ Using [Zinit](https://github.com/zdharma-continuum/zinit):
1. Use the `Oh-my-zsh` Zinit snippet in `~/.zshrc`: 1. Use the `Oh-my-zsh` Zinit snippet in `~/.zshrc`:
zinit snippet OMZ::plugins/git/git.plugin.zsh zinit snippet OMZ::plugins/git/git.plugin.zsh`
2. Load the plugin in `~/.zshrc`: 2. Load the plugin in `~/.zshrc`:
@@ -295,8 +295,8 @@ _history-substring-search-begin() {
fi fi
# #
# Escape and join query parts with wildcard character '*' as seperator # Escape and join query parts with wildcard character '*' as separator
# `(j:CHAR:)` join array to string with CHAR as seperator # `(j:CHAR:)` join array to string with CHAR as separator
# #
local search_pattern="${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*" local search_pattern="${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*"
+5 -24
View File
@@ -19,54 +19,35 @@ plugins=(... jj)
| jjbd | `jj bookmark delete` | | jjbd | `jj bookmark delete` |
| jjbf | `jj bookmark forget` | | jjbf | `jj bookmark forget` |
| jjbl | `jj bookmark list` | | jjbl | `jj bookmark list` |
| jjblt | `jj bookmark list --tracked` |
| jjbm | `jj bookmark move` | | jjbm | `jj bookmark move` |
| jjbr | `jj bookmark rename` | | jjbr | `jj bookmark rename` |
| jjbs | `jj bookmark set` | | jjbs | `jj bookmark set` |
| jjbt | `jj bookmark track` | | jjbt | `jj bookmark track` |
| jjbu | `jj bookmark untrack` | | jjbu | `jj bookmark untrack` |
| jjc | `jj commit` | | jjc | `jj commit` |
| jjcfg | `jj config` |
| jjcfgl | `jj config list` |
| jjcmsg | `jj commit --message` | | jjcmsg | `jj commit --message` |
| jjd | `jj diff` | | jjd | `jj diff` |
| jjdmsg | `jj desc --message` | | jjdmsg | `jj desc --message` |
| jjds | `jj desc` | | jjds | `jj desc` |
| jjdst | `jj diff --stat` |
| jje | `jj edit` | | jje | `jj edit` |
| jjev | `jj evolog` |
| jjf | `jj file` |
| jjfl | `jj file list` |
| jjg | `jj git` |
| jjgcl | `jj git clone` | | jjgcl | `jj git clone` |
| jjgf | `jj git fetch` | | jjgf | `jj git fetch` |
| jjgfa | `jj git fetch --all-remotes` | | jjgfa | `jj git fetch --all-remotes` |
| jjgi | `jj git init` |
| jjgp | `jj git push` | | jjgp | `jj git push` |
| jjgpa | `jj git push --all` | | jjgpa | `jj git push --all` |
| jjgpd | `jj git push --deleted` | | jjgpd | `jj git push --deleted` |
| jjgpt | `jj git push --tracked` | | jjgpt | `jj git push --tracked` |
| jjgrl | `jj git remote list` |
| jjl | `jj log` | | jjl | `jj log` |
| jjla | `jj log -r "all()"` | | jjla | `jj log -r "all()"` |
| jjn | `jj new` | | jjn | `jj new` |
| jjnt | `jj new "trunk()"` | | jjnt | `jj new "trunk()"` |
| jjop | `jj op` |
| jjopl | `jj op log` |
| jjor | `jj op restore` |
| jjrb | `jj rebase` | | jjrb | `jj rebase` |
| jjrbm | `jj rebase -o "trunk()"` | | jjrbm | `jj rebase -d "trunk()"` |
| jjrs | `jj restore` | | jjrs | `jj restore` |
| jjrt | `cd "$(jj root \|\| echo .)"` | | jjrt | `cd "$(jj root \|\| echo .)"` |
| jjs | `jj show` |
| jjsp | `jj split` | | jjsp | `jj split` |
| jjsq | `jj squash` | | jjsq | `jj squash` |
| jjst | `jj status` | | jjst | `jj status` |
| jju | `jj undo` |
| jjw | `jj workspace` |
| jjwa | `jj workspace add` |
| jjwf | `jj workspace forget` |
| jjwl | `jj workspace list` |
## Prompt usage ## Prompt usage
@@ -120,10 +101,10 @@ that.
### Git async-prompt compatibility ### Git async-prompt compatibility
If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with the default If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with
git async-prompt mode. This is because async-prompt only registers its background worker when it detects the default git async-prompt mode. This is because async-prompt only registers its background worker
`$(git_prompt_info)` literally in your prompt variables. A wrapper like `$(_my_theme_vcs_info)` won't match, when it detects `$(git_prompt_info)` literally in your prompt variables. A wrapper like
so the async output stays empty. `$(_my_theme_vcs_info)` won't match, so the async output stays empty.
To fix this, add one of the following to your `.zshrc` **before** Oh My Zsh is sourced: To fix this, add one of the following to your `.zshrc` **before** Oh My Zsh is sourced:
+3 -23
View File
@@ -11,11 +11,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_jj" ]]; then
_comps[jj]=_jj _comps[jj]=_jj
fi fi
zmodload -F zsh/files b:zf_mv COMPLETE=zsh jj >| "$ZSH_CACHE_DIR/completions/_jj" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_jj"
zf_mv -f -- =( COMPLETE=zsh jj ) "$TMPPREFIX"
} &|
function __jj_prompt_jj() { function __jj_prompt_jj() {
local -a flags local -a flags
@@ -45,51 +41,35 @@ alias jjbc='jj bookmark create'
alias jjbd='jj bookmark delete' alias jjbd='jj bookmark delete'
alias jjbf='jj bookmark forget' alias jjbf='jj bookmark forget'
alias jjbl='jj bookmark list' alias jjbl='jj bookmark list'
alias jjblt='jj bookmark list --tracked'
alias jjbm='jj bookmark move' alias jjbm='jj bookmark move'
alias jjbr='jj bookmark rename' alias jjbr='jj bookmark rename'
alias jjbs='jj bookmark set' alias jjbs='jj bookmark set'
alias jjbt='jj bookmark track' alias jjbt='jj bookmark track'
alias jjbu='jj bookmark untrack' alias jjbu='jj bookmark untrack'
alias jjc='jj commit' alias jjc='jj commit'
alias jjcfg='jj config'
alias jjcfgl='jj config list'
alias jjcmsg='jj commit --message' alias jjcmsg='jj commit --message'
alias jjd='jj diff' alias jjd='jj diff'
alias jjdmsg='jj desc --message' alias jjdmsg='jj desc --message'
alias jjds='jj desc' alias jjds='jj desc'
alias jjdst='jj diff --stat'
alias jje='jj edit' alias jje='jj edit'
alias jjev='jj evolog'
alias jjf='jj file'
alias jjfl='jj file list'
alias jjg='jj git'
alias jjgcl='jj git clone' alias jjgcl='jj git clone'
alias jjgf='jj git fetch' alias jjgf='jj git fetch'
alias jjgfa='jj git fetch --all-remotes' alias jjgfa='jj git fetch --all-remotes'
alias jjgi='jj git init'
alias jjgp='jj git push' alias jjgp='jj git push'
alias jjgpa='jj git push --all' alias jjgpa='jj git push --all'
alias jjgpd='jj git push --deleted' alias jjgpd='jj git push --deleted'
alias jjgpt='jj git push --tracked' alias jjgpt='jj git push --tracked'
alias jjgrl='jj git remote list'
alias jjl='jj log' alias jjl='jj log'
alias jjla='jj log -r "all()"' alias jjla='jj log -r "all()"'
alias jjn='jj new' alias jjn='jj new'
alias jjnt='jj new "trunk()"' alias jjnt='jj new "trunk()"'
alias jjop='jj op'
alias jjopl='jj op log'
alias jjor='jj op restore'
alias jjrb='jj rebase' alias jjrb='jj rebase'
alias jjrbm='jj rebase -o "trunk()"' alias jjrbm='jj rebase -d "trunk()"'
alias jjrs='jj restore' alias jjrs='jj restore'
alias jjrt='cd "$(jj root || echo .)"' alias jjrt='cd "$(jj root || echo .)"'
alias jjs='jj show'
alias jjsp='jj split' alias jjsp='jj split'
alias jjsq='jj squash' alias jjsq='jj squash'
alias jjst='jj status' alias jjst='jj status'
alias jju='jj undo'
alias jjw='jj workspace'
alias jjwa='jj workspace add' alias jjwa='jj workspace add'
alias jjwf='jj workspace forget' alias jjwf='jj workspace forget'
alias jjwl='jj workspace list'
-1
View File
@@ -35,7 +35,6 @@ alias jdlr='juju debug-log --ms --replay'
alias jcon='juju consume' alias jcon='juju consume'
alias jeb='juju export-bundle' alias jeb='juju export-bundle'
alias jex='juju expose' alias jex='juju expose'
alias junex='juju unexpose'
alias jh='juju help' alias jh='juju help'
alias jkc='juju kill-controller -y -t 0' alias jkc='juju kill-controller -y -t 0'
alias jm='juju models' alias jm='juju models'
+1 -5
View File
@@ -11,8 +11,4 @@ fi
# and then generate it in the background. On first completion, # and then generate it in the background. On first completion,
# the actual completion file will be loaded. # the actual completion file will be loaded.
zmodload -F zsh/files b:zf_mv k9s completion zsh >| "$ZSH_CACHE_DIR/completions/_k9s" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_k9s"
zf_mv -f -- =( k9s completion zsh ) "$TMPPREFIX"
} &|
+1 -5
View File
@@ -11,11 +11,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_kind" ]]; then
fi fi
# Generate and load kind completion # Generate and load kind completion
zmodload -F zsh/files b:zf_mv kind completion zsh >! "$ZSH_CACHE_DIR/completions/_kind" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_kind"
zf_mv -f -- =( kind completion zsh ) "$TMPPREFIX"
} &|
# Register aliases # Register aliases
alias kicc="kind create cluster" alias kicc="kind create cluster"
+8 -17
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Kubernetes prompt info for bash, fish, and zsh # Kubernetes prompt helper for bash/zsh
# Displays current context and namespace # Displays current context and namespace
# Copyright 2026 Jon Mosco # Copyright 2026 Jon Mosco
@@ -121,7 +121,7 @@ _kube_ps1_color_fg() {
if [[ "${_KUBE_PS1_TPUT_AVAILABLE}" == "true" ]]; then if [[ "${_KUBE_PS1_TPUT_AVAILABLE}" == "true" ]]; then
_KUBE_PS1_FG_CODE="$(tput setaf "${_KUBE_PS1_FG_CODE}")" _KUBE_PS1_FG_CODE="$(tput setaf "${_KUBE_PS1_FG_CODE}")"
elif [[ $_KUBE_PS1_FG_CODE -ge 0 ]] && [[ $_KUBE_PS1_FG_CODE -le 255 ]]; then elif [[ $_KUBE_PS1_FG_CODE -ge 0 ]] && [[ $_KUBE_PS1_FG_CODE -le 255 ]]; then
_KUBE_PS1_FG_CODE=$'\033'"[38;5;${_KUBE_PS1_FG_CODE}m" _KUBE_PS1_FG_CODE="\033[38;5;${_KUBE_PS1_FG_CODE}m"
else else
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}" _KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
fi fi
@@ -154,7 +154,7 @@ _kube_ps1_color_bg() {
if [[ "${_KUBE_PS1_TPUT_AVAILABLE}" == "true" ]]; then if [[ "${_KUBE_PS1_TPUT_AVAILABLE}" == "true" ]]; then
_KUBE_PS1_BG_CODE="$(tput setab "${_KUBE_PS1_BG_CODE}")" _KUBE_PS1_BG_CODE="$(tput setab "${_KUBE_PS1_BG_CODE}")"
elif [[ $_KUBE_PS1_BG_CODE -ge 0 ]] && [[ $_KUBE_PS1_BG_CODE -le 255 ]]; then elif [[ $_KUBE_PS1_BG_CODE -ge 0 ]] && [[ $_KUBE_PS1_BG_CODE -le 255 ]]; then
_KUBE_PS1_BG_CODE=$'\033'"[48;5;${_KUBE_PS1_BG_CODE}m" _KUBE_PS1_BG_CODE="\033[48;5;${_KUBE_PS1_BG_CODE}m"
else else
_KUBE_PS1_BG_CODE="${_KUBE_PS1_DEFAULT_BG}" _KUBE_PS1_BG_CODE="${_KUBE_PS1_DEFAULT_BG}"
fi fi
@@ -412,8 +412,6 @@ kube_ps1() {
local KUBE_PS1 local KUBE_PS1
local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}" local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}"
local ctx_color="${KUBE_PS1_CTX_COLOR-red}"
local ns_color="${KUBE_PS1_NS_COLOR-cyan}"
# Background Color # Background Color
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")" [[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")"
@@ -434,29 +432,22 @@ kube_ps1() {
# Context # Context
if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
local ctx_color="${KUBE_PS1_CTX_COLOR:-red}"
# Allow custom function to override color based on context # Allow custom function to override color based on context
if [[ -n "${KUBE_PS1_CTX_COLOR_FUNCTION}" ]]; then if [[ -n "${KUBE_PS1_CTX_COLOR_FUNCTION}" ]]; then
ctx_color="$("${KUBE_PS1_CTX_COLOR_FUNCTION}" "${KUBE_PS1_CONTEXT}")" ctx_color="$("${KUBE_PS1_CTX_COLOR_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
fi fi
if [[ -n "${ctx_color}" ]]; then
KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}" KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
else
KUBE_PS1+="${KUBE_PS1_CONTEXT}"
fi
fi fi
# Namespace # Namespace
if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then
if [[ -n "${KUBE_PS1_DIVIDER}" && "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then if [[ -n "${KUBE_PS1_DIVIDER}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
KUBE_PS1+="${KUBE_PS1_DIVIDER}" KUBE_PS1+="${KUBE_PS1_DIVIDER}"
fi fi
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_NS_COLOR:-cyan}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
if [[ -n "${ns_color}" ]]; then
KUBE_PS1+="$(_kube_ps1_color_fg "${ns_color}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
else
KUBE_PS1+="${KUBE_PS1_NAMESPACE}"
fi
fi fi
# Suffix # Suffix
@@ -469,5 +460,5 @@ kube_ps1() {
# Close Background color if defined # Close Background color if defined
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_BG}${_KUBE_PS1_CLOSE_ESC}" [[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_BG}${_KUBE_PS1_CLOSE_ESC}"
printf '%s' "${KUBE_PS1}" echo "${KUBE_PS1}"
} }
+1 -3
View File
@@ -23,7 +23,6 @@ plugins=(... kubectl)
| 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 |
| kcrc | `kubectl config rename-context` | Rename a context from the kubeconfig file |
| 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 |
@@ -72,7 +71,6 @@ plugins=(... kubectl)
| | | **Secret management** | | | | **Secret management** |
| kgsec | `kubectl get secret` | Get secret for decoding | | kgsec | `kubectl get secret` | Get secret for decoding |
| kgseca | `kubectl get secret --all-namespaces` | List secrets across all namespaces | | kgseca | `kubectl get secret --all-namespaces` | List secrets across all namespaces |
| kesec | `kubectl edit secret` | Edit secret resource |
| kdsec | `kubectl describe secret` | Describe secret resource in detail | | kdsec | `kubectl describe secret` | Describe secret resource in detail |
| kdelsec | `kubectl delete secret` | Delete the secret | | kdelsec | `kubectl delete secret` | Delete the secret |
| | | **Deployment management** | | | | **Deployment management** |
@@ -131,7 +129,7 @@ plugins=(... kubectl)
| kdss | `kubectl describe statefulset` | Describe statefulset resource in detail | | kdss | `kubectl describe statefulset` | Describe statefulset resource in detail |
| kdelss | `kubectl delete statefulset` | Delete the statefulset | | kdelss | `kubectl delete statefulset` | Delete the statefulset |
| ksss | `kubectl scale statefulset` | Scale a statefulset | | ksss | `kubectl scale statefulset` | Scale a statefulset |
| krsss | `kubectl rollout status statefulset` | Check the rollout status of a statefulset | | krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment |
| krrss | `kubectl rollout restart statefulset` | Rollout restart a statefulset | | krrss | `kubectl rollout restart statefulset` | Rollout restart a statefulset |
| | | **Service Accounts management** | | | | **Service Accounts management** |
| kdsa | `kubectl describe sa` | Describe a service account in details | | kdsa | `kubectl describe sa` | Describe a service account in details |
+1 -7
View File
@@ -10,11 +10,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_kubectl" ]]; then
_comps[kubectl]=_kubectl _comps[kubectl]=_kubectl
fi fi
zmodload -F zsh/files b:zf_mv kubectl completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_kubectl" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_kubectl"
zf_mv -f -- =( kubectl completion zsh 2> /dev/null ) "$TMPPREFIX"
} &|
# This command is used a LOT both below and in daily life # This command is used a LOT both below and in daily life
alias k=kubectl alias k=kubectl
@@ -36,7 +32,6 @@ alias kcuc='kubectl config use-context'
alias kcsc='kubectl config set-context' alias kcsc='kubectl config set-context'
alias kcdc='kubectl config delete-context' alias kcdc='kubectl config delete-context'
alias kccc='kubectl config current-context' alias kccc='kubectl config current-context'
alias kcrc='kubectl config rename-context'
# List all contexts # List all contexts
alias kcgc='kubectl config get-contexts' alias kcgc='kubectl config get-contexts'
@@ -94,7 +89,6 @@ alias kdelcm='kubectl delete configmap'
# Secret management # Secret management
alias kgsec='kubectl get secret' alias kgsec='kubectl get secret'
alias kgseca='kubectl get secret --all-namespaces' alias kgseca='kubectl get secret --all-namespaces'
alias kesec='kubectl edit secret'
alias kdsec='kubectl describe secret' alias kdsec='kubectl describe secret'
alias kdelsec='kubectl delete secret' alias kdelsec='kubectl delete secret'
-2
View File
@@ -42,8 +42,6 @@ plugins=(... laravel)
| `pamen` | `php artisan make:enum` | | `pamen` | `php artisan make:enum` |
| `pami` | `php artisan make:interface` | | `pami` | `php artisan make:interface` |
| `pamtr` | `php artisan make:trait` | | `pamtr` | `php artisan make:trait` |
| `pamv` | `php artisan make:view` |
| `pammig` | `php artisan make:migration` |
## Clears ## Clears
-2
View File
@@ -31,8 +31,6 @@ alias pamcl='php artisan make:class'
alias pamen='php artisan make:enum' alias pamen='php artisan make:enum'
alias pami='php artisan make:interface' alias pami='php artisan make:interface'
alias pamtr='php artisan make:trait' alias pamtr='php artisan make:trait'
alias pamv='php artisan make:view'
alias pammig='php artisan make:migration'
# Clears # Clears
+1 -5
View File
@@ -10,8 +10,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_minikube" ]]; then
_comps[minikube]=_minikube _comps[minikube]=_minikube
fi fi
zmodload -F zsh/files b:zf_mv minikube completion zsh >| "$ZSH_CACHE_DIR/completions/_minikube" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_minikube"
zf_mv -f -- =( minikube completion zsh ) "$TMPPREFIX"
} &|
+3 -12
View File
@@ -1,14 +1,9 @@
if (( $+commands[mise] )); then if (( ! $+commands[mise] )); then
_mise_bin=mise
elif [[ -x ~/.local/bin/mise ]]; then
_mise_bin=~/.local/bin/mise
else
return return
fi fi
# Load mise hooks # Load mise hooks
eval "$($_mise_bin activate zsh)" eval "$(mise activate zsh)"
unset _mise_bin
# 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 `mise`. Otherwise, compinit will have already done that. # bind it to `mise`. Otherwise, compinit will have already done that.
@@ -19,8 +14,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_mise" ]]; then
fi fi
# Generate and load mise completion # Generate and load mise completion
zmodload -F zsh/files b:zf_mv mise completion zsh >| "$ZSH_CACHE_DIR/completions/_mise" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_mise"
zf_mv -f -- =( mise completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -157,13 +157,13 @@ case $state in
'*::file:_files' '*::file:_files'
;; ;;
(test) (test)
_path_files -X "All tests" -g "test/**/*_test.exs" -g "apps/*/test/**/*_test.exs" _files
;; ;;
(test.watch) (test.watch)
_files _files
;; ;;
(run) (run)
_files -g "*.(exs|ex)" _files
;; ;;
esac esac
;; ;;
+1 -5
View File
@@ -11,11 +11,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_molecule" ]]; then
_comps[molecule]=_molecule _comps[molecule]=_molecule
fi fi
zmodload -F zsh/files b:zf_mv _MOLECULE_COMPLETE=zsh_source molecule >| "$ZSH_CACHE_DIR/completions/_molecule" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_molecule"
zf_mv -f -- =( _MOLECULE_COMPLETE=zsh_source molecule ) "$TMPPREFIX"
} &|
# Alias # Alias
# molecule: https://docs.ansible.com/projects/molecule/ # molecule: https://docs.ansible.com/projects/molecule/
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_atlas" ]]; then
_comps[atlas]=_atlas _comps[atlas]=_atlas
fi fi
zmodload -F zsh/files b:zf_mv atlas completion zsh >| "$ZSH_CACHE_DIR/completions/atlas" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_atlas"
zf_mv -f -- =( atlas completion zsh ) "$TMPPREFIX"
} &|
+2 -10
View File
@@ -7,11 +7,7 @@ if (( $+commands[nsc] )); then
_comps[nsc]=_nsc _comps[nsc]=_nsc
fi fi
zmodload -F zsh/files b:zf_mv nsc completion zsh >| "$ZSH_CACHE_DIR/completions/_nsc" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_nsc"
zf_mv -f -- =( nsc completion zsh ) "$TMPPREFIX"
} &|
fi fi
if (( $+commands[nats] )); then if (( $+commands[nats] )); then
@@ -23,9 +19,5 @@ if (( $+commands[nats] )); then
_comps[nats]=_nats _comps[nats]=_nats
fi fi
zmodload -F zsh/files b:zf_mv nats --completion-script-zsh >| "$ZSH_CACHE_DIR/completions/_nats" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_nats"
zf_mv -f -- =( nats --completion-script-zsh ) "$TMPPREFIX"
} &|
fi fi
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_ngrok" ]]; then
_comps[ngrok]=_ngrok _comps[ngrok]=_ngrok
fi fi
zmodload -F zsh/files b:zf_mv ngrok completion zsh >| "$ZSH_CACHE_DIR/completions/_ngrok" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_ngrok"
zf_mv -f -- =( ngrok completion zsh ) "$TMPPREFIX"
} &|
+1 -3
View File
@@ -19,6 +19,4 @@ Provided aliases:
- `ot`: generates a MFA code based on the given key and copies it to the clipboard - `ot`: generates a MFA code based on the given key and copies it to the clipboard
(on Linux it relies on xsel, on MacOS X it uses pbcopy instead). (on Linux it relies on xsel, on MacOS X it uses pbcopy instead).
The plugin stores its internal files in `$OTP_HOME`, which can be set in your zshrc. The plugin uses `$HOME/.otp` to store its internal files.
If `$OTP_HOME` is not set it defaults to either `$HOME/.otp` or `$XDG_DATA_HOME/otp`,
depending on whether `~/.otp` already exists, or whether `$XDG_DATA_HOME` is set.
-6
View File
@@ -1,10 +1,4 @@
if [[ -z "$OTP_HOME" ]]; then
if [[ ! -d "$HOME/.otp" ]] && [[ -n "$XDG_DATA_HOME" ]]; then
export OTP_HOME="$XDG_DATA_HOME/otp"
else
export OTP_HOME=~/.otp export OTP_HOME=~/.otp
fi
fi
mkdir -p $OTP_HOME mkdir -p $OTP_HOME
function ot () { function ot () {
+1 -5
View File
@@ -11,8 +11,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_pass-cli" ]]; then
_comps[pass-cli]=_pass-cli _comps[pass-cli]=_pass-cli
fi fi
zmodload -F zsh/files b:zf_mv pass-cli completions zsh >| "$ZSH_CACHE_DIR/completions/_pass-cli" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_pass-cli"
zf_mv -f -- =( pass-cli completions zsh ) "$TMPPREFIX"
} &|
+4 -15
View File
@@ -43,11 +43,7 @@ else
_comps[pipenv]=_pipenv _comps[pipenv]=_pipenv
fi fi
zmodload -F zsh/files b:zf_mv _PIPENV_COMPLETE=zsh_source pipenv >| "$ZSH_CACHE_DIR/completions/_pipenv" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_pipenv"
zf_mv -f -- =( _PIPENV_COMPLETE=zsh_source pipenv ) "$TMPPREFIX"
} &|
fi fi
if zstyle -T ':omz:plugins:pipenv' auto-shell; then if zstyle -T ':omz:plugins:pipenv' auto-shell; then
@@ -56,28 +52,21 @@ if zstyle -T ':omz:plugins:pipenv' auto-shell; then
# deactivate shell if Pipfile doesn't exist and not in a subdir # deactivate shell if Pipfile doesn't exist and not in a subdir
if [[ ! -f "$PWD/Pipfile" ]]; then if [[ ! -f "$PWD/Pipfile" ]]; then
if [[ "$PIPENV_ACTIVE" == 1 ]]; then if [[ "$PIPENV_ACTIVE" == 1 ]]; then
# Compare whole path components: `$pipfile_dir"*` also matches unrelated if [[ "$PWD" != "$pipfile_dir"* ]]; then
# siblings that merely start with the same text (…/proj -> …/proj-docs),
# which would keep the virtualenv active outside the project.
local project_dir="${pipfile_dir%/}"
if [[ "$PWD" != "$project_dir" && "$PWD" != "$project_dir"/* ]]; then
unset PIPENV_ACTIVE pipfile_dir unset PIPENV_ACTIVE pipfile_dir
deactivate deactivate
fi fi
fi fi
fi fi
# activate the shell if Pipfile exists and its virtualenv is usable # activate the shell if Pipfile exists
if [[ "$PIPENV_ACTIVE" != 1 ]]; then if [[ "$PIPENV_ACTIVE" != 1 ]]; then
if [[ -f "$PWD/Pipfile" ]]; then if [[ -f "$PWD/Pipfile" ]]; then
local venv_path
if venv_path="$(pipenv --venv 2>/dev/null)" && [[ -n "$venv_path" && -f "$venv_path/bin/activate" ]]; then
export pipfile_dir="$PWD" export pipfile_dir="$PWD"
source "$venv_path/bin/activate" source "$(pipenv --venv)/bin/activate"
export PIPENV_ACTIVE=1 export PIPENV_ACTIVE=1
fi fi
fi fi
fi
} }
autoload -U add-zsh-hook autoload -U add-zsh-hook
-10
View File
@@ -23,16 +23,6 @@ plugins=(... podman)
| pirm | `podman image rm` | Remove one or more images | | pirm | `podman image rm` | Remove one or more images |
| pit | `podman image tag` | Add a name and tag to a particular image | | pit | `podman image tag` | Add a name and tag to a particular image |
| plo | `podman container logs` | Fetch the logs of a podman container | | plo | `podman container logs` | Fetch the logs of a podman container |
| pmif | `podman machine info` | Display machine host info |
| pmit | `podman machine init` | Initialize a virtual machine |
| pmis | `podman machine inspect` | Inspect an existing machine |
| pml | `podman machine list` | List machines |
| pmo | `podman machine os` | Manage a Podman virtual machine's OS |
| pmrm | `podman machine rm` | Remove an existing machine |
| pms | `podman machine set` | Set a virtual machine setting |
| pmss | `podman machine ssh` | SSH into an existing machine |
| pmst | `podman machine start` | Start an existing machine |
| pmsp | `podman machine stop` | Stop an existing machine |
| pnc | `podman network create` | Create a new network | | pnc | `podman network create` | Create a new network |
| pncn | `podman network connect` | Connect a container to a network | | pncn | `podman network connect` | Connect a container to a network |
| pndcn | `podman network disconnect` | Disconnect a container from a network | | pndcn | `podman network disconnect` | Disconnect a container from a network |
+1 -15
View File
@@ -10,11 +10,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_podman" ]]; then
_comps[podman]=_podman _comps[podman]=_podman
fi fi
zmodload -F zsh/files b:zf_mv podman completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_podman" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_podman"
zf_mv -f -- =( podman completion zsh 2> /dev/null ) "$TMPPREFIX"
} &|
alias pbl='podman build' alias pbl='podman build'
alias pcin='podman container inspect' alias pcin='podman container inspect'
@@ -26,16 +22,6 @@ alias pils='podman image ls'
alias pipu='podman image push' alias pipu='podman image push'
alias pirm='podman image rm' alias pirm='podman image rm'
alias pit='podman image tag' alias pit='podman image tag'
alias pmif='podman machine info'
alias pmit='podman machine init'
alias pmis='podman machine inspect'
alias pml='podman machine list'
alias pmo='podman machine os'
alias pmrm='podman machine rm'
alias pms='podman machine set'
alias pmss='podman machine ssh'
alias pmst='podman machine start'
alias pmsp='podman machine stop'
alias plo='podman container logs' alias plo='podman container logs'
alias pnc='podman network create' alias pnc='podman network create'
alias pncn='podman network connect' alias pncn='podman network connect'
+2 -4
View File
@@ -1,9 +1,7 @@
# Poetry Environment Plugin # Poetry Environment Plugin
This plugin automatically activates a Poetry environment when you enter a This plugin automatically changes poetry environment when you cd into or out of the project directory.
directory containing both `pyproject.toml` and `poetry.lock`. It keeps the Note: Script looks for pyproject.toml file to determine poetry if its a poetry environment
environment active in project subdirectories, switches to nested Poetry
projects, and deactivates it when you leave the project tree.
To use it, add `poetry-env` to the plugins array in your zshrc file: To use it, add `poetry-env` to the plugins array in your zshrc file:
+3 -12
View File
@@ -1,29 +1,20 @@
_togglePoetryShell() { _togglePoetryShell() {
# Determine if currently in a Poetry-managed directory # Determine if currently in a Poetry-managed directory
local in_poetry_dir=0 local in_poetry_dir=0
local in_active_poetry_dir=0
if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then
in_poetry_dir=1 in_poetry_dir=1
fi fi
# Deactivate when leaving the active project or entering a nested project # Deactivate the current environment if moving out of a Poetry directory or into a different Poetry directory
if [[ $poetry_active -eq 1 ]]; then if [[ $poetry_active -eq 1 ]] && { [[ $in_poetry_dir -eq 0 ]] || [[ "$PWD" != "$poetry_dir"* ]]; }; then
local project_dir="${poetry_dir%/}"
if [[ "$PWD" == "$project_dir" || "$PWD" == "$project_dir"/* ]]; then
in_active_poetry_dir=1
fi
if [[ $in_active_poetry_dir -eq 0 ]] ||
{ [[ $in_poetry_dir -eq 1 ]] && [[ "$PWD" != "$poetry_dir" ]]; }; then
export poetry_active=0 export poetry_active=0
unset poetry_dir unset poetry_dir
(( $+functions[deactivate] )) && deactivate (( $+functions[deactivate] )) && deactivate
fi fi
fi
# Activate the environment if in a Poetry directory and no environment is currently active # Activate the environment if in a Poetry directory and no environment is currently active
if [[ $in_poetry_dir -eq 1 ]] && [[ $poetry_active -ne 1 ]]; then if [[ $in_poetry_dir -eq 1 ]] && [[ $poetry_active -ne 1 ]]; then
local venv_dir=$(poetry env info --path 2>/dev/null) venv_dir=$(poetry env info --path 2>/dev/null)
# Handle case where poetry returns "." for in-project virtual environments # Handle case where poetry returns "." for in-project virtual environments
if [[ "$venv_dir" == "." ]]; then if [[ "$venv_dir" == "." ]]; then
venv_dir="$PWD/.venv" venv_dir="$PWD/.venv"
+1 -5
View File
@@ -39,8 +39,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_poetry" ]]; then
_comps[poetry]=_poetry _comps[poetry]=_poetry
fi fi
zmodload -F zsh/files b:zf_mv poetry completions zsh >| "$ZSH_CACHE_DIR/completions/_poetry" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_poetry"
zf_mv -f -- =( poetry completions zsh ) "$TMPPREFIX"
} &|
+3 -7
View File
@@ -10,16 +10,12 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then
_comps[procs]=_procs _comps[procs]=_procs
fi fi
zmodload -F zsh/files b:zf_mv {
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_procs"
autoload -Uz is-at-least autoload -Uz is-at-least
local _version=$(procs --version) local _version=$(procs --version)
zf_mv -f -- =(
if is-at-least "0.14" "${_version#procs }"; then if is-at-least "0.14" "${_version#procs }"; then
procs --gen-completion-out zsh procs --gen-completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs"
else else
procs --completion-out zsh procs --completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs"
fi fi
) "$TMPPREFIX"
} &| } &|
+1 -5
View File
@@ -10,11 +10,7 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_pulumi" ]]; then
_comps[pulumi]=_pulumi _comps[pulumi]=_pulumi
fi fi
zmodload -F zsh/files b:zf_mv pulumi gen-completion zsh >| "$ZSH_CACHE_DIR/completions/_pulumi" &|
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_pulumi"
zf_mv -f -- =( pulumi gen-completion zsh ) "$TMPPREFIX"
} &|
# Aliases # Aliases
alias pul='pulumi' alias pul='pulumi'

Some files were not shown because too many files have changed in this diff Show More