Merge branch 'ohmyzsh:master' into rbenv-add-completion

This commit is contained in:
Masafumi Koba 2026-04-14 15:26:11 +09:00 committed by GitHub
commit aeabedd85d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
192 changed files with 5040 additions and 1488 deletions

6
.github/FUNDING.yml vendored
View file

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

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

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

View file

@ -7,6 +7,7 @@
- [ ] I have read the contribution guide and followed all the instructions. - [ ] I have read the contribution guide and followed all the instructions.
- [ ] The code follows the code style guide detailed in the wiki. - [ ] The code follows the code style guide detailed in the wiki.
- [ ] The code is mine or it's from somewhere with an MIT-compatible license. - [ ] The code is mine or it's from somewhere with an MIT-compatible license.
- [ ] If I used AI tools (ChatGPT, Claude, Gemini, etc.) to assist with this contribution, I've disclosed it below.
- [ ] The code is efficient, to the best of my ability, and does not waste computer resources. - [ ] The code is efficient, to the best of my ability, and does not waste computer resources.
- [ ] The code is stable and I have tested it myself, to the best of my abilities. - [ ] The code is stable and I have tested it myself, to the best of my abilities.
- [ ] If the code introduces new aliases, I provide a valid use case for all plugin users down below. - [ ] If the code introduces new aliases, I provide a valid use case for all plugin users down below.

View file

@ -2,22 +2,24 @@ dependencies:
plugins/gitfast: plugins/gitfast:
repo: felipec/git-completion repo: felipec/git-completion
branch: master branch: master
version: tag:v2.1 version: tag:v2.2
postcopy: | postcopy: |
set -e set -e
rm -rf git-completion.plugin.zsh Makefile README.adoc t tools rm -rf git-completion.plugin.zsh Makefile t tools
test -e git-completion.zsh && mv -f git-completion.zsh _git mv README.adoc MANUAL.adoc
mv -f src/* .
rmdir src
plugins/gradle: plugins/gradle:
repo: gradle/gradle-completion repo: gradle/gradle-completion
branch: master branch: master
version: 25da917cf5a88f3e58f05be3868a7b2748c8afe6 version: dd3a8adb47e51b1f6e4dc180cb04bd02d5fccd4a
precopy: | precopy: |
set -e set -e
find . ! -name _gradle ! -name LICENSE -delete find . ! -name _gradle ! -name LICENSE -delete
plugins/history-substring-search: plugins/history-substring-search:
repo: zsh-users/zsh-history-substring-search repo: zsh-users/zsh-history-substring-search
branch: master branch: master
version: 87ce96b1862928d84b1afe7c173316614b30e301 version: 14c8d2e0ffaee98f2df9850b19944f32546fdea5
precopy: | precopy: |
set -e set -e
rm -f zsh-history-substring-search.plugin.zsh rm -f zsh-history-substring-search.plugin.zsh
@ -25,10 +27,18 @@ dependencies:
postcopy: | postcopy: |
set -e set -e
test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md
plugins/kube-ps1:
repo: jonmosco/kube-ps1
branch: master
version: e19c9ee867c5655814c384a6bf543e330e6ef1b7
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: plugins/wd:
repo: mfaerevaag/wd repo: mfaerevaag/wd
branch: master branch: master
version: tag:v0.9.2 version: tag:v0.10.1
precopy: | precopy: |
set -e set -e
rm -r test rm -r test
@ -36,7 +46,7 @@ dependencies:
plugins/z: plugins/z:
branch: master branch: master
repo: agkozak/zsh-z repo: agkozak/zsh-z
version: dd94ef04acc41748ba171eb219971cb455e0040b version: cf9225feebfae55e557e103e95ce20eca5eff270
precopy: | precopy: |
set -e set -e
test -e README.md && mv -f README.md MANUAL.md test -e README.md && mv -f README.md MANUAL.md

View file

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

View file

@ -1,7 +1,7 @@
certifi==2024.12.14 certifi==2026.2.25
charset-normalizer==3.4.1 charset-normalizer==3.4.7
idna==3.10 idna==3.11
PyYAML==6.0.2 PyYAML==6.0.3
requests==2.32.3 requests==2.33.1
semver==3.0.2 semver==3.0.4
urllib3==2.3.0 urllib3==2.6.3

View file

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

View file

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

View file

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

View file

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

65
.github/workflows/scorecard.yml vendored Normal file
View file

@ -0,0 +1,65 @@
# 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@f808768d1510423e83855289c910610ca9b43176 # v2.17.0
with:
egress-policy: audit
- name: "Checkout code"
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
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@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: SARIF file
path: results.sarif
retention-days: 5
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with:
sarif_file: results.sarif

9
.gitignore vendored
View file

@ -4,9 +4,18 @@ custom/
# temp files directories # temp files directories
cache/ cache/
log/ log/
# Vim swap/backup files
*.swp *.swp
*.swo
# macOS system files
.DS_Store .DS_Store
# editor configs # editor configs
.vscode .vscode
.idea .idea
# zcompile cached files
*.zwc
*.zwc.old

5
.gitpod.Dockerfile vendored
View file

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

View file

@ -1,9 +0,0 @@
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

@ -20,6 +20,7 @@ you would make is not already covered.
- [Getting started](#getting-started) - [Getting started](#getting-started)
- [You have a solution](#you-have-a-solution) - [You have a solution](#you-have-a-solution)
- [You have an addition](#you-have-an-addition) - [You have an addition](#you-have-an-addition)
- [A note on AI-assisted contributions](#a-note-on-ai-assisted-contributions)
- [Use the Search, Luke](#use-the-search-luke) - [Use the Search, Luke](#use-the-search-luke)
- [Commit Guidelines](#commit-guidelines) - [Commit Guidelines](#commit-guidelines)
- [Format](#format) - [Format](#format)
@ -125,6 +126,30 @@ Because of this, from now on, we require that new aliases follow these condition
This list is not exhaustive! Please remember that your alias will be in the machines of many people, This list is not exhaustive! Please remember that your alias will be in the machines of many people,
so it should be justified why they should have it. so it should be justified why they should have it.
## A note on AI-assisted contributions
We'll admit it: AI tools can be pretty helpful for coding tasks, and we're not here to gatekeep how you get your work done. We use these tools ourselves! 🤖
But here's the thing—Oh My Zsh is maintained by a small team of volunteers who do this in their spare time. We already have hundreds of pending PRs, and we want to make sure we're spending our limited time effectively.
If you used AI tools meaningfully in your contribution (code generation, agentic coding assistants, etc.), please mention it in your PR description. Basic autocomplete doesn't count, but if an AI wrote substantial parts of your code, just let us know.
**Examples of good disclosure:**
- "Used ChatGPT to help generate the initial regex pattern for parsing git status output"
- "Claude assisted with writing the unit tests for this feature"
- "Generated with Gemini and then reviewed/tested manually"
- Or simply: "AI-assisted" in your PR description
Here's what we're looking for:
- **You understand your code**: You should be able to explain what your contribution does and how it works. We want to collaborate with humans who are invested in the project.
- **Context matters**: Tell us what problem you're solving, how you tested it, and link to relevant docs. Small, incremental changes work better than massive generated overhauls.
- **Quality over quantity**: We'd rather have one thoughtful, well-tested contribution than ten AI-generated PRs that need extensive review.
The disclosure helps us know how much guidance to offer. If we're just reviewing AI output that you can't explain or improve, that changes the dynamic—and frankly, it's not a great use of anyone's time.
As always, we reserve the right to decline any contribution. PRs that appear to be unreviewed AI output, or code the contributor can't explain, may be closed without extensive feedback.
---- ----
## Use the Search, Luke ## Use the Search, Luke

View file

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

View file

@ -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). 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) [![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) [![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) [![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh)
[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh) [![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh)
[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
<details> <details>
<summary>Table of Contents</summary> <summary>Table of Contents</summary>
@ -46,7 +46,7 @@ Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
- [Manual Installation](#manual-installation) - [Manual Installation](#manual-installation)
- [Installation Problems](#installation-problems) - [Installation Problems](#installation-problems)
- [Custom Plugins And Themes](#custom-plugins-and-themes) - [Custom Plugins And Themes](#custom-plugins-and-themes)
- [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems) - [Enable GNU ls In macOS And FreeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems)
- [Skip Aliases](#skip-aliases) - [Skip Aliases](#skip-aliases)
- [Async git prompt](#async-git-prompt) - [Async git prompt](#async-git-prompt)
- [Getting Updates](#getting-updates) - [Getting Updates](#getting-updates)
@ -70,7 +70,7 @@ Twitter), and join us on [Discord](https://discord.gg/ohmyzsh).
| O/S | Status | | O/S | Status |
| :------------- | :----: | | :------------- | :----: |
| Android | ✅ | | Android | ✅ |
| freeBSD | ✅ | | FreeBSD | ✅ |
| LCARS | 🛸 | | LCARS | 🛸 |
| Linux | ✅ | | Linux | ✅ |
| macOS | ✅ | | macOS | ✅ |
@ -163,7 +163,7 @@ adds any) and extra goodies that are included in that particular plugin.
### Themes ### Themes
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme-happy. We have over one
hundred and fifty themes now bundled. Most of them have hundred and fifty themes now bundled. Most of them have
[screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!).
Check them out! Check them out!
@ -218,7 +218,7 @@ terminal window.
ZSH_THEME="random" # (...please let it be pie... please be some pie..) ZSH_THEME="random" # (...please let it be pie... please be some pie..)
``` ```
And if you want to pick random theme from a list of your favorite themes: And if you want to pick a random theme from a list of your favorite themes:
```sh ```sh
ZSH_THEME_RANDOM_CANDIDATES=( ZSH_THEME_RANDOM_CANDIDATES=(
@ -349,7 +349,7 @@ If you have many functions that go well together, you can put them as a `XYZ.plu
If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the
same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`. same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`.
### Enable GNU ls In macOS And freeBSD Systems ### Enable GNU ls In macOS And FreeBSD Systems
<a name="enable-gnu-ls"></a> <a name="enable-gnu-ls"></a>
@ -426,7 +426,7 @@ turn it off by setting the following in your .zshrc file, before Oh My Zsh is so
zstyle ':omz:alpha:lib:git' async-prompt no zstyle ':omz:alpha:lib:git' async-prompt no
``` ```
If your problem is that the git prompt just stopped appearing, you can try to force it setting the following If your problem is that the git prompt just stopped appearing, you can try to force it by setting the following
configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your
case. case.
@ -487,6 +487,17 @@ wait a week?) you just need to run:
omz update omz update
``` ```
> [!NOTE]
> If you want to automate this process in a script, you should call directly the `upgrade` script, like this:
>
> ```sh
> $ZSH/tools/upgrade.sh
> ```
>
> See more options in the [FAQ: How do I update Oh My Zsh?](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#how-do-i-update-oh-my-zsh).
>
> **USE OF `omz update --unattended` HAS BEEN REMOVED, AS IT HAS SIDE EFFECTS**.
Magic! 🎉 Magic! 🎉
## Uninstalling Oh My Zsh ## Uninstalling Oh My Zsh
@ -537,7 +548,7 @@ We're on social media:
## Merchandise ## Merchandise
We have We have
[stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github) [stickers, shirts, and coffee mugs available](https://commitgoods.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! for you to show off your love of Oh My Zsh. Again, you will become the talk of the town!
## License ## 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. # This API is subject to change and optimization. Rely on it at your own risk.
function _omz_register_handler { function _omz_register_handler {
setopt localoptions noksharrays setopt localoptions noksharrays unset
typeset -ga _omz_async_functions typeset -ga _omz_async_functions
# we want to do nothing if there's no $1 function or we already set it up # we want to do nothing if there's no $1 function or we already set it up
if [[ -z "$1" ]] || (( ! ${+functions[$1]} )) \ if [[ -z "$1" ]] || (( ! ${+functions[$1]} )) \
@ -44,6 +44,7 @@ function _omz_register_handler {
# Set up async handlers and callbacks # Set up async handlers and callbacks
function _omz_async_request { function _omz_async_request {
setopt localoptions noksharrays unset
local -i ret=$? local -i ret=$?
typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT typeset -gA _OMZ_ASYNC_FDS _OMZ_ASYNC_PIDS _OMZ_ASYNC_OUTPUT

View file

@ -1,6 +1,7 @@
#!/usr/bin/env zsh #!/usr/bin/env zsh
function omz { function omz {
setopt localoptions noksharrays
[[ $# -gt 0 ]] || { [[ $# -gt 0 ]] || {
_omz::help _omz::help
return 1 return 1
@ -27,6 +28,7 @@ function _omz {
'plugin:Manage plugins' 'plugin:Manage plugins'
'pr:Manage Oh My Zsh Pull Requests' 'pr:Manage Oh My Zsh Pull Requests'
'reload:Reload the current zsh session' 'reload:Reload the current zsh session'
'shop:Open the Oh My Zsh shop'
'theme:Manage themes' 'theme:Manage themes'
'update:Update Oh My Zsh' 'update:Update Oh My Zsh'
'version:Show the version' 'version:Show the version'
@ -71,6 +73,10 @@ function _omz {
local -aU plugins local -aU plugins
plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t)) plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
_describe 'plugin' plugins ;; _describe 'plugin' plugins ;;
plugin::list)
local -a opts
opts=('--enabled:List enabled plugins only')
_describe -o 'options' opts ;;
theme::(set|use)) theme::(set|use))
local -aU themes local -aU themes
themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::)) themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
@ -168,6 +174,7 @@ Available commands:
plugin <command> Manage plugins plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests pr <command> Manage Oh My Zsh Pull Requests
reload Reload the current zsh session reload Reload the current zsh session
shop Open the Oh My Zsh shop
theme <command> Manage themes theme <command> Manage themes
update Update Oh My Zsh update Update Oh My Zsh
version Show the version version Show the version
@ -192,7 +199,7 @@ EOF
return 1 return 1
fi fi
"$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format" ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
} }
function _omz::plugin { function _omz::plugin {
@ -205,7 +212,7 @@ Available commands:
disable <plugin> Disable plugin(s) disable <plugin> Disable plugin(s)
enable <plugin> Enable plugin(s) enable <plugin> Enable plugin(s)
info <plugin> Get information of a plugin info <plugin> Get information of a plugin
list List all available Oh My Zsh plugins list [--enabled] List Oh My Zsh plugins
load <plugin> Load plugin(s) load <plugin> Load plugin(s)
EOF EOF
@ -448,8 +455,21 @@ function _omz::plugin::info {
function _omz::plugin::list { function _omz::plugin::list {
local -a custom_plugins builtin_plugins local -a custom_plugins builtin_plugins
# 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)) custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
builtin_plugins=("$ZSH"/plugins/*(-/N:t)) builtin_plugins=("$ZSH"/plugins/*(-/N:t))
fi
# If the command is being piped, print all found line by line # If the command is being piped, print all found line by line
if [[ ! -t 1 ]]; then if [[ ! -t 1 ]]; then
@ -603,10 +623,48 @@ function _omz::pr::test {
done done
(( $found )) || { (( $found )) || {
_omz::log error "could not found the ohmyzsh git remote. Aborting..." _omz::log error "could not find the ohmyzsh git remote. Aborting..."
return 1 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 # Fetch pull request head
_omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..." _omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..."
command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || { command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || {
@ -665,6 +723,15 @@ 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 { function _omz::reload {
# Delete current completion cache # Delete current completion cache
command rm -f $_comp_dumpfile $ZSH_COMPDUMP command rm -f $_comp_dumpfile $ZSH_COMPDUMP
@ -822,6 +889,13 @@ function _omz::update {
return 1 return 1
} }
# Check if --unattended was passed
[[ "$1" != --unattended ]] || {
_omz::log error "the \`\e[2m--unattended\e[0m\` flag is no longer supported, use the \`\e[2mupgrade.sh\e[0m\` script instead."
_omz::log error "for more information see https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#how-do-i-update-oh-my-zsh"
return 1
}
local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null) local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)
[[ $? -eq 0 ]] || { [[ $? -eq 0 ]] || {
_omz::log error "\`$ZSH\` is not a git directory. Aborting..." _omz::log error "\`$ZSH\` is not a git directory. Aborting..."
@ -830,11 +904,7 @@ function _omz::update {
# Run update script # Run update script
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
if [[ "$1" != --unattended ]]; then
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $? ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
else
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -v $verbose_mode || return $?
fi
# Update last updated file # Update last updated file
zmodload zsh/datetime zmodload zsh/datetime
@ -843,7 +913,7 @@ function _omz::update {
command rm -rf "$ZSH/log/update.lock" command rm -rf "$ZSH/log/update.lock"
# Restart the zsh session if there were changes # Restart the zsh session if there were changes
if [[ "$1" != --unattended && "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then if [[ "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
# Old zsh versions don't have ZSH_ARGZERO # Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}" local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# Check whether to run a login shell # Check whether to run a login shell

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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 '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark
bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls bindkey -s '\el' '^q 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 '^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 bindkey ' ' magic-space # [Space] - don't do history expansion
# Edit the current command line in $EDITOR # Edit the current command line in $VISUAL (or $EDITOR / `vi` if not set)
autoload -U edit-command-line autoload -U edit-command-line
zle -N edit-command-line zle -N edit-command-line
bindkey '\C-x\C-e' edit-command-line bindkey '\C-x\C-e' edit-command-line

View file

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

View file

@ -40,9 +40,9 @@ if [[ -z "$LS_COLORS" ]]; then
fi fi
function test-ls-args { function test-ls-args {
local cmd="$1" # ls, gls, colorls, ... # Usage: test-ls-args cmd args...
local args="${@[2,-1]}" # arguments except the first one # e.g. test-ls-args gls --color
command "$cmd" "$args" /dev/null &>/dev/null command "$@" /dev/null &>/dev/null
} }
# Find the option for using colors in ls, depending on the version # Find the option for using colors in ls, depending on the version

View file

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

View file

@ -6,14 +6,4 @@ function _opswd() {
[[ -z "$services" ]] || compadd -a -- services [[ -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 "$@" _opswd "$@"

View file

@ -46,45 +46,4 @@ function opswd() {
(sleep 20 && clipcopy </dev/null 2>/dev/null) &! (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 "$@" opswd "$@"

View file

@ -11,6 +11,8 @@ plugins=(... alias-finder)
To enable it for every single command, set zstyle in your `~/.zshrc`. To enable it for every single command, set zstyle in your `~/.zshrc`.
If the user has installed `rg`([ripgrep](https://github.com/BurntSushi/ripgrep)), it will be used because it's faster. Otherwise, it will use the `grep` command.
```zsh ```zsh
# ~/.zshrc # ~/.zshrc

View file

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

View file

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

View file

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

View file

@ -1,30 +1,15 @@
# Find where asdf should be installed (( ! $+commands[asdf] )) && return
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
ASDF_COMPLETIONS="$ASDF_DIR/completions"
if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/_asdf" ]]; then export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
# 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 # Add shims to the front of the path, removing if already present.
if [[ -f "$ASDF_DIR/asdf.sh" ]]; then path=("$ASDF_DATA_DIR/shims" ${path:#$ASDF_DATA_DIR/shims})
source "$ASDF_DIR/asdf.sh"
# Load completions # If the completion file doesn't exist yet, we need to autoload it and
if [[ -f "$ASDF_COMPLETIONS/_asdf" ]]; then # bind it to `asdf`. Otherwise, compinit will have already done that.
fpath+=("$ASDF_COMPLETIONS") if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
typeset -g -A _comps
autoload -Uz _asdf autoload -Uz _asdf
compdef _asdf asdf # compdef is already loaded before loading plugins _comps[asdf]=_asdf
fi
fi fi
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|

View file

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

View file

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

View file

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

View file

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

View file

@ -22,6 +22,7 @@ the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environmen
| Alias | Command | Description | | Alias | Command | Description |
| -------- | --------------------------------------- | --------------------------------------------------------------------- | | -------- | --------------------------------------- | --------------------------------------------------------------------- |
| `ba` | `brew autoremove` | Uninstall unnecessary formulae. | | `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. | | `bci` | `brew info --cask` | Display information about the given cask. |
| `bcin` | `brew install --cask` | Install the given cask. | | `bcin` | `brew install --cask` | Install the given cask. |
| `bcl` | `brew list --cask` | List installed casks. | | `bcl` | `brew list --cask` | List installed casks. |
@ -31,13 +32,18 @@ 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. | | `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. | | `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. |
| `bcup` | `brew upgrade --cask` | Upgrade all 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). | | `bfu` | `brew upgrade --formula` | Upgrade only formulae (not casks). |
| `bi` | `brew install` | Install a formula. | | `bi` | `brew install` | Install a formula. |
| `bih` | `brew install --HEAD` | Install a formula with --HEAD |
| `bl` | `brew list` | List all installed formulae. | | `bl` | `brew list` | List all installed formulae. |
| `bo` | `brew outdated` | List installed formulae that have an updated version available. | | `bo` | `brew outdated` | List installed formulae that have an updated version available. |
| `br` | `brew reinstall` | Reinstall a formula. |
| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. | | `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. | | `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. | | `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. |
| `brh` | `brew reinstall --HEAD` | Reinstall a formula with --HEAD |
| `bs` | `brew search` | Perform a substring search of cask tokens and formula names for text. |
| `bsl` | `brew services list` | List all running services. | | `bsl` | `brew services list` | List all running services. |
| `bsoff` | `brew services stop` | Stop the service and unregister it from launching at login (or boot). | | `bsoff` | `brew services stop` | Stop the service and unregister it from launching at login (or boot). |
| `bsoffa` | `bsoff --all` | Stop all started services. | | `bsoffa` | `bsoff --all` | Stop all started services. |

View file

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

View file

@ -12,12 +12,12 @@ plugins=(... bundler)
## Aliases ## Aliases
| Alias | Command | Description | | Alias | Command | Description |
|--------|--------------------------------------|------------------------------------------------------------------------------------------| | ------ | ----------------- | -------------------------------------------------------- |
| `ba` | `bundle add` | Add gem to the Gemfile and run bundle install | | `ba` | `bundle add` | Add gem to the Gemfile and run bundle install |
| `bck` | `bundle check` | Verifies if dependencies are satisfied by installed gems | | `bck` | `bundle check` | Verifies if dependencies are satisfied by installed gems |
| `bcn` | `bundle clean` | Cleans up unused gems in your bundler directory | | `bcn` | `bundle clean` | Cleans up unused gems in your bundler directory |
| `be` | `bundle exec` | Execute a command in the context of the bundle | | `be` | `bundle exec` | Execute a command in the context of the bundle |
| `bi` | `bundle install --jobs=<core_count>` | Install the dependencies specified in your Gemfile (using all cores in bundler >= 1.4.0) | | `bi` | `bundle install` | Install the dependencies specified in your Gemfile |
| `bl` | `bundle list` | List all the gems in the bundle | | `bl` | `bundle list` | List all the gems in the bundle |
| `bo` | `bundle open` | Opens the source directory for a gem in your bundle | | `bo` | `bundle open` | Opens the source directory for a gem in your bundle |
| `bout` | `bundle outdated` | List installed gems with newer versions available | | `bout` | `bundle outdated` | List installed gems with newer versions available |

View file

@ -4,45 +4,13 @@ alias ba="bundle add"
alias bck="bundle check" alias bck="bundle check"
alias bcn="bundle clean" alias bcn="bundle clean"
alias be="bundle exec" alias be="bundle exec"
alias bi="bundle_install" alias bi="bundle install"
alias bl="bundle list" alias bl="bundle list"
alias bo="bundle open" alias bo="bundle open"
alias bout="bundle outdated" alias bout="bundle outdated"
alias bp="bundle package" alias bp="bundle package"
alias bu="bundle update" alias bu="bundle update"
## Functions
bundle_install() {
# Bail out if bundler is not installed
if (( ! $+commands[bundle] )); then
echo "Bundler is not installed"
return 1
fi
# Bail out if not in a bundled project
if ! _within-bundled-project; then
echo "Can't 'bundle install' outside a bundled project"
return 1
fi
# Check the bundler version is at least 1.4.0
autoload -Uz is-at-least
local bundler_version=$(bundle version | cut -d' ' -f3)
if ! is-at-least 1.4.0 "$bundler_version"; then
bundle install "$@"
return $?
fi
# If bundler is at least 1.4.0, use all the CPU cores to bundle install
if [[ "$OSTYPE" = (darwin|freebsd)* ]]; then
local cores_num="$(sysctl -n hw.ncpu)"
else
local cores_num="$(nproc)"
fi
BUNDLE_JOBS="$cores_num" bundle install "$@"
}
## Gem wrapper ## Gem wrapper
bundled_commands=( bundled_commands=(

View file

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

View file

@ -36,3 +36,10 @@ Last login: Fri Jan 30 23:12:26 on ttys001
- `cowsay` if using `chuck_cow` - `cowsay` if using `chuck_cow`
Available via homebrew, apt, ... Available via homebrew, apt, ...
> [!NOTE]
> In addition to installing `fortune`, it may be necessary to run:
>
> `strfile $ZSH/plugins/chucknorris/fortunes/chucknorris\n`
>
> (include the "\n" literally) to write the fortune data to the proper directory.

View file

@ -43,7 +43,7 @@ function colored() {
environment+=( PATH="${__colored_man_pages_dir}:$PATH" ) environment+=( PATH="${__colored_man_pages_dir}:$PATH" )
fi fi
command env $environment "$@" command env "${environment[@]}" "$@"
} }
# Colorize man and dman/debman (from debian-goodies) # Colorize man and dman/debman (from debian-goodies)

View file

@ -22,14 +22,15 @@ Try: sudo apt install <selected package>
It works out of the box with the command-not-found packages for: It works out of the box with the command-not-found packages for:
- [Ubuntu](https://www.porcheron.info/command-not-found-for-zsh/) - [Ubuntu](https://launchpad.net/ubuntu/+source/command-not-found)
- [Debian](https://packages.debian.org/search?keywords=command-not-found) - [Debian](https://packages.debian.org/search?keywords=command-not-found)
- [Arch Linux](https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found) - [Arch Linux](https://wiki.archlinux.org/title/Zsh#pkgfile_"command_not_found"_handler)
- [macOS (Homebrew)](https://github.com/Homebrew/homebrew-command-not-found) - [macOS (Homebrew)](https://github.com/Homebrew/brew/blob/main/docs/Command-Not-Found.md)
- [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound) - [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound)
- [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found) - [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found)
- [Termux](https://github.com/termux/command-not-found) - [Termux](https://github.com/termux/command-not-found)
- [SUSE](https://www.unix.com/man-page/suse/1/command-not-found/) - [SUSE](https://www.unix.com/man-page/suse/1/command-not-found/)
- [Gentoo](https://github.com/AndrewAmmerlaan/command-not-found-gentoo/tree/main) - [Gentoo](https://github.com/AndrewAmmerlaan/command-not-found-gentoo/tree/main)
- [Void Linux](https://codeberg.org/classabbyamp/xbps-command-not-found)
You can add support for other platforms by submitting a Pull Request. You can add support for other platforms by submitting a Pull Request.

View file

@ -1,9 +1,15 @@
## Platforms with a built-in command-not-found handler init file ## Platforms with a built-in command-not-found handler init file
for file ( for file (
# Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found # Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/title/Zsh#pkgfile_"command_not_found"_handler
/usr/share/doc/pkgfile/command-not-found.zsh /usr/share/doc/pkgfile/command-not-found.zsh
# Homebrew: https://github.com/Homebrew/homebrew-command-not-found # Void Linux: https://codeberg.org/classabbyamp/xbps-command-not-found
/usr/share/zsh/plugins/xbps-command-not-found/xbps-command-not-found.zsh
# Homebrew: https://github.com/Homebrew/brew/blob/main/docs/Command-Not-Found.md
/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 /opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/usr/local/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 /home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh

View file

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

View file

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

View file

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

View file

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

View file

@ -1,5 +1,8 @@
# Don't continue if direnv is not found # If direnv is not found, don't continue and print a warning
command -v direnv &>/dev/null || return if (( ! $+commands[direnv] )); then
echo "Warning: direnv not found. Please install direnv and ensure it's in your PATH before using this plugin."
return
fi
_direnv_hook() { _direnv_hook() {
trap -- '' SIGINT; trap -- '' SIGINT;

View file

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

View file

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

570
plugins/dnf/_dnf5 Normal file
View file

@ -0,0 +1,570 @@
#compdef dnf5
# based on dnf-5.2.6.2
# utility functions
_dnf5_helper() {
_call_program specs $service "${(q-)@}" "${(q-)PREFIX}\*" \
-qC --assumeno --nogpgcheck 2>/dev/null </dev/null
}
_dnf5_repositories() {
# required option: -T (all|disabled|enabled)
local selected expl
zparseopts -D -E - T:=selected
selected=$selected[2]
_wanted $selected-repositories expl "$selected repository" \
compadd "$@" - "${(@)${(f)$(_dnf5_helper repo list --$selected)}[2,-1]%% *}"
}
_dnf5_packages() {
# required option: -T (all|available|installed|upgradable)
local selected opt expl
zparseopts -D -E - T:=selected
selected=$selected[2]
case $selected in
all) opt='' ;; # option --all does not exist
upgradable) opt='--upgrades' ;;
*) opt="--$selected" ;;
esac
_wanted $selected-packages expl "$selected package" \
compadd "$@" - $(_dnf5_helper repoquery $opt --qf='%{name} ')
}
_dnf5_rpm_files() {
local expl
_wanted rpm-files expl 'rpm file' _files -g '(#i)*.rpm(-.)'
}
_dnf5_packages_or_rpms() {
if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
_dnf5_rpm_files
else
_dnf5_packages "$@"
fi
}
_dnf5_groups() {
# optional option: -T (available|installed)
local update_policy selected line pat groups
zparseopts -D -E - T:=selected
selected=$selected[2]
if [[ -z $selected ]]; then
selected=all
opt= # option --all does not exist
else
opt=--$selected
fi
# XXX hidden groups are not included
for line in ${${(f)"$(_dnf5_helper group list $opt)"}[2,-1]}; do
line=( ${(z)line} )
groups+=( "$line[1]:$line[2,-2]" )
done
_describe -t $selected-groups "$selected group" groups
}
_dnf5_environments() {
local line envs
for line in ${${(f)"$(_dnf5_helper environment list)"}[2,-1]}; do
line=( ${(z)line} )
envs+=( "$line[1]:$line[2,-2]" )
done
_describe -t environments 'environment' envs
}
# completers for (several) dnf commands
_dnf5-advisory () {
_arguments : \
$advisory_opts \
'--contains-pkgs=[only show advisories containing specified packages]: : _sequence _dnf5_packages -T installed' \
+ '(with)' \
'--with-cve[show only advisories referencing CVE ticket]' \
'--with-bz[show only advisories referencing Bugzilla ticket]' \
+ '(type)' \
'--all[show all advisories]' \
'--available[show advisories containing newer versions of installed packages (default)]' \
'--installed[show advisories containing equal and older version of installed packages]' \
'--updates[show advisories containing upgradable packages]' \
+ args \
':subcommand:(list info summary)' '*:advisory spec:'
}
_dnf5-group() {
local -a tmp
if (( CURRENT == 2 )); then
tmp=(
'list:list all matching groups'
'info:print detailed information about groups'
'install:install packages from specified groups'
'remove:remove removable packages in specified groups'
'upgrade:upgrade specified groups and packages in them'
)
_describe -t subcommands 'subcommand' tmp
else
case $words[2] in
list|info)
tmp=(
'(--installed)--available[show only available groups]'
'(--available)--installed[show only installed groups]'
'--hidden[show also hidden groups]'
'--contains-pkgs=[show only groups containing specified packages]: : _sequence _dnf5_packages -T all'
'*: : _dnf5_groups'
)
;;
install)
tmp=( $common_opts
'--with-optional[include optional packages from the groups]'
'*: : _dnf5_groups -T available' )
;|
upgrade)
tmp=( ${common_opts:#--skip-broken*}
'*: : _dnf5_groups -T installed' )
;|
remove)
tmp=( $offline_opts
'*: : _dnf5_groups -T installed' )
;|
install|remove)
tmp+=( '--no-packages[operate on groups only, not manipulate any packages]' )
;|
install|upgrade)
tmp+=( $downgrade_opts )
;;
esac
_arguments : $tmp
fi
}
_dnf5-history() {
local -a tmp
if (( CURRENT == 2 )); then
tmp=(
'list:list info about recorded transactions'
'info:print detailed about specific transactions'
'undo:revert all actions from the specified transaction'
'redo:repeat the specified transaction'
'rollback:undo all transactions performed after the specified transaction'
'store:store the transaction into a directory'
)
_describe -t subcommands 'subcommand' tmp
else
case $words[2] in
list|info)
tmp=( '--reverse[reverse the order of transactions in output]' )
;;
undo|rollback|redo)
tmp=( '--skip-unavailable[allow skipping impossible actions]' )
;|
undo|rollback)
tmp+=( $replay_opts )
;;
store)
tmp=( {-o,--output=}'[directory for storing the transaction (default ./transaction)]: : _directories')
esac
_arguments : $tmp '2:transaction:( )'
fi
}
_dnf5-mark() {
local -a tmp
if (( CURRENT == 2 )); then
tmp=(
'user:mark the package as user-installed'
'dependency:mark the package as a dependency'
'weak:mark the package as a weak dependency'
'group:mark the package as installed by the specified group'
)
_describe -t subcommands 'subcommand' tmp
else
tmp=(
'--skip-unavailable[skip packages not installed on the system]'
'--store=[store the transaction in specified directory]: : _directories'
)
if [[ $words[2] = group ]]; then
tmp+=( '2:group-id: _dnf5_groups -T installed' )
fi
_arguments : $tmp '*: : _dnf5_packages -T installed'
fi
}
_dnf5-module() {
local -a tmp
if (( CURRENT == 2 )); then
tmp=(
'list:list module streams'
'info:print details about module streams'
'enable:enable module streams'
'disable:disable modules including all their streams'
"reset:reset module state so it's no longer enabled or disabled"
)
_describe -t subcommands 'subcommand' tmp
elif (( CURRENT == 3 )) && [[ $cur = -* ]]; then
case $words[2] in
list|info) tmp=( --enabled --disabled ) ;;
enable) tmp=( --skip-broken --skip-unavailable ) ;;
*) tmp=( --skip-unavailable ) ;;
esac
_wanted options expl 'option' compadd -a tmp
else
_message 'module spec'
fi
}
_dnf5-offline() { # also used by the 'system-upgrade' command
local -a tmp
if (( CURRENT == 2 )); then
tmp=(
'clean:remove any stored offline transactions and cached packages'
'log:list boots during which offline transaction was attempted'
'reboot:prepare the system for offline transaction and reboot'
)
if [[ $cmd = offline ]]; then
tmp+=( 'status:show status of the current offline transaction' )
else
tmp+=( 'download:download all packages needed for upgrade' )
fi
_describe -t subcommands 'subcommand' tmp && ret=0
else
case $words[2] in
download)
_arguments : \
'--releasever=[the version to upgrade to]:version number:' \
'--no-downgrade:do not install packages older than currently installed' '*: :' && ret=0
;;
log)
_arguments : \
'--number=[show log of transaction specified by number]:transaction number:' '*: :' && ret=0
;;
reboot)
_wanted options expl 'option' compadd -- --poweroff && ret=0
;;
esac
fi
}
_dnf5-repoquery() {
local v
local -a opts=(
$advisory_opts
'--arch=[limit results to specified architectures]:list of archs: '
'--available[limit results to available packages]'
'--disable-modular-filtering[include packages of inactive module streams]'
'--duplicates[limit to installed duplicate packages]'
'--exactdeps[limit to packages that require capability specified by ==what{requires,depends}]'
'--extras[limit to installed packages that are not present in any available repository]'
'--file=[limit results to packages which own specified file]:list of files: _sequence _files'
'--installed[query installed packages]'
'--installonly[limit to installed installonly packages]'
'--latest-limit=[limit to latest packages of specified number]:number:'
'--leaves[limit to groups of installed packages not required by other installed packages]'
'--providers-of=[select packages that provide specified attribute]:attribute:(conflicts depends enhances obsoletes provides recommends requires requires_pre suggests supplement)'
'--recent[limit to only recently changed packages]'
'--recursive[make --whatrequires/--providers-of work recursively]'
'--security[limit to packages in security advisories]'
'--srpm[use the corresponding source RPM]'
'--unneeded[limit to unneeded installed packages]'
'--upgrades[limit to available packages that provide upgrade for installed packages]'
'--userinstalled[limit to packages that are not installed as dependencies]'
'--whatdepends=[limit to packages that require, enhance, recommend, suggest of supplement specified capability]:list of capability:'
'--whatconflicts=[limit to packages that conflicts with specified capabilities]:list of capability: '
)
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
opts+=(
+ '(format)'
'--conflicts[display capabilities that the package conflicts with]'
'--depends[display capabilities that the package depends on, enables, recommends, suggests or supplements]'
'--files[show files in the package]'
'--requires-pre[display capabilities required to run pre/post scripts of the package]'
'--sourcerpm[display source RPM of the package]'
'--location[display location of the package]'
'--info[show detailed information about the package]'
'--changelogs[print the package changelogs]'
'(- *)--querytags[list tags recognized by --queryformat]'
'--queryformat=[specify output format]:format:'
)
for v in enhance obsolete provide recommend require suggest supplement; do
opts+=( "--${v}s[display capabilities ${v}ed by the package]" )
done
_arguments : '*: : _dnf5_packages -T all' $opts
}
# dnf commands
_dnf5_commands() {
local -a dnf_cmds=(
'advisory:manage advisories'
'autoremove:remove unneeded packages'
'check:check for problems in package database'
'check-upgrade:check for available package upgrades'
'clean:remove or invalidate cached data'
'distro-sync:up/downgrade installed packages to the latest available'
'downgrade:downgrade packages'
'download:download packages'
'environment:manage comps environments'
'group:manage comps groups'
'history:manage transaction history'
'info:provide detailed information about packages'
'install:install packages'
'leaves:list groups of leaf packages'
'list:list installed or available packages'
'makecache:generate the metadata cache'
'mark:change the reason of an installed package'
'module:manage modules'
'offline:manage offline transactions'
'provides:find what package provides the given value'
'reinstall:reinstall packages'
'remove:remove packages'
'replay:replay stored transactions'
'repo:manage repositories'
'repoquery:search for packages in repositories'
'search:search for packages using keywords'
'swap:remove software and install another in the single transaction'
'system-upgrade:upgrade the system to a new major release'
'upgrade:upgrade packages'
'versionlock:protect packages from updates to newer versions'
)
_describe -t dnf-commands 'dnf command' dnf_cmds
}
# subcommands and options
_dnf5_subcmds_opts() {
local cur=$words[CURRENT] cmd=$words[1] expl ret=1
local -a tmp
# common options
local -a offline_opts=(
'(--store)--offline[store the transaction to be performed offline]'
'(--offline)--store=[store the transaction in specified directory]: : _directories'
)
local -a common_opts=(
$offline_opts
'--allowerasing[allow erasing of installed packages]'
'--skip-broken[resolve dependency problems by skipping problematic packages]'
"--skip-unavailable[skip packages that can't be synchronized]"
'--downloadonly[download packages without executing transaction]'
)
local -a advisory_opts=(
'--advisories=[consider only specified advisories]:list of advisories:'
'--advisory-severities=[limit to advisories with specified severity]:severity:_sequence compadd - critical important moderate low none'
'--bzs=[limit to advisories that fix specified Bugzilla ID]:list of Bugzilla ID:'
'--cves=[limit to advisories that fix specified CVE ID]:list of CVD ID]:'
'--security[limit to security advisories]'
'--bugfix[limit to bugfix advisories]'
'--enhancement[limit to enhancement advisories]'
'--newpackage[limit to newpackage advisories]'
)
local -a downgrade_opts=(
'(--no-allow-downgrade)--allow-downgrade[enable downgrade of dependencies]'
'(--allow-downgrade)--no-allow-downgrade[disable downgrade of dependencies]'
)
local -a replay_opts=(
'--ignore-extras[not consider extra packages]'
'--ignore-installed[mismatches between installed and stored transaction are not errors]'
)
# Deal with some aliases (not comprehensive)
case $cmd in
check-updgrade) cmd=check-update;;
dg) cmd=downgrade;;
dsync) cmd=distro-sync;;
grp) cmd=group;;
if) cmd=info;;
in) cmd=install;;
ls) cmd=list;;
mc) cmd=makecache;;
rei) cmd=reinstall;;
rm) cmd=remove ;;
rq) cmd=repoquery;;
se) cmd=search;;
update|up) cmd=upgrade;;
esac
local curcontext="${curcontext%:*:*}:dnf-${cmd}:"
case $cmd in
advisory|group|history|mark|module|offline|repoquery)
_dnf5-$cmd && ret=0
;;
system-upgrade)
_dnf5-offline && ret=0
;;
autoremove)
_arguments : $offline_opts && ret=0
;;
check)
_arguments : \
'--dependencies[show missing dependencies and conflicts]' \
'--duplicates[show duplicated packages]' \
'--obsoleted[show obsoleted packages]' && ret=0
;;
check-upgrade)
_arguments : \
$advisory_opts \
'--changelogs[print package changelogs]' \
'--minimal[reports the lowest versions of packages that fix advisories]' \
'*: : _dnf5_packages -T installed' && ret=0
;;
clean)
tmp=(
'dbcache:remove cache files generated from the repository metadata'
'expire-cache:mark the repository metadata expired'
'metadata:remove the repository metadata'
'packages:remove any cached packages'
'all:clean all'
)
_describe -t cache-types 'cache type' tmp && ret=0
;;
distro-sync)
_arguments : $common_opts '*: : _dnf5_packages -T installed' && ret=0
;;
downgrade)
_arguments : \
$common_opts $downgrade_opts \
'*: : _dnf5_packages -T installed' && ret=0
;;
download)
_arguments : \
'--arch=[limit to packages of specified architecture]:list of architectures:' \
'--resolve[resolve and download needed dependencies]' \
'--alldeps[with --resolve, also download already installed dependencies]' \
'--destdir=[download to the specified directory]: : _directories' \
'--srpm[download the source rpm]' \
'--url[print the list of URLs where the rpms can be downloaded]' \
'*--urlprotocol=[with --url, limit to specified protocols]:protocol:_sequence compadd - http https ftp file' \
'*: : _dnf5_packages -T all' && ret=0
;;
environment)
_arguments : \
'--available[show only available environments]' \
'--installed[show only installed environments]' \
':subcommand:(list info)' \
'*: : _dnf5_environments' && ret=0
;;
info|list)
_arguments : \
'--showduplicates[show all versions of the packages]' \
'*: : _dnf5_packages -T all' \
+ '(type)' \
'--installed[list only installed packages]:*: : _dnf5_packages -T installed' \
'--available[list only available packages]:*: : _dnf5_packages -T available' \
'--extras[list only extras]' \
'--obsoletes[list only installed but obsoleted packages]:*: : _dnf5_packages -T installed' \
'--recent[list only recently added packages]' \
'--upgrades[list only available upgrades of installed packages]:*: : _dnf5_packages -T upgradable' \
'--autoremove[list only packages that will be autoremoved]:*: : _dnf5_packages -T installed' &&ret=0
;;
install)
_arguments : \
$common_opts $downgrade_opts $advisory_opts \
'*: : _dnf5_packages_or_rpms -T available' && ret=0
;;
leaves|makecache)
# nothing to complete
;;
provides)
_files && ret=0
;;
reinstall)
_arguments : \
$common_opts $downgrade_opts \
'*: : _dnf5_packages_or_rpms -T installed' && ret=0
;;
remove)
_arguments : \
$offline_opts \
'--no-autoremove[not remove dependencies that are no longer used]' \
'*: : _dnf5_packages -T installed' && ret=0
;;
replay)
_arguments : \
$replay_opts \
':transaction path:_directories' && ret=0
;;
repo)
_arguments : \
'--all[show info about all repositories]' \
'--enabled[show info only about enabled repositories]' \
'--disabled[show info only about disabled repositories]' \
':subcommand:(list info)' && ret=0
;;
search)
_arguments : \
'--all[search patterns also inside description and URL fields]' \
'--showduplicates[show all versions of packages, not only the latest ones]' \
'*:search pattern:' && ret=0
;;
swap)
_arguments : \
$offline_opts \
'--allowerasing[allow erasing of installed packages]' \
': : _dnf5_packages -T installed' \
': : _dnf5_packages -T available' && ret=0
;;
upgrade)
_arguments : \
${common_opts:#--skip-broken*} $downgrade_opts $advisory_opts \
'--minimal[upgrade only to the lowest available versions that fix advisories]' \
'--destdir=[specify directory into which downloading packages]: : _directories' \
'*: : _dnf5_packages_or_rpms -T upgradable' && ret=0
;;
versionlock)
_arguments : \
':subcommand:(add exclude clear delete list)' \
'*: : _dnf5_packages -T all' && ret=0
;;
esac
return ret
}
# main completer
_dnf5() {
local curcontext="$curcontext" state state_descr line ret=1
typeset -A opt_args
local -a opts=(
'(-y --assumeyes)--assumeno[answer no for all questions]'
'--best[try the best available package version]'
'(-C --cacheonly)'{-C,--cacheonly}"[run entirely from system cache, don't update cache]"
'--comment=[add comment to transaction history]:comment:'
'(-c --config)'{-c+,--config=}'[specify configuration file]:config file:_files'
'--debugsolver[dump detailed solving results in file ./debugdata]'
'*--disable-plugin=[disable specified plugins]:list of plugin names:'
'(--repo)*--disable-repo=[disable specified repos]: : _sequence _dnf5_repositories -T enabled'
'--dump-main-config[print main configuration values to stdout]'
'*--dump-repo-config=[print repository configuration values to stdout]:repi id'
'--dump-variables[print variable values to stdout]'
'*--enable-plugin=[enable specified plugins]:list of plugin names:'
'*--enable-repo=[enable additional repos]: : _sequence _dnf5_repositories -T disabled'
'--forcearch=[force the use of the specified arch]:arch:'
'(-)'{-h,--help}'[show the help message]'
'--installroot=[set install root]: : _directories'
'--no-best[do not limit transactions to best candidates]'
'--no-docs[do not install documentation]'
'--no-gpgcheck[skip checking GPG signatures on packages]'
'--no-plugins[disable all plugins]'
'(-q --quiet)'{-q,--quiet}'[show just the relevant content]'
'--refresh[force refreshing metadata before running the command]'
'--releasever=[override distribution release in config files]:release ver:'
'(--disablerepo)*--repo=[enable just the specified repo]: : _sequence _dnf5_repositories -T all'
'*--repofrompath=[specify additional repos]:repository_label,path_or_url: '
'*--setopt=[override option in config file]:repoid.option=value:'
'*--setvar=[override DNF5 variable value]'
'--show-new-leaves[show newly installed leaf packages]'
'--use-host-config[use config files and variables from host system]'
'(- *)--version[show dnf version]'
'(-y --assumeyes --assumeno)'{-y,--assumeyes}'[answer yes for all questions]'
'*'{-x+,--exclude=}'[exclude specified packages from transaction]: : _sequence _dnf5_packages -T all'
)
_arguments -C -s : $opts ': :->command' '*:: :->cmd_args' && ret=0
case $state in
command) _dnf5_commands && ret=0 ;;
cmd_args) _dnf5_subcmds_opts && ret=0 ;;
esac
return ret
}
_dnf5 "$@"

View file

@ -6,14 +6,22 @@ command -v dnf5 > /dev/null && dnfprog=dnf5
alias dnfl="${dnfprog} list" # List packages alias dnfl="${dnfprog} list" # List packages
alias dnfli="${dnfprog} list installed" # List installed packages alias dnfli="${dnfprog} list installed" # List installed packages
alias dnfgl="${dnfprog} grouplist" # List package groups
alias dnfmc="${dnfprog} makecache" # Generate metadata cache alias dnfmc="${dnfprog} makecache" # Generate metadata cache
alias dnfp="${dnfprog} info" # Show package information alias dnfp="${dnfprog} info" # Show package information
alias dnfs="${dnfprog} search" # Search package alias dnfs="${dnfprog} search" # Search package
alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package
alias dnfi="sudo ${dnfprog} install" # Install package alias dnfi="sudo ${dnfprog} install" # Install package
alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group
alias dnfr="sudo ${dnfprog} remove" # Remove package alias dnfr="sudo ${dnfprog} remove" # Remove package
alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group
alias dnfc="sudo ${dnfprog} clean all" # Clean cache alias dnfc="sudo ${dnfprog} clean all" # Clean cache
# Conditional aliases based on dnfprog value
if [[ "${dnfprog}" == "dnf5" ]]; then
alias dnfgl="${dnfprog} group list" # List package groups (dnf5)
alias dnfgi="sudo ${dnfprog} group install" # Install package group (dnf5)
alias dnfgr="sudo ${dnfprog} group remove" # Remove package group (dnf5)
else
alias dnfgl="${dnfprog} grouplist" # List package groups (dnf)
alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group (dnf)
alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group (dnf)
fi

View file

@ -2,6 +2,8 @@
This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some
aliases for frequent docker-compose commands. 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: To use it, add docker-compose to the plugins array of your zshrc file:

View file

@ -39,6 +39,10 @@ following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more
zstyle ':omz:plugins:docker' legacy-completion yes zstyle ':omz:plugins:docker' legacy-completion yes
``` ```
### For Podman's Docker wrapper users
If you use Podman's Docker wrapper, you need to enable legacy completion. See above section.
## Aliases ## Aliases
| Alias | Command | Description | | Alias | Command | Description |
@ -47,6 +51,7 @@ zstyle ':omz:plugins:docker' legacy-completion yes
| dcin | `docker container inspect` | Display detailed information on one or more containers | | dcin | `docker container inspect` | Display detailed information on one or more containers |
| dcls | `docker container ls` | List all the running docker containers | | dcls | `docker container ls` | List all the running docker containers |
| dclsa | `docker container ls -a` | List all running and stopped containers | | dclsa | `docker container ls -a` | List all running and stopped containers |
| dcprune | `docker container prune` | Remove all stopped containers |
| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) | | dib | `docker image build` | Build an image from a Dockerfile (same as docker build) |
| dii | `docker image inspect` | Display detailed information on one or more images | | dii | `docker image inspect` | Display detailed information on one or more images |
| dils | `docker image ls` | List docker images | | dils | `docker image ls` | List docker images |
@ -60,6 +65,7 @@ zstyle ':omz:plugins:docker' legacy-completion yes
| dndcn | `docker network disconnect` | Disconnect a container from a network | | dndcn | `docker network disconnect` | Disconnect a container from a network |
| dni | `docker network inspect` | Return information about one or more networks | | dni | `docker network inspect` | Return information about one or more networks |
| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts | | dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts |
| dnprune | `docker network prune` | Remove all unused networks |
| dnrm | `docker network rm` | Remove one or more networks | | dnrm | `docker network rm` | Remove one or more networks |
| dpo | `docker container port` | List port mappings or a specific mapping for the container | | dpo | `docker container port` | List port mappings or a specific mapping for the container |
| dps | `docker ps` | List all the running docker containers | | dps | `docker ps` | List all the running docker containers |
@ -69,10 +75,12 @@ zstyle ':omz:plugins:docker' legacy-completion yes
| drit | `docker container run -it` | Create a new container and start it in an interactive shell | | drit | `docker container run -it` | Create a new container and start it in an interactive shell |
| drm | `docker container rm` | Remove the specified container(s) | | drm | `docker container rm` | Remove the specified container(s) |
| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) | | drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) |
| dsprune | `docker system prune` | Remove unused data |
| dst | `docker container start` | Start one or more stopped containers | | dst | `docker container start` | Start one or more stopped containers |
| drs | `docker container restart` | Restart one or more containers | | drs | `docker container restart` | Restart one or more containers |
| dsta | `docker stop $(docker ps -q)` | Stop all running containers | | dsta | `docker stop $(docker ps -q)` | Stop all running containers |
| dstp | `docker container stop` | Stop one or more running containers | | dstp | `docker container stop` | Stop one or more running containers |
| dsts | `docker stats` | Display real-time streaming statistics for containers |
| dtop | `docker top` | Display the running processes of a container | | dtop | `docker top` | Display the running processes of a container |
| dvi | `docker volume inspect` | Display detailed information about one or more volumes | | dvi | `docker volume inspect` | Display detailed information about one or more volumes |
| dvls | `docker volume ls` | List all the volumes known to docker | | dvls | `docker volume ls` | List all the volumes known to docker |

View file

@ -2,6 +2,7 @@ alias dbl='docker build'
alias dcin='docker container inspect' alias dcin='docker container inspect'
alias dcls='docker container ls' alias dcls='docker container ls'
alias dclsa='docker container ls -a' alias dclsa='docker container ls -a'
alias dcprune='docker container prune'
alias dib='docker image build' alias dib='docker image build'
alias dii='docker image inspect' alias dii='docker image inspect'
alias dils='docker image ls' alias dils='docker image ls'
@ -15,6 +16,7 @@ alias dncn='docker network connect'
alias dndcn='docker network disconnect' alias dndcn='docker network disconnect'
alias dni='docker network inspect' alias dni='docker network inspect'
alias dnls='docker network ls' alias dnls='docker network ls'
alias dnprune='docker network prune'
alias dnrm='docker network rm' alias dnrm='docker network rm'
alias dpo='docker container port' alias dpo='docker container port'
alias dps='docker ps' alias dps='docker ps'
@ -24,10 +26,12 @@ alias dr='docker container run'
alias drit='docker container run -it' alias drit='docker container run -it'
alias drm='docker container rm' alias drm='docker container rm'
alias 'drm!'='docker container rm -f' alias 'drm!'='docker container rm -f'
alias dsprune='docker system prune'
alias dst='docker container start' alias dst='docker container start'
alias drs='docker container restart' alias drs='docker container restart'
alias dsta='docker stop $(docker ps -q)' alias dsta='docker stop $(docker ps -q)'
alias dstp='docker container stop' alias dstp='docker container stop'
alias dsts='docker stats'
alias dtop='docker top' alias dtop='docker top'
alias dvi='docker volume inspect' alias dvi='docker volume inspect'
alias dvls='docker volume ls' alias dvls='docker volume ls'

View file

@ -78,6 +78,14 @@ change.
NOTE: if a directory is found in both the allowed and disallowed lists, the disallowed list NOTE: if a directory is found in both the allowed and disallowed lists, the disallowed list
takes preference, _i.e._ the .env file will never be sourced. takes preference, _i.e._ the .env file will never be sourced.
## Named Pipe (FIFO) Support
The plugin supports `.env` files provided as UNIX named pipes (FIFOs) in addition to regular files.
This is useful when secrets managers like [1Password Environments](https://developer.1password.com/docs/environment/)
mount `.env` files as named pipes to inject secrets on-the-fly without writing them to disk.
No additional configuration is required — the plugin automatically detects and sources named pipes.
## Version Control ## Version Control
**It's strongly recommended to add `.env` file to `.gitignore`**, because usually it contains sensitive information such as your credentials, secret keys, passwords etc. You don't want to commit this file, it's supposed to be local only. **It's strongly recommended to add `.env` file to `.gitignore`**, because usually it contains sensitive information such as your credentials, secret keys, passwords etc. You don't want to commit this file, it's supposed to be local only.

View file

@ -11,7 +11,7 @@
## Functions ## Functions
source_env() { source_env() {
if [[ ! -f "$ZSH_DOTENV_FILE" ]]; then if [[ ! -f "$ZSH_DOTENV_FILE" ]] && [[ ! -p "$ZSH_DOTENV_FILE" ]]; then
return return
fi fi

View file

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

View file

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

View file

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

View file

@ -29,5 +29,5 @@ plugins=(... ember-cli)
- [BilalBudhani](https://github.com/BilalBudhani) - [BilalBudhani](https://github.com/BilalBudhani)
- [eubenesa](https://github.com/eubenesa) - [eubenesa](https://github.com/eubenesa)
- [scottkidder](https://github.com/scottkidder] - [scottkidder](https://github.com/scottkidder)
- [t-sauer](https://www.github.com/t-sauer) - [t-sauer](https://www.github.com/t-sauer)

View file

@ -15,9 +15,8 @@ plugins=(... extract)
## Supported file extensions ## Supported file extensions
| Extension | Description | | Extension | Description |
| :---------------- | :----------------------------------- | | :---------------- | :-------------------------------------- |
| `7z` | 7zip file | | `7z` | 7zip file |
| `Z` | Z archive (LZW) |
| `apk` | Android app file | | `apk` | Android app file |
| `aar` | Android library file | | `aar` | Android library file |
| `bz2` | Bzip2 file | | `bz2` | Bzip2 file |
@ -34,6 +33,9 @@ plugins=(... extract)
| `lz4` | LZ4 archive | | `lz4` | LZ4 archive |
| `lzma` | LZMA archive | | `lzma` | LZMA archive |
| `obscpio` | cpio archive used on OBS | | `obscpio` | cpio archive used on OBS |
| `pk3` | Renamed Zip archive used by Quake games |
| `pk4` | Renamed Zip archive used by Quake games |
| `pk7` | Renamed 7zip file used by Quake games |
| `rar` | WinRAR archive | | `rar` | WinRAR archive |
| `rpm` | RPM package | | `rpm` | RPM package |
| `sublime-package` | Sublime Text package | | `sublime-package` | Sublime Text package |
@ -57,6 +59,7 @@ plugins=(... extract)
| `whl` | Python wheel file | | `whl` | Python wheel file |
| `xpi` | Mozilla XPI module file | | `xpi` | Mozilla XPI module file |
| `xz` | LZMA2 archive | | `xz` | LZMA2 archive |
| `Z` | Z archive (LZW) |
| `zip` | Zip archive | | `zip` | Zip archive |
| `zlib` | zlib archive | | `zlib` | zlib archive |
| `zst` | Zstandard file (zstd) | | `zst` | Zstandard file (zstd) |

View file

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

View file

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

View file

@ -65,6 +65,29 @@ If `yes`, sets the `--icons` option of `eza`, adding icons for files and folders
Default: `no` Default: `no`
### `color-scale`
```zsh
zstyle ':omz:plugins:eza' 'color-scale' all|age|size
```
Highlight levels of field(s) distinctly. Use comma(,) separated list of `all`, `age`, `size`
Default: `none`
### `color-scale-mode`
```zsh
zstyle ':omz:plugins:eza' 'color-scale-mode' gradient|fixed
```
Choose the mode for highlighting:
- `gradient` (default) -- gradient coloring
- `fixed` -- fixed coloring
Default: `gradient`
### `size-prefix` ### `size-prefix`
```zsh ```zsh

View file

@ -34,6 +34,14 @@ function _configure_eza() {
if zstyle -t ':omz:plugins:eza' 'icons'; then if zstyle -t ':omz:plugins:eza' 'icons'; then
_EZA_TAIL+=("--icons=auto") _EZA_TAIL+=("--icons=auto")
fi fi
zstyle -s ':omz:plugins:eza' 'color-scale' _val
if [[ $_val ]]; then
_EZA_TAIL+=("--color-scale=$_val")
fi
zstyle -s ':omz:plugins:eza' 'color-scale-mode' _val
if [[ $_val == (gradient|fixed) ]]; then
_EZA_TAIL+=("--color-scale-mode=$_val")
fi
zstyle -s ':omz:plugins:eza' 'time-style' _val zstyle -s ':omz:plugins:eza' 'time-style' _val
if [[ $_val ]]; then if [[ $_val ]]; then
_EZA_TAIL+=("--time-style='$_val'") _EZA_TAIL+=("--time-style='$_val'")

View file

@ -1,9 +0,0 @@
# 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

@ -1,13 +0,0 @@
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 _comps[flutter]=_flutter
fi fi
flutter zsh-completion >| "$ZSH_CACHE_DIR/completions/_flutter" &| flutter zsh-completion < /dev/null >| "$ZSH_CACHE_DIR/completions/_flutter" &|

35
plugins/foot/README.md Normal file
View file

@ -0,0 +1,35 @@
# foot
This plugin adds shell integration for [foot, a fast, lightweight and
minimalistic Wayland terminal emulator](https://codeberg.org/dnkl/foot).
To use, add `foot` to the list of plugins in your `.zshrc` file:
```zsh
plugins=(... foot)
```
## Spawning new terminal instances in the current working directory
When spawning a new terminal instance (with `ctrl+shift+n` by default), the new
instance will start in the current working directory.
## Jumping between prompts
Foot can move the current viewport to focus prompts of already executed
commands (bound to ctrl+shift+z/x by default).
## Piping last command's output
The key binding `pipe-command-output` can pipe the last command's output to an
application of your choice (similar to the other `pipe-*` key bindings):
```
[key-bindings]
pipe-command-output=[sh -c "f=$(mktemp); cat - > $f; footclient emacsclient -nw $f; rm $f"] Control+Shift+g
```
When pressing ctrl+shift+g, the last command's output is written to a
temporary file, then an emacsclient is started in a new footclient instance.
The temporary file is removed after the footclient instance has closed.

View file

@ -0,0 +1,10 @@
function precmd {
print -Pn "\e]133;A\e\\"
if ! builtin zle; then
print -n "\e]133;D\e\\"
fi
}
function preexec {
print -n "\e]133;C\e\\"
}

View file

@ -18,7 +18,7 @@ You can change the fetch interval in your .zshrc:
GIT_AUTO_FETCH_INTERVAL=1200 # in seconds GIT_AUTO_FETCH_INTERVAL=1200 # in seconds
``` ```
A log of `git fetch --all` will be saved in `.git/FETCH_LOG`. A log of `git-fetch-all` will be saved in `.git/FETCH_LOG`.
## Toggle auto-fetch per folder ## Toggle auto-fetch per folder

View file

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

View file

@ -79,6 +79,7 @@ plugins=(... git)
| `gcss` | `git commit -S -s` | | `gcss` | `git commit -S -s` |
| `gcssm` | `git commit -S -s -m` | | `gcssm` | `git commit -S -s -m` |
| `gcf` | `git config --list` | | `gcf` | `git config --list` |
| `gcfu` | `git commit --fixup` |
| `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` | | `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` |
| `gd` | `git diff` | | `gd` | `git diff` |
| `gdca` | `git diff --cached` | | `gdca` | `git diff --cached` |
@ -212,7 +213,7 @@ plugins=(... git)
| `gtv` | `git tag \| sort -V` | | `gtv` | `git tag \| sort -V` |
| `gignore` | `git update-index --assume-unchanged` | | `gignore` | `git update-index --assume-unchanged` |
| `gunignore` | `git update-index --no-assume-unchanged` | | `gunignore` | `git update-index --no-assume-unchanged` |
| `gwch` | `git whatchanged -p --abbrev-commit --pretty=medium` | | `gwch` | `git log --patch --abbrev-commit --pretty=medium --raw` |
| `gwt` | `git worktree` | | `gwt` | `git worktree` |
| `gwtls` | `git worktree list` | | `gwtls` | `git worktree list` |
| `gwtmv` | `git worktree move` | | `gwtmv` | `git worktree move` |
@ -234,37 +235,23 @@ These are aliases that have been removed, renamed, or otherwise modified in a wa
receive further support. receive further support.
| Alias | Command | Modification | | Alias | Command | Modification |
| :------- | :-------------------------------------------------------- | :-------------------------------------------------------- | | :------- | :-------------------------------------------------------- | :-----------------------------------------------------|
| `gap` | `git add --patch` | New alias: `gapa`. | | `gap` | `git add --patch` | New alias: `gapa` |
| `gcl` | `git config --list` | New alias: `gcf`. | | `gcl` | `git config --list` | New alias: `gcf` |
| `gdc` | `git diff --cached` | New alias: `gdca`. | | `gdt` | `git difftool` | No replacement |
| `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 ## Functions
### Current ### Current
| Command | Description | | Command | Description |
| :----------------------- | :-------------------------------------------------------------------------------------------------------------- | | :----------------------- | :------------------------------------------------------------------------------------------------------------- |
| `current_branch` | Returns the name of the current branch. | | `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_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_current_user_name` | Returns the `user.name` config value (Lives in `lib/git.zsh`) |
| `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise. | | `git_develop_branch` | Returns the name of the “development” branch: `dev`, `devel`, `development` if they exist, `develop` otherwise |
| `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise. | | `git_main_branch` | Returns the name of the main branch: `main` if it exists, `master` otherwise |
| `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote. | | `grename <old> <new>` | Renames branch `<old>` to `<new>`, including on the origin remote |
| `gbda` | Deletes all merged branches | | `gbda` | Deletes all merged branches |
| `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) | | `gbds` | Deletes all squash-merged branches (**Note: performance degrades with number of branches**) |
@ -286,4 +273,3 @@ Note that `gwip` and `gunwip` are aliases, but are also documented here to group
| Command | Description | Reason | | 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,14 +8,6 @@ git_version="${${(As: :)$(git version 2>/dev/null)}[3]}"
# (order should follow README) # (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 # Check for develop and similarly named branches
function git_develop_branch() { function git_develop_branch() {
command git rev-parse --git-dir &>/dev/null || return command git rev-parse --git-dir &>/dev/null || return
@ -31,10 +23,12 @@ function git_develop_branch() {
return 1 return 1
} }
# Check if main exists and use instead of master # Get the default branch name from common branch names or fallback to remote HEAD
function git_main_branch() { function git_main_branch() {
command git rev-parse --git-dir &>/dev/null || return command git rev-parse --git-dir &>/dev/null || return
local ref
local remote ref
for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,stable,master}; do for ref in refs/{heads,remotes/{origin,upstream}}/{main,trunk,mainline,default,stable,master}; do
if command git show-ref -q --verify $ref; then if command git show-ref -q --verify $ref; then
echo ${ref:t} echo ${ref:t}
@ -42,6 +36,14 @@ function git_main_branch() {
fi fi
done 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 # If no main branch was found, fall back to master but return error
echo master echo master
return 1 return 1
@ -86,13 +88,13 @@ function work_in_progress() {
# Aliases # Aliases
# (sorted alphabetically by command) # (sorted alphabetically by command)
# (order should follow README) # (order should follow README)
# (in some cases force the alisas order to match README, like for example gke and gk) # (in some cases force the alias order to match README, like for example gke and gk)
# #
alias grt='cd "$(git rev-parse --show-toplevel || echo .)"' alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
function ggpnp() { function ggpnp() {
if [[ "$#" == 0 ]]; then if [[ $# == 0 ]]; then
ggl && ggp ggl && ggp
else else
ggl "${*}" && ggp "${*}" ggl "${*}" && ggp "${*}"
@ -200,6 +202,7 @@ alias gc!='git commit --verbose --amend'
alias gcn='git commit --verbose --no-edit' alias gcn='git commit --verbose --no-edit'
alias gcn!='git commit --verbose --no-edit --amend' alias gcn!='git commit --verbose --no-edit --amend'
alias gcf='git config --list' alias gcf='git config --list'
alias gcfu='git commit --fixup'
alias gdct='git describe --tags $(git rev-list --tags --max-count=1)' alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
alias gd='git diff' alias gd='git diff'
alias gdca='git diff --cached' alias gdca='git diff --cached'
@ -269,10 +272,11 @@ alias gpra='git pull --rebase --autostash'
alias gprav='git pull --rebase --autostash -v' alias gprav='git pull --rebase --autostash -v'
function ggu() { function ggu() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" local b
git pull --rebase origin "${b:=$1}" [[ $# != 1 ]] && b="$(git_current_branch)"
git pull --rebase origin "${b:-$1}"
} }
compdef _git ggu=git-checkout compdef _git ggu=git-pull
alias gprom='git pull --rebase origin $(git_main_branch)' alias gprom='git pull --rebase origin $(git_main_branch)'
alias gpromi='git pull --rebase=interactive origin $(git_main_branch)' alias gpromi='git pull --rebase=interactive origin $(git_main_branch)'
@ -281,14 +285,15 @@ alias gprumi='git pull --rebase=interactive upstream $(git_main_branch)'
alias ggpull='git pull origin "$(git_current_branch)"' alias ggpull='git pull origin "$(git_current_branch)"'
function ggl() { function ggl() {
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then if [[ $# != 0 ]] && [[ $# != 1 ]]; then
git pull origin "${*}" git pull origin "${*}"
else else
[[ "$#" == 0 ]] && local b="$(git_current_branch)" local b
git pull origin "${b:=$1}" [[ $# == 0 ]] && b="$(git_current_branch)"
git pull origin "${b:-$1}"
fi fi
} }
compdef _git ggl=git-checkout compdef _git ggl=git-pull
alias gluc='git pull upstream $(git_current_branch)' alias gluc='git pull upstream $(git_current_branch)'
alias glum='git pull upstream $(git_main_branch)' alias glum='git pull upstream $(git_main_branch)'
@ -296,10 +301,11 @@ alias gp='git push'
alias gpd='git push --dry-run' alias gpd='git push --dry-run'
function ggf() { function ggf() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" local b
git push --force origin "${b:=$1}" [[ $# != 1 ]] && b="$(git_current_branch)"
git push --force origin "${b:-$1}"
} }
compdef _git ggf=git-checkout compdef _git ggf=git-push
alias gpf!='git push --force' alias gpf!='git push --force'
is-at-least 2.30 "$git_version" \ is-at-least 2.30 "$git_version" \
@ -307,10 +313,11 @@ is-at-least 2.30 "$git_version" \
|| alias gpf='git push --force-with-lease' || alias gpf='git push --force-with-lease'
function ggfl() { function ggfl() {
[[ "$#" != 1 ]] && local b="$(git_current_branch)" local b
git push --force-with-lease origin "${b:=$1}" [[ $# != 1 ]] && b="$(git_current_branch)"
git push --force-with-lease origin "${b:-$1}"
} }
compdef _git ggfl=git-checkout compdef _git ggfl=git-push
alias gpsup='git push --set-upstream origin $(git_current_branch)' alias gpsup='git push --set-upstream origin $(git_current_branch)'
is-at-least 2.30 "$git_version" \ is-at-least 2.30 "$git_version" \
@ -322,14 +329,15 @@ alias gpod='git push origin --delete'
alias ggpush='git push origin "$(git_current_branch)"' alias ggpush='git push origin "$(git_current_branch)"'
function ggp() { function ggp() {
if [[ "$#" != 0 ]] && [[ "$#" != 1 ]]; then if [[ $# != 0 ]] && [[ $# != 1 ]]; then
git push origin "${*}" git push origin "${*}"
else else
[[ "$#" == 0 ]] && local b="$(git_current_branch)" local b
git push origin "${b:=$1}" [[ $# == 0 ]] && b="$(git_current_branch)"
git push origin "${b:-$1}"
fi fi
} }
compdef _git ggp=git-checkout compdef _git ggp=git-push
alias gpu='git push upstream' alias gpu='git push upstream'
alias grb='git rebase' alias grb='git rebase'
@ -398,7 +406,7 @@ alias gts='git tag --sign'
alias gtv='git tag | sort -V' alias gtv='git tag | sort -V'
alias gignore='git update-index --assume-unchanged' alias gignore='git update-index --assume-unchanged'
alias gunignore='git update-index --no-assume-unchanged' alias gunignore='git update-index --no-assume-unchanged'
alias gwch='git whatchanged -p --abbrev-commit --pretty=medium' alias gwch='git log --patch --abbrev-commit --pretty=medium --raw'
alias gwt='git worktree' alias gwt='git worktree'
alias gwta='git worktree add' alias gwta='git worktree add'
alias gwtls='git worktree list' alias gwtls='git worktree list'
@ -411,19 +419,13 @@ alias gke='\gitk --all $(git log --walk-reflogs --pretty=%h) &!'
unset git_version unset git_version
# Logic for adding warnings on deprecated aliases # Logic for adding warnings on deprecated aliases or functions
local old_alias new_alias local old_name new_name
for old_alias new_alias ( for old_name new_name (
# TODO(2023-10-19): remove deprecated `git pull --rebase` aliases current_branch git_current_branch
gup gpr
gupv gprv
gupa gpra
gupav gprav
gupom gprom
gupomi gpromi
); do ); do
aliases[$old_alias]=" aliases[$old_name]="
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\" 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_alias" $new_name"
done done
unset old_alias new_alias unset old_name new_name

View file

@ -0,0 +1,40 @@
This project is a friendly fork of the official Git completion
(`contrib/completion`) and prompt scripts for Bash, Zsh, and possibly other
shells.
Most Git developers use the Bash shell, for which the completion scripts work
rather well, however, Zsh is typically neglected. I've sent many patches to fix
the issues, many have been merged, but many have been ignored, thus the need for
a canonical location of a good, working Zsh completion.
There are advantages for Bash users too. Currently the scripts under `contrib` are tied to the
specific Git version, for example the completion scripts of version v2.40
(https://git.kernel.org/pub/scm/git/git.git/plain/contrib/completion/git-completion.bash?h=v2.40.0[git-completion.bash])
have issues with older versions of Git (e.g. v2.33); the ones in
this project don't.
With `git-completion` you can be sure you are using the latest completion that
works in both shells, and any Git version.
This is a sister project of the
https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/gitfast[Oh My Zsh
gitfast] plugin (that I also maintain), which has similar needs.
== Installation ==
* https://github.com/felipec/git-completion/wiki/Bash[Bash instructions]
* https://github.com/felipec/git-completion/wiki/Zsh[Zsh instructions]
== Improvements from upstream ==
This is a short list of the benefits you get:
* Easier installation
* Tons of bug fixes
* Works with older versions of git
* Zsh: much more options
* Zsh: quoting works properly
* Zsh: automatic suffix removal
For a full list of all the patches on top of upstream git check
https://github.com/felipec/git-completion/wiki/Patches[Patches].

View file

@ -2,23 +2,11 @@
# zsh completion wrapper for git # zsh completion wrapper for git
# #
# Copyright (c) 2012-2020 Felipe Contreras <felipe.contreras@gmail.com> # Copyright (c) 2012-2024 Felipe Contreras <felipe.contreras@gmail.com>
# #
# The recommended way to install this script is to make a copy of it as a # The recommended way to use this script is to prepend its location to your $fpath:
# file named '_git' inside any directory in your fpath.
# #
# For example, create a directory '~/.zsh/', copy this file to '~/.zsh/_git', # fpath=($git_completion_srcdir $fpath)
# and then add the following to your ~/.zshrc file:
#
# fpath=(~/.zsh $fpath)
#
# You need git's bash completion script installed. By default bash-completion's
# location will be used (e.g. pkg-config --variable=completionsdir bash-completion).
#
# If your bash completion script is somewhere else, you can specify the
# location in your ~/.zshrc:
#
# zstyle ':completion:*:*:git:*' script ~/.git-completion.bash
# #
zstyle -T ':completion:*:*:git:*' tag-order && \ zstyle -T ':completion:*:*:git:*' tag-order && \

View file

@ -1,6 +1,8 @@
# bash/zsh completion support for core Git. # bash/zsh completion support for core Git.
# #
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org> # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
# Copyright (c) 2012-2024 Felipe Contreras <felipe.contreras@gmail.com>
#
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/). # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
# Distributed under the GNU General Public License, version 2.0. # Distributed under the GNU General Public License, version 2.0.
# #

View file

@ -1,6 +1,6 @@
# gitignore # gitignore
This plugin enables you the use of [gitignore.io](https://www.toptal.com/developers/gitignore) from the command line. You need an active internet connection. This plugin enables you to use [gitignore.io](https://www.gitignore.io) from the command line. You need an active internet connection to fetch templates. The plugin uses the gitignore.io CDN endpoint to simplify access and improve reliability.
To use it, add `gitignore` to the plugins array in your zshrc file: To use it, add `gitignore` to the plugins array in your zshrc file:
@ -14,4 +14,4 @@ plugins=(... gitignore)
* `gi [TEMPLATENAME]`: Show git-ignore output on the command line, e.g. `gi java` to exclude class and package files. * `gi [TEMPLATENAME]`: Show git-ignore output on the command line, e.g. `gi java` to exclude class and package files.
* `gi [TEMPLATENAME] >> .gitignore`: Appending programming language settings to your projects .gitignore. * `gi [TEMPLATENAME] >> .gitignore`: Append the template rules to your project's `.gitignore` file.

View file

@ -1,12 +1,21 @@
function gi() { curl -fLw '\n' https://www.toptal.com/developers/gitignore/api/"${(j:,:)@}" } # gitignore plugin for oh-my-zsh
# Uses gitignore.io CDN endpoint
function _gi_curl() {
curl -sfL "https://www.gitignore.io/api/$1"
}
function gi() {
local query="${(j:,:)@}"
_gi_curl "$query" || return 1
}
_gitignoreio_get_command_list() { _gitignoreio_get_command_list() {
curl -sfL https://www.toptal.com/developers/gitignore/api/list | tr "," "\n" _gi_curl "list" | tr "," "\n"
} }
_gitignoreio () { _gitignoreio () {
compset -P '*,' compset -P '*,'
compadd -S '' `_gitignoreio_get_command_list` compadd -S '' $(_gitignoreio_get_command_list)
} }
compdef _gitignoreio gi compdef _gitignoreio gi

View file

@ -1,6 +1,11 @@
# gpg-agent # gpg-agent
Enables [GPG's gpg-agent](https://www.gnupg.org/documentation/manuals/gnupg/) if it is not running. 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.
To use it, add `gpg-agent` to the plugins array of your zshrc file: 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() { __gradle-set-settings-file() {
# In order of precedence: --settings-file=filename, settings.gradle, settings.gradle.kts # In order of precedence: settings.gradle, settings.gradle.kts
local default_gradle_settings_file="$project_root_dir/settings.gradle" local default_gradle_settings_file="$project_root_dir/settings.gradle"
if [[ ! -f $default_gradle_settings_file ]]; then if [[ ! -f $default_gradle_settings_file ]]; then
default_gradle_settings_file="$project_root_dir/settings.gradle.kts" default_gradle_settings_file="$project_root_dir/settings.gradle.kts"
fi fi
gradle_settings_file=${${(v)opt_args[(i)-c|--settings-file]}:-$default_gradle_settings_file} gradle_settings_file=$default_gradle_settings_file
} }
__gradle-set-build-file() { __gradle-set-build-file() {
__gradle-set-settings-file __gradle-set-settings-file
# In order of precedence: --build-file=filename, rootProject.buildFileName, build.gradle, build.gradle.kts # In order of precedence: rootProject.buildFileName, build.gradle, build.gradle.kts
local default_gradle_build_file_name="build.gradle" local default_gradle_build_file_name="build.gradle"
if [[ -r $gradle_settings_file ]]; then if [[ -r $gradle_settings_file ]]; then
@ -45,8 +45,7 @@ __gradle-set-build-file() {
default_gradle_build_file="$project_root_dir/build.gradle.kts" default_gradle_build_file="$project_root_dir/build.gradle.kts"
fi fi
# If a build file is specified after '-b' or '--build-file', use this file. gradle_build_file=$default_gradle_build_file
gradle_build_file=${${(v)opt_args[(i)-b|--build-file]}:-$default_gradle_build_file}
} }
__gradle-set-cache-name() { __gradle-set-cache-name() {
@ -94,10 +93,11 @@ __gradle-generate-tasks-cache() {
# Reuse Gradle Daemon if IDLE but don't start a new one. # Reuse Gradle Daemon if IDLE but don't start a new one.
local gradle_tasks_output local gradle_tasks_output
if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then if [[ ! -z "$($gradle_cmd --status 2>/dev/null | grep IDLE)" ]]; then
gradle_tasks_output="$($gradle_cmd --daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)" gradle_tasks_output="$(cd "$project_root_dir" && "$gradle_cmd" --daemon --no-scan --console=plain -q tasks --all 2>/dev/null)"
else else
gradle_tasks_output="$($gradle_cmd --no-daemon --no-scan --build-file $gradle_build_file --console=plain -q tasks --all 2>/dev/null)" gradle_tasks_output="$(cd "$project_root_dir" && "$gradle_cmd" --no-daemon --no-scan --console=plain -q tasks --all 2>/dev/null)"
fi fi
local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line local gradle_all_tasks="" root_tasks="" subproject_tasks="" output_line
local -a match local -a match
for output_line in ${(f)"$(printf "%s\n" "${gradle_tasks_output[@]}")"}; do for output_line in ${(f)"$(printf "%s\n" "${gradle_tasks_output[@]}")"}; do
@ -199,106 +199,161 @@ __gradle_subcommand() {
;; ;;
(dependencyInsight) (dependencyInsight)
_arguments \ _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.]' \ '--dependency=[Shows the details of given dependency.]' \
'--configuration=[Looks for the dependency in given configuration.]:dependency configuration:_gradle_dependency_configurations' && ret=0 '--single-path[Show at most one path to each dependency]' && ret=0
;; ;;
(help) (help)
_arguments \ _arguments \
'--task[The task to show help for.]' && ret=0 '--task=[The task to show help for.]' && ret=0
;; ;;
(init) (init)
_arguments \ _arguments \
'--dsl=[DSL to be used in generated scripts.]:dsl:(groovy kotlin)' \ '--comments[Include clarifying comments in files.]' \
'--package=[Package for the generated source.]' \ '--dsl=[Set the build script DSL to be used in generated scripts.]' \
'--project-name=[Name of the generated project.]' \ '--incubating[Allow the generated build to use new features and APIs.]' \
'--test-framework=[Test framework to be used.]:test framework:(junit kotlintest scalatest spock testng)' \ '--insecure-protocol=[How to handle insecure URLs used for Maven Repositories.]' \
'--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 '--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
;; ;;
(tasks) (tasks)
_arguments \ _arguments \
'--all[List all tasks, including subproject tasks.]' \ '--all[Show additional tasks and detail.]' \
'--group=[Show tasks only from given task group.]' && ret=0 '--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
;; ;;
(test) (test)
_arguments -C \ _arguments -C \
'--debug-jvm[Enable debugging for the test process. The process is started suspended and listening on port 5005. Requires the "java" plugin.]' \ '--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. Requires the "java" plugin.]' \ '--fail-fast[Stops test execution after the first failed test.]' \
'--tests=[Sets test class or method name to be included, * is supported. Requires the "java" plugin.]' \ '--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.]' \
'(-)*:: :->task-or-option' && ret=0 '(-)*:: :->task-or-option' && ret=0
;; ;;
(wrapper) (wrapper)
_arguments \ _arguments \
'--distribution-type=[Binary-only or all with docs and sources]:*:distribution type:(bin all)' \ '--distribution-type=[The type of the Gradle distribution to be used by the wrapper.]:*:distribution type:(bin all)' \
'--gradle-version=[Set Gradle version for wrapper]' \ '--gradle-distribution-sha256-sum=[The SHA-256 hash sum of the gradle distribution.]' \
'--gradle-distribution-sha256-sum=[SHA-256 checksum]' \ '--gradle-distribution-url=[The URL to download the Gradle distribution from.]' \
'--gradle-distribution-url=[Set Gradle distribution URL]' && ret=0 '--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
;; ;;
(*) (*)
_arguments -C \ _arguments -C \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \ '-Dgradle.user.home=[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle.user.home:_directories' \
'(--no-build-cache)--build-cache[Enable the Gradle build cache.]' \ '-Dorg.gradle.caching.debug=[]' \
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \ '-Dorg.gradle.caching=[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]:org.gradle.caching:(true false)' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \ '-Dorg.gradle.configuration-cache.entries-per-key=[]' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle' \ '-Dorg.gradle.configuration-cache.fine-grained-property-tracking=[]' \
'(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.heap-dump-dir=[]:org.gradle.configuration cache.heap dump dir:_directories' \
'--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=[]' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.in-serialization=[]' \
'(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.integrity-check=[]' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache.max-problems=[]' \
'--continue[Continues task execution after a task failure.]' \ '-Dorg.gradle.configuration-cache.parallel=[]' \
'-Dorg.gradle.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \ '-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.caching=[Set true to enable Gradle build cache.]:enable build cache:(true false)' \ '-Dorg.gradle.configuration-cache.read-only=[]' \
'-Dorg.gradle.console=[Set type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache.unsafe.ignore.unsupported-build-events-listeners=[]' \
'-Dorg.gradle.daemon.debug=[Set true to debug Gradle Daemon.]:enable daemon debug:(true false)' \ '-Dorg.gradle.configuration-cache=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'-Dorg.gradle.daemon.idletimeout=[Kill Gradle Daemon after # idle millis.]' \ '-Dorg.gradle.configureondemand=[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]' \
'-Dorg.gradle.debug=[Set true to debug Gradle Client.]' \ '-Dorg.gradle.console.unicode=[Specifies which character types are allowed in console output to generate. Values are 'auto' (default), 'disable' or 'enable'.]' \
'-Dorg.gradle.jvmargs=[Set JVM arguments.]' \ '-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.java.home=[Set JDK home dir.]' \ '-Dorg.gradle.continue=[Continue task execution after a task failure.]' \
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \ '-Dorg.gradle.continuous.quietperiod=[]' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:enable parallel build:(true false)' \ '-Dorg.gradle.daemon.healthcheckinterval=[]' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.daemon.idletimeout=[]' \
'-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \ '-Dorg.gradle.daemon.registry.base=[]:org.gradle.daemon.registry.base:_directories' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \ '-Dorg.gradle.daemon=[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \ '-Dorg.gradle.debug.host=[]' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \ '-Dorg.gradle.debug.port=[]' \
'(--no-daemon)--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \ '-Dorg.gradle.debug.server=[]' \
'--foreground[Starts the Gradle daemon in the foreground.]' \ '-Dorg.gradle.debug.suspend=[]' \
{-g,--gradle-user-home}'[Specifies the gradle user home directory.]:file:_directories' \ '-Dorg.gradle.debug=[]:org.gradle.debug:(true false)' \
\*--include-build'[Includes the specified build in the composite.]:file:_directories' \ '-Dorg.gradle.dependency.verification=[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:org.gradle.dependency.verification:(strict lenient off)' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle' \ '-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories' \
'(-d --debug -w --warn -q --quiet)'{-i,--info}'[Set log level to info.]' \ '-Dorg.gradle.java.installations.auto-detect=[]' \
'--max-workers[Set the maximum number of concurrent workers that Gradle may use.]:number workers' \ '-Dorg.gradle.java.installations.auto-download=[]' \
{-m,--dry-run}'[Runs the builds with all task actions disabled.]' \ '-Dorg.gradle.java.installations.fromEnv=[]' \
'--no-color[Do not use color in the console output. (Removed in Gradle 3.0)]' \ '-Dorg.gradle.java.installations.idea-jdks-directory=[]:org.gradle.java.installations.idea jdks directory:_directories' \
'(--build-cache)--no-build-cache[Do not use the Gradle build cache.]' \ '-Dorg.gradle.java.installations.paths=[]:org.gradle.java.installations.paths:_directories' \
'(--configure-on-demand)--no-configure-on-demand[Disables configuration on demand.]' \ '-Dorg.gradle.jvmargs=[]' \
'(--daemon)--no-daemon[Do not use the Gradle daemon to run the build.]' \ '-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug)' \
'(--parallel)--no-parallel[Disables parallel execution to build projects.]' \ '-Dorg.gradle.logging.stacktrace=[]' \
'(--scan)--no-scan[Do not create a build scan.]' \ '-Dorg.gradle.native=[]' \
'--offline[The build should operate without accessing network resources.]' \ '-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)' \
\*{-P+,--project-prop}'[Set project property for the build script (e.g. -Pmyprop=myvalue).]:project property (prop=val):' \ '-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)' \
{-p,--project-dir}'[Specifies the start directory for Gradle.]:start directory:_directories' \ '-Dorg.gradle.problems.report=[(Experimental) enables HTML problems report]' \
'(--no-parallel)--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \ '-Dorg.gradle.projectcachedir=[Specify the project-specific cache directory. Defaults to .gradle in the root project directory.]:org.gradle.projectcachedir:_directories' \
'--profile[Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.]' \ '-Dorg.gradle.tooling.parallel=[]' \
'--priority[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.unsafe.isolated-projects=[]' \
'--project-cache-dir[Specifies the project-specific cache directory.]:cache directory:_directories' \ '-Dorg.gradle.vfs.verbose=[]' \
'(-d --debug -w --warn -i --info)'{-q,--quiet}'[Log errors only.]' \ '-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)' \
'--recompile-scripts[Force build script recompiling.]' \ '-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']' \
'--refresh[Refresh the state of resources of the type(s) specified.]:refresh policy:(dependencies)' \ '-Dorg.gradle.welcome=[]:org.gradle.welcome:(once never)' \
'--refresh-dependencies[Refresh the state of dependencies.]' \ '-Dorg.gradle.workers.max=[Configure the number of concurrent workers Gradle is allowed to use.]' \
'--rerun-tasks[Ignore previously cached task results.]' \ (--no-build-cache)'--build-cache[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]' \
'(--no-scan)--scan[Create a build scan.]' \ (--no-configuration-cache)'--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'(-S --full-stacktrace)'{-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \ '--configuration-cache-problems[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:configuration cache problems:(fail warn)' \
'(-s --stacktrace)'{-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \ (--no-configure-on-demand)'--configure-on-demand[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds. (incubating)]' \
'--system-prop[system property (prop=val)]' \ '--console[Specifies which type of console output to generate. Values are 'plain', 'colored', 'auto' (default), 'rich' or 'verbose'.]:console:(plain auto rich verbose)' \
'--console-unicode[Specifies which character types are allowed in console output to generate. Values are 'auto' (default), 'disable' or 'enable'.]' \
(--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.]' \ {-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.]" \ (--no-daemon)'--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \ (--quiet,-q,--warn,-w,--info,-i){-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \ {-F,--dependency-verification}'[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:dependency verification:(strict lenient off)' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \ {-m,--dry-run}'[Run the builds with all task actions disabled.]' \
'(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \ \*{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \ '--export-keys[Exports the public keys used for dependency verification.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' && ret=0 '--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.]' \
'--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[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
;; ;;
esac esac
@ -324,75 +379,115 @@ _gradle() {
typeset -A opt_args typeset -A opt_args
_arguments -C \ _arguments -C \
'(-)'{-\?,-h,--help}'[Shows a help message.]' \ '-Dgradle.user.home=[Specifies the Gradle user home directory. Defaults to ~/.gradle]:gradle.user.home:_directories:->argument-expected' \
{-a,--no-rebuild}'[Do not rebuild project dependencies.]' \ '-Dorg.gradle.caching.debug=[]:->argument-expected' \
'(--no-build-cache)--build-cache[Enable the Gradle build cache.]' \ '-Dorg.gradle.caching=[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]:org.gradle.caching:(true false):->argument-expected' \
{-b,--build-file}'[Specifies the build file.]:build script:_files -g \*.gradle' \ '-Dorg.gradle.configuration-cache.entries-per-key=[]:->argument-expected' \
{-C,--cache}'[Specifies how compiled build scripts should be cached.]:cache policy:(on rebuild)' \ '-Dorg.gradle.configuration-cache.fine-grained-property-tracking=[]:->argument-expected' \
{-c,--settings-file}'[Specifies the settings file.]:settings file:_files -g \*.gradle:->argument-expected' \ '-Dorg.gradle.configuration-cache.heap-dump-dir=[]:org.gradle.configuration cache.heap dump dir:_directories:->argument-expected' \
'(--no-configuration-cache)--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.file-system-checks=[]:->argument-expected' \
'(--configuration-cache)--no-configuration-cache[Disables the configuration cache. Gradle will not reuse the build configuration from previous builds.]' \ '-Dorg.gradle.configuration-cache.inputs.unsafe.ignore.in-serialization=[]:->argument-expected' \
'--configuration-cache-problems=[Configures how the configuration cache handles problems]:problem handling:(fail warn)' \ '-Dorg.gradle.configuration-cache.integrity-check=[]:->argument-expected' \
'(--no-configure-on-demand)--configure-on-demand[Only relevant projects are configured in this build run.]' \ '-Dorg.gradle.configuration-cache.max-problems=[]:->argument-expected' \
'--console=[Specifies which type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache.parallel=[]:->argument-expected' \
'--continue[Continues task execution after a task failure.]' \ '-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.cache.reserved.mb=[Reserve Gradle Daemon memory for operations.]' \ '-Dorg.gradle.configuration-cache.read-only=[]:->argument-expected' \
'-Dorg.gradle.caching=[Set true to enable Gradle build cache.]' \ '-Dorg.gradle.configuration-cache.unsafe.ignore.unsupported-build-events-listeners=[]:->argument-expected' \
'-Dorg.gradle.console=[Set type of console output to generate.]:console output type:(plain auto rich verbose)' \ '-Dorg.gradle.configuration-cache=[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]:->argument-expected' \
'-Dorg.gradle.daemon.debug=[Set true to debug Gradle Daemon.]' \ '-Dorg.gradle.configureondemand=[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds.]:->argument-expected' \
'-Dorg.gradle.daemon.idletimeout=[Kill Gradle Daemon after # idle millis.]' \ '-Dorg.gradle.console.unicode=[Specifies which character types are allowed in console output to generate. Values are 'auto' (default), 'disable' or 'enable'.]:->argument-expected' \
'-Dorg.gradle.debug=[Set true to debug Gradle Client.]' \ '-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.jvmargs=[Set JVM arguments.]' \ '-Dorg.gradle.continue=[Continue task execution after a task failure.]:->argument-expected' \
'-Dorg.gradle.java.home=[Set JDK home dir.]' \ '-Dorg.gradle.continuous.quietperiod=[]:->argument-expected' \
'-Dorg.gradle.logging.level=[Set default Gradle log level.]:log level:(quiet warn lifecycle info debug)' \ '-Dorg.gradle.daemon.healthcheckinterval=[]:->argument-expected' \
'-Dorg.gradle.parallel=[Set true to enable parallel project builds.]:(true false)' \ '-Dorg.gradle.daemon.idletimeout=[]:->argument-expected' \
'-Dorg.gradle.priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.daemon.registry.base=[]:org.gradle.daemon.registry.base:_directories:->argument-expected' \
'-Dorg.gradle.unsafe.watch-fs=[Set true to enable Gradle file watcher.]:enable watcher:(true false)' \ '-Dorg.gradle.daemon=[Uses the Gradle daemon to run the build. Starts the daemon if not running.]:->argument-expected' \
'-Dorg.gradle.warning.mode=[Set types of warnings to log.]:warning level:(all summary none)' \ '-Dorg.gradle.debug.host=[]:->argument-expected' \
'-Dorg.gradle.workers.max=[Set the number of workers Gradle is allowed to use.]' \ '-Dorg.gradle.debug.port=[]:->argument-expected' \
'(-i --info -w --warn -q --quiet)'{-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \ '-Dorg.gradle.debug.server=[]:->argument-expected' \
'(--no-daemon)--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \ '-Dorg.gradle.debug.suspend=[]:->argument-expected' \
'--foreground[Starts the Gradle daemon in the foreground.]' \ '-Dorg.gradle.debug=[]:org.gradle.debug:(true false):->argument-expected' \
{-g,--gradle-user-home}'[Specifies the gradle user home directory.]:home directory:_directories:->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' \
'(-)--gui[Launches the Gradle GUI. (Removed in Gradle 4.0)]' \ '-Dorg.gradle.java.home=[]:org.gradle.java.home:_directories:->argument-expected' \
\*--include-build'[Includes the specified build in the composite.]:file:_directories:->argument-expected' \ '-Dorg.gradle.java.installations.auto-detect=[]:->argument-expected' \
\*{-I,--init-script}'[Specifies an initialization script.]:init script:_files -g \*.gradle:->argument-expected' \ '-Dorg.gradle.java.installations.auto-download=[]:->argument-expected' \
'(-d --debug -w --warn -q --quiet)'{-i,--info}'[Set log level to info.]' \ '-Dorg.gradle.java.installations.fromEnv=[]:->argument-expected' \
'--max-workers[Set the maximum number of concurrent workers that Gradle may use.]:number workers:->argument-expected' \ '-Dorg.gradle.java.installations.idea-jdks-directory=[]:org.gradle.java.installations.idea jdks directory:_directories:->argument-expected' \
{-m,--dry-run}'[Runs the builds with all task actions disabled.]' \ '-Dorg.gradle.java.installations.paths=[]:org.gradle.java.installations.paths:_directories:->argument-expected' \
'--no-color[Do not use color in the console output. (Removed in Gradle 3.0)]' \ '-Dorg.gradle.jvmargs=[]:->argument-expected' \
'(--build-cache)--no-build-cache[Do not use the Gradle build cache.]' \ '-Dorg.gradle.logging.level=[]:org.gradle.logging.level:(quiet warn info debug):->argument-expected' \
'(--configure-on-demand)--no-configure-on-demand[Disables configuration on demand.]' \ '-Dorg.gradle.logging.stacktrace=[]:->argument-expected' \
'(--daemon)--no-daemon[Do not use the Gradle daemon to run the build.]' \ '-Dorg.gradle.native=[]:->argument-expected' \
'(--parallel)--no-parallel[Disables parallel execution to build projects.]' \ '-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' \
'(--scan)--no-scan[Do not create a build scan.]' \ '-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' \
'--offline[The build should operate without accessing network resources.]' \ '-Dorg.gradle.problems.report=[(Experimental) enables HTML problems report]:->argument-expected' \
\*{-P+,--project-prop}'[Set project property for the build script (e.g. -Pmyprop=myvalue).]:project property (prop=val):->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' \
{-p,--project-dir}'[Specifies the start directory for Gradle.]:start directory:_directories:->argument-expected' \ '-Dorg.gradle.tooling.parallel=[]:->argument-expected' \
'(--no-parallel)--parallel[Build projects in parallel. Gradle will attempt to determine the optimal number of executor threads to use.]' \ '-Dorg.gradle.unsafe.isolated-projects=[]:->argument-expected' \
'--priority=[Set priority for Gradle worker processes.]:priority:(low normal)' \ '-Dorg.gradle.vfs.verbose=[]:->argument-expected' \
'--profile[Profiles build execution time and generates a report in the <build_dir>/reports/profile directory.]' \ '-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' \
'--project-cache-dir=[Specifies the project-specific cache directory.]:cache directory:_directories:->argument-expected' \ '-Dorg.gradle.warning.mode=[Specifies which mode of warnings to generate. Values are 'all', 'fail', 'summary'(default) or 'none']:->argument-expected' \
'(-d --debug -w --warn -i --info)'{-q,--quiet}'[Log errors only.]' \ '-Dorg.gradle.welcome=[]:org.gradle.welcome:(once never):->argument-expected' \
'--recompile-scripts[Force build script recompiling.]' \ '-Dorg.gradle.workers.max=[Configure the number of concurrent workers Gradle is allowed to use.]:->argument-expected' \
'--refresh[Refresh the state of resources of the type(s) specified.]:refresh policy:(dependencies)' \ (--no-build-cache)'--build-cache[Enables the Gradle build cache. Gradle will try to reuse outputs from previous builds.]' \
'--refresh-dependencies[Refresh the state of dependencies.]' \ (--no-configuration-cache)'--configuration-cache[Enables the configuration cache. Gradle will try to reuse the build configuration from previous builds.]' \
'--rerun-tasks[Ignore previously cached task results.]' \ '--configuration-cache-problems[Configures how the configuration cache handles problems (fail or warn). Defaults to fail.]:configuration cache problems:(fail warn):->argument-expected' \
'(--no-scan)--scan[Create a build scan.]' \ (--no-configure-on-demand)'--configure-on-demand[Configure necessary projects only. Gradle will attempt to reduce configuration time for large multi-project builds. (incubating)]' \
'(-S --full-stacktrace)'{-s,--stacktrace}'[Print out the stacktrace for all exceptions.]' \ '--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' \
'(-s --stacktrace)'{-S,--full-stacktrace}'[Print out the full (very verbose) stacktrace for all exceptions.]' \ '--console-unicode[Specifies which character types are allowed in console output to generate. Values are 'auto' (default), 'disable' or 'enable'.]:->argument-expected' \
'(-)--status[Shows status of running and recently stopped Gradle Daemons.]' \ (--no-continue)'--continue[Continue task execution after a task failure.]' \
'(-)--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.]' \ {-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.]" \ (--no-daemon)'--daemon[Uses the Gradle daemon to run the build. Starts the daemon if not running.]' \
'(--write-locks)--update-locks[Perform a partial update of the dependency lock.]' \ (--quiet,-q,--warn,-w,--info,-i){-d,--debug}'[Log in debug mode (includes normal stacktrace).]' \
'(-)'{-v,--version}'[Print version info.]' \ {-F,--dependency-verification}'[Configures the dependency verification mode. Values are 'strict', 'lenient' or 'off'.]:dependency verification:(strict lenient off):->argument-expected' \
'(-d --debug -q --quiet -i --info)'{-w,--warn}'[Log warnings and errors only.]' \ {-m,--dry-run}'[Run the builds with all task actions disabled.]' \
'--warning-mode=[Set types of warnings to log.]:warning mode:(all summary none)' \ \*{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \
'(--update-locks)--write-locks[Persists dependency resolution for locked configurations.]' \ '--export-keys[Exports the public keys used for dependency verification.]' \
'(--no-watch-fs)--watch-fs[Gradle watches filesystem for incremental builds.]' \ '--foreground[Starts the Gradle daemon in the foreground.]' \
{-x,--exclude-task}'[Specify a task to be excluded from execution.]' \ (--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]' \
{-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.]' \
'--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[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 '(-)*:: :->task-or-option' && ret=0
if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then

View file

@ -5,6 +5,7 @@ files=(
/etc/grc.zsh # default /etc/grc.zsh # default
/usr/local/etc/grc.zsh # homebrew darwin-x64 /usr/local/etc/grc.zsh # homebrew darwin-x64
/opt/homebrew/etc/grc.zsh # homebrew darwin-arm64 /opt/homebrew/etc/grc.zsh # homebrew darwin-arm64
/home/linuxbrew/.linuxbrew/etc/grc.zsh # linuxbrew
/usr/share/grc/grc.zsh # Gentoo Linux (app-misc/grc) /usr/share/grc/grc.zsh # Gentoo Linux (app-misc/grc)
) )

143
plugins/hcloud/README.md Normal file
View file

@ -0,0 +1,143 @@
# hcloud plugin
This plugin adds completion for the [Hetzner Cloud CLI](https://github.com/hetznercloud/cli),
as well as some aliases for common hcloud commands.
To use it, add `hcloud` to the plugins array in your zshrc file:
```zsh
plugins=(... hcloud)
```
## Aliases
| Alias | Command | Description |
| :--------- | :---------------------------------------- | :------------------------------------------------------------ |
| hc | `hcloud` | The hcloud command |
| | | **Context Management** |
| hcctx | `hcloud context` | Manage contexts |
| hcctxls | `hcloud context list` | List all contexts |
| hcctxu | `hcloud context use` | Use a context |
| hcctxc | `hcloud context create` | Create a new context |
| hcctxd | `hcloud context delete` | Delete a context |
| hcctxa | `hcloud context active` | Show active context |
| | | **Server Management** |
| hcs | `hcloud server` | Manage servers |
| hcsl | `hcloud server list` | List all servers |
| hcsc | `hcloud server create` | Create a server |
| hcsd | `hcloud server delete` | Delete a server |
| hcsdesc | `hcloud server describe` | Describe a server |
| hcspoff | `hcloud server poweroff` | Power off a server |
| hcspon | `hcloud server poweron` | Power on a server |
| hcsr | `hcloud server reboot` | Reboot a server |
| hcsreset | `hcloud server reset` | Reset a server |
| hcssh | `hcloud server ssh` | SSH into a server |
| hcse | `hcloud server enable-rescue` | Enable rescue mode for a server |
| hcsdr | `hcloud server disable-rescue` | Disable rescue mode for a server |
| hcsip | `hcloud server ip` | Manage server IPs |
| hcsa | `hcloud server attach-iso` | Attach an ISO to a server |
| hcsda | `hcloud server detach-iso` | Detach an ISO from a server |
| hcscip | `hcloud server change-type` | Change server type |
| | | **Volume Management** |
| hcv | `hcloud volume` | Manage volumes |
| hcvl | `hcloud volume list` | List all volumes |
| hcvc | `hcloud volume create` | Create a volume |
| hcvd | `hcloud volume delete` | Delete a volume |
| hcvdesc | `hcloud volume describe` | Describe a volume |
| hcva | `hcloud volume attach` | Attach a volume to a server |
| hcvda | `hcloud volume detach` | Detach a volume from a server |
| hcvr | `hcloud volume resize` | Resize a volume |
| | | **Network Management** |
| hcn | `hcloud network` | Manage networks |
| hcnl | `hcloud network list` | List all networks |
| hcnc | `hcloud network create` | Create a network |
| hcnd | `hcloud network delete` | Delete a network |
| hcndesc | `hcloud network describe` | Describe a network |
| hcnas | `hcloud network add-subnet` | Add a subnet to a network |
| hcnds | `hcloud network delete-subnet` | Delete a subnet from a network |
| hcnar | `hcloud network add-route` | Add a route to a network |
| hcndr | `hcloud network delete-route` | Delete a route from a network |
| | | **Floating IP Management** |
| hcfip | `hcloud floating-ip` | Manage floating IPs |
| hcfipl | `hcloud floating-ip list` | List all floating IPs |
| hcfipc | `hcloud floating-ip create` | Create a floating IP |
| hcfipd | `hcloud floating-ip delete` | Delete a floating IP |
| hcfipdesc | `hcloud floating-ip describe` | Describe a floating IP |
| hcfipa | `hcloud floating-ip assign` | Assign a floating IP to a server |
| hcfipua | `hcloud floating-ip unassign` | Unassign a floating IP from a server |
| | | **SSH Key Management** |
| hcsk | `hcloud ssh-key` | Manage SSH keys |
| hcskl | `hcloud ssh-key list` | List all SSH keys |
| hcskc | `hcloud ssh-key create` | Create an SSH key |
| hcskd | `hcloud ssh-key delete` | Delete an SSH key |
| hcskdesc | `hcloud ssh-key describe` | Describe an SSH key |
| hcsku | `hcloud ssh-key update` | Update an SSH key |
| | | **Image Management** |
| hci | `hcloud image` | Manage images |
| hcil | `hcloud image list` | List all images |
| hcid | `hcloud image delete` | Delete an image |
| hcidesc | `hcloud image describe` | Describe an image |
| hciu | `hcloud image update` | Update an image |
| | | **Firewall Management** |
| hcfw | `hcloud firewall` | Manage firewalls |
| hcfwl | `hcloud firewall list` | List all firewalls |
| hcfwc | `hcloud firewall create` | Create a firewall |
| hcfwd | `hcloud firewall delete` | Delete a firewall |
| hcfwdesc | `hcloud firewall describe` | Describe a firewall |
| hcfwar | `hcloud firewall add-rule` | Add a rule to a firewall |
| hcfwdr | `hcloud firewall delete-rule` | Delete a rule from a firewall |
| hcfwas | `hcloud firewall apply-to-resource` | Apply a firewall to a resource |
| hcfwrs | `hcloud firewall remove-from-resource` | Remove a firewall from a resource |
| | | **Load Balancer Management** |
| hclb | `hcloud load-balancer` | Manage load balancers |
| hclbl | `hcloud load-balancer list` | List all load balancers |
| hclbc | `hcloud load-balancer create` | Create a load balancer |
| hclbd | `hcloud load-balancer delete` | Delete a load balancer |
| hclbdesc | `hcloud load-balancer describe` | Describe a load balancer |
| hclbu | `hcloud load-balancer update` | Update a load balancer |
| hclbas | `hcloud load-balancer add-service` | Add a service to a load balancer |
| hclbds | `hcloud load-balancer delete-service` | Delete a service from a load balancer |
| hclbat | `hcloud load-balancer add-target` | Add a target to a load balancer |
| hclbdt | `hcloud load-balancer delete-target` | Delete a target from a load balancer |
| | | **Certificate Management** |
| hccert | `hcloud certificate` | Manage certificates |
| hccertl | `hcloud certificate list` | List all certificates |
| hccertc | `hcloud certificate create` | Create a certificate |
| hccertd | `hcloud certificate delete` | Delete a certificate |
| hccertdesc | `hcloud certificate describe` | Describe a certificate |
| hccertu | `hcloud certificate update` | Update a certificate |
| | | **Datacenter and Location Info** |
| hcdc | `hcloud datacenter list` | List all datacenters |
| hcloc | `hcloud location list` | List all locations |
| hcst | `hcloud server-type list` | List all server types |
| hcit | `hcloud image list --type system` | List all system images |
## Requirements
This plugin requires the [Hetzner Cloud CLI](https://github.com/hetznercloud/cli) to be installed.
### Installation
Install the Hetzner Cloud CLI using one of the following methods:
**macOS (Homebrew):**
```bash
brew install hcloud
```
**Linux (from source):**
```bash
go install github.com/hetznercloud/cli/cmd/hcloud@latest
```
**Or download a prebuilt binary from the [releases page](https://github.com/hetznercloud/cli/releases).**
### Setup
After installation, create a context and authenticate:
```bash
hcloud context create my-project
```
You'll be prompted to enter your Hetzner Cloud API token, which you can generate in the [Hetzner Cloud Console](https://console.hetzner.cloud/).

View file

@ -0,0 +1,129 @@
# hcloud plugin for oh-my-zsh
# Hetzner Cloud CLI: https://github.com/hetznercloud/cli
if (( ! $+commands[hcloud] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `hcloud`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_hcloud" ]]; then
typeset -g -A _comps
autoload -Uz _hcloud
_comps[hcloud]=_hcloud
fi
hcloud completion zsh 2> /dev/null >| "$ZSH_CACHE_DIR/completions/_hcloud" &|
# Main alias
alias hc='hcloud'
# Context management
alias hcctx='hcloud context'
alias hcctxls='hcloud context list'
alias hcctxu='hcloud context use'
alias hcctxc='hcloud context create'
alias hcctxd='hcloud context delete'
alias hcctxa='hcloud context active'
# Server management
alias hcs='hcloud server'
alias hcsl='hcloud server list'
alias hcsc='hcloud server create'
alias hcsd='hcloud server delete'
alias hcsdesc='hcloud server describe'
alias hcspoff='hcloud server poweroff'
alias hcspon='hcloud server poweron'
alias hcsr='hcloud server reboot'
alias hcsreset='hcloud server reset'
alias hcssh='hcloud server ssh'
alias hcse='hcloud server enable-rescue'
alias hcsdr='hcloud server disable-rescue'
alias hcsip='hcloud server ip'
# Server actions
alias hcsa='hcloud server attach-iso'
alias hcsda='hcloud server detach-iso'
alias hcscip='hcloud server change-type'
# Volume management
alias hcv='hcloud volume'
alias hcvl='hcloud volume list'
alias hcvc='hcloud volume create'
alias hcvd='hcloud volume delete'
alias hcvdesc='hcloud volume describe'
alias hcva='hcloud volume attach'
alias hcvda='hcloud volume detach'
alias hcvr='hcloud volume resize'
# Network management
alias hcn='hcloud network'
alias hcnl='hcloud network list'
alias hcnc='hcloud network create'
alias hcnd='hcloud network delete'
alias hcndesc='hcloud network describe'
alias hcnas='hcloud network add-subnet'
alias hcnds='hcloud network delete-subnet'
alias hcnar='hcloud network add-route'
alias hcndr='hcloud network delete-route'
# Floating IP management
alias hcfip='hcloud floating-ip'
alias hcfipl='hcloud floating-ip list'
alias hcfipc='hcloud floating-ip create'
alias hcfipd='hcloud floating-ip delete'
alias hcfipdesc='hcloud floating-ip describe'
alias hcfipa='hcloud floating-ip assign'
alias hcfipua='hcloud floating-ip unassign'
# SSH key management
alias hcsk='hcloud ssh-key'
alias hcskl='hcloud ssh-key list'
alias hcskc='hcloud ssh-key create'
alias hcskd='hcloud ssh-key delete'
alias hcskdesc='hcloud ssh-key describe'
alias hcsku='hcloud ssh-key update'
# Image management
alias hci='hcloud image'
alias hcil='hcloud image list'
alias hcid='hcloud image delete'
alias hcidesc='hcloud image describe'
alias hciu='hcloud image update'
# Firewall management
alias hcfw='hcloud firewall'
alias hcfwl='hcloud firewall list'
alias hcfwc='hcloud firewall create'
alias hcfwd='hcloud firewall delete'
alias hcfwdesc='hcloud firewall describe'
alias hcfwar='hcloud firewall add-rule'
alias hcfwdr='hcloud firewall delete-rule'
alias hcfwas='hcloud firewall apply-to-resource'
alias hcfwrs='hcloud firewall remove-from-resource'
# Load balancer management
alias hclb='hcloud load-balancer'
alias hclbl='hcloud load-balancer list'
alias hclbc='hcloud load-balancer create'
alias hclbd='hcloud load-balancer delete'
alias hclbdesc='hcloud load-balancer describe'
alias hclbu='hcloud load-balancer update'
alias hclbas='hcloud load-balancer add-service'
alias hclbds='hcloud load-balancer delete-service'
alias hclbat='hcloud load-balancer add-target'
alias hclbdt='hcloud load-balancer delete-target'
# Certificate management
alias hccert='hcloud certificate'
alias hccertl='hcloud certificate list'
alias hccertc='hcloud certificate create'
alias hccertd='hcloud certificate delete'
alias hccertdesc='hcloud certificate describe'
alias hccertu='hcloud certificate update'
# Datacenter and location info
alias hcdc='hcloud datacenter list'
alias hcloc='hcloud location list'
alias hcst='hcloud server-type list'
alias hcit='hcloud image list --type system'

View file

@ -79,7 +79,7 @@ Using [Zinit](https://github.com/zdharma-continuum/zinit):
2. Load the plugin in `~/.zshrc`: 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' zinit ice wait atload'_history_substring_search_config'
3. Run `exec zsh` to take changes into account: 3. Run `exec zsh` to take changes into account:

View file

@ -3,6 +3,13 @@
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}" 0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}" 0="${${(M)0:#/*}:-$PWD/$0}"
# Respect case sensitivity settings for globbing in history search
if [[ "$CASE_SENSITIVE" = true ]]; then
: ${HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS=''}
else
: ${HISTORY_SUBSTRING_SEARCH_GLOBBING_FLAGS='i'}
fi
source ${0:A:h}/history-substring-search.zsh source ${0:A:h}/history-substring-search.zsh

View file

@ -295,8 +295,8 @@ _history-substring-search-begin() {
fi fi
# #
# Escape and join query parts with wildcard character '*' as separator # Escape and join query parts with wildcard character '*' as seperator
# `(j:CHAR:)` join array to string with CHAR as separator # `(j:CHAR:)` join array to string with CHAR as seperator
# #
local search_pattern="${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*" local search_pattern="${(j:*:)_history_substring_search_query_parts[@]//(#m)[\][()|\\*?#<>~^]/\\$MATCH}*"

View file

@ -26,6 +26,7 @@ This plugin supplies one command, `jira`, through which all its features are exp
| `jira new` | Opens a new Jira issue dialogue | | `jira new` | Opens a new Jira issue dialogue |
| `jira ABC-123` | Opens an existing issue | | `jira ABC-123` | Opens an existing issue |
| `jira ABC-123 m` | Opens an existing issue for adding a comment | | `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 dashboard [rapid_view]` | Opens your JIRA dashboard |
| `jira mine` | Queries for your own issues | | `jira mine` | Queries for your own issues |
| `jira tempo` | Opens your JIRA Tempo | | `jira tempo` | Opens your JIRA Tempo |
@ -43,6 +44,22 @@ starting with "_": "MP-1234_fix_dashboard". In both these cases, the issue opene
This is also checks if the prefix is in the name, and adds it if not, so: "MP-1234" opens the issue "MP-1234", This is also checks if the prefix is in the name, and adds it if not, so: "MP-1234" opens the issue "MP-1234",
"mp-1234" opens the issue "mp-1234", and "1234" opens the issue "MP-1234". "mp-1234" opens the issue "mp-1234", and "1234" opens the issue "MP-1234".
If your branch naming convention deviates, you can overwrite the jira_branch function to determine and echo the Jira issue key yourself.
Define a function `jira_branch` after sourcing `oh-my-zsh.sh` in your `.zshrc`.
Example:
```zsh
# Determine branch name from naming convention 'type/KEY-123/description'.
function jira_branch() {
# Get name of the branch
issue_arg=$(git rev-parse --abbrev-ref HEAD)
# Strip prefixes like feature/ or bugfix/
issue_arg=${issue_arg#*/}
# Strip suffixes like /some-branch-description
issue_arg=${issue_arg%%/*}
# Return the value
echo $issue_arg
}
```
#### Debugging usage #### Debugging usage

View file

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

View file

@ -8,6 +8,7 @@ jira Performs the default action
jira new Opens a new Jira issue dialogue jira new Opens a new Jira issue dialogue
jira ABC-123 Opens an existing issue jira ABC-123 Opens an existing issue
jira ABC-123 m Opens an existing issue for adding a comment 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 dashboard [rapid_view] Opens your JIRA dashboard
jira mine Queries for your own issues jira mine Queries for your own issues
jira tempo Opens your JIRA Tempo jira tempo Opens your JIRA Tempo
@ -17,6 +18,30 @@ jira branch Opens an existing issue matching the current bra
EOF EOF
} }
# If your branch naming convention deviates, you can partially override this plugin function
# to determine the jira issue key based on your formatting.
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#partially-overriding-an-existing-plugin
function jira_branch() {
# Get name of the branch
issue_arg=$(git rev-parse --abbrev-ref HEAD)
# Strip prefixes like feature/ or bugfix/
issue_arg=${issue_arg##*/}
# Strip suffixes starting with _
issue_arg=(${(s:_:)issue_arg})
# If there is only one part, it means that there is a different delimiter. Try with -
if [[ ${#issue_arg[@]} = 1 && ${issue_arg} == *-* ]]; then
issue_arg=(${(s:-:)issue_arg})
issue_arg="${issue_arg[1]}-${issue_arg[2]}"
else
issue_arg=${issue_arg[1]}
fi
if [[ "${issue_arg:l}" = ${jira_prefix:l}* ]]; then
echo "${issue_arg}"
else
echo "${jira_prefix}${issue_arg}"
fi
}
function jira() { function jira() {
emulate -L zsh emulate -L zsh
local action jira_url jira_prefix local action jira_url jira_prefix
@ -64,6 +89,9 @@ function jira() {
elif [[ "$action" == "mine" ]]; then elif [[ "$action" == "mine" ]]; then
echo "Opening my issues" echo "Opening my issues"
open_command "${jira_url}/issues/?filter=-1" 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 elif [[ "$action" == "dashboard" ]]; then
echo "Opening dashboard" echo "Opening dashboard"
if [[ "$JIRA_RAPID_BOARD" == "true" ]]; then if [[ "$JIRA_RAPID_BOARD" == "true" ]]; then
@ -91,24 +119,7 @@ function jira() {
# but `branch` is a special case that will parse the current git branch # but `branch` is a special case that will parse the current git branch
local issue_arg issue local issue_arg issue
if [[ "$action" == "branch" ]]; then if [[ "$action" == "branch" ]]; then
# Get name of the branch issue=$(jira_branch)
issue_arg=$(git rev-parse --abbrev-ref HEAD)
# Strip prefixes like feature/ or bugfix/
issue_arg=${issue_arg##*/}
# Strip suffixes starting with _
issue_arg=(${(s:_:)issue_arg})
# If there is only one part, it means that there is a different delimiter. Try with -
if [[ ${#issue_arg[@]} = 1 && ${issue_arg} == *-* ]]; then
issue_arg=(${(s:-:)issue_arg})
issue_arg="${issue_arg[1]}-${issue_arg[2]}"
else
issue_arg=${issue_arg[1]}
fi
if [[ "${issue_arg:l}" = ${jira_prefix:l}* ]]; then
issue="${issue_arg}"
else
issue="${jira_prefix}${issue_arg}"
fi
else else
issue_arg=${(U)action} issue_arg=${(U)action}
issue="${jira_prefix}${issue_arg}" issue="${jira_prefix}${issue_arg}"

127
plugins/jj/README.md Normal file
View file

@ -0,0 +1,127 @@
# 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.
### Git async-prompt compatibility
If you use a wrapper function that calls `git_prompt_info` (as shown above), it won't work with
the default git async-prompt mode. This is because async-prompt only registers its background worker
when it detects `$(git_prompt_info)` literally in your prompt variables. A wrapper like
`$(_my_theme_vcs_info)` won't match, so the async output stays empty.
To fix this, add one of the following to your `.zshrc` **before** Oh My Zsh is sourced:
```zsh
# Option 1: force async handlers to always register (recommended, keeps async behavior)
zstyle ':omz:alpha:lib:git' async-prompt force
# Option 2: disable async-prompt entirely (simpler, but prompt may feel slower in large repos)
zstyle ':omz:alpha:lib:git' async-prompt no
```
See [#13555](https://github.com/ohmyzsh/ohmyzsh/issues/13555) for details.
## 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

71
plugins/jj/jj.plugin.zsh Normal file
View file

@ -0,0 +1,71 @@
# 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'

16
plugins/kamal/README.md Normal file
View file

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

691
plugins/kamal/_kamal Normal file
View file

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

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