zoxide(z)替代 cd:按访问频率跳目录

经常要 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 让你选

需要装 fzfzi 是 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 /etccd ..),
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 交互选。
精确评价 共 0 人评价
可复现性
可复现 · 0 不可复现 · 0
文风
文风流畅 · 0 文风晦涩 · 0
立场
支持 · 0 反对 · 0

登录后即可对本帖作出评价。

评论区 0 条 · 所有人可在此交流

登录后参与评论。

还没有评论,来说两句。