Special thanks to:
|
Warp, built for coding with multiple AI agents.
Available for macOS, Linux, and Windows.
Visit
warp.dev
to learn more.
|
Processing over 3TB/s of video at peak load,
now hiring in SF.
|
zoxide is a smarter cd command, inspired by z and autojump.
It remembers which directories you use most frequently, so you can "jump" to
them in just a few keystrokes.
zoxide works on all major shells.
Getting started • Installation • Configuration • Integrations
z foo # cd into highest ranked directory matching foo
z foo bar # cd into highest ranked directory matching foo and bar
z foo / # cd into a subdirectory starting with foo
z ~/foo # z also works like a regular cd command
z foo/ # cd into relative path
z .. # cd one level up
z - # cd into previous directory
zi foo # cd with interactive selection (using fzf)
zoxide feedback foo --path ~/the/intended/directory
# teach zoxide that a directory is the intended result
z foo<SPACE><TAB> # show interactive completions (bash 4.4+/fish/zsh only)Read more about the matching algorithm here.
zoxide query, z, and zi use the unified fuzzy-rank::path::fuzzy adaptor
and one globally comparable result type. Exact basename-component matches are
strong enough to stop further work. If exact candidates only have a weaker
ancestor, component, or substring signal, zoxide also evaluates typo
candidates and merges the two sets. This prevents a weak exact ancestor from
hiding a better basename typo. _ZO_TYPO_FALLBACK=0 disables that additional
typo pass without disabling exact matching. zi evaluates every path through
the same unified matcher because its purpose is to display all selectable
results.
The fuzzy-rank comparator uses this fifteen-stage ordering:
[PATH.EXACT_BASENAME_COMPONENT]Exact whole query-token phrase in the basename component.[PATH.EXACT_COMPONENT]Exact whole query-token phrase in any component.[CORE.EXACT_PHRASE_PRESENT]Exact whole-query phrase presence within one path component.[CORE.EXACT_SUBPHRASE_COUNTS_VECTOR]Exact proper contiguous query-token subphrase-presence vector, descending and lexicographic.[CORE.EXACT_COVERAGE]Exact distinct query-token coverage, descending.[PATH.ORDERED_COMPOUND_COVERAGE]Ordered query coverage reconstructed across path-token boundaries.[CORE.ALIGNMENT_COST_VECTOR]Alignment and fragmentation cost, worst alignment first.[CORE.ORDER_VIOLATION_DISTANCE]Query-to-candidate token assignment inversion count, ascending.[PATH.SEGMENT_VECTOR]Segment-count vector, preferring the basename and then nearer ancestors.[CORE.POSITION_VECTOR_SIMPLE]Whole-or-prefix/suffix/middle count vector, descending and lexicographic.[CORE.SCORE_DESC]Caller-provided frecency score, descending.[CORE.TYPO_COST_VECTOR]Per-query-token weighted core typo costs, worst cost first.[CORE.INSERTION_VECTOR]Per-query-token candidate-side insertion counts, worst count first.[PATH.DEPTH]Path depth, ascending.[CORE.KEY_ASC]Path string, ascending.
Each bracketed name identifies the fuzzy-rank code implementing that stage.
TypoMatch.exact is retained as result provenance for the exact fallback and
ambiguity policy; it is not an additional sort key. Repeated names in other
adaptors mean the implementation is genuinely shared.
These are strict lexicographic pipelines, not independently weighted scores. Each stage partitions only candidates tied at every preceding stage; a later key cannot compensate for a worse earlier key. Comparison code accesses subordinate keys only when the preceding keys compare equal. Non-interactive matching skips the entire typo alignment stage when the exact partition is non-empty. Metrics emitted together by one required typo alignment are retained rather than recomputing that alignment once per key.
The path-specific keys mean:
segmentis0for the basename,1for its parent,2for the next parent, and so on. Multi-token matches average their matched segment values.positionis0at the start of a matched segment token,1at its end, and2in its middle. Multi-token matches sum their position values.insertionsis candidate-side text not covered by the selected match.cis the shared weighted typo cost. Exact matches always displayc=0.- Exact phrase runs use token-prefix exactness and never cross a path separator.
- Exact distinct coverage can collect query tokens from different path components.
First-result queries scan eligible database entries through this staged ordering, retain only a bounded top-result shortlist, and check filesystem existence while building that shortlist when required. Interactive and list modes use the same comparator. Weak exact and typo candidates are merged for non-interactive selection when no exact basename candidate exists.
zoxide records successful single-result and interactive selections in
preferences.zo beside db.zo. The file is bounded and independent of the
directory database. A query-to-directory preference is considered after the
hard exact-basename rule and before the generic comparator, so repeated choices
can resolve ambiguities without allowing a remembered preference to defeat a
direct exact basename match.
Use zoxide feedback <keywords...> --path <directory> when a query selected the
wrong directory. This records an explicit correction without requiring a second
interactive search. When the intended directory was among the matched
candidates, the same command also performs a bounded pairwise update to a
compact linear path model stored in preferences.zo. The model is inactive
until explicit feedback supplies a preference signal, so ordinary queries keep
the existing lazy comparator cost. Preference lookup and model inference are
in-process and perform no additional filesystem work.
Interactive zi / cdi rows are displayed as:
<frecency> c=<core cost> s=<segment> p=<position> i=<insertions> <path>
Interactive queries do not preflight every database path with filesystem metadata
before opening the picker. This prevents a cold HDD containing an old directory
entry from delaying the initial results. The selected path is validated after
selection unless --all was requested. Non-interactive queries filter stale
entries while building their bounded exact and typo candidate sets, so a cold
drive can still be touched when those paths are eligible for a non-interactive
result.
s,p, andiexpose the path-specific ranking inputs.- The display order does not change the comparator hierarchy above.
- Exact rows show
c=0; typo rows show their weighted core cost.
zoxide can be installed in 4 easy steps:
-
Install binary
zoxide runs on most major platforms. If your platform isn't listed below, please open an issue.
Linux / WSL
The recommended way to install zoxide is via the install script:
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | shOr, you can use a package manager:
Distribution Repository Instructions Any crates.io cargo install zoxide --lockedAny asdf asdf plugin add zoxide https://github.com/nyrst/asdf-zoxide.git
asdf install zoxide latestAny conda-forge conda install -c conda-forge zoxideAny guix guix install zoxideAny Linuxbrew brew install zoxideAny nixpkgs nix-env -iA nixpkgs.zoxideAlpine Linux 3.13+ Alpine Linux Packages apk add zoxideArch Linux Arch Linux Extra pacman -S zoxideDebian1Debian Packagesapt install zoxideDevuan 4.0+ Devuan Packages apt install zoxideExherbo Linux Exherbo packages cave resolve -x repository/rust
cave resolve -x zoxideFedora 32+ Fedora Packages dnf install zoxideGentoo Gentoo Packages emerge app-shells/zoxideManjaro pacman -S zoxideopenSUSE Tumbleweed openSUSE Factory zypper install zoxideParrot OS1apt install zoxideRaspbian1Raspbian Packagesapt install zoxideRhino Linux Pacstall Packages pacstall -I zoxide-debSlackware 15.0+ SlackBuilds Instructions Solus Solus Packages eopkg install zoxideUbuntu1Ubuntu Packagesapt install zoxideVoid Linux Void Linux Packages xbps-install -S zoxidemacOS
To install zoxide, use a package manager:
Repository Instructions crates.io cargo install zoxide --lockedHomebrew brew install zoxideasdf asdf plugin add zoxide https://github.com/nyrst/asdf-zoxide.git
asdf install zoxide latestconda-forge conda install -c conda-forge zoxideMacPorts port install zoxidenixpkgs nix-env -iA nixpkgs.zoxideOr, run this command in your terminal:
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | shWindows
zoxide works with PowerShell, as well as shells running in Cygwin, Git Bash, and MSYS2.
The recommended way to install zoxide is via
winget:winget install ajeetdsouza.zoxide
Or, you can use an alternative package manager:
Repository Instructions crates.io cargo install zoxide --lockedChocolatey choco install zoxideconda-forge conda install -c conda-forge zoxideScoop scoop install zoxideIf you're using Cygwin, Git Bash, or MSYS2, you can also use the install script:
curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | shBSD
To install zoxide, use a package manager:
Distribution Repository Instructions Any crates.io cargo install zoxide --lockedDragonFly BSD DPorts pkg install zoxideFreeBSD FreshPorts pkg install zoxideNetBSD pkgsrc pkgin install zoxideOr, run this command in your terminal:
curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bashAndroid
To install zoxide, use a package manager:
Repository Instructions Termux pkg install zoxideOr, run this command in your terminal:
curl -sS https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | bash -
Setup zoxide on your shell
To start using zoxide, add it to your shell.
Bash
Add this to the end of your config file (usually
~/.bashrc):eval "$(zoxide init bash)"
Elvish
Add this to the end of your config file (usually
~/.elvish/rc.elv):eval (zoxide init elvish | slurp)
Note: zoxide only supports elvish v0.18.0 and above.
Fish
Add this to the end of your config file (usually
~/.config/fish/config.fish):zoxide init fish | source
Nushell
Add this to the end of your env file (find it by running
$nu.env-pathin Nushell):zoxide init nushell | save -f ~/.zoxide.nu
Now, add this to the end of your config file (find it by running
$nu.config-pathin Nushell):source ~/.zoxide.nu
Note: zoxide only supports Nushell v0.89.0+.
PowerShell
Add this to the end of your config file (find it by running
echo $profilein PowerShell):Invoke-Expression (& { (zoxide init powershell | Out-String) })
Tcsh
Add this to the end of your config file (usually
~/.tcshrc):zoxide init tcsh > ~/.zoxide.tcsh source ~/.zoxide.tcsh
Xonsh
Add this to the end of your config file (usually
~/.xonshrc):execx($(zoxide init xonsh), 'exec', __xonsh__.ctx, filename='zoxide')
Zsh
Add this to the end of your config file (usually
~/.zshrc):eval "$(zoxide init zsh)"
For completions to work, the above line must be added after
compinitis called. You may have to rebuild your completions cache by runningrm ~/.zcompdump*; compinit.Any POSIX shell
Add this to the end of your config file:
eval "$(zoxide init posix --hook prompt)"
Note: Warp provides its own completions, so
Space+Tabcompletions are not supported there. -
Install fzf (optional)
fzf is a command-line fuzzy finder, used by zoxide for completions / interactive selection. It can be installed from here.
Note: The minimum supported fzf version is v0.51.0.
-
Import your data (optional)
If you currently use any of these plugins, you may want to import your data into zoxide. The data file is auto-detected using each plugin's standard conventions.
zoxide import <plugin>
Plugin Command atuin zoxide import atuinautojump zoxide import autojumpfasd zoxide import fasdz zoxide import zz.lua zoxide import z.luazsh-z zoxide import zsh-z
When calling zoxide init, the following flags are available:
-
--cmd- Changes the prefix of the
zandzicommands. --cmd jwould change the commands to (j,ji).--cmd cdwould replace thecdcommand.
- Changes the prefix of the
-
--hook <HOOK>-
Changes how often zoxide increments a directory's score:
Hook Description noneNever promptAt every shell prompt pwd(default)Whenever the directory is changed
-
-
--no-cmd- Prevents zoxide from defining the
zandzicommands. - These functions will still be available in your shell as
__zoxide_zand__zoxide_zi, should you choose to redefine them.
- Prevents zoxide from defining the
Environment variables2 can be used for configuration. They must be set before
zoxide init is called.
-
_ZO_DATA_DIR-
Specifies the directory in which the database is stored.
-
The default value varies across OSes:
OS Path Example Linux / BSD $XDG_DATA_HOMEor$HOME/.local/share/home/alice/.local/sharemacOS $HOME/Library/Application Support/Users/Alice/Library/Application SupportWindows %LOCALAPPDATA%C:\Users\Alice\AppData\Local
-
-
_ZO_ECHO- When set to 1,
zwill print the matched directory before navigating to it.
- When set to 1,
-
_ZO_EXCLUDE_DIRS-
Excludes the specified directories from the database.
-
This is provided as a list of globs, separated by OS-specific characters:
OS Separator Example Linux / macOS / BSD :$HOME:$HOME/private/*Windows ;$HOME;$HOME/private/* -
By default, this is set to
"$HOME".
-
-
_ZO_FZF_OPTS -
_ZO_MAXAGE- Configures the aging algorithm, which limits the maximum number of entries in the database.
- By default, this is set to 10000.
-
_ZO_RESOLVE_SYMLINKS- When set to 1,
zwill resolve symlinks before adding directories to the database.
- When set to 1,
| Application | Description | Plugin |
|---|---|---|
| aerc | Email client | Natively supported |
| alfred | macOS launcher | alfred-zoxide |
| clink | Improved cmd.exe for Windows | clink-zoxide |
| emacs | Text editor | zoxide.el |
| felix | File manager | Natively supported |
| joshuto | File manager | Natively supported |
| lf | File manager | See the wiki |
| nnn | File manager | nnn-autojump |
| ranger | File manager | ranger-zoxide |
| raycast | macOS launcher | raycast-zoxide |
| rfm | File manager | Natively supported |
| sesh | tmux session manager |
Natively supported |
| telescope.nvim | Fuzzy finder for Neovim | telescope-zoxide |
| tmux-session-wizard | tmux session manager |
Natively supported |
| tmux-sessionx | tmux session manager |
Natively supported |
| vim / neovim | Text editor | zoxide.vim |
| xplr | File manager | zoxide.xplr |
| xxh | Transports shell configuration over SSH | xxh-plugin-prerun-zoxide |
| yazi | File manager | Natively supported |
| zabb | Finds the shortest possible query for a path | Natively supported |
| zesh | zellij session manager |
Natively supported |
| zsh-autocomplete | Realtime completions for zsh | Natively supported |