DOCAI · 课程 · L3 · 20 分钟 · 交互模式与工具
命令历史
调好的提示词不该用完就丢:用上下键和 Ctrl+R 找回旧输入,直接读历史文件做统计,并分清历史与会话记录的区别。
你将学会
- 用上下键和 Ctrl+R 找回以前发过的提示词
- 直接读取历史文件,按关键词或时间筛选旧输入
- 分清命令历史与会话记录,知道该用哪一种
它记的是你发出去的话
送进 Claude Code 的输入,会被追加到本地的一份记录里;连续两次发送同一句,只留一条。这里存的是提问的原文,模型的回答、命令跑出的结果都不在里面。所以它能回答「我上次是怎么问的」,回答不了「它上次是怎么答的」。
上下键的召回范围按工作目录算:在某个项目里启动,翻到的是这个项目过去会话的输入,别的仓库不会混进来。但记录本身是同一份文件,每行都带着项目路径;想跨项目找,别靠上下键,用 Ctrl+R。具体文件名与存储格式各版本略有差异,先用下面的办法确认自己的环境,再决定怎么整理。
两种翻法,先学快的
输入框空着时按上箭头,最后一条先出现;继续按就往更早的方向走,下箭头则朝新的方向移动。翻到某一条可以直接改,改完按回车发出去。
历史一长,箭头就不够用。按 Ctrl+R 进入搜索状态,敲几个字,最近一次匹配会显示出来;再按一次 Ctrl+R 跳到更早的匹配。界面若是全屏渲染,Ctrl+R 会弹出搜索框,用上下键选,按 Ctrl+S 在本次会话、本项目、所有项目之间切换范围。找到之后有两个选择:直接回车立刻发出,或者按 Tab 或 Esc 把它放回输入框,改完再发。想放弃搜索,按 Ctrl+C 取消并恢复原来的输入;搜索词为空时按退格也能退出。内联搜索不区分项目,会翻遍所有工作目录的记录,这是它比上下键强的地方。匹配只看字面包含关系,写更长的关键词比研究正则更省事。
| 想做的事 | 动作 | 结果 |
|---|---|---|
| 翻最近几条 | 上箭头或下箭头 | 逐条查看,可编辑 |
| 找很久以前的 | Ctrl+R 加关键词 | 跳到最近一次匹配,跨项目 |
| 找到后想先改 | Tab 或 Esc | 放回输入框 |
| 不搜了 | Ctrl+C,或删空后按退格 | 退出并恢复原输入 |
旧记录翻不到,就直接读文件
箭头只能一条条翻,很早的内容翻起来很慢,也可能已经翻不到了。当前版本的记录放在用户目录的 .claude 文件夹里,文件名叫 history.jsonl;Windows 是 %USERPROFILE%\.claude\history.jsonl,macOS 与 Linux 在 ~/.claude/history.jsonl。不同版本可能换过名字,不确定时先把该目录列出来,找名字带 hist 的文件。
每行是一条 JSON,带时间戳和项目路径,用 grep 找关键词,或者用 tail 看末尾若干条都行。结构清楚之后,还能按时间字段筛选、按项目过滤、按天统计条数。这类查询适合回答「上周我问过哪些关于缓存的问题」,比在界面上一条条翻快得多。整理出的高频问法,可以另存成片段文件,下次直接改几个词就能用。
历史和会话不是一回事
这是最容易混淆的一处。历史存的是输入文本,找回它只找回了问句,模型并不知道当时聊到哪。要把整段对话接上,得用继续最近对话的参数,或者从会话列表里挑一条恢复;那才会带上先前的问答与工具调用。
判断方法很简单:只想复用措辞,翻历史;想接着上次的思路往下做,恢复会话。前者轻,后者重,用错了要么上下文断裂,要么白白带回一堆无关内容。
敏感内容与体积
记录是明文,没有额外加密,保护靠操作系统的文件权限。但只要你曾把密钥、口令、内部地址直接写进提示词,它们就留在这个文件里了。更稳的做法是从一开始就不把秘密写进对话,让程序去读本地的凭据文件;密钥该放在哪、怎么管,可以看 API Key 的说明。
发现已经写进去了,先去服务方撤销那个凭据,再从文件里删掉对应行;只删本地记录而不撤销,等于没处理。按项目清理可以用 claude purge <项目路径>,它会把该项目在 history.jsonl 里的记录一并删掉;不想让输入落盘,可以设置 CLAUDE_CODE_SKIP_PROMPT_HISTORY,但会话记录也会一起停写。文件太大时检索会变慢,保留最近若干条即可,旧的先备份再截断。共用电脑上还要隔一段时间看一眼权限设置。
把好问法沉淀成模板库
搜索只能解决「找回来」,下一步是「下次直接用」。做法不复杂:先从记录里挑出反复出现的问法,再存成独立文件,最后用别名或脚本调用。
# 1. 找候选:按关键词过滤,只看最近的一部分
grep -i "审查" ~/.claude/history.jsonl | tail -n 30
# 2. 建目录,写模板
mkdir -p ~/.claude/snippets
cat > ~/.claude/snippets/review.md <<'EOF'
请审查下面的改动:
1. 先列会导致错误的问题,再列可读性问题;
2. 每条指出文件与行号;
3. 没有把握的地方明确说不确定。
改动内容:
EOF
# 3. 用管道把模板和代码一起送进去
cat ~/.claude/snippets/review.md src/foo.ts | claude -p
# 4. 常用就设个别名(bash / zsh)
alias cr='cat ~/.claude/snippets/review.md - | claude -p'
Windows 的 PowerShell 没有这套别名写法,可以定义一个函数,把模板内容通过管道送进去。模板文件放在用户目录下,换机器时只同步这个目录,不带上整份历史。
记录是每行一个对象的格式时,先看第一条有哪些字段,再决定怎么过滤:
head -n 1 ~/.claude/history.jsonl | jq .
字段名在不同版本里可能是 prompt、display 或其他名字,以你看到的为准。确认之后先跑最小查询,再叠加条件;例如取出含指定关键词的问句:
jq -r 'select((.display // .prompt) | tostring | test("缓存")) | (.display // .prompt)' \
~/.claude/history.jsonl | tail -n 20
把 test("缓存") 换成日期或项目路径,就能按时间窗、按目录汇总;条件写得越具体,输出越短。
整理模板时不必追求精确分类。先按动词粗分,把出现两次以上的问法抄进目录,文件名直接用动作命名,例如「审查改动」「补测试」「解释报错」。一个月后再回看,这个目录就是你的常用指令清单,比在几百条记录里反复翻找省事得多。
要接着上次的思路继续,而不是只复用措辞,请用继续上次对话的方式恢复,别把模板当成上下文。
四个常见故障
| 现象 | 为什么 | 怎么办 |
|---|---|---|
按上箭头出现 ^[[A 一类字符 |
行编辑配置被改坏,或终端不识别该序列 | 检查 ~/.inputrc;临时用 INPUTRC=/dev/null claude 启动 |
| 中文显示成乱码 | 终端编码与记录文件的编码不一致 | 用 locale 查当前设置,把语言与编码统一到 UTF-8 |
| Ctrl+R 没反应 | 按键被终端或窗口管理器截走 | 换一个终端试;全屏界面下改用弹出的搜索框 |
| Ctrl+S 无法正向搜索 | 终端把该组合键当成暂停输出 | 先执行 stty -ixon,再试一次 |
另外两个与体积有关的问题:同时开多个窗口时,旧版本可能互相覆盖记录,升级到当前版本通常能解决,仍不放心就让每个窗口用独立的记录文件;记录只追加不清理,全文检索会越来越慢,轮转时先复制备份并核对行数,确认无误再截断原文件:
cp ~/.claude/history.jsonl ~/.claude/history.backup.jsonl
wc -l ~/.claude/history.backup.jsonl
tail -n 5000 ~/.claude/history.backup.jsonl > ~/.claude/history.jsonl
换电脑时也不要直接覆盖:把旧文件拷过来,与本地文件拼接后再替换,避免丢掉其中一边。拼接前先各留一份备份,确认条数没错再删除旧文件。
收束
把常用的问法当资产来管:先会搜,再会整理,最后才谈清理。下一节处理另一种打断节奏的情况——长命令占住对话时怎么让它去后台跑,见后台 bash 命令。
自测
先自己回答,再展开对照;答不上来就回到对应小节。01历史里保存的是你发出去的内容,还是模型的回答?看答案
只保存你发出去的输入,模型的回答和工具结果不在其中。要找当时的回复,得去会话记录里翻。
02在 A 项目里上下键翻到的历史,会混进 B 项目的输入吗?看答案
不会。上下键按工作目录召回,只翻当前项目以及它在过去会话里的输入;要跨项目找,用 Ctrl+R 的内联搜索。
03只想复用上次的问法,该翻历史还是恢复会话?看答案
翻历史。恢复会话会带回整段上下文,适合接着上次的思路继续做,只为了复用措辞则没必要。