mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2026-05-22 04:51:12 +02:00
Merge branch 'ohmyzsh:master' into rbenv-add-completion
This commit is contained in:
commit
aeabedd85d
192 changed files with 5040 additions and 1488 deletions
6
.github/FUNDING.yml
vendored
6
.github/FUNDING.yml
vendored
|
|
@ -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
87
.github/INCIDENT_RESPONSE_PLAN.md
vendored
Normal 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.
|
||||||
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
1
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
|
@ -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.
|
||||||
|
|
|
||||||
24
.github/dependencies.yml
vendored
24
.github/dependencies.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
21
.github/workflows/dependencies.yml
vendored
21
.github/workflows/dependencies.yml
vendored
|
|
@ -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 }}
|
||||||
|
|
|
||||||
14
.github/workflows/dependencies/requirements.txt
vendored
14
.github/workflows/dependencies/requirements.txt
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
61
.github/workflows/dependencies/updater.py
vendored
61
.github/workflows/dependencies/updater.py
vendored
|
|
@ -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()
|
||||||
|
|
||||||
|
|
|
||||||
14
.github/workflows/installer.yml
vendored
14
.github/workflows/installer.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
7
.github/workflows/main.yml
vendored
7
.github/workflows/main.yml
vendored
|
|
@ -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
|
||||||
|
|
|
||||||
77
.github/workflows/project.yml
vendored
77
.github/workflows/project.yml
vendored
|
|
@ -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
65
.github/workflows/scorecard.yml
vendored
Normal 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
9
.gitignore
vendored
|
|
@ -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
5
.gitpod.Dockerfile
vendored
|
|
@ -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/*
|
|
||||||
|
|
@ -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
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
27
README.md
27
README.md
|
|
@ -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).
|
||||||
|
|
||||||
[](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
|
[](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
|
||||||
|
[](https://www.bestpractices.dev/projects/10713)
|
||||||
[](https://twitter.com/intent/follow?screen_name=ohmyzsh)
|
[](https://twitter.com/intent/follow?screen_name=ohmyzsh)
|
||||||
[](https://mstdn.social/@ohmyzsh)
|
[](https://mstdn.social/@ohmyzsh)
|
||||||
[](https://discord.gg/ohmyzsh)
|
[](https://discord.gg/ohmyzsh)
|
||||||
[](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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
86
lib/cli.zsh
86
lib/cli.zsh
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
198
lib/git.zsh
198
lib/git.zsh
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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}"
|
||||||
|
|
|
||||||
|
|
@ -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 "$@"
|
||||||
|
|
|
||||||
|
|
@ -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 "$@"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,48 @@
|
||||||
## asdf
|
# asdf
|
||||||
|
|
||||||
Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more.
|
Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more.
|
||||||
|
|
||||||
### Installation
|
## Installation
|
||||||
|
|
||||||
1. [Download asdf](https://asdf-vm.com/guide/getting-started.html#_2-download-asdf) by running the following:
|
1. [Install](https://asdf-vm.com/guide/getting-started.html#_1-install-asdf) asdf and ensure that's it's discoverable on `$PATH`;
|
||||||
|
2. Enable it by adding it to your `plugins` definition in `~/.zshrc`:
|
||||||
```
|
|
||||||
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
|
|
||||||
```
|
|
||||||
|
|
||||||
2. [Enable asdf](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf) by adding it to your `plugins` definition in `~/.zshrc`.
|
|
||||||
|
|
||||||
```
|
|
||||||
plugins=(asdf)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
See the [asdf documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to use asdf:
|
|
||||||
|
|
||||||
|
```sh
|
||||||
|
plugins=(asdf)
|
||||||
```
|
```
|
||||||
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Refer to the [asdf plugin documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to add a plugin and install the many runtime versions for it.
|
||||||
|
|
||||||
|
Example for installing the nodejs plugin and the many runtimes for it:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Add plugin to asdf
|
||||||
|
asdf plugin add nodejs
|
||||||
|
|
||||||
|
# Install the latest available version
|
||||||
asdf install nodejs latest
|
asdf install nodejs latest
|
||||||
asdf global nodejs latest
|
|
||||||
asdf local nodejs latest
|
# Uninstall the latest version
|
||||||
|
asdf uninstall nodejs latest
|
||||||
|
|
||||||
|
# Install a specific version
|
||||||
|
asdf install nodejs 16.5.0
|
||||||
|
|
||||||
|
# Set the latest version in .tool-versions of the `current directory`
|
||||||
|
asdf set nodejs latest
|
||||||
|
|
||||||
|
# Set a specific version in the `parent directory`
|
||||||
|
asdf set -p nodejs 16.5.0 # -p is shorthand for --parent
|
||||||
|
|
||||||
|
# Set a global version under `$HOME`
|
||||||
|
asdf set -u nodejs 16.5.0 # -u is shorthand for --home
|
||||||
```
|
```
|
||||||
|
|
||||||
### Maintainer
|
For more commands, run `asdf help` or refer to the
|
||||||
|
[asdf CLI documentation](https://asdf-vm.com/manage/commands.html#all-commands).
|
||||||
|
|
||||||
|
## Maintainer
|
||||||
|
|
||||||
- [@RobLoach](https://github.com/RobLoach)
|
- [@RobLoach](https://github.com/RobLoach)
|
||||||
|
|
|
||||||
|
|
@ -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" &|
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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. |
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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=(
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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."}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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 )
|
||||||
|
```
|
||||||
|
|
|
||||||
|
|
@ -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
570
plugins/dnf/_dnf5
Normal 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 "$@"
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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. |
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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) |
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,9 @@ local -a exts=(
|
||||||
lz4
|
lz4
|
||||||
lzma
|
lzma
|
||||||
obscpio
|
obscpio
|
||||||
|
pk3
|
||||||
|
pk4
|
||||||
|
pk7
|
||||||
rar
|
rar
|
||||||
rpm
|
rpm
|
||||||
sublime-package
|
sublime-package
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'")
|
||||||
|
|
|
||||||
|
|
@ -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)
|
|
||||||
```
|
|
||||||
|
|
@ -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" &|
|
|
||||||
|
|
@ -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
35
plugins/foot/README.md
Normal 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.
|
||||||
|
|
||||||
10
plugins/foot/foot.plugin.zsh
Normal file
10
plugins/foot/foot.plugin.zsh
Normal 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\\"
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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). |
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
40
plugins/gitfast/MANUAL.adoc
Normal file
40
plugins/gitfast/MANUAL.adoc
Normal 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].
|
||||||
|
|
@ -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 && \
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
#
|
#
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -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:
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,76 +379,116 @@ _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.]' \
|
||||||
'(-)*:: :->task-or-option' && ret=0
|
{-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
|
||||||
|
|
||||||
if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then
|
if [[ $words[CURRENT] != -* && $state != "argument-expected" ]]; then
|
||||||
__gradle_tasks && ret=0
|
__gradle_tasks && ret=0
|
||||||
|
|
|
||||||
|
|
@ -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
143
plugins/hcloud/README.md
Normal 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/).
|
||||||
129
plugins/hcloud/hcloud.plugin.zsh
Normal file
129
plugins/hcloud/hcloud.plugin.zsh
Normal 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'
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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}*"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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
127
plugins/jj/README.md
Normal 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
71
plugins/jj/jj.plugin.zsh
Normal 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
16
plugins/kamal/README.md
Normal 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
691
plugins/kamal/_kamal
Normal 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
Loading…
Add table
Add a link
Reference in a new issue