Author SHA1 Message Date
copilot-swe-agent[bot]androbbyrussell 4569fd2164 ci: check syntax for functions/* and completions/_*
Co-authored-by: robbyrussell <257+robbyrussell@users.noreply.github.com>
2026-09-06 17:59:50 +00:00
Robby RussellandClaude Fable 5.1 610d66ae06 perf(lib): autoload the omz CLI and omz_diagnostic_dump
lib/cli.zsh (944 lines) and lib/diagnostics.zsh (353 lines) were parsed
on every startup to define functions that most shells never call. Move
them to $ZSH/functions/, which is already on $fpath, and autoload the
two entry points from oh-my-zsh.sh instead. The `omz` completion moves
to $ZSH/completions/_omz where compinit picks it up on its own.

Measured on macOS arm64, zsh 5.9: ~1.7 ms less per interactive start.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-06 08:13:38 -07:00
242 changed files with 682 additions and 12062 deletions
-1
View File
@@ -5,7 +5,6 @@ plugins/eza/ @pepoluan
plugins/genpass/ @atoponce
plugins/git-lfs/ @hellovietduc
plugins/gitfast/ @felipec
plugins/hermes/ @Uhm-why
plugins/kube-ps1/ @mcornella
plugins/kubectl/ @mcornella
plugins/kubectx/ @mcornella
+4 -47
View File
@@ -12,14 +12,14 @@ dependencies:
plugins/gradle:
repo: gradle/gradle-completion
branch: master
version: 05693a01fcb246bc4e8fc32a8d561dc537aaedf2
version: 63578c9bc56134b80766e88957ba0239e6be2343
precopy: |
set -e
find . ! -name _gradle ! -name LICENSE -delete
plugins/history-substring-search:
repo: zsh-users/zsh-history-substring-search
branch: master
version: a0bdb0d47dbaba31dba2db7af8c48a5d9c74049a
version: 14c8d2e0ffaee98f2df9850b19944f32546fdea5
precopy: |
set -e
rm -f zsh-history-substring-search.plugin.zsh
@@ -30,7 +30,7 @@ dependencies:
plugins/kube-ps1:
repo: jonmosco/kube-ps1
branch: master
version: 7aaaeee5eaa29f920acd850ea63839d9f87b8ac5
version: 04af46f7fe888ad287abcab6699b9bb10234bc3d
precopy: |
set -e
find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete
@@ -46,7 +46,7 @@ dependencies:
plugins/z:
branch: master
repo: agkozak/zsh-z
version: 7f8ff4df11b50a14e3666c7cd212baa399c9b92a
version: 102fb78036ed76feedf623907483691777a1d510
precopy: |
set -e
rm -r tests
@@ -55,46 +55,3 @@ dependencies:
set -e
test -e _zshz && mv -f _zshz _z
test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh
plugins/zsh-autosuggestions:
repo: zsh-users/zsh-autosuggestions
branch: master
version: 85919cd1ffa7d2d5412f6d3fe437ebdbeeec4fc5
precopy: |
set -e
test -e README.md && mv -f README.md MANUAL.md
sed -i 's|\[INSTALL.md\](INSTALL.md)|[the Oh My Zsh plugin README](README.md)|' MANUAL.md
rm -f zsh-autosuggestions.plugin.zsh
mv -f zsh-autosuggestions.zsh zsh-autosuggestions.plugin.zsh
find . -depth -mindepth 1 \
! -path './LICENSE' \
! -path './MANUAL.md' \
! -path './src' \
! -path './src/*' \
! -path './zsh-autosuggestions.plugin.zsh' \
-delete
plugins/zsh-syntax-highlighting:
repo: zsh-users/zsh-syntax-highlighting
branch: master
version: e6683f20e5c38d3e5447f45845d04ddda75d0f23
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
+2 -2
View File
@@ -16,7 +16,7 @@ jobs:
contents: write # this is needed to push commits and branches
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0
with:
egress-policy: audit
@@ -26,7 +26,7 @@ jobs:
fetch-depth: 0
- name: Authenticate as @ohmyzsh
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ secrets.OHMYZSH_CLIENT_ID }}
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
@@ -1,7 +1,7 @@
certifi==2026.7.22
charset-normalizer==3.5.2
idna==3.20
charset-normalizer==3.5.1
idna==3.19
PyYAML==6.0.3
requests==2.34.2
semver==3.1.0
urllib3==2.8.0
semver==3.0.4
urllib3==2.7.0
+2 -2
View File
@@ -26,7 +26,7 @@ jobs:
- macos-latest
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0
with:
egress-policy: audit
@@ -47,7 +47,7 @@ jobs:
- test
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0
with:
egress-policy: audit
+3 -1
View File
@@ -24,7 +24,7 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0
with:
egress-policy: audit
@@ -36,6 +36,8 @@ jobs:
run: |
for file in ./oh-my-zsh.sh \
./lib/*.zsh \
./functions/* \
./completions/_* \
./plugins/*/*.plugin.zsh \
./plugins/*/_* \
./themes/*.zsh-theme; do
+2 -2
View File
@@ -17,12 +17,12 @@ jobs:
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0
with:
egress-policy: audit
- name: Authenticate as @ohmyzsh
id: generate-token
uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
with:
client-id: ${{ secrets.OHMYZSH_CLIENT_ID }}
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
+4 -4
View File
@@ -36,7 +36,7 @@ jobs:
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@ccd8616d44fd3846e67624a50d5aad6d37bf2d25 # v2.22.1
uses: step-security/harden-runner@05e31511f85b41b11d1cf0ef85d0992719546e2c # v2.21.0
with:
egress-policy: audit
@@ -46,20 +46,20 @@ jobs:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4
with:
results_file: results.sarif
results_format: sarif
publish_results: true
- name: "Upload artifact"
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: SARIF file
path: results.sarif
retention-days: 5
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
with:
sarif_file: results.sarif
-52
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)
[![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>
<summary>Table of Contents</summary>
@@ -45,7 +37,6 @@ Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
- [Using Plugins](#using-plugins)
- [Themes](#themes)
- [Selecting A Theme](#selecting-a-theme)
- [Shellsavers](#shellsavers)
- [FAQ](#faq)
- [Advanced Topics](#advanced-topics)
- [Advanced Installation](#advanced-installation)
@@ -242,33 +233,6 @@ If you only know which themes you don't like, you can add them similarly to an i
ZSH_THEME_RANDOM_IGNORED=(pygmalion tjkirch_mod)
```
### Shellsavers
Give your terminal a little downtime with `omz shellsaver`—our playful name for
terminal screensavers. The aquarium is the default; choose another scene to change the mood:
```zsh
omz shellsaver # A quiet aquarium full of sea shells
omz shellsaver logo # The updater's rainbow logo, bouncing around
omz shellsaver hermit # A slightly lost hermit crab
omz shellsaver party # A rainbow stage and a dancing crowd
```
Press any key or Ctrl-C to return to your shell. Screensavers run only when invoked
and restore the terminal when they exit. No plugin or configuration change is needed.
Use `omz help` to discover the command, and Tab to complete scene names and options.
```zsh
omz shellsaver aquarium --seconds 30 # Stop automatically after 30 seconds
omz shellsaver logo --mono # Use the terminal's foreground color
omz shellsaver --list # List scenes (aquarium is the default)
omz shellsaver --help # Show all scenes and options
```
Requires Zsh 5.8 or newer, `stty`, and an xterm-compatible terminal with alternate-screen
support. No additional animation package is required. `NO_COLOR` is respected.
A window of at least 49 columns by 18 rows is recommended.
### FAQ
If you have some more questions or issues, you might find a solution in our
@@ -502,22 +466,6 @@ zstyle ':omz:update' frequency 7
zstyle ':omz:update' frequency 0
```
By default, updates always pull the latest changes. If you'd rather let others kick the tires first
before an update reaches your machine, you can set a cooldown (in days). You'll still get everything —
just a little later:
```sh
# Only apply updates that are at least 10 days old
zstyle ':omz:update' cooldown 10
```
`omz update` honors this setting. If you call `upgrade.sh` directly, pass the same
value with `-c`, because that script does not read your `.zshrc`:
```sh
$ZSH/tools/upgrade.sh -c 10
```
### Updates Verbosity
You can also limit the update verbosity with the following settings:
+90
View File
@@ -0,0 +1,90 @@
#compdef omz
local -a cmds subcmds
cmds=(
'changelog:Print the changelog'
'help:Usage information'
'plugin:Manage plugins'
'pr:Manage Oh My Zsh Pull Requests'
'reload:Reload the current zsh session'
'shop:Open the Oh My Zsh shop'
'theme:Manage themes'
'update:Update Oh My Zsh'
'version:Show the version'
)
if (( CURRENT == 2 )); then
_describe 'command' cmds
elif (( CURRENT == 3 )); then
case "$words[2]" in
changelog) local -a refs
refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
_describe 'command' refs ;;
plugin) subcmds=(
'disable:Disable plugin(s)'
'enable:Enable plugin(s)'
'info:Get plugin information'
'list:List plugins'
'load:Load plugin(s)'
)
_describe 'command' subcmds ;;
pr) subcmds=('clean:Delete all Pull Request branches' 'test:Test a Pull Request')
_describe 'command' subcmds ;;
theme) subcmds=('list:List themes' 'set:Set a theme in your .zshrc file' 'use:Load a theme')
_describe 'command' subcmds ;;
esac
elif (( CURRENT == 4 )); then
case "${words[2]}::${words[3]}" in
plugin::(disable|enable|load))
local -aU valid_plugins
if [[ "${words[3]}" = disable ]]; then
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
_describe 'plugin' valid_plugins ;;
plugin::info)
local -aU plugins
plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
_describe 'plugin' plugins ;;
plugin::list)
local -a opts
opts=('--enabled:List enabled plugins only')
_describe -o 'options' opts ;;
theme::(set|use))
local -aU themes
themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
_describe 'theme' themes ;;
esac
elif (( CURRENT > 4 )); then
case "${words[2]}::${words[3]}" in
plugin::(enable|disable|load))
local -aU valid_plugins
if [[ "${words[3]}" = disable ]]; then
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
# Remove plugins already passed as arguments
# NOTE: $(( CURRENT - 1 )) is the last plugin argument completely passed, i.e. that which
# has a space after them. This is to avoid removing plugins partially passed, which makes
# the completion not add a space after the completed plugin.
local -a args
args=(${words[4,$(( CURRENT - 1))]})
valid_plugins=(${valid_plugins:|args})
_describe 'plugin' valid_plugins ;;
esac
fi
return 0
+3 -131
View File
@@ -1,5 +1,3 @@
#!/usr/bin/env zsh
function omz {
setopt localoptions noksharrays
[[ $# -gt 0 ]] || {
@@ -20,115 +18,6 @@ function omz {
_omz::$command "$@"
}
function _omz {
local -a cmds subcmds
cmds=(
'changelog:Print the changelog'
'help:Usage information'
'plugin:Manage plugins'
'pr:Manage Oh My Zsh Pull Requests'
'reload:Reload the current zsh session'
'shellsaver:Launch a whimsical terminal screensaver'
'shop:Open the Oh My Zsh shop'
'theme:Manage themes'
'update:Update Oh My Zsh'
'version:Show the version'
)
if [[ "$words[2]" == (screensaver|shellsaver) ]] && (( CURRENT > 2 )); then
_arguments \
'1:command:' \
'2::scene:(aquarium logo hermit party)' \
'--list[List available scenes]' \
'--mono[Use the default foreground color]' \
'--seconds[Exit after a number of seconds]:seconds:' \
'--snapshot[Print a plain-text still]::frame:' \
'--help[Show Shellsaver help]'
return
fi
if (( CURRENT == 2 )); then
_describe 'command' cmds
elif (( CURRENT == 3 )); then
case "$words[2]" in
changelog) local -a refs
refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
_describe 'command' refs ;;
plugin) subcmds=(
'disable:Disable plugin(s)'
'enable:Enable plugin(s)'
'info:Get plugin information'
'list:List plugins'
'load:Load plugin(s)'
)
_describe 'command' subcmds ;;
pr) subcmds=('clean:Delete all Pull Request branches' 'test:Test a Pull Request')
_describe 'command' subcmds ;;
theme) subcmds=('list:List themes' 'set:Set a theme in your .zshrc file' 'use:Load a theme')
_describe 'command' subcmds ;;
esac
elif (( CURRENT == 4 )); then
case "${words[2]}::${words[3]}" in
plugin::(disable|enable|load))
local -aU valid_plugins
if [[ "${words[3]}" = disable ]]; then
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
_describe 'plugin' valid_plugins ;;
plugin::info)
local -aU plugins
plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
_describe 'plugin' plugins ;;
plugin::list)
local -a opts
opts=('--enabled:List enabled plugins only')
_describe -o 'options' opts ;;
theme::(set|use))
local -aU themes
themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
_describe 'theme' themes ;;
esac
elif (( CURRENT > 4 )); then
case "${words[2]}::${words[3]}" in
plugin::(enable|disable|load))
local -aU valid_plugins
if [[ "${words[3]}" = disable ]]; then
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
# Remove plugins already passed as arguments
# NOTE: $(( CURRENT - 1 )) is the last plugin argument completely passed, i.e. that which
# has a space after them. This is to avoid removing plugins partially passed, which makes
# the completion not add a space after the completed plugin.
local -a args
args=(${words[4,$(( CURRENT - 1))]})
valid_plugins=(${valid_plugins:|args})
_describe 'plugin' valid_plugins ;;
esac
fi
return 0
}
# If run from a script, do not set the completion function
if (( ${+functions[compdef]} )); then
compdef _omz omz
fi
## Utility functions
function _omz::confirm {
@@ -187,7 +76,6 @@ Available commands:
plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests
reload Reload the current zsh session
shellsaver [scene] Launch a Shellsaver (aquarium by default)
shop Open the Oh My Zsh shop
theme <command> Manage themes
update Update Oh My Zsh
@@ -196,15 +84,6 @@ Available commands:
EOF
}
function _omz::shellsaver {
command zsh -f "$ZSH/tools/shellsaver.zsh" "$@"
}
# Hidden alias; only shellsaver is advertised in help and command completion.
function _omz::screensaver {
_omz::shellsaver "$@"
}
function _omz::changelog {
local version=${1:-HEAD} format=${3:-"--text"}
@@ -761,9 +640,6 @@ function _omz::reload {
# Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# ZSH_ARGZERO is how zsh was invoked, not the path to it, so re-resolve
# anything that is not absolute via $PATH at exec time (see #13919)
[[ "${zsh#-}" != /* ]] && (( $+commands[zsh] )) && zsh="zsh"
# Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
}
@@ -929,11 +805,8 @@ function _omz::update {
}
# Run update script
local verbose_mode cooldown_days
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
zstyle -s ':omz:update' cooldown cooldown_days || cooldown_days=0
[[ $cooldown_days == <-> ]] || cooldown_days=0
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode -c $cooldown_days || return $?
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
# Update last updated file
zmodload zsh/datetime
@@ -945,9 +818,6 @@ function _omz::update {
if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
# Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# ZSH_ARGZERO is how zsh was invoked, not the path to it, so re-resolve
# anything that is not absolute via $PATH at exec time (see #13919)
[[ "${zsh#-}" != /* ]] && (( $+commands[zsh] )) && zsh="zsh"
# Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
fi
@@ -974,3 +844,5 @@ function _omz::version {
printf "%s (%s)\n" "$version" "$commit"
)
}
omz "$@"
@@ -1,4 +1,4 @@
# diagnostics.zsh
# omz_diagnostic_dump
#
# Diagnostic and debugging support for oh-my-zsh
@@ -351,3 +351,5 @@ function _omz_diag_dump_os_specific_version() {
done
}
omz_diagnostic_dump "$@"
+1 -2
View File
@@ -178,8 +178,7 @@ function omz_urlencode() {
setopt norematchpcre
local -a opts
# Quote the specs so global aliases (e.g. common-aliases' P) don't expand here
zparseopts -D -E -a opts 'r' 'm' 'P'
zparseopts -D -E -a opts r m P
local in_str="$@"
local url_str=""
+10 -21
View File
@@ -12,16 +12,10 @@ function __git_prompt_git() {
}
function _omz_git_prompt_info() {
# Get the git dir and the current branch name in one call. Outside a repo
# there is no output. On a detached HEAD the branch is "HEAD". On an unborn
# branch git exits non-zero after printing the git dir.
local -a info
info=("${(@f)$(__git_prompt_git rev-parse --git-dir --abbrev-ref HEAD 2> /dev/null)}")
local unborn=$(( $? != 0 ))
[[ -n "$info[1]" ]] || return 0
# Check for hide-info at global and local repository level
if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
# If we are on a folder not tracked by git, get out.
# Otherwise, check for hide-info at global and local repository level
if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
|| [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
return 0
fi
@@ -29,15 +23,11 @@ function _omz_git_prompt_info() {
# - the current branch name
# - the tag name if we are on a tag
# - the short SHA of the current commit
# a git dir path may contain newlines, so the branch is the last line
local ref="$info[-1]"
if (( unborn )); then
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) || return 0
elif [[ "$ref" == HEAD ]]; then
ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|| return 0
fi
local ref
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
|| ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|| return 0
# Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info
local upstream
@@ -254,8 +244,7 @@ function parse_git_dirty() {
FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}"
;;
esac
# only non-emptiness matters, so keep one line instead of the whole list
__git_prompt_git status ${FLAGS} 2> /dev/null | read -r STATUS
STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1)
fi
if [[ -n $STATUS ]]; then
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
-1
View File
@@ -21,7 +21,6 @@ function chruby_prompt_info \
azure_prompt_info \
tf_prompt_info \
conda_prompt_info \
go_prompt_info \
{
return 1
}
+4 -10
View File
@@ -14,16 +14,10 @@ FX=(
reverse "%{%}" no-reverse "%{%}"
)
# Build the tables with array operations instead of a 256-iteration loop
() {
setopt localoptions noksharrays
local -a codes fg bg
codes=({000..255})
fg=( "%{"$'\e'"[38;5;"${^codes}"m%}" )
bg=( "%{"$'\e'"[48;5;"${^codes}"m%}" )
FG=( ${codes:^fg} )
BG=( ${codes:^bg} )
}
for color in {000..255}; do
FG[$color]="%{[38;5;${color}m%}"
BG[$color]="%{[48;5;${color}m%}"
done
# Show all 256 colors with color number
function spectrum_ls() {
+7 -15
View File
@@ -5,6 +5,7 @@
# See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1
# Fully supports screen, iterm, and probably most modern xterm and rxvt
# (In screen, only short_tab_title is used)
# Limited support for Apple Terminal (Terminal can't set window and tab separately)
function title {
setopt localoptions nopromptsubst
@@ -16,32 +17,23 @@ function title {
: ${2=$1}
case "$TERM" in
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*|wezterm*|nsterm*)
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*|wezterm*)
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
;;
screen*|tmux*)
print -Pn "\e]2;${2:q}\e\\" # set tmux pane title
print -Pn "\ek${1:q}\e\\" # set screen hardstatus/tmux window name if `allow-rename` is on
print -Pn "\ek${1:q}\e\\" # set screen hardstatus
;;
*)
case "$TERM_PROGRAM" in
"iTerm.app"|"Apple_Terminal")
if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
;;
*)
else
# Try to use terminfo to set the title if the feature is available
if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then
# Emit the capabilities with echoti so terminfo does its own parameter
# substitution: some terminals (vt320) take a column argument, and
# running prompt expansion over the capability string mangles it.
echoti tsl 0
print -Pn "$1"
echoti fsl
print -Pn "${terminfo[tsl]}$1${terminfo[fsl]}"
fi
;;
esac
fi
;;
esac
}
+54 -77
View File
@@ -13,92 +13,69 @@ ZSH_THEME_RUBY_PROMPT_PREFIX="("
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
if __omz_test_cmd_args diff --color /dev/null; then
if command diff --color /dev/null{,} &>/dev/null; then
function diff {
command diff --color "$@"
}
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
[[ "$DISABLE_LS_COLORS" != true ]] || return 0
# Don't set ls coloring if disabled
[[ "$DISABLE_LS_COLORS" != true ]] || return 0
# Default coloring for BSD-based ls
export LSCOLORS="Gxfxcxdxbxegedabagacad"
# Default coloring for BSD-based ls
export LSCOLORS="Gxfxcxdxbxegedabagacad"
# Default coloring for GNU-based ls
if [[ -z "$LS_COLORS" ]]; then
# Define LS_COLORS via dircolors if available. Otherwise, set a default
# equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors)
if (( $+commands[dircolors] )); then
[[ -f "$HOME/.dircolors" ]] \
&& source <(dircolors -b "$HOME/.dircolors") \
|| source <(dircolors -b)
else
export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43"
fi
# Default coloring for GNU-based ls
if [[ -z "$LS_COLORS" ]]; then
# Define LS_COLORS via dircolors if available. Otherwise, set a default
# equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors)
if (( $+commands[dircolors] )); then
[[ -f "$HOME/.dircolors" ]] \
&& source <(dircolors -b "$HOME/.dircolors") \
|| source <(dircolors -b)
else
export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43"
fi
fi
# Find the option for using colors in ls, depending on the version
case "$OSTYPE" in
netbsd*)
# 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
__omz_test_cmd_args gls --color && alias ls='gls --color=tty'
;;
openbsd*)
# On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base,
# with color and multibyte support) are available from ports.
# `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`.
__omz_test_cmd_args gls --color && alias ls='gls --color=tty'
__omz_test_cmd_args colorls -G && alias ls='colorls -G'
;;
(darwin|freebsd)*)
# This alias works by default just using $LSCOLORS
__omz_test_cmd_args ls -G && alias ls='ls -G'
# Only use GNU ls if installed and there are user defaults for $LS_COLORS,
# as the default coloring scheme is not very pretty
zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \
&& __omz_test_cmd_args gls --color \
&& alias ls='gls --color=tty'
;;
*)
if __omz_test_cmd_args ls --color; then
alias ls='ls --color=tty'
elif __omz_test_cmd_args ls -G; then
alias ls='ls -G'
fi
;;
esac
function test-ls-args {
# Usage: test-ls-args cmd args...
# e.g. test-ls-args gls --color
command "$@" /dev/null &>/dev/null
}
unfunction __omz_test_cmd_args
unset __omz_probes __omz_probe_cache __omz_probe_cached
# Find the option for using colors in ls, depending on the version
case "$OSTYPE" in
netbsd*)
# 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
test-ls-args gls --color && alias ls='gls --color=tty'
;;
openbsd*)
# On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base,
# with color and multibyte support) are available from ports.
# `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`.
test-ls-args gls --color && alias ls='gls --color=tty'
test-ls-args colorls -G && alias ls='colorls -G'
;;
(darwin|freebsd)*)
# This alias works by default just using $LSCOLORS
test-ls-args ls -G && alias ls='ls -G'
# Only use GNU ls if installed and there are user defaults for $LS_COLORS,
# as the default coloring scheme is not very pretty
zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \
&& test-ls-args gls --color \
&& alias ls='gls --color=tty'
;;
*)
if test-ls-args ls --color; then
alias ls='ls --color=tty'
elif test-ls-args ls -G; then
alias ls='ls -G'
fi
;;
esac
unfunction test-ls-args
+13 -121
View File
@@ -64,7 +64,7 @@ if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
fi
# Create cache and completions dir and add to $fpath
[[ -d "$ZSH_CACHE_DIR/completions" ]] || mkdir -p "$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...
@@ -78,6 +78,9 @@ fpath=($ZSH/{functions,completions} $ZSH_CUSTOM/{functions,completions} $fpath)
# Load all stock functions (from $fpath files) called below.
autoload -U compaudit compinit zrecompile
# The omz CLI and omz_diagnostic_dump are loaded on first use
autoload -Uz omz omz_diagnostic_dump
is_plugin() {
local base_dir=$1
local name=$2
@@ -100,28 +103,7 @@ done
# Figure out the SHORT hostname
if [[ "$OSTYPE" = darwin* ]]; then
# 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
# (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
SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
else
SHORT_HOST="${HOST/.*/}"
fi
@@ -131,101 +113,13 @@ if [[ -z "$ZSH_COMPDUMP" ]]; then
ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
fi
# Resolve the commit $ZSH is checked out at into $REPLY by reading the git
# directory, so that no git process is forked on every startup.
# 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"
}
# Construct zcompdump OMZ metadata
zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
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
zcompdump_refresh=0
if ! _omz_compdump_has_metadata; then
if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
|| ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then
command rm -f "$ZSH_COMPDUMP"
zcompdump_refresh=1
fi
@@ -243,8 +137,9 @@ else
compinit -u -d "$ZSH_COMPDUMP"
fi
# Append zcompdump metadata if missing (compinit may have regenerated the file)
if (( zcompdump_refresh )) || ! _omz_compdump_has_metadata; then
# Append zcompdump metadata if missing
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
# See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489
tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF
@@ -254,12 +149,9 @@ $zcompdump_fpath
EOF
fi
unset zcompdump_revision zcompdump_fpath zcompdump_refresh
unset -f _omz_compdump_has_metadata
# zcompile the completion dump file if the .zwc is older or missing.
# Test that first so the lock directory and zrecompile are skipped when it's fresh.
if [[ ! "${ZSH_COMPDUMP}.zwc" -nt "$ZSH_COMPDUMP" ]] \
&& command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
zrecompile -q -p "$ZSH_COMPDUMP"
command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
fi
+2 -2
View File
@@ -11,8 +11,8 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._op"
zf_mv -f -- =( 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
-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'
+2 -2
View File
@@ -13,6 +13,6 @@ fi
# Generate and load arduino-cli completion
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._arduino-cli"
zf_mv -f -- =( 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"
} &|
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._argocd"
zf_mv -f -- =( argocd completion zsh ) "$ZSH_CACHE_DIR/completions/_argocd"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_argocd"
zf_mv -f -- =( argocd completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -14,6 +14,6 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._asdf"
zf_mv -f -- =( asdf completion zsh ) "$ZSH_CACHE_DIR/completions/_asdf"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_asdf"
zf_mv -f -- =( asdf completion zsh ) "$TMPPREFIX"
} &|
+1 -1
View File
@@ -241,7 +241,7 @@ function aws_regions() {
function aws_profiles() {
aws --no-cli-pager configure list-profiles 2> /dev/null && return
[[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
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() {
+5 -5
View File
@@ -25,10 +25,10 @@ if [[ "$OSTYPE" = darwin* ]]; then
echo "$(ioreg -rc AppleSmartBattery | grep -o '"Watts"=[0-9]\+' | head -1 | grep -o '[0-9]\+')W "
}
function battery_is_charging() {
ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected" = Yes'
ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes'
}
function battery_pct() {
pmset -g batt | grep -Eo "[0-9]+%" | cut -d% -f1
pmset -g batt | grep -Eo "\d+%" | cut -d% -f1
}
function battery_pct_remaining() {
if battery_is_charging; then
@@ -39,8 +39,8 @@ if [[ "$OSTYPE" = darwin* ]]; then
}
function battery_time_remaining() {
local smart_battery_status="$(ioreg -rc "AppleSmartBattery")"
if [[ $(echo $smart_battery_status | command grep -c '^.*"ExternalConnected" = No') -eq 1 ]]; then
timeremaining=$(echo $smart_battery_status | command grep '^.*"AvgTimeToEmpty" = ' | sed -e 's/^.*"AvgTimeToEmpty" = //')
if [[ $(echo $smart_battery_status | command grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]]; then
timeremaining=$(echo $smart_battery_status | command grep '^.*"AvgTimeToEmpty"\ =\ ' | sed -e 's/^.*"AvgTimeToEmpty"\ =\ //')
if [ $timeremaining -gt 720 ]; then
echo "::"
else
@@ -52,7 +52,7 @@ if [[ "$OSTYPE" = darwin* ]]; then
}
function battery_pct_prompt () {
local battery_pct color
if ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected" = No'; then
if ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ No'; then
battery_pct=$(battery_pct_remaining)
if [[ $battery_pct -gt 50 ]]; then
color='green'
+2 -2
View File
@@ -13,6 +13,6 @@ fi
# Generate and load buf completion
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._buf"
zf_mv -f -- =( buf completion zsh ) "$ZSH_CACHE_DIR/completions/_buf"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_buf"
zf_mv -f -- =( buf completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._bun"
zf_mv -f -- =( SHELL=zsh bun completions ) "$ZSH_CACHE_DIR/completions/_bun"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_bun"
zf_mv -f -- =( SHELL=zsh bun completions ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._charm"
zf_mv -f -- =( charm completion zsh ) "$ZSH_CACHE_DIR/completions/_charm"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_charm"
zf_mv -f -- =( charm completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._chezmoi"
zf_mv -f -- =( chezmoi completion zsh ) "$ZSH_CACHE_DIR/completions/_chezmoi"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_chezmoi"
zf_mv -f -- =( chezmoi completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._codex"
zf_mv -f -- =( codex completion zsh < /dev/null 2> /dev/null ) "$ZSH_CACHE_DIR/completions/_codex"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_codex"
zf_mv -f -- =( codex completion zsh < /dev/null 2> /dev/null ) "$TMPPREFIX"
} &|
+9 -12
View File
@@ -99,21 +99,18 @@ $ find . -type f 2>/dev/null
## File extension aliases
These are special aliases that are triggered when a file name is passed as the command. For example,
if the pdf file extension is aliased to `open_command`, running `file.pdf` opens that file with
whatever application your system uses for PDFs.
if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf`
that file will be open with `acroread`.
### 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 |
| ----- | -------------- | ----------------------------------------------- |
| pdf | `open_command` | Opens up a .pdf file in your default viewer |
| ps | `open_command` | Opens up a .ps file in your default viewer |
| dvi | `open_command` | Opens up a .dvi file in your default viewer |
| chm | `open_command` | Opens up a .chm file in your default viewer |
| djvu | `open_command` | Opens up a .djvu file in your default viewer |
| Alias | Command | Description |
| ----- | ---------- | ---------------------------------- |
| pdf | `acroread` | Opens up a document using acroread |
| ps | `gv` | Opens up a .ps file using gv |
| dvi | `xdvi` | Opens up a .dvi file using xdvi |
| chm | `xchm` | Opens up a .chm file using xchm |
| djvu | `djview` | Opens up a .djvu file using djview |
### 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)
for ft in $_media_fts; do alias -s $ft=mplayer; done
# read documents with the platform's default application
_doc_fts=(pdf ps dvi chm djvu)
for ft in $_doc_fts; do alias -s $ft=open_command; done
#read documents
alias -s pdf=acroread
alias -s ps=gv
alias -s dvi=xdvi
alias -s chm=xchm
alias -s djvu=djview
#list what's inside packed file
alias -s zip="unzip -l"
+1 -1
View File
@@ -14,6 +14,6 @@ function copyfile {
return 1
fi
clipcopy $1 || return 1
clipcopy $1
echo ${(%):-"%B$1%b copied to clipboard."}
}
-74
View File
@@ -1,74 +0,0 @@
#!/usr/bin/env zsh
emulate -LR zsh
source "${1:-${0:A:h:h}/copyfile.plugin.zsh}"
test_dir=$(mktemp -d) || exit 1
trap 'command rm -rf -- "$test_dir"' EXIT
typeset -i clipboard_status=0 failures=0 tests=0
typeset output expected_output
clipcopy() {
print -r -- "$#" "$1" >| "$test_dir/call"
if (( clipboard_status )); then
print -u2 -r -- "clipboard backend failed"
return $clipboard_status
fi
command cat -- "$1" >| "$test_dir/clipboard"
}
check_copyfile() {
local description="$1" expected_status="$2" expected_stdout="$3" expected_stderr="$4"
shift 4
output=$(copyfile "$@" 2> "$test_dir/stderr")
local actual_status=$?
(( tests++ ))
if [[ $actual_status == $expected_status && $output == "$expected_stdout" && $(<"$test_dir/stderr") == "$expected_stderr" ]]; then
print -r -- "PASS: $description"
else
print -u2 -r -- "FAIL: $description"
print -u2 -r -- " status: $actual_status (expected $expected_status)"
print -u2 -r -- " stdout: ${(qqq)output} (expected ${(qqq)expected_stdout})"
print -u2 -r -- " stderr: $(<"$test_dir/stderr") (expected $expected_stderr)"
(( failures++ ))
fi
}
for filename in plain.txt 'file with spaces.txt' 'unicode-ą.txt' empty.txt; do
if [[ $filename == empty.txt ]]; then
: >| "$test_dir/$filename"
else
print -r -- "contents of $filename" >| "$test_dir/$filename"
fi
expected_output=${(%):-"%B$test_dir/$filename%b copied to clipboard."}
clipboard_status=0
check_copyfile "successful copy of $filename" 0 "$expected_output" '' "$test_dir/$filename"
if [[ $(<"$test_dir/call") != "1 $test_dir/$filename" ]] || ! command cmp -s -- "$test_dir/$filename" "$test_dir/clipboard"; then
print -u2 -r -- "FAIL: clipboard received a different argument or contents for $filename"
(( failures++ ))
fi
for clipboard_status in 1 42 127; do
check_copyfile "clipboard exit $clipboard_status for $filename" 1 '' 'clipboard backend failed' "$test_dir/$filename"
done
done
command rm -f -- "$test_dir/call"
check_copyfile 'missing argument' 1 'Usage: copyfile <file>' ''
check_copyfile 'empty argument' 1 'Usage: copyfile <file>' '' ''
check_copyfile 'nonexistent file' 1 "Error: '$test_dir/missing.txt' is not a valid file." '' "$test_dir/missing.txt"
check_copyfile 'directory argument' 1 "Error: '$test_dir' is not a valid file." '' "$test_dir"
if [[ -e "$test_dir/call" ]]; then
print -u2 -r -- 'FAIL: invalid input invoked the clipboard backend'
(( failures++ ))
fi
print -r -- "$tests tests, $failures failures"
(( failures == 0 ))
+2 -2
View File
@@ -27,6 +27,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._deno"
zf_mv -f -- =( deno completions zsh ) "$ZSH_CACHE_DIR/completions/_deno"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_deno"
zf_mv -f -- =( deno completions zsh ) "$TMPPREFIX"
} &|
+22 -29
View File
@@ -13,32 +13,25 @@ plugins=(... docker-compose)
## Aliases
| Alias | Command | Description |
|-----------|-------------------------------------|----------------------------------------------------------------------------------------------|
| dco | `docker-compose` | Docker-compose main command |
| dcb | `docker-compose build` | Build containers |
| dcc | `docker-compose config` | Parse, resolve and render compose file in canonical format |
| dce | `docker-compose exec` | Execute command inside a container |
| dcps | `docker-compose ps` | List containers |
| dcrestart | `docker-compose restart` | Restart container |
| dcrm | `docker-compose rm` | Remove container |
| dcr | `docker-compose run` | Run a command in container |
| dcstop | `docker-compose stop` | Stop a container |
| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service |
| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers |
| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon |
| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon |
| dcupw | `docker-compose up --watch` | Watch changes in service and rebuild/restart accordingly (see [Use Compose Watch] for usage) |
| dcupwb | `docker-compose up --watch --build` | Same as `dcupw`, but build images before starting containers |
| dcdn | `docker-compose down` | Stop and remove containers |
| dcl | `docker-compose logs` | Show logs of container |
| dclf | `docker-compose logs -f` | Show logs and follow output |
| dclF | `docker-compose logs -f --tail0` | Just follow recent logs |
| dcpull | `docker-compose pull` | Pull image of a service |
| dcstart | `docker-compose start` | Start a container |
| 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 |
[Use Compose Watch]: https://docs.docker.com/compose/how-tos/file-watch/
| Alias | Command | Description |
|-----------|----------------------------------|----------------------------------------------------------------------------------|
| dco | `docker-compose` | Docker-compose main command |
| dcb | `docker-compose build` | Build containers |
| dcc | `docker-compose config` | Parse, resolve and render compose file in canonical format |
| dce | `docker-compose exec` | Execute command inside a container |
| dcps | `docker-compose ps` | List containers |
| dcrestart | `docker-compose restart` | Restart container |
| dcrm | `docker-compose rm` | Remove container |
| dcr | `docker-compose run` | Run a command in container |
| dcstop | `docker-compose stop` | Stop a container |
| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service |
| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers |
| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon |
| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon |
| dcdn | `docker-compose down` | Stop and remove containers |
| dcl | `docker-compose logs` | Show logs of container |
| dclf | `docker-compose logs -f` | Show logs and follow output |
| dclF | `docker-compose logs -f --tail0` | Just follow recent logs |
| dcpull | `docker-compose pull` | Pull image of a service |
| dcstart | `docker-compose start` | Start a container |
| dck | `docker-compose kill` | Kills containers |
@@ -17,8 +17,6 @@ alias dcup="$dccmd up"
alias dcupb="$dccmd up --build"
alias dcupd="$dccmd up -d"
alias dcupdb="$dccmd up -d --build"
alias dcupw="$dccmd up --watch"
alias dcupwb="$dccmd up --watch --build"
alias dcdn="$dccmd down"
alias dcl="$dccmd logs"
alias dclf="$dccmd logs -f"
@@ -26,8 +24,5 @@ alias dclF="$dccmd logs -f --tail 0"
alias dcpull="$dccmd pull"
alias dcstart="$dccmd start"
alias dck="$dccmd kill"
alias dcv="$dccmd version"
alias dcsts="$dccmd stats"
alias dci="$dccmd images"
unset dccmd
+2 -7
View File
@@ -48,11 +48,6 @@ fi
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
# Make sure the cache directory exists; when the plugin is loaded by a
# standalone plugin manager (e.g. antigen) the core is not sourced, so
# $ZSH_CACHE_DIR/completions may not have been created yet (#13679).
[[ -d "$ZSH_CACHE_DIR/completions" ]] || mkdir -p "$ZSH_CACHE_DIR/completions"
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `docker`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then
@@ -73,7 +68,7 @@ zmodload -F zsh/files b:zf_mv
! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then
command cp "${plugin_dir}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
else
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._docker"
zf_mv -f -- =( command docker completion zsh ) "$ZSH_CACHE_DIR/completions/_docker"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_docker"
zf_mv -f -- =( command docker completion zsh ) "$TMPPREFIX"
fi
} "${0:A:h}" &|
+2 -2
View File
@@ -16,6 +16,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._doctl"
zf_mv -f -- =( doctl completion zsh ) "$ZSH_CACHE_DIR/completions/_doctl"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_doctl"
zf_mv -f -- =( doctl completion zsh ) "$TMPPREFIX"
} &|
+1 -3
View File
@@ -35,9 +35,7 @@ alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
alias eframe='emacsclient --alternate-editor="" --create-frame'
# Emacs ANSI Term tracking
local excluded_terms=(vterm ghostel)
local current_term="${INSIDE_EMACS%%,*}"
if [[ -n "$INSIDE_EMACS" ]] && (( ! ${excluded_terms[(Ie)$current_term]} )); then
if [[ -n "$INSIDE_EMACS" ]] && [[ "$INSIDE_EMACS" != "vterm" ]]; then
chpwd_emacs() { print -P "\033AnSiTc %d"; }
print -P "\033AnSiTc %d" # Track current working directory
print -P "\033AnSiTu %n" # Track username
+7 -27
View File
@@ -1,40 +1,20 @@
#!/bin/sh
emacsfun() {
local cmd frames arg tty
local cmd 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
for arg in "$@"; do
case "$arg" in
-t|--tty|-nw) tty=1; break ;;
esac
done
if [ -n "$tty" ]; then
cmd="(memq 't (mapcar 'framep (frame-list)))" # if != nil, there are tty frames
else
cmd="(delete 't (mapcar 'framep (frame-list)))" # if != nil, there are graphical terminals (x, w32, ns)
fi
# A tty frame needs the client to stay attached, so drop the --no-wait the
# `emacs` alias adds. Otherwise emacsclient returns at once and nothing opens.
if [ -n "$tty" ]; then
for arg do
shift
case "$arg" in
--no-wait) continue ;;
esac
set -- "$@" "$arg"
done
fi
case "$*" in
*-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames
*) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns)
esac
# Check if there are suitable frames
frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )"
# A bare emacs/e passes only --no-wait, so it still needs --create-frame.
if [ -z "$frames" ] || [ "$frames" = nil ] || [ "$#" -eq 0 ] \
|| { [ "$#" -eq 1 ] && [ "$1" = --no-wait ]; }; then
# Only create another X frame if there isn't one present
if [ -z "$frames" -o "$frames" = nil ]; then
emacsclient --alternate-editor="" --create-frame "$@"
return $?
fi
+4 -16
View File
@@ -101,14 +101,12 @@ EOF
(*.tar.lz4) lz4 -c -d "$full_path" | tar xvf - ;;
(*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$full_path" ;;
(*.gz) (( $+commands[pigz] )) && pigz -cdk "$full_path" > "${file:t:r}" || gunzip -ck "$full_path" > "${file:t:r}" ;;
(*.bz2)
(( $+commands[pbzip2] )) && pbzip2 -cd "$full_path" > "${file:t:r}" \
|| bunzip2 -c "$full_path" > "${file:t:r}" ;;
(*.bz2) (( $+commands[pbzip2] )) && pbzip2 -d "$full_path" || bunzip2 "$full_path" ;;
(*.xz) xzcat "$full_path" > "${file:t:r}" ;;
(*.lrz) (( $+commands[lrunzip] )) && lrunzip "$full_path" ;;
(*.lz4) lz4 -d "$full_path" ;;
(*.lzma) unlzma -c "$full_path" > "${file:t:r}" ;;
(*.z) uncompress -c "$full_path" > "${file:t:r}" ;;
(*.lzma) unlzma "$full_path" ;;
(*.z) uncompress "$full_path" ;;
(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx|*.pk3|*.pk4) unzip "$full_path" ;;
(*.rar)
if (( $+commands[unrar] )); then
@@ -121,17 +119,7 @@ EOF
fi ;;
(*.rpm)
rpm2cpio "$full_path" | cpio --quiet -id ;;
(*.7z | *.7z.[0-9]* | *.pk7)
if (( $+commands[7zz] )); then
7zz x "$full_path"
elif (( $+commands[7z] )); then
7z x "$full_path"
elif (( $+commands[7za] )); then
7za x "$full_path"
else
echo "extract: cannot extract 7z files: install 7zz, 7z or 7za" >&2
success=1
fi ;;
(*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;;
(*.deb)
command mkdir -p "control" "data"
ar vx "$full_path" > /dev/null
-65
View File
@@ -1,65 +0,0 @@
#!/usr/bin/env zsh
# Run with: zsh -df plugins/extract/tests/extract.test.zsh
emulate -L zsh
setopt err_return
for tool in lzma unlzma uncompress; do
(( $+commands[$tool] )) || {
print -u2 -r -- "These tests require $tool."
exit 1
}
done
source "${0:A:h:h}/extract.plugin.zsh"
local test_dir=$(mktemp -d) original_dir=$PWD
check_extract() {
local extension=$1 mode=$2
local case_dir="$test_dir/$extension-$mode"
mkdir -p "$case_dir/source files" "$case_dir/work/target dir"
local archive="$case_dir/source files/sample.txt.$extension"
cp "$test_dir/fixture.$extension" "$archive"
builtin cd "$case_dir/work"
local output="$PWD/sample.txt"
local -a args
case "$mode" in
target)
args=(-t 'target dir')
output="$PWD/target dir/sample.txt"
;;
remove) args=(-r) ;;
esac
# Run the plugin without the test's ERR_RETURN option.
() {
emulate -L zsh
extract "${args[@]}" "$archive"
} || return 1
cmp "$test_dir/plain" "$output"
if [[ $mode == remove ]]; then
[[ ! -e $archive ]]
else
[[ -f $archive ]]
fi
print -r -- "PASS: $extension ($mode)"
}
{
print -r -- hello > "$test_dir/plain"
lzma -c "$test_dir/plain" > "$test_dir/fixture.lzma"
# "hello\n" as a .Z stream, since many systems only ship uncompress.
printf '\037\235\220\150\312\260\141\363\106\001' \
> "$test_dir/fixture.Z"
for extension in lzma Z; do
for mode in default target remove; do
check_extract "$extension" "$mode"
done
done
print 'All extract compressed-file tests passed.'
} always {
builtin cd "$original_dir"
rm -rf -- "$test_dir"
}
-30
View File
@@ -45,36 +45,6 @@ If `yes`, always add `-h` flag to add a header row for each column.
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`
```zsh
-9
View File
@@ -21,15 +21,6 @@ function _configure_eza() {
if zstyle -t ':omz:plugins:eza' 'header'; then
_EZA_HEAD+=("h")
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
case "${_val:l}" in
binary)
+2 -2
View File
@@ -32,6 +32,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._flutter"
zf_mv -f -- =( 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"
} &|
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._flux"
zf_mv -f -- =( flux completion zsh ) "$ZSH_CACHE_DIR/completions/_flux"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_flux"
zf_mv -f -- =( flux completion zsh ) "$TMPPREFIX"
} &|
+2 -2
View File
@@ -12,8 +12,8 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._fnm"
zf_mv -f -- =( 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
@@ -57,7 +57,7 @@ function frontend() {
codepen 'https://codepen.io/search/pens?q='
compassdoc 'http://compass-style.org/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/')
flowtype $(_frontend_fallback 'flow.org/en/docs/')
fontello 'http://fontello.com/#search='
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._gcx"
zf_mv -f -- =( gcx completion zsh ) "$ZSH_CACHE_DIR/completions/_gcx"
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:
- `$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.
+2 -2
View File
@@ -13,6 +13,6 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._gh"
zf_mv -f -- =( gh completion --shell zsh ) "$ZSH_CACHE_DIR/completions/_gh"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_gh"
zf_mv -f -- =( gh completion --shell zsh ) "$TMPPREFIX"
} &|
+8 -5
View File
@@ -1,6 +1,7 @@
# git-commit plugin
The git-commit plugin adds several git subcommands for
The git-commit plugin adds several
[git aliases](https://www.git-scm.com/docs/git-config#Documentation/git-config.txt-alias) for
[conventional commit](https://www.conventionalcommits.org/en/v1.0.0/#summary) messages.
To use it, add `git-commit` to the plugins array in your zshrc file:
@@ -30,13 +31,15 @@ Where `type` is one of the following:
- `test`
- `wip`
> NOTE: the subcommand for `revert` type is `rev`, as otherwise it conflicts with the
> git command of the same name. It will still generate a commit message in the format
> `revert: <message>`
> NOTE: the alias for `revert` type is `rev`, as otherwise it conflicts with the git command of the same name.
> It will still generate a commit message in the format `revert: <message>`
> ⚠️ Enabling this plugin will (potentially) overwrite all `alias.<type>` that you manually set. Use with
> care!
## Examples
| Git subcommand | Command |
| Git alias | Command |
| --------------------------------------------- | ---------------------------------------------------- |
| `git style "remove trailing whitespace"` | `git commit -m "style: remove trailing whitespace"` |
| `git wip "work in progress"` | `git commit -m "work in progress"` |
@@ -1 +0,0 @@
./omz_git_commit
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
-1
View File
@@ -1 +0,0 @@
./omz_git_commit
@@ -1,38 +0,0 @@
#!/usr/bin/env zsh
_omz_git_commit() {
0=${(%):-%x}
if [[ "$0" != */git-* ]]; then
echo >&2 "Expecting command named git-foo. Got '$0'."
return 1
fi
local _type="${0##*/git-}"
# The subcommand is shortened to avoid Git's built-in revert command.
if [[ "$_type" == rev ]]; then
_type=revert
fi
local _scope _attention _message
while [ $# -ne 0 ]; do
case $1 in
-s | --scope )
if [ -z $2 ]; then
echo >&2 "Missing scope!"
return 1
fi
_scope="$2"
shift 2
;;
-a | --attention )
_attention="!"
shift 1
;;
* )
_message="${_message} $1"
shift 1
;;
esac
done
git commit -m "${_type}${_scope:+(${_scope})}${_attention}:${_message}"
}
_omz_git_commit "$@"
+55 -42
View File
@@ -1,45 +1,58 @@
# Add git-commit commands directory to path
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
path=("${0:a:h}/git-commands" $path)
local _rev="$(git -C $ZSH rev-parse HEAD 2> /dev/null)"
if [[ $_rev == $(git config --global --get oh-my-zsh.git-commit-alias 2> /dev/null) ]]; then
return
fi
git config --global oh-my-zsh.git-commit-alias "$_rev"
# Append completions for custom git commands
() {
local -a git_user_commands
zstyle -a ':completion:*:*:git:*' user-commands 'git_user_commands' \
|| git_user_commands=()
git_user_commands+=(
build:'Commit with a message indicating a build' \
chore:'Commit with a message indicating a chore' \
ci:'Commit with a message indicating a CI change' \
docs:'Commit with a message indicating an update to the documentation' \
feat:'Commit with a message indicating a feature' \
fix:'Commit with a message indicating a fix' \
perf:'Commit with a message indicating a performance enhancement' \
refactor:'Commit with a message indicating a refactor' \
rev:'Commit with a message indicating a revert' \
style:'Commit with a message indicating a style change' \
test:'Commit with a message indicating updates to tests' \
wip:'Commit with a message indicating a work in progress'
)
zstyle ':completion:*:*:git:*' user-commands "${git_user_commands[@]}"
}
local -a _git_commit_aliases
_git_commit_aliases=(
'build'
'chore'
'ci'
'docs'
'feat'
'fix'
'perf'
'refactor'
'revert'
'style'
'test'
'wip'
)
# Clean up aliases from the prior implementation of git-commit. Keep this migration
# for users upgrading from versions that still wrote aliases to .gitconfig.
() {
git config --global --get oh-my-zsh.git-commit-alias &> /dev/null || return 0
local -a old_git_aliases=(
'build' 'chore' 'ci'
'docs' 'feat' 'fix'
'perf' 'refactor' 'rev'
'style' 'test' 'wip'
)
local git_alias
for git_alias in $old_git_aliases; do
if [[ "$(git config --global --get alias.$git_alias | tr '\n' ' ')" == "!a() { local _scope _attention _message"* ]]; then
git config --global --unset alias.$git_alias
local _alias _type
for _type in "${_git_commit_aliases[@]}"; do
# an alias can't be named "revert" because the git command takes precedence
# https://stackoverflow.com/a/3538791
case "$_type" in
revert) _alias=rev ;;
*) _alias=$_type ;;
esac
local _func='!a() {
local _scope _attention _message
while [ $# -ne 0 ]; do
case $1 in
-s | --scope )
if [ -z $2 ]; then
echo "Missing scope!"
return 1
fi
done
git config --global --unset oh-my-zsh.git-commit-alias
}
_scope="$2"
shift 2
;;
-a | --attention )
_attention="!"
shift 1
;;
* )
_message="${_message} $1"
shift 1
;;
esac
done
git commit -m "'$_type'${_scope:+(${_scope})}${_attention}:${_message}"
}; a'
git config --global alias.$_alias "$_func"
done
-8
View File
@@ -103,12 +103,10 @@ plugins=(... git)
| `glods` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ad) %C(bold blue)<%an>%Creset' --date=short` |
| `glol` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
| `glola` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --all` |
| `glolm` | `git log $(git_main_branch) --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset'` |
| `glols` | `git log --graph --pretty='%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset' --stat` |
| `glo` | `git log --oneline --decorate` |
| `glog` | `git log --oneline --decorate --graph` |
| `gloga` | `git log --oneline --decorate --graph --all` |
| `glom` | `git log --oneline --decorate --color $(git_main_branch)..` |
| `glp` | `git log --pretty=<format>` |
| `glg` | `git log --stat` |
| `glgp` | `git log --stat --patch` |
@@ -156,8 +154,6 @@ plugins=(... git)
| `grba` | `git rebase --abort` |
| `grbc` | `git rebase --continue` |
| `grbi` | `git rebase --interactive` |
| `grbmi` | `git rebase $(git_main_branch) --interactive` |
| `grbmia` | `git rebase $(git_main_branch) --interactive --autosquash` |
| `grbo` | `git rebase --onto` |
| `grbs` | `git rebase --skip` |
| `grbd` | `git rebase $(git_develop_branch)` |
@@ -191,7 +187,6 @@ plugins=(... git)
| `grmc` | `git rm --cached` |
| `gcount` | `git shortlog --summary -n` |
| `gsh` | `git show` |
| `gshs` | `git show --stat` |
| `gsps` | `git show --pretty=short --show-signature` |
| `gstall` | `git stash --all` |
| `gstu` | `git stash --include-untracked` |
@@ -206,10 +201,8 @@ plugins=(... git)
| `gst` | `git status` |
| `gss` | `git status --short` |
| `gsb` | `git status --short -b` |
| `gsnut` | `git status --untracked-files=no` |
| `gsi` | `git submodule init` |
| `gsu` | `git submodule update` |
| `gsuri` | `git submodule update --recursive --init` |
| `gsd` | `git svn dcommit` |
| `git-svn-dcommit-push` | `git svn dcommit && git push github $(git_main_branch):svntrunk` |
| `gsr` | `git svn rebase` |
@@ -261,7 +254,6 @@ receive further support.
| `git_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) |
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise |
| `gbcopy` | Copies current branch name to clipboard |
| `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote |
| `gbda` | Deletes all merged branches |
| `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) |
-17
View File
@@ -49,16 +49,6 @@ function git_main_branch() {
return 1
}
function gbcopy() {
command git rev-parse --git-dir &>/dev/null || return
local branch
branch="$(git_current_branch)" || return
[[ -n "$branch" ]] || return 1
print -rn -- "$branch" | clipcopy
}
function grename() {
if [[ -z "$1" || -z "$2" ]]; then
echo "Usage: $0 old_branch new_branch"
@@ -249,11 +239,9 @@ alias glod='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgre
alias glola='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --all'
alias glols='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset" --stat'
alias glol='git log --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
alias glolm='git log $(git_main_branch) --graph --pretty="%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%ar) %C(bold blue)<%an>%Creset"'
alias glo='git log --oneline --decorate'
alias glog='git log --oneline --decorate --graph'
alias gloga='git log --oneline --decorate --graph --all'
alias glom='git log --oneline --decorate --color $(git_main_branch)..'
# Pretty log messages
function _git_log_prettily(){
@@ -363,8 +351,6 @@ alias grbd='git rebase $(git_develop_branch)'
alias grbm='git rebase $(git_main_branch)'
alias grbom='git rebase origin/$(git_main_branch)'
alias grbum='git rebase upstream/$(git_main_branch)'
alias grbmi='git rebase $(git_main_branch) --interactive'
alias grbmia='git rebase $(git_main_branch) --interactive --autosquash'
alias grf='git reflog'
alias gr='git remote'
alias grv='git remote --verbose'
@@ -392,7 +378,6 @@ alias grm='git rm'
alias grmc='git rm --cached'
alias gcount='git shortlog --summary --numbered'
alias gsh='git show'
alias gshs='git show --stat'
alias gsps='git show --pretty=short --show-signature'
alias gstall='git stash --all'
alias gstaa='git stash apply'
@@ -408,10 +393,8 @@ alias gsts='git stash show --patch'
alias gst='git status'
alias gss='git status --short'
alias gsb='git status --short --branch'
alias gsnut='git status --untracked-files=no'
alias gsi='git submodule init'
alias gsu='git submodule update'
alias gsuri='git submodule update --recursive --init'
alias gsd='git svn dcommit'
alias git-svn-dcommit-push='git svn dcommit && git push github $(git_main_branch):svntrunk'
alias gsr='git svn rebase'
+36 -34
View File
@@ -1,43 +1,45 @@
# github plugin
> [!WARNING]
> This plugin is deprecated and will be removed in a future release. It supports
> the legacy [`hub`](https://github.com/mislav/hub) CLI, not the current GitHub
> CLI. For `gh` completion, use the [`gh` plugin](../gh) instead.
This plugin supports working with GitHub from the command line. It provides a few things:
The plugin provides compatibility for existing `hub` users by:
* Sets up the `hub` wrapper and completions for the `git` command if you have [`hub`](https://github.com/github/hub) installed.
* Completion for the [`github` Ruby gem](https://github.com/defunkt/github-gem).
* Convenience functions for working with repos and URLs.
- aliasing `git` to `hub` when `hub` is installed;
- adding completion for `hub`; and
- defining convenience functions for creating repositories.
### Functions
## Migrating to GitHub CLI
* `empty_gh` - Creates a new empty repo (with a `README.md`) and pushes it to GitHub
* `new_gh` - Initializes an existing directory as a repo and pushes it to GitHub
* `exist_gh` - Takes an existing repo and pushes it to GitHub
Install [GitHub CLI](https://cli.github.com/), replace `github` with `gh` in
your plugin list, and restart your shell:
## Installation
[Hub](https://github.com/github/hub) needs to be installed if you want to use it. On OS X with Homebrew, this can be done with `brew install hub`. The `hub` completion definition needs to be added to your `$FPATH` before initializing OMZ.
The [`github` Ruby gem](https://github.com/defunkt/github-gem) needs to be installed if you want to use it.
### Configuration
These settings affect `github`'s behavior.
#### Environment variables
* `$GITHUB_USER`
* `$GITHUB_PASSWORD`
#### Git configuration options
* `github.user` - GitHub username for repo operations
See `man hub` for more details.
### Homebrew installation note
If you have installed `hub` using Homebrew, its completions may not be on your `$FPATH` if you are using the system `zsh`. Homebrew installs `zsh` completion definitions to `/usr/local/share/zsh/site-functions`, which will be on `$FPATH` for the Homebrew-installed `zsh`, but not for the system `zsh`. If you want it to work with the system `zsh`, add this to your `~/.zshrc` before it sources `oh-my-zsh.sh`.
```zsh
plugins=(... gh)
if (( ! ${fpath[(I)/usr/local/share/zsh/site-functions]} )); then
FPATH=/usr/local/share/zsh/site-functions:$FPATH
fi
```
The `gh` plugin supplies completion for the installed GitHub CLI. It does not
alias `git`, because `gh` is not a Git wrapper.
The closest replacement for creating a GitHub repository from an existing
local repository is:
```zsh
gh repo create --source=. --push
```
## Deprecated functions
- `empty_gh` - creates a new repository with a `README.md` and pushes it to GitHub
- `new_gh` - initializes an existing directory and pushes it to GitHub
- `exist_gh` - pushes an existing Git repository to GitHub
These functions remain available during the deprecation period and require
`hub`. They will be removed with the plugin.
If you continue using `hub`, see its documentation for authentication and
configuration details.
+7 -10
View File
@@ -1,6 +1,3 @@
print -Pru2 -- '%F{yellow}[oh-my-zsh] The %Bgithub%b plugin is deprecated and will be removed in a future release.'
print -Pru2 -- 'It supports the legacy %Bhub%b CLI. Use the %Bgh%b plugin for GitHub CLI completion.%f'
# Set up hub wrapper for git, if it is available; https://github.com/github/hub
if (( $+commands[hub] )); then
alias git=hub
@@ -29,7 +26,7 @@ empty_gh() { # [NAME_OF_REPO]
# This function will add all non-hidden files to git.
new_gh() { # [DIRECTORY]
emulate -L zsh
local repo="${1-.}"
local repo="$1"
cd "$repo" \
|| return
@@ -45,7 +42,7 @@ new_gh() { # [DIRECTORY]
|| return
hub create \
|| return
git push -u origin HEAD \
git push -u origin master \
|| return
}
@@ -55,19 +52,18 @@ new_gh() { # [DIRECTORY]
# to your GitHub.
exist_gh() { # [DIRECTORY]
emulate -L zsh
local repo="${1:-.}"
cd "$repo" \
|| return
local repo=$1
cd "$repo"
hub create \
|| return
git push -u origin HEAD
git push -u origin master
}
# git.io "GitHub URL"
#
# Shorten GitHub url, example:
# https://github.com/nvogel/dotzsh > https://git.io/8nU25w
# https://github.com/nvogel/dotzsh > https://git.io/8nU25w
# source: https://github.com/nvogel/dotzsh
# documentation: https://github.com/blog/985-git-io-github-url-shortener
#
@@ -78,3 +74,4 @@ git.io() {
}
# End Functions #############################################################
-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 ) "$ZSH_CACHE_DIR/completions/_glab"
} &|
+1 -5
View File
@@ -4,11 +4,7 @@ globalias() {
# (A) makes it an array even if there's only one element
local word=${${(Az)LBUFFER}[-1]}
if [[ $GLOBALIAS_FILTER_VALUES[(Ie)$word] -eq 0 ]]; then
# Completion also considers quoted strings and assignment values as aliases.
# Only expand when the complete shell word is an alias name.
if (( ${+aliases[$word]} || ${+galiases[$word]} )); then
zle _expand_alias
fi
zle _expand_alias
zle expand-word
fi
zle self-insert
@@ -1,81 +0,0 @@
#!/usr/bin/env zsh
# Exercise the actual ZLE widgets in an isolated interactive shell.
emulate -L zsh
setopt err_return
zmodload zsh/zpty
zmodload zsh/zselect
local test_dir=$(mktemp -d)
export GLOBALIAS_TEST_PLUGIN=${0:A:h:h}/globalias.plugin.zsh
export GLOBALIAS_TEST_RESULT=$test_dir/result
wait_for_marker() {
local marker=$1 output received
local -i deadline=$(( SECONDS + 5 ))
while (( SECONDS < deadline )); do
if zpty -r globalias-test output; then
received+=$output
[[ $received == *$marker* ]] && return 0
else
zselect -t 1 || true
fi
done
print -u2 -r -- "Timed out waiting for ZLE: $received"
return 1
}
check_expansion() {
local input=$1 expected=$2 actual
zpty -w -n globalias-test "$input"$' \x18'
wait_for_marker GLOBALIAS_TEST_CAPTURED
actual=$(< "$GLOBALIAS_TEST_RESULT")
if [[ $actual != "$expected" ]]; then
print -u2 -r -- "Input: ${(qqq)input}"
print -u2 -r -- "Expected: ${(qqq)expected}; got: ${(qqq)actual}"
return 1
fi
}
{
cat > "$test_dir/setup.zsh" <<'SETUP'
autoload -Uz compinit
compinit -D
source "$GLOBALIAS_TEST_PLUGIN"
alias 1='cd -1'
alias ll='ls -l'
alias -g G='| grep'
GLOBALIAS_FILTER_VALUES=(ll)
_globalias_test_capture() {
print -rn -- "$BUFFER" > "$GLOBALIAS_TEST_RESULT"
print -r -- $'\nGLOBALIAS_TEST_CAPTURED'
BUFFER=
zle .accept-line
}
zle -N _globalias_test_capture
bindkey '^X' _globalias_test_capture
PS1='GLOBALIAS_TEST_READY> '
RPROMPT=
SETUP
zpty -b globalias-test zsh -dfi
zpty -w globalias-test "source ${(q)test_dir}/setup.zsh"
wait_for_marker GLOBALIAS_TEST_READY
check_expansion 'DEBUG=1' 'DEBUG=1 '
check_expansion 'DEBUG="1"' 'DEBUG="1" '
check_expansion "DEBUG='1'" "DEBUG='1' "
check_expansion '1' 'cd -1 '
check_expansion '"1"' '"1" '
check_expansion "'1'" "'1' "
check_expansion '\1' '\1 '
check_expansion 'echo G' 'echo | grep '
check_expansion 'DEBUG=1 1' 'DEBUG=1 cd -1 '
check_expansion 'll' 'll '
check_expansion 'echo $((1+2))' 'echo 3 '
check_expansion 'echo {a,b}' 'echo a b '
check_expansion '' ' '
print 'All globalias expansion tests passed.'
} always {
zpty -d globalias-test 2>/dev/null || true
rm -rf -- "$test_dir"
}
-15
View File
@@ -39,18 +39,3 @@ plugins=(... golang)
| gov | `go vet` | Vet examines Go source code and reports suspicious constructs |
| gove | `go version` | Prints Go version |
| gow | `go work` | Work provides access to operations on workspaces |
## Prompt
This plugin provides the `go_prompt_info` function to add the installed Go
version to your prompt.
For example:
```
PROMPT="%~$ "
RPROMPT='$(go_prompt_info)'
```
changes your prompt to:
```
~/go/project$ ▋ 1.22.3
```
+11 -95
View File
@@ -81,7 +81,6 @@ _go() {
'tool[run specified go tool]'
'version[print Go version]'
'vet[run go tool vet on packages]'
'work[workspace maintenance]'
)
if (( CURRENT == 2 )); then
# explain go commands
@@ -89,38 +88,19 @@ _go() {
return
fi
build_flags=(
'-C[change to dir before running the command]:directory:_path_files -/'
'-a[force rebuilding of packages that are already up-to-date]'
'-a[force reinstallation of packages that are already up to date]'
'-n[print the commands but do not run them]'
'-p[number of parallel builds]:number'
'-race[enable data race detection]'
'-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]'
'-asmflags[arguments to pass on each go tool asm invocation]:flags'
'-buildmode[build mode to use]:mode:(archive c-archive c-shared default shared exe pie plugin)'
'-buildvcs[stamp binaries with version control information]:mode:(true false auto)'
'-compiler[name of compiler to use]:name:(gccgo gc)'
'-gccgoflags[arguments to pass on each gccgo compiler/linker invocation]:flags'
'-gcflags[arguments to pass on each go tool compile invocation]:flags'
'-installsuffix[suffix to use in the package installation directory]:suffix'
'-json[emit build output in JSON suitable for automated processing]'
'-ldflags[arguments to pass on each go tool link invocation]:flags'
'-linkshared[build code that will be linked against shared libraries]'
'-mod[module download mode to use]:mode:(readonly vendor mod)'
'-modcacherw[leave newly-created directories in the module cache read-write]'
'-modfile[read and write an alternate go.mod file]:file:_files -g "*.mod"'
'-overlay[read a JSON config file that provides an overlay for build operations]:file:_files -g "*.json"'
'-pgo[specify the file path of a profile for profile-guided optimization]:file:_files'
'-pkgdir[install and load all packages from dir]:directory:_path_files -/'
'-work[print temporary directory name and keep it]'
'-ccflags[flags for 5c/6c/8c]:flags'
'-gcflags[flags for 5g/6g/8g]:flags'
'-ldflags[flags for 5l/6l/8l]:flags'
'-gccgoflags[flags for gccgo]:flags'
'-compiler[name of compiler to use]:name'
'-installsuffix[suffix to add to package directory]:suffix'
'-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
@@ -145,20 +125,17 @@ _go() {
;;
install)
_arguments -s -w : ${build_flags[@]} \
"-v[show package names]" \
'*:importpaths:__go_packages'
;;
get)
_arguments -s -w : \
${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_flags[@]}
;;
build)
_arguments -s -w : \
${build_flags[@]} \
"-v[show package names]" \
"-o[output file]:file:_files" \
"*:args:{ _alternative ':importpaths:__go_packages' ':files:_path_files -g \"*.go\"' }"
;;
@@ -261,60 +238,6 @@ _go() {
;;
esac
;;
work)
local -a work_commands
work_commands+=(
'edit[edit go.work from tools or scripts]'
'init[initialize workspace file]'
'sync[sync workspace build list to modules]'
'use[add modules to workspace file]'
'vendor[make vendored copy of dependencies]'
)
if (( CURRENT == 3 )); then
_values 'go work commands' ${work_commands[@]} "help[display help]"
return
fi
case ${words[3]} in
help)
_values 'go work commands' ${work_commands[@]}
;;
edit)
_arguments -s -w : \
"-fmt[reformat the go.work file]" \
"-godebug[=key=value add a godebug key=value line]:key=value" \
"-dropgodebug[=key drop an existing godebug line]:key" \
"-use[=path add a use directive]:directory:_path_files -/" \
"-dropuse[=path drop a use directive]:directory:_path_files -/" \
"-replace[=old{@v}=new{@v} add a replacement of the given module path and version pair]:name" \
"-dropreplace[=old{@v} drop a replacement of the given module path and version pair]:name" \
"-go[={version} set the expected Go language version]:number" \
"-toolchain[=name set the Go toolchain to use]:name" \
"-print[print the final go.work in its text format]" \
"-json[print the final go.work file in JSON format]" \
"1:go.work file:_files -g 'go.work'"
;;
init)
_arguments -s -w : \
"*:module directories:_path_files -/"
;;
sync)
;;
use)
_arguments -s -w : \
"-r[search recursively for modules in the argument directories]" \
"*:module directories:_path_files -/"
;;
vendor)
_arguments -s -w : \
"-e[attempt to proceed despite errors encountered while loading packages]" \
"-v[print the names of vendored modules and packages]" \
"-o[create the vendor directory at the given path]:output directory:_path_files -/" \
"*:flags"
;;
esac
;;
help)
_values "${commands[@]}" \
'environment[show Go environment variables available]' \
@@ -324,13 +247,6 @@ _go() {
'testflag[description of testing flags]' \
'testfunc[description of testing functions]'
;;
version)
_arguments -s -w : \
"-m[print module version information]" \
"-v[report unrecognized files]" \
"-json[print module version information in JSON format]" \
"*:file:_files"
;;
run)
_arguments -s -w : \
${build_flags[@]} \
-9
View File
@@ -36,12 +36,3 @@ alias gotofx='go tool fix'
alias gov='go vet'
alias gove='go version'
alias gow='go work'
## prompt
function go_prompt_info() {
(( $+commands[go] )) || return
local go_prompt
go_prompt=$(go version | awk '{ print substr($3, 3) }')
[[ -z "${go_prompt}" ]] && return
echo "${ZSH_THEME_GO_PROMPT_PREFIX}${go_prompt:gs/%/%%}${ZSH_THEME_GO_PROMPT_SUFFIX}"
}
+1 -31
View File
@@ -5,40 +5,10 @@ Applies some fixes for some common issues encountered with [GPG's gpg-agent](htt
More specifically, this plugin:
- Updates the `GPG_TTY` environment variable before each shell execution.
- Updates the `SSH_AUTH_SOCK` environment variable if `gpg-agent` is your SSH
agent. By default the plugin checks whether `enable-ssh-support` is turned
on. The [`ssh-support` setting](#settings) lets you say so yourself.
- Updates the `SSH_AUTH_SOCK` environment variable if `enable-ssh-support` is turned on.
To use it, add `gpg-agent` to the plugins array of your zshrc file:
```zsh
plugins=(... gpg-agent)
```
## Settings
Every time a shell starts, the plugin runs `gpgconf --list-options gpg-agent` to
find out whether `enable-ssh-support` is turned on. That check can be slow. If
you already know the answer, state it with the `ssh-support` style and the
plugin skips the check. Set it in your zshrc, before Oh My Zsh is sourced.
If you don't use `gpg-agent` as your SSH agent:
```zsh
zstyle ':omz:plugins:gpg-agent' ssh-support no
```
The plugin then only sets `GPG_TTY`. It leaves `SSH_AUTH_SOCK` alone, and it
doesn't update the agent's tty before each command, which only SSH support
needs.
If you do use `gpg-agent` as your SSH agent:
```zsh
zstyle ':omz:plugins:gpg-agent' ssh-support yes
```
The plugin then sets `SSH_AUTH_SOCK` without checking. `enable-ssh-support`
still has to be set in your `gpg-agent.conf` for SSH to work.
Leave the style unset to keep the automatic check.
+1 -16
View File
@@ -1,16 +1,5 @@
export GPG_TTY=$TTY
# The ssh-support style says whether gpg-agent is used as the ssh agent.
# Setting it saves asking gpgconf, which can be slow.
zstyle -t ':omz:plugins:gpg-agent' ssh-support
_gpg_agent_ssh_support=$? # 0 if yes, 1 if no, 2 if not set
# Everything below is only needed for ssh support
if (( _gpg_agent_ssh_support == 1 )); then
unset _gpg_agent_ssh_support
return
fi
# Fix for passphrase prompt on the correct tty
# See https://www.gnupg.org/documentation/manuals/gnupg/Agent-Options.html#option-_002d_002denable_002dssh_002dsupport
function _gpg-agent_update-tty_preexec {
@@ -20,13 +9,9 @@ autoload -U add-zsh-hook
add-zsh-hook preexec _gpg-agent_update-tty_preexec
# If enable-ssh-support is set, fix ssh agent integration
if (( _gpg_agent_ssh_support == 0 )) \
|| [[ $(gpgconf --list-options gpg-agent 2>/dev/null \
| awk -F: '$1=="enable-ssh-support" {print $10}') = 1 ]]; then
if [[ $(gpgconf --list-options gpg-agent 2>/dev/null | awk -F: '$1=="enable-ssh-support" {print $10}') = 1 ]]; then
unset SSH_AGENT_PID
if [[ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]]; then
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
fi
unset _gpg_agent_ssh_support
+4 -14
View File
@@ -267,7 +267,6 @@ __gradle_subcommand() {
'-Dorg.gradle.configuration-cache.problems=[Configures how the configuration cache handles problems (fail or warn). Supported values are 'warn', or 'fail' (default).]:org.gradle.configuration cache.problems:(fail warn)' \
'-Dorg.gradle.configuration-cache.read-only=[]' \
'-Dorg.gradle.configuration-cache.unsafe.ignore.unsupported-build-events-listeners=[]' \
'-Dorg.gradle.configuration-cache.unsafe.skip-task-logging-listeners-serialization=[]' \
'-Dorg.gradle.configuration-cache=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'-Dorg.gradle.configureondemand=[Configures necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]' \
'-Dorg.gradle.console.interactive=[]' \
@@ -285,9 +284,6 @@ __gradle_subcommand() {
'-Dorg.gradle.debug.suspend=[]' \
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \
'-Dorg.gradle.isolated-projects.dangerously-ignore-problems=[]' \
'-Dorg.gradle.isolated-projects.diagnostics=[]' \
'-Dorg.gradle.isolated-projects=[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`.]' \
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \
'-Dorg.gradle.java.installations.auto-detect=[]' \
'-Dorg.gradle.java.installations.auto-download=[]' \
@@ -297,13 +293,14 @@ __gradle_subcommand() {
'-Dorg.gradle.jvmargs=[]' \
'-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug)' \
'-Dorg.gradle.logging.stacktrace=[]' \
'-Dorg.gradle.mirror.maven.settings=[]' \
'-Dorg.gradle.native=[]' \
'-Dorg.gradle.parallel=[Builds projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]:org.gradle.parallel:(true false)' \
'-Dorg.gradle.priority=[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Supported values are 'normal' (default) or 'low'.]:org.gradle.priority:(normal low)' \
'-Dorg.gradle.problems.report=[Enables the HTML problems report.]' \
'-Dorg.gradle.projectcachedir=[Specifies the project-specific cache directory. Default is .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \
'-Dorg.gradle.tooling.parallel=[]' \
'-Dorg.gradle.unsafe.isolated-projects.diagnostics=[]' \
'-Dorg.gradle.unsafe.isolated-projects=[]' \
'-Dorg.gradle.vfs.verbose=[]' \
'-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false)' \
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]' \
@@ -331,14 +328,12 @@ __gradle_subcommand() {
\*'--include-build[Includes the specified build in the composite.]:include build:_directories' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts)' \
(--no-isolated-projects)'--isolated-projects[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`. (incubating)]' \
'--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]' \
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
(--continue)'--no-continue[Stops task execution after a task failure.]' \
(--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--isolated-projects)'--no-isolated-projects[Disables Isolated Projects. (incubating)]' \
(--parallel)'--no-parallel[Disables parallel project execution.]' \
(--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \
{-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \
@@ -409,7 +404,6 @@ _gradle() {
'-Dorg.gradle.configuration-cache.problems=[Configures how the configuration cache handles problems (fail or warn). Supported values are 'warn', or 'fail' (default).]:org.gradle.configuration cache.problems:(fail warn):->argument-expected' \
'-Dorg.gradle.configuration-cache.read-only=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.unsafe.ignore.unsupported-build-events-listeners=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.unsafe.skip-task-logging-listeners-serialization=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]:->argument-expected' \
'-Dorg.gradle.configureondemand=[Configures necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]:->argument-expected' \
'-Dorg.gradle.console.interactive=[]:->argument-expected' \
@@ -427,9 +421,6 @@ _gradle() {
'-Dorg.gradle.debug.suspend=[]:->argument-expected' \
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false):->argument-expected' \
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Supported values are 'strict', 'lenient', or 'off'.]:org.gradle.dependency.verification:(strict lenient off):->argument-expected' \
'-Dorg.gradle.isolated-projects.dangerously-ignore-problems=[]:->argument-expected' \
'-Dorg.gradle.isolated-projects.diagnostics=[]:->argument-expected' \
'-Dorg.gradle.isolated-projects=[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`.]:->argument-expected' \
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories:->argument-expected' \
'-Dorg.gradle.java.installations.auto-detect=[]:->argument-expected' \
'-Dorg.gradle.java.installations.auto-download=[]:->argument-expected' \
@@ -439,13 +430,14 @@ _gradle() {
'-Dorg.gradle.jvmargs=[]:->argument-expected' \
'-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug):->argument-expected' \
'-Dorg.gradle.logging.stacktrace=[]:->argument-expected' \
'-Dorg.gradle.mirror.maven.settings=[]:->argument-expected' \
'-Dorg.gradle.native=[]:->argument-expected' \
'-Dorg.gradle.parallel=[Builds projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]:org.gradle.parallel:(true false):->argument-expected' \
'-Dorg.gradle.priority=[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Supported values are 'normal' (default) or 'low'.]:org.gradle.priority:(normal low):->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.tooling.parallel=[]:->argument-expected' \
'-Dorg.gradle.unsafe.isolated-projects.diagnostics=[]:->argument-expected' \
'-Dorg.gradle.unsafe.isolated-projects=[]:->argument-expected' \
'-Dorg.gradle.vfs.verbose=[]:->argument-expected' \
'-Dorg.gradle.vfs.watch=[Enables file system watching. Reuses file system data for subsequent builds.]:org.gradle.vfs.watch:(true false):->argument-expected' \
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Supported values are 'all', 'fail', 'summary' (default), or 'none'.]:->argument-expected' \
@@ -474,14 +466,12 @@ _gradle() {
\*'--include-build[Includes the specified build in the composite.]:include build:_directories:->argument-expected' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Sets the log level to info.]' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle(|.kts):->argument-expected' \
(--no-isolated-projects)'--isolated-projects[Enables Isolated Projects. Projects are configured in parallel. Implies `--configuration-cache`. (incubating)]' \
'--max-workers[Configures the maximum number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
(--build-cache)'--no-build-cache[Disables the Gradle build cache.]' \
(--configuration-cache)'--no-configuration-cache[Disables the configuration cache.]' \
(--configure-on-demand)'--no-configure-on-demand[Disables the use of configuration on demand. (incubating)]' \
(--continue)'--no-continue[Stops task execution after a task failure.]' \
(--daemon)'--no-daemon[Runs the build without the Gradle daemon. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--isolated-projects)'--no-isolated-projects[Disables Isolated Projects. (incubating)]' \
(--parallel)'--no-parallel[Disables parallel project execution.]' \
(--problems-report)'--no-problems-report[Disables the HTML problems report. (incubating)]' \
{-a,--no-rebuild}'[Disables rebuilding of project dependencies.]' \
+1
View File
@@ -15,6 +15,7 @@ function gradle-or-gradlew() {
# if gradlew found, run it instead of gradle
if [[ -f "$project_root/gradlew" ]]; then
echo "executing gradlew instead of gradle"
"$project_root/gradlew" "$@"
else
command gradle "$@"
+2 -2
View File
@@ -11,7 +11,7 @@ else
source "$ZSH_CACHE_DIR/completions/_hasura"
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._hasura"
zf_mv -f -- =( hasura completion zsh ) "$ZSH_CACHE_DIR/completions/_hasura"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_hasura"
zf_mv -f -- =( hasura completion zsh ) "$TMPPREFIX"
} &|
fi
+2 -2
View File
@@ -15,8 +15,8 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._hcloud"
zf_mv -f -- =( 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
+2 -2
View File
@@ -11,8 +11,8 @@ else
source "$ZSH_CACHE_DIR/completions/_helm"
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._helm"
zf_mv -f -- =( helm completion zsh ) "$ZSH_CACHE_DIR/completions/_helm"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_helm"
zf_mv -f -- =( helm completion zsh ) "$TMPPREFIX"
} &|
fi
-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 ) "$ZSH_CACHE_DIR/completions/_herdr"
} &|
-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 ) "$ZSH_CACHE_DIR/completions/_hermes"
} &|
+3 -3
View File
@@ -20,7 +20,7 @@ Requirements
Install
------------------------------------------------------------------------------
Using the [Homebrew]( https://brew.sh ) package manager:
Using the [Homebrew](https://brew.sh) package manager:
brew install zsh-history-substring-search
echo 'source $(brew --prefix)/share/zsh-history-substring-search/zsh-history-substring-search.zsh' >> ~/.zshrc
@@ -51,7 +51,7 @@ Using [zplug](https://github.com/zplug/zplug):
1. Add this repo to `~/.zshrc`:
zplug "zsh-users/zsh-history-substring-search", as:plugin
zplug "zsh-users/zsh-history-substring-search", as: plugin
Using [antigen](https://github.com/zsh-users/antigen):
@@ -75,7 +75,7 @@ Using [Zinit](https://github.com/zdharma-continuum/zinit):
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`:
@@ -295,8 +295,8 @@ _history-substring-search-begin() {
fi
#
# Escape and join query parts with wildcard character '*' as seperator
# `(j:CHAR:)` join array to string with CHAR as seperator
# Escape and join query parts with wildcard character '*' as separator
# `(j:CHAR:)` join array to string with CHAR as separator
#
local search_pattern="${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*"
+5 -5
View File
@@ -55,7 +55,7 @@ plugins=(... jj)
| jjopl | `jj op log` |
| jjor | `jj op restore` |
| jjrb | `jj rebase` |
| jjrbm | `jj rebase -o "trunk()"` |
| jjrbm | `jj rebase -d "trunk()"` |
| jjrs | `jj restore` |
| jjrt | `cd "$(jj root \|\| echo .)"` |
| jjs | `jj show` |
@@ -120,10 +120,10 @@ that.
### Git async-prompt compatibility
If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with the default
git async-prompt mode. This is because async-prompt only registers its background worker when it detects
`$(git_prompt_info)` literally in your prompt variables. A wrapper like `$(_my_theme_vcs_info)` won't match,
so the async output stays empty.
If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with
the default git async-prompt mode. This is because async-prompt only registers its background worker
when it detects `$(git_prompt_info)` literally in your prompt variables. A wrapper like
`$(_my_theme_vcs_info)` won't match, so the async output stays empty.
To fix this, add one of the following to your `.zshrc` **before** Oh My Zsh is sourced:
+3 -3
View File
@@ -13,8 +13,8 @@ fi
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._jj"
zf_mv -f -- =( 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() {
@@ -81,7 +81,7 @@ alias jjop='jj op'
alias jjopl='jj op log'
alias jjor='jj op restore'
alias jjrb='jj rebase'
alias jjrbm='jj rebase -o "trunk()"'
alias jjrbm='jj rebase -d "trunk()"'
alias jjrs='jj restore'
alias jjrt='cd "$(jj root || echo .)"'
alias jjs='jj show'
+6 -13
View File
@@ -22,17 +22,14 @@ fi
# Define json tools for each method
case "$JSONTOOLS_METHOD" in
node)
# Read stdin directly so input is not limited by command-line argument size.
# node doesn't make it easy to deal with stdin, so we pass it as an argument with xargs -0
function pp_json() {
node -e '
const input = require("fs").readFileSync(0, "utf8");
console.log(JSON.stringify(JSON.parse(input), null, 4));
'
xargs -0 node -e 'console.log(JSON.stringify(JSON.parse(process.argv[1]), null, 4));'
}
function is_json() {
node -e '
xargs -0 node -e '
try {
JSON.parse(require("fs").readFileSync(0, "utf8"));
json = JSON.parse(process.argv[1]);
console.log("true");
process.exit(0);
} catch (e) {
@@ -42,14 +39,10 @@ case "$JSONTOOLS_METHOD" in
'
}
function urlencode_json() {
node -e '
console.log(encodeURIComponent(require("fs").readFileSync(0, "utf8")));
'
xargs -0 node -e "console.log(encodeURIComponent(process.argv[1]))"
}
function urldecode_json() {
node -e '
console.log(decodeURIComponent(require("fs").readFileSync(0, "utf8")));
'
xargs -0 node -e "console.log(decodeURIComponent(process.argv[1]))"
}
;;
python3)
@@ -1,64 +0,0 @@
#!/usr/bin/env zsh
# Run with: zsh -df plugins/jsontools/tests/jsontools.test.zsh
emulate -L zsh
setopt err_return
(( $+commands[node] )) || {
print -u2 'These tests require Node.js.'
exit 1
}
JSONTOOLS_METHOD=node
source "${0:A:h:h}/jsontools.plugin.zsh"
local test_dir=$(mktemp -d)
check_output() {
local tool=$1 description=$2 expected_status=${3:-0}
local -i result=0
$tool < "$test_dir/input" > "$test_dir/actual" || result=$?
if (( result != expected_status )) \
|| ! cmp -s "$test_dir/expected" "$test_dir/actual"; then
print -u2 -r -- "FAIL: $description ($tool exited $result)"
return 1
fi
print -r -- "PASS: $description"
}
{
print -rn -- '{"value":42}' > "$test_dir/input"
printf '{\n "value": 42\n}\n' > "$test_dir/expected"
check_output pp_json 'pretty-print a small document'
# Larger than the 128 KiB limit for a single command-line argument.
local large_value=${(l:262144::x:):-}
print -rn -- '{"value":"'"$large_value"'"}' > "$test_dir/input"
printf '{\n "value": "%s"\n}\n' "$large_value" > "$test_dir/expected"
check_output pp_json 'pretty-print a large document'
print -r -- true > "$test_dir/expected"
check_output is_json 'validate a large document'
print -r -- '%7B%22value%22%3A%22'"$large_value"'%22%7D' \
> "$test_dir/expected"
check_output urlencode_json 'encode a large document'
local encoded=$(< "$test_dir/expected")
print -rn -- "$encoded" > "$test_dir/input"
print -r -- '{"value":"'"$large_value"'"}' > "$test_dir/expected"
check_output urldecode_json 'decode a large document'
# Passed as an argument, node used to parse this as its own option.
print -rn -- '--version' > "$test_dir/input"
print -r -- '--version' > "$test_dir/expected"
check_output urlencode_json 'encode input that starts with --'
print -rn -- '{invalid}' > "$test_dir/input"
print -r -- false > "$test_dir/expected"
check_output is_json 'reject invalid JSON' 1
printf '1\0002' > "$test_dir/input"
check_output is_json 'reject input with NUL bytes' 1
print 'All jsontools Node.js tests passed.'
} always {
rm -rf -- "$test_dir"
}
-1
View File
@@ -35,7 +35,6 @@ alias jdlr='juju debug-log --ms --replay'
alias jcon='juju consume'
alias jeb='juju export-bundle'
alias jex='juju expose'
alias junex='juju unexpose'
alias jh='juju help'
alias jkc='juju kill-controller -y -t 0'
alias jm='juju models'
+2 -2
View File
@@ -13,6 +13,6 @@ fi
# the actual completion file will be loaded.
zmodload -F zsh/files b:zf_mv
() {
local TMPPREFIX="$ZSH_CACHE_DIR/completions/._k9s"
zf_mv -f -- =( k9s completion zsh ) "$ZSH_CACHE_DIR/completions/_k9s"
local TMPPREFIX="$ZSH_CACHE_DIR/completions/_k9s"
zf_mv -f -- =( k9s completion zsh ) "$TMPPREFIX"
} &|

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