diff options
author | 2025-02-13 14:13:49 +0530 | |
---|---|---|
committer | 2025-02-13 14:13:49 +0530 | |
commit | 8a2e1006b3b272126332aa064f3ad95387129544 (patch) | |
tree | 944c80ac612a65980d94a54ba11b6c7102037ecf /.config/zsh/oh-my-zsh/plugins/z | |
parent | dcbb16d8b08ff5956abef5e6478b59df2e93ad35 (diff) | |
download | dotfiles-master.tar.gz dotfiles-master.tar.bz2 dotfiles-master.zip |
Diffstat (limited to '.config/zsh/oh-my-zsh/plugins/z')
-rw-r--r-- | .config/zsh/oh-my-zsh/plugins/z/Makefile | 4 | ||||
-rw-r--r-- | .config/zsh/oh-my-zsh/plugins/z/README | 148 | ||||
-rw-r--r-- | .config/zsh/oh-my-zsh/plugins/z/README.md | 23 | ||||
-rw-r--r-- | .config/zsh/oh-my-zsh/plugins/z/z.1 | 173 | ||||
-rw-r--r-- | .config/zsh/oh-my-zsh/plugins/z/z.plugin.zsh | 6 | ||||
-rw-r--r-- | .config/zsh/oh-my-zsh/plugins/z/z.sh | 267 |
6 files changed, 621 insertions, 0 deletions
diff --git a/.config/zsh/oh-my-zsh/plugins/z/Makefile b/.config/zsh/oh-my-zsh/plugins/z/Makefile new file mode 100644 index 0000000..dcf433d --- /dev/null +++ b/.config/zsh/oh-my-zsh/plugins/z/Makefile @@ -0,0 +1,4 @@ +readme: + @groff -man -Tascii z.1 | col -bx + +.PHONY: readme diff --git a/.config/zsh/oh-my-zsh/plugins/z/README b/.config/zsh/oh-my-zsh/plugins/z/README new file mode 100644 index 0000000..47e54c5 --- /dev/null +++ b/.config/zsh/oh-my-zsh/plugins/z/README @@ -0,0 +1,148 @@ +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) diff --git a/.config/zsh/oh-my-zsh/plugins/z/README.md b/.config/zsh/oh-my-zsh/plugins/z/README.md new file mode 100644 index 0000000..ea8d461 --- /dev/null +++ b/.config/zsh/oh-my-zsh/plugins/z/README.md @@ -0,0 +1,23 @@ +# 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. + +### 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 +/usr/bin$ z plug # Even 'z p' might suffice +~/.oh-my-zsh/plugins$ +``` + +### Setup +To enable z, add `z` to your `plugins` array in your zshrc file: + +```zsh +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)). + diff --git a/.config/zsh/oh-my-zsh/plugins/z/z.1 b/.config/zsh/oh-my-zsh/plugins/z/z.1 new file mode 100644 index 0000000..182f981 --- /dev/null +++ b/.config/zsh/oh-my-zsh/plugins/z/z.1 @@ -0,0 +1,173 @@ +.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/ diff --git a/.config/zsh/oh-my-zsh/plugins/z/z.plugin.zsh b/.config/zsh/oh-my-zsh/plugins/z/z.plugin.zsh new file mode 100644 index 0000000..7d3eaca --- /dev/null +++ b/.config/zsh/oh-my-zsh/plugins/z/z.plugin.zsh @@ -0,0 +1,6 @@ +# 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}" + +source "${0:h}/z.sh" diff --git a/.config/zsh/oh-my-zsh/plugins/z/z.sh b/.config/zsh/oh-my-zsh/plugins/z/z.sh new file mode 100644 index 0000000..67f504e --- /dev/null +++ b/.config/zsh/oh-my-zsh/plugins/z/z.sh @@ -0,0 +1,267 @@ +# 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 |