1
0
mirror of https://github.com/robbyrussell/oh-my-zsh.git synced 2026-02-12 20:31:00 +01:00

3 Commits

Author SHA1 Message Date
Omoeba
aeb9cdbde1 Merge branch 'ohmyzsh:master' into non-tty-auto-upgrade 2025-02-04 19:03:19 -08:00
Omoeba
ddb0d15354 Merge branch 'ohmyzsh:master' into non-tty-auto-upgrade 2025-01-25 16:31:12 -08:00
Omoeba
b2ec1229c2 fix(updater): allow non-tty usage when update_mode=auto 2024-12-05 19:38:01 -08:00
144 changed files with 1267 additions and 3546 deletions

6
.github/FUNDING.yml vendored
View File

@@ -1,6 +1,2 @@
github:
- ohmyzsh
- robbyrussell
- mcornella
- carlosala
github: [ohmyzsh, robbyrussell, mcornella, larson-carter, carlosala]
open_collective: ohmyzsh

View File

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

View File

@@ -12,14 +12,14 @@ dependencies:
plugins/gradle:
repo: gradle/gradle-completion
branch: master
version: a9d7c822e42cc6a5b028b59e46cffcc8e7bc1134
version: 25da917cf5a88f3e58f05be3868a7b2748c8afe6
precopy: |
set -e
find . ! -name _gradle ! -name LICENSE -delete
plugins/history-substring-search:
repo: zsh-users/zsh-history-substring-search
branch: master
version: 14c8d2e0ffaee98f2df9850b19944f32546fdea5
version: 87ce96b1862928d84b1afe7c173316614b30e301
precopy: |
set -e
rm -f zsh-history-substring-search.plugin.zsh
@@ -27,18 +27,10 @@ dependencies:
postcopy: |
set -e
test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md
plugins/kube-ps1:
repo: jonmosco/kube-ps1
branch: master
version: 0b0e6daf4197ecabb1ae4f2d46fb148a8e1e73e5
precopy: |
set -e
find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete
test -e kube-ps1.sh && mv kube-ps1.sh kube-ps1.plugin.zsh
plugins/wd:
repo: mfaerevaag/wd
branch: master
version: tag:v0.10.1
version: tag:v0.9.3
precopy: |
set -e
rm -r test
@@ -46,7 +38,7 @@ dependencies:
plugins/z:
branch: master
repo: agkozak/zsh-z
version: cf9225feebfae55e557e103e95ce20eca5eff270
version: dd94ef04acc41748ba171eb219971cb455e0040b
precopy: |
set -e
test -e README.md && mv -f README.md MANUAL.md

View File

@@ -9,32 +9,25 @@ jobs:
name: Check for updates
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
permissions:
contents: write # this is needed to push commits and branches
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Authenticate as @ohmyzsh
id: generate-token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
id: generate_token
uses: ohmyzsh/github-app-token@v2
with:
app-id: ${{ secrets.OHMYZSH_APP_ID }}
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
app_id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Setup Python
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
- name: Process dependencies
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
GIT_APP_NAME: ohmyzsh[bot]
GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com
TMP_DIR: ${{ runner.temp }}

View File

@@ -1,7 +1,7 @@
certifi==2026.1.4
charset-normalizer==3.4.4
idna==3.11
PyYAML==6.0.3
requests==2.32.5
certifi==2025.1.31
charset-normalizer==3.4.1
idna==3.10
PyYAML==6.0.2
requests==2.32.3
semver==3.0.4
urllib3==2.6.3
urllib3==2.3.0

View File

@@ -18,13 +18,6 @@ TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh")
DEPS_YAML_FILE = ".github/dependencies.yml"
# Dry run flag
DRY_RUN = os.environ.get("DRY_RUN", "0") == "1"
# GitHub Token is needed to avoid rate limiting
GH_TOKEN = os.environ.get("GH_TOKEN")
HEADERS = {
"Accept": "application/vnd.github+json",
}
if GH_TOKEN:
HEADERS["Authorization"] = f"Bearer {GH_TOKEN}"
# utils for tag comparison
BASEVERSION = re.compile(
@@ -226,32 +219,31 @@ class Dependency:
# Create new branch
branch = Git.checkout_or_create_branch(branch_name)
# Update dependencies.yml file
self.__update_yaml(
f"tag:{new_version}" if is_tag else status["version"]
)
# Update dependency files
self.__apply_upstream_changes()
if not Git.repo_is_clean():
# Update dependencies.yml file
self.__update_yaml(
f"tag:{new_version}" if is_tag else status["version"]
)
# Add all changes and commit
has_new_commit = Git.add_and_commit(self.name, new_version)
# Add all changes and commit
has_new_commit = Git.add_and_commit(self.name, new_version)
if has_new_commit:
# Push changes to remote
Git.push(branch)
if has_new_commit:
# Push changes to remote
Git.push(branch)
# Create GitHub PR
GitHub.create_pr(
branch,
f"feat({self.name}): update to version {new_version}",
f"""## Description
# Create GitHub PR
GitHub.create_pr(
branch,
f"chore({self.name}): update to version {new_version}",
f"""## Description
Update for **{self.desc}**: update to version [{new_version}]({status["head_url"]}).
Check out the [list of changes]({status["compare_url"]}).
Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}).
Check out the [list of changes]({status['compare_url']}).
""",
)
)
# Clean up repository
Git.clean_repo()
@@ -283,8 +275,8 @@ Check out the [list of changes]({status["compare_url"]}).
There is a new version of `{self.name}` {self.kind} available.
New version: [{new_version}]({status["head_url"]})
Check out the [list of changes]({status["compare_url"]}).
New version: [{new_version}]({status['head_url']})
Check out the [list of changes]({status['compare_url']}).
"""
print("Creating GitHub issue", file=sys.stderr)
@@ -385,28 +377,21 @@ class Git:
)
return branch_name
@staticmethod
def repo_is_clean() -> bool:
"""
Returns `True` if the repo is clean.
Returns `False` if the repo is dirty.
"""
try:
CommandRunner.run_or_fail(
["git", "diff", "--exit-code"], stage="CheckRepoClean"
)
return True
except CommandRunner.Exception:
return False
@staticmethod
def add_and_commit(scope: str, version: str) -> bool:
"""
Returns `True` if there were changes and were indeed commited.
Returns `False` if the repo was clean and no changes were commited.
"""
if Git.repo_is_clean():
# check if repo is clean (clean => no error, no commit)
try:
CommandRunner.run_or_fail(
["git", "diff", "--exit-code"], stage="CheckRepoClean"
)
return False
except CommandRunner.Exception:
# if it's other kind of error just throw!
pass
user_name = os.environ.get("GIT_APP_NAME")
user_email = os.environ.get("GIT_APP_EMAIL")
@@ -430,7 +415,7 @@ class Git:
f"user.email={user_email}",
"commit",
"-m",
f"chore({scope}): update to {version}",
f"feat({scope}): update to {version}",
],
stage="CreateCommit",
env=clean_env,
@@ -460,7 +445,7 @@ class GitHub:
url = f"https://api.github.com/repos/{repo}/git/refs/tags"
# Send a GET request to the GitHub API
response = requests.get(url, headers=HEADERS)
response = requests.get(url)
current_version = coerce(current_tag)
if current_version is None:
raise ValueError(
@@ -520,7 +505,7 @@ class GitHub:
url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}"
# Send a GET request to the GitHub API
response = requests.get(url, headers=HEADERS)
response = requests.get(url)
# If the request was successful
if response.status_code == 200:
@@ -604,13 +589,7 @@ def main():
DependencyStore.set(data)
dependencies = data["dependencies"]
if len(sys.argv) > 1:
# argv is list of dependencies to run, default is all of them
dependency_list = sys.argv[1:]
else:
dependency_list = dependencies.keys()
for path in dependency_list:
for path in dependencies:
dependency = Dependency(path, dependencies[path])
dependency.update_or_notify()

View File

@@ -25,13 +25,8 @@ jobs:
- ubuntu-latest
- macos-latest
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Set up git repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@v4
- name: Install zsh
if: runner.os == 'Linux'
run: sudo apt-get update; sudo apt-get install zsh
@@ -46,13 +41,8 @@ jobs:
needs:
- test
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Checkout
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@v4
- name: Install Vercel CLI
run: npm install -g vercel
- name: Setup project and deploy

View File

@@ -23,13 +23,8 @@ jobs:
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Set up git repository
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
uses: actions/checkout@v4
- name: Install zsh
run: sudo apt-get update; sudo apt-get install zsh
- name: Check syntax

View File

@@ -16,19 +16,16 @@ jobs:
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: Authenticate as @ohmyzsh
id: generate-token
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
id: generate_token
uses: ohmyzsh/github-app-token@v2
with:
app-id: ${{ secrets.OHMYZSH_APP_ID }}
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
app_id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Store app token
run: echo "GH_TOKEN=${{ steps.generate_token.outputs.token }}" >> "$GITHUB_ENV"
- name: Read project data
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
ORGANIZATION: ohmyzsh
PROJECT_NUMBER: "1"
run: |
@@ -51,14 +48,14 @@ jobs:
}' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
# Parse project data
cat >> "$GITHUB_ENV" <<EOF
cat >> $GITHUB_ENV <<EOF
PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json)
PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
EOF
- name: Add to project
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
ISSUE_OR_PR_ID: ${{ github.event.issue.node_id || github.event.pull_request.node_id }}
run: |
item_id="$(gh api graphql -f query='
@@ -69,51 +66,45 @@ jobs:
}
}
}
' -f project="$PROJECT_ID" -f content="$ISSUE_OR_PR_ID" --jq '.data.addProjectV2ItemById.item.id')"
' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectV2ItemById.item.id')"
echo "ITEM_ID=$item_id" >> $GITHUB_ENV
- name: Classify Pull Request
if: github.event_name == 'pull_request_target'
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
PR_NUMBER: ${{ github.event.pull_request.number }}
run: |
# Get the list of modified files in the PR, and extract plugins and themes
gh pr view "$PR_NUMBER" \
--repo "$GITHUB_REPOSITORY" \
touch plugins.list themes.list
gh pr view ${{ github.event.pull_request.number }} \
--repo ${{ github.repository }} \
--json files --jq '.files.[].path' | awk -F/ '
BEGIN {
plugins = 0
themes = 0
}
/^plugins\// {
if (plugin == $2) next
plugin = $2
plugins++
plugins[$2] = 1
}
/^themes\// {
gsub(/\.zsh-theme$/, "", $2)
if (theme == $2) next
theme = $2
themes++
themes[$2] = 1
}
END {
# plugin and theme are values controlled by the PR author
# so we should sanitize them before using anywhere else
if (plugins == 1) {
gsub(/[^a-zA-Z0-9._-]/, "", plugin)
print "PLUGIN=" plugin
for (plugin in plugins) {
print plugin >> "plugins.list"
}
if (themes == 1) {
gsub(/[^a-zA-Z0-9._-]/, "", theme)
print "THEME=" theme
for (theme in themes) {
print theme >> "themes.list"
}
}
' >> "$GITHUB_ENV"
'
# If only one plugin is modified, add it to the plugin field
if [[ $(wc -l < plugins.list) = 1 ]]; then
echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
fi
# If only one theme is modified, add it to the theme field
if [[ $(wc -l < themes.list) = 1 ]]; then
echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
fi
- name: Fill Pull Request fields in project
if: github.event_name == 'pull_request_target'
env:
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
run: |
gh api graphql -f query='
mutation (
@@ -149,7 +140,7 @@ jobs:
}
}
}
' -f project="$PROJECT_ID" -f item="$ITEM_ID" \
-f plugin_field="$PLUGIN_FIELD_ID" -f plugin_value="$PLUGIN" \
-f theme_field="$THEME_FIELD_ID" -f theme_value="$THEME" \
' -f project=$PROJECT_ID -f item=$ITEM_ID \
-f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
-f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
--silent

View File

@@ -1,65 +0,0 @@
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '20 7 * * 2'
push:
branches: ["master"]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
contents: read
actions: read
# To allow GraphQL ListCommits to work
issues: read
pull-requests: read
# To detect SAST tools
checks: read
steps:
- name: Harden the runner (Audit all outbound calls)
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
with:
egress-policy: audit
- name: "Checkout code"
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
publish_results: true
- name: "Upload artifact"
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@5d4e8d1aca955e8d8589aabd499c5cae939e33c7 # v4.31.9
with:
sarif_file: results.sarif

5
.gitpod.Dockerfile vendored Normal file
View File

@@ -0,0 +1,5 @@
FROM gitpod/workspace-full
RUN sudo apt-get update && \
sudo apt-get install -y zsh && \
sudo rm -rf /var/lib/apt/lists/*

9
.gitpod.yml Normal file
View File

@@ -0,0 +1,9 @@
image:
file: .gitpod.Dockerfile
tasks:
- init: |
export EDITOR="command gp open -w" VISUAL="command gp open -w"
cp -f /workspace/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc
ln -sf /workspace/ohmyzsh ~/.oh-my-zsh
command: exec zsh

View File

@@ -1,6 +1,6 @@
MIT License
Copyright (c) 2009-2026 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors)
Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -18,10 +18,10 @@ To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://x.c
Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
[![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10713/badge)](https://www.bestpractices.dev/projects/10713)
[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?label=%40ohmyzsh&logo=x&style=flat)](https://twitter.com/intent/follow?screen_name=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)
[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
<details>
<summary>Table of Contents</summary>
@@ -163,7 +163,7 @@ adds any) and extra goodies that are included in that particular plugin.
### Themes
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme-happy. We have over one
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one
hundred and fifty themes now bundled. Most of them have
[screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!).
Check them out!
@@ -218,7 +218,7 @@ terminal window.
ZSH_THEME="random" # (...please let it be pie... please be some pie..)
```
And if you want to pick a random theme from a list of your favorite themes:
And if you want to pick random theme from a list of your favorite themes:
```sh
ZSH_THEME_RANDOM_CANDIDATES=(
@@ -426,7 +426,7 @@ turn it off by setting the following in your .zshrc file, before Oh My Zsh is so
zstyle ':omz:alpha:lib:git' async-prompt no
```
If your problem is that the git prompt just stopped appearing, you can try to force it by setting the following
If your problem is that the git prompt just stopped appearing, you can try to force it setting the following
configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your
case.
@@ -548,7 +548,7 @@ We're on social media:
## Merchandise
We have
[stickers, shirts, and coffee mugs available](https://commitgoods.com/collections/oh-my-zsh?utm_source=github)
[stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github)
for you to show off your love of Oh My Zsh. Again, you will become the talk of the town!
## License

View File

@@ -26,7 +26,7 @@ autoload -Uz is-at-least
# This API is subject to change and optimization. Rely on it at your own risk.
function _omz_register_handler {
setopt localoptions noksharrays unset
setopt localoptions noksharrays
typeset -ga _omz_async_functions
# we want to do nothing if there's no $1 function or we already set it up
if [[ -z "$1" ]] || (( ! ${+functions[$1]} )) \
@@ -44,7 +44,6 @@ function _omz_register_handler {
# Set up async handlers and callbacks
function _omz_async_request {
setopt localoptions noksharrays unset
local -i ret=$?
typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT

View File

@@ -28,7 +28,6 @@ function _omz {
'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'
@@ -73,10 +72,6 @@ function _omz {
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"/:::))
@@ -174,7 +169,6 @@ Available commands:
plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests
reload Reload the current zsh session
shop Open the Oh My Zsh shop
theme <command> Manage themes
update Update Oh My Zsh
version Show the version
@@ -199,7 +193,7 @@ EOF
return 1
fi
ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
"$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
}
function _omz::plugin {
@@ -212,7 +206,7 @@ Available commands:
disable <plugin> Disable plugin(s)
enable <plugin> Enable plugin(s)
info <plugin> Get information of a plugin
list [--enabled] List Oh My Zsh plugins
list List all available Oh My Zsh plugins
load <plugin> Load plugin(s)
EOF
@@ -455,21 +449,8 @@ function _omz::plugin::info {
function _omz::plugin::list {
local -a custom_plugins builtin_plugins
# If --enabled is provided, only list what's enabled
if [[ "$1" == "--enabled" ]]; then
local plugin
for plugin in "${plugins[@]}"; do
if [[ -d "${ZSH_CUSTOM}/plugins/${plugin}" ]]; then
custom_plugins+=("${plugin}")
elif [[ -d "${ZSH}/plugins/${plugin}" ]]; then
builtin_plugins+=("${plugin}")
fi
done
else
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
builtin_plugins=("$ZSH"/plugins/*(-/N:t))
fi
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
builtin_plugins=("$ZSH"/plugins/*(-/N:t))
# If the command is being piped, print all found line by line
if [[ ! -t 1 ]]; then
@@ -623,48 +604,10 @@ function _omz::pr::test {
done
(( $found )) || {
_omz::log error "could not find the ohmyzsh git remote. Aborting..."
_omz::log error "could not found the ohmyzsh git remote. Aborting..."
return 1
}
# Check if Pull Request has the "testers needed" label
_omz::log info "checking if PR #$1 has the 'testers needed' label..."
local pr_json label label_id="MDU6TGFiZWw4NzY1NTkwNA=="
pr_json=$(
curl -fsSL \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/ohmyzsh/ohmyzsh/pulls/$1"
)
if [[ $? -gt 0 || -z "$pr_json" ]]; then
_omz::log error "error when trying to fetch PR #$1 from GitHub."
return 1
fi
# Check if the label is present with jq or grep
if (( $+commands[jq] )); then
label="$(command jq ".labels.[] | select(.node_id == \"$label_id\")" <<< "$pr_json")"
else
label="$(command grep "\"$label_id\"" <<< "$pr_json" 2>/dev/null)"
fi
# If a maintainer hasn't labeled the PR to test, explain the security risk
if [[ -z "$label" ]]; then
_omz::log warn "PR #$1 does not have the 'testers needed' label. This means that the PR"
_omz::log warn "has not been reviewed by a maintainer and may contain malicious code."
# Ask for explicit confirmation: user needs to type "yes" to continue
_omz::log prompt "Do you want to continue testing it? [yes/N] "
builtin read -r
if [[ "${REPLY:l}" != yes ]]; then
_omz::log error "PR test canceled. Please ask a maintainer to review and label the PR."
return 1
else
_omz::log warn "Continuing to check out and test PR #$1. Be careful!"
fi
fi
# Fetch pull request head
_omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..."
command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || {
@@ -723,15 +666,6 @@ function _omz::pr::test {
)
}
function _omz::shop {
local shop_url="https://commitgoods.com/collections/oh-my-zsh"
_omz::log info "Opening Oh My Zsh shop in your browser..."
_omz::log info "$shop_url"
open_command "$shop_url"
}
function _omz::reload {
# Delete current completion cache
command rm -f $_comp_dumpfile $ZSH_COMPDUMP

View File

@@ -82,7 +82,7 @@ function detect-clipboard() {
function clipcopy() { cat "${1:-/dev/stdin}" | termux-clipboard-set; }
function clippaste() { termux-clipboard-get; }
elif [ -n "${TMUX:-}" ] && (( ${+commands[tmux]} )); then
function clipcopy() { tmux load-buffer -w "${1:--}"; }
function clipcopy() { tmux load-buffer "${1:--}"; }
function clippaste() { tmux save-buffer -; }
else
function _retry_clipboard_detection_or_fail() {

View File

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

View File

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

View File

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

View File

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

View File

@@ -112,12 +112,12 @@ bindkey -M vicmd '^[[1;5D' backward-word
bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark
bindkey -s '\el' '^q ls\n' # [Esc-l] - run command: ls
bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls
bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line.
bindkey ' ' magic-space # [Space] - don't do history expansion
# Edit the current command line in $VISUAL (or $EDITOR / `vi` if not set)
# Edit the current command line in $EDITOR
autoload -U edit-command-line
zle -N edit-command-line
bindkey '\C-x\C-e' edit-command-line

View File

@@ -17,7 +17,7 @@ function title {
: ${2=$1}
case "$TERM" in
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*|wezterm*)
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*)
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
;;
@@ -47,13 +47,13 @@ fi
# Runs before showing the prompt
function omz_termsupport_precmd {
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return
title "$ZSH_THEME_TERM_TAB_TITLE_IDLE" "$ZSH_THEME_TERM_TITLE_IDLE"
}
# Runs before executing the command
function omz_termsupport_preexec {
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return
emulate -L zsh
setopt extended_glob
@@ -145,7 +145,6 @@ esac
# Identifies the directory using a file: URI scheme, including
# the host name to disambiguate local vs. remote paths.
function omz_termsupport_cwd {
setopt localoptions unset
# Percent-encode the host and path names.
local URL_HOST URL_PATH
URL_HOST="$(omz_urlencode -P $HOST)" || return 1

View File

@@ -99,8 +99,8 @@ done
# Figure out the SHORT hostname
if [[ "$OSTYPE" = darwin* ]]; then
# macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible.
SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
# macOS's $HOST changes with dhcp, etc. Use ComputerName if possible.
SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
else
SHORT_HOST="${HOST/.*/}"
fi
@@ -192,7 +192,7 @@ _omz_source() {
fi
}
# Load all of the lib files in ~/.oh-my-zsh/lib that end in .zsh
# Load all of the lib files in ~/oh-my-zsh/lib that end in .zsh
# TIP: Add files you don't want in git to .gitignore
for lib_file ("$ZSH"/lib/*.zsh); do
_omz_source "lib/${lib_file:t}"

View File

@@ -6,4 +6,14 @@ function _opswd() {
[[ -z "$services" ]] || compadd -a -- services
}
# TODO: 2022-03-26: Remove support for op CLI 1
autoload -Uz is-at-least
is-at-least 2.0.0 $(op --version) || {
function _opswd() {
local -a services
services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}")
[[ -z "$services" ]] || compadd -a -- services
}
}
_opswd "$@"

View File

@@ -46,4 +46,45 @@ function opswd() {
(sleep 20 && clipcopy </dev/null 2>/dev/null) &!
}
# TODO: 2022-03-26: Remove support for op CLI 1
autoload -Uz is-at-least
is-at-least 2.0.0 $(op --version) || {
print -ru2 ${(%):-"%F{yellow}opswd: usage with op version $(op --version) is deprecated. Upgrade to CLI 2 and reload zsh.
For instructions, see https://developer.1password.com/docs/cli/upgrade.%f"}
# opswd puts the password of the named service into the clipboard. If there's a
# one time password, it will be copied into the clipboard after 10 seconds. The
# clipboard is cleared after another 20 seconds.
function opswd() {
if [[ $# -lt 1 ]]; then
echo "Usage: opswd <service>"
return 1
fi
local service=$1
# If not logged in, print error and return
op list users > /dev/null || return
local password
# Copy the password to the clipboard
if ! password=$(op get item "$service" --fields password 2>/dev/null); then
echo "error: could not obtain password for $service"
return 1
fi
echo -n "$password" | clipcopy
echo "✔ password for $service copied to clipboard"
# If there's a one time password, copy it to the clipboard after 5 seconds
local totp
if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
sleep 10 && echo -n "$totp" | clipcopy
echo "✔ TOTP for $service copied to clipboard"
fi
(sleep 20 && clipcopy </dev/null 2>/dev/null) &!
}
}
opswd "$@"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -60,11 +60,9 @@ function bgnotify_formatted {
}
function bgnotify_appid {
if (( ${+commands[lsappinfo]} )); then
lsappinfo info -only bundleid "$(lsappinfo front)" | awk -F= '{print $2}' | tr -d '"' 2>/dev/null
elif (( ${+commands[osascript]} )); then
osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null
elif [[ -n $WAYLAND_DISPLAY ]] && ([[ -n $SWAYSOCK ]] || [[ -n $I3SOCK ]]) && (( ${+commands[swaymsg]} )); then # wayland+sway
if (( ${+commands[osascript]} )); then
osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null
elif [[ -n $WAYLAND_DISPLAY ]] && (( ${+commands[swaymsg]} )); then # wayland+sway
local app_id=$(bgnotify_find_sway_appid)
[[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS
elif [[ -z $WAYLAND_DISPLAY ]] && [[ -n $DISPLAY ]] && (( ${+commands[xprop]} )); then
@@ -110,7 +108,6 @@ function bgnotify_programid {
case "$TERM_PROGRAM" in
iTerm.app) echo 'com.googlecode.iterm2' ;;
Apple_Terminal) echo 'com.apple.terminal' ;;
ghostty) echo 'com.mitchellh.ghostty' ;;
esac
}

View File

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

View File

@@ -22,7 +22,6 @@ the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environmen
| Alias | Command | Description |
| -------- | --------------------------------------- | --------------------------------------------------------------------- |
| `ba` | `brew autoremove` | Uninstall unnecessary formulae. |
| `bcfg` | `brew config` | Show Homebrew and system configuration info useful for debugging. |
| `bci` | `brew info --cask` | Display information about the given cask. |
| `bcin` | `brew install --cask` | Install the given cask. |
| `bcl` | `brew list --cask` | List installed casks. |
@@ -32,7 +31,6 @@ the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environmen
| `bcubc` | `brew upgrade --cask && brew cleanup` | Upgrade outdated casks, then run cleanup. |
| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. |
| `bcup` | `brew upgrade --cask` | Upgrade all outdated casks. |
| `bdr` | `brew doctor` | Check your system for potential problems. |
| `bfu` | `brew upgrade --formula` | Upgrade only formulae (not casks). |
| `bi` | `brew install` | Install a formula. |
| `bl` | `brew list` | List all installed formulae. |
@@ -40,7 +38,6 @@ the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environmen
| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. |
| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. |
| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. |
| `bs` | `brew search` | Perform a substring search of cask tokens and formula names for text. |
| `bsl` | `brew services list` | List all running services. |
| `bsoff` | `brew services stop` | Stop the service and unregister it from launching at login (or boot). |
| `bsoffa` | `bsoff --all` | Stop all started services. |

View File

@@ -35,7 +35,6 @@ if [[ -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then
fi
alias ba='brew autoremove'
alias bcfg='brew config'
alias bci='brew info --cask'
alias bcin='brew install --cask'
alias bcl='brew list --cask'
@@ -45,14 +44,12 @@ alias bcrin='brew reinstall --cask'
alias bcubc='brew upgrade --cask && brew cleanup'
alias bcubo='brew update && brew outdated --cask'
alias bcup='brew upgrade --cask'
alias bdr='brew doctor'
alias bfu='brew upgrade --formula'
alias bi='brew install'
alias bl='brew list'
alias bo='brew outdated'
alias brewp='brew pin'
alias brewsp='brew list --pinned'
alias bs='brew search'
alias bsl='brew services list'
alias bsoff='brew services stop'
alias bsoffa='bsoff --all'

View File

@@ -15,13 +15,6 @@ _source-from-omz-settings() {
fi
}
_source-from-default-location() {
[[ -r /usr/local/share/chruby/chruby.sh ]] || return 1
source /usr/local/share/chruby/chruby.sh
source /usr/local/share/chruby/auto.sh
}
_source-from-homebrew() {
(( $+commands[brew] )) || return 1
@@ -29,8 +22,6 @@ _source-from-homebrew() {
# check default brew prefix
if [[ -h /usr/local/opt/chruby ]];then
_brew_prefix="/usr/local/opt/chruby"
elif [[ -h /opt/homebrew/opt/chruby ]]; then
_brew_prefix="/opt/homebrew/opt/chruby"
else
# ok , it is not default prefix
# this call to brew is expensive ( about 400 ms ), so at least let's make it only once
@@ -43,14 +34,27 @@ _source-from-homebrew() {
source $_brew_prefix/share/chruby/auto.sh
}
# Load chruby
_source-from-omz-settings || \
_source-from-default-location || \
_source-from-homebrew
_load-chruby-dirs() {
local dir
for dir in "$HOME/.rubies" "$PREFIX/opt/rubies"; do
if [[ -d "$dir" ]]; then
RUBIES+=("$dir")
fi
done
}
unfunction _source-from-homebrew \
_source-from-default-location \
_source-from-omz-settings
# Load chruby
if _source-from-omz-settings; then
_load-chruby-dirs
elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then
source /usr/local/share/chruby/chruby.sh
source /usr/local/share/chruby/auto.sh
_load-chruby-dirs
elif _source-from-homebrew; then
_load-chruby-dirs
fi
unfunction _source-from-homebrew _source-from-omz-settings _load-chruby-dirs
## chruby utility functions and aliases

View File

@@ -4,10 +4,6 @@ for file (
# Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found
/usr/share/doc/pkgfile/command-not-found.zsh
# Homebrew: https://github.com/Homebrew/homebrew-command-not-found
/opt/homebrew/Library/Homebrew/command-not-found/handler.sh
/usr/local/Homebrew/Library/Homebrew/command-not-found/handler.sh
/home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/command-not-found/handler.sh
# Old homebrew implementation
/opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh

View File

@@ -114,13 +114,13 @@ that file will be open with `acroread`.
### Listing files inside a packed file
| Alias | Command | Description |
| ------ | ------------ | --------------------------------- |
| zip | `unzip -l` | Lists files inside a .zip file |
| rar | `unrar l` | Lists files inside a .rar file |
| tar | `tar tf` | Lists files inside a .tar file |
| tar.gz | `tar -ztf` | Lists files inside a .tar.gz file |
| ace | `unace l` | Lists files inside a .ace file |
| Alias | Command | Description |
| ------ | ---------- | --------------------------------- |
| zip | `unzip -l` | Lists files inside a .zip file |
| rar | `unrar l` | Lists files inside a .rar file |
| tar | `tar tf` | Lists files inside a .tar file |
| tar.gz | `echo` | Lists files inside a .tar.gz file |
| ace | `unace l` | Lists files inside a .ace file |
### Some other features

View File

@@ -14,8 +14,8 @@ alias cnl='conda list'
alias cnle='conda list --export'
alias cnles='conda list --explicit > spec-file.txt'
alias cnr='conda remove'
alias cnrn='conda remove -y --all -n'
alias cnrp='conda remove -y --all -p'
alias cnrn='conda remove -y -all -n'
alias cnrp='conda remove -y -all -p'
alias cnry='conda remove -y'
alias cnsr='conda search'
alias cnu='conda update'

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -2,8 +2,6 @@
This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some
aliases for frequent docker-compose commands.
This plugin chooses automatically between the legacy `docker-compose` command and the modern
`docker compose` subcommand, preferring `docker-compose` when both are available.
To use it, add docker-compose to the plugins array of your zshrc file:

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
# .NET CLI plugin
# .NET Core CLI plugin
This plugin provides completion and useful aliases for [.NET CLI](https://dotnet.microsoft.com/).
This plugin provides completion and useful aliases for [.NET Core CLI](https://dotnet.microsoft.com/).
To use it, add `dotnet` to the plugins array in your zshrc file.
@@ -23,4 +23,3 @@ plugins=(... dotnet)
| dp | dotnet pack | Create a NuGet package. |
| dng | dotnet nuget | Provides additional NuGet commands. |
| db | dotnet build | Build a .NET project |
| dres | dotnet restore | Restore dependencies and project-specific tools for a project. |

View File

@@ -10,7 +10,7 @@ _dotnet_completion() {
compdef _dotnet_completion dotnet
# Aliases below are here for backwards compatibility
# Aliases bellow are here for backwards compatibility
# added by Shaun Tabone (https://github.com/xontab)
alias dn='dotnet new'
@@ -24,4 +24,3 @@ alias da='dotnet add'
alias dp='dotnet pack'
alias dng='dotnet nuget'
alias db='dotnet build'
alias dres='dotnet restore'

View File

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

View File

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

View File

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

View File

@@ -76,19 +76,11 @@ EOF
(*.lz4) lz4 -d "$full_path" ;;
(*.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
unrar x -ad "$full_path"
elif (( $+commands[unar] )); then
unar -o . "$full_path"
else
echo "extract: cannot extract RAR files: install unrar or unar" >&2
success=1
fi ;;
(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx) unzip "$full_path" ;;
(*.rar) unrar x -ad "$full_path" ;;
(*.rpm)
rpm2cpio "$full_path" | cpio --quiet -id ;;
(*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;;
(*.7z | *.7z.[0-9]*) 7za x "$full_path" ;;
(*.deb)
command mkdir -p "control" "data"
ar vx "$full_path" > /dev/null

9
plugins/fig/README.md Normal file
View File

@@ -0,0 +1,9 @@
# Fig plugin
This plugin sets up completion for [Fig](https://fig.io/).
To use it, add `fig` to the plugins array in your zshrc file:
```zsh
plugins=(... fig)
```

View File

@@ -0,0 +1,13 @@
if ! (( $+commands[fig] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `fig`. Otherwise, compinit will have already done that
if [[ ! -f "$ZSH_CACHE_DIR/completions/_fig" ]]; then
autoload -Uz _fig
typeset -g -A _comps
_comps[fig]=_fig
fi
fig completion zsh >| "$ZSH_CACHE_DIR/completions/_fig" &|

View File

@@ -26,4 +26,4 @@ if [[ ! -f "$ZSH_CACHE_DIR/completions/_flutter" ]]; then
_comps[flutter]=_flutter
fi
flutter zsh-completion < /dev/null >| "$ZSH_CACHE_DIR/completions/_flutter" &|
flutter zsh-completion >| "$ZSH_CACHE_DIR/completions/_flutter" &|

View File

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

View File

@@ -79,7 +79,6 @@ plugins=(... git)
| `gcss` | `git commit -S -s` |
| `gcssm` | `git commit -S -s -m` |
| `gcf` | `git config --list` |
| `gcfu` | `git commit --fixup` |
| `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` |
| `gd` | `git diff` |
| `gdca` | `git diff --cached` |
@@ -91,7 +90,7 @@ plugins=(... git)
| `gdnolock` | `git diff $@ ":(exclude)package-lock.json" ":(exclude)\*.lock"` |
| `gdt` | `git diff-tree --no-commit-id --name-only -r` |
| `gf` | `git fetch` |
| `gfa` | `git fetch --all --tags --prune` |
| `gfa` | `git fetch --all --tags --prune` |
| `gfo` | `git fetch origin` |
| `gg` | `git gui citool` |
| `gga` | `git gui citool --amend` |
@@ -213,7 +212,7 @@ plugins=(... git)
| `gtv` | `git tag \| sort -V` |
| `gignore` | `git update-index --assume-unchanged` |
| `gunignore` | `git update-index --no-assume-unchanged` |
| `gwch` | `git log --patch --abbrev-commit --pretty=medium --raw` |
| `gwch` | `git whatchanged -p --abbrev-commit --pretty=medium` |
| `gwt` | `git worktree` |
| `gwtls` | `git worktree list` |
| `gwtmv` | `git worktree move` |
@@ -234,26 +233,40 @@ branch exists. We do this via the function `git_main_branch`.
These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not,
receive further support.
| Alias | Command | Modification |
| :------- | :-------------------------------------------------------- | :-----------------------------------------------------|
| `gap` | `git add --patch` | New alias: `gapa` |
| `gcl` | `git config --list` | New alias: `gcf` |
| `gdt` | `git difftool` | No replacement |
| Alias | Command | Modification |
| :------- | :-------------------------------------------------------- | :-------------------------------------------------------- |
| `gap` | `git add --patch` | New alias: `gapa`. |
| `gcl` | `git config --list` | New alias: `gcf`. |
| `gdc` | `git diff --cached` | New alias: `gdca`. |
| `gdt` | `git difftool` | No replacement. |
| `ggpull` | `git pull origin $(current_branch)` | New alias: `ggl`. (`ggpull` still exists for now though.) |
| `ggpur` | `git pull --rebase origin $(current_branch)` | New alias: `ggu`. (`ggpur` still exists for now though.) |
| `ggpush` | `git push origin $(current_branch)` | New alias: `ggp`. (`ggpush` still exists for now though.) |
| `gk` | `gitk --all --branches` | Now aliased to `gitk --all --branches`. |
| `glg` | `git log --stat --max-count=10` | Now aliased to `git log --stat --color`. |
| `glgg` | `git log --graph --max-count=10` | Now aliased to `git log --graph --color`. |
| `gwc` | `git whatchanged -p --abbrev-commit --pretty = medium` | New alias: `gwch`. |
| `gup` | `git pull --rebase` | now alias `gpr` |
| `gupv` | `git pull --rebase -v` | now alias `gprv` |
| `gupa` | `git pull --rebase --autostash` | now alias `gpra` |
| `gupav` | `git pull --rebase --autostash -v` | now alias `gprav` |
| `gupom` | `git pull --rebase origin $(git_main_branch)` | now alias `gprom` |
| `gupomi` | `git pull --rebase=interactive origin $(git_main_branch)` | now alias `gpromi` |
## Functions
### Current
| Command | Description |
| :----------------------- | :------------------------------------------------------------------------------------------------------------- |
| `git_current_branch` | Returns the name of the current branch (Lives in `lib/git.zsh`) |
| `git_current_user_email` | Returns the `user.email` config value (Lives in `lib/git.zsh`) |
| `git_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) |
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise |
| `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**) |
| Command | Description |
| :----------------------- | :-------------------------------------------------------------------------------------------------------------- |
| `current_branch` | Returns the name of the current branch. |
| `git_current_user_email` | Returns the `user.email` config value. (Lives in `lib/git.zsh`.) |
| `git_current_user_name` | Returns the `user.name` config value. (Lives in `lib/git.zsh`.) |
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. |
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise. |
| `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**) |
### Work in Progress (WIP)
@@ -273,3 +286,4 @@ Note that `gwip` and `gunwip` are aliases, but are also documented here to group
| Command | Description | Reason |
| :------------------- | :-------------------------------------- | :--------------------------------------------------------------- |
| `current_repository` | Return the names of the current remotes | Didn't work properly. Use `git remote -v` instead (`grv` alias). |

View File

@@ -8,6 +8,14 @@ git_version="${${(As: :)$(git version 2>/dev/null)}[3]}"
# (order should follow README)
#
# The name of the current branch
# Back-compatibility wrapper for when this function was defined here in
# the plugin, before being pulled in to core lib/git.zsh as git_current_branch()
# to fix the core -> git plugin dependency.
function current_branch() {
git_current_branch
}
# Check for develop and similarly named branches
function git_develop_branch() {
command git rev-parse --git-dir &>/dev/null || return
@@ -23,26 +31,16 @@ function git_develop_branch() {
return 1
}
# Get the default branch name from common branch names or fallback to remote HEAD
# Check if main exists and use instead of master
function git_main_branch() {
command git rev-parse --git-dir &>/dev/null || return
local remote ref
local ref
for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,stable,master}; do
if command git show-ref -q --verify $ref; then
echo ${ref:t}
return 0
fi
done
# Fallback: try to get the default branch from remote HEAD symbolic refs
for remote in origin upstream; do
ref=$(command git rev-parse --abbrev-ref $remote/HEAD 2>/dev/null)
if [[ $ref == $remote/* ]]; then
echo ${ref#"$remote/"}; return 0
fi
done
# If no main branch was found, fall back to master but return error
echo master
@@ -88,13 +86,13 @@ function work_in_progress() {
# Aliases
# (sorted alphabetically by command)
# (order should follow README)
# (in some cases force the alias order to match README, like for example gke and gk)
# (in some cases force the alisas order to match README, like for example gke and gk)
#
alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
function ggpnp() {
if [[ $# == 0 ]]; then
if [[ "$#" == 0 ]]; then
ggl && ggp
else
ggl "${*}" && ggp "${*}"
@@ -202,7 +200,6 @@ alias gc!='git commit --verbose --amend'
alias gcn='git commit --verbose --no-edit'
alias gcn!='git commit --verbose --no-edit --amend'
alias gcf='git config --list'
alias gcfu='git commit --fixup'
alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
alias gd='git diff'
alias gdca='git diff --cached'
@@ -272,11 +269,10 @@ alias gpra='git pull --rebase --autostash'
alias gprav='git pull --rebase --autostash -v'
function ggu() {
local b
[[ $# != 1 ]] && b="$(git_current_branch)"
git pull --rebase origin "${b:-$1}"
[[ "$#" != 1 ]] && local b="$(git_current_branch)"
git pull --rebase origin "${b:=$1}"
}
compdef _git ggu=git-pull
compdef _git ggu=git-checkout
alias gprom='git pull --rebase origin $(git_main_branch)'
alias gpromi='git pull --rebase=interactive origin $(git_main_branch)'
@@ -285,15 +281,14 @@ alias gprumi='git pull --rebase=interactive upstream $(git_main_branch)'
alias ggpull='git pull origin "$(git_current_branch)"'
function ggl() {
if [[ $# != 0 ]] && [[ $# != 1 ]]; then
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
git pull origin "${*}"
else
local b
[[ $# == 0 ]] && b="$(git_current_branch)"
git pull origin "${b:-$1}"
[[ "$#" == 0 ]] && local b="$(git_current_branch)"
git pull origin "${b:=$1}"
fi
}
compdef _git ggl=git-pull
compdef _git ggl=git-checkout
alias gluc='git pull upstream $(git_current_branch)'
alias glum='git pull upstream $(git_main_branch)'
@@ -301,11 +296,10 @@ alias gp='git push'
alias gpd='git push --dry-run'
function ggf() {
local b
[[ $# != 1 ]] && b="$(git_current_branch)"
git push --force origin "${b:-$1}"
[[ "$#" != 1 ]] && local b="$(git_current_branch)"
git push --force origin "${b:=$1}"
}
compdef _git ggf=git-push
compdef _git ggf=git-checkout
alias gpf!='git push --force'
is-at-least 2.30 "$git_version" \
@@ -313,11 +307,10 @@ is-at-least 2.30 "$git_version" \
|| alias gpf='git push --force-with-lease'
function ggfl() {
local b
[[ $# != 1 ]] && b="$(git_current_branch)"
git push --force-with-lease origin "${b:-$1}"
[[ "$#" != 1 ]] && local b="$(git_current_branch)"
git push --force-with-lease origin "${b:=$1}"
}
compdef _git ggfl=git-push
compdef _git ggfl=git-checkout
alias gpsup='git push --set-upstream origin $(git_current_branch)'
is-at-least 2.30 "$git_version" \
@@ -329,15 +322,14 @@ alias gpod='git push origin --delete'
alias ggpush='git push origin "$(git_current_branch)"'
function ggp() {
if [[ $# != 0 ]] && [[ $# != 1 ]]; then
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then
git push origin "${*}"
else
local b
[[ $# == 0 ]] && b="$(git_current_branch)"
git push origin "${b:-$1}"
[[ "$#" == 0 ]] && local b="$(git_current_branch)"
git push origin "${b:=$1}"
fi
}
compdef _git ggp=git-push
compdef _git ggp=git-checkout
alias gpu='git push upstream'
alias grb='git rebase'
@@ -406,7 +398,7 @@ alias gts='git tag --sign'
alias gtv='git tag | sort -V'
alias gignore='git update-index --assume-unchanged'
alias gunignore='git update-index --no-assume-unchanged'
alias gwch='git log --patch --abbrev-commit --pretty=medium --raw'
alias gwch='git whatchanged -p --abbrev-commit --pretty=medium'
alias gwt='git worktree'
alias gwta='git worktree add'
alias gwtls='git worktree list'
@@ -419,13 +411,19 @@ alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!'
unset git_version
# Logic for adding warnings on deprecated aliases or functions
local old_name new_name
for old_name new_name (
current_branch git_current_branch
# Logic for adding warnings on deprecated aliases
local old_alias new_alias
for old_alias new_alias (
# TODO(2023-10-19): remove deprecated `git pull --rebase` aliases
gup gpr
gupv gprv
gupa gpra
gupav gprav
gupom gprom
gupomi gpromi
); do
aliases[$old_name]="
print -Pu2 \"%F{yellow}[oh-my-zsh] '%F{red}${old_name}%F{yellow}' is deprecated, using '%F{green}${new_name}%F{yellow}' instead.%f\"
$new_name"
aliases[$old_alias]="
print -Pu2 \"%F{yellow}[oh-my-zsh] '%F{red}${old_alias}%F{yellow}' is a deprecated alias, using '%F{green}${new_alias}%F{yellow}' instead.%f\"
$new_alias"
done
unset old_name new_name
unset old_alias new_alias

View File

@@ -1,11 +1,6 @@
# gpg-agent
Applies some fixes for some common issues encountered with [GPG's gpg-agent](https://www.gnupg.org/documentation/manuals/gnupg/).
More specifically, this plugin:
- Updates the `GPG_TTY` environment variable before each shell execution.
- Updates the `SSH_AUTH_SOCK` environment variable if `enable-ssh-support` is turned on.
Enables [GPG's gpg-agent](https://www.gnupg.org/documentation/manuals/gnupg/) if it is not running.
To use it, add `gpg-agent` to the plugins array of your zshrc file:

View File

@@ -19,18 +19,18 @@ __gradle-init-cache-dir() {
}
__gradle-set-settings-file() {
# In order of precedence: settings.gradle, settings.gradle.kts
# In order of precedence: --settings-file=filename, settings.gradle, settings.gradle.kts
local default_gradle_settings_file="$project_root_dir/settings.gradle"
if [[ ! -f $default_gradle_settings_file ]]; then
default_gradle_settings_file="$project_root_dir/settings.gradle.kts"
fi
gradle_settings_file=$default_gradle_settings_file
gradle_settings_file=${${(v)opt_args[(i)-c|--settings-file]}:-$default_gradle_settings_file}
}
__gradle-set-build-file() {
__gradle-set-settings-file
# In order of precedence: rootProject.buildFileName, build.gradle, build.gradle.kts
# In order of precedence: --build-file=filename, rootProject.buildFileName, build.gradle, build.gradle.kts
local default_gradle_build_file_name="build.gradle"
if [[ -r $gradle_settings_file ]]; then
@@ -45,7 +45,8 @@ __gradle-set-build-file() {
default_gradle_build_file="$project_root_dir/build.gradle.kts"
fi
gradle_build_file=$default_gradle_build_file
# If a build file is specified after '-b' or '--build-file', use this file.
gradle_build_file=${${(v)opt_args[(i)-b|--build-file]}:-$default_gradle_build_file}
}
__gradle-set-cache-name() {
@@ -93,11 +94,10 @@ __gradle-generate-tasks-cache() {
# Reuse Gradle Daemon if IDLE but don't start a new one.
local gradle_tasks_output
if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then
gradle_tasks_output="$(cd "$project_root_dir" && "$gradle_cmd" --daemon --no-scan --console=plain -q tasks --all 2>/dev/null)"
gradle_tasks_output="$($gradle_cmd --daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)"
else
gradle_tasks_output="$(cd "$project_root_dir" && "$gradle_cmd" --no-daemon --no-scan --console=plain -q tasks --all 2>/dev/null)"
gradle_tasks_output="$($gradle_cmd --no-daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)"
fi
local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line
local -a match
for output_line in ${(f)"$(printf "%s\n" "${gradle_tasks_output[@]}")"}; do
@@ -199,158 +199,106 @@ __gradle_subcommand() {
;;
(dependencyInsight)
_arguments \
'--all-variants[Show all variants of each dependency]' \
'--configuration=[Looks for the dependency in given configuration.]:dependency configuration:_gradle_dependency_configurations' \
'--dependency=[Shows the details of given dependency.]' \
'--single-path[Show at most one path to each dependency]' && ret=0
'--configuration=[Looks for the dependency in given configuration.]:dependency configuration:_gradle_dependency_configurations' && ret=0
;;
(help)
_arguments \
'--task=[The task to show help for.]' && ret=0
'--task[The task to show help for.]' && ret=0
;;
(init)
_arguments \
'--comments[Include clarifying comments in files.]' \
'--dsl=[Set the build script DSL to be used in generated scripts.]' \
'--incubating[Allow the generated build to use new features and APIs.]' \
'--insecure-protocol=[How to handle insecure URLs used for Maven Repositories.]' \
'--java-version=[Provides java version to use in the project.]' \
'--overwrite[Allow existing files in the build directory to be overwritten?]' \
'--package=[Set the package for source files.]' \
'--project-name=[Set the project name.]' \
'--split-project[Split functionality across multiple subprojects?]' \
'--test-framework=[Set the test framework to be used.]' \
'--type=[Set the type of project to generate.]' \
'--use-defaults[Use default values for options not configured explicitly]' && ret=0
'--dsl=[DSL to be used in generated scripts.]:dsl:(groovy kotlin)' \
'--package=[Package for the generated source.]' \
'--project-name=[Name of the generated project.]' \
'--test-framework=[Test framework to be used.]:test framework:(junit kotlintest scalatest spock testng)' \
'--type=[Project type to generate.]:project type:(basic cpp-application cpp-library groovy-application groovy-library java-application java-library kotlin-application kotlin-library pom scala-library)' && ret=0
;;
(tasks)
_arguments \
'--all[Show additional tasks and detail.]' \
'--group=[Show tasks for a specific group.]' \
'--groups=[Show tasks for specific groups (can be used multiple times to specify multiple groups).]' \
'--types[Show task class types]' && ret=0
'--all[List all tasks, including subproject tasks.]' \
'--group=[Show tasks only from given task group.]' && ret=0
;;
(test)
_arguments -C \
'--debug-jvm[Enable debugging for the test process. The process is started suspended and listening on port 5005.]' \
'--fail-fast[Stops test execution after the first failed test.]' \
'--test-dry-run[Simulate test execution.]' \
'--tests=[Sets test class or method name to be included (in addition to the test task filters), '*' is supported.]' \
'--debug-jvm[Enable debugging for the test process. The process is started suspended and listening on port 5005. Requires the "java" plugin.]' \
'--fail-fast[Stops test execution after the first failed test. Requires the "java" plugin.]' \
'--tests=[Sets test class or method name to be included, * is supported. Requires the "java" plugin.]' \
'(-)*:: :->task-or-option' && ret=0
;;
(wrapper)
_arguments \
'--distribution-type=[The type of the Gradle distribution to be used by the wrapper.]:*:distribution type:(bin all)' \
'--gradle-distribution-sha256-sum=[The SHA-256 hash sum of the gradle distribution.]' \
'--gradle-distribution-url=[The URL to download the Gradle distribution from.]' \
'--gradle-version=[The version of the Gradle distribution required by the wrapper. The following labels are allowed: latest, release-candidate, release-milestone, release-nightly, and nightly.]' \
'--network-timeout=[Timeout in ms to use when the wrapper is performing network operations.]' \
'--validate-url[Sets task to validate the configured distribution url.]' && ret=0
'--distribution-type=[Binary-only or all with docs and sources]:*:distribution type:(bin all)' \
'--gradle-version=[Set Gradle version for wrapper]' \
'--gradle-distribution-sha256-sum=[SHA-256 checksum]' \
'--gradle-distribution-url=[Set Gradle distribution URL]' && ret=0
;;
(*)
_arguments -C \
'-Dgradle.user.home=[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle.user.home:_directories' \
'-Dorg.gradle.caching.debug=[]' \
'-Dorg.gradle.caching=[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]:org.gradle.caching:(true false)' \
'-Dorg.gradle.configuration-cache.entries-per-key=[]' \
'-Dorg.gradle.configuration-cache.fine-grained-property-tracking=[]' \
'-Dorg.gradle.configuration-cache.heap-dump-dir=[]:org.gradle.configuration cache.heap dump dir:_directories' \
'-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=[]' \
'-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.in-serialization=[]' \
'-Dorg.gradle.configuration-cache.integrity-check=[]' \
'-Dorg.gradle.configuration-cache.max-problems=[]' \
'-Dorg.gradle.configuration-cache.parallel=[]' \
'-Dorg.gradle.configuration-cache.problems=[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]: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=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'-Dorg.gradle.configureondemand=[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]' \
'-Dorg.gradle.console=[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:org.gradle.console:(plain auto rich verbose)' \
'-Dorg.gradle.continue=[Continue task execution after a task failure.]' \
'-Dorg.gradle.continuous.quietperiod=[]' \
'-Dorg.gradle.daemon.healthcheckinterval=[]' \
'-Dorg.gradle.daemon.idletimeout=[]' \
'-Dorg.gradle.daemon.registry.base=[]:org.gradle.daemon.registry.base:_directories' \
'-Dorg.gradle.daemon=[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'-Dorg.gradle.debug.host=[]' \
'-Dorg.gradle.debug.port=[]' \
'-Dorg.gradle.debug.server=[]' \
'-Dorg.gradle.debug.suspend=[]' \
'-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \
'-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \
'-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \
'-Dorg.gradle.java.installations.auto-detect=[]' \
'-Dorg.gradle.java.installations.auto-download=[]' \
'-Dorg.gradle.java.installations.fromEnv=[]' \
'-Dorg.gradle.java.installations.idea-jdks-directory=[]:org.gradle.java.installations.idea jdks directory:_directories' \
'-Dorg.gradle.java.installations.paths=[]:org.gradle.java.installations.paths:_directories' \
'-Dorg.gradle.jvmargs=[]' \
'-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug)' \
'-Dorg.gradle.logging.stacktrace=[]' \
'-Dorg.gradle.native=[]' \
'-Dorg.gradle.parallel=[Build 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. Values are 'normal' (default) or 'low']:org.gradle.priority:(normal low)' \
'-Dorg.gradle.problems.report=[(Experimental) enables HTML problems report]' \
'-Dorg.gradle.projectcachedir=[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \
'-Dorg.gradle.unsafe.isolated-projects=[]' \
'-Dorg.gradle.vfs.verbose=[]' \
'-Dorg.gradle.vfs.watch=[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]:org.gradle.vfs.watch:(true false)' \
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']' \
'-Dorg.gradle.welcome=[]:org.gradle.welcome:(once never)' \
'-Dorg.gradle.workers.max=[Configure the number of concurrent workers Gradle is allowed to use.]' \
(--no-build-cache)'--build-cache[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]' \
(--no-configuration-cache)'--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--configuration-cache-problems[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:configuration cache problems:(fail warn)' \
(--no-configure-on-demand)'--configure-on-demand[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds. (incubating)]' \
'--console[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:console:(plain auto rich verbose)' \
(--no-continue)'--continue[Continue task execution after a task failure.]' \
{-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \
(--no-daemon)'--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
(--quiet,-q,--warn,-w,--info,-i){-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
{-F,--dependency-verification}'[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:dependency verification:(strict lenient off)' \
{-m,--dry-run}'[Run the builds with all task actions disabled.]' \
\*{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'--export-keys[Exports the public keys used for dependency verification.]' \
'--foreground[Starts the Gradle daemon in the foreground.]' \
(--stacktrace,-s){-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
{-g,--gradle-user-home}'[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle user home:_directories' \
\*'--include-build[Include the specified build in the composite.]:include build:_directories' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Set log level to info.]' \
\*{-I,--init-script}'[Specify an initialization script.]:init script:_files -g \*.gradle(|.kts)' \
'--max-workers[Configure the 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[Stop task execution after a task failure.]' \
(--daemon)'--no-daemon[Do not use the Gradle daemon to run the build. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--parallel)'--no-parallel[Disables parallel execution to build projects.]' \
(--problems-report)'--no-problems-report[(Experimental) disables HTML problems report]' \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \
(--scan)'--no-scan[Disables the creation of a Build Scan.]' \
(--watch-fs)'--no-watch-fs[Disables watching the file system.]' \
'--offline[Execute the build without accessing network resources.]' \
(--no-parallel)'--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \
'--priority[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Values are 'normal' (default) or 'low']' \
(--no-problems-report)'--problems-report[(Experimental) enables HTML problems report]' \
'--profile[Profile build execution time and generates a report in the <build_dir>/reports/profile directory.]' \
'--project-cache-dir[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:project cache dir:_directories' \
{-p,--project-dir}'[Specifies the start directory for Gradle. Defaults to current directory.]:project dir:_directories' \
'--property-upgrade-report[(Experimental) Runs build with experimental property upgrade report.]' \
(--warn,-w,--info,-i,--debug,-d){-q,--quiet}'[Log errors only.]' \
{-U,--refresh-dependencies}'[Refresh the state of dependencies.]' \
'--refresh-keys[Refresh the public keys used for dependency verification.]' \
'--rerun[Causes the task to be re-run even if up-to-date.]' \
'(--no-build-cache)--build-cache[Enable the Gradle build cache.]' \
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle' \
'(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \
'--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \
'(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \
'--continue[Continues task execution after a task failure.]' \
'-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \
'-Dorg.gradle.caching=[Set true to enable Gradle build cache.]:enable build cache:(true false)' \
'-Dorg.gradle.console=[Set type of console output to generate.]:console output type:(plain auto rich verbose)' \
'-Dorg.gradle.daemon.debug=[Set true to debug Gradle Daemon.]:enable daemon debug:(true false)' \
'-Dorg.gradle.daemon.idletimeout=[Kill Gradle Daemon after # idle millis.]' \
'-Dorg.gradle.debug=[Set true to debug Gradle Client.]' \
'-Dorg.gradle.jvmargs=[Set JVM arguments.]' \
'-Dorg.gradle.java.home=[Set JDK home dir.]' \
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:enable parallel build:(true false)' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \
'-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
'(--no-daemon)--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'--foreground[Starts the Gradle daemon in the foreground.]' \
{-g,--gradle-user-home}'[Specifies the gradle user home directory.]:file:_directories' \
\*--include-build'[Includes the specified build in the composite.]:file:_directories' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle' \
'(-d --debug -w --warn -q --quiet)'{-i,--info}'[Set log level to info.]' \
'--max-workers[Set the maximum number of concurrent workers that Gradle may use.]:number workers' \
{-m,--dry-run}'[Runs the builds with all task actions disabled.]' \
'--no-color[Do not use color in the console output. (Removed in Gradle 3.0)]' \
'(--build-cache)--no-build-cache[Do not use the Gradle build cache.]' \
'(--configure-on-demand)--no-configure-on-demand[Disables configuration on demand.]' \
'(--daemon)--no-daemon[Do not use the Gradle daemon to run the build.]' \
'(--parallel)--no-parallel[Disables parallel execution to build projects.]' \
'(--scan)--no-scan[Do not create a build scan.]' \
'--offline[The build should operate without accessing network resources.]' \
\*{-P+,--project-prop}'[Set project property for the build script (e.g. -Pmyprop=myvalue).]:project property (prop=val):' \
{-p,--project-dir}'[Specifies the start directory for Gradle.]:start directory:_directories' \
'(--no-parallel)--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \
'--profile[Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.]' \
'--priority[Set priority for Gradle worker processes.]:priority:(low normal)' \
'--project-cache-dir[Specifies the project-specific cache directory.]:cache directory:_directories' \
'(-d --debug -w --warn -i --info)'{-q,--quiet}'[Log errors only.]' \
'--recompile-scripts[Force build script recompiling.]' \
'--refresh[Refresh the state of resources of the type(s) specified.]:refresh policy:(dependencies)' \
'--refresh-dependencies[Refresh the state of dependencies.]' \
'--rerun-tasks[Ignore previously cached task results.]' \
(--no-scan)'--scan[Generate a Build Scan (powered by Develocity).]' \
{-V,--show-version}'[Print version info and continue.]' \
(--full-stacktrace,-S){-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'--task-graph[(Experimental) Print task graph instead of executing tasks.]' \
\*'--update-locks[Perform a partial update of the dependency lock, letting passed in module notations change version. (incubating)]' \
(--quiet,-q,--info,-i,--debug,-d){-w,--warn}'[Set log level to warn.]' \
'--warning-mode[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:warning mode:(all summary none)' \
(--no-watch-fs)'--watch-fs[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]' \
'--write-locks[Persists dependency resolution for locked configurations, ignoring existing locking information if it exists]' \
{-M,--write-verification-metadata}'[Generates checksums for dependencies used in the project (comma-separated list)]' && ret=0
'(--no-scan)--scan[Create a build scan.]' \
'(-S --full-stacktrace)'{-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'(-s --stacktrace)'{-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
'--system-prop[system property (prop=val)]' \
{-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \
{-u,--no-search-upward}"[Don't search in parent folders for a settings.gradle file.]" \
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \
'(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' && ret=0
;;
esac
@@ -376,113 +324,76 @@ _gradle() {
typeset -A opt_args
_arguments -C \
'-Dgradle.user.home=[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle.user.home:_directories:->argument-expected' \
'-Dorg.gradle.caching.debug=[]:->argument-expected' \
'-Dorg.gradle.caching=[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]:org.gradle.caching:(true false):->argument-expected' \
'-Dorg.gradle.configuration-cache.entries-per-key=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.fine-grained-property-tracking=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.heap-dump-dir=[]:org.gradle.configuration cache.heap dump dir:_directories:->argument-expected' \
'-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.in-serialization=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.integrity-check=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.max-problems=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.parallel=[]:->argument-expected' \
'-Dorg.gradle.configuration-cache.problems=[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]: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=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]:->argument-expected' \
'-Dorg.gradle.configureondemand=[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]:->argument-expected' \
'-Dorg.gradle.console=[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:org.gradle.console:(plain auto rich verbose):->argument-expected' \
'-Dorg.gradle.continue=[Continue task execution after a task failure.]:->argument-expected' \
'-Dorg.gradle.continuous.quietperiod=[]:->argument-expected' \
'-Dorg.gradle.daemon.healthcheckinterval=[]:->argument-expected' \
'-Dorg.gradle.daemon.idletimeout=[]:->argument-expected' \
'-Dorg.gradle.daemon.registry.base=[]:org.gradle.daemon.registry.base:_directories:->argument-expected' \
'-Dorg.gradle.daemon=[Uses the Gradle daemon to run the build. Starts the daemon if not running.]:->argument-expected' \
'-Dorg.gradle.debug.host=[]:->argument-expected' \
'-Dorg.gradle.debug.port=[]:->argument-expected' \
'-Dorg.gradle.debug.server=[]:->argument-expected' \
'-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. Values are 'strict', 'lenient' or 'off'.]:org.gradle.dependency.verification:(strict lenient off):->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' \
'-Dorg.gradle.java.installations.fromEnv=[]:->argument-expected' \
'-Dorg.gradle.java.installations.idea-jdks-directory=[]:org.gradle.java.installations.idea jdks directory:_directories:->argument-expected' \
'-Dorg.gradle.java.installations.paths=[]:org.gradle.java.installations.paths:_directories:->argument-expected' \
'-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.native=[]:->argument-expected' \
'-Dorg.gradle.parallel=[Build 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. Values are 'normal' (default) or 'low']:org.gradle.priority:(normal low):->argument-expected' \
'-Dorg.gradle.problems.report=[(Experimental) enables HTML problems report]:->argument-expected' \
'-Dorg.gradle.projectcachedir=[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:org.gradle.projectcachedir:_directories:->argument-expected' \
'-Dorg.gradle.unsafe.isolated-projects=[]:->argument-expected' \
'-Dorg.gradle.vfs.verbose=[]:->argument-expected' \
'-Dorg.gradle.vfs.watch=[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]:org.gradle.vfs.watch:(true false):->argument-expected' \
'-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:->argument-expected' \
'-Dorg.gradle.welcome=[]:org.gradle.welcome:(once never):->argument-expected' \
'-Dorg.gradle.workers.max=[Configure the number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
(--no-build-cache)'--build-cache[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]' \
(--no-configuration-cache)'--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--configuration-cache-problems[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:configuration cache problems:(fail warn):->argument-expected' \
(--no-configure-on-demand)'--configure-on-demand[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds. (incubating)]' \
'--console[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:console:(plain auto rich verbose):->argument-expected' \
(--no-continue)'--continue[Continue task execution after a task failure.]' \
{-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \
(--no-daemon)'--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
(--quiet,-q,--warn,-w,--info,-i){-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
{-F,--dependency-verification}'[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:dependency verification:(strict lenient off):->argument-expected' \
{-m,--dry-run}'[Run the builds with all task actions disabled.]' \
\*{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'--export-keys[Exports the public keys used for dependency verification.]' \
'--foreground[Starts the Gradle daemon in the foreground.]' \
(--stacktrace,-s){-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
{-g,--gradle-user-home}'[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle user home:_directories:->argument-expected' \
{-h,--help}'[Shows a help message.]' \
\*'--include-build[Include the specified build in the composite.]:include build:_directories:->argument-expected' \
(--quiet,-q,--warn,-w,--debug,-d){-i,--info}'[Set log level to info.]' \
\*{-I,--init-script}'[Specify an initialization script.]:init script:_files -g \*.gradle(|.kts):->argument-expected' \
'--max-workers[Configure the 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[Stop task execution after a task failure.]' \
(--daemon)'--no-daemon[Do not use the Gradle daemon to run the build. Useful occasionally if you have configured Gradle to always run with the daemon by default.]' \
(--parallel)'--no-parallel[Disables parallel execution to build projects.]' \
(--problems-report)'--no-problems-report[(Experimental) disables HTML problems report]' \
'(-)'{-\?,-h,--help}'[Shows a help message.]' \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \
(--scan)'--no-scan[Disables the creation of a Build Scan.]' \
(--watch-fs)'--no-watch-fs[Disables watching the file system.]' \
'--offline[Execute the build without accessing network resources.]' \
(--no-parallel)'--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \
'--priority[Specifies the scheduling priority for the Gradle daemon and all processes launched by it. Values are 'normal' (default) or 'low']:->argument-expected' \
(--no-problems-report)'--problems-report[(Experimental) enables HTML problems report]' \
'--profile[Profile build execution time and generates a report in the <build_dir>/reports/profile directory.]' \
'--project-cache-dir[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:project cache dir:_directories:->argument-expected' \
{-p,--project-dir}'[Specifies the start directory for Gradle. Defaults to current directory.]:project dir:_directories:->argument-expected' \
'--property-upgrade-report[(Experimental) Runs build with experimental property upgrade report.]' \
(--warn,-w,--info,-i,--debug,-d){-q,--quiet}'[Log errors only.]' \
{-U,--refresh-dependencies}'[Refresh the state of dependencies.]' \
'--refresh-keys[Refresh the public keys used for dependency verification.]' \
'--rerun[Causes the task to be re-run even if up-to-date.]' \
'(--no-build-cache)--build-cache[Enable the Gradle build cache.]' \
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle:->argument-expected' \
'(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \
'--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \
'--continue[Continues task execution after a task failure.]' \
'-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \
'-Dorg.gradle.caching=[Set true to enable Gradle build cache.]' \
'-Dorg.gradle.console=[Set type of console output to generate.]:console output type:(plain auto rich verbose)' \
'-Dorg.gradle.daemon.debug=[Set true to debug Gradle Daemon.]' \
'-Dorg.gradle.daemon.idletimeout=[Kill Gradle Daemon after # idle millis.]' \
'-Dorg.gradle.debug=[Set true to debug Gradle Client.]' \
'-Dorg.gradle.jvmargs=[Set JVM arguments.]' \
'-Dorg.gradle.java.home=[Set JDK home dir.]' \
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:(true false)' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \
'-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
'(--no-daemon)--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'--foreground[Starts the Gradle daemon in the foreground.]' \
{-g,--gradle-user-home}'[Specifies the gradle user home directory.]:home directory:_directories:->argument-expected' \
'(-)--gui[Launches the Gradle GUI. (Removed in Gradle 4.0)]' \
\*--include-build'[Includes the specified build in the composite.]:file:_directories:->argument-expected' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle:->argument-expected' \
'(-d --debug -w --warn -q --quiet)'{-i,--info}'[Set log level to info.]' \
'--max-workers[Set the maximum number of concurrent workers that Gradle may use.]:number workers:->argument-expected' \
{-m,--dry-run}'[Runs the builds with all task actions disabled.]' \
'--no-color[Do not use color in the console output. (Removed in Gradle 3.0)]' \
'(--build-cache)--no-build-cache[Do not use the Gradle build cache.]' \
'(--configure-on-demand)--no-configure-on-demand[Disables configuration on demand.]' \
'(--daemon)--no-daemon[Do not use the Gradle daemon to run the build.]' \
'(--parallel)--no-parallel[Disables parallel execution to build projects.]' \
'(--scan)--no-scan[Do not create a build scan.]' \
'--offline[The build should operate without accessing network resources.]' \
\*{-P+,--project-prop}'[Set project property for the build script (e.g. -Pmyprop=myvalue).]:project property (prop=val):->argument-expected' \
{-p,--project-dir}'[Specifies the start directory for Gradle.]:start directory:_directories:->argument-expected' \
'(--no-parallel)--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \
'--priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \
'--profile[Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.]' \
'--project-cache-dir=[Specifies the project-specific cache directory.]:cache directory:_directories:->argument-expected' \
'(-d --debug -w --warn -i --info)'{-q,--quiet}'[Log errors only.]' \
'--recompile-scripts[Force build script recompiling.]' \
'--refresh[Refresh the state of resources of the type(s) specified.]:refresh policy:(dependencies)' \
'--refresh-dependencies[Refresh the state of dependencies.]' \
'--rerun-tasks[Ignore previously cached task results.]' \
(--no-scan)'--scan[Generate a Build Scan (powered by Develocity).]' \
{-V,--show-version}'[Print version info and continue.]' \
(--full-stacktrace,-S){-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'--status[Shows status of running and recently stopped Gradle daemon(s).]' \
'--stop[Stops the Gradle daemon if it is running.]' \
'--task-graph[(Experimental) Print task graph instead of executing tasks.]' \
\*'--update-locks[Perform a partial update of the dependency lock, letting passed in module notations change version. (incubating)]' \
{-v,--version}'[Print version info and exit.]' \
(--quiet,-q,--info,-i,--debug,-d){-w,--warn}'[Set log level to warn.]' \
'--warning-mode[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:warning mode:(all summary none):->argument-expected' \
(--no-watch-fs)'--watch-fs[Enables watching the file system for changes, allowing data about the file system to be re-used for the next build.]' \
'--write-locks[Persists dependency resolution for locked configurations, ignoring existing locking information if it exists]' \
{-M,--write-verification-metadata}'[Generates checksums for dependencies used in the project (comma-separated list)]:->argument-expected' \
'(-)*:: :->task-or-option' && ret=0
'(--no-scan)--scan[Create a build scan.]' \
'(-S --full-stacktrace)'{-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \
'(-s --stacktrace)'{-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \
'(-)--status[Shows status of running and recently stopped Gradle Daemons.]' \
'(-)--stop[Stops all Gradle daemons.]' \
'--system-prop[system property (prop=val)]' \
{-t,--continuous}'[Enables continuous build. Gradle does not exit and will re-execute tasks when task file inputs change.]' \
{-u,--no-search-upward}"[Don't search in parent folders for a settings.gradle file.]" \
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \
'(-)'{-v,--version}'[Print version info.]' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \
'(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'(-)*:: :->task-or-option' && ret=0
if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then
__gradle_tasks && ret=0

View File

@@ -79,7 +79,7 @@ Using [Zinit](https://github.com/zdharma-continuum/zinit):
2. Load the plugin in `~/.zshrc`:
zinit load 'zsh-users/zsh-history-substring-search'
zinit load 'zsh-users/zsh-history-substring-search
zinit ice wait atload'_history_substring_search_config'
3. Run `exec zsh` to take changes into account:

View File

@@ -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}*"

View File

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

View File

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

View File

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

View File

@@ -1,108 +0,0 @@
# jj - Jujutsu CLI
This plugin provides autocompletion for [jj](https://martinvonz.github.io/jj).
To use it, add `jj` to the plugins array of your zshrc file:
```zsh
plugins=(... jj)
```
## Aliases
| Alias | Command |
| ------ | ----------------------------- |
| jja | `jj abandon` |
| jjb | `jj bookmark` |
| jjbc | `jj bookmark create` |
| jjbd | `jj bookmark delete` |
| jjbf | `jj bookmark forget` |
| jjbl | `jj bookmark list` |
| jjbm | `jj bookmark move` |
| jjbr | `jj bookmark rename` |
| jjbs | `jj bookmark set` |
| jjbt | `jj bookmark track` |
| jjbu | `jj bookmark untrack` |
| jjc | `jj commit` |
| jjcmsg | `jj commit --message` |
| jjd | `jj diff` |
| jjdmsg | `jj desc --message` |
| jjds | `jj desc` |
| jje | `jj edit` |
| jjgcl | `jj git clone` |
| jjgf | `jj git fetch` |
| jjgfa | `jj git fetch --all-remotes` |
| jjgp | `jj git push` |
| jjgpa | `jj git push --all` |
| jjgpd | `jj git push --deleted` |
| jjgpt | `jj git push --tracked` |
| jjl | `jj log` |
| jjla | `jj log -r "all()"` |
| jjn | `jj new` |
| jjnt | `jj new "trunk()"` |
| jjrb | `jj rebase` |
| jjrbm | `jj rebase -d "trunk()"` |
| jjrs | `jj restore` |
| jjrt | `cd "$(jj root \|\| echo .)"` |
| jjsp | `jj split` |
| jjsq | `jj squash` |
| jjst | `jj status` |
## Prompt usage
Because `jj` has a very powerful [template syntax](https://martinvonz.github.io/jj/latest/templates/), this
plugin only exposes a convenience function `jj_prompt_template` to read information from the current change.
It is basically the same as `jj log --no-graph -r @ -T $1`:
```sh
_my_theme_jj_info() {
jj_prompt_template 'self.change_id().shortest(3)'
}
PROMPT='$(_my_theme_jj_info) $'
```
`jj_prompt_template` escapes `%` signs in the output. Use `jj_prompt_template_raw` if you don't want that
(e.g. to colorize the output).
However, because `jj` can be used inside a Git repository, some themes might clash with it. Generally, you can
fix it with a wrapper function that tries `jj` first and then falls back to `git` if it didn't work:
```sh
_my_theme_vcs_info() {
jj_prompt_template 'self.change_id().shortest(3)' \
|| git_prompt_info
}
PROMPT='$(_my_theme_vcs_info) $'
```
You can find an example
[here](https://github.com/nasso/omzsh/blob/e439e494f22f4fd4ef1b6cb64626255f4b341c1b/themes/sunakayu.zsh-theme).
### Performance
Sometimes `jj` can be slower than `git`.
If you feel slowdowns, consider using the following:
```
zstyle :omz:plugins:jj ignore-working-copy yes
```
This will add `--ignore-working-copy` to all `jj` commands executed by your prompt. The downside here is that
your prompt might be out-of-sync until the next time `jj` gets a chance to _not_ ignore the working copy (i.e.
you manually run a `jj` command).
If you prefer to keep your prompt always up-to-date but still don't want to _feel_ the slowdown, you can make
your prompt asynchronous. This plugin doesn't do this automatically so you'd have to hack your theme a bit for
that.
## See Also
- [martinvonz/jj](https://github.com/martinvonz/jj)
## Contributors
- [nasso](https://github.com/nasso) - Plugin Author
- [imp](https://github.com/imp) - Occasional Alias Contributor

View File

@@ -1,71 +0,0 @@
# if jj is not found, don't do the rest of the script
if (( ! $+commands[jj] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `jj`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_jj" ]]; then
typeset -g -A _comps
autoload -Uz _jj
_comps[jj]=_jj
fi
COMPLETE=zsh jj >| "$ZSH_CACHE_DIR/completions/_jj" &|
function __jj_prompt_jj() {
local -a flags
flags=("--no-pager")
if zstyle -t ':omz:plugins:jj' ignore-working-copy; then
flags+=("--ignore-working-copy")
fi
command jj $flags "$@"
}
# convenience functions for themes
function jj_prompt_template_raw() {
__jj_prompt_jj log --no-graph -r @ -T "$@" 2> /dev/null
}
function jj_prompt_template() {
local out
out=$(jj_prompt_template_raw "$@") || return 1
echo "${out:gs/%/%%}"
}
# Aliases (sorted alphabetically)
alias jja='jj abandon'
alias jjb='jj bookmark'
alias jjbc='jj bookmark create'
alias jjbd='jj bookmark delete'
alias jjbf='jj bookmark forget'
alias jjbl='jj bookmark list'
alias jjbm='jj bookmark move'
alias jjbr='jj bookmark rename'
alias jjbs='jj bookmark set'
alias jjbt='jj bookmark track'
alias jjbu='jj bookmark untrack'
alias jjc='jj commit'
alias jjcmsg='jj commit --message'
alias jjd='jj diff'
alias jjdmsg='jj desc --message'
alias jjds='jj desc'
alias jje='jj edit'
alias jjgcl='jj git clone'
alias jjgf='jj git fetch'
alias jjgfa='jj git fetch --all-remotes'
alias jjgp='jj git push'
alias jjgpa='jj git push --all'
alias jjgpd='jj git push --deleted'
alias jjgpt='jj git push --tracked'
alias jjl='jj log'
alias jjla='jj log -r "all()"'
alias jjn='jj new'
alias jjnt='jj new "trunk()"'
alias jjrb='jj rebase'
alias jjrbm='jj rebase -d "trunk()"'
alias jjrs='jj restore'
alias jjrt='cd "$(jj root || echo .)"'
alias jjsp='jj split'
alias jjsq='jj squash'
alias jjst='jj status'

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,12 +0,0 @@
# kompose
This plugin provides completion for [kompose](https://github.com/kubernetes/kompose),
to migrate from docker compose to Kubernetes resource definitions.
To use it, add `kompose` to the plugins array in your zshrc file.
```
plugins=(... kompose)
```
**Author:** [@kevinkirkup](https://github.com/kevinkirkup)

View File

@@ -1,3 +0,0 @@
if [ $commands[kompose] ]; then
source <(kompose completion zsh)
fi

View File

@@ -1,201 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@@ -1,82 +1,49 @@
# kube-ps1: Kubernetes prompt for bash and zsh
![GitHub Release](https://img.shields.io/github/v/release/jonmosco/kube-ps1)
[![CI](https://github.com/jonmosco/kube-ps1/actions/workflows/ci.yml/badge.svg)](https://github.com/jonmosco/kube-ps1/actions/workflows/ci.yml)
A script that lets you add the current Kubernetes context and namespace
configured on `kubectl` to your Bash/Zsh prompt strings (i.e. the `$PS1`).
Inspired by several tools used to simplify usage of `kubectl`.
![prompt demo](img/kube-ps1-demo.gif)
## Installing
### Packages
### MacOS Brew Ports
### MacOS
Homebrew package manager:
```sh
brew update
brew install kube-ps1
```
### Arch Linux
AUR Package available at [https://aur.archlinux.org/packages/kube-ps1/](https://aur.archlinux.org/packages/kube-ps1/).
### Oh My Zsh
https://github.com/ohmyzsh/ohmyzsh
kube-ps1 is included as a plugin in the oh-my-zsh project. To enable it, edit your `~/.zshrc` and
add the plugin:
```bash
plugins=(
kube-ps1
)
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
$ brew update
$ brew install kube-ps1
```
## Zsh zinit plugin
### Using [zinit](https://github.com/zdharma-continuum/zinit)
Update `.zshrc` with:
```sh
zinit light jonmosco/kube-ps1
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
```
### Fig
Install `kube-ps1` in zsh, bash, or fish with one click.
<a href="https://fig.io/plugins/other/kube-ps1" target="_blank"><img src="https://fig.io/badges/install-with-fig.svg" width="120" /></a>
### From Source (git clone)
### From Source
1. Clone this repository
2. Source the kube-ps1.sh in your `~/.zshrc` or your `~/.bashrc`
#### Zsh
### Arch Linux
AUR Package available at [https://aur.archlinux.org/packages/kube-ps1/](https://aur.archlinux.org/packages/kube-ps1/).
#### Zsh
```sh
source /path/to/kube-ps1.sh
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
PROMPT='$(kube_ps1)'$PROMPT
```
#### Bash
```sh
source /path/to/kube-ps1.sh
PS1='[\u@\h \W $(kube_ps1)]\$ '
```
### Zsh Plugin Managers
#### Using [zplugin](https://github.com/zdharma/zplugin)
Update `.zshrc` with:
```sh
zplugin light jonmosco/kube-ps1
PROMPT='$(kube_ps1)'$PROMPT
```
## Requirements
The default prompt assumes you have the `kubectl` command line utility installed.
@@ -87,23 +54,22 @@ Official installation instructions and binaries are available:
If using this with OpenShift, the `oc` tool needs installed. It can be obtained
from brew ports:
```sh
```
brew install openshift-cli
```
or the source can be downloaded:
[OC Client Tools](https://github.com/okd-project/okd/releases)
[OC Client Tools](https://www.openshift.org/download.html)
Set the binary to `oc` with the following variable:
Set the binary to `oc` with the following environment variable:
```sh
```
KUBE_PS1_BINARY=oc
```
If neither binary is available, the prompt will print the following:
```sh
```
(<symbol>|BINARY-N/A:N/A)
```
@@ -124,13 +90,13 @@ tmux, and like the functionality provided by kube-ps1, checkout the
The default prompt layout is:
```sh
```
(<symbol>|<context>:<namespace>)
```
If the current-context is not set, kube-ps1 will return the following:
```sh
```
(<symbol>|N/A:N/A)
```
@@ -141,7 +107,7 @@ run `kubeoff`. To disable the prompt for all shell sessions, run `kubeoff -g`.
You can enable it again in the current shell by running `kubeon`, and globally
with `kubeon -g`.
```sh
```
kubeon : turn on kube-ps1 status for this shell. Takes precedence over
global setting for current session
kubeon -g : turn on kube-ps1 status globally
@@ -150,69 +116,39 @@ kubeoff : turn off kube-ps1 status for this shell. Takes precedence over
kubeoff -g : turn off kube-ps1 status globally
```
## Symbol
The default symbols are UTF8 and should work with most fonts. If you want to use the Kubernetes and OpenShift
glyphs, you need to install a patched font that contains the glyph. [Nerd Fonts](https://www.nerdfonts.com/) provides both glyphs. Follow their installation instructions to install the patched font.
`KUBE_PS1_SYMBOL_CUSTOM` options
| Options | Symbol | Description |
| ------------- | ------ | ----------- |
| default (empty string) | ⎈ | Default symbol (Unicode `\u2388`) |
| img | ☸️ | Symbol often used to represent Kubernetes (Unicode `\u2638`) |
| oc | ![openshift-glyph](img/openshift-glyph.png) | Symbol representing OpenShift (Unicode `\ue7b7`) |
| k8s | ![k8s-glyph](img/k8s-glyph.png) | Symbol representing Kubernetes (Unicode `\ue7b7`) |
To set the symbol to one of the custom glyphs, add the following to your `~/.bashrc` or `~/.zshrc`:
```sh
KUBE_PS1_SYMBOL_CUSTOM=img
```
To set the symbol to the default, set the `KUBE_PS1_SYMBOL` to an empty string.
Heres a demo of the symbols in action:
![kube-ps1-symbols](img/kube-ps1-symbol-demo.gif)
If the font is not properly installed, and the glyph is not available, it will display an empty set of brackets or similar:
```sh
echo -n "\ue7b7"
```
## Customization
The default settings can be overridden in `~/.bashrc` or `~/.zshrc` by setting
the following variables:
the following environment variables:
| Variable | Default | Meaning |
| :------- | :-----: | ------- |
| `KUBE_PS1_BINARY` | `kubectl` | Default Kubernetes binary |
| `KUBE_PS1_NS_ENABLE` | `true` | Display the namespace. If set to `false`, this will also disable `KUBE_PS1_DIVIDER` |
| `KUBE_PS1_PREFIX` | `(` | Prompt opening character |
| `KUBE_PS1_SYMBOL_ENABLE` | `true` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` |
| `KUBE_PS1_PREFIX` | `(` | Prompt opening character |
| `KUBE_PS1_SYMBOL_ENABLE` | `true ` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` |
| `KUBE_PS1_SYMBOL_PADDING` | `false` | Adds a space (padding) after the symbol to prevent clobbering prompt characters |
| `KUBE_PS1_SYMBOL_CUSTOM` | `⎈` | Change the Default prompt symbol. Unicode `\u2388`. Options are `k8s`, `img`, `oc` |
| `KUBE_PS1_SYMBOL_COLOR` | `blue` | Change the Default symbol color. |
| `KUBE_PS1_SYMBOL_DEFAULT` | `⎈ ` | Default prompt symbol. Unicode `\u2388` |
| `KUBE_PS1_SYMBOL_USE_IMG` | `false` | ☸️ , Unicode `\u2638` as the prompt symbol |
| `KUBE_PS1_SEPARATOR` | &#124; | Separator between symbol and context name |
| `KUBE_PS1_DIVIDER` | `:` | Separator between context and namespace |
| `KUBE_PS1_SUFFIX` | `)` | Prompt closing character |
| `KUBE_PS1_CLUSTER_FUNCTION` | No default, must be user supplied | Function to customize how cluster is displayed |
| `KUBE_PS1_NAMESPACE_FUNCTION` | No default, must be user supplied | Function to customize how namespace is displayed |
| `KUBE_PS1_CTX_COLOR_FUNCTION` | No default, must be user supplied | Function to customize context color based on context name |
| `KUBE_PS1_HIDE_IF_NOCONTEXT` | `false` | Hide the kube-ps1 prompt if no context is set |
| `KUBE_PS1_KUBECONFIG_SYMLINK` | `false` | Treat `KUBECONFIG` and `~/.kube/config` files as symbolic links |
For terminals that do not support UTF-8, the symbol will be replaced with the
string `k8s`.
To disable a feature, set it to an empty string:
```sh
```
KUBE_PS1_SEPARATOR=''
```
## Colors
The default colors are set with the following variables:
The default colors are set with the following environment variables:
| Variable | Default | Meaning |
| :------- | :-----: | ------- |
@@ -230,13 +166,13 @@ namespace.
Set the variable to an empty string if you do not want color for each
prompt section:
```sh
```
KUBE_PS1_CTX_COLOR=''
```
Names are usable for the following colors:
```text
```
black, red, green, yellow, blue, magenta, cyan
```
@@ -280,45 +216,6 @@ export KUBE_PS1_NAMESPACE_FUNCTION=get_namespace_upper
In both cases, the variable is set to the name of the function, and you must have defined the function in your shell configuration before kube_ps1 is called. The function must accept a single parameter and echo out the final value.
## Dynamic Context Colors
You can set different colors for different contexts using the
`KUBE_PS1_CTX_COLOR_FUNCTION` variable. This is useful for color-coding
contexts to make production environments stand out visually.
For example, to make production contexts red and development contexts green:
```sh
function kube_ps1_ctx_color() {
local context="$1"
case "$context" in
*prod*)
echo "red"
;;
*dev*)
echo "green"
;;
*staging*|*stg*)
echo "yellow"
;;
*)
echo "cyan" # default color for other contexts
;;
esac
}
export KUBE_PS1_CTX_COLOR_FUNCTION=kube_ps1_ctx_color
```
The function receives the context name as the first parameter and should echo
the desired color name. All color options supported by `KUBE_PS1_CTX_COLOR` are
available, including named colors (black, red, green, yellow, blue, magenta,
cyan, white) and 256-color codes (0-256).
If `KUBE_PS1_CTX_COLOR_FUNCTION` is not set, kube-ps1 will use the value of
`KUBE_PS1_CTX_COLOR` (default: red).
### Bug Reports and shell configuration
Due to the vast ways of customizing the shell, please try the prompt with a
@@ -327,28 +224,18 @@ minimal configuration before submitting a bug report.
This can be done as follows for each shell before loading kube-ps1:
Bash:
```sh
```bash
bash --norc
```
Zsh:
```sh
```bash
zsh -f
or
zsh --no-rcs
```
For the prompt symbol, a patched font that contains the glyphs must be installed.
[Nerd Fonts Downloads](https://www.nerdfonts.com/font-downloads) provides patched
fonts containing the glyphs. Please consult their documentation for this, support
is out of scope for this project.
## Contributors
### Contributors
Thank you to everyone in the community for their contributions to kube-ps1!
<a href="https://github.com/jonmosco/kube-ps1/graphs/contributors">
<img src="https://contrib.rocks/image?repo=jonmosco/kube-ps1" />
</a>
* [Ahmet Alp Balkan](https://github.com/ahmetb)
* Jared Yanovich

View File

@@ -3,7 +3,7 @@
# Kubernetes prompt helper for bash/zsh
# Displays current context and namespace
# Copyright 2026 Jon Mosco
# Copyright 2021 Jon Mosco
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -24,9 +24,9 @@
# Override these values in ~/.zshrc or ~/.bashrc
KUBE_PS1_BINARY="${KUBE_PS1_BINARY:-kubectl}"
KUBE_PS1_SYMBOL_ENABLE="${KUBE_PS1_SYMBOL_ENABLE:-true}"
KUBE_PS1_SYMBOL_DEFAULT=${KUBE_PS1_SYMBOL_DEFAULT:-$'\u2388'}
KUBE_PS1_SYMBOL_PADDING="${KUBE_PS1_SYMBOL_PADDING:-false}"
KUBE_PS1_SYMBOL_COLOR="${KUBE_PS1_SYMBOL_COLOR:-}"
KUBE_PS1_SYMBOL_USE_IMG="${KUBE_PS1_SYMBOL_USE_IMG:-false}"
KUBE_PS1_NS_ENABLE="${KUBE_PS1_NS_ENABLE:-true}"
KUBE_PS1_CONTEXT_ENABLE="${KUBE_PS1_CONTEXT_ENABLE:-true}"
KUBE_PS1_PREFIX="${KUBE_PS1_PREFIX-(}"
@@ -34,28 +34,29 @@ KUBE_PS1_SEPARATOR="${KUBE_PS1_SEPARATOR-|}"
KUBE_PS1_DIVIDER="${KUBE_PS1_DIVIDER-:}"
KUBE_PS1_SUFFIX="${KUBE_PS1_SUFFIX-)}"
KUBE_PS1_HIDE_IF_NOCONTEXT="${KUBE_PS1_HIDE_IF_NOCONTEXT:-false}"
KUBE_PS1_SYMBOL_COLOR="${KUBE_PS1_SYMBOL_COLOR-blue}"
KUBE_PS1_CTX_COLOR="${KUBE_PS1_CTX_COLOR-red}"
KUBE_PS1_NS_COLOR="${KUBE_PS1_NS_COLOR-cyan}"
KUBE_PS1_BG_COLOR="${KUBE_PS1_BG_COLOR}"
_KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}"
_KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled"
_KUBE_PS1_LAST_TIME=0
KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}"
KUBE_PS1_KUBECONFIG_SYMLINK="${KUBE_PS1_KUBECONFIG_SYMLINK:-false}"
KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled"
KUBE_PS1_LAST_TIME=0
KUBE_PS1_CLUSTER_FUNCTION="${KUBE_PS1_CLUSTER_FUNCTION}"
KUBE_PS1_NAMESPACE_FUNCTION="${KUBE_PS1_NAMESPACE_FUNCTION}"
# Determine our shell
_kube_ps1_shell_type() {
local _KUBE_PS1_SHELL_TYPE
if [ "${ZSH_VERSION-}" ]; then
_KUBE_PS1_SHELL_TYPE="zsh"
elif [ "${BASH_VERSION-}" ]; then
_KUBE_PS1_SHELL_TYPE="bash"
fi
echo $_KUBE_PS1_SHELL_TYPE
}
if [ "${ZSH_VERSION-}" ]; then
KUBE_PS1_SHELL="zsh"
elif [ "${BASH_VERSION-}" ]; then
KUBE_PS1_SHELL="bash"
fi
_kube_ps1_init() {
[[ -f "${_KUBE_PS1_DISABLE_PATH}" ]] && KUBE_PS1_ENABLED=off
[[ -f "${KUBE_PS1_DISABLE_PATH}" ]] && KUBE_PS1_ENABLED=off
case "$(_kube_ps1_shell_type)" in
case "${KUBE_PS1_SHELL}" in
"zsh")
_KUBE_PS1_OPEN_ESC="%{"
_KUBE_PS1_CLOSE_ESC="%}"
@@ -63,7 +64,7 @@ _kube_ps1_init() {
_KUBE_PS1_DEFAULT_FG="%f"
setopt PROMPT_SUBST
autoload -U add-zsh-hook
add-zsh-hook precmd _kube_ps1_prompt_update
add-zsh-hook precmd _kube_ps1_update_cache
zmodload -F zsh/stat b:zstat
zmodload zsh/datetime
;;
@@ -72,75 +73,75 @@ _kube_ps1_init() {
_KUBE_PS1_CLOSE_ESC=$'\002'
_KUBE_PS1_DEFAULT_BG=$'\033[49m'
_KUBE_PS1_DEFAULT_FG=$'\033[39m'
[[ $PROMPT_COMMAND =~ _kube_ps1_prompt_update ]] || PROMPT_COMMAND="_kube_ps1_prompt_update;${PROMPT_COMMAND:-:}"
[[ $PROMPT_COMMAND =~ _kube_ps1_update_cache ]] || PROMPT_COMMAND="_kube_ps1_update_cache;${PROMPT_COMMAND:-:}"
;;
esac
}
_kube_ps1_color_fg() {
local _KUBE_PS1_FG_CODE
local KUBE_PS1_FG_CODE
case "${1}" in
black) _KUBE_PS1_FG_CODE=0;;
red) _KUBE_PS1_FG_CODE=1;;
green) _KUBE_PS1_FG_CODE=2;;
yellow) _KUBE_PS1_FG_CODE=3;;
blue) _KUBE_PS1_FG_CODE=4;;
magenta) _KUBE_PS1_FG_CODE=5;;
cyan) _KUBE_PS1_FG_CODE=6;;
white) _KUBE_PS1_FG_CODE=7;;
black) KUBE_PS1_FG_CODE=0;;
red) KUBE_PS1_FG_CODE=1;;
green) KUBE_PS1_FG_CODE=2;;
yellow) KUBE_PS1_FG_CODE=3;;
blue) KUBE_PS1_FG_CODE=4;;
magenta) KUBE_PS1_FG_CODE=5;;
cyan) KUBE_PS1_FG_CODE=6;;
white) KUBE_PS1_FG_CODE=7;;
# 256
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) _KUBE_PS1_FG_CODE="${1}";;
*) _KUBE_PS1_FG_CODE=default
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) KUBE_PS1_FG_CODE="${1}";;
*) KUBE_PS1_FG_CODE=default
esac
if [[ "${_KUBE_PS1_FG_CODE}" == "default" ]]; then
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
if [[ "${KUBE_PS1_FG_CODE}" == "default" ]]; then
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
return
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
_KUBE_PS1_FG_CODE="%F{$_KUBE_PS1_FG_CODE}"
elif [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
KUBE_PS1_FG_CODE="%F{$KUBE_PS1_FG_CODE}"
elif [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
if tput setaf 1 &> /dev/null; then
_KUBE_PS1_FG_CODE="$(tput setaf "${_KUBE_PS1_FG_CODE}")"
elif [[ $_KUBE_PS1_FG_CODE -ge 0 ]] && [[ $_KUBE_PS1_FG_CODE -le 256 ]]; then
_KUBE_PS1_FG_CODE="\033[38;5;${_KUBE_PS1_FG_CODE}m"
KUBE_PS1_FG_CODE="$(tput setaf ${KUBE_PS1_FG_CODE})"
elif [[ $KUBE_PS1_FG_CODE -ge 0 ]] && [[ $KUBE_PS1_FG_CODE -le 256 ]]; then
KUBE_PS1_FG_CODE="\033[38;5;${KUBE_PS1_FG_CODE}m"
else
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
fi
fi
echo "${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_FG_CODE}${_KUBE_PS1_CLOSE_ESC}"
echo ${_KUBE_PS1_OPEN_ESC}${KUBE_PS1_FG_CODE}${_KUBE_PS1_CLOSE_ESC}
}
_kube_ps1_color_bg() {
local _KUBE_PS1_BG_CODE
local KUBE_PS1_BG_CODE
case "${1}" in
black) _KUBE_PS1_BG_CODE=0;;
red) _KUBE_PS1_BG_CODE=1;;
green) _KUBE_PS1_BG_CODE=2;;
yellow) _KUBE_PS1_BG_CODE=3;;
blue) _KUBE_PS1_BG_CODE=4;;
magenta) _KUBE_PS1_BG_CODE=5;;
cyan) _KUBE_PS1_BG_CODE=6;;
white) _KUBE_PS1_BG_CODE=7;;
black) KUBE_PS1_BG_CODE=0;;
red) KUBE_PS1_BG_CODE=1;;
green) KUBE_PS1_BG_CODE=2;;
yellow) KUBE_PS1_BG_CODE=3;;
blue) KUBE_PS1_BG_CODE=4;;
magenta) KUBE_PS1_BG_CODE=5;;
cyan) KUBE_PS1_BG_CODE=6;;
white) KUBE_PS1_BG_CODE=7;;
# 256
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) _KUBE_PS1_BG_CODE="${1}";;
*) _KUBE_PS1_BG_CODE=$'\033[0m';;
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) KUBE_PS1_BG_CODE="${1}";;
*) KUBE_PS1_BG_CODE=$'\033[0m';;
esac
if [[ "${_KUBE_PS1_BG_CODE}" == "default" ]]; then
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_BG}"
if [[ "${KUBE_PS1_BG_CODE}" == "default" ]]; then
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_BG}"
return
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
_KUBE_PS1_BG_CODE="%K{$_KUBE_PS1_BG_CODE}"
elif [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
KUBE_PS1_BG_CODE="%K{$KUBE_PS1_BG_CODE}"
elif [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
if tput setaf 1 &> /dev/null; then
_KUBE_PS1_BG_CODE="$(tput setab "${_KUBE_PS1_BG_CODE}")"
elif [[ $_KUBE_PS1_BG_CODE -ge 0 ]] && [[ $_KUBE_PS1_BG_CODE -le 256 ]]; then
_KUBE_PS1_BG_CODE="\033[48;5;${_KUBE_PS1_BG_CODE}m"
KUBE_PS1_BG_CODE="$(tput setab ${KUBE_PS1_BG_CODE})"
elif [[ $KUBE_PS1_BG_CODE -ge 0 ]] && [[ $KUBE_PS1_BG_CODE -le 256 ]]; then
KUBE_PS1_BG_CODE="\033[48;5;${KUBE_PS1_BG_CODE}m"
else
_KUBE_PS1_BG_CODE="${DEFAULT_BG}"
KUBE_PS1_BG_CODE="${DEFAULT_BG}"
fi
fi
echo "${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_BG_CODE}${_KUBE_PS1_CLOSE_ESC}"
echo ${OPEN_ESC}${KUBE_PS1_BG_CODE}${CLOSE_ESC}
}
_kube_ps1_binary_check() {
@@ -148,60 +149,38 @@ _kube_ps1_binary_check() {
}
_kube_ps1_symbol() {
# Exit early if symbol display is disabled
[[ "${KUBE_PS1_SYMBOL_ENABLE}" == false ]] && return
local symbol_arg="${KUBE_PS1_SYMBOL_CUSTOM}"
local symbol=""
local symbol_default=$'\u2388'
local symbol_img="☸️"
local k8s_glyph=$'\Uf10fe'
local k8s_symbol_color=blue
local oc_glyph=$'\ue7b7'
local oc_symbol_color=red
local custom_symbol_color="${KUBE_PS1_SYMBOL_COLOR:-$k8s_symbol_color}"
# Choose the symbol based on the provided argument or environment variable
case "${symbol_arg}" in
"img")
symbol="${symbol_img}"
;;
"k8s")
symbol="$(_kube_ps1_color_fg "${custom_symbol_color}")${k8s_glyph}${KUBE_PS1_RESET_COLOR}"
;;
"oc")
symbol="$(_kube_ps1_color_fg ${oc_symbol_color})${oc_glyph}${KUBE_PS1_RESET_COLOR}"
case "${KUBE_PS1_SHELL}" in
bash)
if ((BASH_VERSINFO[0] >= 4)) && [[ $'\u2388' != "\\u2388" ]]; then
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}"
KUBE_PS1_SYMBOL_IMG=$'\u2638\ufe0f'
else
KUBE_PS1_SYMBOL=$'\xE2\x8E\x88'
KUBE_PS1_SYMBOL_IMG=$'\xE2\x98\xB8'
fi
;;
zsh)
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}"
KUBE_PS1_SYMBOL_IMG="\u2638";;
*)
case "$(_kube_ps1_shell_type)" in
bash)
if ((BASH_VERSINFO[0] >= 4)) && [[ $'\u2388' != "\\u2388" ]]; then
symbol="$(_kube_ps1_color_fg $custom_symbol_color)${symbol_default}${KUBE_PS1_RESET_COLOR}"
symbol_img=$'\u2638\ufe0f'
else
symbol=$'\xE2\x8E\x88'
symbol_img=$'\xE2\x98\xB8'
fi
;;
zsh)
symbol="$(_kube_ps1_color_fg $custom_symbol_color)${symbol_default}${KUBE_PS1_RESET_COLOR}"
symbol_img="☸️"
;;
*)
symbol="k8s"
esac
KUBE_PS1_SYMBOL="k8s"
esac
# Append padding if enabled
if [[ "${KUBE_PS1_SYMBOL_PADDING}" == true ]]; then
echo "${symbol} "
else
echo "${symbol}"
if [[ "${KUBE_PS1_SYMBOL_USE_IMG}" == true ]]; then
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_IMG}"
fi
if [[ "${KUBE_PS1_SYMBOL_PADDING}" == true ]]; then
echo "${KUBE_PS1_SYMBOL} "
else
echo "${KUBE_PS1_SYMBOL}"
fi
}
_kube_ps1_split_config() {
_kube_ps1_split() {
type setopt >/dev/null 2>&1 && setopt SH_WORD_SPLIT
local IFS=$1
echo $2
@@ -212,21 +191,32 @@ _kube_ps1_file_newer_than() {
local file=$1
local check_time=$2
if [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
# Use zstat '-F %s.%s' to make it compatible with low zsh version (eg: 5.0.2)
mtime=$(zstat -L +mtime -F %s.%s "${file}")
elif stat -c "%s" /dev/null &> /dev/null; then
# GNU stat
mtime=$(stat -L -c %Y "${file}")
if [[ "${KUBE_PS1_KUBECONFIG_SYMLINK}" == "true" ]]; then
if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
mtime=$(zstat -L +mtime "${file}")
elif stat -c "%s" /dev/null &> /dev/null; then
# GNU stat
mtime=$(stat -c %Y "${file}")
else
# BSD stat
mtime=$(stat -f %m "$file")
fi
else
# BSD stat
mtime=$(stat -L -f %m "$file")
if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
mtime=$(zstat +mtime "${file}")
elif stat -c "%s" /dev/null &> /dev/null; then
# GNU stat
mtime=$(stat -L -c %Y "${file}")
else
# BSD stat
mtime=$(stat -L -f %m "$file")
fi
fi
[[ "${mtime}" -gt "${check_time}" ]]
}
_kube_ps1_prompt_update() {
_kube_ps1_update_cache() {
local return_code=$?
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return $return_code
@@ -235,35 +225,27 @@ _kube_ps1_prompt_update() {
# No ability to fetch context/namespace; display N/A.
KUBE_PS1_CONTEXT="BINARY-N/A"
KUBE_PS1_NAMESPACE="N/A"
return $return_code
return
fi
if [[ "${KUBECONFIG}" != "${_KUBE_PS1_KUBECONFIG_CACHE}" ]]; then
if [[ "${KUBECONFIG}" != "${KUBE_PS1_KUBECONFIG_CACHE}" ]]; then
# User changed KUBECONFIG; unconditionally refetch.
_KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG}
KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG}
_kube_ps1_get_context_ns
return $return_code
return
fi
# kubectl will read the environment variable $KUBECONFIG
# otherwise set it to ~/.kube/config
local conf
local config_file_cache
for conf in $(_kube_ps1_split_config : "${KUBECONFIG:-${HOME}/.kube/config}"); do
for conf in $(_kube_ps1_split : "${KUBECONFIG:-${HOME}/.kube/config}"); do
[[ -r "${conf}" ]] || continue
config_file_cache+=":${conf}"
if _kube_ps1_file_newer_than "${conf}" "${_KUBE_PS1_LAST_TIME}"; then
if _kube_ps1_file_newer_than "${conf}" "${KUBE_PS1_LAST_TIME}"; then
_kube_ps1_get_context_ns
return $return_code
return
fi
done
if [[ "${config_file_cache}" != "${_KUBE_PS1_CFGFILES_READ_CACHE}" ]]; then
_kube_ps1_get_context_ns
return $return_code
fi
return $return_code
}
@@ -273,8 +255,8 @@ _kube_ps1_get_context() {
# Set namespace to 'N/A' if it is not defined
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
if [[ -n "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
KUBE_PS1_CONTEXT="$("${KUBE_PS1_CLUSTER_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
if [[ ! -z "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
KUBE_PS1_CONTEXT=$($KUBE_PS1_CLUSTER_FUNCTION $KUBE_PS1_CONTEXT)
fi
fi
}
@@ -282,36 +264,27 @@ _kube_ps1_get_context() {
_kube_ps1_get_ns() {
if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then
KUBE_PS1_NAMESPACE="$(${KUBE_PS1_BINARY} config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)"
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-N/A}"
# Set namespace to 'default' if it is not defined
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-default}"
if [[ -n "${KUBE_PS1_NAMESPACE_FUNCTION}" ]]; then
KUBE_PS1_NAMESPACE="$("${KUBE_PS1_NAMESPACE_FUNCTION}" "${KUBE_PS1_NAMESPACE}")"
if [[ ! -z "${KUBE_PS1_NAMESPACE_FUNCTION}" ]]; then
KUBE_PS1_NAMESPACE=$($KUBE_PS1_NAMESPACE_FUNCTION $KUBE_PS1_NAMESPACE)
fi
fi
}
_kube_ps1_get_context_ns() {
# Set the command time
if [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
if [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
if ((BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 2)); then
_KUBE_PS1_LAST_TIME=$(printf '%(%s)T')
KUBE_PS1_LAST_TIME=$(printf '%(%s)T')
else
_KUBE_PS1_LAST_TIME=$(date +%s)
KUBE_PS1_LAST_TIME=$(date +%s)
fi
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
_KUBE_PS1_LAST_TIME=$EPOCHREALTIME
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
KUBE_PS1_LAST_TIME=$EPOCHSECONDS
fi
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-N/A}"
# Cache which cfgfiles we can read in case they change.
local conf
_KUBE_PS1_CFGFILES_READ_CACHE=
for conf in $(_kube_ps1_split_config : "${KUBECONFIG:-${HOME}/.kube/config}"); do
[[ -r $conf ]] && _KUBE_PS1_CFGFILES_READ_CACHE+=":$conf"
done
_kube_ps1_get_context
_kube_ps1_get_ns
}
@@ -325,7 +298,7 @@ Toggle kube-ps1 prompt on
Usage: kubeon [-g | --global] [-h | --help]
With no arguments, turn oon kube-ps1 status for this shell instance (default).
With no arguments, turn off kube-ps1 status for this shell instance (default).
-g --global turn on kube-ps1 status globally
-h --help print this message
@@ -349,7 +322,7 @@ kubeon() {
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
_kubeon_usage
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
rm -f -- "${_KUBE_PS1_DISABLE_PATH}"
rm -f -- "${KUBE_PS1_DISABLE_PATH}"
elif [[ "$#" -ne 0 ]]; then
echo -e "error: unrecognized flag ${1}\\n"
_kubeon_usage
@@ -363,8 +336,8 @@ kubeoff() {
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
_kubeoff_usage
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
mkdir -p -- "$(dirname "${_KUBE_PS1_DISABLE_PATH}")"
touch -- "${_KUBE_PS1_DISABLE_PATH}"
mkdir -p -- "$(dirname "${KUBE_PS1_DISABLE_PATH}")"
touch -- "${KUBE_PS1_DISABLE_PATH}"
elif [[ $# -ne 0 ]]; then
echo "error: unrecognized flag ${1}" >&2
_kubeoff_usage
@@ -378,29 +351,22 @@ kubeoff() {
kube_ps1() {
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return
[[ -z "${KUBE_PS1_CONTEXT}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]] && return
[[ "${KUBE_PS1_CONTEXT}" == "N/A" ]] && [[ ${KUBE_PS1_HIDE_IF_NOCONTEXT} == true ]] && return
local KUBE_PS1
local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}"
# If background color is set, reset color should also reset the background
if [[ -n "${KUBE_PS1_BG_COLOR}" ]]; then
KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_DEFAULT_BG}${_KUBE_PS1_CLOSE_ESC}"
fi
# Background Color
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")"
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg ${KUBE_PS1_BG_COLOR})"
# Prefix
if [[ -z "${KUBE_PS1_PREFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_PREFIX}" ]]; then
KUBE_PS1+="${KUBE_PS1_PREFIX}"
else
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_PREFIX_COLOR}")${KUBE_PS1_PREFIX}${KUBE_PS1_RESET_COLOR}"
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_PREFIX_COLOR)${KUBE_PS1_PREFIX}${KUBE_PS1_RESET_COLOR}"
fi
# Symbol
KUBE_PS1+="$(_kube_ps1_symbol)"
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_SYMBOL_COLOR)$(_kube_ps1_symbol)${KUBE_PS1_RESET_COLOR}"
if [[ -n "${KUBE_PS1_SEPARATOR}" ]] && [[ "${KUBE_PS1_SYMBOL_ENABLE}" == true ]]; then
KUBE_PS1+="${KUBE_PS1_SEPARATOR}"
@@ -408,14 +374,7 @@ kube_ps1() {
# Context
if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
local ctx_color="${KUBE_PS1_CTX_COLOR:-red}"
# Allow custom function to override color based on context
if [[ -n "${KUBE_PS1_CTX_COLOR_FUNCTION}" ]]; then
ctx_color="$("${KUBE_PS1_CTX_COLOR_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
fi
KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_CTX_COLOR)${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
fi
# Namespace
@@ -423,14 +382,14 @@ kube_ps1() {
if [[ -n "${KUBE_PS1_DIVIDER}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
KUBE_PS1+="${KUBE_PS1_DIVIDER}"
fi
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_NS_COLOR:-cyan}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
KUBE_PS1+="$(_kube_ps1_color_fg ${KUBE_PS1_NS_COLOR})${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
fi
# Suffix
if [[ -z "${KUBE_PS1_SUFFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_SUFFIX}" ]]; then
KUBE_PS1+="${KUBE_PS1_SUFFIX}"
else
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_SUFFIX_COLOR}")${KUBE_PS1_SUFFIX}${KUBE_PS1_RESET_COLOR}"
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_SUFFIX_COLOR)${KUBE_PS1_SUFFIX}${KUBE_PS1_RESET_COLOR}"
fi
# Close Background color if defined

View File

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

View File

@@ -21,9 +21,6 @@ alias kca='_kca(){ kubectl "$@" --all-namespaces; unset -f _kca; }; _kca'
# Apply a YML file
alias kaf='kubectl apply -f'
# Apply a kustomization directory
alias kapk='kubectl apply -k'
# Drop into an interactive terminal on a container
alias keti='kubectl exec -t -i'
@@ -39,9 +36,6 @@ alias kcgc='kubectl config get-contexts'
# General aliases
alias kdel='kubectl delete'
alias kdelf='kubectl delete -f'
alias kdelk='kubectl delete -k'
alias kge='kubectl get events --sort-by=".lastTimestamp"'
alias kgew='kubectl get events --sort-by=".lastTimestamp" --watch'
# Pod management.
alias kgp='kubectl get pods'
@@ -102,7 +96,6 @@ alias kdd='kubectl describe deployment'
alias kdeld='kubectl delete deployment'
alias ksd='kubectl scale deployment'
alias krsd='kubectl rollout status deployment'
alias krrd='kubectl rollout restart deployment'
function kres(){
kubectl set env $@ REFRESHED_AT=$(date +%Y%m%d%H%M%S)
@@ -125,7 +118,6 @@ alias kdss='kubectl describe statefulset'
alias kdelss='kubectl delete statefulset'
alias ksss='kubectl scale statefulset'
alias krsss='kubectl rollout status statefulset'
alias krrss='kubectl rollout restart statefulset'
# Port forwarding
alias kpf="kubectl port-forward"

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,5 @@
# Default commands
: ${MAGIC_ENTER_GIT_COMMAND:="git status -u ."} # run when in a git repository
: ${MAGIC_ENTER_JJ_COMMAND:="jj st --no-pager ."} # run when in a jj repository
: ${MAGIC_ENTER_OTHER_COMMAND:="ls -lh ."} # run anywhere else
magic-enter() {
@@ -10,10 +9,7 @@ magic-enter() {
return
fi
# needs to be before git to handle colocated repositories
if (( $+commands[jj] )) && command jj st >/dev/null 2>&1; then
BUFFER="$MAGIC_ENTER_JJ_COMMAND"
elif (( $+commands[git] )) && command git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
if command git rev-parse --is-inside-work-tree &>/dev/null; then
BUFFER="$MAGIC_ENTER_GIT_COMMAND"
else
BUFFER="$MAGIC_ENTER_OTHER_COMMAND"

View File

@@ -1,17 +1,27 @@
# TODO: 2024-01-03 remove rtx support
local __mise=mise
if (( ! $+commands[mise] )); then
return
if (( $+commands[rtx] )); then
__mise=rtx
else
return
fi
fi
# Load mise hooks
eval "$(mise activate zsh)"
eval "$($__mise activate zsh)"
# Hook mise into current environment
eval "$($__mise hook-env -s zsh)"
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `mise`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_mise" ]]; then
if [[ ! -f "$ZSH_CACHE_DIR/completions/_$__mise" ]]; then
typeset -g -A _comps
autoload -Uz _mise
_comps[mise]=_mise
autoload -Uz _$__mise
_comps[$__mise]=_$__mise
fi
# Generate and load mise completion
mise completion zsh >| "$ZSH_CACHE_DIR/completions/_mise" &|
$__mise completion zsh >| "$ZSH_CACHE_DIR/completions/_$__mise" &|
unset __mise

View File

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

View File

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

View File

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

View File

@@ -1,52 +0,0 @@
# NestJS Plugin for Oh My Zsh
This plugin provides aliases for common [NestJS CLI](https://docs.nestjs.com/cli/overview) commands.
## Requirements
- [NestJS CLI](https://docs.nestjs.com/cli/overview#installation) installed globally:
`npm install -g @nestjs/cli`
## Aliases
| Alias | Command | Description |
| :------ | :--------------------------- | :------------------------------------------ |
| `nnew` | `nest new` | Create a new NestJS project |
| `nb` | `nest build` | Build the NestJS application |
| `ns` | `nest start` | Start the application |
| `nsw` | `nest start --watch` | Start the application in watch mode |
| `nsd` | `nest start --dev` | Start the application in dev mode |
| `nsdbg` | `nest start --debug --watch` | Start the application in debug & watch mode |
| `ng` | `nest generate` | Generate a NestJS element |
| `ngm` | `nest generate module` | Generate a module |
| `ngc` | `nest generate controller` | Generate a controller |
| `ngs` | `nest generate service` | Generate a service |
| `ngg` | `nest generate guard` | Generate a guard |
| `ngp` | `nest generate pipe` | Generate a pipe |
| `ngf` | `nest generate filter` | Generate a filter |
| `ngr` | `nest generate resolver` | Generate a GraphQL resolver |
| `ngcl` | `nest generate class` | Generate a class |
| `ngi` | `nest generate interface` | Generate an interface |
| `ngit` | `nest generate interceptor` | Generate an interceptor |
| `ngmi` | `nest generate middleware` | Generate a middleware |
| `ngd` | `nest generate decorator` | Generate a custom decorator |
| `ngres` | `nest generate resource` | Generate a CRUD resource |
| `nglib` | `nest generate library` | Generate a new library |
| `ngsub` | `nest generate sub-app` | Generate a new sub-application (monorepo) |
| `na` | `nest add` | Add a library to the project |
| `ni` | `nest info` | Display NestJS project information |
| `nu` | `nest update` | Update NestJS dependencies |
## Usage
1. Add `nestjs` to the `plugins` array in your `~/.zshrc` file:
```zsh
plugins=(... nestjs)
```
2. Restart your terminal or source your `~/.zshrc` file:
```zsh
source ~/.zshrc
```

View File

@@ -1,41 +0,0 @@
# Oh My Zsh plugin for NestJS CLI
# Check if nest command exists
if ! command -v nest &>/dev/null; then
return
fi
# Project creation
alias nnew='nest new'
# Basic development
alias nb='nest build'
alias ns='nest start'
alias nsw='nest start --watch'
alias nsd='nest start --dev' # Alias for start --watch
alias nsdbg='nest start --debug --watch'
# Code generation (short aliases)
alias ng='nest generate'
alias ngm='nest generate module'
alias ngc='nest generate controller'
alias ngs='nest generate service'
alias ngg='nest generate guard'
alias ngp='nest generate pipe'
alias ngf='nest generate filter'
alias ngr='nest generate resolver'
alias ngcl='nest generate class'
alias ngi='nest generate interface'
alias ngit='nest generate interceptor'
alias ngmi='nest generate middleware'
alias ngd='nest generate decorator'
alias ngres='nest generate resource'
alias nglib='nest generate library'
alias ngsub='nest generate sub-app'
# Other commands
alias na='nest add'
alias ni='nest info'
alias nu='nest update'
# You can add more aliases or functions here as needed.

View File

@@ -19,7 +19,7 @@ plugins=(... opentofu)
|--------|------------------------------|
| `tt` | `tofu` |
| `tta` | `tofu apply` |
| `tta!` | `tofu apply -auto-approve` |
| `ttaa` | `tofu apply -auto-approve` |
| `ttc` | `tofu console` |
| `ttd` | `tofu destroy` |
| `ttd!` | `tofu destroy -auto-approve` |

View File

@@ -29,7 +29,7 @@ function tofu_version_prompt_info() {
alias tt='tofu'
alias tta='tofu apply'
alias tta!='tofu apply -auto-approve'
alias ttaa='tofu apply -auto-approve'
alias ttc='tofu console'
alias ttd='tofu destroy'
alias ttd!='tofu destroy -auto-approve'

View File

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

View File

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

View File

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

View File

@@ -1,41 +0,0 @@
# Pulumi
This is an **Oh My Zsh plugin** for the [**Pulumi CLI**](https://www.pulumi.com/docs/iac/cli/),
an Infrastructure as Code (IaC) tool for building, deploying and managing cloud infrastucture.
This plugin provides:
- 🚀 Short, intuitive aliases for common Pulumi commands
- 🎯 Auto-completion support for Pulumi
To use it, add `pulumi` to the plugins array in your `.zshrc` file:
```zsh
plugins=(... pulumi)
```
## ⚡ Aliases
| Alias | Command | Description |
| -------- | ---------------------- | ----------------------------- |
| `pul` | `pulumi` | Shortcut for Pulumi CLI |
| `pulcs` | `pulumi config set` | Set Pulumi configuration |
| `puld` | `pulumi destroy` | Destroy all resources |
| `pullog` | `pulumi logs -f` | Tail Pulumi logs in real-time |
| `pulp` | `pulumi preview` | Show planned changes |
| `pulr` | `pulumi refresh` | Refresh state from cloud |
| `puls` | `pulumi stack` | Show stack details |
| `pulsh` | `pulumi stack history` | Show stack history |
| `pulsi` | `pulumi stack init` | Initialize a new stack |
| `pulsl` | `pulumi stack ls` | List available stacks |
| `pulso` | `pulumi stack output` | Show stack outputs |
| `pulss` | `pulumi stack select` | Switch stack |
| `pulu` | `pulumi up` | Deploy infrastructure |
## 🎯 Autocompletion
If `pulumi gen-completion zsh` is available, this plugin **automatically loads Pulumi auto-completion**.
## 🛠️ Contribution
Feel free to open an issue or PR for improvements! 🚀

View File

@@ -1,28 +0,0 @@
if (( ! $+commands[pulumi] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `pulumi`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_pulumi" ]]; then
typeset -g -A _comps
autoload -Uz _pulumi
_comps[pulumi]=_pulumi
fi
pulumi gen-completion zsh >| "$ZSH_CACHE_DIR/completions/_pulumi" &|
# Aliases
alias pul='pulumi'
alias pulcs='pulumi config set'
alias puld='pulumi destroy'
alias pullog='pulumi logs -f'
alias pulp='pulumi preview'
alias pulr='pulumi refresh'
alias puls='pulumi stack'
alias pulsh='pulumi stack history'
alias pulsi='pulumi stack init'
alias pulsl='pulumi stack ls'
alias pulso='pulumi stack output'
alias pulss='pulumi stack select'
alias pulu='pulumi up'

View File

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

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