想象一下你有一个出色的工作伙伴。他能解决复杂的问题,编写清晰的代码,对你的要求一听就明白。但是,每天下班后,每次你跟他说“打开课程项目”,他都会一脸茫然地看着你,问:“什么课程?在哪里?”

每天如此,毫无例外。

这就像和电影《记忆碎片》(Memento)的主角Leonard Shelby一起生活。他无法形成新的记忆,因此只能把重要的信息纹在身上,避免遗忘。

我每天都会和Claude Code一起处理四到五个项目。几周内,每次我对他说“去课程项目”或者“打开博客”,他都会像维多利亚时代的探险家寻找尼罗河的源头一样,执行find / -name "p101"命令,用五分钟时间在硬盘上搜索我每天都会使用的目录。

这可真让我抓狂。

问题:数字版的顺行性遗忘症

你的AI助手每次启动都像打开了一张白纸。它不知道你住在哪里,不知道你有哪些项目,不知道~/courses/p101/program这个目录存在,也不知道你的博客在~/code/frr.dev,或者你的Ansible代码库叫wuwei并且位于~/code/wuwei/ansible。

每次新会话,都得从头开始。这就像Leonard早晨醒来发现自己躺在那个汽车旅馆的房间里。

最自然的反应就是每次手动告诉它路径:“在/Users/fernando/code/tokamak。”这种方式虽然有效,但就像每天早晨都要向你的朋友重新介绍自己。用不了三个星期,你可能会开始考虑是不是单独工作会更省事。

现实世界的解决方案:zoxide

在给自己“纹身”之前,先说说如何用工具解决人类的困扰。

zoxide 是一种带有记忆功能的cd命令。通俗点说,它是替代cd命令的工具,可以通过输入部分片段记住你曾去过的目录,并智能跳转到最有可能的目标。

# 不再需要这样:
cd /Users/fernando/courses/p101/program

# 只需这样:
z p101

完成了。zoxide知道当你输入"p101"时,你是要跳转到/Users/fernando/courses/p101/program,因为这是你过去47次输入类似路径时访问过的地方。

它使用的是一种频次与最近性相结合的算法。经常访问且刚访问过的目录会被优先排列,而几个月未访问的目录会被降级。这有点像TikTok的推荐算法,只不过是用来管理你的文件系统。

安装步骤简单

brew install zoxide

# 添加到你的shell配置文件(我用的是Fish):
# 在 ~/.config/fish/config.fish 文件中
zoxide init fish | source

从此,每次执行cd命令都会让zoxide的数据库更新。而z <模式> 让你无需思考就能跳转到目标目录。

z tokamak    # → /Users/fernando/code/tokamak
z blog       # → /Users/fernando/code/frr.dev
z wuwei      # → /Users/fernando/code/wuwei/ansible
z p101       # → /Users/fernando/courses/p101/program

如果遇到模糊匹配(可能有两个以上符合条件的目录),使用zi命令会调出带有交互式选择器的_fzf_工具。

为AI助手配置zoxide:zoxide query

接下来是好消息。zoxide带有一个query命令,它不会改变目录,只是返回最可能的路径:

zoxide query p101
# → /Users/fernando/courses/p101/program

对于AI助手来说,这就是黄金功能。与其在整个硬盘上执行find命令,调用zoxide query可以在毫秒级速度返回正确的路径。无需探索,无需猜测。

问题是你的AI助手并不知道它的存在。这就是“纹身”的重要性。

纹身:CLAUDE.md

在《记忆碎片》中,有一个经典场景,Leonard对着镜子阅读自己身上的纹身:事实、指令以及不能忘记的重要信息。

Claude Code有一个类似的功能:CLAUDE.md文件。这是一个纯文本文件,每次会话启动时都会自动读取。你写在里面的内容,它就“记住”了——虽然技术上它并没有真正记住,而是每次启动都要重新读取。

这就是将信息刻在“记忆中的纹身”。

以下是如何将路径信息刻写进去的方法:

# 在 ~/.claude/CLAUDE.md 文件中

## 工具

