经常要 cd ~/projects/my-app/src/components 这种长路径——zoxide
让你只打部分名字就能跳过去。它会自动学习你访问过的目录及频率,
下次靠模糊匹配 + 频率排序找最可能的目标。
安装
# Debian 12+ / Ubuntu 22.04+
sudo apt install -y zoxide
# 或 cargo install zoxide
zoxide --version
集成到 shell
# bash: ~/.bashrc
eval "$(zoxide init bash)"
# zsh: ~/.zshrc
eval "$(zoxide init zsh)"
# fish: ~/.config/fish/config.fish
zoxide init fish | source
zoxide init 注入一个 z 函数 + Tab completion + 命令钩子。
重新加载 shell 后开始用。
用法
cd ~/projects/my-app/src/components # 第一次像往常一样 cd
# zoxide 学到这个目录
cd ~/projects/other-app # 再去别处
# ...
# 之后只打部分名字:
z components # → ~/projects/my-app/src/components
z my-app # → ~/projects/my-app
z proj # → ~/projects/my-app(最近访问 + 频率高的)
匹配规则:
- 子串匹配(不是 fuzzy)
- 按 "frecency" 排序:frequency × recency 的组合分
- 最近访问 + 经常去的最优先
交互式选择(zi)
不确定哪个:
zi compon
# 弹出 fzf 让你选
需要装 fzf。zi 是 zoxide 的交互模式。
多 token
z my src # 必须同时含 "my" 和 "src"
z app /home # 用 / 把不同部分隔开
列 / 清理
z -l # 列所有记录的目录(按 frecency)
z -l projects # 列匹配 "projects" 的
zoxide remove ~/old-dir # 删某条
和原生 cd 共存
z 是新加的命令,cd 还是 cd。一些人喜欢 alias:
alias cd='z' # 重激进;遇到 z 没记录的目录还是会回退到 cd
我个人保留 cd 给一级目录(cd ~、cd /etc、cd ..),
z 用于深层项目目录。
与 fzf / starship 配合
# 用 fzf 浏览全部记录
zoxide query --interactive
# 等价于 zi
starship prompt 不影响 z,但 z 命令很快所以 prompt 渲染不会卡。
实际工作流改变
之前:
cd ~/projects/myapp
cd ../another-app/backend/src/main
cd ../../../config
之后:
z myapp
z main
z config
每次 1-2 个字符,速度感受非常明显。
数据存哪
~/.local/share/zoxide/db.zo,纯二进制文件。换机器导出 + 导入:
zoxide query --list --score > z.bak # 导出
# 新机器
cat z.bak | while read line; do
score=$(echo "$line" | awk '{print $1}')
path=$(echo "$line" | cut -d' ' -f2-)
zoxide add "$path"
done
或者干脆删掉重新养——通常一周就练熟。
与 docker / container 的限制
在容器内 zoxide 数据库是独立的,不会自动同步主机的。挂载主机的
~/.local/share/zoxide 也行,但容器路径和主机路径不一样时跳进
不存在的目录。容器开发一般不用 z。
高级 hooks
zoxide 在每次 cd / pwd 改变时记录目录。修改 _z_dir_hook:
# 只记录 git 仓库根目录
_zoxide_should_add() {
git -C "$PWD" rev-parse --show-toplevel >/dev/null 2>&1
}
通常默认就够,不必魔改。
踩过的坑
- 装了但 z 命令不工作:忘了
eval "$(zoxide init bash)"或者放在了
rc 文件错的位置。type z确认是个函数而不是 alias。 z foo跳到完全无关的目录:第一次访问陌生路径优先匹配最高频的记录;
解决办法cd /full/path/to/foo让 zoxide 学一下。- 老 NFS 目录 unmount 后 zoxide 仍记着,每次 z 这个名字报错 "no
directory matched"。zoxide remove '/old/nfs/*'清掉。 - 同名目录在多个项目下:z 只给一个结果(frecency 最高)。要别的版本
用zi name交互选。
登录后参与评论。