mirror of
https://github.com/robbyrussell/oh-my-zsh.git
synced 2026-01-20 17:26:32 +01:00
Compare commits
43 Commits
a449c0247d
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e076690551 | ||
|
|
233e81db4e | ||
|
|
99b243b9a9 | ||
|
|
4677b798aa | ||
|
|
834fbf3711 | ||
|
|
47e990ccad | ||
|
|
ec14da72fb | ||
|
|
35068db837 | ||
|
|
871d4b9816 | ||
|
|
ed21aa1961 | ||
|
|
6634f44826 | ||
|
|
2daffdf101 | ||
|
|
28d4ab6e98 | ||
|
|
72625e2f2f | ||
|
|
d23d3ea69f | ||
|
|
a79b37b954 | ||
|
|
0f45f82c0a | ||
|
|
129aeee6bc | ||
|
|
3a73094983 | ||
|
|
95de26572e | ||
|
|
945d89f7ae | ||
|
|
8a231b1930 | ||
|
|
475b18f39a | ||
|
|
d4a62a2715 | ||
|
|
b5c449e1eb | ||
|
|
7192af5239 | ||
|
|
1fee750c3b | ||
|
|
57781231bb | ||
|
|
a4e15fdb16 | ||
|
|
f84341c574 | ||
|
|
92aed2e936 | ||
|
|
72acd2ca90 | ||
|
|
ddec79ad43 | ||
|
|
0ebeae78d0 | ||
|
|
3b66f643e4 | ||
|
|
953f526dea | ||
|
|
1b4497fc8f | ||
|
|
a98a9f7122 | ||
|
|
5f7f419759 | ||
|
|
e9fc134236 | ||
|
|
977c4f93a6 | ||
|
|
ee30bc535a | ||
|
|
ca5c467db1 |
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.
|
||||||
|
|||||||
8
.github/dependencies.yml
vendored
8
.github/dependencies.yml
vendored
@@ -27,6 +27,14 @@ 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: 0b0e6daf4197ecabb1ae4f2d46fb148a8e1e73e5
|
||||||
|
precopy: |
|
||||||
|
set -e
|
||||||
|
find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete
|
||||||
|
test -e kube-ps1.sh && mv kube-ps1.sh kube-ps1.plugin.zsh
|
||||||
plugins/wd:
|
plugins/wd:
|
||||||
repo: mfaerevaag/wd
|
repo: mfaerevaag/wd
|
||||||
branch: master
|
branch: master
|
||||||
|
|||||||
11
.github/workflows/dependencies.yml
vendored
11
.github/workflows/dependencies.yml
vendored
@@ -4,27 +4,26 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: "0 6 * * 0"
|
- cron: "0 6 * * 0"
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
check:
|
check:
|
||||||
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)
|
- name: Harden the runner (Audit all outbound calls)
|
||||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Authenticate as @ohmyzsh
|
- name: Authenticate as @ohmyzsh
|
||||||
id: generate-token
|
id: generate-token
|
||||||
uses: actions/create-github-app-token@7e473efe3cb98aa54f8d4bac15400b15fad77d94 # v2.2.0
|
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.OHMYZSH_APP_ID }}
|
app-id: ${{ secrets.OHMYZSH_APP_ID }}
|
||||||
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
certifi==2025.11.12
|
certifi==2026.1.4
|
||||||
charset-normalizer==3.4.4
|
charset-normalizer==3.4.4
|
||||||
idna==3.11
|
idna==3.11
|
||||||
PyYAML==6.0.3
|
PyYAML==6.0.3
|
||||||
requests==2.32.5
|
requests==2.32.5
|
||||||
semver==3.0.4
|
semver==3.0.4
|
||||||
urllib3==2.5.0
|
urllib3==2.6.3
|
||||||
|
|||||||
91
.github/workflows/dependencies/updater.py
vendored
91
.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,32 +226,33 @@ 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 dependencies.yml file
|
|
||||||
self.__update_yaml(
|
|
||||||
f"tag:{new_version}" if is_tag else status["version"]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Update dependency files
|
# Update dependency files
|
||||||
self.__apply_upstream_changes()
|
self.__apply_upstream_changes()
|
||||||
|
|
||||||
# Add all changes and commit
|
if not Git.repo_is_clean():
|
||||||
has_new_commit = Git.add_and_commit(self.name, new_version)
|
# Update dependencies.yml file
|
||||||
|
self.__update_yaml(
|
||||||
if has_new_commit:
|
f"tag:{new_version}" if is_tag else status["version"]
|
||||||
# Push changes to remote
|
|
||||||
Git.push(branch)
|
|
||||||
|
|
||||||
# Create GitHub PR
|
|
||||||
GitHub.create_pr(
|
|
||||||
branch,
|
|
||||||
f"feat({self.name}): update to version {new_version}",
|
|
||||||
f"""## Description
|
|
||||||
|
|
||||||
Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}).
|
|
||||||
Check out the [list of changes]({status['compare_url']}).
|
|
||||||
""",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Add all changes and commit
|
||||||
|
has_new_commit = Git.add_and_commit(self.name, new_version)
|
||||||
|
|
||||||
|
if has_new_commit:
|
||||||
|
# Push changes to remote
|
||||||
|
Git.push(branch)
|
||||||
|
|
||||||
|
# Create GitHub PR
|
||||||
|
GitHub.create_pr(
|
||||||
|
branch,
|
||||||
|
f"chore({self.name}): update to version {new_version}",
|
||||||
|
f"""## Description
|
||||||
|
|
||||||
|
Update for **{self.desc}**: update to version [{new_version}]({status["head_url"]}).
|
||||||
|
Check out the [list of changes]({status["compare_url"]}).
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
|
||||||
# Clean up repository
|
# Clean up repository
|
||||||
Git.clean_repo()
|
Git.clean_repo()
|
||||||
except (CommandRunner.Exception, shutil.Error) as e:
|
except (CommandRunner.Exception, shutil.Error) as e:
|
||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
8
.github/workflows/installer.yml
vendored
8
.github/workflows/installer.yml
vendored
@@ -26,12 +26,12 @@ jobs:
|
|||||||
- macos-latest
|
- macos-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Harden the runner (Audit all outbound calls)
|
- name: Harden the runner (Audit all outbound calls)
|
||||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Set up git repository
|
- name: Set up git repository
|
||||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
- 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
|
||||||
@@ -47,12 +47,12 @@ jobs:
|
|||||||
- test
|
- test
|
||||||
steps:
|
steps:
|
||||||
- name: Harden the runner (Audit all outbound calls)
|
- name: Harden the runner (Audit all outbound calls)
|
||||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
- 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
|
||||||
|
|||||||
4
.github/workflows/main.yml
vendored
4
.github/workflows/main.yml
vendored
@@ -24,12 +24,12 @@ jobs:
|
|||||||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||||
steps:
|
steps:
|
||||||
- name: Harden the runner (Audit all outbound calls)
|
- name: Harden the runner (Audit all outbound calls)
|
||||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
- name: Set up git repository
|
- name: Set up git repository
|
||||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
- 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
|
||||||
|
|||||||
4
.github/workflows/project.yml
vendored
4
.github/workflows/project.yml
vendored
@@ -17,12 +17,12 @@ jobs:
|
|||||||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||||
steps:
|
steps:
|
||||||
- name: Harden the runner (Audit all outbound calls)
|
- name: Harden the runner (Audit all outbound calls)
|
||||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
- name: Authenticate as @ohmyzsh
|
- name: Authenticate as @ohmyzsh
|
||||||
id: generate-token
|
id: generate-token
|
||||||
uses: actions/create-github-app-token@7e473efe3cb98aa54f8d4bac15400b15fad77d94 # v2.2.0
|
uses: actions/create-github-app-token@29824e69f54612133e76f7eaac726eef6c875baf # v2.2.1
|
||||||
with:
|
with:
|
||||||
app-id: ${{ secrets.OHMYZSH_APP_ID }}
|
app-id: ${{ secrets.OHMYZSH_APP_ID }}
|
||||||
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
||||||
|
|||||||
8
.github/workflows/scorecard.yml
vendored
8
.github/workflows/scorecard.yml
vendored
@@ -36,12 +36,12 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Harden the runner (Audit all outbound calls)
|
- name: Harden the runner (Audit all outbound calls)
|
||||||
uses: step-security/harden-runner@95d9a5deda9de15063e7595e9719c11c38c90ae2 # v2.13.2
|
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
|
||||||
with:
|
with:
|
||||||
egress-policy: audit
|
egress-policy: audit
|
||||||
|
|
||||||
- name: "Checkout code"
|
- name: "Checkout code"
|
||||||
uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
@@ -53,13 +53,13 @@ jobs:
|
|||||||
publish_results: true
|
publish_results: true
|
||||||
|
|
||||||
- name: "Upload artifact"
|
- name: "Upload artifact"
|
||||||
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: SARIF file
|
name: SARIF file
|
||||||
path: results.sarif
|
path: results.sarif
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
- name: "Upload to code-scanning"
|
- name: "Upload to code-scanning"
|
||||||
uses: github/codeql-action/upload-sarif@fdbfb4d2750291e159f0156def62b853c2798ca2 # v4.31.5
|
uses: github/codeql-action/upload-sarif@cdefb33c0f6224e58673d9004f47f7cb3e328b89 # v4.31.10
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
|||||||
@@ -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-2025 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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ function _omz_git_prompt_status() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# For each status prefix, do a regex comparison
|
# For each status prefix, do a regex comparison
|
||||||
for status_prefix in ${(k)prefix_constant_map}; do
|
for status_prefix in "${(@k)prefix_constant_map}"; do
|
||||||
local status_constant="${prefix_constant_map[$status_prefix]}"
|
local status_constant="${prefix_constant_map[$status_prefix]}"
|
||||||
local status_regex=$'(^|\n)'"$status_prefix"
|
local status_regex=$'(^|\n)'"$status_prefix"
|
||||||
|
|
||||||
|
|||||||
@@ -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 "$@"
|
||||||
|
|||||||
@@ -35,11 +35,14 @@ the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environmen
|
|||||||
| `bdr` | `brew doctor` | Check your system for potential problems. |
|
| `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. |
|
| `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). |
|
||||||
|
|||||||
@@ -48,10 +48,13 @@ alias bcup='brew upgrade --cask'
|
|||||||
alias bdr='brew doctor'
|
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 bs='brew search'
|
||||||
alias bsl='brew services list'
|
alias bsl='brew services list'
|
||||||
alias bsoff='brew services stop'
|
alias bsoff='brew services stop'
|
||||||
|
|||||||
@@ -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,13 +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
|
/opt/homebrew/Library/Homebrew/command-not-found/handler.sh
|
||||||
/usr/local/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
|
/home/linuxbrew/.linuxbrew/Homebrew/Library/Homebrew/command-not-found/handler.sh
|
||||||
# Old homebrew implementation
|
# 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
|
||||||
|
|||||||
@@ -77,7 +77,15 @@ EOF
|
|||||||
(*.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|*.pk3|*.pk4) 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]* | *.pk7) 7za x "$full_path" ;;
|
(*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;;
|
||||||
|
|||||||
@@ -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" &|
|
|
||||||
@@ -234,40 +234,26 @@ branch exists. We do this via the function `git_main_branch`.
|
|||||||
These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not,
|
These are aliases that have been removed, renamed, or otherwise modified in a way that may, or may not,
|
||||||
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**) |
|
||||||
|
|
||||||
### Work in Progress (WIP)
|
### Work in Progress (WIP)
|
||||||
|
|
||||||
@@ -287,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
|
||||||
@@ -427,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
|
||||||
|
|||||||
@@ -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
|
||||||
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'
|
||||||
@@ -12,6 +12,17 @@ plugins=(... jj)
|
|||||||
|
|
||||||
| Alias | Command |
|
| 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` |
|
| jjc | `jj commit` |
|
||||||
| jjcmsg | `jj commit --message` |
|
| jjcmsg | `jj commit --message` |
|
||||||
| jjd | `jj diff` |
|
| jjd | `jj diff` |
|
||||||
@@ -22,14 +33,20 @@ plugins=(... jj)
|
|||||||
| jjgf | `jj git fetch` |
|
| jjgf | `jj git fetch` |
|
||||||
| jjgfa | `jj git fetch --all-remotes` |
|
| jjgfa | `jj git fetch --all-remotes` |
|
||||||
| jjgp | `jj git push` |
|
| jjgp | `jj git push` |
|
||||||
|
| jjgpa | `jj git push --all` |
|
||||||
|
| jjgpd | `jj git push --deleted` |
|
||||||
|
| jjgpt | `jj git push --tracked` |
|
||||||
| jjl | `jj log` |
|
| jjl | `jj log` |
|
||||||
| jjla | `jj log -r "all()"` |
|
| jjla | `jj log -r "all()"` |
|
||||||
| jjn | `jj new` |
|
| jjn | `jj new` |
|
||||||
|
| jjnt | `jj new "trunk()"` |
|
||||||
| jjrb | `jj rebase` |
|
| jjrb | `jj rebase` |
|
||||||
|
| jjrbm | `jj rebase -d "trunk()"` |
|
||||||
| jjrs | `jj restore` |
|
| jjrs | `jj restore` |
|
||||||
| jjrt | `cd "$(jj root \|\| echo .)"` |
|
| jjrt | `cd "$(jj root \|\| echo .)"` |
|
||||||
| jjsp | `jj split` |
|
| jjsp | `jj split` |
|
||||||
| jjsq | `jj squash` |
|
| jjsq | `jj squash` |
|
||||||
|
| jjst | `jj status` |
|
||||||
|
|
||||||
## Prompt usage
|
## Prompt usage
|
||||||
|
|
||||||
@@ -88,3 +105,4 @@ that.
|
|||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
- [nasso](https://github.com/nasso) - Plugin Author
|
- [nasso](https://github.com/nasso) - Plugin Author
|
||||||
|
- [imp](https://github.com/imp) - Occasional Alias Contributor
|
||||||
|
|||||||
@@ -34,6 +34,17 @@ function jj_prompt_template() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Aliases (sorted alphabetically)
|
# 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 jjc='jj commit'
|
||||||
alias jjcmsg='jj commit --message'
|
alias jjcmsg='jj commit --message'
|
||||||
alias jjd='jj diff'
|
alias jjd='jj diff'
|
||||||
@@ -44,11 +55,17 @@ alias jjgcl='jj git clone'
|
|||||||
alias jjgf='jj git fetch'
|
alias jjgf='jj git fetch'
|
||||||
alias jjgfa='jj git fetch --all-remotes'
|
alias jjgfa='jj git fetch --all-remotes'
|
||||||
alias jjgp='jj git push'
|
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 jjl='jj log'
|
||||||
alias jjla='jj log -r "all()"'
|
alias jjla='jj log -r "all()"'
|
||||||
alias jjn='jj new'
|
alias jjn='jj new'
|
||||||
|
alias jjnt='jj new "trunk()"'
|
||||||
alias jjrb='jj rebase'
|
alias jjrb='jj rebase'
|
||||||
|
alias jjrbm='jj rebase -d "trunk()"'
|
||||||
alias jjrs='jj restore'
|
alias jjrs='jj restore'
|
||||||
alias jjrt='cd "$(jj root || echo .)"'
|
alias jjrt='cd "$(jj root || echo .)"'
|
||||||
alias jjsp='jj split'
|
alias jjsp='jj split'
|
||||||
alias jjsq='jj squash'
|
alias jjsq='jj squash'
|
||||||
|
alias jjst='jj status'
|
||||||
|
|||||||
201
plugins/kube-ps1/LICENSE
Normal file
201
plugins/kube-ps1/LICENSE
Normal file
@@ -0,0 +1,201 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
|
exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation
|
||||||
|
source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but
|
||||||
|
not limited to compiled object code, generated documentation,
|
||||||
|
and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
|
the original version of the Work and any modifications or additions
|
||||||
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
|
means any form of electronic, verbal, or written communication sent
|
||||||
|
to the Licensor or its representatives, including but not limited to
|
||||||
|
communication on electronic mailing lists, source code control systems,
|
||||||
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
|
excluding communication that is conspicuously marked or otherwise
|
||||||
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
|
Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
|
(except as stated in this section) patent license to make, have made,
|
||||||
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
|
where such license applies only to those patent claims licensable
|
||||||
|
by such Contributor that are necessarily infringed by their
|
||||||
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
|
institute patent litigation against any entity (including a
|
||||||
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
|
or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate
|
||||||
|
as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
|
modifications, and in Source or Object form, provided that You
|
||||||
|
meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or
|
||||||
|
Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices
|
||||||
|
stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
|
attribution notices from the Source form of the Work,
|
||||||
|
excluding those notices that do not pertain to any part of
|
||||||
|
the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
|
distribution, then any Derivative Works that You distribute must
|
||||||
|
include a readable copy of the attribution notices contained
|
||||||
|
within such NOTICE file, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works, in at least one
|
||||||
|
of the following places: within a NOTICE text file distributed
|
||||||
|
as part of the Derivative Works; within the Source form or
|
||||||
|
documentation, if provided along with the Derivative Works; or,
|
||||||
|
within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents
|
||||||
|
of the NOTICE file are for informational purposes only and
|
||||||
|
do not modify the License. You may add Your own attribution
|
||||||
|
notices within Derivative Works that You distribute, alongside
|
||||||
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
|
that such additional attribution notices cannot be construed
|
||||||
|
as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
|
the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
|
this License, without any additional terms or conditions.
|
||||||
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
|
the terms of any separate license agreement you may have executed
|
||||||
|
with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
|
except as required for reasonable and customary use in describing the
|
||||||
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied, including, without limitation, any warranties or conditions
|
||||||
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
|
unless required by applicable law (such as deliberate and grossly
|
||||||
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
|
liable to You for damages, including any direct, indirect, special,
|
||||||
|
incidental, or consequential damages of any character arising as a
|
||||||
|
result of this License or out of the use or inability to use the
|
||||||
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
|
other commercial damages or losses), even if such Contributor
|
||||||
|
has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this
|
||||||
|
License. However, in accepting such obligations, You may act only
|
||||||
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
|
defend, and hold each Contributor harmless for any liability
|
||||||
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
|
of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
|
replaced with your own identifying information. (Don't include
|
||||||
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
|
comment syntax for the file format. We also recommend that a
|
||||||
|
file or class name and description of purpose be included on the
|
||||||
|
same "printed page" as the copyright notice for easier
|
||||||
|
identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
@@ -1,49 +1,82 @@
|
|||||||
# kube-ps1: Kubernetes prompt for bash and zsh
|
# kube-ps1: Kubernetes prompt for bash and zsh
|
||||||
|
|
||||||
|

|
||||||
|
[](https://github.com/jonmosco/kube-ps1/actions/workflows/ci.yml)
|
||||||
|
|
||||||
A script that lets you add the current Kubernetes context and namespace
|
A script that lets you add the current Kubernetes context and namespace
|
||||||
configured on `kubectl` to your Bash/Zsh prompt strings (i.e. the `$PS1`).
|
configured on `kubectl` to your Bash/Zsh prompt strings (i.e. the `$PS1`).
|
||||||
|
|
||||||
Inspired by several tools used to simplify usage of `kubectl`.
|
Inspired by several tools used to simplify usage of `kubectl`.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
## Installing
|
## Installing
|
||||||
|
|
||||||
### MacOS
|
### Packages
|
||||||
|
|
||||||
|
### MacOS Brew Ports
|
||||||
|
|
||||||
Homebrew package manager:
|
Homebrew package manager:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew update
|
||||||
|
brew install kube-ps1
|
||||||
```
|
```
|
||||||
$ brew update
|
|
||||||
$ brew install kube-ps1
|
### Arch Linux
|
||||||
|
|
||||||
|
AUR Package available at [https://aur.archlinux.org/packages/kube-ps1/](https://aur.archlinux.org/packages/kube-ps1/).
|
||||||
|
|
||||||
|
### Oh My Zsh
|
||||||
|
|
||||||
|
https://github.com/ohmyzsh/ohmyzsh
|
||||||
|
|
||||||
|
kube-ps1 is included as a plugin in the oh-my-zsh project. To enable it, edit your `~/.zshrc` and
|
||||||
|
add the plugin:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
plugins=(
|
||||||
|
kube-ps1
|
||||||
|
)
|
||||||
|
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
|
||||||
```
|
```
|
||||||
### From Source
|
|
||||||
|
## Zsh zinit plugin
|
||||||
|
|
||||||
|
### Using [zinit](https://github.com/zdharma-continuum/zinit)
|
||||||
|
|
||||||
|
Update `.zshrc` with:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zinit light jonmosco/kube-ps1
|
||||||
|
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Fig
|
||||||
|
|
||||||
|
Install `kube-ps1` in zsh, bash, or fish with one click.
|
||||||
|
|
||||||
|
<a href="https://fig.io/plugins/other/kube-ps1" target="_blank"><img src="https://fig.io/badges/install-with-fig.svg" width="120" /></a>
|
||||||
|
|
||||||
|
### From Source (git clone)
|
||||||
|
|
||||||
1. Clone this repository
|
1. Clone this repository
|
||||||
2. Source the kube-ps1.sh in your `~/.zshrc` or your `~/.bashrc`
|
2. Source the kube-ps1.sh in your `~/.zshrc` or your `~/.bashrc`
|
||||||
|
|
||||||
### Arch Linux
|
|
||||||
AUR Package available at [https://aur.archlinux.org/packages/kube-ps1/](https://aur.archlinux.org/packages/kube-ps1/).
|
|
||||||
|
|
||||||
#### Zsh
|
#### Zsh
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
source /path/to/kube-ps1.sh
|
source /path/to/kube-ps1.sh
|
||||||
PROMPT='$(kube_ps1)'$PROMPT
|
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Bash
|
#### Bash
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
source /path/to/kube-ps1.sh
|
source /path/to/kube-ps1.sh
|
||||||
PS1='[\u@\h \W $(kube_ps1)]\$ '
|
PS1='[\u@\h \W $(kube_ps1)]\$ '
|
||||||
```
|
```
|
||||||
|
|
||||||
### Zsh Plugin Managers
|
|
||||||
|
|
||||||
#### Using [zplugin](https://github.com/zdharma/zplugin)
|
|
||||||
|
|
||||||
Update `.zshrc` with:
|
|
||||||
```sh
|
|
||||||
zplugin light jonmosco/kube-ps1
|
|
||||||
PROMPT='$(kube_ps1)'$PROMPT
|
|
||||||
```
|
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
The default prompt assumes you have the `kubectl` command line utility installed.
|
The default prompt assumes you have the `kubectl` command line utility installed.
|
||||||
@@ -54,22 +87,23 @@ Official installation instructions and binaries are available:
|
|||||||
If using this with OpenShift, the `oc` tool needs installed. It can be obtained
|
If using this with OpenShift, the `oc` tool needs installed. It can be obtained
|
||||||
from brew ports:
|
from brew ports:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
brew install openshift-cli
|
brew install openshift-cli
|
||||||
```
|
```
|
||||||
|
|
||||||
or the source can be downloaded:
|
or the source can be downloaded:
|
||||||
|
|
||||||
[OC Client Tools](https://www.openshift.org/download.html)
|
[OC Client Tools](https://github.com/okd-project/okd/releases)
|
||||||
|
|
||||||
Set the binary to `oc` with the following environment variable:
|
Set the binary to `oc` with the following variable:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
KUBE_PS1_BINARY=oc
|
KUBE_PS1_BINARY=oc
|
||||||
```
|
```
|
||||||
|
|
||||||
If neither binary is available, the prompt will print the following:
|
If neither binary is available, the prompt will print the following:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
(<symbol>|BINARY-N/A:N/A)
|
(<symbol>|BINARY-N/A:N/A)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -90,13 +124,13 @@ tmux, and like the functionality provided by kube-ps1, checkout the
|
|||||||
|
|
||||||
The default prompt layout is:
|
The default prompt layout is:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
(<symbol>|<context>:<namespace>)
|
(<symbol>|<context>:<namespace>)
|
||||||
```
|
```
|
||||||
|
|
||||||
If the current-context is not set, kube-ps1 will return the following:
|
If the current-context is not set, kube-ps1 will return the following:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
(<symbol>|N/A:N/A)
|
(<symbol>|N/A:N/A)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -107,7 +141,7 @@ run `kubeoff`. To disable the prompt for all shell sessions, run `kubeoff -g`.
|
|||||||
You can enable it again in the current shell by running `kubeon`, and globally
|
You can enable it again in the current shell by running `kubeon`, and globally
|
||||||
with `kubeon -g`.
|
with `kubeon -g`.
|
||||||
|
|
||||||
```
|
```sh
|
||||||
kubeon : turn on kube-ps1 status for this shell. Takes precedence over
|
kubeon : turn on kube-ps1 status for this shell. Takes precedence over
|
||||||
global setting for current session
|
global setting for current session
|
||||||
kubeon -g : turn on kube-ps1 status globally
|
kubeon -g : turn on kube-ps1 status globally
|
||||||
@@ -116,39 +150,69 @@ kubeoff : turn off kube-ps1 status for this shell. Takes precedence over
|
|||||||
kubeoff -g : turn off kube-ps1 status globally
|
kubeoff -g : turn off kube-ps1 status globally
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Symbol
|
||||||
|
|
||||||
|
The default symbols are UTF8 and should work with most fonts. If you want to use the Kubernetes and OpenShift
|
||||||
|
glyphs, you need to install a patched font that contains the glyph. [Nerd Fonts](https://www.nerdfonts.com/) provides both glyphs. Follow their installation instructions to install the patched font.
|
||||||
|
|
||||||
|
`KUBE_PS1_SYMBOL_CUSTOM` options
|
||||||
|
|
||||||
|
| Options | Symbol | Description |
|
||||||
|
| ------------- | ------ | ----------- |
|
||||||
|
| default (empty string) | ⎈ | Default symbol (Unicode `\u2388`) |
|
||||||
|
| img | ☸️ | Symbol often used to represent Kubernetes (Unicode `\u2638`) |
|
||||||
|
| oc |  | Symbol representing OpenShift (Unicode `\ue7b7`) |
|
||||||
|
| k8s |  | Symbol representing Kubernetes (Unicode `\ue7b7`) |
|
||||||
|
|
||||||
|
To set the symbol to one of the custom glyphs, add the following to your `~/.bashrc` or `~/.zshrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
KUBE_PS1_SYMBOL_CUSTOM=img
|
||||||
|
```
|
||||||
|
|
||||||
|
To set the symbol to the default, set the `KUBE_PS1_SYMBOL` to an empty string.
|
||||||
|
|
||||||
|
Heres a demo of the symbols in action:
|
||||||
|

|
||||||
|
|
||||||
|
If the font is not properly installed, and the glyph is not available, it will display an empty set of brackets or similar:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
echo -n "\ue7b7"
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
## Customization
|
## Customization
|
||||||
|
|
||||||
The default settings can be overridden in `~/.bashrc` or `~/.zshrc` by setting
|
The default settings can be overridden in `~/.bashrc` or `~/.zshrc` by setting
|
||||||
the following environment variables:
|
the following variables:
|
||||||
|
|
||||||
| Variable | Default | Meaning |
|
| Variable | Default | Meaning |
|
||||||
| :------- | :-----: | ------- |
|
| :------- | :-----: | ------- |
|
||||||
| `KUBE_PS1_BINARY` | `kubectl` | Default Kubernetes binary |
|
| `KUBE_PS1_BINARY` | `kubectl` | Default Kubernetes binary |
|
||||||
| `KUBE_PS1_NS_ENABLE` | `true` | Display the namespace. If set to `false`, this will also disable `KUBE_PS1_DIVIDER` |
|
| `KUBE_PS1_NS_ENABLE` | `true` | Display the namespace. If set to `false`, this will also disable `KUBE_PS1_DIVIDER` |
|
||||||
| `KUBE_PS1_PREFIX` | `(` | Prompt opening character |
|
| `KUBE_PS1_PREFIX` | `(` | Prompt opening character |
|
||||||
| `KUBE_PS1_SYMBOL_ENABLE` | `true ` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` |
|
| `KUBE_PS1_SYMBOL_ENABLE` | `true` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` |
|
||||||
| `KUBE_PS1_SYMBOL_PADDING` | `false` | Adds a space (padding) after the symbol to prevent clobbering prompt characters |
|
| `KUBE_PS1_SYMBOL_PADDING` | `false` | Adds a space (padding) after the symbol to prevent clobbering prompt characters |
|
||||||
| `KUBE_PS1_SYMBOL_DEFAULT` | `⎈ ` | Default prompt symbol. Unicode `\u2388` |
|
| `KUBE_PS1_SYMBOL_CUSTOM` | `⎈` | Change the Default prompt symbol. Unicode `\u2388`. Options are `k8s`, `img`, `oc` |
|
||||||
| `KUBE_PS1_SYMBOL_USE_IMG` | `false` | ☸️ , Unicode `\u2638` as the prompt symbol |
|
| `KUBE_PS1_SYMBOL_COLOR` | `blue` | Change the Default symbol color. |
|
||||||
| `KUBE_PS1_SEPARATOR` | | | Separator between symbol and context name |
|
| `KUBE_PS1_SEPARATOR` | | | Separator between symbol and context name |
|
||||||
| `KUBE_PS1_DIVIDER` | `:` | Separator between context and namespace |
|
| `KUBE_PS1_DIVIDER` | `:` | Separator between context and namespace |
|
||||||
| `KUBE_PS1_SUFFIX` | `)` | Prompt closing character |
|
| `KUBE_PS1_SUFFIX` | `)` | Prompt closing character |
|
||||||
| `KUBE_PS1_CLUSTER_FUNCTION` | No default, must be user supplied | Function to customize how cluster is displayed |
|
| `KUBE_PS1_CLUSTER_FUNCTION` | No default, must be user supplied | Function to customize how cluster is displayed |
|
||||||
| `KUBE_PS1_NAMESPACE_FUNCTION` | No default, must be user supplied | Function to customize how namespace is displayed |
|
| `KUBE_PS1_NAMESPACE_FUNCTION` | No default, must be user supplied | Function to customize how namespace is displayed |
|
||||||
| `KUBE_PS1_KUBECONFIG_SYMLINK` | `false` | Treat `KUBECONFIG` and `~/.kube/config` files as symbolic links |
|
| `KUBE_PS1_CTX_COLOR_FUNCTION` | No default, must be user supplied | Function to customize context color based on context name |
|
||||||
|
| `KUBE_PS1_HIDE_IF_NOCONTEXT` | `false` | Hide the kube-ps1 prompt if no context is set |
|
||||||
For terminals that do not support UTF-8, the symbol will be replaced with the
|
|
||||||
string `k8s`.
|
|
||||||
|
|
||||||
To disable a feature, set it to an empty string:
|
To disable a feature, set it to an empty string:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
KUBE_PS1_SEPARATOR=''
|
KUBE_PS1_SEPARATOR=''
|
||||||
```
|
```
|
||||||
|
|
||||||
## Colors
|
## Colors
|
||||||
|
|
||||||
The default colors are set with the following environment variables:
|
The default colors are set with the following variables:
|
||||||
|
|
||||||
| Variable | Default | Meaning |
|
| Variable | Default | Meaning |
|
||||||
| :------- | :-----: | ------- |
|
| :------- | :-----: | ------- |
|
||||||
@@ -166,13 +230,13 @@ namespace.
|
|||||||
Set the variable to an empty string if you do not want color for each
|
Set the variable to an empty string if you do not want color for each
|
||||||
prompt section:
|
prompt section:
|
||||||
|
|
||||||
```
|
```sh
|
||||||
KUBE_PS1_CTX_COLOR=''
|
KUBE_PS1_CTX_COLOR=''
|
||||||
```
|
```
|
||||||
|
|
||||||
Names are usable for the following colors:
|
Names are usable for the following colors:
|
||||||
|
|
||||||
```
|
```text
|
||||||
black, red, green, yellow, blue, magenta, cyan
|
black, red, green, yellow, blue, magenta, cyan
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -216,6 +280,45 @@ export KUBE_PS1_NAMESPACE_FUNCTION=get_namespace_upper
|
|||||||
|
|
||||||
In both cases, the variable is set to the name of the function, and you must have defined the function in your shell configuration before kube_ps1 is called. The function must accept a single parameter and echo out the final value.
|
In both cases, the variable is set to the name of the function, and you must have defined the function in your shell configuration before kube_ps1 is called. The function must accept a single parameter and echo out the final value.
|
||||||
|
|
||||||
|
## Dynamic Context Colors
|
||||||
|
|
||||||
|
You can set different colors for different contexts using the
|
||||||
|
`KUBE_PS1_CTX_COLOR_FUNCTION` variable. This is useful for color-coding
|
||||||
|
contexts to make production environments stand out visually.
|
||||||
|
|
||||||
|
For example, to make production contexts red and development contexts green:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
function kube_ps1_ctx_color() {
|
||||||
|
local context="$1"
|
||||||
|
|
||||||
|
case "$context" in
|
||||||
|
*prod*)
|
||||||
|
echo "red"
|
||||||
|
;;
|
||||||
|
*dev*)
|
||||||
|
echo "green"
|
||||||
|
;;
|
||||||
|
*staging*|*stg*)
|
||||||
|
echo "yellow"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "cyan" # default color for other contexts
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
export KUBE_PS1_CTX_COLOR_FUNCTION=kube_ps1_ctx_color
|
||||||
|
```
|
||||||
|
|
||||||
|
The function receives the context name as the first parameter and should echo
|
||||||
|
the desired color name. All color options supported by `KUBE_PS1_CTX_COLOR` are
|
||||||
|
available, including named colors (black, red, green, yellow, blue, magenta,
|
||||||
|
cyan, white) and 256-color codes (0-256).
|
||||||
|
|
||||||
|
If `KUBE_PS1_CTX_COLOR_FUNCTION` is not set, kube-ps1 will use the value of
|
||||||
|
`KUBE_PS1_CTX_COLOR` (default: red).
|
||||||
|
|
||||||
### Bug Reports and shell configuration
|
### Bug Reports and shell configuration
|
||||||
|
|
||||||
Due to the vast ways of customizing the shell, please try the prompt with a
|
Due to the vast ways of customizing the shell, please try the prompt with a
|
||||||
@@ -224,18 +327,28 @@ minimal configuration before submitting a bug report.
|
|||||||
This can be done as follows for each shell before loading kube-ps1:
|
This can be done as follows for each shell before loading kube-ps1:
|
||||||
|
|
||||||
Bash:
|
Bash:
|
||||||
```bash
|
|
||||||
|
```sh
|
||||||
bash --norc
|
bash --norc
|
||||||
```
|
```
|
||||||
|
|
||||||
Zsh:
|
Zsh:
|
||||||
```bash
|
|
||||||
|
```sh
|
||||||
zsh -f
|
zsh -f
|
||||||
or
|
or
|
||||||
zsh --no-rcs
|
zsh --no-rcs
|
||||||
```
|
```
|
||||||
|
|
||||||
## Contributors
|
For the prompt symbol, a patched font that contains the glyphs must be installed.
|
||||||
|
[Nerd Fonts Downloads](https://www.nerdfonts.com/font-downloads) provides patched
|
||||||
|
fonts containing the glyphs. Please consult their documentation for this, support
|
||||||
|
is out of scope for this project.
|
||||||
|
|
||||||
* [Ahmet Alp Balkan](https://github.com/ahmetb)
|
### Contributors
|
||||||
* Jared Yanovich
|
|
||||||
|
Thank you to everyone in the community for their contributions to kube-ps1!
|
||||||
|
|
||||||
|
<a href="https://github.com/jonmosco/kube-ps1/graphs/contributors">
|
||||||
|
<img src="https://contrib.rocks/image?repo=jonmosco/kube-ps1" />
|
||||||
|
</a>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
# Kubernetes prompt helper for bash/zsh
|
# Kubernetes prompt helper for bash/zsh
|
||||||
# Displays current context and namespace
|
# Displays current context and namespace
|
||||||
|
|
||||||
# Copyright 2021 Jon Mosco
|
# Copyright 2026 Jon Mosco
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@@ -24,9 +24,9 @@
|
|||||||
# Override these values in ~/.zshrc or ~/.bashrc
|
# Override these values in ~/.zshrc or ~/.bashrc
|
||||||
KUBE_PS1_BINARY="${KUBE_PS1_BINARY:-kubectl}"
|
KUBE_PS1_BINARY="${KUBE_PS1_BINARY:-kubectl}"
|
||||||
KUBE_PS1_SYMBOL_ENABLE="${KUBE_PS1_SYMBOL_ENABLE:-true}"
|
KUBE_PS1_SYMBOL_ENABLE="${KUBE_PS1_SYMBOL_ENABLE:-true}"
|
||||||
KUBE_PS1_SYMBOL_DEFAULT=${KUBE_PS1_SYMBOL_DEFAULT:-$'\u2388'}
|
|
||||||
KUBE_PS1_SYMBOL_PADDING="${KUBE_PS1_SYMBOL_PADDING:-false}"
|
KUBE_PS1_SYMBOL_PADDING="${KUBE_PS1_SYMBOL_PADDING:-false}"
|
||||||
KUBE_PS1_SYMBOL_USE_IMG="${KUBE_PS1_SYMBOL_USE_IMG:-false}"
|
KUBE_PS1_SYMBOL_COLOR="${KUBE_PS1_SYMBOL_COLOR:-}"
|
||||||
|
|
||||||
KUBE_PS1_NS_ENABLE="${KUBE_PS1_NS_ENABLE:-true}"
|
KUBE_PS1_NS_ENABLE="${KUBE_PS1_NS_ENABLE:-true}"
|
||||||
KUBE_PS1_CONTEXT_ENABLE="${KUBE_PS1_CONTEXT_ENABLE:-true}"
|
KUBE_PS1_CONTEXT_ENABLE="${KUBE_PS1_CONTEXT_ENABLE:-true}"
|
||||||
KUBE_PS1_PREFIX="${KUBE_PS1_PREFIX-(}"
|
KUBE_PS1_PREFIX="${KUBE_PS1_PREFIX-(}"
|
||||||
@@ -34,29 +34,28 @@ KUBE_PS1_SEPARATOR="${KUBE_PS1_SEPARATOR-|}"
|
|||||||
KUBE_PS1_DIVIDER="${KUBE_PS1_DIVIDER-:}"
|
KUBE_PS1_DIVIDER="${KUBE_PS1_DIVIDER-:}"
|
||||||
KUBE_PS1_SUFFIX="${KUBE_PS1_SUFFIX-)}"
|
KUBE_PS1_SUFFIX="${KUBE_PS1_SUFFIX-)}"
|
||||||
|
|
||||||
KUBE_PS1_SYMBOL_COLOR="${KUBE_PS1_SYMBOL_COLOR-blue}"
|
KUBE_PS1_HIDE_IF_NOCONTEXT="${KUBE_PS1_HIDE_IF_NOCONTEXT:-false}"
|
||||||
KUBE_PS1_CTX_COLOR="${KUBE_PS1_CTX_COLOR-red}"
|
|
||||||
KUBE_PS1_NS_COLOR="${KUBE_PS1_NS_COLOR-cyan}"
|
|
||||||
KUBE_PS1_BG_COLOR="${KUBE_PS1_BG_COLOR}"
|
|
||||||
|
|
||||||
KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}"
|
_KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}"
|
||||||
KUBE_PS1_KUBECONFIG_SYMLINK="${KUBE_PS1_KUBECONFIG_SYMLINK:-false}"
|
_KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled"
|
||||||
KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled"
|
_KUBE_PS1_LAST_TIME=0
|
||||||
KUBE_PS1_LAST_TIME=0
|
|
||||||
KUBE_PS1_CLUSTER_FUNCTION="${KUBE_PS1_CLUSTER_FUNCTION}"
|
|
||||||
KUBE_PS1_NAMESPACE_FUNCTION="${KUBE_PS1_NAMESPACE_FUNCTION}"
|
|
||||||
|
|
||||||
# Determine our shell
|
# Determine our shell
|
||||||
if [ "${ZSH_VERSION-}" ]; then
|
_kube_ps1_shell_type() {
|
||||||
KUBE_PS1_SHELL="zsh"
|
local _KUBE_PS1_SHELL_TYPE
|
||||||
elif [ "${BASH_VERSION-}" ]; then
|
|
||||||
KUBE_PS1_SHELL="bash"
|
if [ "${ZSH_VERSION-}" ]; then
|
||||||
fi
|
_KUBE_PS1_SHELL_TYPE="zsh"
|
||||||
|
elif [ "${BASH_VERSION-}" ]; then
|
||||||
|
_KUBE_PS1_SHELL_TYPE="bash"
|
||||||
|
fi
|
||||||
|
echo $_KUBE_PS1_SHELL_TYPE
|
||||||
|
}
|
||||||
|
|
||||||
_kube_ps1_init() {
|
_kube_ps1_init() {
|
||||||
[[ -f "${KUBE_PS1_DISABLE_PATH}" ]] && KUBE_PS1_ENABLED=off
|
[[ -f "${_KUBE_PS1_DISABLE_PATH}" ]] && KUBE_PS1_ENABLED=off
|
||||||
|
|
||||||
case "${KUBE_PS1_SHELL}" in
|
case "$(_kube_ps1_shell_type)" in
|
||||||
"zsh")
|
"zsh")
|
||||||
_KUBE_PS1_OPEN_ESC="%{"
|
_KUBE_PS1_OPEN_ESC="%{"
|
||||||
_KUBE_PS1_CLOSE_ESC="%}"
|
_KUBE_PS1_CLOSE_ESC="%}"
|
||||||
@@ -64,7 +63,7 @@ _kube_ps1_init() {
|
|||||||
_KUBE_PS1_DEFAULT_FG="%f"
|
_KUBE_PS1_DEFAULT_FG="%f"
|
||||||
setopt PROMPT_SUBST
|
setopt PROMPT_SUBST
|
||||||
autoload -U add-zsh-hook
|
autoload -U add-zsh-hook
|
||||||
add-zsh-hook precmd _kube_ps1_update_cache
|
add-zsh-hook precmd _kube_ps1_prompt_update
|
||||||
zmodload -F zsh/stat b:zstat
|
zmodload -F zsh/stat b:zstat
|
||||||
zmodload zsh/datetime
|
zmodload zsh/datetime
|
||||||
;;
|
;;
|
||||||
@@ -73,75 +72,75 @@ _kube_ps1_init() {
|
|||||||
_KUBE_PS1_CLOSE_ESC=$'\002'
|
_KUBE_PS1_CLOSE_ESC=$'\002'
|
||||||
_KUBE_PS1_DEFAULT_BG=$'\033[49m'
|
_KUBE_PS1_DEFAULT_BG=$'\033[49m'
|
||||||
_KUBE_PS1_DEFAULT_FG=$'\033[39m'
|
_KUBE_PS1_DEFAULT_FG=$'\033[39m'
|
||||||
[[ $PROMPT_COMMAND =~ _kube_ps1_update_cache ]] || PROMPT_COMMAND="_kube_ps1_update_cache;${PROMPT_COMMAND:-:}"
|
[[ $PROMPT_COMMAND =~ _kube_ps1_prompt_update ]] || PROMPT_COMMAND="_kube_ps1_prompt_update;${PROMPT_COMMAND:-:}"
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_color_fg() {
|
_kube_ps1_color_fg() {
|
||||||
local KUBE_PS1_FG_CODE
|
local _KUBE_PS1_FG_CODE
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
black) KUBE_PS1_FG_CODE=0;;
|
black) _KUBE_PS1_FG_CODE=0;;
|
||||||
red) KUBE_PS1_FG_CODE=1;;
|
red) _KUBE_PS1_FG_CODE=1;;
|
||||||
green) KUBE_PS1_FG_CODE=2;;
|
green) _KUBE_PS1_FG_CODE=2;;
|
||||||
yellow) KUBE_PS1_FG_CODE=3;;
|
yellow) _KUBE_PS1_FG_CODE=3;;
|
||||||
blue) KUBE_PS1_FG_CODE=4;;
|
blue) _KUBE_PS1_FG_CODE=4;;
|
||||||
magenta) KUBE_PS1_FG_CODE=5;;
|
magenta) _KUBE_PS1_FG_CODE=5;;
|
||||||
cyan) KUBE_PS1_FG_CODE=6;;
|
cyan) _KUBE_PS1_FG_CODE=6;;
|
||||||
white) KUBE_PS1_FG_CODE=7;;
|
white) _KUBE_PS1_FG_CODE=7;;
|
||||||
# 256
|
# 256
|
||||||
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) KUBE_PS1_FG_CODE="${1}";;
|
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) _KUBE_PS1_FG_CODE="${1}";;
|
||||||
*) KUBE_PS1_FG_CODE=default
|
*) _KUBE_PS1_FG_CODE=default
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "${KUBE_PS1_FG_CODE}" == "default" ]]; then
|
if [[ "${_KUBE_PS1_FG_CODE}" == "default" ]]; then
|
||||||
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||||
return
|
return
|
||||||
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||||
KUBE_PS1_FG_CODE="%F{$KUBE_PS1_FG_CODE}"
|
_KUBE_PS1_FG_CODE="%F{$_KUBE_PS1_FG_CODE}"
|
||||||
elif [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
|
elif [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
|
||||||
if tput setaf 1 &> /dev/null; then
|
if tput setaf 1 &> /dev/null; then
|
||||||
KUBE_PS1_FG_CODE="$(tput setaf ${KUBE_PS1_FG_CODE})"
|
_KUBE_PS1_FG_CODE="$(tput setaf "${_KUBE_PS1_FG_CODE}")"
|
||||||
elif [[ $KUBE_PS1_FG_CODE -ge 0 ]] && [[ $KUBE_PS1_FG_CODE -le 256 ]]; then
|
elif [[ $_KUBE_PS1_FG_CODE -ge 0 ]] && [[ $_KUBE_PS1_FG_CODE -le 256 ]]; then
|
||||||
KUBE_PS1_FG_CODE="\033[38;5;${KUBE_PS1_FG_CODE}m"
|
_KUBE_PS1_FG_CODE="\033[38;5;${_KUBE_PS1_FG_CODE}m"
|
||||||
else
|
else
|
||||||
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo ${_KUBE_PS1_OPEN_ESC}${KUBE_PS1_FG_CODE}${_KUBE_PS1_CLOSE_ESC}
|
echo "${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_FG_CODE}${_KUBE_PS1_CLOSE_ESC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_color_bg() {
|
_kube_ps1_color_bg() {
|
||||||
local KUBE_PS1_BG_CODE
|
local _KUBE_PS1_BG_CODE
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
black) KUBE_PS1_BG_CODE=0;;
|
black) _KUBE_PS1_BG_CODE=0;;
|
||||||
red) KUBE_PS1_BG_CODE=1;;
|
red) _KUBE_PS1_BG_CODE=1;;
|
||||||
green) KUBE_PS1_BG_CODE=2;;
|
green) _KUBE_PS1_BG_CODE=2;;
|
||||||
yellow) KUBE_PS1_BG_CODE=3;;
|
yellow) _KUBE_PS1_BG_CODE=3;;
|
||||||
blue) KUBE_PS1_BG_CODE=4;;
|
blue) _KUBE_PS1_BG_CODE=4;;
|
||||||
magenta) KUBE_PS1_BG_CODE=5;;
|
magenta) _KUBE_PS1_BG_CODE=5;;
|
||||||
cyan) KUBE_PS1_BG_CODE=6;;
|
cyan) _KUBE_PS1_BG_CODE=6;;
|
||||||
white) KUBE_PS1_BG_CODE=7;;
|
white) _KUBE_PS1_BG_CODE=7;;
|
||||||
# 256
|
# 256
|
||||||
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) KUBE_PS1_BG_CODE="${1}";;
|
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) _KUBE_PS1_BG_CODE="${1}";;
|
||||||
*) KUBE_PS1_BG_CODE=$'\033[0m';;
|
*) _KUBE_PS1_BG_CODE=$'\033[0m';;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "${KUBE_PS1_BG_CODE}" == "default" ]]; then
|
if [[ "${_KUBE_PS1_BG_CODE}" == "default" ]]; then
|
||||||
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_BG}"
|
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_BG}"
|
||||||
return
|
return
|
||||||
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||||
KUBE_PS1_BG_CODE="%K{$KUBE_PS1_BG_CODE}"
|
_KUBE_PS1_BG_CODE="%K{$_KUBE_PS1_BG_CODE}"
|
||||||
elif [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
|
elif [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
|
||||||
if tput setaf 1 &> /dev/null; then
|
if tput setaf 1 &> /dev/null; then
|
||||||
KUBE_PS1_BG_CODE="$(tput setab ${KUBE_PS1_BG_CODE})"
|
_KUBE_PS1_BG_CODE="$(tput setab "${_KUBE_PS1_BG_CODE}")"
|
||||||
elif [[ $KUBE_PS1_BG_CODE -ge 0 ]] && [[ $KUBE_PS1_BG_CODE -le 256 ]]; then
|
elif [[ $_KUBE_PS1_BG_CODE -ge 0 ]] && [[ $_KUBE_PS1_BG_CODE -le 256 ]]; then
|
||||||
KUBE_PS1_BG_CODE="\033[48;5;${KUBE_PS1_BG_CODE}m"
|
_KUBE_PS1_BG_CODE="\033[48;5;${_KUBE_PS1_BG_CODE}m"
|
||||||
else
|
else
|
||||||
KUBE_PS1_BG_CODE="${DEFAULT_BG}"
|
_KUBE_PS1_BG_CODE="${DEFAULT_BG}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
echo ${OPEN_ESC}${KUBE_PS1_BG_CODE}${CLOSE_ESC}
|
echo "${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_BG_CODE}${_KUBE_PS1_CLOSE_ESC}"
|
||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_binary_check() {
|
_kube_ps1_binary_check() {
|
||||||
@@ -149,38 +148,60 @@ _kube_ps1_binary_check() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_symbol() {
|
_kube_ps1_symbol() {
|
||||||
|
# Exit early if symbol display is disabled
|
||||||
[[ "${KUBE_PS1_SYMBOL_ENABLE}" == false ]] && return
|
[[ "${KUBE_PS1_SYMBOL_ENABLE}" == false ]] && return
|
||||||
|
|
||||||
case "${KUBE_PS1_SHELL}" in
|
local symbol_arg="${KUBE_PS1_SYMBOL_CUSTOM}"
|
||||||
bash)
|
|
||||||
if ((BASH_VERSINFO[0] >= 4)) && [[ $'\u2388' != "\\u2388" ]]; then
|
local symbol=""
|
||||||
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}"
|
local symbol_default=$'\u2388'
|
||||||
KUBE_PS1_SYMBOL_IMG=$'\u2638\ufe0f'
|
local symbol_img="☸️"
|
||||||
else
|
local k8s_glyph=$'\Uf10fe'
|
||||||
KUBE_PS1_SYMBOL=$'\xE2\x8E\x88'
|
local k8s_symbol_color=blue
|
||||||
KUBE_PS1_SYMBOL_IMG=$'\xE2\x98\xB8'
|
local oc_glyph=$'\ue7b7'
|
||||||
fi
|
local oc_symbol_color=red
|
||||||
|
local custom_symbol_color="${KUBE_PS1_SYMBOL_COLOR:-$k8s_symbol_color}"
|
||||||
|
|
||||||
|
# Choose the symbol based on the provided argument or environment variable
|
||||||
|
case "${symbol_arg}" in
|
||||||
|
"img")
|
||||||
|
symbol="${symbol_img}"
|
||||||
|
;;
|
||||||
|
"k8s")
|
||||||
|
symbol="$(_kube_ps1_color_fg "${custom_symbol_color}")${k8s_glyph}${KUBE_PS1_RESET_COLOR}"
|
||||||
|
;;
|
||||||
|
"oc")
|
||||||
|
symbol="$(_kube_ps1_color_fg ${oc_symbol_color})${oc_glyph}${KUBE_PS1_RESET_COLOR}"
|
||||||
;;
|
;;
|
||||||
zsh)
|
|
||||||
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}"
|
|
||||||
KUBE_PS1_SYMBOL_IMG="\u2638";;
|
|
||||||
*)
|
*)
|
||||||
KUBE_PS1_SYMBOL="k8s"
|
case "$(_kube_ps1_shell_type)" in
|
||||||
|
bash)
|
||||||
|
if ((BASH_VERSINFO[0] >= 4)) && [[ $'\u2388' != "\\u2388" ]]; then
|
||||||
|
symbol="$(_kube_ps1_color_fg $custom_symbol_color)${symbol_default}${KUBE_PS1_RESET_COLOR}"
|
||||||
|
symbol_img=$'\u2638\ufe0f'
|
||||||
|
else
|
||||||
|
symbol=$'\xE2\x8E\x88'
|
||||||
|
symbol_img=$'\xE2\x98\xB8'
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
zsh)
|
||||||
|
symbol="$(_kube_ps1_color_fg $custom_symbol_color)${symbol_default}${KUBE_PS1_RESET_COLOR}"
|
||||||
|
symbol_img="☸️"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
symbol="k8s"
|
||||||
|
esac
|
||||||
esac
|
esac
|
||||||
|
|
||||||
if [[ "${KUBE_PS1_SYMBOL_USE_IMG}" == true ]]; then
|
# Append padding if enabled
|
||||||
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_IMG}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${KUBE_PS1_SYMBOL_PADDING}" == true ]]; then
|
if [[ "${KUBE_PS1_SYMBOL_PADDING}" == true ]]; then
|
||||||
echo "${KUBE_PS1_SYMBOL} "
|
echo "${symbol} "
|
||||||
else
|
else
|
||||||
echo "${KUBE_PS1_SYMBOL}"
|
echo "${symbol}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_split() {
|
_kube_ps1_split_config() {
|
||||||
type setopt >/dev/null 2>&1 && setopt SH_WORD_SPLIT
|
type setopt >/dev/null 2>&1 && setopt SH_WORD_SPLIT
|
||||||
local IFS=$1
|
local IFS=$1
|
||||||
echo $2
|
echo $2
|
||||||
@@ -191,32 +212,21 @@ _kube_ps1_file_newer_than() {
|
|||||||
local file=$1
|
local file=$1
|
||||||
local check_time=$2
|
local check_time=$2
|
||||||
|
|
||||||
if [[ "${KUBE_PS1_KUBECONFIG_SYMLINK}" == "true" ]]; then
|
if [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||||
if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
# Use zstat '-F %s.%s' to make it compatible with low zsh version (eg: 5.0.2)
|
||||||
mtime=$(zstat -L +mtime "${file}")
|
mtime=$(zstat -L +mtime -F %s.%s "${file}")
|
||||||
elif stat -c "%s" /dev/null &> /dev/null; then
|
elif stat -c "%s" /dev/null &> /dev/null; then
|
||||||
# GNU stat
|
# GNU stat
|
||||||
mtime=$(stat -c %Y "${file}")
|
mtime=$(stat -L -c %Y "${file}")
|
||||||
else
|
|
||||||
# BSD stat
|
|
||||||
mtime=$(stat -f %m "$file")
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
# BSD stat
|
||||||
mtime=$(zstat +mtime "${file}")
|
mtime=$(stat -L -f %m "$file")
|
||||||
elif stat -c "%s" /dev/null &> /dev/null; then
|
|
||||||
# GNU stat
|
|
||||||
mtime=$(stat -L -c %Y "${file}")
|
|
||||||
else
|
|
||||||
# BSD stat
|
|
||||||
mtime=$(stat -L -f %m "$file")
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[[ "${mtime}" -gt "${check_time}" ]]
|
[[ "${mtime}" -gt "${check_time}" ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_update_cache() {
|
_kube_ps1_prompt_update() {
|
||||||
local return_code=$?
|
local return_code=$?
|
||||||
|
|
||||||
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return $return_code
|
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return $return_code
|
||||||
@@ -225,27 +235,35 @@ _kube_ps1_update_cache() {
|
|||||||
# No ability to fetch context/namespace; display N/A.
|
# No ability to fetch context/namespace; display N/A.
|
||||||
KUBE_PS1_CONTEXT="BINARY-N/A"
|
KUBE_PS1_CONTEXT="BINARY-N/A"
|
||||||
KUBE_PS1_NAMESPACE="N/A"
|
KUBE_PS1_NAMESPACE="N/A"
|
||||||
return
|
return $return_code
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "${KUBECONFIG}" != "${KUBE_PS1_KUBECONFIG_CACHE}" ]]; then
|
if [[ "${KUBECONFIG}" != "${_KUBE_PS1_KUBECONFIG_CACHE}" ]]; then
|
||||||
# User changed KUBECONFIG; unconditionally refetch.
|
# User changed KUBECONFIG; unconditionally refetch.
|
||||||
KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG}
|
_KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG}
|
||||||
_kube_ps1_get_context_ns
|
_kube_ps1_get_context_ns
|
||||||
return
|
return $return_code
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# kubectl will read the environment variable $KUBECONFIG
|
# kubectl will read the environment variable $KUBECONFIG
|
||||||
# otherwise set it to ~/.kube/config
|
# otherwise set it to ~/.kube/config
|
||||||
local conf
|
local conf
|
||||||
for conf in $(_kube_ps1_split : "${KUBECONFIG:-${HOME}/.kube/config}"); do
|
local config_file_cache
|
||||||
|
|
||||||
|
for conf in $(_kube_ps1_split_config : "${KUBECONFIG:-${HOME}/.kube/config}"); do
|
||||||
[[ -r "${conf}" ]] || continue
|
[[ -r "${conf}" ]] || continue
|
||||||
if _kube_ps1_file_newer_than "${conf}" "${KUBE_PS1_LAST_TIME}"; then
|
config_file_cache+=":${conf}"
|
||||||
|
if _kube_ps1_file_newer_than "${conf}" "${_KUBE_PS1_LAST_TIME}"; then
|
||||||
_kube_ps1_get_context_ns
|
_kube_ps1_get_context_ns
|
||||||
return
|
return $return_code
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
if [[ "${config_file_cache}" != "${_KUBE_PS1_CFGFILES_READ_CACHE}" ]]; then
|
||||||
|
_kube_ps1_get_context_ns
|
||||||
|
return $return_code
|
||||||
|
fi
|
||||||
|
|
||||||
return $return_code
|
return $return_code
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,8 +273,8 @@ _kube_ps1_get_context() {
|
|||||||
# Set namespace to 'N/A' if it is not defined
|
# Set namespace to 'N/A' if it is not defined
|
||||||
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
|
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
|
||||||
|
|
||||||
if [[ ! -z "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
|
if [[ -n "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
|
||||||
KUBE_PS1_CONTEXT=$($KUBE_PS1_CLUSTER_FUNCTION $KUBE_PS1_CONTEXT)
|
KUBE_PS1_CONTEXT="$("${KUBE_PS1_CLUSTER_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -264,27 +282,36 @@ _kube_ps1_get_context() {
|
|||||||
_kube_ps1_get_ns() {
|
_kube_ps1_get_ns() {
|
||||||
if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then
|
if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then
|
||||||
KUBE_PS1_NAMESPACE="$(${KUBE_PS1_BINARY} config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)"
|
KUBE_PS1_NAMESPACE="$(${KUBE_PS1_BINARY} config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)"
|
||||||
# Set namespace to 'default' if it is not defined
|
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-N/A}"
|
||||||
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-default}"
|
|
||||||
|
|
||||||
if [[ ! -z "${KUBE_PS1_NAMESPACE_FUNCTION}" ]]; then
|
if [[ -n "${KUBE_PS1_NAMESPACE_FUNCTION}" ]]; then
|
||||||
KUBE_PS1_NAMESPACE=$($KUBE_PS1_NAMESPACE_FUNCTION $KUBE_PS1_NAMESPACE)
|
KUBE_PS1_NAMESPACE="$("${KUBE_PS1_NAMESPACE_FUNCTION}" "${KUBE_PS1_NAMESPACE}")"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
_kube_ps1_get_context_ns() {
|
_kube_ps1_get_context_ns() {
|
||||||
# Set the command time
|
# Set the command time
|
||||||
if [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
|
if [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
|
||||||
if ((BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 2)); then
|
if ((BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 2)); then
|
||||||
KUBE_PS1_LAST_TIME=$(printf '%(%s)T')
|
_KUBE_PS1_LAST_TIME=$(printf '%(%s)T')
|
||||||
else
|
else
|
||||||
KUBE_PS1_LAST_TIME=$(date +%s)
|
_KUBE_PS1_LAST_TIME=$(date +%s)
|
||||||
fi
|
fi
|
||||||
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||||
KUBE_PS1_LAST_TIME=$EPOCHSECONDS
|
_KUBE_PS1_LAST_TIME=$EPOCHREALTIME
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
|
||||||
|
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-N/A}"
|
||||||
|
|
||||||
|
# Cache which cfgfiles we can read in case they change.
|
||||||
|
local conf
|
||||||
|
_KUBE_PS1_CFGFILES_READ_CACHE=
|
||||||
|
for conf in $(_kube_ps1_split_config : "${KUBECONFIG:-${HOME}/.kube/config}"); do
|
||||||
|
[[ -r $conf ]] && _KUBE_PS1_CFGFILES_READ_CACHE+=":$conf"
|
||||||
|
done
|
||||||
|
|
||||||
_kube_ps1_get_context
|
_kube_ps1_get_context
|
||||||
_kube_ps1_get_ns
|
_kube_ps1_get_ns
|
||||||
}
|
}
|
||||||
@@ -298,7 +325,7 @@ Toggle kube-ps1 prompt on
|
|||||||
|
|
||||||
Usage: kubeon [-g | --global] [-h | --help]
|
Usage: kubeon [-g | --global] [-h | --help]
|
||||||
|
|
||||||
With no arguments, turn off kube-ps1 status for this shell instance (default).
|
With no arguments, turn oon kube-ps1 status for this shell instance (default).
|
||||||
|
|
||||||
-g --global turn on kube-ps1 status globally
|
-g --global turn on kube-ps1 status globally
|
||||||
-h --help print this message
|
-h --help print this message
|
||||||
@@ -322,7 +349,7 @@ kubeon() {
|
|||||||
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
|
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
|
||||||
_kubeon_usage
|
_kubeon_usage
|
||||||
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
|
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
|
||||||
rm -f -- "${KUBE_PS1_DISABLE_PATH}"
|
rm -f -- "${_KUBE_PS1_DISABLE_PATH}"
|
||||||
elif [[ "$#" -ne 0 ]]; then
|
elif [[ "$#" -ne 0 ]]; then
|
||||||
echo -e "error: unrecognized flag ${1}\\n"
|
echo -e "error: unrecognized flag ${1}\\n"
|
||||||
_kubeon_usage
|
_kubeon_usage
|
||||||
@@ -336,8 +363,8 @@ kubeoff() {
|
|||||||
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
|
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
|
||||||
_kubeoff_usage
|
_kubeoff_usage
|
||||||
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
|
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
|
||||||
mkdir -p -- "$(dirname "${KUBE_PS1_DISABLE_PATH}")"
|
mkdir -p -- "$(dirname "${_KUBE_PS1_DISABLE_PATH}")"
|
||||||
touch -- "${KUBE_PS1_DISABLE_PATH}"
|
touch -- "${_KUBE_PS1_DISABLE_PATH}"
|
||||||
elif [[ $# -ne 0 ]]; then
|
elif [[ $# -ne 0 ]]; then
|
||||||
echo "error: unrecognized flag ${1}" >&2
|
echo "error: unrecognized flag ${1}" >&2
|
||||||
_kubeoff_usage
|
_kubeoff_usage
|
||||||
@@ -351,22 +378,29 @@ kubeoff() {
|
|||||||
kube_ps1() {
|
kube_ps1() {
|
||||||
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return
|
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return
|
||||||
[[ -z "${KUBE_PS1_CONTEXT}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]] && return
|
[[ -z "${KUBE_PS1_CONTEXT}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]] && return
|
||||||
|
[[ "${KUBE_PS1_CONTEXT}" == "N/A" ]] && [[ ${KUBE_PS1_HIDE_IF_NOCONTEXT} == true ]] && return
|
||||||
|
|
||||||
|
|
||||||
local KUBE_PS1
|
local KUBE_PS1
|
||||||
local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}"
|
local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}"
|
||||||
|
|
||||||
|
# If background color is set, reset color should also reset the background
|
||||||
|
if [[ -n "${KUBE_PS1_BG_COLOR}" ]]; then
|
||||||
|
KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_DEFAULT_BG}${_KUBE_PS1_CLOSE_ESC}"
|
||||||
|
fi
|
||||||
|
|
||||||
# Background Color
|
# Background Color
|
||||||
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg ${KUBE_PS1_BG_COLOR})"
|
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")"
|
||||||
|
|
||||||
# Prefix
|
# Prefix
|
||||||
if [[ -z "${KUBE_PS1_PREFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_PREFIX}" ]]; then
|
if [[ -z "${KUBE_PS1_PREFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_PREFIX}" ]]; then
|
||||||
KUBE_PS1+="${KUBE_PS1_PREFIX}"
|
KUBE_PS1+="${KUBE_PS1_PREFIX}"
|
||||||
else
|
else
|
||||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_PREFIX_COLOR)${KUBE_PS1_PREFIX}${KUBE_PS1_RESET_COLOR}"
|
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_PREFIX_COLOR}")${KUBE_PS1_PREFIX}${KUBE_PS1_RESET_COLOR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Symbol
|
# Symbol
|
||||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_SYMBOL_COLOR)$(_kube_ps1_symbol)${KUBE_PS1_RESET_COLOR}"
|
KUBE_PS1+="$(_kube_ps1_symbol)"
|
||||||
|
|
||||||
if [[ -n "${KUBE_PS1_SEPARATOR}" ]] && [[ "${KUBE_PS1_SYMBOL_ENABLE}" == true ]]; then
|
if [[ -n "${KUBE_PS1_SEPARATOR}" ]] && [[ "${KUBE_PS1_SYMBOL_ENABLE}" == true ]]; then
|
||||||
KUBE_PS1+="${KUBE_PS1_SEPARATOR}"
|
KUBE_PS1+="${KUBE_PS1_SEPARATOR}"
|
||||||
@@ -374,7 +408,14 @@ kube_ps1() {
|
|||||||
|
|
||||||
# Context
|
# Context
|
||||||
if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_CTX_COLOR)${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
|
local ctx_color="${KUBE_PS1_CTX_COLOR:-red}"
|
||||||
|
|
||||||
|
# Allow custom function to override color based on context
|
||||||
|
if [[ -n "${KUBE_PS1_CTX_COLOR_FUNCTION}" ]]; then
|
||||||
|
ctx_color="$("${KUBE_PS1_CTX_COLOR_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
|
||||||
|
fi
|
||||||
|
|
||||||
|
KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Namespace
|
# Namespace
|
||||||
@@ -382,14 +423,14 @@ kube_ps1() {
|
|||||||
if [[ -n "${KUBE_PS1_DIVIDER}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
if [[ -n "${KUBE_PS1_DIVIDER}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||||
KUBE_PS1+="${KUBE_PS1_DIVIDER}"
|
KUBE_PS1+="${KUBE_PS1_DIVIDER}"
|
||||||
fi
|
fi
|
||||||
KUBE_PS1+="$(_kube_ps1_color_fg ${KUBE_PS1_NS_COLOR})${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
|
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_NS_COLOR:-cyan}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Suffix
|
# Suffix
|
||||||
if [[ -z "${KUBE_PS1_SUFFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_SUFFIX}" ]]; then
|
if [[ -z "${KUBE_PS1_SUFFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_SUFFIX}" ]]; then
|
||||||
KUBE_PS1+="${KUBE_PS1_SUFFIX}"
|
KUBE_PS1+="${KUBE_PS1_SUFFIX}"
|
||||||
else
|
else
|
||||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_SUFFIX_COLOR)${KUBE_PS1_SUFFIX}${KUBE_PS1_RESET_COLOR}"
|
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_SUFFIX_COLOR}")${KUBE_PS1_SUFFIX}${KUBE_PS1_RESET_COLOR}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Close Background color if defined
|
# Close Background color if defined
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ plugins=(... kubectl)
|
|||||||
| k | `kubectl` | The kubectl command |
|
| k | `kubectl` | The kubectl command |
|
||||||
| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces |
|
| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces |
|
||||||
| kaf | `kubectl apply -f` | Apply a YML file |
|
| kaf | `kubectl apply -f` | Apply a YML file |
|
||||||
|
| kapk | `kubectl apply -k` | Apply a kustomization directory |
|
||||||
| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container |
|
| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container |
|
||||||
| | | **Manage configuration quickly to switch contexts between local, dev and staging** |
|
| | | **Manage configuration quickly to switch contexts between local, dev and staging** |
|
||||||
| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file |
|
| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file |
|
||||||
@@ -26,6 +27,7 @@ plugins=(... kubectl)
|
|||||||
| | | **General aliases** |
|
| | | **General aliases** |
|
||||||
| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
|
| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
|
||||||
| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument |
|
| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument |
|
||||||
|
| kdelk | `kubectl delete -k` | Delete all resources defined in a kustomization directory |
|
||||||
| kge | `kubectl get events --sort-by=".lastTimestamp"` | Get events (sorted by timestamp) |
|
| kge | `kubectl get events --sort-by=".lastTimestamp"` | Get events (sorted by timestamp) |
|
||||||
| kgew | `kubectl get events --watch --sort-by=".lastTimestamp"` | Get events and watch as they occur (sorted by timestamp) |
|
| kgew | `kubectl get events --watch --sort-by=".lastTimestamp"` | Get events and watch as they occur (sorted by timestamp) |
|
||||||
| | | **Pod management** |
|
| | | **Pod management** |
|
||||||
|
|||||||
@@ -21,6 +21,9 @@ alias kca='_kca(){ kubectl "$@" --all-namespaces; unset -f _kca; }; _kca'
|
|||||||
# Apply a YML file
|
# Apply a YML file
|
||||||
alias kaf='kubectl apply -f'
|
alias kaf='kubectl apply -f'
|
||||||
|
|
||||||
|
# Apply a kustomization directory
|
||||||
|
alias kapk='kubectl apply -k'
|
||||||
|
|
||||||
# Drop into an interactive terminal on a container
|
# Drop into an interactive terminal on a container
|
||||||
alias keti='kubectl exec -t -i'
|
alias keti='kubectl exec -t -i'
|
||||||
|
|
||||||
@@ -36,6 +39,7 @@ alias kcgc='kubectl config get-contexts'
|
|||||||
# General aliases
|
# General aliases
|
||||||
alias kdel='kubectl delete'
|
alias kdel='kubectl delete'
|
||||||
alias kdelf='kubectl delete -f'
|
alias kdelf='kubectl delete -f'
|
||||||
|
alias kdelk='kubectl delete -k'
|
||||||
alias kge='kubectl get events --sort-by=".lastTimestamp"'
|
alias kge='kubectl get events --sort-by=".lastTimestamp"'
|
||||||
alias kgew='kubectl get events --sort-by=".lastTimestamp" --watch'
|
alias kgew='kubectl get events --sort-by=".lastTimestamp" --watch'
|
||||||
|
|
||||||
|
|||||||
@@ -1,27 +1,17 @@
|
|||||||
# TODO: 2024-01-03 remove rtx support
|
|
||||||
local __mise=mise
|
|
||||||
if (( ! $+commands[mise] )); then
|
if (( ! $+commands[mise] )); then
|
||||||
if (( $+commands[rtx] )); then
|
return
|
||||||
__mise=rtx
|
|
||||||
else
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Load mise hooks
|
# Load mise hooks
|
||||||
eval "$($__mise activate zsh)"
|
eval "$(mise activate zsh)"
|
||||||
|
|
||||||
# Hook mise into current environment
|
|
||||||
eval "$($__mise hook-env -s zsh)"
|
|
||||||
|
|
||||||
# If the completion file doesn't exist yet, we need to autoload it and
|
# If the completion file doesn't exist yet, we need to autoload it and
|
||||||
# bind it to `mise`. Otherwise, compinit will have already done that.
|
# bind it to `mise`. Otherwise, compinit will have already done that.
|
||||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_$__mise" ]]; then
|
if [[ ! -f "$ZSH_CACHE_DIR/completions/_mise" ]]; then
|
||||||
typeset -g -A _comps
|
typeset -g -A _comps
|
||||||
autoload -Uz _$__mise
|
autoload -Uz _mise
|
||||||
_comps[$__mise]=_$__mise
|
_comps[mise]=_mise
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Generate and load mise completion
|
# Generate and load mise completion
|
||||||
$__mise completion zsh >| "$ZSH_CACHE_DIR/completions/_$__mise" &|
|
mise completion zsh >| "$ZSH_CACHE_DIR/completions/_mise" &|
|
||||||
unset __mise
|
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ plugins=(... opentofu)
|
|||||||
|--------|------------------------------|
|
|--------|------------------------------|
|
||||||
| `tt` | `tofu` |
|
| `tt` | `tofu` |
|
||||||
| `tta` | `tofu apply` |
|
| `tta` | `tofu apply` |
|
||||||
| `ttaa` | `tofu apply -auto-approve` |
|
| `tta!` | `tofu apply -auto-approve` |
|
||||||
| `ttc` | `tofu console` |
|
| `ttc` | `tofu console` |
|
||||||
| `ttd` | `tofu destroy` |
|
| `ttd` | `tofu destroy` |
|
||||||
| `ttd!` | `tofu destroy -auto-approve` |
|
| `ttd!` | `tofu destroy -auto-approve` |
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ function tofu_version_prompt_info() {
|
|||||||
|
|
||||||
alias tt='tofu'
|
alias tt='tofu'
|
||||||
alias tta='tofu apply'
|
alias tta='tofu apply'
|
||||||
alias ttaa='tofu apply -auto-approve'
|
alias tta!='tofu apply -auto-approve'
|
||||||
alias ttc='tofu console'
|
alias ttc='tofu console'
|
||||||
alias ttd='tofu destroy'
|
alias ttd='tofu destroy'
|
||||||
alias ttd!='tofu destroy -auto-approve'
|
alias ttd!='tofu destroy -auto-approve'
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
# rbfu plugin
|
|
||||||
|
|
||||||
This plugin starts [rbfu](https://github.com/hmans/rbfu), a minimal Ruby version
|
|
||||||
manager, and adds some useful functions.
|
|
||||||
|
|
||||||
To use it, add `rbfu` to the plugins array in your zshrc file:
|
|
||||||
|
|
||||||
```zsh
|
|
||||||
plugins=(... rbfu)
|
|
||||||
```
|
|
||||||
|
|
||||||
**Note: `rbfu` is deprecated and should no longer be used.**
|
|
||||||
|
|
||||||
## Functions
|
|
||||||
|
|
||||||
- `rbfu-rubies`: lists all installed rubies available to rbfu.
|
|
||||||
|
|
||||||
- `rvm_prompt_info`: shows the Ruby version being used with rbfu.
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
# Enables rbfu with --auto option, if available.
|
|
||||||
#
|
|
||||||
# Also provides a command to list all installed/available
|
|
||||||
# rubies. To ensure compatibility with themes, creates the
|
|
||||||
# rvm_prompt_info function to return the $RBFU_RUBY_VERSION
|
|
||||||
# version.
|
|
||||||
|
|
||||||
command -v rbfu &>/dev/null || return
|
|
||||||
|
|
||||||
eval "$(rbfu --init --auto)"
|
|
||||||
|
|
||||||
# Internal: Print ruby version details, if it's currently active, etc.
|
|
||||||
function _rbfu_rubies_print() {
|
|
||||||
# 1: path to ruby file
|
|
||||||
# 2: active ruby
|
|
||||||
local rb rb_out
|
|
||||||
rb="${$1:t}"
|
|
||||||
rb_out="$rb"
|
|
||||||
|
|
||||||
# If the ruby is a symlink, add @ to the name.
|
|
||||||
if [[ -h "$1" ]]; then
|
|
||||||
rb_out="${rb_out}${fg[green]}@${reset_color}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If the ruby is active, add * to the name and show it in red.
|
|
||||||
if [[ "$rb" = "$2" ]]; then
|
|
||||||
rb_out="${fg[red]}${rb_out} ${fg[red]}*${reset_color}"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo $rb_out
|
|
||||||
}
|
|
||||||
|
|
||||||
# Public: Provide a list with all available rubies, this basically depends
|
|
||||||
# on ~/.rfbu/rubies. Highlights the currently active ruby version and aliases.
|
|
||||||
function rbfu-rubies() {
|
|
||||||
local rbfu_dir active_rb
|
|
||||||
rbfu_dir="${RBFU_RUBIES:-${HOME}/.rbfu/rubies}"
|
|
||||||
active_rb="${RBFU_RUBY_VERSION:-system}"
|
|
||||||
|
|
||||||
_rbfu_rubies_print "${rbfu_dir}/system" "$active_rb"
|
|
||||||
for rb in ${rbfu_dir}/*(N); do
|
|
||||||
_rbfu_rubies_print "$rb" "$active_rb"
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# Public: Create rvm_prompt_info command for themes compatibility, unless
|
|
||||||
# it has already been defined.
|
|
||||||
(( ${+functions[rvm_prompt_info]} )) || \
|
|
||||||
function rvm_prompt_info() { echo "${${RBFU_RUBY_VERSION:=system}:gs/%/%%}" }
|
|
||||||
@@ -16,13 +16,15 @@ plugins=(... terraform)
|
|||||||
## Aliases
|
## Aliases
|
||||||
|
|
||||||
| Alias | Command |
|
| Alias | Command |
|
||||||
| ------- | -------------------------------------- |
|
|---------|----------------------------------------|
|
||||||
| `tf` | `terraform` |
|
| `tf` | `terraform` |
|
||||||
| `tfa` | `terraform apply` |
|
| `tfa` | `terraform apply` |
|
||||||
| `tfaa` | `terraform apply -auto-approve` |
|
| `tfa!` | `terraform apply -auto-approve` |
|
||||||
|
| `tfap` | `terraform apply -parallelism=1` |
|
||||||
| `tfc` | `terraform console` |
|
| `tfc` | `terraform console` |
|
||||||
| `tfd` | `terraform destroy` |
|
| `tfd` | `terraform destroy` |
|
||||||
| `tfd!` | `terraform destroy -auto-approve` |
|
| `tfd!` | `terraform destroy -auto-approve` |
|
||||||
|
| `tfdp` | `terraform destroy -parallelism=1` |
|
||||||
| `tff` | `terraform fmt` |
|
| `tff` | `terraform fmt` |
|
||||||
| `tffr` | `terraform fmt -recursive` |
|
| `tffr` | `terraform fmt -recursive` |
|
||||||
| `tfi` | `terraform init` |
|
| `tfi` | `terraform init` |
|
||||||
|
|||||||
@@ -17,10 +17,12 @@ function tf_version_prompt_info() {
|
|||||||
|
|
||||||
alias tf='terraform'
|
alias tf='terraform'
|
||||||
alias tfa='terraform apply'
|
alias tfa='terraform apply'
|
||||||
alias tfaa='terraform apply -auto-approve'
|
alias tfa!='terraform apply -auto-approve'
|
||||||
|
alias tfap='terraform apply -parallelism=1'
|
||||||
alias tfc='terraform console'
|
alias tfc='terraform console'
|
||||||
alias tfd='terraform destroy'
|
alias tfd='terraform destroy'
|
||||||
alias 'tfd!'='terraform destroy -auto-approve'
|
alias tfd!='terraform destroy -auto-approve'
|
||||||
|
alias tfdp='terraform destroy -parallelism=1'
|
||||||
alias tff='terraform fmt'
|
alias tff='terraform fmt'
|
||||||
alias tffr='terraform fmt -recursive'
|
alias tffr='terraform fmt -recursive'
|
||||||
alias tfi='terraform init'
|
alias tfi='terraform init'
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ The plugin also supports the following:
|
|||||||
| `tkss` | tmux kill-session -t | Terminate named running tmux session |
|
| `tkss` | tmux kill-session -t | Terminate named running tmux session |
|
||||||
| `tksv` | tmux kill-server | Terminate all running tmux sessions |
|
| `tksv` | tmux kill-server | Terminate all running tmux sessions |
|
||||||
| `tl` | tmux list-sessions | Displays a list of running tmux sessions |
|
| `tl` | tmux list-sessions | Displays a list of running tmux sessions |
|
||||||
|
| `to` | tmux new-session -A -s | Create or attach to a named tmux session |
|
||||||
| `tmux` | `_zsh_tmux_plugin_run` | Start a new tmux session |
|
| `tmux` | `_zsh_tmux_plugin_run` | Start a new tmux session |
|
||||||
| `tmuxconf` | `$EDITOR $ZSH_TMUX_CONFIG` | Open .tmux.conf file with an editor |
|
| `tmuxconf` | `$EDITOR $ZSH_TMUX_CONFIG` | Open .tmux.conf file with an editor |
|
||||||
| `ts` | tmux new-session -s | Create a new named tmux session |
|
| `ts` | tmux new-session -s | Create a new named tmux session |
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ alias tmuxconf='$EDITOR $ZSH_TMUX_CONFIG'
|
|||||||
|
|
||||||
_build_tmux_alias "ta" "attach" "-t"
|
_build_tmux_alias "ta" "attach" "-t"
|
||||||
_build_tmux_alias "tad" "attach -d" "-t"
|
_build_tmux_alias "tad" "attach -d" "-t"
|
||||||
|
_build_tmux_alias "to" "new-session -A" "-s"
|
||||||
_build_tmux_alias "ts" "new-session" "-s"
|
_build_tmux_alias "ts" "new-session" "-s"
|
||||||
_build_tmux_alias "tkss" "kill-session" "-t"
|
_build_tmux_alias "tkss" "kill-session" "-t"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
# uv plugin
|
# uv plugin
|
||||||
|
|
||||||
This plugin automatically installs [uv](https://github.com/astral-sh/uv)'s completions for you, and keeps them up to date. It also adds convenient aliases for common usage.
|
This plugin automatically installs [uv](https://github.com/astral-sh/uv)'s completions for you,
|
||||||
|
and keeps them up to date. It also adds convenient aliases for common usage.
|
||||||
|
|
||||||
To use it, add `uv` to the plugins array in your zshrc file:
|
To use it, add `uv` to the plugins array in your zshrc file:
|
||||||
|
|
||||||
@@ -10,19 +11,26 @@ plugins=(... uv)
|
|||||||
|
|
||||||
## Aliases
|
## Aliases
|
||||||
|
|
||||||
| Alias | Command | Description |
|
| Alias | Command | Description |
|
||||||
|:----- |------------------------------------------------------------------------ |:-------------------------------------------------------------------- |
|
| :---- | ---------------------------------------------------------------------------------------- | :-------------------------------------------------------------------- |
|
||||||
| uva | `uv add` | Add packages to the project |
|
| uva | `uv add` | Add packages to the project |
|
||||||
| uvexp | `uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet` | Export the lock file to `requirements.txt` |
|
| uvexp | `uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet` | Export the lock file to `requirements.txt` |
|
||||||
| uvl | `uv lock` | Lock the dependencies |
|
| uvi | `uv init` | Initialize a new project in current workspace and environment. |
|
||||||
| uvlr | `uv lock --refresh` | Rebuild the lock file without upgrading dependencies |
|
| uvinw | `uv init --no-workspace` | Initialize a new project in a new workspace and environment |
|
||||||
| uvlu | `uv lock --upgrade` | Lock the dependencies to the newest compatible versions |
|
| uvl | `uv lock` | Lock the dependencies |
|
||||||
| uvp | `uv pip` | Manage pip packages |
|
| uvlr | `uv lock --refresh` | Rebuild the lock file without upgrading dependencies |
|
||||||
| uvpy | `uv python` | Manage Python installs |
|
| uvlu | `uv lock --upgrade` | Lock the dependencies to the newest compatible versions |
|
||||||
| uvr | `uv run` | Run commands within the project's environment |
|
| uvp | `uv pip` | Manage pip packages |
|
||||||
| uvrm | `uv remove` | Remove packages from the project |
|
| uvpi | `uv python install` | Install a specific version of python |
|
||||||
| uvs | `uv sync` | Sync the environment with the lock file |
|
| uvpl | `uv python list` | Lists all python version installed |
|
||||||
| uvsr | `uv sync --refresh` | "Force" sync the environment with the lock file (ignore cache) |
|
| uvpp | `uv python pin` | Pin the current project to use a specific Python version |
|
||||||
| uvsu | `uv sync --upgrade` | Sync the environment, allowing upgrades and ignoring the lock file |
|
| uvpu | `uv python uninstall` | Remove a specific version of python |
|
||||||
| uvup | `uv self update` | Update the UV tool to the latest version |
|
| uvpy | `uv python` | Manage Python installs |
|
||||||
| uvv | `uv venv` | Manage virtual environments |
|
| uvr | `uv run` | Run commands within the project's environment |
|
||||||
|
| uvrm | `uv remove` | Remove packages from the project |
|
||||||
|
| uvs | `uv sync` | Sync the environment with the lock file |
|
||||||
|
| uvsr | `uv sync --refresh` | "Force" sync the environment with the lock file (ignore cache) |
|
||||||
|
| uvsu | `uv sync --upgrade` | Sync the environment, allowing upgrades and ignoring the lock file |
|
||||||
|
| uvtr | `uv tree` | Displays the full dependency tree for the current project environment |
|
||||||
|
| uvup | `uv self update` | Update the UV tool to the latest version |
|
||||||
|
| uvv | `uv venv` | Manage virtual environments |
|
||||||
|
|||||||
@@ -7,16 +7,23 @@ alias uv="noglob uv"
|
|||||||
|
|
||||||
alias uva='uv add'
|
alias uva='uv add'
|
||||||
alias uvexp='uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet'
|
alias uvexp='uv export --format requirements-txt --no-hashes --output-file requirements.txt --quiet'
|
||||||
|
alias uvi='uv init'
|
||||||
|
alias uvinw='uv init --no-workspace'
|
||||||
alias uvl='uv lock'
|
alias uvl='uv lock'
|
||||||
alias uvlr='uv lock --refresh'
|
alias uvlr='uv lock --refresh'
|
||||||
alias uvlu='uv lock --upgrade'
|
alias uvlu='uv lock --upgrade'
|
||||||
alias uvp='uv pip'
|
alias uvp='uv pip'
|
||||||
|
alias uvpi='uv python install'
|
||||||
|
alias uvpl='uv python list'
|
||||||
|
alias uvpu='uv python uninstall'
|
||||||
alias uvpy='uv python'
|
alias uvpy='uv python'
|
||||||
|
alias uvpp='uv python pin'
|
||||||
alias uvr='uv run'
|
alias uvr='uv run'
|
||||||
alias uvrm='uv remove'
|
alias uvrm='uv remove'
|
||||||
alias uvs='uv sync'
|
alias uvs='uv sync'
|
||||||
alias uvsr='uv sync --refresh'
|
alias uvsr='uv sync --refresh'
|
||||||
alias uvsu='uv sync --upgrade'
|
alias uvsu='uv sync --upgrade'
|
||||||
|
alias uvtr='uv tree'
|
||||||
alias uvup='uv self update'
|
alias uvup='uv self update'
|
||||||
alias uvv='uv venv'
|
alias uvv='uv venv'
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user