- **`zoxide`** 已在Fish中嵌套为`cd`命令的别名。

  当你不清楚项目路径时,请使用
  `zoxide query <模式>`而不是 `find`。

## 常用的项目路径

| 项目名称        | 路径                               |
| ------------   | --------------------------------- |
| 我的应用         | `~/code/mi-app`                   |
| 课程             | `~/courses/mi-curso/program`      |
| 博客(Hugo)     | 使用`zoxide query blog`查询       |
| 基础设施(ansible)| `~/code/infra/ansible`            |

在这里发生了两件事:

  1. 直接提供路径。 对于使用最频繁的项目,它甚至不需要查找。有了表格,路径信息不言自明。
  2. 介绍工具。 对于表格中没有的任何项目,它知道可以使用zoxide query <名称>瞬间找到路径。

这是一个层级回退机制:

  1. 先查表 → 直接获得路径,无需成本。
  2. 使用zoxide query <模式> → 毫秒内返回,几乎总能正确。
  3. 执行find → 是最后的选择,慢而费时,但几乎不需要用到。

改变

纹身之前,典型的会话是这样的:

我:"打开课程项目,检查测试"
Claude:*执行 find . -name "p101" -type d*
Claude:*等待8秒*
Claude:*不满足,尝试其他find筛选器*
Claude:"找到路径:/Users/fernando/courses/p101/program"

纹身之后:

我:"打开课程项目,检查测试"
Claude:*读取表格,直接跳到 ~/courses/p101/program*
Claude:"模块认证有3个测试未通过..."

从15秒浪费和三次尝试,到毫无阻碍。每天频繁切换项目几十次,这是实际挽救的工作时间。

第二个纹身:memory

Claude Code还有一种更精细的持久化机制:按项目的_memory文件。它是助手(或者你自己)可以存储的记录信息,只在特定项目工作时加载。

当Claude浪费时间执行find搜索某个目录时,我让它注明记忆,于是生成了如下内容:

# zoxide-directories

当你不记得项目路径时,请使用
`zoxide query <模式>`而不是`find`。

之前为了找`/courses/p101`浪费时间,zoxide query p101本可以瞬间完成。

这就像Leonard贴在汽车旅馆里的便利贴。为了未来的自己提醒:“别找了。去问zoxide。”

路径之外的启示

这里的关键点并非“安装zoxide”,虽然它确实是具体的工具。关键点是:

如果你的助手在重复犯错,不要生气——把解决方案给它纹上。

它用npm install,但实际应该用pnpm?写进CLAUDE.md。它创建了编码格式为Latin-1的文件?写进CLAUDE.md。它不知道你的API需要一个自定义的header?还是写进CLAUDE.md。

每一个重复发生的挫折,都代表还有一个未定义的纹身。

而这里有一个人与AI助手的本质区别:人类会自己学习(或者应该会)。AI助手需要你亲手为它标记,但一旦写好,它就永远不会忘记。它不会心情不好,不会分心,也不会因为“我已经记住了”就不再遵循说明。

在这一点上,有着纹身的Leonard甚至比我们大多数带鱼记忆的凡人还要可靠。

如何开始

如果你使用Claude Code(或者任何支持说明文件的助手),给自己一个机会:

  1. 安装zoxide——使用brew install zoxide安装,将其添加到你的shell初始化配置中,并在一周内用z取代cd。一旦习惯了,你就不想再回去了。

  2. 创建你的CLAUDE.md——从基本信息开始:你的shell配置、路径、首选工具。不用很长,写一些有用的信息比堆砌无关内容要好得多。

  3. 每当助手犯同样的错误第二次时,停下来写下这个“纹身”。不要等到第三次。第二次就不再是随机错误——那已经是个反复出现的模式。而模式是需要记录的。

# 你的第一个纹身可能是这么简单:
echo '- Shell: Fish. 不是bash/zsh。' >> ~/.claude/CLAUDE.md

这并不炫酷。它不是插件架构,也不是依赖注入技术。它只是一个普通的文本文件,用来告诉你的助手你的工作世界如何运转。

但它有效。每天都有效。而且永远不会忘记。就像一个完美的纹身。

本文原文为西班牙语,借助AI翻译。