频次 × 最近性

跳到你想去的目录,而不是你敲出来的那个。

cdh v0.3.2 · Rust · MIT · MSRV 1.88 · bash · fish · zsh

cdh 按访问频次 × 最近性给你去过的每个目录打分,再开一个终端选择器,让对的那条路径永远只差一次模糊搜索。

$ curl -fsSL https://xianyudd.github.io/cdh/install.sh | bash
其他安装方式 →

支持 bash、fish 和 zsh,安装器会自动识别你当前的 shell。


选择器

它长得像你的终端,因为它就在你的终端里

一条命令就在当前 shell 里打开选择器。模糊过滤候选,看一眼预览,按 Enter。cdh 完成跳转,把终端交还给你,然后退场。

cdh — 真实会话录屏
110 列终端里的 cdh 选择器:顶部是搜索行,下面是按分数排好序的 21 个目录,当前选中 ~/projects/awesome-app,右侧预览面板显示它的 git 分支、上次访问时间和目录内容,底部是一条键位提示栏。
实录演示 在 tmux 里录下的真实 cdh 会话:独立的演示 home,不是效果图
  1. 候选进来时已经按 frecency 排好序,你真正常待的路径自然浮到最上面
  2. 直接输入,就在历史候选和 cdh 扫出来的目录里一起模糊过滤
  3. 移动选中行,预览跟着走,带 git 状态和上次访问时间
  4. Tab 收起预览让列表占满整宽,再按一次 Tab 把预览叫回来
  5. F1 打开帮助,F2 打开设置:语言、主题、预览、颜色、鼠标
  6. Esc 清空查询,Enter 跳转并把 shell 交回来

这段循环自己播放,也没有声音。如果你的系统偏好减少动效,看到的会是那一帧静图。

你会得到什么

真正干活的那几块

二进制、打分模型和选择器,各自给你什么。

会衰减的 frecency 打分

访问频次和最近性半衰期融合成一个分数,上个月常待的目录不会再挤掉你五分钟前打开的那个。$HOME 也不再霸占列表顶端。

模糊搜索,实时预览

敲一小段,列表边打边过滤。预览面板在你决定跳转之前,先给你看目录内容、git 分支、有没有改动,以及上次到这儿是什么时候。

历史之外,还有整棵目录树

候选池是「历史 ∪ 目录树」:后台扫描把你从没 cd 过的路径也补进来,一样搜得到。而排除一棵子树之后,它就真的不再出现。

一个 Rust 二进制,遵守 XDG

单个便于静态链接的二进制,MSRV 1.88。历史和状态分别落在 XDG_DATA_HOME 与 XDG_STATE_HOME 下,bash、fish、zsh 的 hook 各自只有几行。

七套主题

Graphite、Nord、Daylight、Mono、Dracula、Amber、Forest。不支持颜色的终端有一整套降级方案。

完整键位表

↑ ↓
上下移动
Ctrl+P Ctrl+N
不用方向键移动
Ctrl+↑ Ctrl+↓ PgUp PgDn
翻页
Home End
首项,末项
← →
移动搜索光标
Backspace Delete
删除光标前、光标处
Ctrl+U
清空搜索
Enter
跳转
Tab
开关预览
Ctrl+D
排除该目录及其子目录
Ctrl+H F5
隐藏目录
F1 ?
帮助,全角 ? 也行
F2
设置
F3 Ctrl+T
切换主题
F4
排除清单
Esc
关闭、清空、退出

鼠标也能用:单击选中,双击跳转,滚轮滚动。

中文与 English

整个 TUI 两种语言都讲,在设置里随时切换。搜索行也能正常处理全角输入。

右下角一个安静的立方体

一个线框立方体在右下角慢慢翻转,它待在列表排版之前就预留好的边槽里,所以永远不会盖住任何一行。无颜色模式下自动关掉,CDH_CORNER_3D=0 则彻底不出现。

安装

安装器到底动了什么

开头那条命令是最快的路。如果你想先看清楚再 pipe,或者干脆不 pipe,这里是全貌。

那一行命令,拆开看

  • 把对应平台的 release 二进制下载到 ~/.local/bin/cdh。
  • 读 $SHELL 判断你用哪个 shell,也接受 --shell bash|zsh|fish。
  • 把 hook 写进 ~/.config/cdh/,并在 rc 文件里加一段带标记的引用。
  • 历史和状态留在 XDG_DATA_HOME 与 XDG_STATE_HOME 下。

全程不需要 root,也不会往 home 之外写任何东西。先读一遍脚本,再决定要不要 pipe。

或者不走 pipe

已经发到 Cargo 了:

cargo install cdh

x86_64 与 aarch64 的 Linux gnu、musl 预编译包,以及 macOS 版,都在 Releases 里。这两条路都要照 README 手动挂一次 hook。