mirror of
https://github.com/ohmyzsh/ohmyzsh.git
synced 2024-12-19 20:29:45 +01:00
feat(z): update to latest upstream version
Mirror of 6bfe418332
Closes #11652
Co-authored-by: Carlo Sala <carlosalag@protonmail.com>
This commit is contained in:
parent
5fc1118fd2
commit
2e7a247cab
6 changed files with 65 additions and 16 deletions
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2018-2022 Alexandros Kozak
|
Copyright (c) 2018-2023 Alexandros Kozak
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
# Zsh-z
|
# Zsh-z
|
||||||
|
|
||||||
|
[![MIT License](img/mit_license.svg)](https://opensource.org/licenses/MIT)
|
||||||
|
![Zsh version 4.3.11 and higher](img/zsh_4.3.11_plus.svg)
|
||||||
|
[![GitHub stars](https://img.shields.io/github/stars/agkozak/zsh-z.svg)](https://github.com/agkozak/zsh-z/stargazers)
|
||||||
|
|
||||||
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 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`.
|
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`.
|
||||||
|
@ -28,6 +32,10 @@ Zsh-z is a drop-in replacement for `rupa/z` and will, by default, use the same d
|
||||||
<details>
|
<details>
|
||||||
<summary>Here are the latest features and updates.</summary>
|
<summary>Here are the latest features and updates.</summary>
|
||||||
|
|
||||||
|
- April 27, 2023
|
||||||
|
+ Zsh-z now allows the user to specify the directory-changing command using the `ZSHZ_CD` environment variable (default: `builtin cd`; props @basnijholt).
|
||||||
|
- January 27, 2023
|
||||||
|
+ If the datafile directory specified by `ZSHZ_DATA` or `_Z_DATA` does not already exist, create it (props @mattmc3).
|
||||||
- June 29, 2022
|
- June 29, 2022
|
||||||
+ Zsh-z is less likely to leave temporary files sitting around (props @mafredri).
|
+ Zsh-z is less likely to leave temporary files sitting around (props @mafredri).
|
||||||
- June 27, 2022
|
- June 27, 2022
|
||||||
|
@ -118,13 +126,19 @@ Add the line
|
||||||
|
|
||||||
to your `.zshrc`, somewhere above the line that says `antigen apply`.
|
to your `.zshrc`, somewhere above the line that says `antigen apply`.
|
||||||
|
|
||||||
### For [oh-my-zsh](http://ohmyz.sh/) users
|
### For [Oh My Zsh](http://ohmyz.sh/) users
|
||||||
|
|
||||||
Execute the following command:
|
Zsh-z is now included as part of Oh My Zsh! As long as you are using an up-to-date installation of Oh My Zsh, you can activate Zsh-z simply by adding `z` to your `plugins` array in your `.zshrc`, e.g.,
|
||||||
|
|
||||||
|
plugins=( git z )
|
||||||
|
|
||||||
|
It is as simple as that.
|
||||||
|
|
||||||
|
If, however, you prefer always to use the latest version of Zsh-z from the `agkozak/zsh-z` repo, you may install it thus:
|
||||||
|
|
||||||
git clone https://github.com/agkozak/zsh-z ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-z
|
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 )`.
|
and activate it by adding `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
|
### For [prezto](https://github.com/sorin-ionescu/prezto) users
|
||||||
|
|
||||||
|
@ -246,6 +260,7 @@ to install `zsh-z`.
|
||||||
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_`).
|
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_CMD` changes the command name (default: `z`)
|
||||||
|
* `ZSHZ_CD` specifies the default directory-changing command (default: `builtin cd`)
|
||||||
* `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_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_DATA` changes the database file (default: `~/.z`)
|
||||||
* `ZSHZ_ECHO` displays the new path name when changing directories (default: `0`)
|
* `ZSHZ_ECHO` displays the new path name when changing directories (default: `0`)
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#
|
#
|
||||||
# https://github.com/agkozak/zsh-z
|
# https://github.com/agkozak/zsh-z
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018-2022 Alexandros Kozak
|
# Copyright (c) 2018-2023 Alexandros Kozak
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
1
plugins/z/img/mit_license.svg
Normal file
1
plugins/z/img/mit_license.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="78" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="78" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h47v20H0z"/><path fill="#97CA00" d="M47 0h31v20H47z"/><path fill="url(#b)" d="M0 0h78v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"><text x="245" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="370">license</text><text x="245" y="140" transform="scale(.1)" textLength="370">license</text><text x="615" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="210">MIT</text><text x="615" y="140" transform="scale(.1)" textLength="210">MIT</text></g> </svg>
|
After Width: | Height: | Size: 949 B |
1
plugins/z/img/zsh_4.3.11_plus.svg
Normal file
1
plugins/z/img/zsh_4.3.11_plus.svg
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="84" height="20"><linearGradient id="b" x2="0" y2="100%"><stop offset="0" stop-color="#bbb" stop-opacity=".1"/><stop offset="1" stop-opacity=".1"/></linearGradient><clipPath id="a"><rect width="84" height="20" rx="3" fill="#fff"/></clipPath><g clip-path="url(#a)"><path fill="#555" d="M0 0h29v20H0z"/><path fill="#e05d44" d="M29 0h55v20H29z"/><path fill="url(#b)" d="M0 0h84v20H0z"/></g><g fill="#fff" text-anchor="middle" font-family="DejaVu Sans,Verdana,Geneva,sans-serif" font-size="110"><text x="155" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="190">zsh</text><text x="155" y="140" transform="scale(.1)" textLength="190">zsh</text><text x="555" y="150" fill="#010101" fill-opacity=".3" transform="scale(.1)" textLength="450">4.3.11+</text><text x="555" y="140" transform="scale(.1)" textLength="450">4.3.11+</text></g> </svg>
|
After Width: | Height: | Size: 949 B |
|
@ -4,7 +4,7 @@
|
||||||
#
|
#
|
||||||
# https://github.com/agkozak/zsh-z
|
# https://github.com/agkozak/zsh-z
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018-2022 Alexandros Kozak
|
# Copyright (c) 2018-2023 Alexandros Kozak
|
||||||
#
|
#
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
@ -52,6 +52,7 @@
|
||||||
# ZSHZ_CASE -> if `ignore', pattern matching is case-insensitive; if `smart',
|
# ZSHZ_CASE -> if `ignore', pattern matching is case-insensitive; if `smart',
|
||||||
# pattern matching is case-insensitive only when the pattern is all
|
# pattern matching is case-insensitive only when the pattern is all
|
||||||
# lowercase
|
# lowercase
|
||||||
|
# ZSHZ_CD -> the directory-changing command that is used (default: builtin cd)
|
||||||
# ZSHZ_CMD -> name of command (default: z)
|
# ZSHZ_CMD -> name of command (default: z)
|
||||||
# ZSHZ_COMPLETION -> completion method (default: 'frecent'; 'legacy' for
|
# ZSHZ_COMPLETION -> completion method (default: 'frecent'; 'legacy' for
|
||||||
# alphabetic sorting)
|
# alphabetic sorting)
|
||||||
|
@ -129,6 +130,7 @@ is-at-least 5.3.0 && ZSHZ[PRINTV]=1
|
||||||
# Globals:
|
# Globals:
|
||||||
# ZSHZ
|
# ZSHZ
|
||||||
# ZSHZ_CASE
|
# ZSHZ_CASE
|
||||||
|
# ZSHZ_CD
|
||||||
# ZSHZ_COMPLETION
|
# ZSHZ_COMPLETION
|
||||||
# ZSHZ_DATA
|
# ZSHZ_DATA
|
||||||
# ZSHZ_DEBUG
|
# ZSHZ_DEBUG
|
||||||
|
@ -149,9 +151,19 @@ zshz() {
|
||||||
local REPLY
|
local REPLY
|
||||||
local -a lines
|
local -a lines
|
||||||
|
|
||||||
# Allow the user to specify the datafile name in $ZSHZ_DATA (default: ~/.z)
|
# Allow the user to specify a custom datafile in $ZSHZ_DATA (or legacy $_Z_DATA)
|
||||||
|
local custom_datafile="${ZSHZ_DATA:-$_Z_DATA}"
|
||||||
|
|
||||||
|
# If a datafile was provided as a standalone file without a directory path
|
||||||
|
# print a warning and exit
|
||||||
|
if [[ -n ${custom_datafile} && ${custom_datafile} != */* ]]; then
|
||||||
|
print "ERROR: You configured a custom Zsh-z datafile (${custom_datafile}), but have not specified its directory." >&2
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the user specified a datafile, use that or default to ~/.z
|
||||||
# If the datafile is a symlink, it gets dereferenced
|
# If the datafile is a symlink, it gets dereferenced
|
||||||
local datafile=${${ZSHZ_DATA:-${_Z_DATA:-${HOME}/.z}}:A}
|
local datafile=${${custom_datafile:-$HOME/.z}:A}
|
||||||
|
|
||||||
# If the datafile is a directory, print a warning and exit
|
# If the datafile is a directory, print a warning and exit
|
||||||
if [[ -d $datafile ]]; then
|
if [[ -d $datafile ]]; then
|
||||||
|
@ -161,7 +173,7 @@ zshz() {
|
||||||
|
|
||||||
# Make sure that the datafile exists before attempting to read it or lock it
|
# Make sure that the datafile exists before attempting to read it or lock it
|
||||||
# for writing
|
# for writing
|
||||||
[[ -f $datafile ]] || touch "$datafile"
|
[[ -f $datafile ]] || { mkdir -p "${datafile:h}" && touch "$datafile" }
|
||||||
|
|
||||||
# Bail if we don't own the datafile and $ZSHZ_OWNER is not set
|
# Bail if we don't own the datafile and $ZSHZ_OWNER is not set
|
||||||
[[ -z ${ZSHZ_OWNER:-${_Z_OWNER}} && -f $datafile && ! -O $datafile ]] &&
|
[[ -z ${ZSHZ_OWNER:-${_Z_OWNER}} && -f $datafile && ! -O $datafile ]] &&
|
||||||
|
@ -620,7 +632,7 @@ zshz() {
|
||||||
*)
|
*)
|
||||||
# Frecency routine
|
# Frecency routine
|
||||||
(( dx = EPOCHSECONDS - time_field ))
|
(( dx = EPOCHSECONDS - time_field ))
|
||||||
rank=$(( 10000 * rank_field * (3.75/((0.0001 * dx + 1) + 0.25)) ))
|
rank=$(( 10000 * rank_field * (3.75/( (0.0001 * dx + 1) + 0.25)) ))
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@ -756,6 +768,26 @@ zshz() {
|
||||||
[[ $output_format != 'completion' ]] && output_format='list'
|
[[ $output_format != 'completion' ]] && output_format='list'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#########################################################
|
||||||
|
# Allow the user to specify directory-changing command
|
||||||
|
# using $ZSHZ_CD (default: builtin cd).
|
||||||
|
#
|
||||||
|
# Globals:
|
||||||
|
# ZSHZ_CD
|
||||||
|
#
|
||||||
|
# Arguments:
|
||||||
|
# $* Path
|
||||||
|
#########################################################
|
||||||
|
zshz_cd() {
|
||||||
|
setopt LOCAL_OPTIONS NO_WARN_CREATE_GLOBAL
|
||||||
|
|
||||||
|
if [[ -z $ZSHZ_CD ]]; then
|
||||||
|
builtin cd "$*"
|
||||||
|
else
|
||||||
|
${=ZSHZ_CD} "$*"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
#########################################################
|
#########################################################
|
||||||
# If $ZSHZ_ECHO == 1, display paths as you jump to them.
|
# If $ZSHZ_ECHO == 1, display paths as you jump to them.
|
||||||
# If it is also the case that $ZSHZ_TILDE == 1, display
|
# If it is also the case that $ZSHZ_TILDE == 1, display
|
||||||
|
@ -773,7 +805,7 @@ zshz() {
|
||||||
|
|
||||||
if [[ ${@: -1} == /* ]] && (( ! $+opts[-e] && ! $+opts[-l] )); then
|
if [[ ${@: -1} == /* ]] && (( ! $+opts[-e] && ! $+opts[-l] )); then
|
||||||
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
|
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
|
||||||
[[ -d ${@: -1} ]] && builtin cd ${@: -1} && _zshz_echo && return
|
[[ -d ${@: -1} ]] && zshz_cd ${@: -1} && _zshz_echo && return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# With option -c, make sure query string matches beginning of matches;
|
# With option -c, make sure query string matches beginning of matches;
|
||||||
|
@ -830,12 +862,12 @@ zshz() {
|
||||||
print -- "$cd"
|
print -- "$cd"
|
||||||
else
|
else
|
||||||
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
|
# cd if possible; echo the new path if $ZSHZ_ECHO == 1
|
||||||
[[ -d $cd ]] && builtin cd "$cd" && _zshz_echo
|
[[ -d $cd ]] && zshz_cd "$cd" && _zshz_echo
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# if $req is a valid path, cd to it; echo the new path if $ZSHZ_ECHO == 1
|
# 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
|
if ! (( $+opts[-e] || $+opts[-l] )) && [[ -d $req ]]; then
|
||||||
builtin cd "$req" && _zshz_echo
|
zshz_cd "$req" && _zshz_echo
|
||||||
else
|
else
|
||||||
return $ret2
|
return $ret2
|
||||||
fi
|
fi
|
||||||
|
@ -900,9 +932,9 @@ add-zsh-hook chpwd _zshz_chpwd
|
||||||
############################################################
|
############################################################
|
||||||
|
|
||||||
# Standarized $0 handling
|
# Standarized $0 handling
|
||||||
# (See https://github.com/agkozak/Zsh-100-Commits-Club/blob/master/Zsh-Plugin-Standard.adoc)
|
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
|
||||||
0=${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}
|
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
|
||||||
0=${${(M)0:#/*}:-$PWD/$0}
|
0="${${(M)0:#/*}:-$PWD/$0}"
|
||||||
|
|
||||||
(( ${fpath[(ie)${0:A:h}]} <= ${#fpath} )) || fpath=( "${0:A:h}" "${fpath[@]}" )
|
(( ${fpath[(ie)${0:A:h}]} <= ${#fpath} )) || fpath=( "${0:A:h}" "${fpath[@]}" )
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue