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)
Category: Linux / Shell command line productivity |
Watchers: 176 |
Star: 15.6k |
Fork: 1.2k |
Last update: Dec 7, 2023 |
The default $PROMPT_COMMAND
is
$ echo $PROMPT_COMMAND
_z --add "$(command pwd -P 2>/dev/null)" 2>/dev/null
For me (on Cygwin, Windows 8.1), the default configuration makes it so that if I hold down the Enter key in Bash, the prompts start to lag behind. Overall, the prompt feels slow.
So I changed it to
$ echo $PROMPT_COMMAND
(_z --add "$(command pwd -P 2>/dev/null)" 2>/dev/null &)
This seems to mostly fix the issue. The z datafile is updated in the background, silently.
Is there any harm in doing this or reason why this isn't the default?
As in issue #49, I'd love to if z would not resolve symlinks.
I've tried a proposed solution, changing pwd -P
to pwd
.
This does add a symlink to .z
file.
However, z never uses that symlink. Output of z
does not list
the symlink.
I love this script, it is awesome, but symlinking is a very important feature to me, so it makes me sad that it does not work.
Could you please take a look at this?
I also think it should be the default behaviour, but that's just me.
I've been suffering from this for a while now, and today decided that I should report. Basically, the issue is described here:
One thing that really annoys me though is that z looses its history when I press Enter rapidly multiple times (I sometimes clear my window this way), before zsh is able to prepare another prompt. This is 100% reproducible on my home machine, but not on my work machine. I don't know whether the culprit is z, fzf wrapper or zsh async, I'm just mentioning it here as zsh async may be related (I'm not sure).
And the following comment:
I've experienced the same issue with z. It's definitely a bug/race-condition in z. My theory is that one instance of z manages to read the database at some point where it's being replaced by another instance, resulting in an empty db.
For this reason I made sure that zsh-async does not run any hooks inside the worker (async.zsh#L75-L80).
I believe this issue was aggravated by either rupa/z@4a8b741 or rupa/z@1a361f6 or both.
@rupa Could you please look into this?
Hello,
I may use an outdated version of zsh for it to work with z.sh, but I got the following error when running ". z.sh" from the shell:
.sh/unix/z.sh:19: unmatched '
so I checked the source code, and found out there's a multiline string starting from line 19. So I added "" the end of lines for the whole string, and then I had the same error for the following one, starting around line 50, which I solved the same way. But then, the precmd fails with the following:
_z_precmd:1: unrecognized modifier `A'
and the script does not work at all. Will upgrading my zsh solve this (or those?) issues? or is there something wrong in my configuration (I got a lot of things configured in my zsh)? or is there something wrong with repository's HEAD?
mkdir somenewdir
z somenewdir
The above case will fail, and this patch fixes that case. A side-effect is that if you try to z
to a dir which doesn't exist, then you'll get a cd error saying the dir does not exist.
it would be nice if there was a fallback to regular directory tab completion too, but I didn't focus on that.
Utilizes a trick - backticks work both where a command is expected and where an argument is expected, so we don't need to worry about whether or not PROMPT_COMMAND was empty to start with, or whether it ended with a semicolon.
This is safe to do because the call to _z will never print anything out (thanks to the &>/dev/null). It behaves as a no-op in the command position, and doesn't affect the number of arguments passed to the command if this comes in the argument position (since it's not quoted and the expansion is empty).
Fixes #90
After upgrading my mac to 14.1.1 Sonoma, tab completion stopped working. I tried reinstalling it, but no success. Any ideas?
I had recently observed many .z.* files in my home. I tracked this down to the env
command used by z.sh. I aliased it to env | sort
. In this case, the temporary files are not removed correctly.
As I'm not the only one with the problem, I suggest to use /usr/bin/env
in z.sh.
The problem was also reported on stackexchange
The .z database file isn't getting initialised on my machine. I can't work out why not.
I've put z.sh in my $HOME/.local/bin and sourced it in .bashrc, however, nothing happens when I navigate around in the shell and no .z file gets created at the default $HOME/.z location?
I have an alias for date
in my ~/.bash_aliases
file:
alias date='gdate "+%b %e %Y %l:%M:%S %P"'
When I run z
, I get an error:
> z deve
gdate: extra operand ‘+%s’
Try 'gdate --help' for more information.
That's because z
uses the aliased date
, and ends up trying to run gdate "+%b %e %Y %l:%M:%S %P" +%s
instead of date +%s
This PR updates the references to date
to use command
, so that it bypasses the alias and executes /bin/date
directly.
When using Z with https://www.warp.dev/ it does not show the autocompleted path. however it still does still send you there after hitting enter, just the autocomplete isn't showed
Longtime user and fan of z.sh. After many attempts to no avail at debugging the following, I'm opening this issue for discussion.
I'm running two machines, a macOS (local) and an Ubuntu (remote,) with the same dotfiles and shell configuration. Both are running the same version of bash (5.1.16(1)
.) Both shells are interactive login shells. And yet, when z.sh
is sourced, the macOS shell prompt experiences a short but highly noticeable lag on each Return
press, while the Ubuntu prompt is rendered instantly.
I was wondering if anyone else is experiencing the same issue (or similar) and how to fix — if possible.
Shell environment settings: (also available in my repo)
~/.bash_profile
which sources three different bash files where.shell/utils.sh
is relevant for our case~/.shell/utils
which exportsPROMPT_COMMAND
withhistory -a
and at the end of the file sourcesz.sh
from a specific directory:
export PROMPT_COMMAND="history -a"
# other lines...
# point to and source z in order to track and build dir list
. $HOME/.bin/z.sh
- No other changes to
PROMPT_COMMAND
or other shell configurations occur at the shell level after sourcingz.sh
above.
As such, the PROMPT_COMMAND
reads: history -a (_z --add "$(command pwd -P 2>/dev/null)" 2>/dev/null &);
$HOME/.bin/z.sh
reflects the latest version from the master brach.
This has been also tested on a fresh macOS virtual machine with the same results.