<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Zoxide on recca0120 Tech Notes</title><link>https://recca0120.github.io/en/tags/zoxide/</link><description>Recent content in Zoxide on recca0120 Tech Notes</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Mon, 13 Apr 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://recca0120.github.io/en/tags/zoxide/index.xml" rel="self" type="application/rss+xml"/><item><title>zoxide: Give cd a Memory — Jump to Any Directory in Two Keystrokes</title><link>https://recca0120.github.io/en/2026/04/13/zoxide-smarter-cd/</link><pubDate>Mon, 13 Apr 2026 10:00:00 +0800</pubDate><guid>https://recca0120.github.io/en/2026/04/13/zoxide-smarter-cd/</guid><description>&lt;img src="https://recca0120.github.io/" alt="Featured image of post zoxide: Give cd a Memory — Jump to Any Directory in Two Keystrokes" /&gt;&lt;p&gt;My projects are scattered across a handful of directories with long, inconsistent paths. For years I either mashed &lt;code&gt;cd ~/some/long/path&amp;lt;TAB&amp;gt;&lt;/code&gt; or dragged folders from Finder into the terminal. Then I installed &lt;a class="link" href="https://github.com/ajeetdsouza/zoxide" target="_blank" rel="noopener"
 &gt;zoxide&lt;/a&gt;. Now two or three characters is all it takes.&lt;/p&gt;
&lt;p&gt;The trick is that my &lt;code&gt;cd&lt;/code&gt; is no longer a shell builtin. It&amp;rsquo;s zoxide&amp;rsquo;s replacement — same behavior as the original, plus memory.&lt;/p&gt;
&lt;h2 id="what-frecency-means"&gt;&lt;a href="#what-frecency-means" class="header-anchor"&gt;&lt;/a&gt;What frecency Means
&lt;/h2&gt;&lt;p&gt;zoxide&amp;rsquo;s algorithm is called frecency (frequency + recency). Every directory you visit earns a score that climbs with use and decays over time. Type &lt;code&gt;cd foo&lt;/code&gt; and zoxide searches its database for paths containing &lt;code&gt;foo&lt;/code&gt;, then jumps to the highest-scoring one.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what the database looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zoxide query --score &lt;span class="p"&gt;|&lt;/span&gt; head -5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 230.0 /Users/demo/projects/frontend
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 215.3 /Users/demo/work/api-server
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 198.7 /Users/demo/blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 142.1 /Users/demo/oss/some-tool
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 98.5 /Users/demo/Downloads
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Frequently visited projects float to the top; stale ones sink. Data lives in a local file — fully offline, no network calls.&lt;/p&gt;
&lt;h2 id="install-and-init"&gt;&lt;a href="#install-and-init" class="header-anchor"&gt;&lt;/a&gt;Install and Init
&lt;/h2&gt;&lt;p&gt;macOS via Homebrew:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew install zoxide
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Linux one-liner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then initialize in your shell config. &lt;strong&gt;The key decision is whether to use &lt;code&gt;--cmd cd&lt;/code&gt;&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Mode&lt;/th&gt;
 &lt;th&gt;Command&lt;/th&gt;
 &lt;th&gt;Effect&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Default&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;zoxide init &amp;lt;shell&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Adds &lt;code&gt;z&lt;/code&gt;, &lt;code&gt;zi&lt;/code&gt; commands. Builtin &lt;code&gt;cd&lt;/code&gt; untouched&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Replace cd&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;zoxide init --cmd cd &amp;lt;shell&amp;gt;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Replaces &lt;code&gt;cd&lt;/code&gt; outright&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I went with the latter. I use &lt;a class="link" href="https://recca0120.github.io/en/2024/auto-venv-fish/" &gt;fish shell&lt;/a&gt;, so my config reads:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fish" data-lang="fish"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# ~/.config/fish/config.fish
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;zoxide&lt;/span&gt; init &lt;span class="na"&gt;--cmd&lt;/span&gt; cd &lt;span class="nb"&gt;fish&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;For zsh / bash, use eval:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.zshrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;zoxide init --cmd &lt;span class="nb"&gt;cd&lt;/span&gt; zsh&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Why replace &lt;code&gt;cd&lt;/code&gt; wholesale? Because zoxide&amp;rsquo;s &lt;code&gt;cd&lt;/code&gt; is a &lt;strong&gt;superset&lt;/strong&gt; of the builtin: absolute paths, relative paths, &lt;code&gt;cd -&lt;/code&gt;, &lt;code&gt;cd ..&lt;/code&gt; all still work. Frecency lookup only kicks in when the argument isn&amp;rsquo;t a valid path. No regression risk.&lt;/p&gt;
&lt;h2 id="three-daily-workflows"&gt;&lt;a href="#three-daily-workflows" class="header-anchor"&gt;&lt;/a&gt;Three Daily Workflows
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;1. Keyword jumps.&lt;/strong&gt; Skip full paths — just type a fragment of the directory name:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; blog &lt;span class="c1"&gt;# → ~/work/personal-blog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; api &lt;span class="c1"&gt;# → ~/work/api-server&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; dotfiles &lt;span class="c1"&gt;# → ~/config/dotfiles&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. Multi-keyword filtering.&lt;/strong&gt; When names collide, chain keywords to narrow down:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; work blog &lt;span class="c1"&gt;# → ~/work/personal-blog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; client api &lt;span class="c1"&gt;# → ~/work/client-project/api&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Match rule: every keyword must appear in the path, and the last one must be in the final segment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Interactive selection via &lt;code&gt;zi&lt;/code&gt;.&lt;/strong&gt; When you can&amp;rsquo;t recall the keyword or have multiple candidates:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cdi &lt;span class="c1"&gt;# since I used --cmd cd, zi becomes cdi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This opens an &lt;a class="link" href="https://github.com/junegunn/fzf" target="_blank" rel="noopener"
 &gt;fzf&lt;/a&gt; UI listing all candidates with live fuzzy filtering. Install fzf first if you haven&amp;rsquo;t: &lt;code&gt;brew install fzf&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="advanced-tricks"&gt;&lt;a href="#advanced-tricks" class="header-anchor"&gt;&lt;/a&gt;Advanced Tricks
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Space-triggered completion.&lt;/strong&gt; In fish, typing &lt;code&gt;cd mydir&amp;lt;SPACE&amp;gt;&lt;/code&gt; lists multiple candidates — handy when directories share names. Fish users can also install an enhanced completion pack:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fisher install icezyclon/zoxide.fish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Query without jumping.&lt;/strong&gt; Preview where zoxide would take you, without actually going:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zoxide query blog
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# → /Users/demo/work/personal-blog&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zoxide query --list blog &lt;span class="c1"&gt;# list all matches&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zoxide query --score &lt;span class="c1"&gt;# view frecency scores&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Manually register a directory.&lt;/strong&gt; For a freshly cloned project you haven&amp;rsquo;t visited yet:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zoxide add ~/projects/new-repo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Exclude noise.&lt;/strong&gt; &lt;code&gt;/tmp&lt;/code&gt;, &lt;code&gt;node_modules&lt;/code&gt;, and friends clutter the database:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fish" data-lang="fish"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;-gx&lt;/span&gt; &lt;span class="nv"&gt;_ZO_EXCLUDE_DIRS&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/tmp/*&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*/node_modules/*&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.cache/*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Echo destination before jumping.&lt;/strong&gt; Helps catch wrong jumps:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fish" data-lang="fish"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="na"&gt;-gx&lt;/span&gt; &lt;span class="nv"&gt;_ZO_ECHO&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Migrate from older tools.&lt;/strong&gt; autojump, fasd, z.lua all have import paths:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zoxide import --from&lt;span class="o"&gt;=&lt;/span&gt;autojump ~/.local/share/autojump/autojump.txt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zoxide import --from&lt;span class="o"&gt;=&lt;/span&gt;z ~/.z
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="combining-with-yazi-and-tmux"&gt;&lt;a href="#combining-with-yazi-and-tmux" class="header-anchor"&gt;&lt;/a&gt;Combining with yazi and tmux
&lt;/h2&gt;&lt;p&gt;My &lt;code&gt;.zshrc&lt;/code&gt; has a function &lt;code&gt;y&lt;/code&gt; that syncs &lt;a class="link" href="https://github.com/sxyazi/yazi" target="_blank" rel="noopener"
 &gt;yazi&lt;/a&gt;&amp;rsquo;s final directory back to the shell on exit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fish" data-lang="fish"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;y&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;mktemp&lt;/span&gt; &lt;span class="na"&gt;-t&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;yazi-cwd.XXXXXX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;yazi&lt;/span&gt; &lt;span class="nv"&gt;$argv&lt;/span&gt; &lt;span class="na"&gt;--cwd-file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$tmp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;set&lt;/span&gt; &lt;span class="nv"&gt;cwd&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cat&lt;/span&gt; &lt;span class="na"&gt;-- &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$tmp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cwd&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cwd&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;cd&lt;/span&gt; &lt;span class="na"&gt;-- &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$cwd&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="c"&gt;# this cd is zoxide
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;rm&lt;/span&gt; &lt;span class="na"&gt;-f&lt;/span&gt; &lt;span class="na"&gt;-- &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$tmp&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The trailing &lt;code&gt;cd&lt;/code&gt; is zoxide&amp;rsquo;s version, so directories I browse through yazi also feed into the frecency database. The two tools cross-pollinate — both get smarter with use.&lt;/p&gt;
&lt;p&gt;In tmux, each pane is its own shell, but zoxide&amp;rsquo;s database is shared globally. Visit a directory in pane A and pane B can jump there with &lt;code&gt;cd foo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="when-not-to-use-cmd-cd"&gt;&lt;a href="#when-not-to-use-cmd-cd" class="header-anchor"&gt;&lt;/a&gt;When Not to Use &amp;ndash;cmd cd
&lt;/h2&gt;&lt;p&gt;Honestly, &lt;code&gt;--cmd cd&lt;/code&gt; isn&amp;rsquo;t uncontroversial. Arguments against overriding the builtin:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Shell scripts might accidentally inherit zoxide behavior&lt;/li&gt;
&lt;li&gt;Shared terminals could confuse other users&lt;/li&gt;
&lt;li&gt;Certain &lt;code&gt;cd&lt;/code&gt; edge cases (like &lt;code&gt;CDPATH&lt;/code&gt;) may behave differently&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;zoxide&amp;rsquo;s implementation only overrides &lt;code&gt;cd&lt;/code&gt; in &lt;strong&gt;interactive shells&lt;/strong&gt;, so the first concern is mostly academic. But if you value purity, sticking with the default &lt;code&gt;z&lt;/code&gt; / &lt;code&gt;zi&lt;/code&gt; gets you 95% of the benefit — you just have to pause each time to pick &lt;code&gt;cd&lt;/code&gt; vs. &lt;code&gt;z&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Personally, I prefer &lt;code&gt;--cmd cd&lt;/code&gt;. Muscle memory doesn&amp;rsquo;t want to change, so the tool should adapt to the human, not the other way around.&lt;/p&gt;
&lt;h2 id="references"&gt;&lt;a href="#references" class="header-anchor"&gt;&lt;/a&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/ajeetdsouza/zoxide" target="_blank" rel="noopener"
 &gt;zoxide GitHub Repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://zoxide.org/" target="_blank" rel="noopener"
 &gt;zoxide Official Tutorials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://batsov.com/articles/2025/06/12/zoxide-tips-and-tricks/" target="_blank" rel="noopener"
 &gt;zoxide: Tips and Tricks — Bozhidar Batsov&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/junegunn/fzf" target="_blank" rel="noopener"
 &gt;fzf Fuzzy Finder&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/icezyclon/zoxide.fish" target="_blank" rel="noopener"
 &gt;icezyclon/zoxide.fish — enhanced fish completions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>