网站搜索

如果你仍然使用 cd 来导航终端,那么你做错了


我在工作日的大部分时间都在终端中度过,多年来,cd 命令是我浏览文件系统的主要工具。这是一个繁琐的过程,需要输入部分目录名称,按 Tab 键进行自动补全,有时在路径输入错误时还需要按退格键。

我接受了这种摩擦,把它视为命令行生活中的正常常规。然后我安装了 zoxide,这是那些轻量级工具之一,它应该在你的工作流程中占据永久位置,因为它作为传统切换目录命令的智能版本——我有点恼火自己竟然忽视它这么久。

安装发动机很容易

然而,布线只需一分钟

在你的系统上运行 zoxide 并不难,但在它正常运行之前需要进行一个快速的配置步骤。该工具可以通过大多数主要的包管理器获取,使得二进制安装变得简单。如果你使用的是 Windows,你可以使用 Scoop 或 Windows 包管理器(Winget)来获取最新版本:

winget install ajeetdsouza.zoxide

在 macOS 上,使用 Homebrew 可以干净地处理它:

brew install zoxide

在 Linux 或 WSL 上,官方安装脚本是最可靠的方式。默认仓库中的 Debian 和 Ubuntu 软件包明显落后于上游版本,所以如果你使用其中任何一个,应该使用脚本而不是 apt:

curl -sSfL https://raw.githubusercontent.com/ajeetdsouza/zoxide/main/install.sh | sh

如果你使用 Arch,你可以使用 pacman -S zoxide,而 Fedora 32 及以上版本可以通过 dnf install zoxide 安装。无论哪种方式,二进制文件都可以很快获取。

现在,仅仅安装二进制文件是没有用的。你必须在你的 shell 配置中初始化 zoxide;这一步实际上是将它接入你的工作流程。对于 Bash,请将以下内容添加到 ~/.bashrc 的末尾:

eval "$(zoxide init bash)"

对于 Zsh,将此添加到 ~/.zshrc 的末尾:

eval "$(zoxide init zsh)"

这一行必须在调用 compinit 之后出现,否则自动补全将无法正常工作。如果在设置后自动补全仍然不正常,通常运行 rm ~/.zcompdump*; compinit 并重启你的 shell 就能解决问题。

对于 Fish shell —— 一个提供 Bash 忘记添加的终端功能的工具 —— ~/.config/fish/config.fish 的末尾是这样的:

zoxide init fish | source

对于 PowerShell,通过运行 echo $profile 找到你的配置文件路径,然后添加:

Invoke-Expression (& { (zoxide init powershell | Out-String) })

一旦设置完成并且 shell 被重新加载,zoxide 就会在后台静默运行。你导航的每个目录都会被记录和评分,而你几乎不会注意到。这正是它的目的。经过一两天的正常工作后,数据库就已经有足够的历史记录,实际上可以派上用场了。

随着 z 的工作,cd 应该开始感觉古老

互动导航是一种超能力






核心行为是 zoxide 会跟踪你每次导航到的目录的分数,当你使用查询运行 z 命令时,它会跳转到匹配目录中分数最高的那个。实际上,这运行得非常顺利。例如,如果我经常在 ~/dev/myapp/backend/src 工作,我可以输入:

z src

并停在那里。如果我有多个名称中包含“src”的目录,我可以通过提供多个术语来缩小范围:

z myapp src

zoxide 将跳转到同时匹配 myapp 和 src 的最高排名目录。这涵盖了常见情况,即你克隆了几个结构相似的仓库,不想每次都指定完整路径。

虽然你绝对应该精通基本的 Bash 快捷键以快速操作终端,但一旦 zoxide 处理这些操作,以下几种移动模式就不再枯燥了:

z .. # moves up one directory level
z - # returns you to the previous directory
z downloads

最后一个,z downloads,可能听起来微不足道。但想想你每天在多少个终端会话中使用 cd ~/Downloads 或者去你下载文件所在的位置的频率。这积累起来比你预期的要快得多。

当多个匹配项需要决胜时,zi 命令会调出一个由 fzf 提供支持的交互式选择界面,fzf 是那些一旦学会就极其有用的隐藏 Linux 命令之一。在 Windows 上,你可以通过以下方式安装 fzf:

winget install junegunn.fzf

这让你可以从多个匹配的目录中进行选择,而不是让 zoxide 猜测。当多个项目文件夹共享一个共同的关键词时,这尤其有用。运行:

zi project

打开一个模糊搜索列表,其中包含历史记录中所有匹配的路径,按访问频率排序,并允许你选择想要的路径。fzf 是一个可选依赖。此集成所支持的最低 fzf 版本为 v0.51.0;请检查你是否安装了旧版本。如果你根本没有 fzf,zoxide 的核心跳转功能仍然可以正常使用,而 zi 将不可用。

你也可以在 Bash(4.4 及以上版本)、Fish 和 Zsh 中使用 z foo 来获取内联交互式补全,而无需切换到 zi 模式。

它不华丽,这正是它令人难忘的原因

值得写关于 zoxide 的原因不是因为某个单独的功能。而是它狭窄的范围和零仪式感的结合。使用它不需要你采用新的工作流程。你不需要放弃现有的 shell、别名、键绑定或你对文件系统的心理模型。zoxide 只是简单地拦截导航,并在你正常工作时在后台开始学习它。

话虽如此,还是有一些诚实的警告。zoxide 不是文件管理器,也不试图成为文件管理器。它没有可视化界面,没有树状视图,如果你想探索不熟悉的区域,它无法替代 Ranger 或类似 Yazi 的 Linux 文件管理器。它还需要实际使用才能体现智能。在全新安装的情况下,如果你自安装该工具以来从未导航到一个项目文件夹,输入 z project 是没有任何作用的。历史记录必须先存在于它的数据库中。

如果你只是偶尔使用终端,而且主要用于一两个任务,zoxide 可能会显得有些过头。但如果你在 shell 中花费大量时间,克隆仓库、编辑配置、在工作区之间移动,以及进出嵌套的项目目录,历史记录会快速积累,在一两天内,这个工具就会开始准确预测你想去的地方。

相关文章