diff options
| author | Tuowen Zhao <ztuowen@gmail.com> | 2020-10-08 11:04:31 -0600 | 
|---|---|---|
| committer | Tuowen Zhao <ztuowen@gmail.com> | 2020-10-08 11:04:31 -0600 | 
| commit | 1774c426de3c4845e2d606c813c37067b8cf78d7 (patch) | |
| tree | 872a7bbcaa79cf0b1c19d2687090ee6eb8e205fb /plugins/z | |
| parent | 2b3d602644a13aa97391f22ecfc249b6bc58dd49 (diff) | |
| parent | 27857e66d0dab0bd05790307dfe5388f3cb2c51a (diff) | |
| download | zsh-1774c426de3c4845e2d606c813c37067b8cf78d7.tar.gz zsh-1774c426de3c4845e2d606c813c37067b8cf78d7.tar.bz2 zsh-1774c426de3c4845e2d606c813c37067b8cf78d7.zip  | |
Merge remote-tracking branch 'origin/master' into master
Diffstat (limited to 'plugins/z')
| -rw-r--r-- | plugins/z/README | 8 | ||||
| -rw-r--r-- | plugins/z/z.1 | 3 | ||||
| -rw-r--r-- | plugins/z/z.sh | 44 | 
3 files changed, 33 insertions, 22 deletions
diff --git a/plugins/z/README b/plugins/z/README index 56261cff4..47e54c57a 100644 --- a/plugins/z/README +++ b/plugins/z/README @@ -23,6 +23,8 @@ DESCRIPTION  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 @@ -57,6 +59,8 @@ NOTES         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. @@ -64,8 +68,8 @@ NOTES                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    like -              /usr/local/man/man1. +              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- diff --git a/plugins/z/z.1 b/plugins/z/z.1 index d4cac1ac2..182f98176 100644 --- a/plugins/z/z.1 +++ b/plugins/z/z.1 @@ -78,6 +78,9 @@ Set \fB$_Z_CMD\fR to change the command name (default \fBz\fR).  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 diff --git a/plugins/z/z.sh b/plugins/z/z.sh index 5c5771d62..13008a60e 100644 --- a/plugins/z/z.sh +++ b/plugins/z/z.sh @@ -10,6 +10,7 @@  #     * 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. @@ -23,6 +24,8 @@  #     * 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." @@ -62,7 +65,8 @@ _z() {          # maintain the data file          local tempfile="$datafile.$RANDOM" -        _z_dirs | awk -v path="$*" -v now="$(date +%s)" -F"|" ' +        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 @@ -79,7 +83,7 @@ _z() {                  count += $2              }              END { -                if( count > 9000 ) { +                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] @@ -138,27 +142,24 @@ _z() {          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 -                if( dx < 3600 ) return rank * 4 -                if( dx < 86400 ) return rank * 2 -                if( dx < 604800 ) return rank / 2 -                return rank / 4 +              # 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 ) { -                    cmd = "sort -g >&2" +                    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                          }                      } -                    if( common ) { -                        printf "%-10s %s\n", "common:", common > "/dev/stderr" -                    }                  } else { -                    if( common ) best_match = common +                    if( common && !typ ) best_match = common                      print best_match                  }              } @@ -200,15 +201,22 @@ _z() {                  # 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)              }          ')" -        [ $? -eq 0 ] && [ "$cd" ] && { -          if [ "$echo" ]; then echo "$cd"; else builtin cd "$cd"; fi -        } +        if [ "$?" -eq 0 ]; then +          if [ "$cd" ]; then +            if [ "$echo" ]; then echo "$cd"; else builtin cd "$cd"; fi +          fi +        else +          return $? +        fi      fi  } @@ -223,15 +231,11 @@ if type compctl >/dev/null 2>&1; then          if [ "$_Z_NO_RESOLVE_SYMLINKS" ]; then              _z_precmd() {                  (_z --add "${PWD:a}" &) -                # Reference $RANDOM to refresh its value inside the subshell -                # Otherwise, multiple runs get the same value                  : $RANDOM              }          else              _z_precmd() {                  (_z --add "${PWD:A}" &) -                # Reference $RANDOM to refresh its value inside the subshell -                # Otherwise, multiple runs get the same value                  : $RANDOM              }          fi  | 
