快速目录跳转工具 zoxide 使用指南

前言

以前我在 Mac 上一直使用一个 z 命令的工具,可以通过片段、关键词快速跳转到曾经访问过的目录,在频繁切换项目目录时极其方便。入职新公司后拿到了一台全新的 Mac,当时却一时想不起来当时用的是什么了(后来在自己电脑看了一下,使用的是 zsh-z,是 zsh 的一个插件)。

原本打算安装 autojump,但偶然发现一个 star 数超过 28k 的替代品 ------ zoxide,尝试之后发现它也很不错,使用更简洁、同时能保留我使用 z 命令的习惯,因此决定整理成一篇文档分享。

Zoxide

zoxide 是一个比传统 cd 命令更智能的目录跳转工具,灵感来源于 zautojump,并在它们的基础上做了大量优化。它通过记录你访问过的路径及其频率,构建权重系统,使得你只需输入目录名称的关键词即可完成快速跳转。

与其他类似工具不同的是:

  • 跨平台支持(Linux/macOS/Windows)
  • 支持 多种 shell(bash/zsh/fish/pwsh/elvish)
  • 基于 Rust 实现,性能优异
  • 支持 自动补全交互式模糊查询
  • 简洁一致的语法,几乎无学习成本

安装

由于我个人环境是 Mac + Zsh,如果是其他操作系统和 Shell 需要参考官方文档安装。

1. 安装 zoxide

推荐使用 Homebrew 安装(macOS):

bash 复制代码
brew install zoxide

然后将初始化脚本添加到你的 shell 配置文件中(如 .zshrc):

bash 复制代码
eval "$(zoxide init zsh)"

安装完成后,重启终端或执行 source ~/.zshrc 生效。

2. 安装 FZF(可选但强烈推荐)

FZF 是一个通用命令行模糊查找器,可增强 zoxide 的交互体验:

bash 复制代码
brew install fzf

安装完成后即可使用 zi(zoxide 自带的 fzf 命令)。

快速上手

zoxide 提供了类似 cdz 命令:

bash 复制代码
z foo              # 进入与 foo 匹配度最高的目录
z foo bar          # 进入同时匹配 foo 和 bar 的最高评分目录
z foo /            # 进入以 foo 开头的子目录

z ~/foo            # z 也可以像普通的 cd 命令一样使用
z foo/             # 进入相对路径
z ..               # 返回上一级目录
z -                # 返回上一个目录

zi foo             # 使用交互式选择进入目录(基于 fzf)

z foo<空格><TAB>   # 显示交互式补全(zoxide v0.8.0+,支持 bash 4.4+/fish/zsh)

每次使用 zcd 命令进入目录时,都会自动记录路径。

zoxide + fzf 模糊跳转增强

虽然 zoxide 默认支持子串匹配,但不支持真正意义上的模糊搜索。例如:

bash 复制代码
z open-source    # ✓ 成功跳转
z os             # ✗ 无匹配

这时候就需要用到 fzf 实现交互式模糊跳转。

zi 命令的局限

zizoxide 自带的 fzf 集成命令,但经测试其模糊搜索效果不生效,我提交了个 issue 询问作者还没有得到回复,但后来在查阅 zoxide 源码时发现明确指定了 zi 中的 fzf 使用严格模式查询。

自定义增强命令 zx

为了弥补 zi 的不足,我参考官方 zi 命令实现了一个 zx 命令,将 zoxide queryfzf 手动组合,支持精准模糊过滤,并拥有和官方 zi 命令一样的窗口。

bash 复制代码
# ~/.zshrc 中添加:
zx() {
  local query="${*}"
  local dir

  dir=$(zoxide query --list --score | \
    fzf --filter="$query" --no-sort | \
    fzf \
      --prompt="zoxide > " \
      --nth=2.. \
      --ansi \
      --height=60% \
      --info=inline \
      --border=rounded \
      --layout=reverse \
      --preview-window=down:40%:wrap \
      --preview='ls -F -C --color=always {2..}' \
	  --bind 'ctrl-z:ignore,btab:up,tab:down,enter:become:echo {2..}' \
      --cycle \
      --keep-right \
      --tabstop=1
  )

  [[ -n "$dir" ]] && cd "$dir"
}

使用方式:

bash 复制代码
zx                # 打开所有路径模糊搜索界面
zx foo            # 模糊过滤包含 foo 的路径

示例效果图:

工作原理简介

zoxide 的排名算法结合了频率 (访问次数)和时效性(最近访问时间)来为每个目录计算分数

核心评分机制

每个目录条目包含三个关键字段:

  • path: 目录路径
  • rank: 基础排名分数(浮点数)
  • last_accessed: 最后访问时间戳

当访问目录时,系统会增加其基础排名分数并更新访问时间

rust 复制代码
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Dir<'a> {
    #[serde(borrow)]
    pub path: Cow<'a, str>,
    pub rank: Rank,
    pub last_accessed: Epoch,
}

时效性加权

查询时,系统根据最后访问时间应用不同的乘数 :

  • 1小时内: 4倍乘数
  • 1天内: 2倍乘数
  • 1周内: 0.5倍乘数
  • 超过1周: 0.25倍乘数

确保最近使用的目录在搜索结果中获得更高优先级。

rust 复制代码
pub fn score(&self, now: Epoch) -> Rank {
	// The older the entry, the lesser its importance.
	let duration = now.saturating_sub(self.last_accessed);
	if duration < HOUR {
		self.rank * 4.0
	} else if duration < DAY {
		self.rank * 2.0
	} else if duration < WEEK {
		self.rank * 0.5
	} else {
		self.rank * 0.25
	}
}

与其他工具对比

工具名 是否维护 特点 模糊搜索 平台支持
z ❌ 停止维护 shell 实现,体积小,功能少 部分支持 类 Unix
autojump ⚠️ 缺乏维护 Python 实现,功能较少 官方仅支持类 Unix / 由社区支持 Windows、BSD
zoxide ✅ 活跃维护 Rust 实现,高性能,支持 FZF 全平台支持

使用建议

  • 代替所有 cd 命令:越用越准,路径跳转体验越顺滑
  • 搭配 zx 命令做模糊搜索、目录浏览,非常适合多项目工作流
  • zoxide 提供了内置的别名设置,在初始化命令指定 --cmd
bash 复制代码
zoxide init zsh --cmd j   # 习惯 `j` 命令可以这么定义
zoxide init zsh --cmd cd  # 或者直接代替 cd 命令
  • 如果你之前使用 autojump、z、fasd 等命令,可以导入数据,例如:
bash 复制代码
zoxide import --merge --from=z "~/.z"

参考链接

相关推荐
勇敢牛牛_14 分钟前
使用Rust实现服务配置/注册中心
开发语言·后端·rust·注册中心·配置中心
deepwater_zone21 分钟前
Go语言核心技术
后端·golang
慢半拍iii1 小时前
JAVA Web —— A / 网页开发基础
前端
gnip1 小时前
pnpm 的 monorepo架构多包管理
前端·javascript
新手村领路人2 小时前
Firefox自定义备忘
前端·firefox
乖女子@@@3 小时前
css3新增-网格Grid布局
前端·css·css3
爱干饭的boy3 小时前
手写Spring底层机制的实现【初始化IOC容器+依赖注入+BeanPostProcesson机制+AOP】
java·数据结构·后端·算法·spring
伐尘3 小时前
【CE】图形化CE游戏教程通关手册
前端·chrome·游戏·逆向
不想吃饭e3 小时前
在uniapp/vue项目中全局挂载component
前端·vue.js·uni-app
非凡ghost4 小时前
AOMEI Partition Assistant磁盘分区工具:磁盘管理的得力助手
linux·运维·前端·数据库·学习·生活·软件需求