mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2025-12-05 01:46:46 +01:00
Merge branch 'master' into patch-1
This commit is contained in:
commit
15c79fc9c6
80 changed files with 1608 additions and 526 deletions
87
.github/INCIDENT_RESPONSE_PLAN.md
vendored
Normal file
87
.github/INCIDENT_RESPONSE_PLAN.md
vendored
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# Incident Response Plan
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Please see [the latest guidelines](https://github.com/ohmyzsh/ohmyzsh/blob/master/SECURITY.md) for instructions.
|
||||
|
||||
## Phases
|
||||
|
||||
### Triage
|
||||
|
||||
1. Is this a valid security vulnerability?
|
||||
|
||||
- [ ] It affects our CI/CD or any of our repositories.
|
||||
- [ ] For ohmyzsh/ohmyzsh, it affects the latest commit.
|
||||
- [ ] For others, it affects the latest commit on the default branch.
|
||||
- [ ] It affects a third-party dependency:
|
||||
- [ ] Zsh or git
|
||||
- [ ] For a plugin, the vulnerability is a result of our usage of the dependency.
|
||||
|
||||
2. What's the scope of the vulnerability?
|
||||
|
||||
- [ ] Our codebase.
|
||||
- [ ] A direct third-party dependency (Zsh, git, other plugins).
|
||||
- [ ] An indirect third-party dependency.
|
||||
- [ ] Out of scope, a third-party dependency that is the responsibility of the user.
|
||||
- [ ] Out of scope, any other case (edit this plan and add the details).
|
||||
|
||||
3. Is the vulnerability actionable?
|
||||
|
||||
- [ ] Yes, we can submit a fix.
|
||||
- [ ] Yes, we can disable a feature.
|
||||
- [ ] Yes, we can mitigate the risk.
|
||||
- [ ] Yes, we can remove a vulnerable dependency.
|
||||
- [ ] Yes, we can apply a workaround.
|
||||
- [ ] Yes, we can apply a patch to a vulnerable dependency ([example for CVE-2021-45444](https://github.com/ohmyzsh/ohmyzsh/blob/cb72d7dcbf08b435c7f8a6470802b207b2aa02c3/lib/vcs_info.zsh)).
|
||||
- [ ] No, the vulnerability is not actionable.
|
||||
|
||||
4. What's the impact of the vulnerability?
|
||||
|
||||
Assess using the *CIA* triad:
|
||||
|
||||
- **Confidentiality**: example: report or sharing of secrets.
|
||||
- **Integrity**: affects the integrity of the system (deletion, corruption or encryption of data, OS file corruption, etc.).
|
||||
- **Availability**: denial of login, deletion of required files to boot / login, etc.
|
||||
|
||||
5. What's the exploitability of the vulnerability?
|
||||
|
||||
Consider how easy it is to exploit, and if it affects all users or requires specific configurations.
|
||||
|
||||
6. What's the severity of the vulnerability?
|
||||
|
||||
You can use the [CVSS v3.1](https://www.first.org/cvss/specification-document) to assess the severity of the vulnerability.
|
||||
|
||||
7. When was the vulnerability introduced?
|
||||
|
||||
- Find the responsible code path.
|
||||
- Find the commit or Pull Request that introduced the vulnerability.
|
||||
|
||||
8. Who are our security contacts?
|
||||
|
||||
Assess upstream or downstream contacts, and their desired channels of security.
|
||||
|
||||
> TODO: add a list of contacts.
|
||||
|
||||
### Mitigation
|
||||
|
||||
- **Primary focus:** removing possibility of exploitation fast.
|
||||
- **Secondary focus:** addressing the root cause.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Make sure to test that the mitigation works as expected, and does not introduce new vulnerabilities.
|
||||
> When deploying a patch, make sure not to disclose the vulnerability in the commit message or PR description.
|
||||
|
||||
> TODO: introduce a fast-track update process for security patches.
|
||||
|
||||
### Disclosure
|
||||
|
||||
Primary goal: inform our users about the vulnerability, and whether they are affected or not affected based on information they should be able to check themselves in a straightforward way.
|
||||
|
||||
> TODO: add a vulnerability disclosure template.
|
||||
|
||||
### Learn
|
||||
|
||||
- Document the vulnerability, steps performed, and lessons learned.
|
||||
- Document the timeline of events.
|
||||
- Document and address improvements on the Security Incident Response Plan.
|
||||
- Depending on the severity of the vulnerability, consider disclosing the root cause or not based on likely impact on users and estimated potential victims still affected.
|
||||
4
.github/dependencies.yml
vendored
4
.github/dependencies.yml
vendored
|
|
@ -30,7 +30,7 @@ dependencies:
|
|||
plugins/wd:
|
||||
repo: mfaerevaag/wd
|
||||
branch: master
|
||||
version: tag:v0.9.3
|
||||
version: tag:v0.10.1
|
||||
precopy: |
|
||||
set -e
|
||||
rm -r test
|
||||
|
|
@ -38,7 +38,7 @@ dependencies:
|
|||
plugins/z:
|
||||
branch: master
|
||||
repo: agkozak/zsh-z
|
||||
version: dd94ef04acc41748ba171eb219971cb455e0040b
|
||||
version: cf9225feebfae55e557e103e95ce20eca5eff270
|
||||
precopy: |
|
||||
set -e
|
||||
test -e README.md && mv -f README.md MANUAL.md
|
||||
|
|
|
|||
15
.github/workflows/dependencies.yml
vendored
15
.github/workflows/dependencies.yml
vendored
|
|
@ -4,6 +4,9 @@ on:
|
|||
schedule:
|
||||
- cron: "0 6 * * 0"
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check:
|
||||
name: Check for updates
|
||||
|
|
@ -11,15 +14,15 @@ jobs:
|
|||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Authenticate as @ohmyzsh
|
||||
id: generate_token
|
||||
uses: ohmyzsh/github-app-token@v2
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app_id: ${{ secrets.OHMYZSH_APP_ID }}
|
||||
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
||||
app-id: ${{ secrets.OHMYZSH_APP_ID }}
|
||||
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
|
|
@ -27,7 +30,7 @@ jobs:
|
|||
cache: "pip"
|
||||
- name: Process dependencies
|
||||
env:
|
||||
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||
GH_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||
GIT_APP_NAME: ohmyzsh[bot]
|
||||
GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com
|
||||
TMP_DIR: ${{ runner.temp }}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
certifi==2025.1.31
|
||||
charset-normalizer==3.4.1
|
||||
certifi==2025.8.3
|
||||
charset-normalizer==3.4.3
|
||||
idna==3.10
|
||||
PyYAML==6.0.2
|
||||
requests==2.32.3
|
||||
requests==2.32.4
|
||||
semver==3.0.4
|
||||
urllib3==2.3.0
|
||||
urllib3==2.5.0
|
||||
|
|
|
|||
4
.github/workflows/installer.yml
vendored
4
.github/workflows/installer.yml
vendored
|
|
@ -26,7 +26,7 @@ jobs:
|
|||
- macos-latest
|
||||
steps:
|
||||
- name: Set up git repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Install zsh
|
||||
if: runner.os == 'Linux'
|
||||
run: sudo apt-get update; sudo apt-get install zsh
|
||||
|
|
@ -42,7 +42,7 @@ jobs:
|
|||
- test
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Install Vercel CLI
|
||||
run: npm install -g vercel
|
||||
- name: Setup project and deploy
|
||||
|
|
|
|||
2
.github/workflows/main.yml
vendored
2
.github/workflows/main.yml
vendored
|
|
@ -24,7 +24,7 @@ jobs:
|
|||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||
steps:
|
||||
- name: Set up git repository
|
||||
uses: actions/checkout@v4
|
||||
uses: actions/checkout@v5
|
||||
- name: Install zsh
|
||||
run: sudo apt-get update; sudo apt-get install zsh
|
||||
- name: Check syntax
|
||||
|
|
|
|||
10
.github/workflows/project.yml
vendored
10
.github/workflows/project.yml
vendored
|
|
@ -17,13 +17,13 @@ jobs:
|
|||
if: github.repository == 'ohmyzsh/ohmyzsh'
|
||||
steps:
|
||||
- name: Authenticate as @ohmyzsh
|
||||
id: generate_token
|
||||
uses: ohmyzsh/github-app-token@v2
|
||||
id: generate-token
|
||||
uses: actions/create-github-app-token@v2
|
||||
with:
|
||||
app_id: ${{ secrets.OHMYZSH_APP_ID }}
|
||||
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
||||
app-id: ${{ secrets.OHMYZSH_APP_ID }}
|
||||
private-key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
|
||||
- name: Store app token
|
||||
run: echo "GH_TOKEN=${{ steps.generate_token.outputs.token }}" >> "$GITHUB_ENV"
|
||||
run: echo "GH_TOKEN=${{ steps.generate-token.outputs.token }}" >> "$GITHUB_ENV"
|
||||
- name: Read project data
|
||||
env:
|
||||
ORGANIZATION: ohmyzsh
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ adds any) and extra goodies that are included in that particular plugin.
|
|||
|
||||
### Themes
|
||||
|
||||
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one
|
||||
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme-happy. We have over one
|
||||
hundred and fifty themes now bundled. Most of them have
|
||||
[screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!).
|
||||
Check them out!
|
||||
|
|
@ -218,7 +218,7 @@ terminal window.
|
|||
ZSH_THEME="random" # (...please let it be pie... please be some pie..)
|
||||
```
|
||||
|
||||
And if you want to pick random theme from a list of your favorite themes:
|
||||
And if you want to pick a random theme from a list of your favorite themes:
|
||||
|
||||
```sh
|
||||
ZSH_THEME_RANDOM_CANDIDATES=(
|
||||
|
|
@ -426,7 +426,7 @@ turn it off by setting the following in your .zshrc file, before Oh My Zsh is so
|
|||
zstyle ':omz:alpha:lib:git' async-prompt no
|
||||
```
|
||||
|
||||
If your problem is that the git prompt just stopped appearing, you can try to force it setting the following
|
||||
If your problem is that the git prompt just stopped appearing, you can try to force it by setting the following
|
||||
configuration before `oh-my-zsh.sh` is sourced. If it still does not work, please open an issue with your
|
||||
case.
|
||||
|
||||
|
|
|
|||
25
lib/cli.zsh
25
lib/cli.zsh
|
|
@ -72,6 +72,10 @@ function _omz {
|
|||
local -aU plugins
|
||||
plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
|
||||
_describe 'plugin' plugins ;;
|
||||
plugin::list)
|
||||
local -a opts
|
||||
opts=('--enabled:List enabled plugins only')
|
||||
_describe -o 'options' opts ;;
|
||||
theme::(set|use))
|
||||
local -aU themes
|
||||
themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
|
||||
|
|
@ -193,7 +197,7 @@ EOF
|
|||
return 1
|
||||
fi
|
||||
|
||||
"$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
|
||||
ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
|
||||
}
|
||||
|
||||
function _omz::plugin {
|
||||
|
|
@ -206,7 +210,7 @@ Available commands:
|
|||
disable <plugin> Disable plugin(s)
|
||||
enable <plugin> Enable plugin(s)
|
||||
info <plugin> Get information of a plugin
|
||||
list List all available Oh My Zsh plugins
|
||||
list [--enabled] List Oh My Zsh plugins
|
||||
load <plugin> Load plugin(s)
|
||||
|
||||
EOF
|
||||
|
|
@ -449,8 +453,21 @@ function _omz::plugin::info {
|
|||
|
||||
function _omz::plugin::list {
|
||||
local -a custom_plugins builtin_plugins
|
||||
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
|
||||
builtin_plugins=("$ZSH"/plugins/*(-/N:t))
|
||||
|
||||
# If --enabled is provided, only list what's enabled
|
||||
if [[ "$1" == "--enabled" ]]; then
|
||||
local plugin
|
||||
for plugin in "${plugins[@]}"; do
|
||||
if [[ -d "${ZSH_CUSTOM}/plugins/${plugin}" ]]; then
|
||||
custom_plugins+=("${plugin}")
|
||||
elif [[ -d "${ZSH}/plugins/${plugin}" ]]; then
|
||||
builtin_plugins+=("${plugin}")
|
||||
fi
|
||||
done
|
||||
else
|
||||
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
|
||||
builtin_plugins=("$ZSH"/plugins/*(-/N:t))
|
||||
fi
|
||||
|
||||
# If the command is being piped, print all found line by line
|
||||
if [[ ! -t 1 ]]; then
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ fi
|
|||
# disable named-directories autocompletion
|
||||
zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories
|
||||
|
||||
# Use caching so that commands like apt and dpkg complete are useable
|
||||
# Use caching so that commands like apt and dpkg complete are usable
|
||||
zstyle ':completion:*' use-cache yes
|
||||
zstyle ':completion:*' cache-path $ZSH_CACHE_DIR
|
||||
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@ function open_command() {
|
|||
linux*) [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || {
|
||||
open_cmd='cmd.exe /c start ""'
|
||||
[[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 }
|
||||
[[ "$1" = (http|https)://* ]] && {
|
||||
1="$(echo "$1" | sed -E 's/([&|()<>^])/^\1/g')" || return 1
|
||||
}
|
||||
} ;;
|
||||
msys*) open_cmd='start ""' ;;
|
||||
*) echo "Platform $OSTYPE not supported"
|
||||
|
|
|
|||
198
lib/git.zsh
198
lib/git.zsh
|
|
@ -39,6 +39,105 @@ function _omz_git_prompt_info() {
|
|||
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
|
||||
}
|
||||
|
||||
function _omz_git_prompt_status() {
|
||||
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
|
||||
|
||||
# Maps a git status prefix to an internal constant
|
||||
# This cannot use the prompt constants, as they may be empty
|
||||
local -A prefix_constant_map
|
||||
prefix_constant_map=(
|
||||
'\?\? ' 'UNTRACKED'
|
||||
'A ' 'ADDED'
|
||||
'M ' 'MODIFIED'
|
||||
'MM ' 'MODIFIED'
|
||||
' M ' 'MODIFIED'
|
||||
'AM ' 'MODIFIED'
|
||||
' T ' 'MODIFIED'
|
||||
'R ' 'RENAMED'
|
||||
' D ' 'DELETED'
|
||||
'D ' 'DELETED'
|
||||
'UU ' 'UNMERGED'
|
||||
'ahead' 'AHEAD'
|
||||
'behind' 'BEHIND'
|
||||
'diverged' 'DIVERGED'
|
||||
'stashed' 'STASHED'
|
||||
)
|
||||
|
||||
# Maps the internal constant to the prompt theme
|
||||
local -A constant_prompt_map
|
||||
constant_prompt_map=(
|
||||
'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
|
||||
'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
|
||||
'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
|
||||
'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
|
||||
'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
|
||||
'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
|
||||
'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
|
||||
'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
|
||||
'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
|
||||
'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
|
||||
)
|
||||
|
||||
# The order that the prompt displays should be added to the prompt
|
||||
local status_constants
|
||||
status_constants=(
|
||||
UNTRACKED ADDED MODIFIED RENAMED DELETED
|
||||
STASHED UNMERGED AHEAD BEHIND DIVERGED
|
||||
)
|
||||
|
||||
local status_text
|
||||
status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
|
||||
|
||||
# Don't continue on a catastrophic failure
|
||||
if [[ $? -eq 128 ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# A lookup table of each git status encountered
|
||||
local -A statuses_seen
|
||||
|
||||
if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
|
||||
statuses_seen[STASHED]=1
|
||||
fi
|
||||
|
||||
local status_lines
|
||||
status_lines=("${(@f)${status_text}}")
|
||||
|
||||
# If the tracking line exists, get and parse it
|
||||
if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
|
||||
local branch_statuses
|
||||
branch_statuses=("${(@s/,/)match}")
|
||||
for branch_status in $branch_statuses; do
|
||||
if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
|
||||
continue
|
||||
fi
|
||||
local last_parsed_status=$prefix_constant_map[$match[1]]
|
||||
statuses_seen[$last_parsed_status]=$match[2]
|
||||
done
|
||||
fi
|
||||
|
||||
# For each status prefix, do a regex comparison
|
||||
for status_prefix in ${(k)prefix_constant_map}; do
|
||||
local status_constant="${prefix_constant_map[$status_prefix]}"
|
||||
local status_regex=$'(^|\n)'"$status_prefix"
|
||||
|
||||
if [[ "$status_text" =~ $status_regex ]]; then
|
||||
statuses_seen[$status_constant]=1
|
||||
fi
|
||||
done
|
||||
|
||||
# Display the seen statuses in the order specified
|
||||
local status_prompt
|
||||
for status_constant in $status_constants; do
|
||||
if (( ${+statuses_seen[$status_constant]} )); then
|
||||
local next_display=$constant_prompt_map[$status_constant]
|
||||
status_prompt="$next_display$status_prompt"
|
||||
fi
|
||||
done
|
||||
|
||||
echo $status_prompt
|
||||
}
|
||||
|
||||
# Use async version if setting is enabled, or unset but zsh version is at least 5.0.6.
|
||||
# This avoids async prompt issues caused by previous zsh versions:
|
||||
# - https://github.com/ohmyzsh/ohmyzsh/issues/12331
|
||||
|
|
@ -246,105 +345,6 @@ function git_prompt_long_sha() {
|
|||
SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
|
||||
}
|
||||
|
||||
function _omz_git_prompt_status() {
|
||||
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
|
||||
|
||||
# Maps a git status prefix to an internal constant
|
||||
# This cannot use the prompt constants, as they may be empty
|
||||
local -A prefix_constant_map
|
||||
prefix_constant_map=(
|
||||
'\?\? ' 'UNTRACKED'
|
||||
'A ' 'ADDED'
|
||||
'M ' 'MODIFIED'
|
||||
'MM ' 'MODIFIED'
|
||||
' M ' 'MODIFIED'
|
||||
'AM ' 'MODIFIED'
|
||||
' T ' 'MODIFIED'
|
||||
'R ' 'RENAMED'
|
||||
' D ' 'DELETED'
|
||||
'D ' 'DELETED'
|
||||
'UU ' 'UNMERGED'
|
||||
'ahead' 'AHEAD'
|
||||
'behind' 'BEHIND'
|
||||
'diverged' 'DIVERGED'
|
||||
'stashed' 'STASHED'
|
||||
)
|
||||
|
||||
# Maps the internal constant to the prompt theme
|
||||
local -A constant_prompt_map
|
||||
constant_prompt_map=(
|
||||
'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
|
||||
'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
|
||||
'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
|
||||
'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
|
||||
'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
|
||||
'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
|
||||
'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
|
||||
'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
|
||||
'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
|
||||
'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
|
||||
)
|
||||
|
||||
# The order that the prompt displays should be added to the prompt
|
||||
local status_constants
|
||||
status_constants=(
|
||||
UNTRACKED ADDED MODIFIED RENAMED DELETED
|
||||
STASHED UNMERGED AHEAD BEHIND DIVERGED
|
||||
)
|
||||
|
||||
local status_text
|
||||
status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
|
||||
|
||||
# Don't continue on a catastrophic failure
|
||||
if [[ $? -eq 128 ]]; then
|
||||
return 1
|
||||
fi
|
||||
|
||||
# A lookup table of each git status encountered
|
||||
local -A statuses_seen
|
||||
|
||||
if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
|
||||
statuses_seen[STASHED]=1
|
||||
fi
|
||||
|
||||
local status_lines
|
||||
status_lines=("${(@f)${status_text}}")
|
||||
|
||||
# If the tracking line exists, get and parse it
|
||||
if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
|
||||
local branch_statuses
|
||||
branch_statuses=("${(@s/,/)match}")
|
||||
for branch_status in $branch_statuses; do
|
||||
if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
|
||||
continue
|
||||
fi
|
||||
local last_parsed_status=$prefix_constant_map[$match[1]]
|
||||
statuses_seen[$last_parsed_status]=$match[2]
|
||||
done
|
||||
fi
|
||||
|
||||
# For each status prefix, do a regex comparison
|
||||
for status_prefix in ${(k)prefix_constant_map}; do
|
||||
local status_constant="${prefix_constant_map[$status_prefix]}"
|
||||
local status_regex=$'(^|\n)'"$status_prefix"
|
||||
|
||||
if [[ "$status_text" =~ $status_regex ]]; then
|
||||
statuses_seen[$status_constant]=1
|
||||
fi
|
||||
done
|
||||
|
||||
# Display the seen statuses in the order specified
|
||||
local status_prompt
|
||||
for status_constant in $status_constants; do
|
||||
if (( ${+statuses_seen[$status_constant]} )); then
|
||||
local next_display=$constant_prompt_map[$status_constant]
|
||||
status_prompt="$next_display$status_prompt"
|
||||
fi
|
||||
done
|
||||
|
||||
echo $status_prompt
|
||||
}
|
||||
|
||||
# Outputs the name of the current user
|
||||
# Usage example: $(git_current_user_name)
|
||||
function git_current_user_name() {
|
||||
|
|
|
|||
|
|
@ -18,10 +18,10 @@ function omz_history {
|
|||
print -u2 History file deleted.
|
||||
elif [[ $# -eq 0 ]]; then
|
||||
# if no arguments provided, show full history starting from 1
|
||||
builtin fc $stamp -l 1
|
||||
builtin fc "${stamp[@]}" -l 1
|
||||
else
|
||||
# otherwise, run `fc -l` with a custom format
|
||||
builtin fc $stamp -l "$@"
|
||||
builtin fc "${stamp[@]}" -l "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backwa
|
|||
bindkey ' ' magic-space # [Space] - don't do history expansion
|
||||
|
||||
|
||||
# Edit the current command line in $EDITOR
|
||||
# Edit the current command line in $VISUAL (or $EDITOR / `vi` if not set)
|
||||
autoload -U edit-command-line
|
||||
zle -N edit-command-line
|
||||
bindkey '\C-x\C-e' edit-command-line
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ function title {
|
|||
: ${2=$1}
|
||||
|
||||
case "$TERM" in
|
||||
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*)
|
||||
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty*|st*|foot*|contour*|wezterm*)
|
||||
print -Pn "\e]2;${2:q}\a" # set window name
|
||||
print -Pn "\e]1;${1:q}\a" # set tab name
|
||||
;;
|
||||
|
|
@ -53,7 +53,7 @@ function omz_termsupport_precmd {
|
|||
|
||||
# Runs before executing the command
|
||||
function omz_termsupport_preexec {
|
||||
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return
|
||||
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return 0
|
||||
|
||||
emulate -L zsh
|
||||
setopt extended_glob
|
||||
|
|
|
|||
|
|
@ -99,8 +99,8 @@ done
|
|||
|
||||
# Figure out the SHORT hostname
|
||||
if [[ "$OSTYPE" = darwin* ]]; then
|
||||
# macOS's $HOST changes with dhcp, etc. Use ComputerName if possible.
|
||||
SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
|
||||
# macOS's $HOST changes with dhcp, etc. Use LocalHostName if possible.
|
||||
SHORT_HOST=$(scutil --get LocalHostName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
|
||||
else
|
||||
SHORT_HOST="${HOST/.*/}"
|
||||
fi
|
||||
|
|
@ -192,7 +192,7 @@ _omz_source() {
|
|||
fi
|
||||
}
|
||||
|
||||
# Load all of the lib files in ~/oh-my-zsh/lib that end in .zsh
|
||||
# Load all of the lib files in ~/.oh-my-zsh/lib that end in .zsh
|
||||
# TIP: Add files you don't want in git to .gitignore
|
||||
for lib_file ("$ZSH"/lib/*.zsh); do
|
||||
_omz_source "lib/${lib_file:t}"
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ plugins=(... alias-finder)
|
|||
|
||||
To enable it for every single command, set zstyle in your `~/.zshrc`.
|
||||
|
||||
If the user has installed `rg`([ripgrep](https://github.com/BurntSushi/ripgrep)), it will be used because it's faster. Otherwise, it will use the `grep` command.
|
||||
|
||||
```zsh
|
||||
# ~/.zshrc
|
||||
|
||||
|
|
@ -28,7 +30,7 @@ When you execute a command alias finder will look at your defined aliases and su
|
|||
|
||||
Running the un-aliased `git status` command:
|
||||
```sh
|
||||
╭─tim@fox ~/repo/gitopolis ‹main›
|
||||
╭─tim@fox ~/repo/gitopolis ‹main›
|
||||
╰─$ git status
|
||||
|
||||
gst='git status' # <=== shorter suggestion from alias-finder
|
||||
|
|
@ -40,7 +42,7 @@ nothing to commit, working tree clean
|
|||
|
||||
Running a shorter `git st` alias from `.gitconfig` that it suggested :
|
||||
```sh
|
||||
╭─tim@fox ~/repo/gitopolis ‹main›
|
||||
╭─tim@fox ~/repo/gitopolis ‹main›
|
||||
╰─$ git st
|
||||
gs='git st' # <=== shorter suggestion from alias-finder
|
||||
## main...origin/main
|
||||
|
|
@ -48,7 +50,7 @@ gs='git st' # <=== shorter suggestion from alias-finder
|
|||
|
||||
Running the shortest `gs` shell alias that it found:
|
||||
```sh
|
||||
╭─tim@fox ~/repo/gitopolis ‹main›
|
||||
╭─tim@fox ~/repo/gitopolis ‹main›
|
||||
╰─$ gs
|
||||
# <=== no suggestions alias-finder because this is the shortest
|
||||
## main...origin/main
|
||||
|
|
|
|||
|
|
@ -36,14 +36,22 @@ alias-finder() {
|
|||
# make filter to find only shorter results than current cmd
|
||||
if [[ $cheaper == true ]]; then
|
||||
cmdLen=$(echo -n "$cmd" | wc -c)
|
||||
filter="^'{0,1}.{0,$((cmdLen - 1))}="
|
||||
if [[ $cmdLen -le 1 ]]; then
|
||||
return
|
||||
fi
|
||||
|
||||
filter="^'?.{1,$((cmdLen - 1))}'?=" # some aliases is surrounded by single quotes
|
||||
fi
|
||||
|
||||
alias | grep -E "$filter" | grep -E "=$finder"
|
||||
if (( $+commands[rg] )); then
|
||||
alias | rg "$filter" | rg "=$finder"
|
||||
else
|
||||
alias | grep -E "$filter" | grep -E "=$finder"
|
||||
fi
|
||||
|
||||
if [[ $exact == true ]]; then
|
||||
break # because exact case is only one
|
||||
elif [[ $longer = true ]]; then
|
||||
elif [[ $longer == true ]]; then
|
||||
break # because above grep command already found every longer aliases during first cycle
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -178,26 +178,27 @@ fi
|
|||
|
||||
# Check Arch Linux PGP Keyring before System Upgrade to prevent failure.
|
||||
function upgrade() {
|
||||
sudo pacman -Sy
|
||||
echo ":: Checking Arch Linux PGP Keyring..."
|
||||
local installedver="$(LANG= sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')"
|
||||
local currentver="$(LANG= sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')"
|
||||
if [ $installedver != $currentver ]; then
|
||||
echo " Arch Linux PGP Keyring is out of date."
|
||||
echo " Updating before full system upgrade."
|
||||
sudo pacman -Sy --needed --noconfirm archlinux-keyring
|
||||
sudo pacman -S --needed --noconfirm archlinux-keyring
|
||||
else
|
||||
echo " Arch Linux PGP Keyring is up to date."
|
||||
echo " Proceeding with full system upgrade."
|
||||
fi
|
||||
if (( $+commands[yay] )); then
|
||||
yay -Syu
|
||||
yay -Su
|
||||
elif (( $+commands[trizen] )); then
|
||||
trizen -Syu
|
||||
trizen -Su
|
||||
elif (( $+commands[pacaur] )); then
|
||||
pacaur -Syu
|
||||
pacaur -Su
|
||||
elif (( $+commands[aura] )); then
|
||||
sudo aura -Syu
|
||||
sudo aura -Su
|
||||
else
|
||||
sudo pacman -Syu
|
||||
sudo pacman -Su
|
||||
fi
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,32 +1,48 @@
|
|||
## asdf
|
||||
# asdf
|
||||
|
||||
Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more.
|
||||
|
||||
### Installation
|
||||
## Installation
|
||||
|
||||
1. [Download asdf](https://asdf-vm.com/guide/getting-started.html#_2-download-asdf) by running the following:
|
||||
|
||||
```
|
||||
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
|
||||
```
|
||||
|
||||
2. [Enable asdf](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf) by adding it to your `plugins` definition in `~/.zshrc`.
|
||||
|
||||
```
|
||||
plugins=(asdf)
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
See the [asdf documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to use asdf:
|
||||
1. [Install](https://asdf-vm.com/guide/getting-started.html#_1-install-asdf) asdf and ensure that's it's discoverable on `$PATH`;
|
||||
2. Enable it by adding it to your `plugins` definition in `~/.zshrc`:
|
||||
|
||||
```sh
|
||||
plugins=(asdf)
|
||||
```
|
||||
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
|
||||
|
||||
## Usage
|
||||
|
||||
Refer to the [asdf plugin documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to add a plugin and install the many runtime versions for it.
|
||||
|
||||
Example for installing the nodejs plugin and the many runtimes for it:
|
||||
|
||||
```sh
|
||||
# Add plugin to asdf
|
||||
asdf plugin add nodejs
|
||||
|
||||
# Install the latest available version
|
||||
asdf install nodejs latest
|
||||
asdf global nodejs latest
|
||||
asdf local nodejs latest
|
||||
|
||||
# Uninstall the latest version
|
||||
asdf uninstall nodejs latest
|
||||
|
||||
# Install a specific version
|
||||
asdf install nodejs 16.5.0
|
||||
|
||||
# Set the latest version in .tool-versions of the `current directory`
|
||||
asdf set nodejs latest
|
||||
|
||||
# Set a specific version in the `parent directory`
|
||||
asdf set -p nodejs 16.5.0 # -p is shorthand for --parent
|
||||
|
||||
# Set a global version under `$HOME`
|
||||
asdf set -u nodejs 16.5.0 # -u is shorthand for --home
|
||||
```
|
||||
|
||||
### Maintainer
|
||||
For more commands, run `asdf help` or refer to the
|
||||
[asdf CLI documentation](https://asdf-vm.com/manage/commands.html#all-commands).
|
||||
|
||||
## Maintainer
|
||||
|
||||
- [@RobLoach](https://github.com/RobLoach)
|
||||
|
|
|
|||
|
|
@ -1,48 +1,15 @@
|
|||
if (( $+commands[asdf] )); then
|
||||
export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
|
||||
path=("$ASDF_DATA_DIR/shims" $path)
|
||||
(( ! $+commands[asdf] )) && return
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `asdf`. Otherwise, compinit will have already done that.
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
|
||||
typeset -g -A _comps
|
||||
autoload -Uz _asdf
|
||||
_comps[asdf]=_asdf
|
||||
fi
|
||||
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|
|
||||
export ASDF_DATA_DIR="${ASDF_DATA_DIR:-$HOME/.asdf}"
|
||||
|
||||
return
|
||||
fi
|
||||
|
||||
# TODO:(2025-02-12): remove deprecated asdf <0.16 code
|
||||
|
||||
# Find where asdf should be installed
|
||||
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
|
||||
ASDF_COMPLETIONS="$ASDF_DIR/completions"
|
||||
|
||||
if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/_asdf" ]]; then
|
||||
# If not found, check for archlinux/AUR package (/opt/asdf-vm/)
|
||||
if [[ -f "/opt/asdf-vm/asdf.sh" ]]; then
|
||||
ASDF_DIR="/opt/asdf-vm"
|
||||
ASDF_COMPLETIONS="$ASDF_DIR"
|
||||
# If not found, check for Homebrew package
|
||||
elif (( $+commands[brew] )); then
|
||||
_ASDF_PREFIX="$(brew --prefix asdf)"
|
||||
ASDF_DIR="${_ASDF_PREFIX}/libexec"
|
||||
ASDF_COMPLETIONS="${_ASDF_PREFIX}/share/zsh/site-functions"
|
||||
unset _ASDF_PREFIX
|
||||
else
|
||||
return
|
||||
fi
|
||||
fi
|
||||
|
||||
# Load command
|
||||
if [[ -f "$ASDF_DIR/asdf.sh" ]]; then
|
||||
source "$ASDF_DIR/asdf.sh"
|
||||
# Load completions
|
||||
if [[ -f "$ASDF_COMPLETIONS/_asdf" ]]; then
|
||||
fpath+=("$ASDF_COMPLETIONS")
|
||||
autoload -Uz _asdf
|
||||
compdef _asdf asdf # compdef is already loaded before loading plugins
|
||||
fi
|
||||
# Add shims to the front of the path, removing if already present.
|
||||
path=("$ASDF_DATA_DIR/shims" ${path:#$ASDF_DATA_DIR/shims})
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `asdf`. Otherwise, compinit will have already done that.
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_asdf" ]]; then
|
||||
typeset -g -A _comps
|
||||
autoload -Uz _asdf
|
||||
_comps[asdf]=_asdf
|
||||
fi
|
||||
asdf completion zsh >| "$ZSH_CACHE_DIR/completions/_asdf" &|
|
||||
|
|
|
|||
|
|
@ -19,6 +19,12 @@ For example:
|
|||
BATTERY_CHARGING="⚡️"
|
||||
```
|
||||
|
||||
You can see the power of your charger using the following setting (MacOS only)
|
||||
|
||||
```zsh
|
||||
BATTERY_SHOW_WATTS=true
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
- On Linux, you must have the `acpi` or `acpitool` commands installed on your operating system.
|
||||
|
|
|
|||
|
|
@ -17,8 +17,13 @@
|
|||
# Modified to add support for OpenBSD #
|
||||
###########################################
|
||||
|
||||
: ${BATTERY_SHOW_WATTS:=false}
|
||||
|
||||
|
||||
if [[ "$OSTYPE" = darwin* ]]; then
|
||||
function get_charger_power() {
|
||||
echo "$(ioreg -rc AppleSmartBattery | grep -o '"Watts"=[0-9]\+' | head -1 | grep -o '[0-9]\+')W "
|
||||
}
|
||||
function battery_is_charging() {
|
||||
ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes'
|
||||
}
|
||||
|
|
@ -58,7 +63,10 @@ if [[ "$OSTYPE" = darwin* ]]; then
|
|||
fi
|
||||
echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}"
|
||||
else
|
||||
echo "${BATTERY_CHARGING-⚡️}"
|
||||
if [[ "${BATTERY_SHOW_WATTS}" = "true" ]] ; then
|
||||
watts=$(get_charger_power)
|
||||
fi
|
||||
echo "${watts}${BATTERY_CHARGING-⚡️}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ function branch_prompt_info() {
|
|||
while [[ "$dir" != '/' ]]; do
|
||||
# Found .git directory
|
||||
if [[ -d "${dir}/.git" ]]; then
|
||||
branch="${"$(<"${dir}/.git/HEAD")"##*/}"
|
||||
branch="${"$(<"${dir}/.git/HEAD")"##ref: refs/heads/}"
|
||||
echo '±' "${branch:gs/%/%%}"
|
||||
return
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -1,7 +1,19 @@
|
|||
# Copies the contents of a given file to the system or X Windows clipboard
|
||||
#
|
||||
# copyfile <file>
|
||||
# Usage: copyfile <file>
|
||||
function copyfile {
|
||||
emulate -L zsh
|
||||
|
||||
if [[ -z "$1" ]]; then
|
||||
echo "Usage: copyfile <file>"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [[ ! -f "$1" ]]; then
|
||||
echo "Error: '$1' is not a valid file."
|
||||
return 1
|
||||
fi
|
||||
|
||||
clipcopy $1
|
||||
echo ${(%):-"%B$1%b copied to clipboard."}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -83,9 +83,9 @@ else
|
|||
}
|
||||
alias ac="su -ls '$apt_pref clean' root"
|
||||
alias ad="su -lc '$apt_pref update' root"
|
||||
alias adg="su -lc '$apt_pref update && aptitude $apt_upgr' root"
|
||||
alias adu="su -lc '$apt_pref update && aptitude dist-upgrade' root"
|
||||
alias afu="su -lc '$apt-file update'"
|
||||
alias adg="su -lc '$apt_pref update && $apt_pref $apt_upgr' root"
|
||||
alias adu="su -lc '$apt_pref update && $apt_pref dist-upgrade' root"
|
||||
alias afu="su -lc 'apt-file update'"
|
||||
alias au="su -lc '$apt_pref $apt_upgr' root"
|
||||
function ai() {
|
||||
cmd="su -lc '$apt_pref install $@' root"
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ _dnf5_rpm_files() {
|
|||
|
||||
_dnf5_packages_or_rpms() {
|
||||
if [[ "$words[CURRENT]" = (*/*|\~*) ]]; then # if looks like a path name
|
||||
_dnf_rpm_files
|
||||
_dnf5_rpm_files
|
||||
else
|
||||
_dnf5_packages "$@"
|
||||
fi
|
||||
|
|
@ -272,7 +272,7 @@ _dnf5-repoquery() {
|
|||
for v in enhance obsolete provide recommend require suggest supplement; do
|
||||
opts+=( "--what${v}s=[limit to packages that $v specified capabilities]:list of capability: ")
|
||||
done
|
||||
# mutually exclusive formating options
|
||||
# mutually exclusive formatting options
|
||||
opts+=(
|
||||
+ '(format)'
|
||||
'--conflicts[display capabilities that the package conflicts with]'
|
||||
|
|
|
|||
|
|
@ -39,6 +39,10 @@ following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more
|
|||
zstyle ':omz:plugins:docker' legacy-completion yes
|
||||
```
|
||||
|
||||
### For Podman's Docker wrapper users
|
||||
|
||||
If you use Podman's Docker wrapper, you need to enable legacy completion. See above section.
|
||||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command | Description |
|
||||
|
|
@ -73,6 +77,7 @@ zstyle ':omz:plugins:docker' legacy-completion yes
|
|||
| drs | `docker container restart` | Restart one or more containers |
|
||||
| dsta | `docker stop $(docker ps -q)` | Stop all running containers |
|
||||
| dstp | `docker container stop` | Stop one or more running containers |
|
||||
| dsts | `docker stats` | Display real-time streaming statistics for containers |
|
||||
| dtop | `docker top` | Display the running processes of a container |
|
||||
| dvi | `docker volume inspect` | Display detailed information about one or more volumes |
|
||||
| dvls | `docker volume ls` | List all the volumes known to docker |
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ alias dst='docker container start'
|
|||
alias drs='docker container restart'
|
||||
alias dsta='docker stop $(docker ps -q)'
|
||||
alias dstp='docker container stop'
|
||||
alias dsts='docker stats'
|
||||
alias dtop='docker top'
|
||||
alias dvi='docker volume inspect'
|
||||
alias dvls='docker volume ls'
|
||||
|
|
|
|||
|
|
@ -23,3 +23,4 @@ plugins=(... dotnet)
|
|||
| dp | dotnet pack | Create a NuGet package. |
|
||||
| dng | dotnet nuget | Provides additional NuGet commands. |
|
||||
| db | dotnet build | Build a .NET project |
|
||||
| dres | dotnet restore | Restore dependencies and project-specific tools for a project. |
|
||||
|
|
@ -10,7 +10,7 @@ _dotnet_completion() {
|
|||
|
||||
compdef _dotnet_completion dotnet
|
||||
|
||||
# Aliases bellow are here for backwards compatibility
|
||||
# Aliases below are here for backwards compatibility
|
||||
# added by Shaun Tabone (https://github.com/xontab)
|
||||
|
||||
alias dn='dotnet new'
|
||||
|
|
@ -24,3 +24,4 @@ alias da='dotnet add'
|
|||
alias dp='dotnet pack'
|
||||
alias dng='dotnet nuget'
|
||||
alias db='dotnet build'
|
||||
alias dres='dotnet restore'
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
|
|||
alias eframe='emacsclient --alternate-editor="" --create-frame'
|
||||
|
||||
# Emacs ANSI Term tracking
|
||||
if [[ -n "$INSIDE_EMACS" ]]; then
|
||||
if [[ -n "$INSIDE_EMACS" ]] && [[ "$INSIDE_EMACS" != "vterm" ]]; then
|
||||
chpwd_emacs() { print -P "\033AnSiTc %d"; }
|
||||
print -P "\033AnSiTc %d" # Track current working directory
|
||||
print -P "\033AnSiTu %n" # Track username
|
||||
|
|
|
|||
|
|
@ -14,53 +14,56 @@ plugins=(... extract)
|
|||
|
||||
## Supported file extensions
|
||||
|
||||
| Extension | Description |
|
||||
| :---------------- | :----------------------------------- |
|
||||
| `7z` | 7zip file |
|
||||
| `Z` | Z archive (LZW) |
|
||||
| `apk` | Android app file |
|
||||
| `aar` | Android library file |
|
||||
| `bz2` | Bzip2 file |
|
||||
| `cab` | Microsoft cabinet archive |
|
||||
| `cpio` | Cpio archive |
|
||||
| `deb` | Debian package |
|
||||
| `ear` | Enterprise Application aRchive |
|
||||
| `exe` | Windows executable file |
|
||||
| `gz` | Gzip file |
|
||||
| `ipa` | iOS app package |
|
||||
| `ipsw` | iOS firmware file |
|
||||
| `jar` | Java Archive |
|
||||
| `lrz` | LRZ archive |
|
||||
| `lz4` | LZ4 archive |
|
||||
| `lzma` | LZMA archive |
|
||||
| `obscpio` | cpio archive used on OBS |
|
||||
| `rar` | WinRAR archive |
|
||||
| `rpm` | RPM package |
|
||||
| `sublime-package` | Sublime Text package |
|
||||
| `tar` | Tarball |
|
||||
| `tar.bz2` | Tarball with bzip2 compression |
|
||||
| `tar.gz` | Tarball with gzip compression |
|
||||
| `tar.lrz` | Tarball with lrzip compression |
|
||||
| `tar.lz` | Tarball with lzip compression |
|
||||
| `tar.lz4` | Tarball with lz4 compression |
|
||||
| `tar.xz` | Tarball with lzma2 compression |
|
||||
| `tar.zma` | Tarball with lzma compression |
|
||||
| `tar.zst` | Tarball with zstd compression |
|
||||
| `tbz` | Tarball with bzip compression |
|
||||
| `tbz2` | Tarball with bzip2 compression |
|
||||
| `tgz` | Tarball with gzip compression |
|
||||
| `tlz` | Tarball with lzma compression |
|
||||
| `txz` | Tarball with lzma2 compression |
|
||||
| `tzst` | Tarball with zstd compression |
|
||||
| `vsix` | VS Code extension zip file |
|
||||
| `war` | Web Application archive (Java-based) |
|
||||
| `whl` | Python wheel file |
|
||||
| `xpi` | Mozilla XPI module file |
|
||||
| `xz` | LZMA2 archive |
|
||||
| `zip` | Zip archive |
|
||||
| `zlib` | zlib archive |
|
||||
| `zst` | Zstandard file (zstd) |
|
||||
| `zpaq` | Zpaq file |
|
||||
| Extension | Description |
|
||||
| :---------------- | :-------------------------------------- |
|
||||
| `7z` | 7zip file |
|
||||
| `apk` | Android app file |
|
||||
| `aar` | Android library file |
|
||||
| `bz2` | Bzip2 file |
|
||||
| `cab` | Microsoft cabinet archive |
|
||||
| `cpio` | Cpio archive |
|
||||
| `deb` | Debian package |
|
||||
| `ear` | Enterprise Application aRchive |
|
||||
| `exe` | Windows executable file |
|
||||
| `gz` | Gzip file |
|
||||
| `ipa` | iOS app package |
|
||||
| `ipsw` | iOS firmware file |
|
||||
| `jar` | Java Archive |
|
||||
| `lrz` | LRZ archive |
|
||||
| `lz4` | LZ4 archive |
|
||||
| `lzma` | LZMA archive |
|
||||
| `obscpio` | cpio archive used on OBS |
|
||||
| `pk3` | Renamed Zip archive used by Quake games |
|
||||
| `pk4` | Renamed Zip archive used by Quake games |
|
||||
| `pk7` | Renamed 7zip file used by Quake games |
|
||||
| `rar` | WinRAR archive |
|
||||
| `rpm` | RPM package |
|
||||
| `sublime-package` | Sublime Text package |
|
||||
| `tar` | Tarball |
|
||||
| `tar.bz2` | Tarball with bzip2 compression |
|
||||
| `tar.gz` | Tarball with gzip compression |
|
||||
| `tar.lrz` | Tarball with lrzip compression |
|
||||
| `tar.lz` | Tarball with lzip compression |
|
||||
| `tar.lz4` | Tarball with lz4 compression |
|
||||
| `tar.xz` | Tarball with lzma2 compression |
|
||||
| `tar.zma` | Tarball with lzma compression |
|
||||
| `tar.zst` | Tarball with zstd compression |
|
||||
| `tbz` | Tarball with bzip compression |
|
||||
| `tbz2` | Tarball with bzip2 compression |
|
||||
| `tgz` | Tarball with gzip compression |
|
||||
| `tlz` | Tarball with lzma compression |
|
||||
| `txz` | Tarball with lzma2 compression |
|
||||
| `tzst` | Tarball with zstd compression |
|
||||
| `vsix` | VS Code extension zip file |
|
||||
| `war` | Web Application archive (Java-based) |
|
||||
| `whl` | Python wheel file |
|
||||
| `xpi` | Mozilla XPI module file |
|
||||
| `xz` | LZMA2 archive |
|
||||
| `Z` | Z archive (LZW) |
|
||||
| `zip` | Zip archive |
|
||||
| `zlib` | zlib archive |
|
||||
| `zst` | Zstandard file (zstd) |
|
||||
| `zpaq` | Zpaq file |
|
||||
|
||||
See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information
|
||||
regarding archive formats.
|
||||
|
|
|
|||
|
|
@ -19,6 +19,9 @@ local -a exts=(
|
|||
lz4
|
||||
lzma
|
||||
obscpio
|
||||
pk3
|
||||
pk4
|
||||
pk7
|
||||
rar
|
||||
rpm
|
||||
sublime-package
|
||||
|
|
|
|||
|
|
@ -76,11 +76,11 @@ EOF
|
|||
(*.lz4) lz4 -d "$full_path" ;;
|
||||
(*.lzma) unlzma "$full_path" ;;
|
||||
(*.z) uncompress "$full_path" ;;
|
||||
(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl|*.vsix|*.crx) 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" ;;
|
||||
(*.rpm)
|
||||
rpm2cpio "$full_path" | cpio --quiet -id ;;
|
||||
(*.7z | *.7z.[0-9]*) 7za x "$full_path" ;;
|
||||
(*.7z | *.7z.[0-9]* | *.pk7) 7za x "$full_path" ;;
|
||||
(*.deb)
|
||||
command mkdir -p "control" "data"
|
||||
ar vx "$full_path" > /dev/null
|
||||
|
|
|
|||
|
|
@ -23,9 +23,10 @@ def get_tagname_or_hash():
|
|||
return hash_
|
||||
return None
|
||||
|
||||
# Re-use method from https://github.com/magicmonty/bash-git-prompt to get stashs count
|
||||
# Re-use method from https://github.com/magicmonty/bash-git-prompt to get stash count
|
||||
# Use `--git-common-dir` to avoid problems with git worktrees, which don't have individual stashes
|
||||
def get_stash():
|
||||
cmd = Popen(['git', 'rev-parse', '--git-dir'], stdout=PIPE, stderr=PIPE)
|
||||
cmd = Popen(['git', 'rev-parse', '--git-common-dir'], stdout=PIPE, stderr=PIPE)
|
||||
so, se = cmd.communicate()
|
||||
stash_file = '%s%s' % (so.decode('utf-8').rstrip(), '/logs/refs/stash')
|
||||
|
||||
|
|
@ -35,7 +36,6 @@ def get_stash():
|
|||
except IOError:
|
||||
return 0
|
||||
|
||||
|
||||
# `git status --porcelain --branch` can collect all information
|
||||
# branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind
|
||||
po = Popen(['git', 'status', '--porcelain', '--branch'], env=dict(os.environ, LANG="C"), stdout=PIPE, stderr=PIPE)
|
||||
|
|
|
|||
|
|
@ -79,6 +79,7 @@ plugins=(... git)
|
|||
| `gcss` | `git commit -S -s` |
|
||||
| `gcssm` | `git commit -S -s -m` |
|
||||
| `gcf` | `git config --list` |
|
||||
| `gcfu` | `git commit --fixup` |
|
||||
| `gdct` | `git describe --tags $(git rev-list --tags --max-count=1)` |
|
||||
| `gd` | `git diff` |
|
||||
| `gdca` | `git diff --cached` |
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ function work_in_progress() {
|
|||
# Aliases
|
||||
# (sorted alphabetically by command)
|
||||
# (order should follow README)
|
||||
# (in some cases force the alisas order to match README, like for example gke and gk)
|
||||
# (in some cases force the alias order to match README, like for example gke and gk)
|
||||
#
|
||||
|
||||
alias grt='cd "$(git rev-parse --show-toplevel || echo .)"'
|
||||
|
|
@ -200,6 +200,7 @@ alias gc!='git commit --verbose --amend'
|
|||
alias gcn='git commit --verbose --no-edit'
|
||||
alias gcn!='git commit --verbose --no-edit --amend'
|
||||
alias gcf='git config --list'
|
||||
alias gcfu='git commit --fixup'
|
||||
alias gdct='git describe --tags $(git rev-list --tags --max-count=1)'
|
||||
alias gd='git diff'
|
||||
alias gdca='git diff --cached'
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@ plugins=(... jj)
|
|||
| jje | `jj edit` |
|
||||
| jjgcl | `jj git clone` |
|
||||
| jjgf | `jj git fetch` |
|
||||
| jjgfa | `jj git fetch --all-remotes` |
|
||||
| jjgp | `jj git push` |
|
||||
| jjl | `jj log` |
|
||||
| jjla | `jj log -r "all()"` |
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ alias jjds='jj desc'
|
|||
alias jje='jj edit'
|
||||
alias jjgcl='jj git clone'
|
||||
alias jjgf='jj git fetch'
|
||||
alias jjgfa='jj git fetch --all-remotes'
|
||||
alias jjgp='jj git push'
|
||||
alias jjl='jj log'
|
||||
alias jjla='jj log -r "all()"'
|
||||
|
|
|
|||
16
plugins/kamal/README.md
Normal file
16
plugins/kamal/README.md
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
# Kamal
|
||||
|
||||
This plugin provides completion for [Kamal](https://kamal-deploy.org/) as well as some
|
||||
aliases for frequent Kamal commands.
|
||||
|
||||
To use it, add kamal to the plugins array of your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... kamal)
|
||||
```
|
||||
|
||||
## Aliase
|
||||
|
||||
| Alias | Command | Description |
|
||||
|-----------|----------------------------------|----------------------------------------------------------------------------------|
|
||||
| kad | `kamal deploy` | Deploy app to servers |
|
||||
691
plugins/kamal/_kamal
Normal file
691
plugins/kamal/_kamal
Normal file
|
|
@ -0,0 +1,691 @@
|
|||
#compdef kamal
|
||||
|
||||
# Description
|
||||
# -----------
|
||||
# zsh completion for Kamal (https://kamal-deploy.org/)
|
||||
# -------------------------------------------------------------------------
|
||||
# Authors
|
||||
# -------
|
||||
# * Igor Aleksandrov <igor.alexandrov@gmail.com>
|
||||
# -------------------------------------------------------------------------
|
||||
# Inspiration
|
||||
# -----------
|
||||
# * docker-compose ohmyzsh completion script by @sdurrheimer Steve Durrheimer
|
||||
# -------------------------------------------------------------------------
|
||||
|
||||
# _kamal_commands() {
|
||||
# # Only initialize if empty
|
||||
# if (( ${#kamal_commands} == 0 )); then
|
||||
# kamal_commands=(
|
||||
# accessory
|
||||
# app
|
||||
# audit
|
||||
# build
|
||||
# config
|
||||
# deploy
|
||||
# details
|
||||
# docs
|
||||
# help
|
||||
# init
|
||||
# lock
|
||||
# proxy
|
||||
# prune
|
||||
# redeploy
|
||||
# registry
|
||||
# remove
|
||||
# rollback
|
||||
# secrets
|
||||
# server
|
||||
# setup
|
||||
# upgrade
|
||||
# version
|
||||
# )
|
||||
# fi
|
||||
|
||||
# _values 'Kamal commands' $kamal_commands
|
||||
# }
|
||||
|
||||
typeset -gr _kamal_commands=(
|
||||
'accessory:Control accessory services'
|
||||
'app:Control application deployment'
|
||||
'audit:Audit security of deployment'
|
||||
'build:Build and manage app images'
|
||||
'config:Show effective configuration'
|
||||
'deploy:Deploy app to servers'
|
||||
'details:Show details about deployment'
|
||||
'docs:Open documentation in browser'
|
||||
'help:Show command help'
|
||||
'init:Initialize new Kamal project'
|
||||
'lock:Manage deployment locks'
|
||||
'proxy:Control reverse proxy'
|
||||
'prune:Clean up containers and images'
|
||||
'redeploy:Redeploy current version'
|
||||
'registry:Manage Docker registry access'
|
||||
'remove:Remove app from servers'
|
||||
'rollback:Rollback to a previous version'
|
||||
'secrets:Manage deployment secrets'
|
||||
'server:Control server configuration'
|
||||
'setup:Setup initial deployment'
|
||||
'upgrade:Upgrade deployment'
|
||||
'version:Show Kamal version'
|
||||
)
|
||||
|
||||
# Helper function to display messages
|
||||
_kamal_message() {
|
||||
local msg="$1"
|
||||
_kamal_message "==> $msg"
|
||||
}
|
||||
|
||||
# Helper function to extract destination names from ./config/deploy.*.yml
|
||||
_kamal_destinations() {
|
||||
local -a dests
|
||||
local file
|
||||
|
||||
# Check if config directory exists
|
||||
if [[ ! -d "config" ]]; then
|
||||
_kamal_message "Cannot find Kamal configuration directory at ./config" && return 1
|
||||
fi
|
||||
|
||||
for file in config/deploy.*.yml(N); do
|
||||
[[ $file =~ config/deploy\.(.+)\.yml ]] && dests+=("${match[1]}")
|
||||
done
|
||||
|
||||
_values 'Destination' $dests
|
||||
}
|
||||
|
||||
# Define global _kamal_flags array
|
||||
typeset -ga _kamal_flags
|
||||
_kamal_flags=(
|
||||
'(-v --verbose )'{-v,--verbose}'[Detailed logging]'
|
||||
'(--no-verbose --skip-verbose)'{--no-verbose,--skip-verbose}'[No detailed logging]'
|
||||
'(-q --quiet --no-quiet --skip-quiet)'{-q,--quiet}'[Minimal logging]'
|
||||
'(-q --quiet --no-quiet --skip-quiet)'{--no-quiet,--skip-quiet}'[No minimal logging]'
|
||||
'--version=[Run commands against a specific app version]:version'
|
||||
'(-p --primary --no-primary --skip-primary)'{-p,--primary}'[Run commands only on primary host instead of all]'
|
||||
'(-p --primary --no-primary --skip-primary)'{--no-primary,--skip-primary}'[Do not run commands only on primary host]'
|
||||
'(-h --hosts)'{-h,--hosts=}'[Run commands on these hosts instead of all]:hosts'
|
||||
'(-r --roles)'{-r,--roles=}'[Run commands on these roles instead of all]:roles'
|
||||
'(-c --config-file)'{-c,--config-file=}'[Path to config file]:config file:_files'
|
||||
'(-d --destination)'{-d,--destination=}'[Specify destination to be used for config file]:destination:_kamal_destinations'
|
||||
'(-H --skip-hooks)'{-H,--skip-hooks}'[Do not run hooks]'
|
||||
)
|
||||
|
||||
_kamal() {
|
||||
local context state state_descr line curcontext="$curcontext"
|
||||
typeset -A opt_args
|
||||
|
||||
local ret=1
|
||||
|
||||
_arguments -C \
|
||||
$_kamal_flags \
|
||||
'1: :->command' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(command)
|
||||
# First argument - show available commands
|
||||
_describe -t kamal-commands "Kamal commands" _kamal_commands && ret=0
|
||||
;;
|
||||
(args)
|
||||
# Subsequent arguments - handle based on the command
|
||||
case $words[1] in
|
||||
(accessory)
|
||||
_kamal_accessory && ret=0
|
||||
;;
|
||||
(app)
|
||||
_kamal_app && ret=0
|
||||
;;
|
||||
(audit)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(build)
|
||||
_kamal_build && ret=0
|
||||
;;
|
||||
(config)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(deploy)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(details)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(docs)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(help)
|
||||
_kamal_help && ret=0
|
||||
;;
|
||||
(init)
|
||||
local -a init_flags
|
||||
init_flags=(
|
||||
$_kamal_flags
|
||||
'(--bundle --no-bundle --skip-bundle)--bundle[Add Kamal to the Gemfile and create a bin/kamal binstub]'
|
||||
'(--bundle --no-bundle --skip-bundle)--no-bundle[Do not add Kamal to the Gemfile and create a bin/kamal binstub]'
|
||||
'(--bundle --no-bundle --skip-bundle)--skip-bundle[Skip add Kamal to the Gemfile and create a bin/kamal binstub]'
|
||||
)
|
||||
_arguments $init_flags && ret=0
|
||||
;;
|
||||
(lock)
|
||||
_kamal_lock && ret=0
|
||||
;;
|
||||
(proxy)
|
||||
_kamal_proxy && ret=0
|
||||
;;
|
||||
(prune)
|
||||
_kamal_prune && ret=0
|
||||
;;
|
||||
(redeploy)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(registry)
|
||||
_kamal_registry && ret=0
|
||||
;;
|
||||
(remove)
|
||||
local -a remove_flags
|
||||
remove_flags=(
|
||||
$_kamal_flags
|
||||
'(-y --confirmed --no-confirmed --skip-confirmed)'{-y,--confirmed}'[Proceed without confirmation question]'
|
||||
'(-y --confirmed --no-confirmed --skip-confirmed)--no-confirmed[Proceed without confirmation question]'
|
||||
'(-y --confirmed --no-confirmed --skip-confirmed)--skip-confirmed[Proceed without confirmation question]'
|
||||
)
|
||||
_arguments $remove_flags && ret=0
|
||||
;;
|
||||
(rollback)
|
||||
if (( CURRENT == 2 )); then
|
||||
_kamal_message "Enter the version to rollback to" && ret=0
|
||||
else
|
||||
_values $_kamal_flags && ret=0
|
||||
fi
|
||||
;;
|
||||
(secrets)
|
||||
_kamal_secrets && ret=0
|
||||
;;
|
||||
(server)
|
||||
_kamal_server && ret=0
|
||||
;;
|
||||
(setup)
|
||||
local -a setup_flags
|
||||
setup_flags=(
|
||||
$_kamal_flags
|
||||
'(-P --skip-push)'{-P,--skip-push}'[Skip image build and push]'
|
||||
)
|
||||
_arguments $setup_flags && ret=0
|
||||
;;
|
||||
(upgrade)
|
||||
local -a upgrade_flags
|
||||
upgrade_flags=(
|
||||
$_kamal_flags
|
||||
'(-y --confirmed --no-confirmed --skip-confirmed)'{-y,--confirmed}'[Proceed without confirmation question]'
|
||||
'(-y --confirmed --no-confirmed --skip-confirmed)--no-confirmed[Do not proceed without confirmation question]'
|
||||
'(-y --confirmed --no-confirmed --skip-confirmed)--skip-confirmed[Skip confirmation question]'
|
||||
'(--rolling --no-rolling --skip-rolling)--rolling[Upgrade one host at a time]'
|
||||
'(--rolling --no-rolling --skip-rolling)--no-rolling[Do not upgrade one host at a time]'
|
||||
'(--rolling --no-rolling --skip-rolling)--skip-rolling[Skip rolling upgrade]'
|
||||
)
|
||||
_arguments $upgrade_flags && ret=0
|
||||
;;
|
||||
(version)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_accessory() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
# Define accessory subcommands
|
||||
local -a accessory_subcommands
|
||||
accessory_subcommands=(
|
||||
"boot:Boot new accessory service on host (use NAME=all to boot all accessories)"
|
||||
"details:Show details about accessory on host (use NAME=all to show all accessories)"
|
||||
"exec:Execute a custom command on servers within the accessory container (use --help to show options)"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"logs:Show log lines from accessory on host (use --help to show options)"
|
||||
"reboot:Reboot existing accessory on host (stop container, remove container, start new container; use NAME=all to boot all accessories)"
|
||||
"remove:Remove accessory container, image and data directory from host (use NAME=all to remove all accessories)"
|
||||
"restart:Restart existing accessory container on host"
|
||||
"start:Start existing accessory container on host"
|
||||
"stop:Stop existing accessory container on host"
|
||||
"upgrade:Upgrade accessories from Kamal 1.x to 2.0 (restart them in 'kamal' network)"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t accessory-commands "Kamal accessory commands" accessory_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(boot|details|exec|logs|reboot|remove|restart|start|stop)
|
||||
# These commands require a NAME parameter
|
||||
if (( CURRENT == 2 )); then
|
||||
# At the NAME position - we could add accessory name completion here
|
||||
# if we had a way to list available accessories
|
||||
_kamal_message "Specify an accessory name (or 'all' for all accessories)" && ret=0
|
||||
elif [[ "$words[1]" == "exec" && CURRENT == 3 ]]; then
|
||||
# For exec, the 3rd argument is a command
|
||||
_kamal_message "Enter a command to execute" && ret=0
|
||||
elif (( CURRENT > 2 )) && [[ "$words[1]" != "exec" || CURRENT > 3 ]]; then
|
||||
_values $_kamal_flags && ret=0
|
||||
fi
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
accessory_subcommands=("${(@)accessory_subcommands:#help*}")
|
||||
_describe -t accessory-help-commands "Kamal accessory help commands" accessory_subcommands
|
||||
;;
|
||||
(upgrade)
|
||||
# For upgrade, show flags immediately
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_app() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a app_subcommands
|
||||
app_subcommands=(
|
||||
"boot:Boot app on servers (or reboot app if already running)"
|
||||
"containers:Show app containers on servers"
|
||||
"details:Show details about app containers"
|
||||
"exec:Execute a custom command on servers within the app container (use --help to show options)"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"images:Show app images on servers"
|
||||
"logs:Show log lines from app on servers (use --help to show options)"
|
||||
"remove:Remove app containers and images from servers"
|
||||
"stale_containers:Detect app stale containers"
|
||||
"start:Start existing app container on servers"
|
||||
"stop:Stop app container on servers"
|
||||
"version:Show app version currently running on servers"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t app-commands "Kamal app commands" app_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(boot|containers|details|images|logs|remove|stale_containers|start|stop)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(exec)
|
||||
# For exec, the next argument is a command
|
||||
if (( CURRENT == 2 )); then
|
||||
_kamal_message "Enter a command to execute" && ret=0
|
||||
else
|
||||
_values $_kamal_flags && ret=0
|
||||
fi
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
app_subcommands=("${(@)app_subcommands:#help*}")
|
||||
_describe -t app-help-commands "Kamal app help commands" app_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_build() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a build_subcommands
|
||||
build_subcommands=(
|
||||
"create:Create a build setup"
|
||||
"deliver:Build app and push app image to registry then pull image on servers"
|
||||
"details:Show build setup"
|
||||
"dev:Build using the working directory, tag it as dirty, and push to local image store."
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"pull:Pull app image from registry onto servers"
|
||||
"push:Build and push app image to registry"
|
||||
"remove:Remove build setup"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t build-commands "Kamal build commands" build_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(create|deliver|details|dev|pull|push|remove)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
build_subcommands=("${(@)build_subcommands:#help*}")
|
||||
_describe -t build-help-commands "Kamal build help commands" build_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_help() {
|
||||
local ret=1
|
||||
|
||||
# Make sure kamal_commands is initialized properly
|
||||
# if (( ${#kamal_commands} == 0 )); then
|
||||
# _kamal_commands >/dev/null
|
||||
# fi
|
||||
|
||||
# If we already have a command after "help", return without suggestions
|
||||
if (( CURRENT > 2 )); then
|
||||
ret=0
|
||||
else
|
||||
local -a help_commands
|
||||
# Filter out help from the list of commands
|
||||
help_commands=("${(@)_kamal_commands:#help}")
|
||||
|
||||
_values 'Kamal help' $help_commands && ret=0
|
||||
fi
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_lock() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a lock_subcommands
|
||||
lock_subcommands=(
|
||||
"acquire:Acquire the deploy lock"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"release:Release the deploy lock"
|
||||
"status:Report lock status"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t lock-commands "Kamal lock commands" lock_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(acquire)
|
||||
local -a acquire_flags
|
||||
acquire_flags=(
|
||||
$_kamal_flags
|
||||
'(-m --message)'{-m,--message=}'[A lock message]:message:' # Required flag
|
||||
)
|
||||
_arguments $acquire_flags && ret=0
|
||||
;;
|
||||
(release|status)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
lock_subcommands=("${(@)lock_subcommands:#help*}")
|
||||
_describe -t lock-help-commands "Kamal lock help commands" lock_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_proxy() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a proxy_subcommands
|
||||
proxy_subcommands=(
|
||||
"boot:Boot proxy on servers"
|
||||
"boot_config:Manage kamal-proxy boot configuration"
|
||||
"details:Show details about proxy container from servers"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"logs:Show log lines from proxy on servers"
|
||||
"reboot:Reboot proxy on servers (stop container, remove container, start new container)"
|
||||
"remove:Remove proxy container and image from servers"
|
||||
"restart:Restart existing proxy container on servers"
|
||||
"start:Start existing proxy container on servers"
|
||||
"stop:Stop existing proxy container on servers"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t proxy-commands "Kamal proxy commands" proxy_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(boot|details|logs|reboot|remove|restart|start|stop)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(boot_config)
|
||||
if (( CURRENT == 2 )); then
|
||||
local -a boot_config_commands=(
|
||||
"set:Set boot configuration"
|
||||
"get:Get boot configuration"
|
||||
"reset:Reset boot configuration"
|
||||
)
|
||||
_describe -t boot-config-commands "Boot config commands" boot_config_commands && ret=0
|
||||
else
|
||||
_values $_kamal_flags && ret=0
|
||||
fi
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
proxy_subcommands=("${(@)proxy_subcommands:#help*}")
|
||||
_describe -t proxy-help-commands "Kamal proxy help commands" proxy_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_prune() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a prune_subcommands
|
||||
prune_subcommands=(
|
||||
"all:Prune unused images and stopped containers"
|
||||
"containers:Prune all stopped containers, except the last n (default 5)"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"images:Prune unused images"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t prune-commands "Kamal prune commands" prune_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(all|containers|images)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
prune_subcommands=("${(@)prune_subcommands:#help*}")
|
||||
_describe -t prune-help-commands "Kamal prune help commands" prune_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_registry() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a registry_subcommands
|
||||
registry_subcommands=(
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"login:Log in to registry locally and remotely"
|
||||
"logout:Log out of registry locally and remotely"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t registry-commands "Kamal registry commands" registry_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
registry_subcommands=("${(@)registry_subcommands:#help*}")
|
||||
_describe -t registry-help-commands "Kamal registry help commands" registry_subcommands
|
||||
;;
|
||||
(login|logout)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_secrets() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a secrets_subcommands
|
||||
secrets_subcommands=(
|
||||
"extract:Extract a single secret from the results of a fetch call"
|
||||
"fetch:Fetch secrets from a vault"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
"print:Print the secrets (for debugging)"
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t secrets-commands "Kamal secrets commands" secrets_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(fetch)
|
||||
local -a fetch_flags
|
||||
fetch_flags=(
|
||||
$_kamal_flags
|
||||
'(-a --adapter)'{-a,--adapter=}'[Secret storage adapter]:adapter:(aws-parameter-store)'
|
||||
)
|
||||
_arguments $fetch_flags && ret=0
|
||||
;;
|
||||
(extract|print)
|
||||
_arguments $_kamal_flags && ret=0
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
secrets_subcommands=("${(@)secrets_subcommands:#help*}")
|
||||
_describe -t secrets-help-commands "Kamal secrets help commands" secrets_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal_server() {
|
||||
local context state line
|
||||
typeset -A opt_args
|
||||
local ret=1
|
||||
|
||||
local -a server_subcommands
|
||||
server_subcommands=(
|
||||
"bootstrap:Set up Docker to run Kamal apps"
|
||||
"exec:Run a custom command on the server (use --help to show options)"
|
||||
"help:Describe subcommands or one specific subcommand"
|
||||
)
|
||||
|
||||
local -a server_flags
|
||||
server_flags=(
|
||||
$_kamal_flags
|
||||
'(-i --interactive --no-interactive --skip-interactive)'{-i,--interactive}'[Run the command interactively]'
|
||||
'(-i --interactive --no-interactive --skip-interactive)--no-interactive[Do not run the command interactively]'
|
||||
'(-i --interactive --no-interactive --skip-interactive)--skip-interactive[Skip interactive mode]'
|
||||
)
|
||||
|
||||
_arguments -C \
|
||||
'1: :->subcmd' \
|
||||
'*:: :->args' && ret=0
|
||||
|
||||
case $state in
|
||||
(subcmd)
|
||||
_describe -t server-commands "Kamal server commands" server_subcommands && ret=0
|
||||
;;
|
||||
(args)
|
||||
case $words[1] in
|
||||
(bootstrap)
|
||||
_arguments $server_flags && ret=0
|
||||
;;
|
||||
(exec)
|
||||
if (( CURRENT == 2 )); then
|
||||
# For exec, the next argument is a command
|
||||
_kamal_message "Enter a command to execute" && ret=0
|
||||
else
|
||||
_values $server_flags && ret=0
|
||||
fi
|
||||
;;
|
||||
(help)
|
||||
# Remove help itself from the list of commands
|
||||
server_subcommands=("${(@)server_subcommands:#help*}")
|
||||
_describe -t server-help-commands "Kamal server help commands" server_subcommands
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
_kamal "$@"
|
||||
25
plugins/kamal/kamal.plugin.zsh
Normal file
25
plugins/kamal/kamal.plugin.zsh
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
# Find kamal binary (local ./bin/kamal or global)
|
||||
function _kamal_command () {
|
||||
if [ -x "./bin/kamal" ]; then
|
||||
./bin/kamal "$@"
|
||||
else
|
||||
command kamal "$@"
|
||||
fi
|
||||
}
|
||||
|
||||
function which-kamal() {
|
||||
if [ -x "./bin/kamal" ]; then
|
||||
echo "Using local ./bin/kamal"
|
||||
else
|
||||
echo "Using global $(command -v kamal)"
|
||||
fi
|
||||
}
|
||||
|
||||
# Use `_kamal_command`` function for `kamal` command
|
||||
alias kamal='_kamal_command'
|
||||
|
||||
# Aliases
|
||||
alias kad='kamal deploy'
|
||||
|
||||
# Hook up completion
|
||||
compdef _kamal_command=kamal
|
||||
|
|
@ -19,8 +19,15 @@ function {
|
|||
# load additional options
|
||||
zstyle -a :omz:plugins:keychain options options
|
||||
|
||||
# start keychain...
|
||||
keychain ${^options:-} --agents ${agents:-gpg} ${^identities} --host $SHORT_HOST
|
||||
# Check keychain version to decide whether to use --agents
|
||||
local version_string=$(keychain --version 2>&1 | head -n 2 | tail -n 1 | cut -d ' ' -f 4)
|
||||
# start keychain, only use --agents for versions below 2.9.0
|
||||
autoload -Uz is-at-least
|
||||
if is-at-least 2.9 "$version_string"; then
|
||||
keychain ${^options:-} ${^identities} --host $SHORT_HOST
|
||||
else
|
||||
keychain ${^options:-} --agents ${agents:-gpg} ${^identities} --host $SHORT_HOST
|
||||
fi
|
||||
|
||||
# Get the filenames to store/lookup the environment from
|
||||
_keychain_env_sh="$HOME/.keychain/$SHORT_HOST-sh"
|
||||
|
|
|
|||
|
|
@ -11,126 +11,128 @@ plugins=(... kubectl)
|
|||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command | Description |
|
||||
| :------- | :------------------------------------------------- | :----------------------------------------------------------------------------------------------- |
|
||||
| k | `kubectl` | The kubectl command |
|
||||
| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces |
|
||||
| kaf | `kubectl apply -f` | Apply a YML file |
|
||||
| kak | `kubectl apply -k` | Apply a kustomization directory |
|
||||
| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container |
|
||||
| | | **Manage configuration quickly to switch contexts between local, dev and staging** |
|
||||
| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file |
|
||||
| kcsc | `kubectl config set-context` | Set a context entry in kubeconfig |
|
||||
| kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig |
|
||||
| kccc | `kubectl config current-context` | Display the current-context |
|
||||
| kcgc | `kubectl config get-contexts` | List of contexts available |
|
||||
| | | **General aliases** |
|
||||
| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
|
||||
| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument |
|
||||
| kdelk | `kubectl delete -k` | Delete all resources defined in a kustomization directory |
|
||||
| | | **Pod management** |
|
||||
| kgp | `kubectl get pods` | List all pods in ps output format |
|
||||
| kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` |
|
||||
| kgpn | `kgp -n` | Get pods by namespace. Example: `kgpn kube-system` |
|
||||
| kgpsl | `kubectl get pods --show-labels` | List all pods in ps output format with labels |
|
||||
| kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes |
|
||||
| kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included |
|
||||
| kep | `kubectl edit pods` | Edit pods from the default editor |
|
||||
| kdp | `kubectl describe pods` | Describe all pods |
|
||||
| kdelp | `kubectl delete pods` | Delete all pods matching passed arguments |
|
||||
| | | **Service management** |
|
||||
| kgs | `kubectl get svc` | List all services in ps output format |
|
||||
| kgsw | `kgs --watch` | After listing all services, watch for changes |
|
||||
| kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information |
|
||||
| kes | `kubectl edit svc` | Edit services(svc) from the default editor |
|
||||
| kds | `kubectl describe svc` | Describe all services in detail |
|
||||
| kdels | `kubectl delete svc` | Delete all services matching passed argument |
|
||||
| | | **Ingress management** |
|
||||
| kgi | `kubectl get ingress` | List ingress resources in ps output format |
|
||||
| kei | `kubectl edit ingress` | Edit ingress resource from the default editor |
|
||||
| kdi | `kubectl describe ingress` | Describe ingress resource in detail |
|
||||
| kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument |
|
||||
| | | **Namespace management** |
|
||||
| kgns | `kubectl get namespaces` | List the current namespaces in a cluster |
|
||||
| kcn | `kubectl config set-context --current --namespace` | Change current namespace |
|
||||
| kens | `kubectl edit namespace` | Edit namespace resource from the default editor |
|
||||
| kdns | `kubectl describe namespace` | Describe namespace resource in detail |
|
||||
| kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace |
|
||||
| | | **ConfigMap management** |
|
||||
| kgcm | `kubectl get configmaps` | List the configmaps in ps output format |
|
||||
| kecm | `kubectl edit configmap` | Edit configmap resource from the default editor |
|
||||
| kdcm | `kubectl describe configmap` | Describe configmap resource in detail |
|
||||
| kdelcm | `kubectl delete configmap` | Delete the configmap |
|
||||
| | | **Secret management** |
|
||||
| kgsec | `kubectl get secret` | Get secret for decoding |
|
||||
| kdsec | `kubectl describe secret` | Describe secret resource in detail |
|
||||
| kdelsec | `kubectl delete secret` | Delete the secret |
|
||||
| | | **Deployment management** |
|
||||
| kgd | `kubectl get deployment` | Get the deployment |
|
||||
| kgdw | `kgd --watch` | After getting the deployment, watch for changes |
|
||||
| kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information |
|
||||
| ked | `kubectl edit deployment` | Edit deployment resource from the default editor |
|
||||
| kdd | `kubectl describe deployment` | Describe deployment resource in detail |
|
||||
| kdeld | `kubectl delete deployment` | Delete the deployment |
|
||||
| ksd | `kubectl scale deployment` | Scale a deployment |
|
||||
| krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment |
|
||||
| kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime |
|
||||
| | | **Rollout management** |
|
||||
| kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment |
|
||||
| kdrs | `kubectl describe replicaset` | Describe ReplicaSet in detail |
|
||||
| kers | `kubectl edit replicaset` | Edit ReplicaSet from the default editor |
|
||||
| krh | `kubectl rollout history` | Check the revisions of this deployment |
|
||||
| kru | `kubectl rollout undo` | Rollback to the previous revision |
|
||||
| | | **Port forwarding** |
|
||||
| kpf | `kubectl port-forward` | Forward one or more local ports to a pod |
|
||||
| | | **Tools for accessing all information** |
|
||||
| kga | `kubectl get all` | List all resources in ps format |
|
||||
| kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces |
|
||||
| | | **Logs** |
|
||||
| kl | `kubectl logs` | Print the logs for a container or resource |
|
||||
| klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) |
|
||||
| | | **File copy** |
|
||||
| kcp | `kubectl cp` | Copy files and directories to and from containers |
|
||||
| | | **Node management** |
|
||||
| kgno | `kubectl get nodes` | List the nodes in ps output format |
|
||||
| kgnosl | `kubectl get nodes --show-labels` | List the nodes in ps output format with labels |
|
||||
| keno | `kubectl edit node` | Edit nodes resource from the default editor |
|
||||
| kdno | `kubectl describe node` | Describe node resource in detail |
|
||||
| kdelno | `kubectl delete node` | Delete the node |
|
||||
| | | **Persistent Volume Claim management** |
|
||||
| kgpvc | `kubectl get pvc` | List all PVCs |
|
||||
| kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes |
|
||||
| kepvc | `kubectl edit pvc` | Edit pvcs from the default editor |
|
||||
| kdpvc | `kubectl describe pvc` | Describe all pvcs |
|
||||
| kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments |
|
||||
| | | **StatefulSets management** |
|
||||
| kgss | `kubectl get statefulset` | List the statefulsets in ps format |
|
||||
| kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes |
|
||||
| kgsswide | `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information |
|
||||
| kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor |
|
||||
| kdss | `kubectl describe statefulset` | Describe statefulset resource in detail |
|
||||
| kdelss | `kubectl delete statefulset` | Delete the statefulset |
|
||||
| ksss | `kubectl scale statefulset` | Scale a statefulset |
|
||||
| krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment |
|
||||
| | | **Service Accounts management** |
|
||||
| kdsa | `kubectl describe sa` | Describe a service account in details |
|
||||
| kdelsa | `kubectl delete sa` | Delete the service account |
|
||||
| | | **DaemonSet management** |
|
||||
| kgds | `kubectl get daemonset` | List all DaemonSets in ps output format |
|
||||
| kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes |
|
||||
| keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor |
|
||||
| kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail |
|
||||
| kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument |
|
||||
| | | **CronJob management** |
|
||||
| kgcj | `kubectl get cronjob` | List all CronJobs in ps output format |
|
||||
| kecj | `kubectl edit cronjob` | Edit CronJob from the default editor |
|
||||
| kdcj | `kubectl describe cronjob` | Describe a CronJob in details |
|
||||
| kdelcj | `kubectl delete cronjob` | Delete the CronJob |
|
||||
| | | **Job management** |
|
||||
| kgj | `kubectl get job` | List all Job in ps output format |
|
||||
| kej | `kubectl edit job` | Edit a Job in details |
|
||||
| kdj | `kubectl describe job` | Describe the Job |
|
||||
| kdelj | `kubectl delete job` | Delete the Job |
|
||||
| Alias | Command | Description |
|
||||
| :------- | :------------------------------------------------------ | :----------------------------------------------------------------------------------------------- |
|
||||
| k | `kubectl` | The kubectl command |
|
||||
| kca | `kubectl --all-namespaces` | The kubectl command targeting all namespaces |
|
||||
| kaf | `kubectl apply -f` | Apply a YML file |
|
||||
| kak | `kubectl apply -k` | Apply a kustomization directory |
|
||||
| keti | `kubectl exec -ti` | Drop into an interactive terminal on a container |
|
||||
| | | **Manage configuration quickly to switch contexts between local, dev and staging** |
|
||||
| kcuc | `kubectl config use-context` | Set the current-context in a kubeconfig file |
|
||||
| kcsc | `kubectl config set-context` | Set a context entry in kubeconfig |
|
||||
| kcdc | `kubectl config delete-context` | Delete the specified context from the kubeconfig |
|
||||
| kccc | `kubectl config current-context` | Display the current-context |
|
||||
| kcgc | `kubectl config get-contexts` | List of contexts available |
|
||||
| | | **General aliases** |
|
||||
| kdel | `kubectl delete` | Delete resources by filenames, stdin, resources and names, or by resources and label selector |
|
||||
| kdelf | `kubectl delete -f` | Delete a pod using the type and name specified in -f argument |
|
||||
| kdelk | `kubectl delete -k` | Delete all resources defined in a kustomization directory |
|
||||
| kge | `kubectl get events --sort-by=".lastTimestamp"` | Get events (sorted by timestamp) |
|
||||
| kgew | `kubectl get events --watch --sort-by=".lastTimestamp"` | Get events and watch as they occur (sorted by timestamp) |
|
||||
| | | **Pod management** |
|
||||
| kgp | `kubectl get pods` | List all pods in ps output format |
|
||||
| kgpl | `kgp -l` | Get pods by label. Example: `kgpl "app=myapp" -n myns` |
|
||||
| kgpn | `kgp -n` | Get pods by namespace. Example: `kgpn kube-system` |
|
||||
| kgpsl | `kubectl get pods --show-labels` | List all pods in ps output format with labels |
|
||||
| kgpw | `kgp --watch` | After listing/getting the requested object, watch for changes |
|
||||
| kgpwide | `kgp -o wide` | Output in plain-text format with any additional information. For pods, the node name is included |
|
||||
| kep | `kubectl edit pods` | Edit pods from the default editor |
|
||||
| kdp | `kubectl describe pods` | Describe all pods |
|
||||
| kdelp | `kubectl delete pods` | Delete all pods matching passed arguments |
|
||||
| | | **Service management** |
|
||||
| kgs | `kubectl get svc` | List all services in ps output format |
|
||||
| kgsw | `kgs --watch` | After listing all services, watch for changes |
|
||||
| kgswide | `kgs -o wide` | After listing all services, output in plain-text format with any additional information |
|
||||
| kes | `kubectl edit svc` | Edit services(svc) from the default editor |
|
||||
| kds | `kubectl describe svc` | Describe all services in detail |
|
||||
| kdels | `kubectl delete svc` | Delete all services matching passed argument |
|
||||
| | | **Ingress management** |
|
||||
| kgi | `kubectl get ingress` | List ingress resources in ps output format |
|
||||
| kei | `kubectl edit ingress` | Edit ingress resource from the default editor |
|
||||
| kdi | `kubectl describe ingress` | Describe ingress resource in detail |
|
||||
| kdeli | `kubectl delete ingress` | Delete ingress resources matching passed argument |
|
||||
| | | **Namespace management** |
|
||||
| kgns | `kubectl get namespaces` | List the current namespaces in a cluster |
|
||||
| kcn | `kubectl config set-context --current --namespace` | Change current namespace |
|
||||
| kens | `kubectl edit namespace` | Edit namespace resource from the default editor |
|
||||
| kdns | `kubectl describe namespace` | Describe namespace resource in detail |
|
||||
| kdelns | `kubectl delete namespace` | Delete the namespace. WARNING! This deletes everything in the namespace |
|
||||
| | | **ConfigMap management** |
|
||||
| kgcm | `kubectl get configmaps` | List the configmaps in ps output format |
|
||||
| kecm | `kubectl edit configmap` | Edit configmap resource from the default editor |
|
||||
| kdcm | `kubectl describe configmap` | Describe configmap resource in detail |
|
||||
| kdelcm | `kubectl delete configmap` | Delete the configmap |
|
||||
| | | **Secret management** |
|
||||
| kgsec | `kubectl get secret` | Get secret for decoding |
|
||||
| kdsec | `kubectl describe secret` | Describe secret resource in detail |
|
||||
| kdelsec | `kubectl delete secret` | Delete the secret |
|
||||
| | | **Deployment management** |
|
||||
| kgd | `kubectl get deployment` | Get the deployment |
|
||||
| kgdw | `kgd --watch` | After getting the deployment, watch for changes |
|
||||
| kgdwide | `kgd -o wide` | After getting the deployment, output in plain-text format with any additional information |
|
||||
| ked | `kubectl edit deployment` | Edit deployment resource from the default editor |
|
||||
| kdd | `kubectl describe deployment` | Describe deployment resource in detail |
|
||||
| kdeld | `kubectl delete deployment` | Delete the deployment |
|
||||
| ksd | `kubectl scale deployment` | Scale a deployment |
|
||||
| krsd | `kubectl rollout status deployment` | Check the rollout status of a deployment |
|
||||
| kres | `kubectl set env $@ REFRESHED_AT=...` | Recreate all pods in deployment with zero-downtime |
|
||||
| | | **Rollout management** |
|
||||
| kgrs | `kubectl get replicaset` | List all ReplicaSets `rs` created by the deployment |
|
||||
| kdrs | `kubectl describe replicaset` | Describe ReplicaSet in detail |
|
||||
| kers | `kubectl edit replicaset` | Edit ReplicaSet from the default editor |
|
||||
| krh | `kubectl rollout history` | Check the revisions of this deployment |
|
||||
| kru | `kubectl rollout undo` | Rollback to the previous revision |
|
||||
| | | **Port forwarding** |
|
||||
| kpf | `kubectl port-forward` | Forward one or more local ports to a pod |
|
||||
| | | **Tools for accessing all information** |
|
||||
| kga | `kubectl get all` | List all resources in ps format |
|
||||
| kgaa | `kubectl get all --all-namespaces` | List the requested object(s) across all namespaces |
|
||||
| | | **Logs** |
|
||||
| kl | `kubectl logs` | Print the logs for a container or resource |
|
||||
| klf | `kubectl logs -f` | Stream the logs for a container or resource (follow) |
|
||||
| | | **File copy** |
|
||||
| kcp | `kubectl cp` | Copy files and directories to and from containers |
|
||||
| | | **Node management** |
|
||||
| kgno | `kubectl get nodes` | List the nodes in ps output format |
|
||||
| kgnosl | `kubectl get nodes --show-labels` | List the nodes in ps output format with labels |
|
||||
| keno | `kubectl edit node` | Edit nodes resource from the default editor |
|
||||
| kdno | `kubectl describe node` | Describe node resource in detail |
|
||||
| kdelno | `kubectl delete node` | Delete the node |
|
||||
| | | **Persistent Volume Claim management** |
|
||||
| kgpvc | `kubectl get pvc` | List all PVCs |
|
||||
| kgpvcw | `kgpvc --watch` | After listing/getting the requested object, watch for changes |
|
||||
| kepvc | `kubectl edit pvc` | Edit pvcs from the default editor |
|
||||
| kdpvc | `kubectl describe pvc` | Describe all pvcs |
|
||||
| kdelpvc | `kubectl delete pvc` | Delete all pvcs matching passed arguments |
|
||||
| | | **StatefulSets management** |
|
||||
| kgss | `kubectl get statefulset` | List the statefulsets in ps format |
|
||||
| kgssw | `kgss --watch` | After getting the list of statefulsets, watch for changes |
|
||||
| kgsswide | `kgss -o wide` | After getting the statefulsets, output in plain-text format with any additional information |
|
||||
| kess | `kubectl edit statefulset` | Edit statefulset resource from the default editor |
|
||||
| kdss | `kubectl describe statefulset` | Describe statefulset resource in detail |
|
||||
| kdelss | `kubectl delete statefulset` | Delete the statefulset |
|
||||
| ksss | `kubectl scale statefulset` | Scale a statefulset |
|
||||
| krsss | `kubectl rollout status statefulset` | Check the rollout status of a deployment |
|
||||
| | | **Service Accounts management** |
|
||||
| kdsa | `kubectl describe sa` | Describe a service account in details |
|
||||
| kdelsa | `kubectl delete sa` | Delete the service account |
|
||||
| | | **DaemonSet management** |
|
||||
| kgds | `kubectl get daemonset` | List all DaemonSets in ps output format |
|
||||
| kgdsw | `kgds --watch` | After listing all DaemonSets, watch for changes |
|
||||
| keds | `kubectl edit daemonset` | Edit DaemonSets from the default editor |
|
||||
| kdds | `kubectl describe daemonset` | Describe all DaemonSets in detail |
|
||||
| kdelds | `kubectl delete daemonset` | Delete all DaemonSets matching passed argument |
|
||||
| | | **CronJob management** |
|
||||
| kgcj | `kubectl get cronjob` | List all CronJobs in ps output format |
|
||||
| kecj | `kubectl edit cronjob` | Edit CronJob from the default editor |
|
||||
| kdcj | `kubectl describe cronjob` | Describe a CronJob in details |
|
||||
| kdelcj | `kubectl delete cronjob` | Delete the CronJob |
|
||||
| | | **Job management** |
|
||||
| kgj | `kubectl get job` | List all Job in ps output format |
|
||||
| kej | `kubectl edit job` | Edit a Job in details |
|
||||
| kdj | `kubectl describe job` | Describe the Job |
|
||||
| kdelj | `kubectl delete job` | Delete the Job |
|
||||
|
||||
## Wrappers
|
||||
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@ alias kcgc='kubectl config get-contexts'
|
|||
alias kdel='kubectl delete'
|
||||
alias kdelf='kubectl delete -f'
|
||||
alias kdelk='kubectl delete -k'
|
||||
alias kge='kubectl get events --sort-by=".lastTimestamp"'
|
||||
alias kgew='kubectl get events --sort-by=".lastTimestamp" --watch'
|
||||
|
||||
# Pod management.
|
||||
alias kgp='kubectl get pods'
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@ plugins=(... laravel)
|
|||
| `pamfs` | `php artisan migrate:fresh --seed` |
|
||||
| `pamr` | `php artisan migrate:rollback` |
|
||||
| `pads` | `php artisan db:seed` |
|
||||
| `padw` | `php artisan db:wipe` |
|
||||
|
||||
## Makers
|
||||
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ alias pamf='php artisan migrate:fresh'
|
|||
alias pamfs='php artisan migrate:fresh --seed'
|
||||
alias pamr='php artisan migrate:rollback'
|
||||
alias pads='php artisan db:seed'
|
||||
alias padw='php artisan db:wipe'
|
||||
|
||||
# Makers
|
||||
alias pamm='php artisan make:model'
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ function man-preview() {
|
|||
[[ $# -eq 0 ]] && >&2 echo "Usage: $0 command1 [command2 ...]" && return 1
|
||||
|
||||
local page
|
||||
for page in "${(@f)"$(man -w $@)"}"; do
|
||||
for page in "${(@f)"$(command man -w $@)"}"; do
|
||||
command mandoc -Tpdf $page | open -f -a Preview
|
||||
done
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,6 +33,8 @@ if it's found, or the mvn command otherwise.
|
|||
| `mvnct` | `mvn clean test` |
|
||||
| `mvncv` | `mvn clean verify` |
|
||||
| `mvncvst` | `mvn clean verify -DskipTests` |
|
||||
| `mvnv` | `mvn verify` |
|
||||
| `mvnvst` | `mvn verify -DskipTests` |
|
||||
| `mvndp` | `mvn deploy` |
|
||||
| `mvndocs` | `mvn dependency:resolve -Dclassifier=javadoc` |
|
||||
| `mvndt` | `mvn dependency:tree` |
|
||||
|
|
|
|||
|
|
@ -62,6 +62,8 @@ alias mvncp='mvn clean package'
|
|||
alias mvnct='mvn clean test'
|
||||
alias mvncv='mvn clean verify'
|
||||
alias mvncvst='mvn clean verify -DskipTests'
|
||||
alias mvnv='mvn verify'
|
||||
alias mvnvst='mvn verify -DskipTests'
|
||||
alias mvndp='mvn deploy'
|
||||
alias mvndocs='mvn dependency:resolve -Dclassifier=javadoc'
|
||||
alias mvndt='mvn dependency:tree'
|
||||
|
|
|
|||
|
|
@ -20,17 +20,17 @@ the next time you autocomplete `pip install`.
|
|||
|
||||
## Aliases
|
||||
|
||||
| Alias | Description |
|
||||
| :------- | :-------------------------------------------- |
|
||||
| pipi | Install packages |
|
||||
| pipig | Install package from GitHub repository |
|
||||
| pipigb | Install package from GitHub branch |
|
||||
| pipigp | Install package from GitHub pull request |
|
||||
| pipu | Upgrade packages |
|
||||
| pipun | Uninstall packages |
|
||||
| pipgi | Grep through installed packages |
|
||||
| piplo | List outdated packages |
|
||||
| pipreq | Create requirements file |
|
||||
| pipir | Install packages from `requirements.txt` file |
|
||||
| pipupall | Update all installed packages |
|
||||
| pipunall | Uninstall all installed packages |
|
||||
| Alias | Command | Description |
|
||||
| :--------|:----------------------------------------------------------------------------------|:--------------------------------------------- |
|
||||
| pipi | `pip install` | Install packages |
|
||||
| pipig | `pip install "git+https://github.com/user/repo.git"` | Install package from GitHub repository |
|
||||
| pipigb | `pip install "git+https://github.com/user/repo.git@branch"` | Install package from GitHub branch |
|
||||
| pipigp | `pip install "git+https://github.com/user/repo.git@refs/pull/PR_NUMBER/head"` | Install package from GitHub pull request |
|
||||
| pipu | `pip install --upgrade` | Upgrade packages |
|
||||
| pipun | `pip uninstall` | Uninstall packages |
|
||||
| pipgi | `pip freeze \| grep` | Grep through installed packages |
|
||||
| piplo | `pip list --outdated` | List outdated packages |
|
||||
| pipreq | `pip freeze > requirements.txt` | Create requirements file |
|
||||
| pipir | `pip install -r requirements.txt` | Install packages from `requirements.txt` file |
|
||||
| pipupall | `pip list --outdated \| awk 'NR > 2 { print $1 }' \| xargs pip install --upgrade` | Update all installed packages |
|
||||
| pipunall | `pip list --format freeze \| cut -d= -f1 \| xargs pip uninstall` | Uninstall all installed packages |
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
_togglePoetryShell() {
|
||||
# Determine if currently in a Poetry-managed directory
|
||||
local in_poetry_dir=0
|
||||
if [[ -f "$PWD/pyproject.toml" ]] && grep -q 'tool.poetry' "$PWD/pyproject.toml"; then
|
||||
if [[ -f "$PWD/pyproject.toml" && -f "$PWD/poetry.lock" ]]; then
|
||||
in_poetry_dir=1
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -3,11 +3,19 @@ if (( ! $+commands[procs] )); then
|
|||
fi
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `minikube`. Otherwise, compinit will have already done that.
|
||||
# bind it to `procs`. Otherwise, compinit will have already done that.
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_procs" ]]; then
|
||||
typeset -g -A _comps
|
||||
autoload -Uz _procs
|
||||
_comps[procs]=_procs
|
||||
fi
|
||||
|
||||
procs --gen-completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs" &|
|
||||
{
|
||||
autoload -Uz is-at-least
|
||||
local _version=$(procs --version)
|
||||
if is-at-least "0.14" "${_version#procs }"; then
|
||||
procs --gen-completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs"
|
||||
else
|
||||
procs --completion-out zsh >| "$ZSH_CACHE_DIR/completions/_procs"
|
||||
fi
|
||||
} &|
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ virtual environments:
|
|||
`<venv-name>/bin/activate`, and automatically deactivate it when navigating out of it (keeps venv activated
|
||||
in subdirectories).
|
||||
- To enable the feature, set `PYTHON_AUTO_VRUN=true` before sourcing oh-my-zsh.
|
||||
- The plugin activates the first existing virtual environment, in order, appearing in `$PYTON_VENV_NAMES`.
|
||||
- The plugin activates the first existing virtual environment, in order, appearing in `$PYTHON_VENV_NAMES`.
|
||||
The default virtual environment name is `venv`. To use a different name, set
|
||||
`PYTHON_VENV_NAME=<venv-name>`. For example: `PYTHON_VENV_NAME=".venv"`
|
||||
|
||||
|
|
|
|||
|
|
@ -29,9 +29,24 @@ function rbwpw {
|
|||
echo "$service not found"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Generate a random identifier for this call to rbwpw
|
||||
# so we can check if the clipboard content has changed
|
||||
local _random="$RANDOM" _cache="$ZSH_CACHE_DIR/.rbwpw"
|
||||
echo -n "$_random" > "$_cache"
|
||||
|
||||
# Use clipcopy to copy the password to the clipboard
|
||||
echo -n $pw | clipcopy
|
||||
echo "password for $service copied!"
|
||||
{sleep 20 && clipcopy </dev/null 2>/dev/null} &|
|
||||
|
||||
# Clear the clipboard after 20 seconds, but only if the clipboard hasn't
|
||||
# changed (if rbwpw hasn't been called again)
|
||||
{
|
||||
sleep 20 \
|
||||
&& [[ "$(<"$_cache")" == "$_random" ]] \
|
||||
&& clipcopy </dev/null 2>/dev/null \
|
||||
&& command rm -f "$_cache" &>/dev/null
|
||||
} &|
|
||||
}
|
||||
|
||||
function _rbwpw {
|
||||
|
|
|
|||
|
|
@ -1,16 +1,26 @@
|
|||
# rsync
|
||||
|
||||
This plugin adds aliases for frequent [rsync](https://rsync.samba.org/) commands.
|
||||
This plugin adds aliases for frequent [rsync](https://rsync.samba.org/) commands, simplifying file transfer and synchronization tasks.
|
||||
|
||||
To use it add `rsync` to the plugins array in you zshrc file.
|
||||
To use it add `rsync` to the plugins array in you `.zshrc` file.
|
||||
|
||||
```zsh
|
||||
plugins=(... rsync)
|
||||
```
|
||||
|
||||
| Alias | Command |
|
||||
| ------------------- | ------------------------------------------------ |
|
||||
| *rsync-copy* | `rsync -avz --progress -h` |
|
||||
| *rsync-move* | `rsync -avz --progress -h --remove-source-files` |
|
||||
| *rsync-update* | `rsync -avzu --progress -h` |
|
||||
| *rsync-synchronize* | `rsync -avzu --delete --progress -h` |
|
||||
| Alias | Command | Description |
|
||||
| ------------------- | ------------------------------------------------ | ------------|
|
||||
| `rsync-copy` | `rsync -avz --progress -h` | Recursively copy files and directories, preserving permissions, timestamps, and symbolic links. Compression is enabled for faster transfers. Progress is displayed in a human-readable format. |
|
||||
| `rsync-move` | `rsync -avz --progress -h --remove-source-files` | Same as rsync-copy, but removes the source files after a successful transfer (effectively performing a move). |
|
||||
| `rsync-update` | `rsync -avzu --progress -h` | Like rsync-copy, but only updates files if the source is newer than the destination (or if the destination file is missing). |
|
||||
| `rsync-synchronize` | `rsync -avzu --delete --progress -h` | Performs bidirectional-style sync: updates files as in rsync-update and deletes files in the destination that no longer exist in the source. Useful for directory synchronization. |
|
||||
|
||||
Explanation of Flags:
|
||||
- -a: Archive mode; preserves symbolic links, permissions, timestamps, etc.
|
||||
- -v: Verbose; shows details of the transfer process.
|
||||
- -z: Compress file data during transfer for efficiency.
|
||||
- -u: Skip files that are newer on the receiver.
|
||||
- --progress: Show progress during file transfer.
|
||||
- -h: Output numbers in human-readable format (e.g., 1K, 234M).
|
||||
- --remove-source-files: Deletes source files after they are copied (used in rsync-move).
|
||||
- --delete: Deletes files in the destination that are not present in the source (used in rsync-synchronize).
|
||||
|
|
|
|||
|
|
@ -49,4 +49,4 @@ plugins=(... systemadmin)
|
|||
| geteip | Gather information regarding an external IP address using [icanhazip.com](https://icanhazip.com) |
|
||||
| getip | Determine the local IP Address with `ip addr` or `ifconfig` |
|
||||
| clrz | Clear zombie processes |
|
||||
| conssec | Show number of concurrent connections per second based on ngnix/access.log file or another log file if specified |
|
||||
| conssec | Show number of concurrent connections per second based on nginx/access.log file or another log file if specified |
|
||||
|
|
|
|||
|
|
@ -15,25 +15,26 @@ plugins=(... terraform)
|
|||
|
||||
## Aliases
|
||||
|
||||
| Alias | Command |
|
||||
|---------|----------------------------------|
|
||||
| `tf` | `terraform` |
|
||||
| `tfa` | `terraform apply` |
|
||||
| `tfaa` | `terraform apply -auto-approve` |
|
||||
| `tfc` | `terraform console` |
|
||||
| `tfd` | `terraform destroy` |
|
||||
| `tfd!` | `terraform destroy -auto-approve`|
|
||||
| `tff` | `terraform fmt` |
|
||||
| `tffr` | `terraform fmt -recursive` |
|
||||
| `tfi` | `terraform init` |
|
||||
| `tfiu` | `terraform init -upgrade` |
|
||||
| `tfo` | `terraform output` |
|
||||
| `tfp` | `terraform plan` |
|
||||
| `tfv` | `terraform validate` |
|
||||
| `tfs` | `terraform state` |
|
||||
| `tft` | `terraform test` |
|
||||
| `tfsh` | `terraform show` |
|
||||
|
||||
| Alias | Command |
|
||||
| ------- | -------------------------------------- |
|
||||
| `tf` | `terraform` |
|
||||
| `tfa` | `terraform apply` |
|
||||
| `tfaa` | `terraform apply -auto-approve` |
|
||||
| `tfc` | `terraform console` |
|
||||
| `tfd` | `terraform destroy` |
|
||||
| `tfd!` | `terraform destroy -auto-approve` |
|
||||
| `tff` | `terraform fmt` |
|
||||
| `tffr` | `terraform fmt -recursive` |
|
||||
| `tfi` | `terraform init` |
|
||||
| `tfir` | `terraform init -reconfigure` |
|
||||
| `tfiu` | `terraform init -upgrade` |
|
||||
| `tfiur` | `terraform init -upgrade -reconfigure` |
|
||||
| `tfo` | `terraform output` |
|
||||
| `tfp` | `terraform plan` |
|
||||
| `tfv` | `terraform validate` |
|
||||
| `tfs` | `terraform state` |
|
||||
| `tft` | `terraform test` |
|
||||
| `tfsh` | `terraform show` |
|
||||
|
||||
## Prompt function
|
||||
|
||||
|
|
|
|||
|
|
@ -24,7 +24,9 @@ alias 'tfd!'='terraform destroy -auto-approve'
|
|||
alias tff='terraform fmt'
|
||||
alias tffr='terraform fmt -recursive'
|
||||
alias tfi='terraform init'
|
||||
alias tfir='terraform init -reconfigure'
|
||||
alias tfiu='terraform init -upgrade'
|
||||
alias tfiur='terraform init -upgrade -reconfigure'
|
||||
alias tfo='terraform output'
|
||||
alias tfp='terraform plan'
|
||||
alias tfv='terraform validate'
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ The plugin also supports the following:
|
|||
|
||||
| Variable | Description |
|
||||
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
||||
| `ZSH_TMUX_AUTOREFRESH` | Automatically refresh global environments (default: `true`) |
|
||||
| `ZSH_TMUX_AUTOREFRESH` | Automatically refresh global environments (default: `false`) |
|
||||
| `ZSH_TMUX_AUTOSTART` | Automatically starts tmux (default: `false`) |
|
||||
| `ZSH_TMUX_AUTOSTART_ONCE` | Autostart only if tmux hasn't been started previously (default: `true`) |
|
||||
| `ZSH_TMUX_AUTOCONNECT` | Automatically connect to a previous session if it exits (default: `true`) |
|
||||
|
|
|
|||
|
|
@ -16,7 +16,7 @@ fi
|
|||
# Automatically name the new session based on the basename of PWD
|
||||
: ${ZSH_TMUX_AUTONAME_SESSION:=false}
|
||||
# Automatically pick up tmux environments
|
||||
: ${ZSH_TMUX_AUTOREFRESH:=true}
|
||||
: ${ZSH_TMUX_AUTOREFRESH:=false}
|
||||
# Set term to screen or screen-256color based on current terminal support
|
||||
: ${ZSH_TMUX_DETACHED:=false}
|
||||
# Set detached mode
|
||||
|
|
@ -188,7 +188,7 @@ function _tmux_directory_session() {
|
|||
alias tds=_tmux_directory_session
|
||||
|
||||
# Autostart if not already in tmux and enabled.
|
||||
if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" && -z "$INTELLIJ_ENVIRONMENT_READER" ]]; then
|
||||
if [[ -z "$TMUX" && "$ZSH_TMUX_AUTOSTART" == "true" && -z "$INSIDE_EMACS" && -z "$EMACS" && -z "$VIM" && -z "$INTELLIJ_ENVIRONMENT_READER" && -z "$ZED_TERM" ]]; then
|
||||
# Actually don't autostart if we already did and multiple autostarts are disabled.
|
||||
if [[ "$ZSH_TMUX_AUTOSTART_ONCE" == "false" || "$ZSH_TMUX_AUTOSTARTED" != "true" ]]; then
|
||||
export ZSH_TMUX_AUTOSTARTED=true
|
||||
|
|
|
|||
|
|
@ -10,10 +10,11 @@ plugins=(... ubuntu)
|
|||
|
||||
## Aliases
|
||||
|
||||
Commands that use `$APT` will use `apt` if installed or defer to `apt-get` otherwise.
|
||||
Commands that use `$APT` will use `apt-fast` if installed, or `apt` if installed, or defer to `apt-get`
|
||||
otherwise.
|
||||
|
||||
| Alias | Command | Description |
|
||||
|---------|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
|
||||
| ------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------- |
|
||||
| age | `sudo $APT` | Run apt-get with sudo |
|
||||
| acs | `apt-cache search` | Search the apt-cache with the specified criteria |
|
||||
| acsp | `apt-cache showpkg` | Shows information about the listed packages |
|
||||
|
|
@ -26,7 +27,7 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
|
|||
| agd | `sudo $APT dselect-upgrade` | Follows dselect choices for package installation |
|
||||
| agi | `sudo $APT install <pkg>` | Install the specified package |
|
||||
| agli | `apt list --installed` | List the installed packages |
|
||||
| aglu | `sudo apt-get -u upgrade --assume-no` | Run an apt-get upgrade assuming no to all prompts |
|
||||
| aglu | `apt list --upgradable` | List available updates only |
|
||||
| agp | `sudo $APT purge <pkg>` | Remove a package including any configuration files |
|
||||
| agr | `sudo $APT remove <pkg>` | Remove a package |
|
||||
| ags | `$APT source <pkg>` | Fetch the source for the specified package |
|
||||
|
|
@ -36,21 +37,20 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
|
|||
| agar | `sudo $APT autoremove` | Remove automatically installed packages no longer needed |
|
||||
| aguu | `sudo $APT update && sudo $APT upgrade` | Update packages list and upgrade available packages |
|
||||
| allpkgs | `dpkg --get-selections \| grep -v deinstall` | Print all installed packages |
|
||||
| kclean | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` |Remove ALL kernel images and headers EXCEPT the one in use |
|
||||
| kclean | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` | Remove ALL kernel images and headers EXCEPT the one in use |
|
||||
| mydeb | `time dpkg-buildpackage -rfakeroot -us -uc` | Create a basic .deb package |
|
||||
| ppap | `sudo ppa-purge <ppa>` | Remove the specified PPA |
|
||||
|
||||
|
||||
## Functions
|
||||
|
||||
| Function | Usage |Description |
|
||||
|-------------------|---------------------------------------|--------------------------------------------------------------------------|
|
||||
| Function | Usage | Description |
|
||||
| ----------------- | ------------------------------------- | ------------------------------------------------------------------------ |
|
||||
| aar | `aar ppa:xxxxxx/xxxxxx [packagename]` | apt-add-repository with automatic install/upgrade of the desired package |
|
||||
| apt-history | `apt-history <action>` | Prints the Apt history of the specified action |
|
||||
| apt-list-packages | `apt-list-packages` | List packages by size |
|
||||
| kerndeb | `kerndeb` | Kernel-package building shortcut |
|
||||
|
||||
## Authors:
|
||||
## Authors
|
||||
|
||||
- [@AlexBio](https://github.com/AlexBio)
|
||||
- [@dbb](https://github.com/dbb)
|
||||
|
|
@ -59,3 +59,4 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
|
|||
- [Nicolas Jonas](https://nextgenthemes.com)
|
||||
- [@loctauxphilippe](https://github.com/loctauxphilippe)
|
||||
- [@HaraldNordgren](https://github.com/HaraldNordgren)
|
||||
- [@AmrElsayyad](https://github.com/AmrElsayyad)
|
||||
|
|
|
|||
|
|
@ -1,11 +1,22 @@
|
|||
(( $+commands[apt] )) && APT=apt || APT=apt-get
|
||||
# Detect available package manager (prefer apt-fast > apt > apt-get)
|
||||
if (( $+commands[apt-fast] )); then
|
||||
APT=apt-fast
|
||||
elif (( $+commands[apt] )); then
|
||||
APT=apt
|
||||
else
|
||||
APT=apt-get
|
||||
fi
|
||||
|
||||
alias acs='apt-cache search'
|
||||
|
||||
alias afs='apt-file search --regexp'
|
||||
|
||||
# These are apt/apt-get only
|
||||
alias ags="$APT source"
|
||||
if (( $+commands[apt] )); then
|
||||
alias ags="apt source"
|
||||
else
|
||||
alias ags="apt-get source"
|
||||
fi
|
||||
|
||||
alias acp='apt-cache policy'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,46 +1,76 @@
|
|||
# universalarchive plugin
|
||||
|
||||
Lets you compress files by a command `ua <format> <files>`, supporting various
|
||||
compression formats (e.g. 7z, tar.gz, lzma, ...).
|
||||
The `universalarchive` plugin provides a convenient command-line interface for archiving files and directories using a wide variety of compression formats - without having to remember the exact syntax for each tool.
|
||||
|
||||
To enable it, add `universalarchive` to the plugins array in your zshrc file:
|
||||
To enable it, add `universalarchive` to the plugins array in your `.zshrc` file:
|
||||
|
||||
```zsh
|
||||
plugins=(... universalarchive)
|
||||
```
|
||||
|
||||
## Features
|
||||
- Compress files and directories using a simple, unified command: ua <format> <files>
|
||||
- Automatically detects file/directory names to generate appropriate output names
|
||||
- Supports fallback naming if an output file already exists
|
||||
- Works with many common and advanced compression formats
|
||||
- Designed for simplicity and quick use in the terminal
|
||||
|
||||
## Usage
|
||||
|
||||
Run `ua <format> <files>` to compress `<files>` into an archive file using `<format>`.
|
||||
For example:
|
||||
|
||||
Basic command format:
|
||||
```sh
|
||||
ua xz *.html
|
||||
ua <format> <files...>
|
||||
```
|
||||
- `<format>`: the archive format to use (e.g., `zip`, `tar.gz`, `xz`, `7z`, etc.)
|
||||
- `<files...>`: one or more files or directories to compress
|
||||
|
||||
## Examples:
|
||||
|
||||
Compresses `notes.txt` and `images` into `notes.zip`
|
||||
```sh
|
||||
ua zip notes.txt images/
|
||||
```
|
||||
|
||||
this command will compress all `.html` files in directory `folder` into `folder.xz`.
|
||||
Creates `myproject.tar.gz`
|
||||
```sh
|
||||
ua tar.gz myproject/
|
||||
```
|
||||
|
||||
This plugin saves you from having to remember which command line arguments compress a file.
|
||||
Compresses all .log files into `current_folder.xz`
|
||||
```sh
|
||||
ua xz *.log
|
||||
```
|
||||
|
||||
## Supported compression formats
|
||||
The plugin will generate a default archive filename based on the input:
|
||||
- For a file, the output is derived from the file name without its extension.
|
||||
- For a directory, it uses the directory name.
|
||||
- For multiple files, it uses the name of the common parent directory.
|
||||
|
||||
| Extension | Description |
|
||||
|:-----------------|:-------------------------------|
|
||||
| `7z` | 7zip file |
|
||||
| `bz2` | Bzip2 file |
|
||||
| `gz` | Gzip file |
|
||||
| `lzma` | LZMA archive |
|
||||
| `lzo` | LZO archive |
|
||||
| `rar` | WinRAR archive |
|
||||
| `tar` | Tarball |
|
||||
| `tbz`/`tar.bz2` | Tarball with bzip2 compression |
|
||||
| `tgz`/`tar.gz` | Tarball with gzip compression |
|
||||
| `tlz`/`tar.lzma` | Tarball with lzma compression |
|
||||
| `txz`/`tar.xz` | Tarball with lzma2 compression |
|
||||
| `tZ`/`tar.Z` | Tarball with LZW compression |
|
||||
| `xz` | LZMA2 archive |
|
||||
| `Z` | Z archive (LZW) |
|
||||
| `zip` | Zip archive |
|
||||
| `zst` | Zstd archive |
|
||||
If the output file already exists, a unique filename is generated using `mktemp`.
|
||||
|
||||
See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information regarding the archive formats.
|
||||
## Supported Archive Formats
|
||||
|
||||
| Format | Description | Tool Used |
|
||||
|:-----------------|:-------------------------------|:-----------------|
|
||||
| `7z` | 7zip archive | `7z` |
|
||||
| `bz2` | Bzip2-compressed file | `bzip2` |
|
||||
| `gz` | Gzip-compressed file | `gzip` |
|
||||
| `lzma` | LZMA-compressed file | `lzma` |
|
||||
| `lzo` | LZO-compressed file | `lzop` |
|
||||
| `rar` | WinRAR archive | `rar` |
|
||||
| `tar` | Uncompressed tarball | `tar` |
|
||||
| `tbz`,`tar.bz2` | Tarball compressed with Bzip2 | `tar + bzip2` |
|
||||
| `tgz`,`tar.gz` | Tarball compressed with Gzip | `tar + gzip` |
|
||||
| `tlz`,`tar.lzma` | Tarball compressed with LZMA | `tar + lzma` |
|
||||
| `txz`,`tar.xz` | Tarball compressed with LZMA2 | `tar + xz` |
|
||||
| `tZ`,`tar.Z` | Tarball compressed with LZW | `tar + compress` |
|
||||
| `xz` | XZ-compressed file | `xz` |
|
||||
| `Z` | LZW-compressed file | `compress` |
|
||||
| `zip` | Standard Zip archive | `zip` |
|
||||
| `zst` | Zstandard-compressed file | `zstd` |
|
||||
|
||||
> Note: Some formats may require specific tools to be installed on your system (e.g. `7z`, `rar`, `lzop`, `zstd`). Make sure these tools are available in your `$PATH`.
|
||||
|
||||
## Auto-Completion
|
||||
|
||||
The plugin provides tab-completion for supported formats and input files. Type `ua <TAB>` to see available formats, and `ua <format> <TAB>` to browse files.
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ hasn't been defined by theme, *Insert mode* is not displayed by default.
|
|||
|
||||
You can change these indicators by setting the `MODE_INDICATOR` (*Normal mode*) and
|
||||
`INSERT_MODE_INDICATORS` (*Insert mode*) variables.
|
||||
This settings support Prompt Expansion sequences. For example:
|
||||
These settings support Prompt Expansion sequences. For example:
|
||||
|
||||
```zsh
|
||||
MODE_INDICATOR="%F{white}+%f"
|
||||
|
|
@ -157,6 +157,27 @@ NOTE: delete/kill commands (`dd`, `D`, `c{motion}`, `C`, `x`,`X`) and yank comma
|
|||
(`y`, `Y`) will copy to the clipboard. Contents can then be put back using paste commands
|
||||
(`P`, `p`).
|
||||
|
||||
## Text objects
|
||||
|
||||
Standard text objects are supported with `i` ("inside") and `a` ("around"), e.g., for words; thus, you can select the word the cursor is in with `viw`, or delete the current word, including surrounding spaces, with `daw`.
|
||||
|
||||
For other text objects, you can rely on the built-in functionality of Zsh and enable it accordingly.
|
||||
For example, for quoted strings, you can copy the commented snippet of <https://sourceforge.net/p/zsh/code/ci/master/tree/Functions/Zle/select-quoted>: place this in your `.zsrhc` file, e.g., after sourcing oh-my-zsh:
|
||||
|
||||
```sh
|
||||
autoload -U select-quoted
|
||||
zle -N select-quoted
|
||||
for m in visual viopp; do
|
||||
for c in {a,i}{\',\",\`}; do
|
||||
bindkey -M $m $c select-quoted
|
||||
done
|
||||
done
|
||||
```
|
||||
|
||||
Now, in normal mode, you can select everything inside a double-quoted string with `vi"`.
|
||||
Note that this works even if you're not already inside a quoted string.
|
||||
For example, you can replace everything inside a single-quoted string in the current line, from wherever the cursor is, with `ci'`.
|
||||
|
||||
## Known issues
|
||||
|
||||
### Low `$KEYTIMEOUT`
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
function virtualenv_prompt_info(){
|
||||
[[ -n ${VIRTUAL_ENV} ]] || return
|
||||
echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV:t:gs/%/%%}${ZSH_THEME_VIRTUALENV_SUFFIX=]}"
|
||||
echo "${ZSH_THEME_VIRTUALENV_PREFIX=[}${VIRTUAL_ENV_PROMPT:-${VIRTUAL_ENV:t:gs/%/%%}}${ZSH_THEME_VIRTUALENV_SUFFIX=]}"
|
||||
}
|
||||
|
||||
# disables prompt mangling in virtual_env/bin/activate
|
||||
|
|
|
|||
|
|
@ -65,12 +65,9 @@ Add the following to your `home.nix` then run `home-manager switch`:
|
|||
programs.zsh.plugins = [
|
||||
{
|
||||
name = "wd";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "mfaerevaag";
|
||||
repo = "wd";
|
||||
rev = "v0.5.2";
|
||||
sha256 = "sha256-4yJ1qhqhNULbQmt6Z9G22gURfDLe30uV1ascbzqgdhg=";
|
||||
};
|
||||
src = pkgs.zsh-wd;
|
||||
file = "share/wd/wd.plugin.zsh";
|
||||
completions = [ "share/zsh/site-functions" ];
|
||||
}
|
||||
];
|
||||
```
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ function _wd() {
|
|||
'rm:Removes the given warp point'
|
||||
'list:Outputs all stored warp points'
|
||||
'ls:Show files from given warp point'
|
||||
'open:Open warp point in the default file explorer'
|
||||
'path:Show path to given warp point'
|
||||
'show:Outputs all warp points that point to the current directory or shows a specific target directory for a point'
|
||||
'help:Show this extremely helpful text'
|
||||
|
|
@ -73,6 +74,9 @@ function _wd() {
|
|||
ls)
|
||||
_describe -t points "Warp points" warp_points && ret=0
|
||||
;;
|
||||
open)
|
||||
_describe -t points "Warp points" warp_points && ret=0
|
||||
;;
|
||||
path)
|
||||
_describe -t points "Warp points" warp_points && ret=0
|
||||
;;
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
# @github.com/mfaerevaag/wd
|
||||
|
||||
# version
|
||||
readonly WD_VERSION=0.9.3
|
||||
readonly WD_VERSION=0.10.1
|
||||
|
||||
# colors
|
||||
readonly WD_BLUE="\033[96m"
|
||||
|
|
@ -86,6 +86,7 @@ Commands:
|
|||
show Print warp points to current directory
|
||||
list Print all stored warp points
|
||||
ls <point> Show files from given warp point (ls)
|
||||
open <point> Open the warp point in the default file explorer (open / xdg-open)
|
||||
path <point> Show the path to given warp point (pwd)
|
||||
clean Remove points warping to nonexistent directories (will prompt unless --force is used)
|
||||
|
||||
|
|
@ -173,6 +174,11 @@ wd_add()
|
|||
point=$(basename "$PWD")
|
||||
fi
|
||||
|
||||
if [ ! -w "$wd_config_file" ]; then
|
||||
wd_exit_fail "\'$wd_config_file\' is not writeable."
|
||||
return
|
||||
fi
|
||||
|
||||
if [[ $point =~ "^[\.]+$" ]]
|
||||
then
|
||||
wd_exit_fail "Warp point cannot be just dots"
|
||||
|
|
@ -238,6 +244,11 @@ wd_remove()
|
|||
point_list=$(basename "$PWD")
|
||||
fi
|
||||
|
||||
if [ ! -w "$wd_config_file" ]; then
|
||||
wd_exit_fail "\'$wd_config_file\' is not writeable."
|
||||
return
|
||||
fi
|
||||
|
||||
for point_name in $point_list ; do
|
||||
if [[ ${points[$point_name]} != "" ]]
|
||||
then
|
||||
|
|
@ -377,6 +388,21 @@ wd_ls()
|
|||
ls "${dir/#\~/$HOME}"
|
||||
}
|
||||
|
||||
wd_open()
|
||||
{
|
||||
wd_getdir "$1"
|
||||
if command -v open >/dev/null 2>&1; then
|
||||
# MacOS, Ubuntu (alias)
|
||||
open "${dir/#\~/$HOME}"
|
||||
elif command -v xdg-open >/dev/null 2>&1; then
|
||||
# Most Linux desktops
|
||||
xdg-open "${dir/#\~/$HOME}"
|
||||
else
|
||||
echo "No known file opener found (need 'open' or 'xdg-open')." >&2
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
wd_path()
|
||||
{
|
||||
wd_getdir "$1"
|
||||
|
|
@ -424,6 +450,11 @@ wd_clean() {
|
|||
local count=0
|
||||
local wd_tmp=""
|
||||
|
||||
if [ ! -w "$wd_config_file" ]; then
|
||||
wd_exit_fail "\'$wd_config_file\' is not writeable."
|
||||
return
|
||||
fi
|
||||
|
||||
while read -r line
|
||||
do
|
||||
if [[ $line != "" ]]
|
||||
|
|
@ -521,20 +552,12 @@ do
|
|||
done < "$wd_config_file"
|
||||
|
||||
# get opts
|
||||
args=$(getopt -o a:r:c:lhs -l add:,rm:,clean,list,ls:,path:,help,show -- $*)
|
||||
args=$(getopt -o a:r:c:lhs -l add:,rm:,clean,list,ls:,open:,path:,help,show -- $*)
|
||||
|
||||
# check if no arguments were given, and that version is not set
|
||||
if [[ ($? -ne 0 || $#* -eq 0) && -z $wd_print_version ]]
|
||||
then
|
||||
wd_print_usage
|
||||
|
||||
# check if config file is writeable
|
||||
elif [ ! -w "$wd_config_file" ]
|
||||
then
|
||||
# do nothing
|
||||
# can't run `exit`, as this would exit the executing shell
|
||||
wd_exit_fail "\'$wd_config_file\' is not writeable."
|
||||
|
||||
else
|
||||
# parse rest of options
|
||||
local wd_o
|
||||
|
|
@ -571,6 +594,10 @@ else
|
|||
wd_ls "$2"
|
||||
break
|
||||
;;
|
||||
"-o"|"--open"|"open")
|
||||
wd_open "$2"
|
||||
break
|
||||
;;
|
||||
"-p"|"--path"|"path")
|
||||
wd_path "$2"
|
||||
break
|
||||
|
|
|
|||
|
|
@ -47,12 +47,17 @@ Available search contexts are:
|
|||
| `youtube` | `https://www.youtube.com/results?search_query=` |
|
||||
| `deepl` | `https://www.deepl.com/translator#auto/auto/` |
|
||||
| `dockerhub` | `https://hub.docker.com/search?q=` |
|
||||
| `gems` | `https://rubygems.org/search?query=` |
|
||||
| `npmpkg` | `https://www.npmjs.com/search?q=` |
|
||||
| `packagist` | `https://packagist.org/?query=` |
|
||||
| `gopkg` | `https://pkg.go.dev/search?m=package&q=` |
|
||||
| `chatgpt` | `https://chatgpt.com/?q=` |
|
||||
| `claudeai` | `https://claude.ai/new?q=` |
|
||||
| `grok` | `https://grok.com/?q=` |
|
||||
| `reddit` | `https://www.reddit.com/search/?q=` |
|
||||
| `ppai` | `https://www.perplexity.ai/search/new?q=` |
|
||||
| `rscrate` | `https://crates.io/search?q=` |
|
||||
| `rsdoc` | `https://docs.rs/releases/search?query=` |
|
||||
|
||||
Also there are aliases for bang-searching DuckDuckGo:
|
||||
|
||||
|
|
|
|||
|
|
@ -28,12 +28,17 @@ function web_search() {
|
|||
youtube "https://www.youtube.com/results?search_query="
|
||||
deepl "https://www.deepl.com/translator#auto/auto/"
|
||||
dockerhub "https://hub.docker.com/search?q="
|
||||
gems "https://rubygems.org/search?query="
|
||||
npmpkg "https://www.npmjs.com/search?q="
|
||||
packagist "https://packagist.org/?query="
|
||||
gopkg "https://pkg.go.dev/search?m=package&q="
|
||||
chatgpt "https://chatgpt.com/?q="
|
||||
grok "https://grok.com/?q="
|
||||
claudeai "https://claude.ai/new?q="
|
||||
reddit "https://www.reddit.com/search/?q="
|
||||
ppai "https://www.perplexity.ai/search/new?q="
|
||||
rscrate "https://crates.io/search?q="
|
||||
rsdoc "https://docs.rs/releases/search?query="
|
||||
)
|
||||
|
||||
# check whether the search engine is supported
|
||||
|
|
@ -83,12 +88,17 @@ alias ask='web_search ask'
|
|||
alias youtube='web_search youtube'
|
||||
alias deepl='web_search deepl'
|
||||
alias dockerhub='web_search dockerhub'
|
||||
alias gems='web_search gems'
|
||||
alias npmpkg='web_search npmpkg'
|
||||
alias packagist='web_search packagist'
|
||||
alias gopkg='web_search gopkg'
|
||||
alias chatgpt='web_search chatgpt'
|
||||
alias grok='web_search grok'
|
||||
alias claudeai='web_search claudeai'
|
||||
alias reddit='web_search reddit'
|
||||
alias ppai='web_search ppai'
|
||||
alias rscrate='web_search rscrate'
|
||||
alias rsdoc='web_search rsdoc'
|
||||
|
||||
#add your own !bang searches here
|
||||
alias wiki='web_search duckduckgo \!w'
|
||||
|
|
@ -106,3 +116,4 @@ if [[ ${#ZSH_WEB_SEARCH_ENGINES} -gt 0 ]]; then
|
|||
done
|
||||
unset engines key
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2018-2024 Alexandros Kozak
|
||||
Copyright (c) 2018-2025 Alexandros Kozak
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
#
|
||||
# https://github.com/agkozak/zsh-z
|
||||
#
|
||||
# Copyright (c) 2018-2024 Alexandros Kozak
|
||||
# Copyright (c) 2018-2025 Alexandros Kozak
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
|
|
@ -294,7 +294,16 @@ zshz() {
|
|||
owner=${ZSHZ_OWNER:-${_Z_OWNER}}
|
||||
|
||||
if (( ZSHZ[USE_FLOCK] )); then
|
||||
${ZSHZ[MV]} "$tempfile" "$datafile" 2> /dev/null || ${ZSHZ[RM]} -f "$tempfile"
|
||||
# An unsual case: if inside Docker container where datafile could be bind
|
||||
# mounted
|
||||
if [[ -r '/proc/1/cgroup' && "$(< '/proc/1/cgroup')" == *docker* ]]; then
|
||||
print "$(< "$tempfile")" > "$datafile" 2> /dev/null
|
||||
${ZSHZ[RM]} -f "$tempfile"
|
||||
# All other cases
|
||||
else
|
||||
${ZSHZ[MV]} "$tempfile" "$datafile" 2> /dev/null ||
|
||||
${ZSHZ[RM]} -f "$tempfile"
|
||||
fi
|
||||
|
||||
if [[ -n $owner ]]; then
|
||||
${ZSHZ[CHOWN]} ${owner}:"$(id -ng ${owner})" "$datafile"
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@ function afmagic_dashes {
|
|||
if [[ -n "$python_env" && "$PS1" = *\(${python_env}\)* ]]; then
|
||||
echo $(( COLUMNS - ${#python_env} - 3 ))
|
||||
elif [[ -n "$VIRTUAL_ENV_PROMPT" && "$PS1" = *${VIRTUAL_ENV_PROMPT}* ]]; then
|
||||
echo $(( COLUMNS - ${#VIRTUAL_ENV_PROMPT} ))
|
||||
echo $(( COLUMNS - ${#VIRTUAL_ENV_PROMPT} - 3 ))
|
||||
else
|
||||
echo $COLUMNS
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -36,12 +36,12 @@ CURRENT_BG='NONE'
|
|||
|
||||
case ${SOLARIZED_THEME:-dark} in
|
||||
light)
|
||||
CURRENT_FG='white'
|
||||
CURRENT_DEFAULT_FG='white'
|
||||
CURRENT_FG=${CURRENT_FG:-'white'}
|
||||
CURRENT_DEFAULT_FG=${CURRENT_DEFAULT_FG:-'white'}
|
||||
;;
|
||||
*)
|
||||
CURRENT_FG='black'
|
||||
CURRENT_DEFAULT_FG='default'
|
||||
CURRENT_FG=${CURRENT_FG:-'black'}
|
||||
CURRENT_DEFAULT_FG=${CURRENT_DEFAULT_FG:-'default'}
|
||||
;;
|
||||
esac
|
||||
|
||||
|
|
@ -314,6 +314,9 @@ prompt_dir() {
|
|||
|
||||
# Virtualenv: current working virtualenv
|
||||
prompt_virtualenv() {
|
||||
if [ -n "$CONDA_DEFAULT_ENV" ]; then
|
||||
prompt_segment magenta $CURRENT_FG "🐍 $CONDA_DEFAULT_ENV"
|
||||
fi
|
||||
if [[ -n "$VIRTUAL_ENV" && -n "$VIRTUAL_ENV_DISABLE_PROMPT" ]]; then
|
||||
prompt_segment "$AGNOSTER_VENV_BG" "$AGNOSTER_VENV_FG" "(${VIRTUAL_ENV:t:gs/%/%%})"
|
||||
fi
|
||||
|
|
@ -350,12 +353,19 @@ prompt_aws() {
|
|||
esac
|
||||
}
|
||||
|
||||
prompt_terraform() {
|
||||
local terraform_info=$(tf_prompt_info)
|
||||
[[ -z "$terraform_info" ]] && return
|
||||
prompt_segment magenta yellow "TF: $terraform_info"
|
||||
}
|
||||
|
||||
## Main prompt
|
||||
build_prompt() {
|
||||
RETVAL=$?
|
||||
prompt_status
|
||||
prompt_virtualenv
|
||||
prompt_aws
|
||||
prompt_terraform
|
||||
prompt_context
|
||||
prompt_dir
|
||||
prompt_git
|
||||
|
|
|
|||
|
|
@ -11,11 +11,11 @@ function _prompt_char() {
|
|||
# This theme works with both the "dark" and "light" variants of the
|
||||
# Solarized color schema. Set the SOLARIZED_THEME variable to one of
|
||||
# these two values to choose. If you don't specify, we'll assume you're
|
||||
# using the "dark" variant.
|
||||
# using neither variant.
|
||||
|
||||
case ${SOLARIZED_THEME:-dark} in
|
||||
light) bkg=white;;
|
||||
*) bkg=black;;
|
||||
*) bkg=default;;
|
||||
esac
|
||||
|
||||
ZSH_THEME_GIT_PROMPT_PREFIX=" [%{%B%F{blue}%}"
|
||||
|
|
|
|||
|
|
@ -8,14 +8,15 @@ function theme_precmd {
|
|||
local rubypromptsize=${#${(%)$(ruby_prompt_info)}}
|
||||
local pwdsize=${#${(%):-%~}}
|
||||
local venvpromptsize=$((${#$(virtualenv_prompt_info)}))
|
||||
local condapromptsize=$((${#$(conda_prompt_info)}))
|
||||
|
||||
# Truncate the path if it's too long.
|
||||
if (( promptsize + rubypromptsize + pwdsize + venvpromptsize > TERMWIDTH )); then
|
||||
if (( promptsize + rubypromptsize + pwdsize + venvpromptsize + condapromptsize > TERMWIDTH )); then
|
||||
(( PR_PWDLEN = TERMWIDTH - promptsize ))
|
||||
elif [[ "${langinfo[CODESET]}" = UTF-8 ]]; then
|
||||
PR_FILLBAR="\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize ) ))::${PR_HBAR}:)}"
|
||||
PR_FILLBAR="\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize + condapromptsize ) ))::${PR_HBAR}:)}"
|
||||
else
|
||||
PR_FILLBAR="${PR_SHIFT_IN}\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize ) ))::${altchar[q]:--}:)}${PR_SHIFT_OUT}"
|
||||
PR_FILLBAR="${PR_SHIFT_IN}\${(l:$(( TERMWIDTH - (promptsize + rubypromptsize + pwdsize + venvpromptsize + condapromptsize ) ))::${altchar[q]:--}:)}${PR_SHIFT_OUT}"
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
@ -104,7 +105,7 @@ fi
|
|||
PROMPT='${PR_SET_CHARSET}${PR_STITLE}${(e)PR_TITLEBAR}\
|
||||
${PR_CYAN}${PR_ULCORNER}${PR_HBAR}${PR_GREY}(\
|
||||
${PR_GREEN}%${PR_PWDLEN}<...<%~%<<\
|
||||
${PR_GREY})$(virtualenv_prompt_info)$(ruby_prompt_info)${PR_CYAN}${PR_HBAR}${PR_HBAR}${(e)PR_FILLBAR}${PR_HBAR}${PR_GREY}(\
|
||||
${PR_GREY})$(virtualenv_prompt_info)$(ruby_prompt_info)$(conda_prompt_info)${PR_CYAN}${PR_HBAR}${PR_HBAR}${(e)PR_FILLBAR}${PR_HBAR}${PR_GREY}(\
|
||||
${PR_CYAN}%(!.%SROOT%s.%n)${PR_GREY}@${PR_GREEN}%m:%l\
|
||||
${PR_GREY})${PR_CYAN}${PR_HBAR}${PR_URCORNER}\
|
||||
|
||||
|
|
|
|||
|
|
@ -25,9 +25,10 @@
|
|||
# BRANCH - branch to check out immediately after install (default: master)
|
||||
#
|
||||
# Other options:
|
||||
# CHSH - 'no' means the installer will not change the default shell (default: yes)
|
||||
# RUNZSH - 'no' means the installer will not run zsh after the install (default: yes)
|
||||
# KEEP_ZSHRC - 'yes' means the installer will not replace an existing .zshrc (default: no)
|
||||
# CHSH - 'no' means the installer will not change the default shell (default: yes)
|
||||
# RUNZSH - 'no' means the installer will not run zsh after the install (default: yes)
|
||||
# KEEP_ZSHRC - 'yes' means the installer will not replace an existing .zshrc (default: no)
|
||||
# OVERWRITE_CONFIRMATION - 'no' means the installer will not ask for confirmation to overwrite the existing .zshrc (default: yes)
|
||||
#
|
||||
# You can also pass some arguments to the install script to set some these options:
|
||||
# --skip-chsh: has the same behavior as setting CHSH to 'no'
|
||||
|
|
@ -77,6 +78,7 @@ BRANCH=${BRANCH:-master}
|
|||
CHSH=${CHSH:-yes}
|
||||
RUNZSH=${RUNZSH:-yes}
|
||||
KEEP_ZSHRC=${KEEP_ZSHRC:-no}
|
||||
OVERWRITE_CONFIRMATION=${OVERWRITE_CONFIRMATION:-yes}
|
||||
|
||||
|
||||
command_exists() {
|
||||
|
|
@ -341,6 +343,25 @@ setup_zshrc() {
|
|||
echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Keeping...${FMT_RESET}"
|
||||
return
|
||||
fi
|
||||
|
||||
if [ $OVERWRITE_CONFIRMATION != "no" ]; then
|
||||
# Ask user for confirmation before backing up and overwriting
|
||||
echo "${FMT_YELLOW}Found ${zdot}/.zshrc."
|
||||
echo "The existing .zshrc will be backed up to .zshrc.pre-oh-my-zsh if overwritten."
|
||||
echo "Make sure your .zshrc contains the following minimal configuration if you choose not to overwrite it:${FMT_RESET}"
|
||||
echo "----------------------------------------"
|
||||
cat "$ZSH/templates/minimal.zshrc"
|
||||
echo "----------------------------------------"
|
||||
printf '%sDo you want to overwrite it with the Oh My Zsh template? [Y/n]%s ' \
|
||||
"$FMT_YELLOW" "$FMT_RESET"
|
||||
read -r opt
|
||||
case $opt in
|
||||
[Yy]*|"") ;;
|
||||
[Nn]*) echo "Overwrite skipped. Existing .zshrc will be kept."; return ;;
|
||||
*) echo "Invalid choice. Overwrite skipped. Existing .zshrc will be kept."; return ;;
|
||||
esac
|
||||
fi
|
||||
|
||||
if [ -e "$OLD_ZSHRC" ]; then
|
||||
OLD_OLD_ZSHRC="${OLD_ZSHRC}-$(date +%Y-%m-%d_%H-%M-%S)"
|
||||
if [ -e "$OLD_OLD_ZSHRC" ]; then
|
||||
|
|
@ -353,7 +374,7 @@ setup_zshrc() {
|
|||
echo "${FMT_YELLOW}Found old .zshrc.pre-oh-my-zsh." \
|
||||
"${FMT_GREEN}Backing up to ${OLD_OLD_ZSHRC}${FMT_RESET}"
|
||||
fi
|
||||
echo "${FMT_YELLOW}Found ${zdot}/.zshrc.${FMT_RESET} ${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}"
|
||||
echo "${FMT_GREEN}Backing up to ${OLD_ZSHRC}${FMT_RESET}"
|
||||
mv "$zdot/.zshrc" "$OLD_ZSHRC"
|
||||
fi
|
||||
|
||||
|
|
@ -493,12 +514,13 @@ main() {
|
|||
if [ ! -t 0 ]; then
|
||||
RUNZSH=no
|
||||
CHSH=no
|
||||
OVERWRITE_CONFIRMATION=no
|
||||
fi
|
||||
|
||||
# Parse arguments
|
||||
while [ $# -gt 0 ]; do
|
||||
case $1 in
|
||||
--unattended) RUNZSH=no; CHSH=no ;;
|
||||
--unattended) RUNZSH=no; CHSH=no; OVERWRITE_CONFIRMATION=no ;;
|
||||
--skip-chsh) CHSH=no ;;
|
||||
--keep-zshrc) KEEP_ZSHRC=yes ;;
|
||||
esac
|
||||
|
|
|
|||
|
|
@ -254,7 +254,7 @@ if LANG= git pull --quiet --rebase $remote $branch; then
|
|||
|
||||
# Print changelog to the terminal
|
||||
if [[ $interactive == true && $verbose_mode == default ]]; then
|
||||
"$ZSH/tools/changelog.sh" HEAD "$last_commit"
|
||||
ZSH="$ZSH" command zsh -f "$ZSH/tools/changelog.sh" HEAD "$last_commit"
|
||||
fi
|
||||
|
||||
if [[ $verbose_mode != silent ]]; then
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue