每天在终端里 cd 到项目目录,是不是还在靠 Tab 补全和一堆长路径?zoxide 是一个用 Rust 编写的智能 cd 替代品,它用 frecency(频率 × 时间衰减)算法默默记住你最常去的目录,之后只要输入几个模糊字符就能秒级跳转。本文从安装到 Shell 集成,再到与 fzf、chezmoi 的联动,带你把目录跳转效率拉满。
一、zoxide 是什么:用 frecency 重新定义 cd
传统 cd 每次都要打出完整(或接近完整)的相对 / 绝对路径;autojump 开创了“按访问频率跳转”的思路,而 zoxide 用 Rust 重写了这套体验,启动更快、跨平台一致,还顺手支持 nushell、fish 等现代 Shell。
1.1 从 cd 到 autojump 再到 zoxide
三者核心区别在“如何找到你想去的目录”:cd 靠你记路径;autojump 靠访问频率;zoxide 则引入 frecency——既看访问频率,也看最近一次访问的时间,越近、越频繁的目录权重越高,模糊匹配时排得更靠前。
1.2 frecency 算法:频率 × 时间衰减
当你进入某个目录,zoxide 会增加它的权重;随着时间推移,旧访问的权重会缓慢衰减。查询 z foo 时,它对所有匹配 “foo” 的目录按权重排序,返回最优解。这意味着你上个月天天去的目录,这个月不去了,它就会自动“降温”。
二、安装 zoxide(全平台)
zoxide 几乎覆盖了所有主流包管理器,挑一行执行即可:
# macOS
brew install zoxide
# Debian/Ubuntu (较新版本已收录)
sudo apt install zoxide
# Arch
pacman -S zoxide
# Windows (Scoop)
scoop install zoxide
# 任意平台,用 Rust 工具链
cargo install zoxide --locked
# Nix
nix-env -iA nixpkgs.zoxide
装完先敲 zoxide --version 验证;如果提示命令不存在,多半是 ~/.cargo/bin 或包管理器路径没进 PATH,把它加进 Shell 配置文件即可。
三、Shell 集成:让 z 命令生效
zoxide 本身不绑定某个 Shell,需要初始化脚本把 z、zi 等命令注入当前环境。下面是三种常见 Shell 的接法。
3.1 Bash / Zsh
# 写入 ~/.bashrc 或 ~/.zshrc
eval "$(zoxide init bash)"
# 如果你希望进入子目录时也自动记录(而非只在 cd 后),用 prompt hook
eval "$(zoxide init bash --hook prompt)"
3.2 Fish
# 写入 ~/.config/fish/config.fish
zoxide init fish | source
3.3 nushell(推荐搭配结构化管道)
如果你在用 nushell 结构化管道 重塑命令行工作流,zoxide 同样提供了原生集成:
# 生成集成脚本并持久化
zoxide init nushell | save -f $env.HOME/.zoxide.nu
# 在 env.nu 里 source 它
source $env.HOME/.zoxide.nu
四、核心命令:z / zi / za / zq / zr
初始化后,下面这组命令就是你的日常武器:
z foo | 跳转到路径中含 “foo” 且权重最高的目录 |
z foo bar | 先匹配 foo,再在其子目录里匹配 bar |
zi foo | 交互式列出候选,用方向键 / fzf 选择 |
za /path | 手动把一个目录加入数据库 |
zq foo | 只查询不跳转,输出匹配结果 |
zr foo | 从数据库中移除某个目录 |
最常用的是 z 和它带交互的兄弟 zi。比如你常去 ~/projects/alpha-api,以后只要 z alpha 就能直达,不用再敲长路径。
五、自动记录目录:prompt hook 与环境变量
默认情况下 zoxide 在你每次 cd 后记录目录。如果你想让任意方式进入的目录都被记住(例如在脚本或别名里切换),用 --hook prompt 在每次提示符渲染时记录当前目录。此外,几个环境变量能微调行为:
_ZO_ECHO | 设为 1,跳转后打印目标路径,方便确认 |
_ZO_RESOLVE_SYMLINKS | 设为 1,存储时解析符号链接为真实路径 |
_ZO_MAXAGE | 条目最大年龄(天),过期自动淘汰,默认 10000 |
ZO_DATA_DIR | 数据库目录,默认 ~/.local/share/zoxide |
# 写入 ~/.bashrc
export _ZO_ECHO=1
export _ZO_RESOLVE_SYMLINKS=1
export ZO_DATA_DIR="$HOME/.local/share/zoxide"
六、与 fzf 联动:交互式模糊跳转
zi 已经内置了交互选择,但如果你想要更顺手的 fzf 体验,可以包一层函数:
z() {
cd "$(zoxide query -i -- "$@")"
}
把这段加进 Shell 配置,z 就会弹出 fzf 面板,输入任意片段即可在已知目录里模糊检索并回车跳转。配合 fzf 的多选、预览,在大仓库丛里找目录尤其爽。
七、多机同步:用 chezmoi 管理 zoxide 数据
你在公司机和家里机都装了 zoxide,却各自记各自的目录?把它的数据库交给 chezmoi 管理 dotfiles 就能无缝同步:
# 把数据库文件纳入 chezmoi 管理
chezmoi add "$HOME/.local/share/zoxide/db.zo"
# 或者用软链方式,让 zoxide 直接读写 chezmoi 源里的副本
ln -sf "$HOME/.local/share/chezmoi/dot_local/share/zoxide/db.zo" "$HOME/.local/share/zoxide/db.zo"
这样重装系统或换新机,只要 chezmoi apply,你多年积累的目录权重立刻归位。
八、从 autojump 迁移
老 autojump 用户不必从头养数据,一条命令导入:
zoxide import --from autojump ~/.local/share/autojump/autojump.txt
导入后权重会被换算成 zoxide 的格式,原来的跳转习惯基本无缝延续。
九、和 Docker / VS Code / CI 的协作场景
zoxide 不只服务交互终端:在 Docker 容器编排 的开发容器里装上它,进服务目录快人一步;把它写进 VS Code 的 devcontainer / 终端配置,团队新人的环境开箱即用;甚至在 GitHub Actions 流水线 的调试步骤里临时跳转定位产物目录也好用。
十、常见问题与排障
z 无反应 / 命令找不到 | 确认初始化脚本已写进正确的 rc 文件并重新打开终端;Bash 用重开 session 验证 |
| 跳转结果不是想要的目录 | 用 zq 关键词 查看权重排序,zr 错误项 删掉脏数据,多用一段时间让它学习 |
| 数据库在哪 | 默认 ~/.local/share/zoxide/db.zo,可用 ZO_DATA_DIR 改 |
| 想彻底重置 | 直接删除 db.zo 文件,下次进入目录会重新建立 |
总结
zoxide 用极小的成本换来了线性的目录跳转效率提升:装好、初始化、记住你常去的目录,之后全靠模糊关键词。再叠加 fzf 交互、chezmoi 同步、autojump 导入,它就是终端里那个“越用越懂你”的 cd。如果你还在手敲长路径,今天就把 zoxide 装上吧。




