Merge branch 'ohmyzsh:master' into master
This commit is contained in:
commit
ed951f985c
84 changed files with 2716 additions and 1676 deletions
3
.github/workflows/main.yml
vendored
3
.github/workflows/main.yml
vendored
|
|
@ -14,6 +14,9 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions:
|
||||
contents: read # to fetch code (actions/checkout)
|
||||
|
||||
jobs:
|
||||
tests:
|
||||
name: Run tests
|
||||
|
|
|
|||
41
.github/workflows/project.yml
vendored
41
.github/workflows/project.yml
vendored
|
|
@ -9,6 +9,7 @@ concurrency:
|
|||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
permissions: {}
|
||||
jobs:
|
||||
add-to-project:
|
||||
name: Add to project
|
||||
|
|
@ -26,24 +27,25 @@ jobs:
|
|||
gh api graphql -f query='
|
||||
query($org: String!, $number: Int!) {
|
||||
organization(login: $org){
|
||||
projectNext(number: $number) {
|
||||
projectV2(number: $number) {
|
||||
id
|
||||
fields(first:20) {
|
||||
nodes {
|
||||
id
|
||||
name
|
||||
... on ProjectV2Field {
|
||||
id
|
||||
name
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
|
||||
}' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
|
||||
|
||||
# Parse project data
|
||||
cat >> $GITHUB_ENV <<EOF
|
||||
PROJECT_ID=$(jq '.data.organization.projectNext.id' project_data.json)
|
||||
PLUGIN_FIELD_ID=$(jq '.data.organization.projectNext.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
|
||||
THEME_FIELD_ID=$(jq '.data.organization.projectNext.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
|
||||
PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json)
|
||||
PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
|
||||
THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
|
||||
EOF
|
||||
|
||||
- name: Add to project
|
||||
|
|
@ -52,13 +54,13 @@ jobs:
|
|||
run: |
|
||||
item_id="$(gh api graphql -f query='
|
||||
mutation($project: ID!, $content: ID!) {
|
||||
addProjectNextItem(input: {projectId: $project, contentId: $content}) {
|
||||
projectNextItem {
|
||||
addProjectV2ItemById(input: {projectId: $project, contentId: $content}) {
|
||||
item {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectNextItem.projectNextItem.id')"
|
||||
' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectV2ItemById.item.id')"
|
||||
|
||||
echo "ITEM_ID=$item_id" >> $GITHUB_ENV
|
||||
|
||||
|
|
@ -107,23 +109,27 @@ jobs:
|
|||
$theme_field: ID!
|
||||
$theme_value: String!
|
||||
) {
|
||||
set_plugin: updateProjectNextItemField(input: {
|
||||
set_plugin: updateProjectV2ItemFieldValue(input: {
|
||||
projectId: $project
|
||||
itemId: $item
|
||||
fieldId: $plugin_field
|
||||
value: $plugin_value
|
||||
value: {
|
||||
text: $plugin_value
|
||||
}
|
||||
}) {
|
||||
projectNextItem {
|
||||
projectV2Item {
|
||||
id
|
||||
}
|
||||
}
|
||||
set_theme: updateProjectNextItemField(input: {
|
||||
set_theme: updateProjectV2ItemFieldValue(input: {
|
||||
projectId: $project
|
||||
itemId: $item
|
||||
fieldId: $theme_field
|
||||
value: $theme_value
|
||||
value: {
|
||||
text: $theme_value
|
||||
}
|
||||
}) {
|
||||
projectNextItem {
|
||||
projectV2Item {
|
||||
id
|
||||
}
|
||||
}
|
||||
|
|
@ -132,4 +138,3 @@ jobs:
|
|||
-f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
|
||||
-f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
|
||||
--silent
|
||||
|
||||
|
|
|
|||
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -6,3 +6,6 @@ cache/
|
|||
log/
|
||||
*.swp
|
||||
.DS_Store
|
||||
|
||||
# editor configs
|
||||
.vscode
|
||||
|
|
@ -35,13 +35,13 @@ you would make is not already covered.
|
|||
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
|
||||
your problem.
|
||||
|
||||
If you find one, comment on it so we can know there are more people experiencing it.
|
||||
If you find one, comment on it, so we know more people are experiencing it.
|
||||
|
||||
If not, look at the [Troubleshooting](https://github.com/ohmyzsh/ohmyzsh/wiki/Troubleshooting)
|
||||
page for instructions on how to gather data to better debug your problem.
|
||||
|
||||
Then, you can go ahead and create an issue with as much detail as you can provide.
|
||||
It should include the data gathered as indicated above, along with:
|
||||
It should include the data gathered as indicated above, along with the following:
|
||||
|
||||
1. How to reproduce the problem
|
||||
2. What the correct behavior should be
|
||||
|
|
@ -57,7 +57,7 @@ We will do our very best to help you.
|
|||
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
|
||||
your suggestion.
|
||||
|
||||
If you find one, comment on it so we can know there are more people supporting it.
|
||||
If you find one, comment on it, so we know more people are supporting it.
|
||||
|
||||
If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin
|
||||
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
|
||||
|
|
@ -84,7 +84,7 @@ your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering
|
|||
|
||||
If the solution is already reported, try it out and +1 the pull request if the
|
||||
solution works ok. On the other hand, if you think your solution is better, post
|
||||
it with a reference to the other one so we can have both solutions to compare.
|
||||
it with reference to the other one so we can have both solutions to compare.
|
||||
|
||||
If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
|
||||
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
|
||||
|
|
@ -113,14 +113,14 @@ This has become an issue for two opposing reasons:
|
|||
- Some users want to have their personal aliases in Oh My Zsh.
|
||||
- Some users don't want any aliases at all and feel that there are too many.
|
||||
|
||||
Because of this, from now on we're requiring that new aliases follow these conditions:
|
||||
Because of this, from now on, we require that new aliases follow these conditions:
|
||||
|
||||
1. They will be used by many people, not just a few.
|
||||
2. The aliases will be used many times and for common tasks.
|
||||
3. Prefer one generic alias over many specific ones.
|
||||
4. When justifying the need for an alias, talk about workflows where you'll use it,
|
||||
preferably in combination with other aliases.
|
||||
5. If there exists a command with the same name, look for a different alias name.
|
||||
5. If a command with the same name exists, look for a different alias name.
|
||||
|
||||
This list is not exhaustive! Please remember that your alias will be in the machines of many people,
|
||||
so it should be justified why they should have it.
|
||||
|
|
@ -214,7 +214,7 @@ type(scope)!: subject
|
|||
```
|
||||
|
||||
- `subject`: a brief description of the changes. This will be displayed in the changelog. If you need
|
||||
to specify other details you can use the commit body but it won't be visible.
|
||||
to specify other details, you can use the commit body, but it won't be visible.
|
||||
|
||||
Formatting tricks: the commit subject may contain:
|
||||
|
||||
|
|
@ -231,9 +231,9 @@ type(scope)!: subject
|
|||
|
||||
### Style
|
||||
|
||||
Try to keep the first commit line short. This is harder to do using this commit style but try to be
|
||||
concise and if you need more space, you can use the commit body. Try to make sure that the commit
|
||||
subject is clear and precise enough that users will know what change by just looking at the changelog.
|
||||
Try to keep the first commit line short. It's harder to do using this commit style but try to be
|
||||
concise, and if you need more space, you can use the commit body. Try to make sure that the commit
|
||||
subject is clear and precise enough that users will know what changed by just looking at the changelog.
|
||||
|
||||
----
|
||||
|
||||
|
|
|
|||
24
lib/cli.zsh
24
lib/cli.zsh
|
|
@ -241,21 +241,21 @@ function _omz::plugin::disable {
|
|||
|
||||
# Remove plugins substitution awk script
|
||||
local awk_subst_plugins="\
|
||||
gsub(/\s+(${(j:|:)dis_plugins})/, \"\") # with spaces before
|
||||
gsub(/(${(j:|:)dis_plugins})\s+/, \"\") # with spaces after
|
||||
gsub(/[ \t]+(${(j:|:)dis_plugins})/, \"\") # with spaces before
|
||||
gsub(/(${(j:|:)dis_plugins})[ \t]+/, \"\") # with spaces after
|
||||
gsub(/\((${(j:|:)dis_plugins})\)/, \"\") # without spaces (only plugin)
|
||||
"
|
||||
# Disable plugins awk script
|
||||
local awk_script="
|
||||
# if plugins=() is in oneline form, substitute disabled plugins and go to next line
|
||||
/^\s*plugins=\([^#]+\).*\$/ {
|
||||
/^[ \t]*plugins=\([^#]+\).*\$/ {
|
||||
$awk_subst_plugins
|
||||
print \$0
|
||||
next
|
||||
}
|
||||
|
||||
# if plugins=() is in multiline form, enable multi flag and disable plugins if they're there
|
||||
/^\s*plugins=\(/ {
|
||||
/^[ \t]*plugins=\(/ {
|
||||
multi=1
|
||||
$awk_subst_plugins
|
||||
print \$0
|
||||
|
|
@ -330,14 +330,14 @@ function _omz::plugin::enable {
|
|||
# Enable plugins awk script
|
||||
local awk_script="
|
||||
# if plugins=() is in oneline form, substitute ) with new plugins and go to the next line
|
||||
/^\s*plugins=\([^#]+\).*\$/ {
|
||||
/^[ \t]*plugins=\([^#]+\).*\$/ {
|
||||
sub(/\)/, \" $add_plugins&\")
|
||||
print \$0
|
||||
next
|
||||
}
|
||||
|
||||
# if plugins=() is in multiline form, enable multi flag
|
||||
/^\s*plugins=\(/ {
|
||||
/^[ \t]*plugins=\(/ {
|
||||
multi=1
|
||||
}
|
||||
|
||||
|
|
@ -416,14 +416,14 @@ function _omz::plugin::list {
|
|||
|
||||
if (( ${#custom_plugins} )); then
|
||||
print -P "%U%BCustom plugins%b%u:"
|
||||
print -l ${(q-)custom_plugins} | column -x
|
||||
print -lac ${(q-)custom_plugins}
|
||||
fi
|
||||
|
||||
if (( ${#builtin_plugins} )); then
|
||||
(( ${#custom_plugins} )) && echo # add a line of separation
|
||||
|
||||
print -P "%U%BBuilt-in plugins%b%u:"
|
||||
print -l ${(q-)builtin_plugins} | column -x
|
||||
print -lac ${(q-)builtin_plugins}
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
@ -674,13 +674,13 @@ function _omz::theme::list {
|
|||
# Print custom themes if there are any
|
||||
if (( ${#custom_themes} )); then
|
||||
print -P "%U%BCustom themes%b%u:"
|
||||
print -l ${(q-)custom_themes} | column -x
|
||||
print -lac ${(q-)custom_themes}
|
||||
echo
|
||||
fi
|
||||
|
||||
# Print built-in themes
|
||||
print -P "%U%BBuilt-in themes%b%u:"
|
||||
print -l ${(q-)builtin_themes} | column -x
|
||||
print -lac ${(q-)builtin_themes}
|
||||
}
|
||||
|
||||
function _omz::theme::set {
|
||||
|
|
@ -699,9 +699,9 @@ function _omz::theme::set {
|
|||
|
||||
# Enable theme in .zshrc
|
||||
local awk_script='
|
||||
!set && /^\s*ZSH_THEME=[^#]+.*$/ {
|
||||
!set && /^[ \t]*ZSH_THEME=[^#]+.*$/ {
|
||||
set=1
|
||||
sub(/^\s*ZSH_THEME=[^#]+.*$/, "ZSH_THEME=\"'$1'\" # set by `omz`")
|
||||
sub(/^[ \t]*ZSH_THEME=[^#]+.*$/, "ZSH_THEME=\"'$1'\" # set by `omz`")
|
||||
print $0
|
||||
next
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@ function git_prompt_info() {
|
|||
|
||||
local ref
|
||||
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
|
||||
|| ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|
||||
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|
||||
|| return 0
|
||||
|
||||
|
|
|
|||
|
|
@ -24,8 +24,8 @@ else
|
|||
if [[ -n "$GREP_OPTIONS" ]]; then
|
||||
# export grep, egrep and fgrep settings
|
||||
alias grep="grep $GREP_OPTIONS"
|
||||
alias egrep="egrep $GREP_OPTIONS"
|
||||
alias fgrep="fgrep $GREP_OPTIONS"
|
||||
alias egrep="grep -E $GREP_OPTIONS"
|
||||
alias fgrep="grep -F $GREP_OPTIONS"
|
||||
|
||||
# write to cache file if cache directory is writable
|
||||
if [[ -w "$ZSH_CACHE_DIR" ]]; then
|
||||
|
|
|
|||
|
|
@ -14,16 +14,18 @@ clipboard.
|
|||
## `opswd`
|
||||
|
||||
The `opswd` command is a wrapper around the `op` command. It takes a service
|
||||
name as an argument and copies the password for that service to the clipboard.
|
||||
name as an argument and copies the username, then the password for that service
|
||||
to the clipboard, after confirmation on the user part.
|
||||
|
||||
If the service also contains a TOTP, it is copied to the clipboard after 10 seconds.
|
||||
Finally, after 20 seconds, the clipboard is cleared.
|
||||
If the service also contains a TOTP, it is copied to the clipboard after confirmation
|
||||
on the user part. Finally, after 20 seconds, the clipboard is cleared.
|
||||
|
||||
The function has completion support, so you can use tab completion to select
|
||||
which service you want to get.
|
||||
For example, `opswd github.com` will put your GitHub username into your clipboard. Then,
|
||||
it will ask for confirmation to continue, and copy the password to your clipboard. Finally,
|
||||
if a TOTP is available, it will be copied to the clipboard after your confirmation.
|
||||
|
||||
For example, `opswd github.com` will put your GitHub password into your clipboard, and if
|
||||
a TOTP is available, it will be copied to the clipboard after 10 seconds.
|
||||
This function has completion support, so you can use tab completion to select which
|
||||
service you want to get.
|
||||
|
||||
> NOTE: you need to be signed in for `opswd` to work. If you are using biometric unlock,
|
||||
> 1Password CLI will automatically prompt you to sign in. See:
|
||||
|
|
|
|||
|
|
@ -14,6 +14,17 @@ function opswd() {
|
|||
# If not logged in, print error and return
|
||||
op user list > /dev/null || return
|
||||
|
||||
local username
|
||||
# Copy the username to the clipboard
|
||||
if ! username=$(op item get "$service" --fields username 2>/dev/null); then
|
||||
echo "error: could not obtain username for $service"
|
||||
return 1
|
||||
fi
|
||||
|
||||
echo -n "$username" | clipcopy
|
||||
echo "✔ username for service $service copied to the clipboard. Press Enter to continue"
|
||||
read
|
||||
|
||||
local password
|
||||
# Copy the password to the clipboard
|
||||
if ! password=$(op item get "$service" --fields password 2>/dev/null); then
|
||||
|
|
@ -22,12 +33,13 @@ function opswd() {
|
|||
fi
|
||||
|
||||
echo -n "$password" | clipcopy
|
||||
echo "✔ password for $service copied to clipboard"
|
||||
echo "✔ password for $service copied to clipboard. Press Enter to continue"
|
||||
read
|
||||
|
||||
# If there's a one time password, copy it to the clipboard after 10 seconds
|
||||
# If there's a one time password, copy it to the clipboard
|
||||
local totp
|
||||
if totp=$(op item get --otp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
|
||||
sleep 10 && echo -n "$totp" | clipcopy
|
||||
echo -n "$totp" | clipcopy
|
||||
echo "✔ TOTP for $service copied to clipboard"
|
||||
fi
|
||||
|
||||
|
|
|
|||
|
|
@ -17,6 +17,12 @@ Requirements: Python needs to be installed.
|
|||
|
||||
- `acs`: show all aliases by group.
|
||||
|
||||
- `acs -h/--help`: print help mesage.
|
||||
|
||||
- `acs <keyword>`: filter aliases by `<keyword>` and highlight.
|
||||
|
||||
- `acs -g <group>/--group <group`: show only aliases for group `<group>`. Multiple uses of the flag show all groups,
|
||||
|
||||
- `acs --groups-only`: show only group names
|
||||
|
||||

|
||||
|
|
|
|||
|
|
@ -2,6 +2,7 @@
|
|||
import sys
|
||||
import itertools
|
||||
import termcolor
|
||||
import argparse
|
||||
|
||||
def parse(line):
|
||||
left = line[0:line.find('=')].strip()
|
||||
|
|
@ -26,7 +27,7 @@ def cheatsheet(lines):
|
|||
target_aliases.extend(group_list)
|
||||
return cheatsheet
|
||||
|
||||
def pretty_print_group(key, aliases, highlight=None):
|
||||
def pretty_print_group(key, aliases, highlight=None, only_groupname=False):
|
||||
if len(aliases) == 0:
|
||||
return
|
||||
group_hl_formatter = lambda g, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'red') for part in ('[%s]' % g).split(hl)])
|
||||
|
|
@ -35,21 +36,33 @@ def pretty_print_group(key, aliases, highlight=None):
|
|||
alias_formatter = lambda alias: termcolor.colored('\t%s = %s' % alias[0:2], 'green')
|
||||
if highlight and len(highlight)>0:
|
||||
print (group_hl_formatter(key, highlight))
|
||||
print ('\n'.join([alias_hl_formatter(alias, highlight) for alias in aliases]))
|
||||
if not only_groupname:
|
||||
print ('\n'.join([alias_hl_formatter(alias, highlight) for alias in aliases]))
|
||||
else:
|
||||
print (group_formatter(key))
|
||||
print ('\n'.join([alias_formatter(alias) for alias in aliases]))
|
||||
if not only_groupname:
|
||||
print ('\n'.join([alias_formatter(alias) for alias in aliases]))
|
||||
print ('')
|
||||
|
||||
def pretty_print(cheatsheet, wfilter):
|
||||
def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False):
|
||||
sorted_key = sorted(cheatsheet.keys())
|
||||
for key in sorted_key:
|
||||
if group_list and key not in group_list:
|
||||
continue
|
||||
aliases = cheatsheet.get(key)
|
||||
if not wfilter:
|
||||
pretty_print_group(key, aliases, wfilter)
|
||||
pretty_print_group(key, aliases, wfilter, groups_only)
|
||||
else:
|
||||
pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter)
|
||||
|
||||
if __name__ == '__main__':
|
||||
parser = argparse.ArgumentParser(description="Pretty print aliases.")
|
||||
parser.add_argument('filter', nargs="*", help="search aliases matching string")
|
||||
parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups")
|
||||
parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups")
|
||||
args = parser.parse_args()
|
||||
|
||||
lines = sys.stdin.readlines()
|
||||
pretty_print(cheatsheet(lines), sys.argv[1] if len(sys.argv)>1 else None)
|
||||
group_list = args.group_list or None
|
||||
wfilter = " ".join(args.filter) or None
|
||||
pretty_print(cheatsheet(lines), wfilter, group_list, args.groups_only)
|
||||
|
|
|
|||
|
|
@ -6,22 +6,25 @@ Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable ve
|
|||
|
||||
### Installation
|
||||
|
||||
1. Enable the plugin by adding it to your `plugins` definition in `~/.zshrc`.
|
||||
1. [Download asdf](https://asdf-vm.com/guide/getting-started.html#_2-download-asdf) by running the following:
|
||||
|
||||
```
|
||||
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
|
||||
```
|
||||
|
||||
2. [Enable asdf](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf) by adding it to your `plugins` definition in `~/.zshrc`.
|
||||
|
||||
```
|
||||
plugins=(asdf)
|
||||
```
|
||||
|
||||
2. [Install asdf](https://github.com/asdf-vm/asdf#setup) by running the following:
|
||||
```
|
||||
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
See the [asdf usage documentation](https://github.com/asdf-vm/asdf#usage) for information on how to use asdf:
|
||||
See the [asdf documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to use asdf:
|
||||
|
||||
```
|
||||
asdf plugin-add nodejs git@github.com:asdf-vm/asdf-nodejs.git
|
||||
asdf install nodejs 5.9.1
|
||||
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
|
||||
asdf install nodejs latest
|
||||
asdf global nodejs latest
|
||||
asdf local nodejs latest
|
||||
```
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ autojump_paths=(
|
|||
/opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
|
||||
/usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
|
||||
/opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
|
||||
/etc/profiles/per-user/$USER/bin/autojump # macOS Nix, Home Manager and flakes
|
||||
)
|
||||
|
||||
for file in $autojump_paths; do
|
||||
|
|
|
|||
|
|
@ -1,44 +1,79 @@
|
|||
#!/usr/bin/env zsh
|
||||
|
||||
## setup ##
|
||||
## Setup
|
||||
|
||||
[[ -o interactive ]] || return #interactive only!
|
||||
zmodload zsh/datetime || { print "can't load zsh/datetime"; return } # faster than date()
|
||||
autoload -Uz add-zsh-hook || { print "can't add zsh hook!"; return }
|
||||
[[ -o interactive ]] || return # don't load on non-interactive shells
|
||||
[[ -z "$SSH_CLIENT" && -z "$SSH_TTY" ]] || return # don't load on a SSH connection
|
||||
|
||||
(( ${+bgnotify_threshold} )) || bgnotify_threshold=5 #default 10 seconds
|
||||
zmodload zsh/datetime # faster than `date`
|
||||
|
||||
|
||||
## definitions ##
|
||||
## Zsh Hooks
|
||||
|
||||
if ! (type bgnotify_formatted | grep -q 'function'); then ## allow custom function override
|
||||
function bgnotify_formatted { ## args: (exit_status, command, elapsed_seconds)
|
||||
elapsed="$(( $3 % 60 ))s"
|
||||
(( $3 >= 60 )) && elapsed="$((( $3 % 3600) / 60 ))m $elapsed"
|
||||
(( $3 >= 3600 )) && elapsed="$(( $3 / 3600 ))h $elapsed"
|
||||
[ $1 -eq 0 ] && bgnotify "#win (took $elapsed)" "$2" || bgnotify "#fail (took $elapsed)" "$2"
|
||||
function bgnotify_begin {
|
||||
bgnotify_timestamp=$EPOCHSECONDS
|
||||
bgnotify_lastcmd="${1:-$2}"
|
||||
}
|
||||
|
||||
function bgnotify_end {
|
||||
{
|
||||
local exit_status=$?
|
||||
local elapsed=$(( EPOCHSECONDS - bgnotify_timestamp ))
|
||||
|
||||
# check time elapsed
|
||||
[[ $bgnotify_timestamp -gt 0 ]] || return
|
||||
[[ $elapsed -ge $bgnotify_threshold ]] || return
|
||||
|
||||
# check if Terminal app is not active
|
||||
[[ $(bgnotify_appid) != "$bgnotify_termid" ]] || return
|
||||
|
||||
printf '\a' # beep sound
|
||||
bgnotify_formatted "$exit_status" "$bgnotify_lastcmd" "$elapsed"
|
||||
} always {
|
||||
bgnotify_timestamp=0
|
||||
}
|
||||
fi
|
||||
|
||||
currentAppId () {
|
||||
if (( $+commands[osascript] )); then
|
||||
osascript -e 'tell application (path to frontmost application as text) to id' 2>/dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
currentWindowId () {
|
||||
if hash osascript 2>/dev/null; then #osx
|
||||
osascript -e 'tell application (path to frontmost application as text) to id of front window' 2&> /dev/null || echo "0"
|
||||
elif (hash notify-send 2>/dev/null || hash kdialog 2>/dev/null); then #ubuntu!
|
||||
xprop -root 2> /dev/null | awk '/NET_ACTIVE_WINDOW/{print $5;exit} END{exit !$5}' || echo "0"
|
||||
autoload -Uz add-zsh-hook
|
||||
add-zsh-hook preexec bgnotify_begin
|
||||
add-zsh-hook precmd bgnotify_end
|
||||
|
||||
|
||||
## Functions
|
||||
|
||||
# allow custom function override
|
||||
(( ${+functions[bgnotify_formatted]} )) || \
|
||||
function bgnotify_formatted {
|
||||
local exit_status=$1
|
||||
local cmd="$2"
|
||||
|
||||
# humanly readable elapsed time
|
||||
local elapsed="$(( $3 % 60 ))s"
|
||||
(( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed"
|
||||
(( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed"
|
||||
|
||||
if [[ $1 -eq 0 ]]; then
|
||||
bgnotify "#win (took $elapsed)" "$2"
|
||||
else
|
||||
echo $EPOCHSECONDS #fallback for windows
|
||||
bgnotify "#fail (took $elapsed)" "$2"
|
||||
fi
|
||||
}
|
||||
|
||||
bgnotify () { ## args: (title, subtitle)
|
||||
if hash terminal-notifier 2>/dev/null; then #osx
|
||||
local term_id="$bgnotify_appid"
|
||||
# for macOS, output is "app ID, window ID" (com.googlecode.iterm2, 116)
|
||||
function bgnotify_appid {
|
||||
if (( ${+commands[osascript]} )); then
|
||||
osascript -e 'tell application (path to frontmost application as text) to get the {id, id of front window}' 2>/dev/null
|
||||
elif (( ${+commands[xprop]} )); then
|
||||
xprop -root _NET_ACTIVE_WINDOW 2>/dev/null | cut -d' ' -f5
|
||||
else
|
||||
echo $EPOCHSECONDS
|
||||
fi
|
||||
}
|
||||
|
||||
function bgnotify {
|
||||
# $1: title, $2: message
|
||||
if (( ${+commands[terminal-notifier]} )); then # macOS
|
||||
local term_id="${bgnotify_termid%%,*}" # remove window id
|
||||
if [[ -z "$term_id" ]]; then
|
||||
case "$TERM_PROGRAM" in
|
||||
iTerm.app) term_id='com.googlecode.iterm2' ;;
|
||||
|
|
@ -46,48 +81,26 @@ bgnotify () { ## args: (title, subtitle)
|
|||
esac
|
||||
fi
|
||||
|
||||
## now call terminal-notifier, (hopefully with $term_id!)
|
||||
if [[ -z "$term_id" ]]; then
|
||||
terminal-notifier -message "$2" -title "$1" >/dev/null
|
||||
terminal-notifier -message "$2" -title "$1" &>/dev/null
|
||||
else
|
||||
terminal-notifier -message "$2" -title "$1" -activate "$term_id" -sender "$term_id" >/dev/null
|
||||
terminal-notifier -message "$2" -title "$1" -activate "$term_id" -sender "$term_id" &>/dev/null
|
||||
fi
|
||||
elif hash growlnotify 2>/dev/null; then #osx growl
|
||||
elif (( ${+commands[growlnotify]} )); then # macOS growl
|
||||
growlnotify -m "$1" "$2"
|
||||
elif hash notify-send 2>/dev/null; then #ubuntu gnome!
|
||||
elif (( ${+commands[notify-send]} )); then # GNOME
|
||||
notify-send "$1" "$2"
|
||||
elif hash kdialog 2>/dev/null; then #ubuntu kde!
|
||||
elif (( ${+commands[kdialog]} )); then # KDE
|
||||
kdialog --title "$1" --passivepopup "$2" 5
|
||||
elif hash notifu 2>/dev/null; then #cygwyn support!
|
||||
elif (( ${+commands[notifu]} )); then # cygwin
|
||||
notifu /m "$2" /p "$1"
|
||||
fi
|
||||
}
|
||||
|
||||
## Defaults
|
||||
|
||||
## Zsh hooks ##
|
||||
# notify if command took longer than 5s by default
|
||||
bgnotify_threshold=${bgnotify_threshold:-5}
|
||||
|
||||
bgnotify_begin() {
|
||||
bgnotify_timestamp=$EPOCHSECONDS
|
||||
bgnotify_lastcmd="${1:-$2}"
|
||||
bgnotify_appid="$(currentAppId)"
|
||||
bgnotify_windowid=$(currentWindowId)
|
||||
}
|
||||
|
||||
bgnotify_end() {
|
||||
didexit=$?
|
||||
elapsed=$(( EPOCHSECONDS - bgnotify_timestamp ))
|
||||
past_threshold=$(( elapsed >= bgnotify_threshold ))
|
||||
if (( bgnotify_timestamp > 0 )) && (( past_threshold )); then
|
||||
if [[ $(currentAppId) != "$bgnotify_appid" || $(currentWindowId) != "$bgnotify_windowid" ]]; then
|
||||
print -n "\a"
|
||||
bgnotify_formatted "$didexit" "$bgnotify_lastcmd" "$elapsed"
|
||||
fi
|
||||
fi
|
||||
bgnotify_timestamp=0 #reset it to 0!
|
||||
}
|
||||
|
||||
## only enable if a local (non-ssh) connection
|
||||
if [ -z "$SSH_CLIENT" ] && [ -z "$SSH_TTY" ]; then
|
||||
add-zsh-hook preexec bgnotify_begin
|
||||
add-zsh-hook precmd bgnotify_end
|
||||
fi
|
||||
# bgnotify_appid is slow in macOS and the terminal ID won't change, so cache it at startup
|
||||
bgnotify_termid="$(bgnotify_appid)"
|
||||
|
|
|
|||
|
|
@ -10,7 +10,10 @@ plugins=(... brew)
|
|||
|
||||
## Shellenv
|
||||
|
||||
This plugin also executes `brew shellenv` at plugin load to set up many useful variables, such as `HOMEBREW_PREFIX` or `HOMEBREW_REPOSITORY`.
|
||||
If `brew` is not found in the PATH, this plugin will attempt to find it in common
|
||||
locations, and execute `brew shellenv` to set the environment appropriately.
|
||||
This plugin will also export `HOMEBREW_PREFIX="$(brew --prefix)"` if not previously
|
||||
defined for convenience.
|
||||
|
||||
## Aliases
|
||||
|
||||
|
|
|
|||
|
|
@ -10,18 +10,21 @@ if (( ! $+commands[brew] )); then
|
|||
else
|
||||
return
|
||||
fi
|
||||
|
||||
# Only add Homebrew installation to PATH, MANPATH, and INFOPATH if brew is
|
||||
# not already on the path, to prevent duplicate entries. This aligns with
|
||||
# the behavior of the brew installer.sh post-install steps.
|
||||
eval "$("$BREW_LOCATION" shellenv)"
|
||||
unset BREW_LOCATION
|
||||
fi
|
||||
|
||||
if [[ -z "$HOMEBREW_PREFIX" ]]; then
|
||||
if [[ -z $BREW_LOCATION ]]; then
|
||||
eval "$(brew shellenv)"
|
||||
else
|
||||
eval "$("$BREW_LOCATION" shellenv)"
|
||||
fi
|
||||
# Maintain compatability with potential custom user profiles, where we had
|
||||
# previously relied on always sourcing shellenv. OMZ plugins should not rely
|
||||
# on this to be defined due to out of order processing.
|
||||
export HOMEBREW_PREFIX="$(brew --prefix)"
|
||||
fi
|
||||
|
||||
unset BREW_LOCATION
|
||||
|
||||
alias bcubc='brew upgrade --cask && brew cleanup'
|
||||
alias bcubo='brew update && brew outdated --cask'
|
||||
alias brewp='brew pin'
|
||||
|
|
@ -33,7 +36,7 @@ alias buf='brew upgrade --formula'
|
|||
|
||||
function brews() {
|
||||
local formulae="$(brew leaves | xargs brew deps --installed --for-each)"
|
||||
local casks="$(brew list --cask)"
|
||||
local casks="$(brew list --cask 2>/dev/null)"
|
||||
|
||||
local blue="$(tput setaf 4)"
|
||||
local bold="$(tput bold)"
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#compdef coffee
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright (c) 2011 Github zsh-users - https://github.com/zsh-users
|
||||
# Copyright (c) 2011 GitHub zsh-users - https://github.com/zsh-users
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@ colorize_check_requirements() {
|
|||
if [[ ${available_tools[(Ie)$ZSH_COLORIZE_TOOL]} -eq 0 ]]; then
|
||||
echo "ZSH_COLORIZE_TOOL '$ZSH_COLORIZE_TOOL' not recognized. Available options are 'pygmentize' and 'chroma'." >&2
|
||||
return 1
|
||||
elif (( $+commands["$ZSH_COLORIZE_TOOL"] )); then
|
||||
elif ! (( $+commands[$ZSH_COLORIZE_TOOL] )); then
|
||||
echo "Package '$ZSH_COLORIZE_TOOL' is not installed!" >&2
|
||||
return 1
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh
|
|||
| ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- |
|
||||
| `age` | `apt-get` | Command line tool for handling packages |
|
||||
| `api` | `aptitude` | Same functionality as `apt-get`, provides extra options |
|
||||
| `acs` | `apt-cache search` | Command line tool for searching apt software package cache |
|
||||
| `acse` | `apt-cache search` | Command line tool for searching apt software package cache |
|
||||
| `aps` | `aptitude search` | Searches installed packages using aptitude |
|
||||
| `as` | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format |
|
||||
| `afs` | `apt-file search --regexp` | Search file in packages |
|
||||
|
|
@ -30,26 +30,25 @@ Set `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh
|
|||
|
||||
## Superuser Operations Aliases
|
||||
|
||||
| Alias | Command | Description |
|
||||
| -------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
|
||||
| `aac` | `sudo $apt_pref autoclean` | Clears out the local repository of retrieved package files |
|
||||
| `aar` | `sudo $apt_pref autoremove` | Removes packages installed automatically that are no longer needed |
|
||||
| `abd` | `sudo $apt_pref build-dep` | Installs all dependencies for building packages |
|
||||
| `ac` | `sudo $apt_pref clean` | Clears out the local repository of retrieved package files except lock files |
|
||||
| `ad` | `sudo $apt_pref update` | Updates the package lists for upgrades for packages |
|
||||
| `adg` | `sudo $apt_pref update && sudo $apt_pref $apt_upgr` | Update and upgrade packages |
|
||||
| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list |
|
||||
| `adu` | `sudo $apt_pref update && sudo $apt_pref dist-upgrade` | Smart upgrade that handles dependencies |
|
||||
| `afu` | `sudo apt-file update` | Update the files in packages |
|
||||
| `ai` | `sudo $apt_pref install` | Command-line tool to install package |
|
||||
| `ail` | `sed -e 's/ */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line |
|
||||
| `alu` | `sudo apt update && apt list -u && sudo apt upgrade` | Update, list and upgrade packages |
|
||||
| `ap` | `sudo $apt_pref purge` | Removes packages along with configuration files |
|
||||
| `ar` | `sudo $apt_pref remove` | Removes packages, keeps the configuration files |
|
||||
| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades |
|
||||
| `di` | `sudo dpkg -i` | Install all .deb files in the current directory |
|
||||
| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory |
|
||||
| `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 |
|
||||
| Alias | Command | Description |
|
||||
| -------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
|
||||
| `aac` | `sudo $apt_pref autoclean` | Clears out the local repository of retrieved package files |
|
||||
| `aar` | `sudo $apt_pref autoremove` | Removes packages installed automatically that are no longer needed |
|
||||
| `abd` | `sudo $apt_pref build-dep` | Installs all dependencies for building packages |
|
||||
| `ac` | `sudo $apt_pref clean` | Clears out the local repository of retrieved package files except lock files |
|
||||
| `ad` | `sudo $apt_pref update` | Updates the package lists for upgrades for packages |
|
||||
| `adg` | `sudo $apt_pref update && sudo $apt_pref $apt_upgr` | Update and upgrade packages |
|
||||
| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list |
|
||||
| `adu` | `sudo $apt_pref update && sudo $apt_pref dist-upgrade` | Smart upgrade that handles dependencies |
|
||||
| `afu` | `sudo apt-file update` | Update the files in packages |
|
||||
| `ai` | `sudo $apt_pref install` | Command-line tool to install package |
|
||||
| `ail` | `sed -e 's/ */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line |
|
||||
| `alu` | `sudo apt update && apt list -u && sudo apt upgrade` | Update, list and upgrade packages |
|
||||
| `ap` | `sudo $apt_pref purge` | Removes packages along with configuration files |
|
||||
| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades |
|
||||
| `di` | `sudo dpkg -i` | Install all .deb files in the current directory |
|
||||
| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory |
|
||||
| `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 |
|
||||
|
||||
## Aliases - Commands using `su`
|
||||
|
||||
|
|
|
|||
|
|
@ -26,7 +26,7 @@ alias age='apt-get'
|
|||
alias api='aptitude'
|
||||
|
||||
# Some self-explanatory aliases
|
||||
alias acs="apt-cache search"
|
||||
alias acse="apt-cache search"
|
||||
alias aps='aptitude search'
|
||||
alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search"
|
||||
|
||||
|
|
@ -51,11 +51,10 @@ if [[ $use_sudo -eq 1 ]]; then
|
|||
alias au="sudo $apt_pref $apt_upgr"
|
||||
alias ai="sudo $apt_pref install"
|
||||
# Install all packages given on the command line while using only the first word of each line:
|
||||
# acs ... | ail
|
||||
# acse ... | ail
|
||||
|
||||
alias ail="sed -e 's/ */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | xargs sudo $apt_pref install"
|
||||
alias ap="sudo $apt_pref purge"
|
||||
alias ar="sudo $apt_pref remove"
|
||||
alias aar="sudo $apt_pref autoremove"
|
||||
|
||||
# apt-get only
|
||||
|
|
@ -98,11 +97,6 @@ else
|
|||
print "$cmd"
|
||||
eval "$cmd"
|
||||
}
|
||||
function ar() {
|
||||
cmd="su -lc '$apt_pref remove $@' root"
|
||||
print "$cmd"
|
||||
eval "$cmd"
|
||||
}
|
||||
function aar() {
|
||||
cmd="su -lc '$apt_pref autoremove $@' root"
|
||||
print "$cmd"
|
||||
|
|
@ -147,7 +141,6 @@ apt_pref_compdef au "$apt_upgr"
|
|||
apt_pref_compdef ai "install"
|
||||
apt_pref_compdef ail "install"
|
||||
apt_pref_compdef ap "purge"
|
||||
apt_pref_compdef ar "remove"
|
||||
apt_pref_compdef aar "autoremove"
|
||||
apt_pref_compdef ads "dselect-upgrade"
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Dnote Plugin
|
||||
|
||||
This plugin adds auto-completion for [Dnote](https://dnote.io) project.
|
||||
This plugin adds auto-completion for [Dnote](https://www.getdnote.com/), a simple command line notebook.
|
||||
|
||||
To use it, add `dnote` to the plugins array in your zshrc file:
|
||||
|
||||
|
|
|
|||
|
|
@ -335,9 +335,9 @@ _docker-machine() {
|
|||
'--tls-ca-key[Private key to generate certificates]:file:_files' \
|
||||
'--tls-client-cert[Client cert to use for TLS]:file:_files' \
|
||||
'--tls-client-key[Private key used in client TLS auth]:file:_files' \
|
||||
'--github-api-token[Token to use for requests to the Github API]' \
|
||||
'--github-api-token[Token to use for requests to the GitHub API]' \
|
||||
'--native-ssh[Use the native (Go-based) SSH implementation.]' \
|
||||
'--bugsnag-api-token[BugSnag API token for crash reporting]' \
|
||||
'--bugsnag-api-token[Bugsnag API token for crash reporting]' \
|
||||
'(- :)'{-v,--version}'[Print the version]' \
|
||||
"(-): :->command" \
|
||||
"(-)*:: :->option-or-argument" && ret=0
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ typeset -gAH emoji_groups
|
|||
|
||||
# def country_iso(_all_names, _omz_name):
|
||||
# """ Using the external library country_converter,
|
||||
# this funciton can detect the ISO2 and ISO3 codes
|
||||
# this function can detect the ISO2 and ISO3 codes
|
||||
# of the country. It takes as argument the array
|
||||
# with all the names of the emoji, and returns that array."""
|
||||
# omz_no_underscore = re.sub(r'_', r' ', _omz_name)
|
||||
|
|
@ -96,7 +96,7 @@ def name_to_omz(_name, _group, _subgroup, _status):
|
|||
# Special treatment by status
|
||||
# Enables us to have every emoji combination,
|
||||
# even the one that are not officially sanctionned
|
||||
# and are implemeted by, say, only one vendor
|
||||
# and are implemented by, say, only one vendor
|
||||
if _status == "unqualified":
|
||||
shortname += "_unqualified"
|
||||
elif _status == "minimally-qualified":
|
||||
|
|
|
|||
|
|
@ -10,10 +10,11 @@ plugins=(... encode64)
|
|||
|
||||
## Functions and Aliases
|
||||
|
||||
| Function | Alias | Description |
|
||||
| ---------- | ----- | ------------------------------ |
|
||||
| `encode64` | `e64` | Encodes given data to base64 |
|
||||
| `decode64` | `d64` | Decodes given data from base64 |
|
||||
| Function | Alias | Description |
|
||||
| -------------- | ------ | -------------------------------------- |
|
||||
| `encode64` | `e64` | Encodes given data to base64 |
|
||||
| `encodefile64` | `ef64` | Encodes given file's content to base64 |
|
||||
| `decode64` | `d64` | Decodes given data from base64 |
|
||||
|
||||
## Usage and examples
|
||||
|
||||
|
|
@ -37,6 +38,20 @@ plugins=(... encode64)
|
|||
b2gtbXktenNo==
|
||||
```
|
||||
|
||||
### Encoding a file
|
||||
|
||||
Encode a file's contents to base64 and save output to text file.
|
||||
**NOTE:** Takes provided file and saves encoded content as new file with `.txt` extension
|
||||
|
||||
- From parameter
|
||||
|
||||
```console
|
||||
$ encodefile64 ohmyzsh.icn
|
||||
ohmyzsh.icn's content encoded in base64 and saved as ohmyzsh.icn.txt
|
||||
$ ef64 "oh-my-zsh"
|
||||
ohmyzsh.icn's content encoded in base64 and saved as ohmyzsh.icn.txt
|
||||
```
|
||||
|
||||
### Decoding
|
||||
|
||||
- From parameter
|
||||
|
|
|
|||
|
|
@ -6,6 +6,15 @@ encode64() {
|
|||
fi
|
||||
}
|
||||
|
||||
encodefile64() {
|
||||
if [[ $# -eq 0 ]]; then
|
||||
echo "You must provide a filename"
|
||||
else
|
||||
base64 -i $1 -o $1.txt
|
||||
echo "${1}'s content encoded in base64 and saved as ${1}.txt"
|
||||
fi
|
||||
}
|
||||
|
||||
decode64() {
|
||||
if [[ $# -eq 0 ]]; then
|
||||
cat | base64 --decode
|
||||
|
|
@ -14,4 +23,5 @@ decode64() {
|
|||
fi
|
||||
}
|
||||
alias e64=encode64
|
||||
alias ef64=encodefile64
|
||||
alias d64=decode64
|
||||
|
|
|
|||
|
|
@ -13,12 +13,11 @@ ZSH_THEME_FOSSIL_PROMPT_DIRTY=" %{$fg_bold[red]%}✖"
|
|||
ZSH_THEME_FOSSIL_PROMPT_CLEAN=" %{$fg_bold[green]%}✔"
|
||||
|
||||
function fossil_prompt_info() {
|
||||
local info=$(fossil branch 2>&1)
|
||||
local branch=$(fossil branch current 2>&1)
|
||||
|
||||
# if we're not in a fossil repo, don't show anything
|
||||
! command grep -q "use --repo" <<< "$info" || return
|
||||
! command grep -q "use --repo" <<< "$branch" || return
|
||||
|
||||
local branch=$(echo $info | grep "* " | sed 's/* //g')
|
||||
local changes=$(fossil changes)
|
||||
local dirty="$ZSH_THEME_FOSSIL_PROMPT_CLEAN"
|
||||
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ function _frontend() {
|
|||
'lodash: Search in Lo-Dash website'
|
||||
'mdn: Search in MDN website'
|
||||
'nodejs: Search in NodeJS website'
|
||||
'npmjs: Search in NPMJS website'
|
||||
'npmjs: Search in npmjs website'
|
||||
'packagephobia: Search in Packagephobia website'
|
||||
'qunit: Search in Qunit website'
|
||||
'reactjs: Search in React website'
|
||||
|
|
|
|||
|
|
@ -178,7 +178,7 @@ function fzf_setup_using_macports() {
|
|||
(( $+commands[fzf] )) || return 1
|
||||
|
||||
# The fzf-zsh-completion package installs the auto-completion in
|
||||
local completions="/opt/local/share/zsh/site-functions/fzf"
|
||||
local completions="/opt/local/share/fzf/shell/completion.zsh"
|
||||
# The fzf-zsh-completion package installs the key-bindings file in
|
||||
local key_bindings="/opt/local/share/fzf/shell/key-bindings.zsh"
|
||||
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ function git-fetch-all {
|
|||
# Fetch all remotes (avoid ssh passphrase prompt)
|
||||
date -R &>! "$gitdir/FETCH_LOG"
|
||||
GIT_SSH_COMMAND="command ssh -o BatchMode=yes" \
|
||||
GIT_TERMINAL_PROMPT=0 \
|
||||
command git fetch --all 2>/dev/null &>> "$gitdir/FETCH_LOG"
|
||||
) &|
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ function update_current_git_vars() {
|
|||
GIT_UNTRACKED=$__CURRENT_GIT_STATUS[7]
|
||||
GIT_STASHED=$__CURRENT_GIT_STATUS[8]
|
||||
GIT_CLEAN=$__CURRENT_GIT_STATUS[9]
|
||||
GIT_DELETED=$__CURRENT_GIT_STATUS[10]
|
||||
}
|
||||
|
||||
git_super_status() {
|
||||
|
|
@ -69,6 +70,9 @@ git_super_status() {
|
|||
if [ "$GIT_CHANGED" -ne "0" ]; then
|
||||
STATUS="$STATUS$ZSH_THEME_GIT_PROMPT_CHANGED$GIT_CHANGED%{${reset_color}%}"
|
||||
fi
|
||||
if [ "$GIT_DELETED" -ne "0" ]; then
|
||||
STATUS="$STATUS$ZSH_THEME_GIT_PROMPT_DELETED$GIT_DELETED%{${reset_color}%}"
|
||||
fi
|
||||
if [ "$GIT_UNTRACKED" -ne "0" ]; then
|
||||
STATUS="$STATUS$ZSH_THEME_GIT_PROMPT_UNTRACKED$GIT_UNTRACKED%{${reset_color}%}"
|
||||
fi
|
||||
|
|
@ -91,6 +95,7 @@ ZSH_THEME_GIT_PROMPT_BRANCH="%{$fg_bold[magenta]%}"
|
|||
ZSH_THEME_GIT_PROMPT_STAGED="%{$fg[red]%}%{●%G%}"
|
||||
ZSH_THEME_GIT_PROMPT_CONFLICTS="%{$fg[red]%}%{✖%G%}"
|
||||
ZSH_THEME_GIT_PROMPT_CHANGED="%{$fg[blue]%}%{✚%G%}"
|
||||
ZSH_THEME_GIT_PROMPT_DELETED="%{$fg[blue]%}%{-%G%}"
|
||||
ZSH_THEME_GIT_PROMPT_BEHIND="%{↓%G%}"
|
||||
ZSH_THEME_GIT_PROMPT_AHEAD="%{↑%G%}"
|
||||
ZSH_THEME_GIT_PROMPT_UNTRACKED="%{$fg[cyan]%}%{…%G%}"
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ if po.returncode != 0:
|
|||
sys.exit(0) # Not a git repository
|
||||
|
||||
# collect git status information
|
||||
untracked, staged, changed, conflicts = [], [], [], []
|
||||
untracked, staged, changed, deleted, conflicts = [], [], [], [], []
|
||||
ahead, behind = 0, 0
|
||||
status = [(line[0], line[1], line[2:]) for line in stdout.decode('utf-8').splitlines()]
|
||||
for st in status:
|
||||
|
|
@ -75,13 +75,15 @@ for st in status:
|
|||
else:
|
||||
if st[1] == 'M':
|
||||
changed.append(st)
|
||||
if st[1] == 'D':
|
||||
deleted.append(st)
|
||||
if st[0] == 'U':
|
||||
conflicts.append(st)
|
||||
elif st[0] != ' ':
|
||||
staged.append(st)
|
||||
|
||||
stashed = get_stash()
|
||||
if not changed and not staged and not conflicts and not untracked:
|
||||
if not changed and not deleted and not staged and not conflicts and not untracked:
|
||||
clean = 1
|
||||
else:
|
||||
clean = 0
|
||||
|
|
@ -95,6 +97,7 @@ out = ' '.join([
|
|||
str(len(changed)),
|
||||
str(len(untracked)),
|
||||
str(stashed),
|
||||
str(clean)
|
||||
str(clean),
|
||||
str(len(deleted))
|
||||
])
|
||||
print(out, end='')
|
||||
|
|
|
|||
|
|
@ -91,8 +91,8 @@ plugins=(... git)
|
|||
| gignore | git update-index --assume-unchanged |
|
||||
| gignored | git ls-files -v \| grep "^[[:lower:]]" |
|
||||
| git-svn-dcommit-push | git svn dcommit && git push github $(git_main_branch):svntrunk |
|
||||
| gk | gitk --all --branches &! |
|
||||
| gke | gitk --all $(git log -g --pretty=%h) &! |
|
||||
| gk | gitk --all --branches &! |
|
||||
| gke | gitk --all $(git log -g --pretty=%h) &! |
|
||||
| gl | git pull |
|
||||
| glg | git log --stat |
|
||||
| glgp | git log --stat -p |
|
||||
|
|
@ -184,7 +184,7 @@ plugins=(... git)
|
|||
| gupom | git pull --rebase origin $(git_main_branch) |
|
||||
| gupomi | git pull --rebase=interactive origin $(git_main_branch) |
|
||||
| glum | git pull upstream $(git_main_branch) |
|
||||
| gluc | git pull upstream $(git_current_branch) |
|
||||
| gluc | git pull upstream $(git_current_branch) |
|
||||
| gwch | git whatchanged -p --abbrev-commit --pretty=medium |
|
||||
| gwip | git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]" |
|
||||
| gam | git am |
|
||||
|
|
@ -192,6 +192,11 @@ plugins=(... git)
|
|||
| gams | git am --skip |
|
||||
| gama | git am --abort |
|
||||
| gamscp | git am --show-current-patch |
|
||||
| gwt | git worktree |
|
||||
| gwta | git worktree add |
|
||||
| gwtls | git worktree list |
|
||||
| gwtmv | git worktree move |
|
||||
| gwtrm | git worktree remove |
|
||||
|
||||
### Main branch preference
|
||||
|
||||
|
|
|
|||
|
|
@ -302,7 +302,7 @@ alias gtv='git tag | sort -V'
|
|||
alias gtl='gtl(){ git tag --sort=-v:refname -n -l "${1}*" }; noglob gtl'
|
||||
|
||||
alias gunignore='git update-index --no-assume-unchanged'
|
||||
alias gunwip='git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1'
|
||||
alias gunwip='git log -n 1 | grep -q -c "\--wip--" && git reset HEAD~1'
|
||||
alias gup='git pull --rebase'
|
||||
alias gupv='git pull --rebase -v'
|
||||
alias gupa='git pull --rebase --autostash'
|
||||
|
|
@ -315,6 +315,12 @@ alias gluc='git pull upstream $(git_current_branch)'
|
|||
alias gwch='git whatchanged -p --abbrev-commit --pretty=medium'
|
||||
alias gwip='git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify --no-gpg-sign -m "--wip-- [skip ci]"'
|
||||
|
||||
alias gwt='git worktree'
|
||||
alias gwta='git worktree add'
|
||||
alias gwtls='git worktree list'
|
||||
alias gwtmv='git worktree move'
|
||||
alias gwtrm='git worktree remove'
|
||||
|
||||
alias gam='git am'
|
||||
alias gamc='git am --continue'
|
||||
alias gams='git am --skip'
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ __gradle-generate-script-cache() {
|
|||
zle -R "Generating Gradle build script cache"
|
||||
# Cache all Gradle scripts
|
||||
local -a gradle_build_scripts
|
||||
gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | egrep -v "$script_exclude_pattern") )
|
||||
gradle_build_scripts=( $(find $project_root_dir -type f -name "*.gradle" -o -name "*.gradle.kts" 2>/dev/null | grep -E -v "$script_exclude_pattern") )
|
||||
printf "%s\n" "${gradle_build_scripts[@]}" >| $cache_dir/$cache_name
|
||||
fi
|
||||
}
|
||||
|
|
|
|||
9
plugins/hasura/README.md
Normal file
9
plugins/hasura/README.md
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
# Hasura plugin
|
||||
|
||||
This plugin adds completion for [the Hasura CLI](https://hasura.io/docs/latest/hasura-cli/index/).
|
||||
|
||||
To use it, add `hasura` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... hasura)
|
||||
```
|
||||
13
plugins/hasura/hasura.plugin.zsh
Normal file
13
plugins/hasura/hasura.plugin.zsh
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
if (( ! $+commands[hasura] )); then
|
||||
return
|
||||
fi
|
||||
|
||||
# If the completion file does not exist, generate it and then source it
|
||||
# Otherwise, source it and regenerate in the background
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_hasura" ]]; then
|
||||
hasura completion zsh --file "$ZSH_CACHE_DIR/completions/_hasura" >/dev/null
|
||||
source "$ZSH_CACHE_DIR/completions/_hasura"
|
||||
else
|
||||
source "$ZSH_CACHE_DIR/completions/_hasura"
|
||||
hasura completion zsh --file "$ZSH_CACHE_DIR/completions/_hasura" >/dev/null &|
|
||||
fi
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
#compdef http
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright (c) 2015 Github zsh-users - http://github.com/zsh-users
|
||||
# Copyright (c) 2015 GitHub zsh-users - http://github.com/zsh-users
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#compdef kitchen
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright (c) 2014 Github zsh-users - https://github.com/zsh-users
|
||||
# Copyright (c) 2014 GitHub zsh-users - https://github.com/zsh-users
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@ plugins=(... lol)
|
|||
| `violenz` | `git rebase` |
|
||||
| `visible` | `echo` |
|
||||
| `wtf` | `dmesg` |
|
||||
| `yolo` | `git commit -m "$(curl -s http://whatthecommit.com/index.txt)"` |
|
||||
| `yolo` | `git commit -m "$(curl -s https://whatthecommit.com/index.txt)"` |
|
||||
|
||||
## Usage Examples
|
||||
|
||||
|
|
@ -66,6 +66,6 @@ nowai u=r,go= some.file
|
|||
# ssh root@catserver.org
|
||||
pwned root@catserver.org
|
||||
|
||||
# git commit -m "$(curl -s http://whatthecommit.com/index.txt)"
|
||||
# git commit -m "$(curl -s https://whatthecommit.com/index.txt)"
|
||||
yolo
|
||||
```
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ alias bringz='git pull'
|
|||
alias chicken='git add'
|
||||
alias oanward='git commit -m'
|
||||
alias ooanward='git commit -am'
|
||||
alias yolo='git commit -m "$(curl -s http://whatthecommit.com/index.txt)"'
|
||||
alias yolo='git commit -m "$(curl -s https://whatthecommit.com/index.txt)"'
|
||||
alias letcat='git checkout'
|
||||
alias violenz='git rebase'
|
||||
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ _lpass() {
|
|||
generic_options+=('--color=[Color: auto | never | always]')
|
||||
fi
|
||||
if [ "$has_interactive" -eq 1 ]; then
|
||||
generic_options+=("--non-interactive[Use stardard input instead of $EDITOR]")
|
||||
generic_options+=("--non-interactive[Use standard input instead of $EDITOR]")
|
||||
fi
|
||||
_arguments $generic_options
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -46,7 +46,7 @@ elif (( CURRENT == 3 )); then
|
|||
# ...
|
||||
# }
|
||||
# }
|
||||
# In abscence of a proper JSON parser, just grab the lines with
|
||||
# In absence of a proper JSON parser, just grab the lines with
|
||||
# a 2-space indentation and only the stuff inside quotes
|
||||
local -a projects
|
||||
projects=(${(@f)"$(ng config projects 2>/dev/null | sed -n 's/^ "\([^"]\+\)".*$/\1/p')"})
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
(( $+commands[npm] )) && {
|
||||
rm -f "${ZSH_CACHE_DIR:-$ZSH/cache}/npm_completion"
|
||||
command rm -f "${ZSH_CACHE_DIR:-$ZSH/cache}/npm_completion"
|
||||
|
||||
_npm_completion() {
|
||||
local si=$IFS
|
||||
|
|
|
|||
|
|
@ -22,9 +22,9 @@ These settings should go in your zshrc file, before Oh My Zsh is sourced:
|
|||
nvm has been installed, regardless of chip architecture, use `NVM_HOMEBREW=$(brew --prefix nvm)`.
|
||||
|
||||
- **`NVM_LAZY`**: if you want the plugin to defer the load of nvm to speed-up the start of your zsh session,
|
||||
set `NVM_LAZY` to `1`. This will use the `--no-use` parameter when loading nvm, and will create a function
|
||||
for `node`, `npm`, `yarn`, and the command(s) specified by `NVM_LAZY_CMD`, so when you call either of them,
|
||||
nvm will load with `nvm use default`.
|
||||
set `NVM_LAZY` to `1`. This will source nvm script only when using it, and will create a function for `node`,
|
||||
`npm`, `pnpm`, `yarn`, and the command(s) specified by `NVM_LAZY_CMD`, so when you call either of them,
|
||||
nvm will be loaded and run with default version.
|
||||
|
||||
- **`NVM_LAZY_CMD`**: if you want additional command(s) to trigger lazy loading of nvm, set `NVM_LAZY_CMD` to
|
||||
the command or an array of the commands.
|
||||
|
|
|
|||
|
|
@ -4,39 +4,33 @@ if [[ -z "$NVM_DIR" ]]; then
|
|||
export NVM_DIR="$HOME/.nvm"
|
||||
elif [[ -d "${XDG_CONFIG_HOME:-$HOME/.config}/nvm" ]]; then
|
||||
export NVM_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/nvm"
|
||||
elif (( $+commands[brew] )); then
|
||||
NVM_HOMEBREW="${NVM_HOMEBREW:-${HOMEBREW_PREFIX:-$(brew --prefix)}/opt/nvm}"
|
||||
if [[ -d "$NVM_HOMEBREW" ]]; then
|
||||
export NVM_DIR="$NVM_HOMEBREW"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# Don't try to load nvm if command already available
|
||||
# Note: nvm is a function so we need to use `which`
|
||||
! which nvm &>/dev/null || return
|
||||
which nvm &>/dev/null && return
|
||||
|
||||
if [[ -f "$NVM_DIR/nvm.sh" ]]; then
|
||||
if (( $+NVM_LAZY )); then
|
||||
# Call nvm when first using nvm, node, npm, pnpm, yarn or $NVM_LAZY_CMD
|
||||
function nvm node npm pnpm yarn $NVM_LAZY_CMD {
|
||||
unfunction nvm node npm pnpm yarn $NVM_LAZY_CMD
|
||||
# Load nvm if it exists in $NVM_DIR
|
||||
[[ -f "$NVM_DIR/nvm.sh" ]] && source "$NVM_DIR/nvm.sh"
|
||||
"$0" "$@"
|
||||
}
|
||||
elif [[ -f "$NVM_DIR/nvm.sh" ]]; then
|
||||
# Load nvm if it exists in $NVM_DIR
|
||||
source "$NVM_DIR/nvm.sh" ${NVM_LAZY+"--no-use"}
|
||||
elif (( $+commands[brew] )); then
|
||||
# Otherwise try to load nvm installed via Homebrew
|
||||
# User can set this if they have an unusual Homebrew setup
|
||||
NVM_HOMEBREW="${NVM_HOMEBREW:-${HOMEBREW_PREFIX:-$(brew --prefix)}/opt/nvm}"
|
||||
# Load nvm from Homebrew location if it exists
|
||||
if [[ -f "$NVM_HOMEBREW/nvm.sh" ]]; then
|
||||
source "$NVM_HOMEBREW/nvm.sh" ${NVM_LAZY+"--no-use"}
|
||||
else
|
||||
return
|
||||
fi
|
||||
source "$NVM_DIR/nvm.sh"
|
||||
else
|
||||
return
|
||||
fi
|
||||
|
||||
# Call nvm when first using node, npm or yarn
|
||||
if (( $+NVM_LAZY )); then
|
||||
function node npm yarn $NVM_LAZY_CMD {
|
||||
unfunction node npm yarn $NVM_LAZY_CMD
|
||||
nvm use default
|
||||
command "$0" "$@"
|
||||
}
|
||||
fi
|
||||
|
||||
# Autoload nvm when finding a .nvmrc file in the current directory
|
||||
# Adapted from: https://github.com/nvm-sh/nvm#zsh
|
||||
if (( $+NVM_AUTOLOAD )); then
|
||||
|
|
|
|||
|
|
@ -10,6 +10,16 @@ plugins=(... perms)
|
|||
|
||||
## Usage
|
||||
|
||||
* `set755` recursively sets all given directories (default to .) to octal 755.
|
||||
* `set644` recursively sets all given files (default to .) to octal 644.
|
||||
* `fixperms` is a wrapper around `set755` and `set644` applied to a specified directory or the current directory otherwise. It also prompts prior to execution unlike the other two aliases.
|
||||
> **CAUTION:** these functions are harmful if you don't know what they do.
|
||||
|
||||
- `set755`: sets the permission to octal 755 for all given directories and their child directories (by default, starting from the current directory).
|
||||
|
||||
- `set644`: sets the permission to octal 644 for all files of the given directory (by default, the current directory), recursively. It will only affect regular files (no symlinks).
|
||||
|
||||
- `resetperms` is a wrapper around `set755` and `set644` applied to a specified directory or the current directory otherwise.
|
||||
It will set the permissions to 755 for directories, and 644 for files.
|
||||
|
||||
## Reference
|
||||
|
||||
- octal 644: _read and write_ for the owner, _read_ for the group and others users.
|
||||
- octal 755: _read, write and execute_ permissions for the owner, and _read and execute_ for the group and others users.
|
||||
|
|
|
|||
|
|
@ -6,25 +6,25 @@
|
|||
### Aliases
|
||||
|
||||
# Set all files' permissions to 644 recursively in a directory
|
||||
set644() {
|
||||
function set644 {
|
||||
find "${@:-.}" -type f ! -perm 644 -print0 | xargs -0 chmod 644
|
||||
}
|
||||
|
||||
# Set all directories' permissions to 755 recursively in a directory
|
||||
set755() {
|
||||
function set755 {
|
||||
find "${@:-.}" -type d ! -perm 755 -print0 | xargs -0 chmod 755
|
||||
}
|
||||
|
||||
### Functions
|
||||
|
||||
# fixperms - fix permissions on files and directories, with confirmation
|
||||
# resetperms - fix permissions on files and directories, with confirmation
|
||||
# Returns 0 on success, nonzero if any errors occurred
|
||||
fixperms () {
|
||||
function resetperms {
|
||||
local opts confirm target exit_status chmod_opts use_slow_mode
|
||||
zparseopts -E -D -a opts -help -slow v+=chmod_opts
|
||||
if [[ $# > 1 || -n "${opts[(r)--help]}" ]]; then
|
||||
cat <<EOF
|
||||
Usage: fixperms [-v] [--help] [--slow] [target]
|
||||
Usage: resetperms [-v] [--help] [--slow] [target]
|
||||
|
||||
target is the file or directory to change permissions on. If omitted,
|
||||
the current directory is taken to be the target.
|
||||
|
|
@ -40,7 +40,7 @@ EOF
|
|||
return $exit_status
|
||||
fi
|
||||
|
||||
if [[ $# == 0 ]]; then
|
||||
if [[ $# -eq 0 ]]; then
|
||||
target="."
|
||||
else
|
||||
target="$1"
|
||||
|
|
@ -49,7 +49,7 @@ EOF
|
|||
|
||||
# Because this requires confirmation, bail in noninteractive shells
|
||||
if [[ ! -o interactive ]]; then
|
||||
echo "fixperms: cannot run in noninteractive shell"
|
||||
echo "resetperms: cannot run in noninteractive shell"
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
|
@ -68,15 +68,20 @@ EOF
|
|||
if [[ $use_slow == true ]]; then
|
||||
# Process directories first so non-traversable ones are fixed as we go
|
||||
find "$target" -type d ! -perm 755 -exec chmod $chmod_opts 755 {} \;
|
||||
if [[ $? != 0 ]]; then exit_status=$?; fi
|
||||
if [[ $? -ne 0 ]]; then exit_status=$?; fi
|
||||
find "$target" -type f ! -perm 644 -exec chmod $chmod_opts 644 {} \;
|
||||
if [[ $? != 0 ]]; then exit_status=$?; fi
|
||||
if [[ $? -ne 0 ]]; then exit_status=$?; fi
|
||||
else
|
||||
find "$target" -type d ! -perm 755 -print0 | xargs -0 chmod $chmod_opts 755
|
||||
if [[ $? != 0 ]]; then exit_status=$?; fi
|
||||
if [[ $? -ne 0 ]]; then exit_status=$?; fi
|
||||
find "$target" -type f ! -perm 644 -print0 | xargs -0 chmod $chmod_opts 644
|
||||
if [[ $? != 0 ]]; then exit_status=$?; fi
|
||||
if [[ $? -ne 0 ]]; then exit_status=$?; fi
|
||||
fi
|
||||
echo "Complete"
|
||||
return $exit_status
|
||||
}
|
||||
|
||||
function fixperms {
|
||||
print -ru2 "fixperms has been deprecated. Use resetperms instead"
|
||||
return 1
|
||||
}
|
||||
|
|
|
|||
|
|
@ -94,12 +94,12 @@ alias pipreq="pip freeze > requirements.txt"
|
|||
# Install packages from requirements file
|
||||
alias pipir="pip install -r requirements.txt"
|
||||
|
||||
# Update all installed packages
|
||||
# Upgrade all installed packages
|
||||
function pipupall {
|
||||
# non-GNU xargs does not support nor need `--no-run-if-empty`
|
||||
local xargs="xargs --no-run-if-empty"
|
||||
xargs --version 2>/dev/null | grep -q GNU || xargs="xargs"
|
||||
pip list --outdated --format freeze | cut -d= -f1 | ${=xargs} pip install --upgrade
|
||||
pip list --outdated | awk 'NR > 2 { print $1 }' | ${=xargs} pip install --upgrade
|
||||
}
|
||||
|
||||
# Uninstalled all installed packages
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ start_options=(
|
|||
)
|
||||
logs_options=(
|
||||
'--json[json log output]'
|
||||
'--format[formated log output]'
|
||||
'--format[formatted log output]'
|
||||
'--raw[raw output]'
|
||||
'--err[only shows error output]'
|
||||
'--out[only shows standard output]'
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
# -----------------------------------------------------------------------------
|
||||
# FILE: _pod
|
||||
# DESCRIPTION: Cocoapods (0.33.1) autocomplete plugin for Oh-My-Zsh
|
||||
# DESCRIPTION: CocoaPods (0.33.1) autocomplete plugin for Oh-My-Zsh
|
||||
# https://cocoapods.org
|
||||
# Generated with `pod --completion-script
|
||||
# AUTHOR: Alexandre Joly (alexandre.joly@mekanics.ch)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#compdef rails
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright (c) 2016 Github zsh-users - http://github.com/zsh-users
|
||||
# Copyright (c) 2016 GitHub zsh-users - http://github.com/zsh-users
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
|||
|
|
@ -11,66 +11,78 @@ plugins=(... react-native)
|
|||
|
||||
## Aliases
|
||||
|
||||
| Alias | React Native command |
|
||||
| :------------ | :------------------------------------------------- |
|
||||
| **rn** | `react-native` |
|
||||
| **rns** | `react-native start` |
|
||||
| **rnlink** | `react-native link` |
|
||||
| _Logging_ | |
|
||||
| **rnland** | `react-native log-android` |
|
||||
| **rnlios** | `react-native log-ios` |
|
||||
| _App Testing_ | |
|
||||
| **rnand** | `react-native run-android` |
|
||||
| **rnios** | `react-native run-ios` |
|
||||
| _iPhone_ | |
|
||||
| **rnios4s** | `react-native run-ios --simulator "iPhone 4s"` |
|
||||
| **rnios5** | `react-native run-ios --simulator "iPhone 5"` |
|
||||
| **rnios5s** | `react-native run-ios --simulator "iPhone 5s"` |
|
||||
| **rnios6** | `react-native run-ios --simulator "iPhone 6"` |
|
||||
| **rnios6s** | `react-native run-ios --simulator "iPhone 6s"` |
|
||||
| **rnios6p** | `react-native run-ios --simulator "iPhone 6 Plus"` |
|
||||
| **rnios6sp** | `react-native run-ios --simulator "iPhone 6s Plus"` |
|
||||
| **rnios7** | `react-native run-ios --simulator "iPhone 7"` |
|
||||
| **rnios7p** | `react-native run-ios --simulator "iPhone 7 Plus"` |
|
||||
| **rnios8** | `react-native run-ios --simulator "iPhone 8"` |
|
||||
| **rnios8p** | `react-native run-ios --simulator "iPhone 8 Plus"` |
|
||||
| **rniosse** | `react-native run-ios --simulator "iPhone SE"` |
|
||||
| **rniosx** | `react-native run-ios --simulator "iPhone X"` |
|
||||
| **rniosxs** | `react-native run-ios --simulator "iPhone Xs"` |
|
||||
| **rniosxsm** | `react-native run-ios --simulator "iPhone Xs Max"` |
|
||||
| **rniosxr** | `react-native run-ios --simulator "iPhone Xʀ"` |
|
||||
| **rnios11** | `react-native run-ios --simulator "iPhone 11"` |
|
||||
| **rnios11p** | `react-native run-ios --simulator "iPhone 11 Pro"` |
|
||||
| **rnios11pm** | `react-native run-ios --simulator "iPhone 11 Pro Max"` |
|
||||
| _iPad_ | |
|
||||
| **rnipad2** | `react-native run-ios --simulator "iPad 2"` |
|
||||
| **rnipad5** | `react-native run-ios --simulator "iPad (5th generation)"` |
|
||||
| **rnipad6** | `react-native run-ios --simulator "iPad (6th generation)"` |
|
||||
| **rnipadr** | `react-native run-ios --simulator "iPad Retina"` |
|
||||
| **rnipada** | `react-native run-ios --simulator "iPad Air"` |
|
||||
| **rnipada2** | `react-native run-ios --simulator "iPad Air 2"` |
|
||||
| **rnipada3** | `react-native run-ios --simulator "iPad Air (3rd generation)"` |
|
||||
| **rnipadm2** | `react-native run-ios --simulator "iPad mini 2"` |
|
||||
| **rnipadm3** | `react-native run-ios --simulator "iPad mini 3"` |
|
||||
| **rnipadm4** | `react-native run-ios --simulator "iPad mini 4"` |
|
||||
| **rnipadm5** | `react-native run-ios --simulator "iPad mini (5th generation)"` |
|
||||
| **rnipadp9** | `react-native run-ios --simulator "iPad Pro (9.7-inch)"` |
|
||||
| **rnipadp12** | `react-native run-ios --simulator "iPad Pro (12.9-inch)"` |
|
||||
| **rnipadp122** | `react-native run-ios --simulator "iPad Pro (12.9-inch) (2nd generation)"` |
|
||||
| **rnipadp10** | `react-native run-ios --simulator "iPad Pro (10.5-inch)"` |
|
||||
| **rnipad11** | `react-native run-ios --simulator "iPad Pro (11-inch)"` |
|
||||
| **rnipad123** | `react-native run-ios --simulator "iPad Pro (12.9-inch) (3rd generation)"` |
|
||||
| _Apple TV_ | |
|
||||
| **rnatv** | `react-native run-ios --simulator "Apple TV"` |
|
||||
| **rnatv4k** | `react-native run-ios --simulator "Apple TV 4K"` |
|
||||
| **rnatv4k1080**| `react-native run-ios --simulator "Apple TV 4K (at 1080p)"` |
|
||||
| **rnipad123** | `react-native run-ios --simulator "iPad Pro (12.9-inch) (3rd generation)"` |
|
||||
| _Apple Watch_ | |
|
||||
| **rnaw38** | `react-native run-ios --simulator "Apple Watch - 38mm"` |
|
||||
| **rnaw42** | `react-native run-ios --simulator "Apple Watch - 42mm"` |
|
||||
| **rnaws238** | `react-native run-ios --simulator "Apple Watch Series 2 - 38mm"` |
|
||||
| **rnaws242** | `react-native run-ios --simulator "Apple Watch Series 2 - 42mm"` |
|
||||
| **rnaws338** | `react-native run-ios --simulator "Apple Watch Series 3 - 38mm"` |
|
||||
| **rnaws342** | `react-native run-ios --simulator "Apple Watch Series 3 - 42mm"` |
|
||||
| **rnaws440** | `react-native run-ios --simulator "Apple Watch Series 4 - 40mm"` |
|
||||
| **rnaws444** | `react-native run-ios --simulator "Apple Watch Series 4 - 44mm"` |
|
||||
| Alias | React Native command |
|
||||
| :-------------- | :------------------------------------------------------------------------- |
|
||||
| **rn** | `react-native` |
|
||||
| **rns** | `react-native start` |
|
||||
| **rnlink** | `react-native link` |
|
||||
| _Logging_ | |
|
||||
| **rnland** | `react-native log-android` |
|
||||
| **rnlios** | `react-native log-ios` |
|
||||
| _App Testing_ | |
|
||||
| **rnand** | `react-native run-android` |
|
||||
| **rnios** | `react-native run-ios` |
|
||||
| _iPhone_ | |
|
||||
| **rnios4s** | `react-native run-ios --simulator "iPhone 4s"` |
|
||||
| **rnios5** | `react-native run-ios --simulator "iPhone 5"` |
|
||||
| **rnios5s** | `react-native run-ios --simulator "iPhone 5s"` |
|
||||
| **rnios6** | `react-native run-ios --simulator "iPhone 6"` |
|
||||
| **rnios6s** | `react-native run-ios --simulator "iPhone 6s"` |
|
||||
| **rnios6p** | `react-native run-ios --simulator "iPhone 6 Plus"` |
|
||||
| **rnios6sp** | `react-native run-ios --simulator "iPhone 6s Plus"` |
|
||||
| **rnios7** | `react-native run-ios --simulator "iPhone 7"` |
|
||||
| **rnios7p** | `react-native run-ios --simulator "iPhone 7 Plus"` |
|
||||
| **rnios8** | `react-native run-ios --simulator "iPhone 8"` |
|
||||
| **rnios8p** | `react-native run-ios --simulator "iPhone 8 Plus"` |
|
||||
| **rniosse** | `react-native run-ios --simulator "iPhone SE"` |
|
||||
| **rniosx** | `react-native run-ios --simulator "iPhone X"` |
|
||||
| **rniosxs** | `react-native run-ios --simulator "iPhone Xs"` |
|
||||
| **rniosxsm** | `react-native run-ios --simulator "iPhone Xs Max"` |
|
||||
| **rniosxr** | `react-native run-ios --simulator "iPhone Xʀ"` |
|
||||
| **rnios11** | `react-native run-ios --simulator "iPhone 11"` |
|
||||
| **rnios11p** | `react-native run-ios --simulator "iPhone 11 Pro"` |
|
||||
| **rnios11pm** | `react-native run-ios --simulator "iPhone 11 Pro Max"` |
|
||||
| **rnios12** | `react-native run-ios --simulator "iPhone 12"` |
|
||||
| **rnios12m** | `react-native run-ios --simulator "iPhone 12 mini"` |
|
||||
| **rnios12p** | `react-native run-ios --simulator "iPhone 12 Pro"` |
|
||||
| **rnios12pm** | `react-native run-ios --simulator "iPhone 12 Pro Max"` |
|
||||
| **rnios13** | `react-native run-ios --simulator "iPhone 13"` |
|
||||
| **rnios13m** | `react-native run-ios --simulator "iPhone 13 mini"` |
|
||||
| **rnios13p** | `react-native run-ios --simulator "iPhone 13 Pro"` |
|
||||
| **rnios13pm** | `react-native run-ios --simulator "iPhone 13 Pro Max"` |
|
||||
| **rnios14** | `react-native run-ios --simulator "iPhone 14"` |
|
||||
| **rnios14pl** | `react-native run-ios --simulator "iPhone 14 Plus"` |
|
||||
| **rnios14p** | `react-native run-ios --simulator "iPhone 14 Pro"` |
|
||||
| **rnios14pm** | `react-native run-ios --simulator "iPhone 14 Pro Max"` |
|
||||
| _iPad_ | |
|
||||
| **rnipad2** | `react-native run-ios --simulator "iPad 2"` |
|
||||
| **rnipad5** | `react-native run-ios --simulator "iPad (5th generation)"` |
|
||||
| **rnipad6** | `react-native run-ios --simulator "iPad (6th generation)"` |
|
||||
| **rnipadr** | `react-native run-ios --simulator "iPad Retina"` |
|
||||
| **rnipada** | `react-native run-ios --simulator "iPad Air"` |
|
||||
| **rnipada2** | `react-native run-ios --simulator "iPad Air 2"` |
|
||||
| **rnipada3** | `react-native run-ios --simulator "iPad Air (3rd generation)"` |
|
||||
| **rnipadm2** | `react-native run-ios --simulator "iPad mini 2"` |
|
||||
| **rnipadm3** | `react-native run-ios --simulator "iPad mini 3"` |
|
||||
| **rnipadm4** | `react-native run-ios --simulator "iPad mini 4"` |
|
||||
| **rnipadm5** | `react-native run-ios --simulator "iPad mini (5th generation)"` |
|
||||
| **rnipadp9** | `react-native run-ios --simulator "iPad Pro (9.7-inch)"` |
|
||||
| **rnipadp12** | `react-native run-ios --simulator "iPad Pro (12.9-inch)"` |
|
||||
| **rnipadp122** | `react-native run-ios --simulator "iPad Pro (12.9-inch) (2nd generation)"` |
|
||||
| **rnipadp10** | `react-native run-ios --simulator "iPad Pro (10.5-inch)"` |
|
||||
| **rnipad11** | `react-native run-ios --simulator "iPad Pro (11-inch)"` |
|
||||
| **rnipad123** | `react-native run-ios --simulator "iPad Pro (12.9-inch) (3rd generation)"` |
|
||||
| _Apple TV_ | |
|
||||
| **rnatv** | `react-native run-ios --simulator "Apple TV"` |
|
||||
| **rnatv4k** | `react-native run-ios --simulator "Apple TV 4K"` |
|
||||
| **rnatv4k1080** | `react-native run-ios --simulator "Apple TV 4K (at 1080p)"` |
|
||||
| **rnipad123** | `react-native run-ios --simulator "iPad Pro (12.9-inch) (3rd generation)"` |
|
||||
| _Apple Watch_ | |
|
||||
| **rnaw38** | `react-native run-ios --simulator "Apple Watch - 38mm"` |
|
||||
| **rnaw42** | `react-native run-ios --simulator "Apple Watch - 42mm"` |
|
||||
| **rnaws238** | `react-native run-ios --simulator "Apple Watch Series 2 - 38mm"` |
|
||||
| **rnaws242** | `react-native run-ios --simulator "Apple Watch Series 2 - 42mm"` |
|
||||
| **rnaws338** | `react-native run-ios --simulator "Apple Watch Series 3 - 38mm"` |
|
||||
| **rnaws342** | `react-native run-ios --simulator "Apple Watch Series 3 - 42mm"` |
|
||||
| **rnaws440** | `react-native run-ios --simulator "Apple Watch Series 4 - 40mm"` |
|
||||
| **rnaws444** | `react-native run-ios --simulator "Apple Watch Series 4 - 44mm"` |
|
||||
|
|
|
|||
|
|
@ -28,9 +28,17 @@ alias rnios11='react-native run-ios --simulator "iPhone 11"'
|
|||
alias rnios11p='react-native run-ios --simulator "iPhone 11 Pro"'
|
||||
alias rnios11pm='react-native run-ios --simulator "iPhone 11 Pro Max"'
|
||||
alias rnios12='react-native run-ios --simulator "iPhone 12"'
|
||||
alias rnios12m='react-native run-ios --simulator "iPhone 12 mini"'
|
||||
alias rnios12p='react-native run-ios --simulator "iPhone 12 Pro"'
|
||||
alias rnios12pm='react-native run-ios --simulator "iPhone 12 Pro Max"'
|
||||
|
||||
alias rnios13='react-native run-ios --simulator "iPhone 13"'
|
||||
alias rnios13m='react-native run-ios --simulator "iPhone 13 mini"'
|
||||
alias rnios13p='react-native run-ios --simulator "iPhone 13 Pro"'
|
||||
alias rnios13pm='react-native run-ios --simulator "iPhone 13 Pro Max"'
|
||||
alias rnios14='react-native run-ios --simulator "iPhone 14"'
|
||||
alias rnios14pl='react-native run-ios --simulator "iPhone 14 Plus"'
|
||||
alias rnios14p='react-native run-ios --simulator "iPhone 14 Pro"'
|
||||
alias rnios14pm='react-native run-ios --simulator "iPhone 14 Pro Max"'
|
||||
|
||||
# iPad
|
||||
alias rnipad2='react-native run-ios --simulator "iPad 2"'
|
||||
|
|
|
|||
|
|
@ -591,7 +591,7 @@ _rg "$@"
|
|||
################################################################################
|
||||
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
|
||||
# Copyright (c) 2011 GitHub zsh-users - http://github.com/zsh-users
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
# zstyle ':completion::complete:salt(|-call):modules:' use-cache true
|
||||
# zstyle ':completion::complete:salt(|-cp|-call|-run|-key):salt_dir:' use-cache true
|
||||
#
|
||||
# cache validation can be controled with the style cache-ttl.
|
||||
# cache validation can be controlled with the style cache-ttl.
|
||||
# it expects two arguments: number (days|hours|weeks|months)
|
||||
# to invalidate the minion cache after four days:
|
||||
# zstyle ':completion::complete:salt(|-cp|-call):minions:' cache-ttl 4 days
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
#compdef scala scalac
|
||||
# ------------------------------------------------------------------------------
|
||||
# Copyright (c) 2012 Github zsh-users - https://github.com/zsh-users
|
||||
# Copyright (c) 2012 GitHub zsh-users - https://github.com/zsh-users
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
|
|
|||
13
plugins/sigstore/README.md
Normal file
13
plugins/sigstore/README.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
# Sigstore plugin
|
||||
|
||||
This plugin sets up completion for the following [Sigstore](https://sigstore.dev/) CLI tools.
|
||||
|
||||
- [Cosign](https://docs.sigstore.dev/cosign/overview)
|
||||
- [Sget](https://docs.sigstore.dev/cosign/installation#alpine-linux)
|
||||
- [Rekor](https://docs.sigstore.dev/rekor/overview)
|
||||
|
||||
To use it, add `sigstore` to the plugins array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
plugins=(... sigstore)
|
||||
```
|
||||
22
plugins/sigstore/sigstore.plugin.zsh
Normal file
22
plugins/sigstore/sigstore.plugin.zsh
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
function install_autocompletion {
|
||||
if (( ! $+commands[$1] )); then
|
||||
return
|
||||
fi
|
||||
|
||||
# If the completion file doesn't exist yet, we need to autoload it and
|
||||
# bind it to `$1` (cosign, sget, rekor-cli). Otherwise, compinit will
|
||||
# have already done that
|
||||
if [[ ! -f "$ZSH_CACHE_DIR/completions/_$1" ]]; then
|
||||
autoload -Uz _$1
|
||||
typeset -g -A _comps
|
||||
_comps[$1]=_$1
|
||||
fi
|
||||
|
||||
$1 completion zsh >| "$ZSH_CACHE_DIR/completions/_$1" &|
|
||||
}
|
||||
|
||||
install_autocompletion cosign
|
||||
install_autocompletion sget
|
||||
install_autocompletion rekor-cli
|
||||
|
||||
unfunction install_autocompletion
|
||||
|
|
@ -72,6 +72,9 @@ function _add_identities() {
|
|||
local args
|
||||
zstyle -a :omz:plugins:ssh-agent ssh-add-args args
|
||||
|
||||
# if ssh-agent quiet mode, pass -q to ssh-add
|
||||
zstyle -t :omz:plugins:ssh-agent quiet && args=(-q $args)
|
||||
|
||||
# use user specified helper to ask for password (ksshaskpass, etc)
|
||||
local helper
|
||||
zstyle -s :omz:plugins:ssh-agent helper helper
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
## Description
|
||||
|
||||
This plugin provides a few utilities that make you faster on your daily work with the [Swift Package Manager](https://github.com/apple/swift-package-manager), as well as autocompletion for Swift 5.1.
|
||||
This plugin provides a few utilities that make you faster on your daily work with the [Swift Package Manager](https://github.com/apple/swift-package-manager), as well as autocompletion for Swift 5.7.
|
||||
|
||||
To start using it, add the `swiftpm` plugin to your `plugins` array in `~/.zshrc`:
|
||||
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -41,7 +41,7 @@ plugins=(... systemadmin)
|
|||
| accessip10 | List the top 10 accesses to the ip address in the nginx/access.log file or another log file if specified |
|
||||
| visitpage20 | List the top 20 most visited files or pages in the nginx/access.log file or another log file if specified |
|
||||
| consume100 | List the 100 most time-consuming Page lists (more than 60 seconds) as well as the corresponding number of occurrences |
|
||||
| webtraffic | List website traffic statistics in GB from tne nginx/access.log file or another log file if specified |
|
||||
| webtraffic | List website traffic statistics in GB from the nginx/access.log file or another log file if specified |
|
||||
| c404 | List statistics on 404 connections in the nginx/access.log file or another log file if specified |
|
||||
| httpstatus | List statistics based on http status in the nginx/access.log file or another log file if specified |
|
||||
| d0 | Delete 0 byte files recursively in the current directory or another if specified |
|
||||
|
|
|
|||
|
|
@ -1,411 +0,0 @@
|
|||
#compdef terraform
|
||||
|
||||
local -a _terraform_cmds opt_args
|
||||
_terraform_cmds=(
|
||||
'apply:Builds or changes infrastructure'
|
||||
'console:Interactive console for Terraform interpolations'
|
||||
'destroy:Destroy Terraform-managed infrastructure'
|
||||
'fmt:Rewrites config files to canonical format'
|
||||
'force-unlock:Manually unlock the terraform state'
|
||||
'get:Download and install modules for the configuration'
|
||||
'graph:Create a visual graph of Terraform resources'
|
||||
'import:Import existing infrastructure into Terraform'
|
||||
'init:Initialize a Terraform working directory'
|
||||
'login:Obtain and save credentials for a remote host'
|
||||
'logout:Remove locally-stored credentials for a remote host'
|
||||
'output:Read an output from a state file'
|
||||
'plan:Generate and show an execution plan'
|
||||
'providers:Prints a tree of the providers used in the configuration'
|
||||
'refresh:Update local state file against real resources'
|
||||
'show:Inspect Terraform state or plan'
|
||||
'state:Advanced state management'
|
||||
'taint:Manually mark a resource for recreation'
|
||||
'untaint:Manually unmark a resource as tainted'
|
||||
'validate:Validates the Terraform files'
|
||||
'version:Prints the Terraform version'
|
||||
'workspace:Workspace management'
|
||||
'0.12upgrade:Rewrites pre-0.12 module source code for v0.12'
|
||||
'0.13upgrade:Rewrites pre-0.13 module source code for v0.13'
|
||||
)
|
||||
|
||||
__012upgrade() {
|
||||
_arguments \
|
||||
'-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]' \
|
||||
'-force[ Override the heuristic that attempts to detect if a configuration is already written for v0.12 or later. Some of the transformations made by this command are not idempotent, so re-running against the same module may change the meanings expressions in the module.]'
|
||||
}
|
||||
|
||||
__013upgrade() {
|
||||
_arguments \
|
||||
'-yes[Skip the initial introduction messages and interactive confirmation. This can be used to run this command in batch from a script.]'
|
||||
}
|
||||
|
||||
__apply() {
|
||||
_arguments \
|
||||
'-auto-approve[Skip interactive approval of plan before applying.]' \
|
||||
'-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
|
||||
'-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-input=[(true) Ask for input for variables if not directly set.]' \
|
||||
'-no-color[If specified, output wil be colorless.]' \
|
||||
'-parallelism=[(10) Limit the number of parallel resource operations.]' \
|
||||
'-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]' \
|
||||
'-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \
|
||||
'*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
|
||||
'*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
|
||||
'*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
|
||||
}
|
||||
|
||||
__console() {
|
||||
_arguments \
|
||||
'-state=[(terraform.tfstate) Path to read state.]' \
|
||||
'*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
|
||||
'*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
|
||||
}
|
||||
|
||||
__destroy() {
|
||||
_arguments \
|
||||
'-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
|
||||
'-auto-approve[Skip interactive approval before destroying.]' \
|
||||
'-force[Deprecated: same as auto-approve.]' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-no-color[If specified, output will contain no color.]' \
|
||||
'-parallelism=[(10) Limit the number of concurrent operations.]' \
|
||||
'-refresh=[(true) Update state prior to checking for differences. This has no effect if a plan file is given to apply.]' \
|
||||
'-state=[(terraform.tfstate) Path to read and save state (unless state-out is specified).]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \
|
||||
'*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
|
||||
'*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
|
||||
'*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
|
||||
}
|
||||
|
||||
__fmt() {
|
||||
_arguments \
|
||||
'-list=[(true) List files whose formatting differs (always false if using STDIN)]' \
|
||||
'-write=[(true) Write result to source file instead of STDOUT (always false if using STDIN or -check)]' \
|
||||
'-diff=[(false) Display diffs of formatting changes]' \
|
||||
'-check=[(false) Check if the input is formatted. Exit status will be 0 if all input is properly formatted and non-zero otherwise.]' \
|
||||
'-recursive=[(false) Also process files in subdirectories. By default, only the given directory (or current directory) is processed.]'
|
||||
}
|
||||
|
||||
__force_unlock() {
|
||||
_arguments \
|
||||
"-force[Don't ask for input for unlock confirmation.]"
|
||||
}
|
||||
|
||||
__get() {
|
||||
_arguments \
|
||||
'-update=[(false) If true, modules already downloaded will be checked for updates and updated if necessary.]' \
|
||||
'-no-color[Disable text coloring in the output.]'
|
||||
}
|
||||
|
||||
__graph() {
|
||||
_arguments \
|
||||
'-draw-cycles[Highlight any cycles in the graph with colored edges. This helps when diagnosing cycle errors.]' \
|
||||
'-type=[(plan) Type of graph to output. Can be: plan, plan-destroy, apply, validate, input, refresh.]'
|
||||
}
|
||||
|
||||
__import() {
|
||||
_arguments \
|
||||
'-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
|
||||
'-config=[(path) Path to a directory of Terraform configuration files to use to configure the provider. Defaults to pwd. If no config files are present, they must be provided via the input prompts or env vars.]' \
|
||||
'-allow-missing-config[Allow import when no resource configuration block exists.]' \
|
||||
'-input=[(true) Ask for input for variables if not directly set.]' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-no-color[If specified, output will contain no color.]' \
|
||||
'-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(PATH) Path to the destination state file to write to. If this is not specified, the source state file will be used. This can be a new or existing path.]:statefile:_files -g "*.tfstate"' \
|
||||
'*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times. This is only useful with the "-config" flag.]' \
|
||||
'*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
|
||||
}
|
||||
|
||||
__init() {
|
||||
_arguments \
|
||||
'-backend=[(true) Configure the backend for this configuration.]' \
|
||||
'-backend-config=[This can be either a path to an HCL file with key/value assignments (same format as terraform.tfvars) or a 'key=value' format. This is merged with what is in the configuration file. This can be specified multiple times. The backend type must be in the configuration itself.]' \
|
||||
'-force-copy[Suppress prompts about copying state data. This is equivalent to providing a "yes" to all confirmation prompts.]' \
|
||||
'-from-module=[(SOURCE) Copy the contents of the given module into the target directory before initialization.]' \
|
||||
'-get=[(true) Download any modules for this configuration.]' \
|
||||
'-get-plugins=[(true) Download any missing plugins for this configuration.]' \
|
||||
'-input=[(true) Ask for input if necessary. If false, will error if input was required.]' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-no-color[If specified, output will contain no color.]' \
|
||||
'-plugin-dir[Directory containing plugin binaries. This overrides all default search paths for plugins, and prevents the automatic installation of plugins. This flag can be used multiple times.]:plugin_dir:_files -/' \
|
||||
'-reconfigure[Reconfigure the backend, ignoring any saved configuration.]' \
|
||||
'-upgrade=[(false) If installing modules (-get) or plugins (-get-plugins), ignore previously-downloaded objects and install the latest version allowed within configured constraints.]' \
|
||||
'-verify-plugins=[(true) Verify the authenticity and integrity of automatically downloaded plugins.]'
|
||||
}
|
||||
|
||||
__login() {
|
||||
_arguments \
|
||||
|
||||
}
|
||||
|
||||
__logout() {
|
||||
_arguments \
|
||||
|
||||
}
|
||||
|
||||
__output() {
|
||||
_arguments \
|
||||
'-state=[(path) Path to the state file to read. Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
|
||||
'-no-color[If specified, output will contain no color.]' \
|
||||
'-json[If specified, machine readable output will be printed in JSON format]'
|
||||
}
|
||||
|
||||
__plan() {
|
||||
_arguments \
|
||||
'-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \
|
||||
'-destroy[If set, a plan will be generated to destroy all resources managed by the given configuration and state.]' \
|
||||
'-detailed-exitcode[() Return detailed exit codes when the command exits. This will change the meaning of exit codes to: 0 - Succeeded, diff is empty (no changes); 1 - Errored, 2 - Succeeded; there is a diff]' \
|
||||
'-input=[(true) Ask for input for variables if not directly set.]' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-no-color[() If specified, output will contain no color.]' \
|
||||
'-out=[(path) Write a plan file to the given path. This can be used as input to the "apply" command.]' \
|
||||
'-parallelism=[(10) Limit the number of concurrent operations.]' \
|
||||
'-refresh=[(true) Update state prior to checking for differences.]' \
|
||||
'-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default it will use the state "terraform.tfstate" if it exists.]:statefile:_files -g "*.tfstate"' \
|
||||
'*-target=[(resource) Resource to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
|
||||
'*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
|
||||
'*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
|
||||
}
|
||||
|
||||
__providers() {
|
||||
local -a __providers_cmds
|
||||
__providers_cmds=(
|
||||
'mirror:Mirrors the provider plugins needed for the current configuration'
|
||||
'schema:Prints the schemas of the providers used in the configuration'
|
||||
)
|
||||
_describe -t providers "providers commands" __providers_cmds
|
||||
|
||||
}
|
||||
|
||||
__providers_mirror() {
|
||||
_arguments \
|
||||
'-platform=[(os_arch) Choose which target platform to build a mirror for.]' \
|
||||
"*:target_dir:_files -/"
|
||||
}
|
||||
|
||||
__providers_schema() {
|
||||
_arguments \
|
||||
'-json[]' \
|
||||
'::'
|
||||
}
|
||||
|
||||
__refresh() {
|
||||
_arguments \
|
||||
'-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]::backupfile:_files -g "*.backup"' \
|
||||
'-compact-warnings[If Terraform produces any warnings that are not accompanied by errors, show them in a more compact form that includes only the summary messages.]' \
|
||||
'-input=[(true) Ask for input for variables if not directly set.]' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-no-color[If specified, output will not contain any color.]' \
|
||||
'-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(path) Path to write state to that is different than "-state". This can be used to preserve the old state.]:statefile:_files -g "*.tfstate"' \
|
||||
'*-target=[(resource) A Resource Address to target. Operation will be limited to this resource and its dependencies. This flag can be used multiple times.]:target:__statelist' \
|
||||
'*-var[("foo=bar") Set a variable in the Terraform configuration. This flag can be set multiple times.]' \
|
||||
'*-var-file=[(foo) Set variables in the Terraform configuration from a file. If "terraform.tfvars" or any ".auto.tfvars" files are present, they will be automatically loaded.]:file:_files -g "*.tfvars{,.json}"'
|
||||
}
|
||||
|
||||
__show() {
|
||||
_arguments \
|
||||
'-json[If specified, output the Terraform plan or state in a machine-readable form.]' \
|
||||
'-no-color[If specified, output will not contain any color.]'
|
||||
}
|
||||
|
||||
__state() {
|
||||
local -a __state_cmds
|
||||
__state_cmds=(
|
||||
'list:List resources in the state'
|
||||
'mv:Move an item in the state'
|
||||
'pull:Pull current state and output to stdout'
|
||||
'push:Update remote state from a local state file'
|
||||
'replace-provider:Replace provider for resources in the Terraform state'
|
||||
'rm:Remove instances from the state'
|
||||
'show:Show a resource in the state'
|
||||
)
|
||||
_describe -t state "state commands" __state_cmds
|
||||
}
|
||||
|
||||
__state_list() {
|
||||
_arguments \
|
||||
'-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default, Terraform will consult the state of the currently-selected workspace.]' \
|
||||
'-id=[(id) Filters the results to include only instances whose resource types have an attribute named id whose value equals the given id string.]' \
|
||||
"*:address:__statelist"
|
||||
}
|
||||
|
||||
__state_mv() {
|
||||
_arguments \
|
||||
"-dry-run[If set, prints out what would've been moved but doesn't actually move anything.]" \
|
||||
'-backup=[(PATH) Path where Terraform should write the backup for the original state. This can"t be disabled. If not set, Terraform will write it to the same path as the statefile with a ".backup" extension.]:backupfile:_files -g "*.backup"' \
|
||||
'-backup-out=[(PATH) Path where Terraform should write the backup for the destination state. This can"t be disabled. If not set, Terraform will write it to the same path as the destination state file with a backup extension. This only needs to be specified if -state-out is set to a different path than -state.]:backupfile:_files -g "*.backup"' \
|
||||
"-lock=[(true) Lock the state files when locking is supported.]:lock:(true false)" \
|
||||
"-lock-timeout=[(0s) Duration to retry a state lock.]" \
|
||||
'-state=[(path) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(path) Path to the destination state file to write to. If this isn"t specified, the source state file will be used. This can be a new or existing path.]:statefile:_files -g "*.tfstate"' \
|
||||
"::" \
|
||||
":source:__statelist" \
|
||||
":destination: "
|
||||
}
|
||||
|
||||
__state_push() {
|
||||
_arguments \
|
||||
"-force[Write the state even if lineages don't match or the remote serial is higher.]" \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
"-lock-timeout=[(0s) Duration to retry a state lock.]" \
|
||||
"::" \
|
||||
":destination:_files"
|
||||
}
|
||||
|
||||
__state_replace_provider() {
|
||||
_arguments \
|
||||
'-auto-approve[Skip interactive approval.]' \
|
||||
'-backup=[(PATH) Path where Terraform should write the backup for the state file. This can"t be disabled. If not set, Terraform will write it to the same path as the state file with a ".backup" extension.]:backupfile:_files -g "*.backup"' \
|
||||
"-lock=[(true) Lock the state files when locking is supported.]:lock:(true false)" \
|
||||
"-lock-timeout=[(0s) Duration to retry a state lock.]" \
|
||||
'-state=[(PATH) Path to the source state file. Defaults to the configured backend, or "terraform.tfstate"]:statefile:_files -g "*.tfstate"' \
|
||||
":from_provider_fqn:" \
|
||||
":to_provider_fqn:"
|
||||
}
|
||||
|
||||
__state_rm() {
|
||||
_arguments \
|
||||
"-dry-run[If set, prints out what would've been removed but doesn't actually remove anything.]" \
|
||||
'-backup=[(PATH) Path where Terraform should write the backup for the original state.]::backupfile:_files -g "*.backup"' \
|
||||
"-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)" \
|
||||
"-lock-timeout=[(0s) Duration to retry a state lock.]" \
|
||||
'-state=[(PATH) Path to the state file to update. Defaults to the current workspace state.]:statefile:_files -g "*.tfstate"' \
|
||||
"*:address:__statelist"
|
||||
}
|
||||
|
||||
|
||||
__state_show() {
|
||||
_arguments \
|
||||
'-state=[(statefile) Path to a Terraform state file to use to look up Terraform-managed resources. By default it will use the state "terraform.tfstate" if it exists.]:statefile:_files -g "*.tfstate"' \
|
||||
"*:address:__statelist"
|
||||
}
|
||||
|
||||
__statelist() {
|
||||
compadd $(terraform state list $opt_args[-state])
|
||||
}
|
||||
|
||||
__taint() {
|
||||
_arguments \
|
||||
'-allow-missing[If specified, the command will succeed (exit code 0) even if the resource is missing.]' \
|
||||
'-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-module=[(path) The module path where the resource lives. By default this will be root. Child modules can be specified by names. Ex. "consul" or "consul.vpc" (nested modules).]' \
|
||||
'-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"' \
|
||||
"*:address:__statelist"
|
||||
}
|
||||
|
||||
__untaint() {
|
||||
_arguments \
|
||||
'-allow-missing[If specified, the command will succeed (exit code 0) even if the resource is missing.]' \
|
||||
'-backup=[(path) Path to backup the existing state file before modifying. Defaults to the "-state-out" path with ".backup" extension. Set to "-" to disable backup.]:backupfile:_files -g "*.backup"' \
|
||||
'-lock=[(true) Lock the state file when locking is supported.]:lock:(true false)' \
|
||||
'-lock-timeout=[(0s) Duration to retry a state lock.]' \
|
||||
'-module=[(path) The module path where the resource lives. By default this will be root. Child modules can be specified by names. Ex. "consul" or "consul.vpc" (nested modules).]' \
|
||||
'-state=[(path) Path to read and save state (unless state-out is specified). Defaults to "terraform.tfstate".]:statefile:_files -g "*.tfstate"' \
|
||||
'-state-out=[(path) Path to write updated state file. By default, the "-state" path will be used.]:statefile:_files -g "*.tfstate"'
|
||||
}
|
||||
|
||||
__validate() {
|
||||
_arguments \
|
||||
'-no-color[If specified, output will not contain any color.]' \
|
||||
'-json[Produce output in a machine-readable JSON format, suitable for use in text editor integrations and other automated systems.]' \
|
||||
':dir:_files -/'
|
||||
}
|
||||
|
||||
__version() {
|
||||
_arguments \
|
||||
'-json[Output the version information as a JSON object.]'
|
||||
}
|
||||
|
||||
__workspace() {
|
||||
local -a __workspace_cmds
|
||||
__workspace_cmds=(
|
||||
'delete:Delete a workspace'
|
||||
'list:List Workspaces'
|
||||
'new:Create a new workspace'
|
||||
'select:Select a workspace'
|
||||
'show:Show the name of the current workspace'
|
||||
)
|
||||
_describe -t workspace "workspace commands" __workspace_cmds
|
||||
}
|
||||
|
||||
_arguments '*:: :->command'
|
||||
|
||||
if (( CURRENT == 1 )); then
|
||||
_describe -t commands "terraform command" _terraform_cmds
|
||||
return
|
||||
fi
|
||||
|
||||
local -a _command_args
|
||||
case "$words[1]" in
|
||||
0.12upgrade)
|
||||
__012upgrade ;;
|
||||
0.13upgrade)
|
||||
__013upgrade ;;
|
||||
apply)
|
||||
__apply ;;
|
||||
console)
|
||||
__console;;
|
||||
destroy)
|
||||
__destroy ;;
|
||||
fmt)
|
||||
__fmt;;
|
||||
force-unlock)
|
||||
__force_unlock;;
|
||||
get)
|
||||
__get ;;
|
||||
graph)
|
||||
__graph ;;
|
||||
import)
|
||||
__import;;
|
||||
init)
|
||||
__init ;;
|
||||
login)
|
||||
__login ;;
|
||||
logout)
|
||||
__logout ;;
|
||||
output)
|
||||
__output ;;
|
||||
plan)
|
||||
__plan ;;
|
||||
providers)
|
||||
test $CURRENT -lt 3 && __providers
|
||||
[[ $words[2] = "mirror" ]] && __providers_mirror
|
||||
[[ $words[2] = "schema" ]] && __providers_schema
|
||||
;;
|
||||
refresh)
|
||||
__refresh ;;
|
||||
show)
|
||||
__show ;;
|
||||
state)
|
||||
test $CURRENT -lt 3 && __state
|
||||
[[ $words[2] = "list" ]] && __state_list
|
||||
[[ $words[2] = "mv" ]] && __state_mv
|
||||
[[ $words[2] = "push" ]] && __state_push
|
||||
[[ $words[2] = "replace-provider" ]] && __state_replace_provider
|
||||
[[ $words[2] = "rm" ]] && __state_rm
|
||||
[[ $words[2] = "show" ]] && __state_show
|
||||
;;
|
||||
taint)
|
||||
__taint ;;
|
||||
untaint)
|
||||
__untaint ;;
|
||||
validate)
|
||||
__validate ;;
|
||||
version)
|
||||
__version ;;
|
||||
workspace)
|
||||
test $CURRENT -lt 3 && __workspace ;;
|
||||
esac
|
||||
|
|
@ -16,3 +16,8 @@ alias tfi='terraform init'
|
|||
alias tfo='terraform output'
|
||||
alias tfp='terraform plan'
|
||||
alias tfv='terraform validate'
|
||||
|
||||
if (( $+commands[terraform] )); then
|
||||
autoload -U +X bashcompinit && bashcompinit
|
||||
complete -o nospace -C terraform terraform
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -15,7 +15,7 @@ Commands that use `$APT` will use `apt` if installed or defer to `apt-get` other
|
|||
| Alias | Command | Description |
|
||||
|---------|--------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
|
||||
| age | `sudo $APT` | Run apt-get with sudo |
|
||||
| acs | `apt-cache search` | Search the apt-cache with the specified criteria |
|
||||
| acse | `apt-cache search` | Search the apt-cache with the specified criteria |
|
||||
| acsp | `apt-cache showpkg` | Shows information about the listed packages |
|
||||
| acp | `apt-cache policy` | Display the package source priorities |
|
||||
| afs | `apt-file search --regexp` | Perform a regular expression apt-file search |
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
(( $+commands[apt] )) && APT=apt || APT=apt-get
|
||||
|
||||
alias acs='apt-cache search'
|
||||
alias acse='apt-cache search'
|
||||
|
||||
alias afs='apt-file search --regexp'
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
# wd
|
||||
|
||||
[](https://travis-ci.org/mfaerevaag/wd)
|
||||
[](https://github.com/mfaerevaag/wd/actions)
|
||||
|
||||
`wd` (*warp directory*) lets you jump to custom directories in zsh, without using `cd`.
|
||||
Why?
|
||||
Because `cd` seems inefficient when the folder is frequently visited or has a long path.
|
||||
|
||||

|
||||

|
||||
|
||||
## Setup
|
||||
|
||||
|
|
@ -36,6 +36,10 @@ In your `.zshrc`:
|
|||
antibody bundle mfaerevaag/wd
|
||||
```
|
||||
|
||||
### [Fig](https://fig.io)
|
||||
|
||||
Install `wd` here: [](https://fig.io/plugins/other/wd_mfaerevaag)
|
||||
|
||||
### Arch ([AUR](https://aur.archlinux.org/packages/zsh-plugin-wd-git/))
|
||||
|
||||
1. Install from the AUR
|
||||
|
|
|
|||
|
|
@ -163,6 +163,7 @@ wd_add()
|
|||
{
|
||||
local point=$1
|
||||
local force=$2
|
||||
cmdnames=(add rm show list ls path clean help)
|
||||
|
||||
if [[ $point == "" ]]
|
||||
then
|
||||
|
|
@ -178,6 +179,9 @@ wd_add()
|
|||
elif [[ $point =~ : ]] || [[ $point =~ / ]]
|
||||
then
|
||||
wd_exit_fail "Warp point contains illegal character (:/)"
|
||||
elif (($cmdnames[(Ie)$point]))
|
||||
then
|
||||
wd_exit_fail "Warp point name cannot be a wd command (see wd -h for a full list)"
|
||||
elif [[ ${points[$point]} == "" ]] || [ ! -z "$force" ]
|
||||
then
|
||||
wd_remove "$point" > /dev/null
|
||||
|
|
@ -185,7 +189,7 @@ wd_add()
|
|||
if (whence sort >/dev/null); then
|
||||
local config_tmp=$(mktemp "${TMPDIR:-/tmp}/wd.XXXXXXXXXX")
|
||||
# use 'cat' below to ensure we respect $WD_CONFIG as a symlink
|
||||
command sort -o "${config_tmp}" "$WD_CONFIG" && command cat "${config_tmp}" > "$WD_CONFIG" && command rm "${config_tmp}"
|
||||
command sort -o "${config_tmp}" "$WD_CONFIG" && command cat "${config_tmp}" >| "$WD_CONFIG" && command rm "${config_tmp}"
|
||||
fi
|
||||
|
||||
wd_export_static_named_directories
|
||||
|
|
@ -214,7 +218,7 @@ wd_remove()
|
|||
then
|
||||
local config_tmp=$(mktemp "${TMPDIR:-/tmp}/wd.XXXXXXXXXX")
|
||||
# Copy and delete in two steps in order to preserve symlinks
|
||||
if sed -n "/^${point_name}:.*$/!p" "$WD_CONFIG" > "$config_tmp" && command cp "$config_tmp" "$WD_CONFIG" && command rm "$config_tmp"
|
||||
if sed -n "/^${point_name}:.*$/!p" "$WD_CONFIG" >| "$config_tmp" && command cp "$config_tmp" "$WD_CONFIG" && command rm "$config_tmp"
|
||||
then
|
||||
wd_print_msg "$WD_GREEN" "Warp point removed"
|
||||
else
|
||||
|
|
@ -251,7 +255,7 @@ wd_list_all()
|
|||
then
|
||||
arr=(${(s,:,)line})
|
||||
key=${arr[1]}
|
||||
val=${arr[2]}
|
||||
val=${line#"${arr[1]}:"}
|
||||
|
||||
if [[ -z $wd_quiet_mode ]]
|
||||
then
|
||||
|
|
@ -389,6 +393,11 @@ else
|
|||
wd_export_static_named_directories
|
||||
fi
|
||||
|
||||
# disable extendedglob for the complete wd execution time
|
||||
setopt | grep -q extendedglob
|
||||
wd_extglob_is_set=$?
|
||||
[[ $wd_extglob_is_set ]] && setopt noextendedglob
|
||||
|
||||
# load warp points
|
||||
typeset -A points
|
||||
while read -r line
|
||||
|
|
@ -475,6 +484,9 @@ fi
|
|||
# if not, next time warp will pick up variables from this run
|
||||
# remember, there's no sub shell
|
||||
|
||||
[[ $wd_extglob_is_set ]] && setopt extendedglob
|
||||
|
||||
unset wd_extglob_is_set
|
||||
unset wd_warp
|
||||
unset wd_add
|
||||
unset wd_remove
|
||||
|
|
|
|||
|
|
@ -25,9 +25,10 @@ $ google oh-my-zsh
|
|||
Available search contexts are:
|
||||
|
||||
| Context | URL |
|
||||
|-----------------------|------------------------------------------|
|
||||
| --------------------- | ---------------------------------------- |
|
||||
| `bing` | `https://www.bing.com/search?q=` |
|
||||
| `google` | `https://www.google.com/search?q=` |
|
||||
| `brs` or `brave` | `https://search.brave.com/search?q=` |
|
||||
| `yahoo` | `https://search.yahoo.com/search?p=` |
|
||||
| `ddg` or `duckduckgo` | `https://www.duckduckgo.com/?q=` |
|
||||
| `sp` or `startpage` | `https://www.startpage.com/do/search?q=` |
|
||||
|
|
@ -42,6 +43,7 @@ Available search contexts are:
|
|||
| `wolframalpha` | `https://wolframalpha.com/input?i=` |
|
||||
| `archive` | `https://web.archive.org/web/*/` |
|
||||
| `scholar` | `https://scholar.google.com/scholar?q=` |
|
||||
| `ask` | `https://www.ask.com/web?q=` |
|
||||
|
||||
Also there are aliases for bang-searching DuckDuckGo:
|
||||
|
||||
|
|
|
|||
|
|
@ -7,22 +7,24 @@ function web_search() {
|
|||
typeset -A urls
|
||||
urls=(
|
||||
$ZSH_WEB_SEARCH_ENGINES
|
||||
google "https://www.google.com/search?q="
|
||||
bing "https://www.bing.com/search?q="
|
||||
yahoo "https://search.yahoo.com/search?p="
|
||||
duckduckgo "https://www.duckduckgo.com/?q="
|
||||
startpage "https://www.startpage.com/do/search?q="
|
||||
yandex "https://yandex.ru/yandsearch?text="
|
||||
github "https://github.com/search?q="
|
||||
baidu "https://www.baidu.com/s?wd="
|
||||
ecosia "https://www.ecosia.org/search?q="
|
||||
goodreads "https://www.goodreads.com/search?q="
|
||||
qwant "https://www.qwant.com/?q="
|
||||
givero "https://www.givero.com/search?q="
|
||||
stackoverflow "https://stackoverflow.com/search?q="
|
||||
wolframalpha "https://www.wolframalpha.com/input/?i="
|
||||
archive "https://web.archive.org/web/*/"
|
||||
scholar "https://scholar.google.com/scholar?q="
|
||||
google "https://www.google.com/search?q="
|
||||
bing "https://www.bing.com/search?q="
|
||||
brave "https://search.brave.com/search?q="
|
||||
yahoo "https://search.yahoo.com/search?p="
|
||||
duckduckgo "https://www.duckduckgo.com/?q="
|
||||
startpage "https://www.startpage.com/do/search?q="
|
||||
yandex "https://yandex.ru/yandsearch?text="
|
||||
github "https://github.com/search?q="
|
||||
baidu "https://www.baidu.com/s?wd="
|
||||
ecosia "https://www.ecosia.org/search?q="
|
||||
goodreads "https://www.goodreads.com/search?q="
|
||||
qwant "https://www.qwant.com/?q="
|
||||
givero "https://www.givero.com/search?q="
|
||||
stackoverflow "https://stackoverflow.com/search?q="
|
||||
wolframalpha "https://www.wolframalpha.com/input/?i="
|
||||
archive "https://web.archive.org/web/*/"
|
||||
scholar "https://scholar.google.com/scholar?q="
|
||||
ask "https://www.ask.com/web?q="
|
||||
)
|
||||
|
||||
# check whether the search engine is supported
|
||||
|
|
@ -47,6 +49,7 @@ function web_search() {
|
|||
|
||||
|
||||
alias bing='web_search bing'
|
||||
alias brs='web_search brave'
|
||||
alias google='web_search google'
|
||||
alias yahoo='web_search yahoo'
|
||||
alias ddg='web_search duckduckgo'
|
||||
|
|
@ -62,6 +65,7 @@ alias stackoverflow='web_search stackoverflow'
|
|||
alias wolframalpha='web_search wolframalpha'
|
||||
alias archive='web_search archive'
|
||||
alias scholar='web_search scholar'
|
||||
alias ask='web_search ask'
|
||||
|
||||
#add your own !bang searches here
|
||||
alias wiki='web_search duckduckgo \!w'
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ function xx {
|
|||
open -a "Xcode.app" "$@"
|
||||
}
|
||||
|
||||
# "XCode-SELect by Version" - select Xcode by just version number
|
||||
# "Xcode-Select by Version" - select Xcode by just version number
|
||||
# Uses naming convention:
|
||||
# - different versions of Xcode are named Xcode-<version>.app or stored
|
||||
# in a folder named Xcode-<version>
|
||||
|
|
|
|||
21
plugins/z/LICENSE
Normal file
21
plugins/z/LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2018-2022 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
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
343
plugins/z/MANUAL.md
Normal file
343
plugins/z/MANUAL.md
Normal file
|
|
@ -0,0 +1,343 @@
|
|||
# Zsh-z
|
||||
|
||||
Zsh-z is a command line tool that allows you to jump quickly to directories that you have visited frequently in the past, or recently -- but most often a combination of the two (a concept known as ["frecency"](https://en.wikipedia.org/wiki/Frecency)). It works by keeping track of when you go to directories and how much time you spend in them. It is then in the position to guess where you want to go when you type a partial string, e.g., `z src` might take you to `~/src/zsh`. `z zsh` might also get you there, and `z c/z` might prove to be even more specific -- it all depends on your habits and how much time you have been using Zsh-z to build up a database. After using Zsh-z for a little while, you will get to where you want to be by typing considerably less than you would need if you were using `cd`.
|
||||
|
||||
Zsh-z is a native Zsh port of [rupa/z](https://github.com/rupa/z), a tool written for `bash` and Zsh that uses embedded `awk` scripts to do the heavy lifting. It was quite possibly my most used command line tool for a couple of years. I decided to translate it, `awk` parts and all, into pure Zsh script, to see if by eliminating calls to external tools (`awk`, `sort`, `date`, `sed`, `mv`, `rm`, and `chown`) and reducing forking through subshells I could make it faster. The performance increase is impressive, particularly on systems where forking is slow, such as Cygwin, MSYS2, and WSL. I have found that, in those environments, switching directories using Zsh-z can be over 100% faster than it is using `rupa/z`.
|
||||
|
||||
There is a noteworthy stability increase as well. Race conditions have always been a problem with `rupa/z`, and users of that utility will occasionally lose their `.z` databases. By having Zsh-z only use Zsh (`rupa/z` uses a hybrid shell code that works on `bash` as well), I have been able to implement a `zsh/system`-based file-locking mechanism similar to [the one @mafredri once proposed for `rupa/z`](https://github.com/rupa/z/pull/199). It is now nearly impossible to crash the database, even through extreme testing.
|
||||
|
||||
There are other, smaller improvements which I try to document in [Improvements and Fixes](#improvements-and-fixes). These include the new default behavior of sorting your tab completions by frecency rather than just letting Zsh sort the raw results alphabetically (a behavior which can be restored if you like it -- [see below](#settings)).
|
||||
|
||||
Zsh-z is a drop-in replacement for `rupa/z` and will, by default, use the same database (`~/.z`), so you can go on using `rupa/z` when you launch `bash`.
|
||||
|
||||
## Table of Contents
|
||||
- [News](#news)
|
||||
- [Installation](#installation)
|
||||
- [Command Line Options](#command-line-options)
|
||||
- [Settings](#settings)
|
||||
- [Case Sensitivity](#case-sensitivity)
|
||||
- [`ZSHZ_UNCOMMON`](#zshz_uncommon)
|
||||
- [Making `--add` work for you](#making---add-work-for-you)
|
||||
- [Other Improvements and Fixes](#other-improvements-and-fixes)
|
||||
- [Migrating from Other Tools](#migrating-from-other-tools)
|
||||
- [`COMPLETE_ALIASES`](#complete_aliases)
|
||||
- [Known Bugs](#known-bugs)
|
||||
|
||||
## News
|
||||
|
||||
<details>
|
||||
<summary>Here are the latest features and updates.</summary>
|
||||
|
||||
- June 29, 2022
|
||||
+ Zsh-z is less likely to leave temporary files sitting around (props @mafredri).
|
||||
- June 27, 2022
|
||||
+ A bug was fixed which was preventing paths with spaces in them from being updated ([#61](https://github.com/agkozak/zsh-z/issues/61)).
|
||||
+ If writing to the temporary database file fails, the database will not be clobbered (props @mafredri).
|
||||
- December 19, 2021
|
||||
+ ZSH-z will now display tildes for `HOME` during completion when `ZSHZ_TILDE=1` has been set.
|
||||
- November 11, 2021
|
||||
+ A bug was fixed which was preventing ranks from being incremented.
|
||||
+ `--add` has been made to work with relative paths and has been documented for the user.
|
||||
- October 14, 2021
|
||||
+ Completions were being sorted alphabetically, rather than by rank; this error has been fixed.
|
||||
- September 25, 2021
|
||||
+ Orthographical change: "Zsh," not "ZSH."
|
||||
- September 23, 2021
|
||||
+ `z -xR` will now remove a directory *and its subdirectories* from the database.
|
||||
+ `z -x` and `z -xR` can now take an argument; without one, `PWD` is assumed.
|
||||
- September 7, 2021
|
||||
+ Fixed the unload function so that it removes the `$ZSHZ_CMD` alias (default: `z`).
|
||||
- August 27, 2021
|
||||
+ Using `print -v ... -f` instead of `print -v` to work around longstanding bug in Zsh involving `print -v` and multibyte strings.
|
||||
- August 13, 2021
|
||||
+ Fixed the explanation string printed during completion so that it may be formatted with `zstyle`.
|
||||
+ Zsh-z now declares `ZSHZ_EXCLUDE_DIRS` as an array with unique elements so that you do not have to.
|
||||
- July 29, 2021
|
||||
+ Temporarily disabling use of `print -v`, which seems to be mangling CJK multibyte strings.
|
||||
- July 27, 2021
|
||||
+ Internal escaping of path names now works with older versions of ZSH.
|
||||
+ Zsh-z now detects and discards any incomplete or incorrectly formattted database entries.
|
||||
- July 10, 2021
|
||||
+ Setting `ZSHZ_TRAILING_SLASH=1` makes it so that a search pattern ending in `/` can match the end of a path; e.g. `z foo/` can match `/path/to/foo`.
|
||||
- June 25, 2021
|
||||
+ Setting `ZSHZ_TILDE=1` displays the `HOME` directory as `~`.
|
||||
- May 7, 2021
|
||||
+ Setting `ZSHZ_ECHO=1` will cause Zsh-z to display the new path when you change directories.
|
||||
+ Better escaping of path names to deal paths containing the characters ``\`()[]``.
|
||||
- February 15, 2021
|
||||
+ Ranks are displayed the way `rupa/z` now displays them, i.e. as large integers. This should help Zsh-z to integrate with other tools.
|
||||
- January 31, 2021
|
||||
+ Zsh-z is now efficient enough that, on MSYS2 and Cygwin, it is faster to run it in the foreground than it is to fork a subshell for it.
|
||||
+ `_zshz_precmd` simply returns if `PWD` is `HOME` or in `ZSH_EXCLUDE_DIRS`, rather than waiting for `zshz` to do that.
|
||||
- January 17, 2021
|
||||
+ Made sure that the `PUSHD_IGNORE_DUPS` option is respected.
|
||||
- January 14, 2021
|
||||
+ The `z -h` help text now breaks at spaces.
|
||||
+ `z -l` was not working for Zsh version < 5.
|
||||
- January 11, 2021
|
||||
+ Major refactoring of the code.
|
||||
+ `z -lr` and `z -lt` work as expected.
|
||||
+ `EXTENDED_GLOB` has been disabled within the plugin to accomodate old-fashioned Windows directories with names such as `Progra~1`.
|
||||
+ Removed `zshelldoc` documentation.
|
||||
- January 6, 2021
|
||||
+ I have corrected the frecency routine so that it matches `rupa/z`'s math, but for the present, Zsh-z will continue to display ranks as 1/10000th of what they are in `rupa/z` -- [they had to multiply theirs by 10000](https://github.com/rupa/z/commit/f1f113d9bae9effaef6b1e15853b5eeb445e0712) to work around `bash`'s inadequacies at dealing with decimal fractions.
|
||||
- January 5, 2021
|
||||
+ If you try `z foo`, and `foo` is not in the database but `${PWD}/foo` is a valid directory, Zsh-z will `cd` to it.
|
||||
- December 22, 2020
|
||||
+ `ZSHZ_CASE`: when set to `ignore`, pattern matching is case-insensitive; when set to `smart`, patterns are matched case-insensitively when they are all lowercase and case-sensitively when they have uppercase characters in them (a behavior very much like Vim's `smartcase` setting).
|
||||
+ `ZSHZ_KEEP_DIRS` is an array of directory names that should not be removed from the database, even if they are not currently available (useful when a drive is not always mounted).
|
||||
+ Symlinked datafiles were having their symlinks overwritten; this bug has been fixed.
|
||||
|
||||
</details>
|
||||
|
||||
## Installation
|
||||
|
||||
### General observations
|
||||
|
||||
This script can be installed simply by downloading it and sourcing it from your `.zshrc`:
|
||||
|
||||
source /path/to/zsh-z.plugin.zsh
|
||||
|
||||
For tab completion to work, you will want to have loaded `compinit`. The frameworks handle this themselves. If you are not using a framework, put
|
||||
|
||||
autoload -U compinit && compinit
|
||||
|
||||
in your .zshrc somewhere below where you source `zsh-z.plugin.zsh`.
|
||||
|
||||
If you add
|
||||
|
||||
zstyle ':completion:*' menu select
|
||||
|
||||
to your `.zshrc`, your completion menus will look very nice. This `zstyle` invocation should work with any of the frameworks below as well.
|
||||
|
||||
### For [antigen](https://github.com/zsh-users/antigen) users
|
||||
|
||||
Add the line
|
||||
|
||||
antigen bundle agkozak/zsh-z
|
||||
|
||||
to your `.zshrc`, somewhere above the line that says `antigen apply`.
|
||||
|
||||
### For [oh-my-zsh](http://ohmyz.sh/) users
|
||||
|
||||
Execute the following command:
|
||||
|
||||
git clone https://github.com/agkozak/zsh-z ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-z
|
||||
|
||||
and add `zsh-z` to the line of your `.zshrc` that specifies `plugins=()`, e.g., `plugins=( git zsh-z )`.
|
||||
|
||||
### For [prezto](https://github.com/sorin-ionescu/prezto) users
|
||||
|
||||
Execute the following command:
|
||||
|
||||
git clone https://github.com/agkozak/zsh-z.git ~/.zprezto-contrib/zsh-z
|
||||
|
||||
Then edit your `~/.zpreztorc` file. Make sure the line that says
|
||||
|
||||
zstyle ':prezto:load' pmodule-dirs $HOME/.zprezto-contrib
|
||||
|
||||
is uncommented. Then find the section that specifies which modules are to be loaded; it should look something like this:
|
||||
|
||||
zstyle ':prezto:load' pmodule \
|
||||
'environment' \
|
||||
'terminal' \
|
||||
'editor' \
|
||||
'history' \
|
||||
'directory' \
|
||||
'spectrum' \
|
||||
'utility' \
|
||||
'completion' \
|
||||
'prompt'
|
||||
|
||||
Add a backslash to the end of the last line add `'zsh-z'` to the list, e.g.,
|
||||
|
||||
zstyle ':prezto:load' pmodule \
|
||||
'environment' \
|
||||
'terminal' \
|
||||
'editor' \
|
||||
'history' \
|
||||
'directory' \
|
||||
'spectrum' \
|
||||
'utility' \
|
||||
'completion' \
|
||||
'prompt' \
|
||||
'zsh-z'
|
||||
|
||||
Then relaunch `zsh`.
|
||||
|
||||
### For [zcomet](https://github.com/agkozak/zcomet) users
|
||||
|
||||
Simply add
|
||||
|
||||
zcomet load agkozak/zsh-z
|
||||
|
||||
to your `.zshrc` (below where you source `zcomet.zsh` and above where you run `zcomet compinit`).
|
||||
|
||||
### For [zgen](https://github.com/tarjoilija/zgen) users
|
||||
|
||||
Add the line
|
||||
|
||||
zgen load agkozak/zsh-z
|
||||
|
||||
somewhere above the line that says `zgen save`. Then run
|
||||
|
||||
zgen reset
|
||||
zsh
|
||||
|
||||
to refresh your init script.
|
||||
|
||||
### For [Zim](https://github.com/zimfw/zimfw)
|
||||
|
||||
Add the following line to your `.zimrc`:
|
||||
|
||||
zmodule https://github.com/agkozak/zsh-z
|
||||
|
||||
Then run
|
||||
|
||||
zimfw install
|
||||
|
||||
and restart your shell.
|
||||
|
||||
### For [Zinit](https://github.com/zdharma-continuum/zinit) users
|
||||
|
||||
Add the line
|
||||
|
||||
zinit load agkozak/zsh-z
|
||||
|
||||
to your `.zshrc`.
|
||||
|
||||
`zsh-z` supports `zinit`'s `unload` feature; just run `zinit unload agkozak/zshz` to restore the shell to its state before `zsh-z` was loaded.
|
||||
|
||||
### For [Znap](https://github.com/marlonrichert/zsh-snap) users
|
||||
|
||||
Add the line
|
||||
|
||||
znap source agkozak/zsh-z
|
||||
|
||||
somewhere below the line where you `source` Znap itself.
|
||||
|
||||
### For [zplug](https://github.com/zplug/zplug) users
|
||||
|
||||
Add the line
|
||||
|
||||
zplug "agkozak/zsh-z"
|
||||
|
||||
somewhere above the line that says `zplug load`. Then run
|
||||
|
||||
zplug install
|
||||
zplug load
|
||||
|
||||
to install `zsh-z`.
|
||||
|
||||
## Command Line Options
|
||||
|
||||
- `--add` Add a directory to the database
|
||||
- `-c` Only match subdirectories of the current directory
|
||||
- `-e` Echo the best match without going to it
|
||||
- `-h` Display help
|
||||
- `-l` List all matches without going to them
|
||||
- `-r` Match by rank (i.e. how much time you spend in directories)
|
||||
- `-t` Time -- match by how recently you have been to directories
|
||||
- `-x` Remove a directory (by default, the current directory) from the database
|
||||
- `-xR` Remove a directory (by default, the current directory) and its subdirectories from the database
|
||||
|
||||
# Settings
|
||||
|
||||
Zsh-z has environment variables (they all begin with `ZSHZ_`) that change its behavior if you set them; you can also keep your old ones if you have been using `rupa/z` (they begin with `_Z_`).
|
||||
|
||||
* `ZSHZ_CMD` changes the command name (default: `z`)
|
||||
* `ZSHZ_COMPLETION` can be `'frecent'` (default) or `'legacy'`, depending on whether you want your completion results sorted according to frecency or simply sorted alphabetically
|
||||
* `ZSHZ_DATA` changes the database file (default: `~/.z`)
|
||||
* `ZSHZ_ECHO` displays the new path name when changing directories (default: `0`)
|
||||
* `ZSHZ_EXCLUDE_DIRS` is an array of directories to keep out of the database (default: empty)
|
||||
* `ZSHZ_KEEP_DIRS` is an array of directories that should not be removed from the database, even if they are not currently available (useful when a drive is not always mounted) (default: empty)
|
||||
* `ZSHZ_MAX_SCORE` is the maximum combined score the database entries can have before they begin to age and potentially drop out of the database (default: 9000)
|
||||
* `ZSHZ_NO_RESOLVE_SYMLINKS` prevents symlink resolution (default: `0`)
|
||||
* `ZSHZ_OWNER` allows usage when in `sudo -s` mode (default: empty)
|
||||
* `ZSHZ_TILDE` displays the name of the `HOME` directory as a `~` (default: `0`)
|
||||
* `ZSHZ_TRAILING_SLASH` makes it so that a search pattern ending in `/` can match the final element in a path; e.g., `z foo/` can match `/path/to/foo` (default: `0`)
|
||||
* `ZSHZ_UNCOMMON` changes the logic used to calculate the directory jumped to; [see below](#zshz_uncommon`) (default: `0`)
|
||||
|
||||
## Case sensitivity
|
||||
|
||||
The default behavior of Zsh-z is to try to find a case-sensitive match. If there is none, then Zsh-z tries to find a case-insensitive match.
|
||||
|
||||
Some users prefer simple case-insensitivity; this behavior can be enabled by setting
|
||||
|
||||
ZSHZ_CASE=ignore
|
||||
|
||||
If you like Vim's `smartcase` setting, where lowercase patterns are case-insensitive while patterns with any uppercase characters are treated case-sensitively, try setting
|
||||
|
||||
ZSHZ_CASE=smart
|
||||
|
||||
## `ZSHZ_UNCOMMON`
|
||||
|
||||
A common complaint about the default behavior of `rupa/z` and Zsh-z involves "common prefixes." If you type `z code` and the best matches, in increasing order, are
|
||||
|
||||
/home/me/code/foo
|
||||
/home/me/code/bar
|
||||
/home/me/code/bat
|
||||
|
||||
Zsh-z will see that all possible matches share a common prefix and will send you to that directory -- `/home/me/code` -- which is often a desirable result. But if the possible matches are
|
||||
|
||||
/home/me/.vscode/foo
|
||||
/home/me/code/foo
|
||||
/home/me/code/bar
|
||||
/home/me/code/bat
|
||||
|
||||
then there is no common prefix. In this case, `z code` will simply send you to the highest-ranking match, `/home/me/code/bat`.
|
||||
|
||||
You may enable an alternate, experimental behavior by setting `ZSHZ_UNCOMMON=1`. If you do that, Zsh-z will not jump to a common prefix, even if one exists. Instead, it chooses the highest-ranking match -- but it drops any subdirectories that do not include the search term. So if you type `z bat` and `/home/me/code/bat` is the best match, that is exactly where you will end up. If, however, you had typed `z code` and the best match was also `/home/me/code/bat`, you would have ended up in `/home/me/code` (because `code` was what you had searched for). This feature is still in development, and feedback is welcome.
|
||||
|
||||
## Making `--add` Work for You
|
||||
|
||||
Zsh-z internally uses the `--add` option to add paths to its database. @zachriggle pointed out to me that users might want to use `--add` themselves, so I have altered it a little to make it more user-friendly.
|
||||
|
||||
A good example might involve a directory tree that has Git repositories within it. The working directories could be added to the Zsh-z database as a batch with
|
||||
|
||||
for i in $(find $PWD -maxdepth 3 -name .git -type d); do
|
||||
z --add ${i:h}
|
||||
done
|
||||
|
||||
(As a Zsh user, I tend to use `**` instead of `find`, but it is good to see how deep your directory trees go before doing that.)
|
||||
|
||||
|
||||
## Other Improvements and Fixes
|
||||
|
||||
* `z -x` works, with the help of `chpwd_functions`.
|
||||
* Zsh-z works on Solaris.
|
||||
* Zsh-z uses the "new" `zshcompsys` completion system instead of the old `compctl` one.
|
||||
* There is no error message when the database file has not yet been created.
|
||||
* There is support for special characters (e.g., `[`) in directory names.
|
||||
* If `z -l` only returns one match, a common root is not printed.
|
||||
* Exit status codes increasingly make sense.
|
||||
* Completions work with options `-c`, `-r`, and `-t`.
|
||||
* If `~/foo` and `~/foob` are matches, `~/foo` is *not* the common root. Only a common parent directory can be a common root.
|
||||
* `z -x` and the new, recursive `z -xR` can take an argument so that you can remove directories other than `PWD` from the database.
|
||||
|
||||
## Migrating from Other Tools
|
||||
|
||||
Zsh-z's database format is identical to that of `rupa/z`. You may switch freely between the two tools (I still use `rupa/z` for `bash`). `fasd` also uses that database format, but it stores it by default in `~/.fasd`, so you will have to `cp ~/.fasd ~/.z` if you want to use your old directory history.
|
||||
|
||||
If you are coming to Zsh-z (or even to the original `rupa/z`, for that matter) from `autojump`, try using my [`jumpstart-z`](https://github.com/agkozak/jumpstart-z/blob/master/jumpstart-z) tool to convert your old database to the Zsh-z format, or simply run
|
||||
|
||||
awk -F "\t" '{printf("%s|%0.f|%s\n", $2, $1, '"$(date +%s)"')}' < /path/to/autojump.txt > ~/.z
|
||||
|
||||
## `COMPLETE_ALIASES`
|
||||
|
||||
`z`, or any alternative you set up using `$ZSH_CMD` or `$_Z_CMD`, is an alias. `setopt COMPLETE_ALIASES` divorces the tab completion for aliases from the underlying commands they invoke, so if you enable `COMPLETE_ALIASES`, tab completion for Zsh-z will be broken. You can get it working again, however, by adding under
|
||||
|
||||
setopt COMPLETE_ALIASES
|
||||
|
||||
the line
|
||||
|
||||
compdef _zshz ${ZSHZ_CMD:-${_Z_CMD:-z}}
|
||||
|
||||
That will re-bind `z` or the command of your choice to the underlying Zsh-z function.
|
||||
|
||||
## Known Bugs
|
||||
It is possible to run a completion on a string with spaces in it, e.g., `z us bi<TAB>` might take you to `/usr/local/bin`. This works, but as things stand, after the completion the command line reads
|
||||
|
||||
z us /usr/local/bin.
|
||||
|
||||
You get where you want to go, but the detritus on the command line is annoying. This is also a problem in `rupa/z`, but I am keen on eventually eliminating this glitch. Advice is welcome.
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
readme:
|
||||
@groff -man -Tascii z.1 | col -bx
|
||||
|
||||
.PHONY: readme
|
||||
148
plugins/z/README
148
plugins/z/README
|
|
@ -1,148 +0,0 @@
|
|||
Z(1) User Commands Z(1)
|
||||
|
||||
|
||||
|
||||
NAME
|
||||
z - jump around
|
||||
|
||||
SYNOPSIS
|
||||
z [-chlrtx] [regex1 regex2 ... regexn]
|
||||
|
||||
AVAILABILITY
|
||||
bash, zsh
|
||||
|
||||
DESCRIPTION
|
||||
Tracks your most used directories, based on 'frecency'.
|
||||
|
||||
After a short learning phase, z will take you to the most 'frecent'
|
||||
directory that matches ALL of the regexes given on the command line, in
|
||||
order.
|
||||
|
||||
For example, z foo bar would match /foo/bar but not /bar/foo.
|
||||
|
||||
OPTIONS
|
||||
-c restrict matches to subdirectories of the current directory
|
||||
|
||||
-e echo the best match, don't cd
|
||||
|
||||
-h show a brief help message
|
||||
|
||||
-l list only
|
||||
|
||||
-r match by rank only
|
||||
|
||||
-t match by recent access only
|
||||
|
||||
-x remove the current directory from the datafile
|
||||
|
||||
EXAMPLES
|
||||
z foo cd to most frecent dir matching foo
|
||||
|
||||
z foo bar cd to most frecent dir matching foo, then bar
|
||||
|
||||
z -r foo cd to highest ranked dir matching foo
|
||||
|
||||
z -t foo cd to most recently accessed dir matching foo
|
||||
|
||||
z -l foo list all dirs matching foo (by frecency)
|
||||
|
||||
NOTES
|
||||
Installation:
|
||||
Put something like this in your $HOME/.bashrc or $HOME/.zshrc:
|
||||
|
||||
. /path/to/z.sh
|
||||
|
||||
cd around for a while to build up the db.
|
||||
|
||||
PROFIT!!
|
||||
|
||||
Optionally:
|
||||
Set $_Z_CMD to change the command name (default z).
|
||||
Set $_Z_DATA to change the datafile (default $HOME/.z).
|
||||
Set $_Z_MAX_SCORE lower to age entries out faster (default
|
||||
9000).
|
||||
Set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
|
||||
Set $_Z_NO_PROMPT_COMMAND to handle PROMPT_COMMAND/precmd your-
|
||||
self.
|
||||
Set $_Z_EXCLUDE_DIRS to an array of directory trees to exclude.
|
||||
Set $_Z_OWNER to allow usage when in 'sudo -s' mode.
|
||||
(These settings should go in .bashrc/.zshrc before the line
|
||||
added above.)
|
||||
Install the provided man page z.1 somewhere in your MANPATH,
|
||||
like /usr/local/man/man1.
|
||||
|
||||
Aging:
|
||||
The rank of directories maintained by z undergoes aging based on a sim-
|
||||
ple formula. The rank of each entry is incremented every time it is
|
||||
accessed. When the sum of ranks is over 9000, all ranks are multiplied
|
||||
by 0.99. Entries with a rank lower than 1 are forgotten.
|
||||
|
||||
Frecency:
|
||||
Frecency is a portmanteau of 'recent' and 'frequency'. It is a weighted
|
||||
rank that depends on how often and how recently something occurred. As
|
||||
far as I know, Mozilla came up with the term.
|
||||
|
||||
To z, a directory that has low ranking but has been accessed recently
|
||||
will quickly have higher rank than a directory accessed frequently a
|
||||
long time ago.
|
||||
|
||||
Frecency is determined at runtime.
|
||||
|
||||
Common:
|
||||
When multiple directories match all queries, and they all have a common
|
||||
prefix, z will cd to the shortest matching directory, without regard to
|
||||
priority. This has been in effect, if undocumented, for quite some
|
||||
time, but should probably be configurable or reconsidered.
|
||||
|
||||
Tab Completion:
|
||||
z supports tab completion. After any number of arguments, press TAB to
|
||||
complete on directories that match each argument. Due to limitations of
|
||||
the completion implementations, only the last argument will be com-
|
||||
pleted in the shell.
|
||||
|
||||
Internally, z decides you've requested a completion if the last argu-
|
||||
ment passed is an absolute path to an existing directory. This may
|
||||
cause unexpected behavior if the last argument to z begins with /.
|
||||
|
||||
ENVIRONMENT
|
||||
A function _z() is defined.
|
||||
|
||||
The contents of the variable $_Z_CMD is aliased to _z 2>&1. If not set,
|
||||
$_Z_CMD defaults to z.
|
||||
|
||||
The environment variable $_Z_DATA can be used to control the datafile
|
||||
location. If it is not defined, the location defaults to $HOME/.z.
|
||||
|
||||
The environment variable $_Z_NO_RESOLVE_SYMLINKS can be set to prevent
|
||||
resolving of symlinks. If it is not set, symbolic links will be
|
||||
resolved when added to the datafile.
|
||||
|
||||
In bash, z appends a command to the PROMPT_COMMAND environment variable
|
||||
to maintain its database. In zsh, z appends a function _z_precmd to the
|
||||
precmd_functions array.
|
||||
|
||||
The environment variable $_Z_NO_PROMPT_COMMAND can be set if you want
|
||||
to handle PROMPT_COMMAND or precmd yourself.
|
||||
|
||||
The environment variable $_Z_EXCLUDE_DIRS can be set to an array of
|
||||
directory trees to exclude from tracking. $HOME is always excluded.
|
||||
Directories must be full paths without trailing slashes.
|
||||
|
||||
The environment variable $_Z_OWNER can be set to your username, to
|
||||
allow usage of z when your sudo environment keeps $HOME set.
|
||||
|
||||
FILES
|
||||
Data is stored in $HOME/.z. This can be overridden by setting the
|
||||
$_Z_DATA environment variable. When initialized, z will raise an error
|
||||
if this path is a directory, and not function correctly.
|
||||
|
||||
A man page (z.1) is provided.
|
||||
|
||||
SEE ALSO
|
||||
regex(7), pushd, popd, autojump, cdargs
|
||||
|
||||
Please file bugs at https://github.com/rupa/z/
|
||||
|
||||
|
||||
|
||||
z January 2013 Z(1)
|
||||
|
|
@ -1,8 +1,9 @@
|
|||
# z - jump around
|
||||
|
||||
This plugin defines the [z command](https://github.com/rupa/z) that tracks your most visited directories and allows you to access them with very few keystrokes.
|
||||
This plugin defines the [z command](https://github.com/agkozak/zsh-z) that tracks your most visited directories and allows you to access them with very few keystrokes.
|
||||
|
||||
### Example
|
||||
|
||||
Assume that you have previously visited directory `~/.oh-my-zsh/plugins`. From any folder in your command line, you can quickly access it by using a regex match to this folder:
|
||||
|
||||
```bash
|
||||
|
|
@ -11,6 +12,7 @@ Assume that you have previously visited directory `~/.oh-my-zsh/plugins`. From a
|
|||
```
|
||||
|
||||
### Setup
|
||||
|
||||
To enable z, add `z` to your `plugins` array in your zshrc file:
|
||||
|
||||
```zsh
|
||||
|
|
@ -19,5 +21,4 @@ plugins=(... z)
|
|||
|
||||
### Further reading
|
||||
|
||||
For advanced usage and details of z, see [README](./README) (in man page format, copied from [rupa/z](https://github.com/rupa/z)).
|
||||
|
||||
For advanced usage and details of z, see [MANUAL](./MANUAL.md) (copied from [agkozak/zsh-z](https://github.com/agkozak/zsh-z)).
|
||||
|
|
|
|||
82
plugins/z/_z
Normal file
82
plugins/z/_z
Normal file
|
|
@ -0,0 +1,82 @@
|
|||
#compdef zshz ${ZSHZ_CMD:-${_Z_CMD:-z}}
|
||||
#
|
||||
# Zsh-z - jump around with Zsh - A native Zsh version of z without awk, sort,
|
||||
# date, or sed
|
||||
#
|
||||
# https://github.com/agkozak/zsh-z
|
||||
#
|
||||
# Copyright (c) 2018-2022 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
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
# z (https://github.com/rupa/z) is copyright (c) 2009 rupa deadwyler and
|
||||
# licensed under the WTFPL license, Version 2.a
|
||||
#
|
||||
# shellcheck shell=ksh
|
||||
|
||||
############################################################
|
||||
# Zsh-z COMPLETIONS
|
||||
############################################################
|
||||
emulate -L zsh
|
||||
(( ZSHZ_DEBUG )) &&
|
||||
setopt LOCAL_OPTIONS WARN_CREATE_GLOBAL NO_WARN_NESTED_VAR 2> /dev/null
|
||||
|
||||
# TODO: This routine currently reproduces z's feature of allowing spaces to be
|
||||
# used as wildcards in completions, so that
|
||||
#
|
||||
# z us lo bi
|
||||
#
|
||||
# can expand to
|
||||
#
|
||||
# z /usr/local/bin
|
||||
#
|
||||
# but it also reproduces z's buggy display on the commandline, viz.
|
||||
#
|
||||
# z us lo /usr/local/bin
|
||||
#
|
||||
# Address.
|
||||
|
||||
local completions expl completion
|
||||
local -a completion_list
|
||||
|
||||
completions=$(zshz --complete ${(@)words:1})
|
||||
[[ -z $completions ]] && return 1
|
||||
|
||||
for completion in ${(f)completions[@]}; do
|
||||
if (( ZSHZ_TILDE )) && [[ $completion == ${HOME}* ]]; then
|
||||
completion="~${(q)${completion#${HOME}}}"
|
||||
else
|
||||
completion="${(q)completion}"
|
||||
fi
|
||||
completion_list+=( $completion )
|
||||
done
|
||||
|
||||
_description -V completion_list expl 'directories'
|
||||
|
||||
if [[ $ZSHZ_COMPLETION == 'legacy' ]]; then
|
||||
compadd "${expl[@]}" -QU -- "${completion_list[@]}"
|
||||
else
|
||||
compadd "${expl[@]}" -QU -V zsh-z -- "${completion_list[@]}"
|
||||
fi
|
||||
|
||||
compstate[insert]=menu
|
||||
|
||||
return 0
|
||||
|
||||
# vim: ft=zsh:fdm=indent:ts=2:et:sts=2:sw=2:
|
||||
173
plugins/z/z.1
173
plugins/z/z.1
|
|
@ -1,173 +0,0 @@
|
|||
.TH "Z" "1" "January 2013" "z" "User Commands"
|
||||
.SH
|
||||
NAME
|
||||
z \- jump around
|
||||
.SH
|
||||
SYNOPSIS
|
||||
z [\-chlrtx] [regex1 regex2 ... regexn]
|
||||
.SH
|
||||
AVAILABILITY
|
||||
bash, zsh
|
||||
.SH
|
||||
DESCRIPTION
|
||||
Tracks your most used directories, based on 'frecency'.
|
||||
.P
|
||||
After a short learning phase, \fBz\fR will take you to the most 'frecent'
|
||||
directory that matches ALL of the regexes given on the command line, in order.
|
||||
|
||||
For example, \fBz foo bar\fR would match \fB/foo/bar\fR but not \fB/bar/foo\fR.
|
||||
.SH
|
||||
OPTIONS
|
||||
.TP
|
||||
\fB\-c\fR
|
||||
restrict matches to subdirectories of the current directory
|
||||
.TP
|
||||
\fB\-e\fR
|
||||
echo the best match, don't cd
|
||||
.TP
|
||||
\fB\-h\fR
|
||||
show a brief help message
|
||||
.TP
|
||||
\fB\-l\fR
|
||||
list only
|
||||
.TP
|
||||
\fB\-r\fR
|
||||
match by rank only
|
||||
.TP
|
||||
\fB\-t\fR
|
||||
match by recent access only
|
||||
.TP
|
||||
\fB\-x\fR
|
||||
remove the current directory from the datafile
|
||||
.SH EXAMPLES
|
||||
.TP 14
|
||||
\fBz foo\fR
|
||||
cd to most frecent dir matching foo
|
||||
.TP 14
|
||||
\fBz foo bar\fR
|
||||
cd to most frecent dir matching foo, then bar
|
||||
.TP 14
|
||||
\fBz -r foo\fR
|
||||
cd to highest ranked dir matching foo
|
||||
.TP 14
|
||||
\fBz -t foo\fR
|
||||
cd to most recently accessed dir matching foo
|
||||
.TP 14
|
||||
\fBz -l foo\fR
|
||||
list all dirs matching foo (by frecency)
|
||||
.SH
|
||||
NOTES
|
||||
.SS
|
||||
Installation:
|
||||
.P
|
||||
Put something like this in your \fB$HOME/.bashrc\fR or \fB$HOME/.zshrc\fR:
|
||||
.RS
|
||||
.P
|
||||
\fB. /path/to/z.sh\fR
|
||||
.RE
|
||||
.P
|
||||
\fBcd\fR around for a while to build up the db.
|
||||
.P
|
||||
PROFIT!!
|
||||
.P
|
||||
Optionally:
|
||||
.RS
|
||||
Set \fB$_Z_CMD\fR to change the command name (default \fBz\fR).
|
||||
.RE
|
||||
.RS
|
||||
Set \fB$_Z_DATA\fR to change the datafile (default \fB$HOME/.z\fR).
|
||||
.RE
|
||||
.RS
|
||||
Set \fB$_Z_MAX_SCORE\fR lower to age entries out faster (default \fB9000\fR).
|
||||
.RE
|
||||
.RS
|
||||
Set \fB$_Z_NO_RESOLVE_SYMLINKS\fR to prevent symlink resolution.
|
||||
.RE
|
||||
.RS
|
||||
Set \fB$_Z_NO_PROMPT_COMMAND\fR to handle \fBPROMPT_COMMAND/precmd\fR yourself.
|
||||
.RE
|
||||
.RS
|
||||
Set \fB$_Z_EXCLUDE_DIRS\fR to an array of directory trees to exclude.
|
||||
.RE
|
||||
.RS
|
||||
Set \fB$_Z_OWNER\fR to allow usage when in 'sudo -s' mode.
|
||||
.RE
|
||||
.RS
|
||||
(These settings should go in .bashrc/.zshrc before the line added above.)
|
||||
.RE
|
||||
.RS
|
||||
Install the provided man page \fBz.1\fR somewhere in your \f$MANPATH, like
|
||||
\fB/usr/local/man/man1\fR.
|
||||
.RE
|
||||
.SS
|
||||
Aging:
|
||||
The rank of directories maintained by \fBz\fR undergoes aging based on a simple
|
||||
formula. The rank of each entry is incremented every time it is accessed. When
|
||||
the sum of ranks is over 9000, all ranks are multiplied by 0.99. Entries with a
|
||||
rank lower than 1 are forgotten.
|
||||
.SS
|
||||
Frecency:
|
||||
Frecency is a portmanteau of 'recent' and 'frequency'. It is a weighted rank
|
||||
that depends on how often and how recently something occurred. As far as I
|
||||
know, Mozilla came up with the term.
|
||||
.P
|
||||
To \fBz\fR, a directory that has low ranking but has been accessed recently
|
||||
will quickly have higher rank than a directory accessed frequently a long time
|
||||
ago.
|
||||
.P
|
||||
Frecency is determined at runtime.
|
||||
.SS
|
||||
Common:
|
||||
When multiple directories match all queries, and they all have a common prefix,
|
||||
\fBz\fR will cd to the shortest matching directory, without regard to priority.
|
||||
This has been in effect, if undocumented, for quite some time, but should
|
||||
probably be configurable or reconsidered.
|
||||
.SS
|
||||
Tab Completion:
|
||||
\fBz\fR supports tab completion. After any number of arguments, press TAB to
|
||||
complete on directories that match each argument. Due to limitations of the
|
||||
completion implementations, only the last argument will be completed in the
|
||||
shell.
|
||||
.P
|
||||
Internally, \fBz\fR decides you've requested a completion if the last argument
|
||||
passed is an absolute path to an existing directory. This may cause unexpected
|
||||
behavior if the last argument to \fBz\fR begins with \fB/\fR.
|
||||
.SH
|
||||
ENVIRONMENT
|
||||
A function \fB_z()\fR is defined.
|
||||
.P
|
||||
The contents of the variable \fB$_Z_CMD\fR is aliased to \fB_z 2>&1\fR. If not
|
||||
set, \fB$_Z_CMD\fR defaults to \fBz\fR.
|
||||
.P
|
||||
The environment variable \fB$_Z_DATA\fR can be used to control the datafile
|
||||
location. If it is not defined, the location defaults to \fB$HOME/.z\fR.
|
||||
.P
|
||||
The environment variable \fB$_Z_NO_RESOLVE_SYMLINKS\fR can be set to prevent
|
||||
resolving of symlinks. If it is not set, symbolic links will be resolved when
|
||||
added to the datafile.
|
||||
.P
|
||||
In bash, \fBz\fR appends a command to the \fBPROMPT_COMMAND\fR environment
|
||||
variable to maintain its database. In zsh, \fBz\fR appends a function
|
||||
\fB_z_precmd\fR to the \fBprecmd_functions\fR array.
|
||||
.P
|
||||
The environment variable \fB$_Z_NO_PROMPT_COMMAND\fR can be set if you want to
|
||||
handle \fBPROMPT_COMMAND\fR or \fBprecmd\fR yourself.
|
||||
.P
|
||||
The environment variable \fB$_Z_EXCLUDE_DIRS\fR can be set to an array of
|
||||
directory trees to exclude from tracking. \fB$HOME\fR is always excluded.
|
||||
Directories must be full paths without trailing slashes.
|
||||
.P
|
||||
The environment variable \fB$_Z_OWNER\fR can be set to your username, to
|
||||
allow usage of \fBz\fR when your sudo environment keeps \fB$HOME\fR set.
|
||||
.SH
|
||||
FILES
|
||||
Data is stored in \fB$HOME/.z\fR. This can be overridden by setting the
|
||||
\fB$_Z_DATA\fR environment variable. When initialized, \fBz\fR will raise an
|
||||
error if this path is a directory, and not function correctly.
|
||||
.P
|
||||
A man page (\fBz.1\fR) is provided.
|
||||
.SH
|
||||
SEE ALSO
|
||||
regex(7), pushd, popd, autojump, cdargs
|
||||
.P
|
||||
Please file bugs at https://github.com/rupa/z/
|
||||
|
|
@ -1,6 +1,968 @@
|
|||
# Handle $0 according to the standard:
|
||||
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
|
||||
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
|
||||
0="${${(M)0:#/*}:-$PWD/$0}"
|
||||
################################################################################
|
||||
# Zsh-z - jump around with Zsh - A native Zsh version of z without awk, sort,
|
||||
# date, or sed
|
||||
#
|
||||
# https://github.com/agkozak/zsh-z
|
||||
#
|
||||
# Copyright (c) 2018-2022 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
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in all
|
||||
# copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
#
|
||||
# z (https://github.com/rupa/z) is copyright (c) 2009 rupa deadwyler and
|
||||
# licensed under the WTFPL license, Version 2.
|
||||
#
|
||||
# Zsh-z maintains a jump-list of the directories you actually use.
|
||||
#
|
||||
# INSTALL:
|
||||
# * put something like this in your .zshrc:
|
||||
# source /path/to/zsh-z.plugin.zsh
|
||||
# * cd around for a while to build up the database
|
||||
#
|
||||
# USAGE:
|
||||
# * z foo cd to the most frecent directory matching foo
|
||||
# * z foo bar cd to the most frecent directory matching both foo and bar
|
||||
# (e.g. /foo/bat/bar/quux)
|
||||
# * z -r foo cd to the highest ranked directory matching foo
|
||||
# * z -t foo cd to most recently accessed directory matching foo
|
||||
# * z -l foo List matches instead of changing directories
|
||||
# * z -e foo Echo the best match without changing directories
|
||||
# * z -c foo Restrict matches to subdirectories of PWD
|
||||
# * z -x Remove a directory (default: PWD) from the database
|
||||
# * z -xR Remove a directory (default: PWD) and its subdirectories from
|
||||
# the database
|
||||
#
|
||||
# ENVIRONMENT VARIABLES:
|
||||
#
|
||||
# ZSHZ_CASE -> if `ignore', pattern matching is case-insensitive; if `smart',
|
||||
# pattern matching is case-insensitive only when the pattern is all
|
||||
# lowercase
|
||||
# ZSHZ_CMD -> name of command (default: z)
|
||||
# ZSHZ_COMPLETION -> completion method (default: 'frecent'; 'legacy' for
|
||||
# alphabetic sorting)
|
||||
# ZSHZ_DATA -> name of datafile (default: ~/.z)
|
||||
# ZSHZ_EXCLUDE_DIRS -> array of directories to exclude from your database
|
||||
# (default: empty)
|
||||
# ZSHZ_KEEP_DIRS -> array of directories that should not be removed from the
|
||||
# database, even if they are not currently available (default: empty)
|
||||
# ZSHZ_MAX_SCORE -> maximum combined score the database entries can have
|
||||
# before beginning to age (default: 9000)
|
||||
# ZSHZ_NO_RESOLVE_SYMLINKS -> '1' prevents symlink resolution
|
||||
# ZSHZ_OWNER -> your username (if you want use Zsh-z while using sudo -s)
|
||||
# ZSHZ_UNCOMMON -> if 1, do not jump to "common directories," but rather drop
|
||||
# subdirectories based on what the search string was (default: 0)
|
||||
################################################################################
|
||||
|
||||
source "${0:h}/z.sh"
|
||||
autoload -U is-at-least
|
||||
|
||||
if ! is-at-least 4.3.11; then
|
||||
print "Zsh-z requires Zsh v4.3.11 or higher." >&2 && exit
|
||||
fi
|
||||
|
||||
############################################################
|
||||
# The help message
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ_CMD
|
||||
############################################################
|
||||
_zshz_usage() {
|
||||
print "Usage: ${ZSHZ_CMD:-${_Z_CMD:-z}} [OPTION]... [ARGUMENT]
|
||||
Jump to a directory that you have visited frequently or recently, or a bit of both, based on the partial string ARGUMENT.
|
||||
|
||||
With no ARGUMENT, list the directory history in ascending rank.
|
||||
|
||||
--add Add a directory to the database
|
||||
-c Only match subdirectories of the current directory
|
||||
-e Echo the best match without going to it
|
||||
-h Display this help and exit
|
||||
-l List all matches without going to them
|
||||
-r Match by rank
|
||||
-t Match by recent access
|
||||
-x Remove a directory from the database (by default, the current directory)
|
||||
-xR Remove a directory and its subdirectories from the database (by default, the current directory)" |
|
||||
fold -s -w $COLUMNS >&2
|
||||
}
|
||||
|
||||
# Load zsh/datetime module, if necessary
|
||||
(( $+EPOCHSECONDS )) || zmodload zsh/datetime
|
||||
|
||||
# Load zsh/files, if necessary
|
||||
[[ ${builtins[zf_chown]} == 'defined' &&
|
||||
${builtins[zf_mv]} == 'defined' &&
|
||||
${builtins[zf_rm]} == 'defined' ]] ||
|
||||
zmodload -F zsh/files b:zf_chown b:zf_mv b:zf_rm
|
||||
|
||||
# Load zsh/system, if necessary
|
||||
[[ ${modules[zsh/system]} == 'loaded' ]] || zmodload zsh/system &> /dev/null
|
||||
|
||||
# Global associative array for internal use
|
||||
typeset -gA ZSHZ
|
||||
|
||||
# Make sure ZSHZ_EXCLUDE_DIRS has been declared so that other scripts can
|
||||
# simply append to it
|
||||
(( ${+ZSHZ_EXCLUDE_DIRS} )) || typeset -gUa ZSHZ_EXCLUDE_DIRS
|
||||
|
||||
# Determine if zsystem flock is available
|
||||
zsystem supports flock &> /dev/null && ZSHZ[USE_FLOCK]=1
|
||||
|
||||
# Determine if `print -v' is supported
|
||||
is-at-least 5.3.0 && ZSHZ[PRINTV]=1
|
||||
|
||||
############################################################
|
||||
# The Zsh-z Command
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
# ZSHZ_CASE
|
||||
# ZSHZ_COMPLETION
|
||||
# ZSHZ_DATA
|
||||
# ZSHZ_DEBUG
|
||||
# ZSHZ_EXCLUDE_DIRS
|
||||
# ZSHZ_KEEP_DIRS
|
||||
# ZSHZ_MAX_SCORE
|
||||
# ZSHZ_OWNER
|
||||
#
|
||||
# Arguments:
|
||||
# $* Command options and arguments
|
||||
############################################################
|
||||
zshz() {
|
||||
|
||||
# Don't use `emulate -L zsh' - it breaks PUSHD_IGNORE_DUPS
|
||||
setopt LOCAL_OPTIONS NO_KSH_ARRAYS NO_SH_WORD_SPLIT EXTENDED_GLOB
|
||||
(( ZSHZ_DEBUG )) && setopt LOCAL_OPTIONS WARN_CREATE_GLOBAL
|
||||
|
||||
local REPLY
|
||||
local -a lines
|
||||
|
||||
# Allow the user to specify the datafile name in $ZSHZ_DATA (default: ~/.z)
|
||||
# If the datafile is a symlink, it gets dereferenced
|
||||
local datafile=${${ZSHZ_DATA:-${_Z_DATA:-${HOME}/.z}}:A}
|
||||
|
||||
# If the datafile is a directory, print a warning and exit
|
||||
if [[ -d $datafile ]]; then
|
||||
print "ERROR: Zsh-z's datafile (${datafile}) is a directory." >&2
|
||||
exit
|
||||
fi
|
||||
|
||||
# Make sure that the datafile exists before attempting to read it or lock it
|
||||
# for writing
|
||||
[[ -f $datafile ]] || touch "$datafile"
|
||||
|
||||
# Bail if we don't own the datafile and $ZSHZ_OWNER is not set
|
||||
[[ -z ${ZSHZ_OWNER:-${_Z_OWNER}} && -f $datafile && ! -O $datafile ]] &&
|
||||
return
|
||||
|
||||
# Load the datafile into an array and parse it
|
||||
lines=( ${(f)"$(< $datafile)"} )
|
||||
# Discard entries that are incomplete or incorrectly formatted
|
||||
lines=( ${(M)lines:#/*\|[[:digit:]]##[.,]#[[:digit:]]#\|[[:digit:]]##} )
|
||||
|
||||
############################################################
|
||||
# Add a path to or remove one from the datafile
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
# ZSHZ_EXCLUDE_DIRS
|
||||
# ZSHZ_OWNER
|
||||
#
|
||||
# Arguments:
|
||||
# $1 Which action to perform (--add/--remove)
|
||||
# $2 The path to add
|
||||
############################################################
|
||||
_zshz_add_or_remove_path() {
|
||||
local action=${1}
|
||||
shift
|
||||
|
||||
if [[ $action == '--add' ]]; then
|
||||
|
||||
# TODO: The following tasks are now handled by _agkozak_precmd. Dead code?
|
||||
|
||||
# Don't add $HOME
|
||||
[[ $* == $HOME ]] && return
|
||||
|
||||
# Don't track directory trees excluded in ZSHZ_EXCLUDE_DIRS
|
||||
local exclude
|
||||
for exclude in ${(@)ZSHZ_EXCLUDE_DIRS:-${(@)_Z_EXCLUDE_DIRS}}; do
|
||||
case $* in
|
||||
${exclude}|${exclude}/*) return ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
# A temporary file that gets copied over the datafile if all goes well
|
||||
local tempfile="${datafile}.${RANDOM}"
|
||||
|
||||
# See https://github.com/rupa/z/pull/199/commits/ed6eeed9b70d27c1582e3dd050e72ebfe246341c
|
||||
if (( ZSHZ[USE_FLOCK] )); then
|
||||
|
||||
local lockfd
|
||||
|
||||
# Grab exclusive lock (released when function exits)
|
||||
zsystem flock -f lockfd "$datafile" 2> /dev/null || return
|
||||
|
||||
fi
|
||||
|
||||
integer tmpfd
|
||||
case $action in
|
||||
--add)
|
||||
exec {tmpfd}>|"$tempfile" # Open up tempfile for writing
|
||||
_zshz_update_datafile $tmpfd "$*"
|
||||
local ret=$?
|
||||
;;
|
||||
--remove)
|
||||
local xdir # Directory to be removed
|
||||
|
||||
if (( ${ZSHZ_NO_RESOLVE_SYMLINKS:-${_Z_NO_RESOLVE_SYMLINKS}} )); then
|
||||
[[ -d ${${*:-${PWD}}:a} ]] && xdir=${${*:-${PWD}}:a}
|
||||
else
|
||||
[[ -d ${${*:-${PWD}}:A} ]] && xdir=${${*:-${PWD}}:a}
|
||||
fi
|
||||
|
||||
local -a lines_to_keep
|
||||
if (( ${+opts[-R]} )); then
|
||||
# Prompt user before deleting entire database
|
||||
if [[ $xdir == '/' ]] && ! read -q "?Delete entire Zsh-z database? "; then
|
||||
print && return 1
|
||||
fi
|
||||
# All of the lines that don't match the directory to be deleted
|
||||
lines_to_keep=( ${lines:#${xdir}\|*} )
|
||||
# Or its subdirectories
|
||||
lines_to_keep=( ${lines_to_keep:#${xdir%/}/**} )
|
||||
else
|
||||
# All of the lines that don't match the directory to be deleted
|
||||
lines_to_keep=( ${lines:#${xdir}\|*} )
|
||||
fi
|
||||
if [[ $lines != "$lines_to_keep" ]]; then
|
||||
lines=( $lines_to_keep )
|
||||
else
|
||||
return 1 # The $PWD isn't in the datafile
|
||||
fi
|
||||
exec {tmpfd}>|"$tempfile" # Open up tempfile for writing
|
||||
print -u $tmpfd -l -- $lines
|
||||
local ret=$?
|
||||
;;
|
||||
esac
|
||||
|
||||
if (( tmpfd != 0 )); then
|
||||
# Close tempfile
|
||||
exec {tmpfd}>&-
|
||||
fi
|
||||
|
||||
if (( ret != 0 )); then
|
||||
# Avoid clobbering the datafile if the write to tempfile failed
|
||||
zf_rm -f "$tempfile"
|
||||
return $ret
|
||||
fi
|
||||
|
||||
local owner
|
||||
owner=${ZSHZ_OWNER:-${_Z_OWNER}}
|
||||
|
||||
if (( ZSHZ[USE_FLOCK] )); then
|
||||
zf_mv "$tempfile" "$datafile" 2> /dev/null || zf_rm -f "$tempfile"
|
||||
|
||||
if [[ -n $owner ]]; then
|
||||
zf_chown ${owner}:"$(id -ng ${owner})" "$datafile"
|
||||
fi
|
||||
else
|
||||
if [[ -n $owner ]]; then
|
||||
zf_chown "${owner}":"$(id -ng "${owner}")" "$tempfile"
|
||||
fi
|
||||
zf_mv -f "$tempfile" "$datafile" 2> /dev/null || zf_rm -f "$tempfile"
|
||||
fi
|
||||
|
||||
# In order to make z -x work, we have to disable zsh-z's adding
|
||||
# to the database until the user changes directory and the
|
||||
# chpwd_functions are run
|
||||
if [[ $action == '--remove' ]]; then
|
||||
ZSHZ[DIRECTORY_REMOVED]=1
|
||||
fi
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Read the curent datafile contents, update them, "age" them
|
||||
# when the total rank gets high enough, and print the new
|
||||
# contents to STDOUT.
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ_KEEP_DIRS
|
||||
# ZSHZ_MAX_SCORE
|
||||
#
|
||||
# Arguments:
|
||||
# $1 File descriptor linked to tempfile
|
||||
# $2 Path to be added to datafile
|
||||
############################################################
|
||||
_zshz_update_datafile() {
|
||||
|
||||
integer fd=$1
|
||||
local -A rank time
|
||||
|
||||
# Characters special to the shell (such as '[]') are quoted with backslashes
|
||||
# See https://github.com/rupa/z/issues/246
|
||||
local add_path=${(q)2}
|
||||
|
||||
local -a existing_paths
|
||||
local now=$EPOCHSECONDS line dir
|
||||
local path_field rank_field time_field count x
|
||||
|
||||
rank[$add_path]=1
|
||||
time[$add_path]=$now
|
||||
|
||||
# Remove paths from database if they no longer exist
|
||||
for line in $lines; do
|
||||
if [[ ! -d ${line%%\|*} ]]; then
|
||||
for dir in ${(@)ZSHZ_KEEP_DIRS}; do
|
||||
if [[ ${line%%\|*} == ${dir}/* ||
|
||||
${line%%\|*} == $dir ||
|
||||
$dir == '/' ]]; then
|
||||
existing_paths+=( $line )
|
||||
fi
|
||||
done
|
||||
else
|
||||
existing_paths+=( $line )
|
||||
fi
|
||||
done
|
||||
lines=( $existing_paths )
|
||||
|
||||
for line in $lines; do
|
||||
path_field=${(q)line%%\|*}
|
||||
rank_field=${${line%\|*}#*\|}
|
||||
time_field=${line##*\|}
|
||||
|
||||
# When a rank drops below 1, drop the path from the database
|
||||
(( rank_field < 1 )) && continue
|
||||
|
||||
if [[ $path_field == $add_path ]]; then
|
||||
rank[$path_field]=$rank_field
|
||||
(( rank[$path_field]++ ))
|
||||
time[$path_field]=$now
|
||||
else
|
||||
rank[$path_field]=$rank_field
|
||||
time[$path_field]=$time_field
|
||||
fi
|
||||
(( count += rank_field ))
|
||||
done
|
||||
if (( count > ${ZSHZ_MAX_SCORE:-${_Z_MAX_SCORE:-9000}} )); then
|
||||
# Aging
|
||||
for x in ${(k)rank}; do
|
||||
print -u $fd -- "$x|$(( 0.99 * rank[$x] ))|${time[$x]}" || return 1
|
||||
done
|
||||
else
|
||||
for x in ${(k)rank}; do
|
||||
print -u $fd -- "$x|${rank[$x]}|${time[$x]}" || return 1
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
############################################################
|
||||
# The original tab completion method
|
||||
#
|
||||
# String processing is smartcase -- case-insensitive if the
|
||||
# search string is lowercase, case-sensitive if there are
|
||||
# any uppercase letters. Spaces in the search string are
|
||||
# treated as *'s in globbing. Read the contents of the
|
||||
# datafile and print matches to STDOUT.
|
||||
#
|
||||
# Arguments:
|
||||
# $1 The string to be completed
|
||||
############################################################
|
||||
_zshz_legacy_complete() {
|
||||
|
||||
local line path_field path_field_normalized
|
||||
|
||||
# Replace spaces in the search string with asterisks for globbing
|
||||
1=${1//[[:space:]]/*}
|
||||
|
||||
for line in $lines; do
|
||||
|
||||
path_field=${line%%\|*}
|
||||
|
||||
path_field_normalized=$path_field
|
||||
if (( ZSHZ_TRAILING_SLASH )); then
|
||||
path_field_normalized=${path_field%/}/
|
||||
fi
|
||||
|
||||
# If the search string is all lowercase, the search will be case-insensitive
|
||||
if [[ $1 == "${1:l}" && ${path_field_normalized:l} == *${~1}* ]]; then
|
||||
print -- $path_field
|
||||
# Otherwise, case-sensitive
|
||||
elif [[ $path_field_normalized == *${~1}* ]]; then
|
||||
print -- $path_field
|
||||
fi
|
||||
|
||||
done
|
||||
# TODO: Search strings with spaces in them are currently treated case-
|
||||
# insensitively.
|
||||
}
|
||||
|
||||
############################################################
|
||||
# `print' or `printf' to REPLY
|
||||
#
|
||||
# Variable assignment through command substitution, of the
|
||||
# form
|
||||
#
|
||||
# foo=$( bar )
|
||||
#
|
||||
# requires forking a subshell; on Cygwin/MSYS2/WSL1 that can
|
||||
# be surprisingly slow. Zsh-z avoids doing that by printing
|
||||
# values to the variable REPLY. Since Zsh v5.3.0 that has
|
||||
# been possible with `print -v'; for earlier versions of the
|
||||
# shell, the values are placed on the editing buffer stack
|
||||
# and then `read' into REPLY.
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
#
|
||||
# Arguments:
|
||||
# Options and parameters for `print'
|
||||
############################################################
|
||||
_zshz_printv() {
|
||||
# NOTE: For a long time, ZSH's `print -v' had a tendency
|
||||
# to mangle multibyte strings:
|
||||
#
|
||||
# https://www.zsh.org/mla/workers/2020/msg00307.html
|
||||
#
|
||||
# The bug was fixed in late 2020:
|
||||
#
|
||||
# https://github.com/zsh-users/zsh/commit/b6ba74cd4eaec2b6cb515748cf1b74a19133d4a4#diff-32bbef18e126b837c87b06f11bfc61fafdaa0ed99fcb009ec53f4767e246b129
|
||||
#
|
||||
# In order to support shells with the bug, we must use a form of `printf`,
|
||||
# which does not exhibit the undesired behavior. See
|
||||
#
|
||||
# https://www.zsh.org/mla/workers/2020/msg00308.html
|
||||
|
||||
if (( ZSHZ[PRINTV] )); then
|
||||
builtin print -v REPLY -f %s $@
|
||||
else
|
||||
builtin print -z $@
|
||||
builtin read -rz REPLY
|
||||
fi
|
||||
}
|
||||
|
||||
############################################################
|
||||
# If matches share a common root, find it, and put it in
|
||||
# REPLY for _zshz_output to use.
|
||||
#
|
||||
# Arguments:
|
||||
# $1 Name of associative array of matches and ranks
|
||||
############################################################
|
||||
_zshz_find_common_root() {
|
||||
local -a common_matches
|
||||
local x short
|
||||
|
||||
common_matches=( ${(@Pk)1} )
|
||||
|
||||
for x in ${(@)common_matches}; do
|
||||
if [[ -z $short ]] || (( $#x < $#short )) || [[ $x != ${short}/* ]]; then
|
||||
short=$x
|
||||
fi
|
||||
done
|
||||
|
||||
[[ $short == '/' ]] && return
|
||||
|
||||
for x in ${(@)common_matches}; do
|
||||
[[ $x != $short* ]] && return
|
||||
done
|
||||
|
||||
_zshz_printv -- $short
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Calculate a common root, if there is one. Then do one of
|
||||
# the following:
|
||||
#
|
||||
# 1) Print a list of completions in frecent order;
|
||||
# 2) List them (z -l) to STDOUT; or
|
||||
# 3) Put a common root or best match into REPLY
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ_UNCOMMON
|
||||
#
|
||||
# Arguments:
|
||||
# $1 Name of an associative array of matches and ranks
|
||||
# $2 The best match or best case-insensitive match
|
||||
# $3 Whether to produce a completion, a list, or a root or
|
||||
# match
|
||||
############################################################
|
||||
_zshz_output() {
|
||||
|
||||
local match_array=$1 match=$2 format=$3
|
||||
local common k x
|
||||
local -a descending_list output
|
||||
local -A output_matches
|
||||
|
||||
output_matches=( ${(Pkv)match_array} )
|
||||
|
||||
_zshz_find_common_root $match_array
|
||||
common=$REPLY
|
||||
|
||||
case $format in
|
||||
|
||||
completion)
|
||||
for k in ${(@k)output_matches}; do
|
||||
_zshz_printv -f "%.2f|%s" ${output_matches[$k]} $k
|
||||
descending_list+=( ${(f)REPLY} )
|
||||
REPLY=''
|
||||
done
|
||||
descending_list=( ${${(@On)descending_list}#*\|} )
|
||||
print -l $descending_list
|
||||
;;
|
||||
|
||||
list)
|
||||
local path_to_display
|
||||
for x in ${(k)output_matches}; do
|
||||
if (( ${output_matches[$x]} )); then
|
||||
path_to_display=$x
|
||||
(( ZSHZ_TILDE )) &&
|
||||
path_to_display=${path_to_display/#${HOME}/\~}
|
||||
_zshz_printv -f "%-10d %s\n" ${output_matches[$x]} $path_to_display
|
||||
output+=( ${(f)REPLY} )
|
||||
REPLY=''
|
||||
fi
|
||||
done
|
||||
if [[ -n $common ]]; then
|
||||
(( ZSHZ_TILDE )) && common=${common/#${HOME}/\~}
|
||||
(( $#output > 1 )) && printf "%-10s %s\n" 'common:' $common
|
||||
fi
|
||||
# -lt
|
||||
if (( $+opts[-t] )); then
|
||||
for x in ${(@On)output}; do
|
||||
print -- $x
|
||||
done
|
||||
# -lr
|
||||
elif (( $+opts[-r] )); then
|
||||
for x in ${(@on)output}; do
|
||||
print -- $x
|
||||
done
|
||||
# -l
|
||||
else
|
||||
for x in ${(@on)output}; do
|
||||
print $x
|
||||
done
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
if (( ! ZSHZ_UNCOMMON )) && [[ -n $common ]]; then
|
||||
_zshz_printv -- $common
|
||||
else
|
||||
_zshz_printv -- ${(P)match}
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Match a pattern by rank, time, or a combination of the
|
||||
# two, and output the results as completions, a list, or a
|
||||
# best match.
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
# ZSHZ_CASE
|
||||
# ZSHZ_KEEP_DIRS
|
||||
# ZSHZ_OWNER
|
||||
#
|
||||
# Arguments:
|
||||
# #1 Pattern to match
|
||||
# $2 Matching method (rank, time, or [default] frecency)
|
||||
# $3 Output format (completion, list, or [default] store
|
||||
# in REPLY
|
||||
############################################################
|
||||
_zshz_find_matches() {
|
||||
setopt LOCAL_OPTIONS NO_EXTENDED_GLOB
|
||||
|
||||
local fnd=$1 method=$2 format=$3
|
||||
|
||||
local -a existing_paths
|
||||
local line dir path_field rank_field time_field rank dx escaped_path_field
|
||||
local -A matches imatches
|
||||
local best_match ibest_match hi_rank=-9999999999 ihi_rank=-9999999999
|
||||
|
||||
# Remove paths from database if they no longer exist
|
||||
for line in $lines; do
|
||||
if [[ ! -d ${line%%\|*} ]]; then
|
||||
for dir in ${(@)ZSHZ_KEEP_DIRS}; do
|
||||
if [[ ${line%%\|*} == ${dir}/* ||
|
||||
${line%%\|*} == $dir ||
|
||||
$dir == '/' ]]; then
|
||||
existing_paths+=( $line )
|
||||
fi
|
||||
done
|
||||
else
|
||||
existing_paths+=( $line )
|
||||
fi
|
||||
done
|
||||
lines=( $existing_paths )
|
||||
|
||||
for line in $lines; do
|
||||
path_field=${line%%\|*}
|
||||
rank_field=${${line%\|*}#*\|}
|
||||
time_field=${line##*\|}
|
||||
|
||||
case $method in
|
||||
rank) rank=$rank_field ;;
|
||||
time) (( rank = time_field - EPOCHSECONDS )) ;;
|
||||
*)
|
||||
# Frecency routine
|
||||
(( dx = EPOCHSECONDS - time_field ))
|
||||
rank=$(( 10000 * rank_field * (3.75/((0.0001 * dx + 1) + 0.25)) ))
|
||||
;;
|
||||
esac
|
||||
|
||||
# Use spaces as wildcards
|
||||
local q=${fnd//[[:space:]]/\*}
|
||||
|
||||
# If $ZSHZ_TRAILING_SLASH is set, use path_field with a trailing slash for matching.
|
||||
local path_field_normalized=$path_field
|
||||
if (( ZSHZ_TRAILING_SLASH )); then
|
||||
path_field_normalized=${path_field%/}/
|
||||
fi
|
||||
|
||||
# If $ZSHZ_CASE is 'ignore', be case-insensitive.
|
||||
#
|
||||
# If it's 'smart', be case-insensitive unless the string to be matched
|
||||
# includes capital letters.
|
||||
#
|
||||
# Otherwise, the default behavior of Zsh-z is to match case-sensitively if
|
||||
# possible, then to fall back on a case-insensitive match if possible.
|
||||
if [[ $ZSHZ_CASE == 'smart' && ${1:l} == $1 &&
|
||||
${path_field_normalized:l} == ${~q:l} ]]; then
|
||||
imatches[$path_field]=$rank
|
||||
elif [[ $ZSHZ_CASE != 'ignore' && $path_field_normalized == ${~q} ]]; then
|
||||
matches[$path_field]=$rank
|
||||
elif [[ $ZSHZ_CASE != 'smart' && ${path_field_normalized:l} == ${~q:l} ]]; then
|
||||
imatches[$path_field]=$rank
|
||||
fi
|
||||
|
||||
# Escape characters that would cause "invalid subscript" errors
|
||||
# when accessing the associative array.
|
||||
escaped_path_field=${path_field//'\'/'\\'}
|
||||
escaped_path_field=${escaped_path_field//'`'/'\`'}
|
||||
escaped_path_field=${escaped_path_field//'('/'\('}
|
||||
escaped_path_field=${escaped_path_field//')'/'\)'}
|
||||
escaped_path_field=${escaped_path_field//'['/'\['}
|
||||
escaped_path_field=${escaped_path_field//']'/'\]'}
|
||||
|
||||
if (( matches[$escaped_path_field] )) &&
|
||||
(( matches[$escaped_path_field] > hi_rank )); then
|
||||
best_match=$path_field
|
||||
hi_rank=${matches[$escaped_path_field]}
|
||||
elif (( imatches[$escaped_path_field] )) &&
|
||||
(( imatches[$escaped_path_field] > ihi_rank )); then
|
||||
ibest_match=$path_field
|
||||
ihi_rank=${imatches[$escaped_path_field]}
|
||||
ZSHZ[CASE_INSENSITIVE]=1
|
||||
fi
|
||||
done
|
||||
|
||||
# Return 1 when there are no matches
|
||||
[[ -z $best_match && -z $ibest_match ]] && return 1
|
||||
|
||||
if [[ -n $best_match ]]; then
|
||||
_zshz_output matches best_match $format
|
||||
elif [[ -n $ibest_match ]]; then
|
||||
_zshz_output imatches ibest_match $format
|
||||
fi
|
||||
}
|
||||
|
||||
# THE MAIN ROUTINE
|
||||
|
||||
local -A opts
|
||||
|
||||
zparseopts -E -D -A opts -- \
|
||||
-add \
|
||||
-complete \
|
||||
c \
|
||||
e \
|
||||
h \
|
||||
-help \
|
||||
l \
|
||||
r \
|
||||
R \
|
||||
t \
|
||||
x
|
||||
|
||||
if [[ $1 == '--' ]]; then
|
||||
shift
|
||||
elif [[ -n ${(M)@:#-*} && -z $compstate ]]; then
|
||||
print "Improper option(s) given."
|
||||
_zshz_usage
|
||||
return 1
|
||||
fi
|
||||
|
||||
local opt output_format method='frecency' fnd prefix req
|
||||
|
||||
for opt in ${(k)opts}; do
|
||||
case $opt in
|
||||
--add)
|
||||
[[ ! -d $* ]] && return 1
|
||||
local dir
|
||||
# Cygwin and MSYS2 have a hard time with relative paths expressed from /
|
||||
if [[ $OSTYPE == (cygwin|msys) && $PWD == '/' && $* != /* ]]; then
|
||||
set -- "/$*"
|
||||
fi
|
||||
if (( ${ZSHZ_NO_RESOLVE_SYMLINKS:-${_Z_NO_RESOLVE_SYMLINKS}} )); then
|
||||
dir=${*:a}
|
||||
else
|
||||
dir=${*:A}
|
||||
fi
|
||||
_zshz_add_or_remove_path --add "$dir"
|
||||
return
|
||||
;;
|
||||
--complete)
|
||||
if [[ -s $datafile && ${ZSHZ_COMPLETION:-frecent} == 'legacy' ]]; then
|
||||
_zshz_legacy_complete "$1"
|
||||
return
|
||||
fi
|
||||
output_format='completion'
|
||||
;;
|
||||
-c) [[ $* == ${PWD}/* || $PWD == '/' ]] || prefix="$PWD " ;;
|
||||
-h|--help)
|
||||
_zshz_usage
|
||||
return
|
||||
;;
|
||||
-l) output_format='list' ;;
|
||||
-r) method='rank' ;;
|
||||
-t) method='time' ;;
|
||||
-x)
|
||||
# Cygwin and MSYS2 have a hard time with relative paths expressed from /
|
||||
if [[ $OSTYPE == (cygwin|msys) && $PWD == '/' && $* != /* ]]; then
|
||||
set -- "/$*"
|
||||
fi
|
||||
_zshz_add_or_remove_path --remove $*
|
||||
return
|
||||
;;
|
||||
esac
|
||||
done
|
||||
req="$*"
|
||||
fnd="$prefix$*"
|
||||
|
||||
[[ -n $fnd && $fnd != "$PWD " ]] || {
|
||||
[[ $output_format != 'completion' ]] && output_format='list'
|
||||
}
|
||||
|
||||
#########################################################
|
||||
# If $ZSHZ_ECHO == 1, display paths as you jump to them.
|
||||
# If it is also the case that $ZSHZ_TILDE == 1, display
|
||||
# the home directory as a tilde.
|
||||
#########################################################
|
||||
_zshz_echo() {
|
||||
if (( ZSHZ_ECHO )); then
|
||||
if (( ZSHZ_TILDE )); then
|
||||
print ${PWD/#${HOME}/\~}
|
||||
else
|
||||
print $PWD
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
if [[ ${@: -1} == /* ]] && (( ! $+opts[-e] && ! $+opts[-l] )); then
|
||||
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
|
||||
[[ -d ${@: -1} ]] && builtin cd ${@: -1} && _zshz_echo && return
|
||||
fi
|
||||
|
||||
# With option -c, make sure query string matches beginning of matches;
|
||||
# otherwise look for matches anywhere in paths
|
||||
|
||||
# zpm-zsh/colors has a global $c, so we'll avoid math expressions here
|
||||
if [[ ! -z ${(tP)opts[-c]} ]]; then
|
||||
_zshz_find_matches "$fnd*" $method $output_format
|
||||
else
|
||||
_zshz_find_matches "*$fnd*" $method $output_format
|
||||
fi
|
||||
|
||||
local ret2=$?
|
||||
|
||||
local cd
|
||||
cd=$REPLY
|
||||
|
||||
# New experimental "uncommon" behavior
|
||||
#
|
||||
# If the best choice at this point is something like /foo/bar/foo/bar, and the # search pattern is `bar', go to /foo/bar/foo/bar; but if the search pattern
|
||||
# is `foo', go to /foo/bar/foo
|
||||
if (( ZSHZ_UNCOMMON )) && [[ -n $cd ]]; then
|
||||
if [[ -n $cd ]]; then
|
||||
|
||||
# In the search pattern, replace spaces with *
|
||||
local q=${fnd//[[:space:]]/\*}
|
||||
q=${q%/} # Trailing slash has to be removed
|
||||
|
||||
# As long as the best match is not case-insensitive
|
||||
if (( ! ZSHZ[CASE_INSENSITIVE] )); then
|
||||
# Count the number of characters in $cd that $q matches
|
||||
local q_chars=$(( ${#cd} - ${#${cd//${~q}/}} ))
|
||||
# Try dropping directory elements from the right; stop when it affects
|
||||
# how many times the search pattern appears
|
||||
until (( ( ${#cd:h} - ${#${${cd:h}//${~q}/}} ) != q_chars )); do
|
||||
cd=${cd:h}
|
||||
done
|
||||
|
||||
# If the best match is case-insensitive
|
||||
else
|
||||
local q_chars=$(( ${#cd} - ${#${${cd:l}//${~${q:l}}/}} ))
|
||||
until (( ( ${#cd:h} - ${#${${${cd:h}:l}//${~${q:l}}/}} ) != q_chars )); do
|
||||
cd=${cd:h}
|
||||
done
|
||||
fi
|
||||
|
||||
ZSHZ[CASE_INSENSITIVE]=0
|
||||
fi
|
||||
fi
|
||||
|
||||
if (( ret2 == 0 )) && [[ -n $cd ]]; then
|
||||
if (( $+opts[-e] )); then # echo
|
||||
(( ZSHZ_TILDE )) && cd=${cd/#${HOME}/\~}
|
||||
print -- "$cd"
|
||||
else
|
||||
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
|
||||
[[ -d $cd ]] && builtin cd "$cd" && _zshz_echo
|
||||
fi
|
||||
else
|
||||
# if $req is a valid path, cd to it; echo the new path if $ZSHZ_ECHO == 1
|
||||
if ! (( $+opts[-e] || $+opts[-l] )) && [[ -d $req ]]; then
|
||||
builtin cd "$req" && _zshz_echo
|
||||
else
|
||||
return $ret2
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
alias ${ZSHZ_CMD:-${_Z_CMD:-z}}='zshz 2>&1'
|
||||
|
||||
############################################################
|
||||
# precmd - add path to datafile unless `z -x' has just been
|
||||
# run
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
############################################################
|
||||
_zshz_precmd() {
|
||||
# Do not add PWD to datafile when in HOME directory, or
|
||||
# if `z -x' has just been run
|
||||
[[ $PWD == "$HOME" ]] || (( ZSHZ[DIRECTORY_REMOVED] )) && return
|
||||
|
||||
# Don't track directory trees excluded in ZSHZ_EXCLUDE_DIRS
|
||||
local exclude
|
||||
for exclude in ${(@)ZSHZ_EXCLUDE_DIRS:-${(@)_Z_EXCLUDE_DIRS}}; do
|
||||
case $PWD in
|
||||
${exclude}|${exclude}/*) return ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# It appears that forking a subshell is so slow in Windows that it is better
|
||||
# just to add the PWD to the datafile in the foreground
|
||||
if [[ $OSTYPE == (cygwin|msys) ]]; then
|
||||
zshz --add "$PWD"
|
||||
else
|
||||
(zshz --add "$PWD" &)
|
||||
fi
|
||||
|
||||
# See https://github.com/rupa/z/pull/247/commits/081406117ea42ccb8d159f7630cfc7658db054b6
|
||||
: $RANDOM
|
||||
}
|
||||
|
||||
############################################################
|
||||
# chpwd
|
||||
#
|
||||
# When the $PWD is removed from the datafile with `z -x',
|
||||
# Zsh-z refrains from adding it again until the user has
|
||||
# left the directory.
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
############################################################
|
||||
_zshz_chpwd() {
|
||||
ZSHZ[DIRECTORY_REMOVED]=0
|
||||
}
|
||||
|
||||
autoload -Uz add-zsh-hook
|
||||
|
||||
add-zsh-hook precmd _zshz_precmd
|
||||
add-zsh-hook chpwd _zshz_chpwd
|
||||
|
||||
############################################################
|
||||
# Completion
|
||||
############################################################
|
||||
|
||||
# Standarized $0 handling
|
||||
# (See https://github.com/agkozak/Zsh-100-Commits-Club/blob/master/Zsh-Plugin-Standard.adoc)
|
||||
0=${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}
|
||||
0=${${(M)0:#/*}:-$PWD/$0}
|
||||
|
||||
(( ${fpath[(ie)${0:A:h}]} <= ${#fpath} )) || fpath=( "${0:A:h}" "${fpath[@]}" )
|
||||
|
||||
############################################################
|
||||
# zsh-z functions
|
||||
############################################################
|
||||
ZSHZ[FUNCTIONS]='_zshz_usage
|
||||
_zshz_add_or_remove_path
|
||||
_zshz_update_datafile
|
||||
_zshz_legacy_complete
|
||||
_zshz_printv
|
||||
_zshz_find_common_root
|
||||
_zshz_output
|
||||
_zshz_find_matches
|
||||
zshz
|
||||
_zshz_precmd
|
||||
_zshz_chpwd
|
||||
_zshz'
|
||||
|
||||
############################################################
|
||||
# Enable WARN_NESTED_VAR for functions listed in
|
||||
# ZSHZ[FUNCTIONS]
|
||||
############################################################
|
||||
(( ZSHZ_DEBUG )) && () {
|
||||
if is-at-least 5.4.0; then
|
||||
local x
|
||||
for x in ${=ZSHZ[FUNCTIONS]}; do
|
||||
functions -W $x
|
||||
done
|
||||
fi
|
||||
}
|
||||
|
||||
############################################################
|
||||
# Unload function
|
||||
#
|
||||
# See https://github.com/agkozak/Zsh-100-Commits-Club/blob/master/Zsh-Plugin-Standard.adoc#unload-fun
|
||||
#
|
||||
# Globals:
|
||||
# ZSHZ
|
||||
# ZSHZ_CMD
|
||||
############################################################
|
||||
zsh-z_plugin_unload() {
|
||||
emulate -L zsh
|
||||
|
||||
add-zsh-hook -D precmd _zshz_precmd
|
||||
add-zsh-hook -d chpwd _zshz_chpwd
|
||||
|
||||
local x
|
||||
for x in ${=ZSHZ[FUNCTIONS]}; do
|
||||
(( ${+functions[$x]} )) && unfunction $x
|
||||
done
|
||||
|
||||
unset ZSHZ
|
||||
|
||||
fpath=( "${(@)fpath:#${0:A:h}}" )
|
||||
|
||||
(( ${+aliases[${ZSHZ_CMD:-${_Z_CMD:-z}}]} )) &&
|
||||
unalias ${ZSHZ_CMD:-${_Z_CMD:-z}}
|
||||
|
||||
unfunction $0
|
||||
}
|
||||
|
||||
# vim: fdm=indent:ts=2:et:sts=2:sw=2:
|
||||
|
|
|
|||
267
plugins/z/z.sh
267
plugins/z/z.sh
|
|
@ -1,267 +0,0 @@
|
|||
# Copyright (c) 2009 rupa deadwyler. Licensed under the WTFPL license, Version 2
|
||||
|
||||
# maintains a jump-list of the directories you actually use
|
||||
#
|
||||
# INSTALL:
|
||||
# * put something like this in your .bashrc/.zshrc:
|
||||
# . /path/to/z.sh
|
||||
# * cd around for a while to build up the db
|
||||
# * PROFIT!!
|
||||
# * optionally:
|
||||
# set $_Z_CMD in .bashrc/.zshrc to change the command (default z).
|
||||
# set $_Z_DATA in .bashrc/.zshrc to change the datafile (default ~/.z).
|
||||
# set $_Z_MAX_SCORE lower to age entries out faster (default 9000).
|
||||
# set $_Z_NO_RESOLVE_SYMLINKS to prevent symlink resolution.
|
||||
# set $_Z_NO_PROMPT_COMMAND if you're handling PROMPT_COMMAND yourself.
|
||||
# set $_Z_EXCLUDE_DIRS to an array of directories to exclude.
|
||||
# set $_Z_OWNER to your username if you want use z while sudo with $HOME kept
|
||||
#
|
||||
# USE:
|
||||
# * z foo # cd to most frecent dir matching foo
|
||||
# * z foo bar # cd to most frecent dir matching foo and bar
|
||||
# * z -r foo # cd to highest ranked dir matching foo
|
||||
# * z -t foo # cd to most recently accessed dir matching foo
|
||||
# * z -l foo # list matches instead of cd
|
||||
# * z -e foo # echo the best match, don't cd
|
||||
# * z -c foo # restrict matches to subdirs of $PWD
|
||||
# * z -x # remove the current directory from the datafile
|
||||
# * z -h # show a brief help message
|
||||
|
||||
[ -d "${_Z_DATA:-$HOME/.z}" ] && {
|
||||
echo "ERROR: z.sh's datafile (${_Z_DATA:-$HOME/.z}) is a directory."
|
||||
}
|
||||
|
||||
_z() {
|
||||
|
||||
local datafile="${_Z_DATA:-$HOME/.z}"
|
||||
|
||||
# if symlink, dereference
|
||||
[ -h "$datafile" ] && datafile=$(readlink "$datafile")
|
||||
|
||||
# bail if we don't own ~/.z and $_Z_OWNER not set
|
||||
[ -z "$_Z_OWNER" -a -f "$datafile" -a ! -O "$datafile" ] && return
|
||||
|
||||
_z_dirs () {
|
||||
[ -f "$datafile" ] || return
|
||||
|
||||
local line
|
||||
while read line; do
|
||||
# only count directories
|
||||
[ -d "${line%%\|*}" ] && echo "$line"
|
||||
done < "$datafile"
|
||||
return 0
|
||||
}
|
||||
|
||||
# add entries
|
||||
if [ "$1" = "--add" ]; then
|
||||
shift
|
||||
|
||||
# $HOME and / aren't worth matching
|
||||
[ "$*" = "$HOME" -o "$*" = '/' ] && return
|
||||
|
||||
# don't track excluded directory trees
|
||||
if [ ${#_Z_EXCLUDE_DIRS[@]} -gt 0 ]; then
|
||||
local exclude
|
||||
for exclude in "${_Z_EXCLUDE_DIRS[@]}"; do
|
||||
case "$*" in "$exclude"*) return;; esac
|
||||
done
|
||||
fi
|
||||
|
||||
# maintain the data file
|
||||
local tempfile="$datafile.$RANDOM"
|
||||
local score=${_Z_MAX_SCORE:-9000}
|
||||
_z_dirs | awk -v path="$*" -v now="$(date +%s)" -v score=$score -F"|" '
|
||||
BEGIN {
|
||||
rank[path] = 1
|
||||
time[path] = now
|
||||
}
|
||||
$2 >= 1 {
|
||||
# drop ranks below 1
|
||||
if( $1 == path ) {
|
||||
rank[$1] = $2 + 1
|
||||
time[$1] = now
|
||||
} else {
|
||||
rank[$1] = $2
|
||||
time[$1] = $3
|
||||
}
|
||||
count += $2
|
||||
}
|
||||
END {
|
||||
if( count > score ) {
|
||||
# aging
|
||||
for( x in rank ) print x "|" 0.99*rank[x] "|" time[x]
|
||||
} else for( x in rank ) print x "|" rank[x] "|" time[x]
|
||||
}
|
||||
' 2>/dev/null >| "$tempfile"
|
||||
# do our best to avoid clobbering the datafile in a race condition.
|
||||
if [ $? -ne 0 -a -f "$datafile" ]; then
|
||||
env rm -f "$tempfile"
|
||||
else
|
||||
[ "$_Z_OWNER" ] && chown $_Z_OWNER:"$(id -ng $_Z_OWNER)" "$tempfile"
|
||||
env mv -f "$tempfile" "$datafile" || env rm -f "$tempfile"
|
||||
fi
|
||||
|
||||
# tab completion
|
||||
elif [ "$1" = "--complete" -a -s "$datafile" ]; then
|
||||
_z_dirs | awk -v q="$2" -F"|" '
|
||||
BEGIN {
|
||||
q = substr(q, 3)
|
||||
if( q == tolower(q) ) imatch = 1
|
||||
gsub(/ /, ".*", q)
|
||||
}
|
||||
{
|
||||
if( imatch ) {
|
||||
if( tolower($1) ~ q ) print $1
|
||||
} else if( $1 ~ q ) print $1
|
||||
}
|
||||
' 2>/dev/null
|
||||
|
||||
else
|
||||
# list/go
|
||||
local echo fnd last list opt typ
|
||||
while [ "$1" ]; do case "$1" in
|
||||
--) while [ "$1" ]; do shift; fnd="$fnd${fnd:+ }$1";done;;
|
||||
-*) opt=${1:1}; while [ "$opt" ]; do case ${opt:0:1} in
|
||||
c) fnd="^$PWD $fnd";;
|
||||
e) echo=1;;
|
||||
h) echo "${_Z_CMD:-z} [-cehlrtx] args" >&2; return;;
|
||||
l) list=1;;
|
||||
r) typ="rank";;
|
||||
t) typ="recent";;
|
||||
x) sed -i -e "\:^${PWD}|.*:d" "$datafile";;
|
||||
esac; opt=${opt:1}; done;;
|
||||
*) fnd="$fnd${fnd:+ }$1";;
|
||||
esac; last=$1; [ "$#" -gt 0 ] && shift; done
|
||||
[ "$fnd" -a "$fnd" != "^$PWD " ] || list=1
|
||||
|
||||
# if we hit enter on a completion just go there
|
||||
case "$last" in
|
||||
# completions will always start with /
|
||||
/*) [ -z "$list" -a -d "$last" ] && builtin cd "$last" && return;;
|
||||
esac
|
||||
|
||||
# no file yet
|
||||
[ -f "$datafile" ] || return
|
||||
|
||||
local cd
|
||||
cd="$( < <( _z_dirs ) awk -v t="$(date +%s)" -v list="$list" -v typ="$typ" -v q="$fnd" -F"|" '
|
||||
function frecent(rank, time) {
|
||||
# relate frequency and time
|
||||
dx = t - time
|
||||
return int(10000 * rank * (3.75/((0.0001 * dx + 1) + 0.25)))
|
||||
}
|
||||
function output(matches, best_match, common) {
|
||||
# list or return the desired directory
|
||||
if( list ) {
|
||||
if( common ) {
|
||||
printf "%-10s %s\n", "common:", common > "/dev/stderr"
|
||||
}
|
||||
cmd = "sort -n >&2"
|
||||
for( x in matches ) {
|
||||
if( matches[x] ) {
|
||||
printf "%-10s %s\n", matches[x], x | cmd
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if( common && !typ ) best_match = common
|
||||
print best_match
|
||||
}
|
||||
}
|
||||
function common(matches) {
|
||||
# find the common root of a list of matches, if it exists
|
||||
for( x in matches ) {
|
||||
if( matches[x] && (!short || length(x) < length(short)) ) {
|
||||
short = x
|
||||
}
|
||||
}
|
||||
if( short == "/" ) return
|
||||
for( x in matches ) if( matches[x] && index(x, short) != 1 ) {
|
||||
return
|
||||
}
|
||||
return short
|
||||
}
|
||||
BEGIN {
|
||||
gsub(" ", ".*", q)
|
||||
hi_rank = ihi_rank = -9999999999
|
||||
}
|
||||
{
|
||||
if( typ == "rank" ) {
|
||||
rank = $2
|
||||
} else if( typ == "recent" ) {
|
||||
rank = $3 - t
|
||||
} else rank = frecent($2, $3)
|
||||
if( $1 ~ q ) {
|
||||
matches[$1] = rank
|
||||
} else if( tolower($1) ~ tolower(q) ) imatches[$1] = rank
|
||||
if( matches[$1] && matches[$1] > hi_rank ) {
|
||||
best_match = $1
|
||||
hi_rank = matches[$1]
|
||||
} else if( imatches[$1] && imatches[$1] > ihi_rank ) {
|
||||
ibest_match = $1
|
||||
ihi_rank = imatches[$1]
|
||||
}
|
||||
}
|
||||
END {
|
||||
# prefer case sensitive
|
||||
if( best_match ) {
|
||||
output(matches, best_match, common(matches))
|
||||
exit
|
||||
} else if( ibest_match ) {
|
||||
output(imatches, ibest_match, common(imatches))
|
||||
exit
|
||||
}
|
||||
exit(1)
|
||||
}
|
||||
')"
|
||||
|
||||
if [ "$?" -eq 0 ]; then
|
||||
if [ "$cd" ]; then
|
||||
if [ "$echo" ]; then echo "$cd"; else builtin cd "$cd"; fi
|
||||
fi
|
||||
else
|
||||
return $?
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
alias ${_Z_CMD:-z}='_z 2>&1'
|
||||
|
||||
[ "$_Z_NO_RESOLVE_SYMLINKS" ] || _Z_RESOLVE_SYMLINKS="-P"
|
||||
|
||||
if type compctl >/dev/null 2>&1; then
|
||||
# zsh
|
||||
[ "$_Z_NO_PROMPT_COMMAND" ] || {
|
||||
# populate directory list, avoid clobbering any other precmds.
|
||||
if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then
|
||||
_z_precmd() {
|
||||
(_z --add "${PWD:a}" &)
|
||||
: $RANDOM
|
||||
}
|
||||
else
|
||||
_z_precmd() {
|
||||
(_z --add "${PWD:A}" &)
|
||||
: $RANDOM
|
||||
}
|
||||
fi
|
||||
[[ -n "${precmd_functions[(r)_z_precmd]}" ]] || {
|
||||
precmd_functions[$(($#precmd_functions+1))]=_z_precmd
|
||||
}
|
||||
}
|
||||
_z_zsh_tab_completion() {
|
||||
# tab completion
|
||||
local compl
|
||||
read -l compl
|
||||
reply=(${(f)"$(_z --complete "$compl")"})
|
||||
}
|
||||
compctl -U -K _z_zsh_tab_completion _z
|
||||
elif type complete >/dev/null 2>&1; then
|
||||
# bash
|
||||
# tab completion
|
||||
complete -o filenames -C '_z --complete "$COMP_LINE"' ${_Z_CMD:-z}
|
||||
[ "$_Z_NO_PROMPT_COMMAND" ] || {
|
||||
# populate directory list. avoid clobbering other PROMPT_COMMANDs.
|
||||
grep "_z --add" <<< "$PROMPT_COMMAND" >/dev/null || {
|
||||
PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''(_z --add "$(command pwd '$_Z_RESOLVE_SYMLINKS' 2>/dev/null)" 2>/dev/null &);'
|
||||
}
|
||||
}
|
||||
fi
|
||||
|
|
@ -11,11 +11,11 @@
|
|||
# more about both of these fantastic two people here:
|
||||
#
|
||||
# Sindre Sorhus
|
||||
# Github: https://github.com/sindresorhus
|
||||
# GitHub: https://github.com/sindresorhus
|
||||
# Twitter: https://twitter.com/sindresorhus
|
||||
#
|
||||
# Julien Nicoulaud
|
||||
# Github: https://github.com/nicoulaj
|
||||
# GitHub: https://github.com/nicoulaj
|
||||
# Twitter: https://twitter.com/nicoulaj
|
||||
#
|
||||
# ------------------------------------------------------------------------------
|
||||
|
|
|
|||
|
|
@ -156,11 +156,17 @@ supports_hyperlinks() {
|
|||
return 0
|
||||
fi
|
||||
|
||||
# Windows Terminal or Konsole also support hyperlinks
|
||||
if [ -n "$WT_SESSION" ] || [ -n "$KONSOLE_VERSION" ]; then
|
||||
# Windows Terminal also supports hyperlinks
|
||||
if [ -n "$WT_SESSION" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Konsole supports hyperlinks, but it's an opt-in setting that can't be detected
|
||||
# https://github.com/ohmyzsh/ohmyzsh/issues/10964
|
||||
# if [ -n "$KONSOLE_VERSION" ]; then
|
||||
# return 0
|
||||
# fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
|
|
@ -185,7 +191,7 @@ supports_truecolor() {
|
|||
fmt_link() {
|
||||
# $1: text, $2: url, $3: fallback mode
|
||||
if supports_hyperlinks; then
|
||||
printf '\033]8;;%s\a%s\033]8;;\a\n' "$2" "$1"
|
||||
printf '\033]8;;%s\033\\%s\033]8;;\033\\\n' "$2" "$1"
|
||||
return
|
||||
fi
|
||||
|
||||
|
|
@ -267,7 +273,7 @@ setup_ohmyzsh() {
|
|||
}
|
||||
|
||||
ostype=$(uname)
|
||||
if [ -z "${ostype%CYGWIN*}" ] && git --version | grep -q msysgit; then
|
||||
if [ -z "${ostype%CYGWIN*}" ] && git --version | grep -Eq 'msysgit|windows'; then
|
||||
fmt_error "Windows/MSYS Git is not supported on Cygwin"
|
||||
fmt_error "Make sure the Cygwin git package is installed and is first on the \$PATH"
|
||||
exit 1
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ usage() {
|
|||
NAME
|
||||
require_tool.sh - Ensure version of a tool is greater than the one expected
|
||||
|
||||
SYNOPSYS
|
||||
SYNOPSIS
|
||||
require_tool.sh [ -h ]
|
||||
[ --help ]
|
||||
[ TOOL MIN_VERSION ]
|
||||
|
|
|
|||
|
|
@ -78,11 +78,17 @@ supports_hyperlinks() {
|
|||
return 0
|
||||
fi
|
||||
|
||||
# Windows Terminal or Konsole also support hyperlinks
|
||||
if [ -n "$WT_SESSION" ] || [ -n "$KONSOLE_VERSION" ]; then
|
||||
# Windows Terminal also supports hyperlinks
|
||||
if [ -n "$WT_SESSION" ]; then
|
||||
return 0
|
||||
fi
|
||||
|
||||
# Konsole supports hyperlinks, but it's an opt-in setting that can't be detected
|
||||
# https://github.com/ohmyzsh/ohmyzsh/issues/10964
|
||||
# if [ -n "$KONSOLE_VERSION" ]; then
|
||||
# return 0
|
||||
# fi
|
||||
|
||||
return 1
|
||||
}
|
||||
|
||||
|
|
@ -107,7 +113,7 @@ supports_truecolor() {
|
|||
fmt_link() {
|
||||
# $1: text, $2: url, $3: fallback mode
|
||||
if supports_hyperlinks; then
|
||||
printf '\033]8;;%s\a%s\033]8;;\a\n' "$2" "$1"
|
||||
printf '\033]8;;%s\033\\%s\033]8;;\033\\\n' "$2" "$1"
|
||||
return
|
||||
fi
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue