claude-mem:为Claude Code解决跨会话失忆的AI记忆插件
跟你讲个真实的场景我前一天让Claude Code帮我重构了一个模块当时口头约定了“函数命名不要缩写、接口返回值用Result包装”第二天打开终端准备继续改下一个文件它完全不记得这回事上来又被我重复训了一顿。这个问题其实不是个例——Claude Code的每次会话都是独立的上下文窗口再大也不会天然带上昨天的结论。后来我在社区里翻到一个叫claude-mem的开源工具专门解决“AI助手跨会话失忆”的问题它自动扫描Claude Code的本地会话记录把值得长期记住的信息分类沉淀成Markdown文件并在下一次对话开始时自动把相关记忆注入提示。这篇文章把我从安装配置、工作原理、日常用法到进阶调教和踩坑过程完整写一遍给同样被重复沟通折磨的人一个参考。1. 为什么AI助手需要“外挂记忆”1.1 上下文窗口再大也装不下长期偏好很多人一开始觉得LLM上下文窗口已经很大了10万token甚至上百万token还需要额外做记忆吗实际用起来不是这么回事。我手上同时维护着三四个项目每个项目的代码风格、依赖管理方式、测试习惯完全不同一个用pnpm一个用npm一个还是老旧的piprequirements.txt。Claude Code开一个新会话就相当于来了个零基础实习生所有约定都要重新解释一遍。你可以在每个会话开头写一大段引导词但引导词本身会占用上下文窗口而且项目越多、引导词越长实际留给代码和业务讨论的空间就越小。更麻烦的是引导词只能解决“显式约定”解决不了“隐性积累”。比如上个礼拜调试一个并发写入问题最后定位到是数据库连接池配置不合理这个结论散落在那次会话的几十轮对话里。下次再遇到类似错误Claude Code根本不知道你之前已经排查过一遍。上下文窗口是线性的它只能看到当前会话的内容而个人和团队的经验是持续累积的这两者之间存在结构性矛盾。所以与其每次手动把历史拉出来贴进提示不如在会话之外建立一个持久的记忆层。1.2 claude-mem的定位给Claude Code的随身记事本claude-mem就是用在这个位置上的工具。它本身是一个Python写的命令行程序核心思路很朴素Claude Code在本地运行CLI时会自动留下JSON格式的会话记录transcriptclaude-mem读取这些记录调用LLM从中提炼“值得长期保留的信息”按类型存成本地Markdown文件然后通过Claude Code的hooks机制在每次对话提交之前把相关记忆自动注入用户提示。整个链路是会话记录 → 记忆提炼 → 本地存储 → 自动注入。可以把它理解成给AI助手配了一本随身记事本。你不必记得每一次聊天细节它会替你把重点划好、分门别类摆在抽屉里下次要用的时候自动递上来。这个工具的适用人群很明确重度Claude Code用户、同时维护多个项目的人、以及希望AI助手“越用越懂我”的人。它解决的不是“单次对话质量”问题而是“跨会话连续性”问题这是靠提示词优化绕不过去的一环。2. 安装与初始配置先让记忆系统跑起来2.1 环境要求与pip安装安装claude-mem之前先把前提条件确认好你已经在用Claude Code并且至少跑通过一次会话。因为claude-mem的“原料”是Claude Code留下的transcript文件没有会话记录可扫装上也白搭。当前版本是用Python实现的环境建议Python 3.10以上太老的版本可能在依赖解析阶段就报错。安装命令很简单pip install claude-mem装完验证一下claude-mem --version能正常输出版本号基本就没问题。我自己习惯用虚拟环境装不直接往系统Python里塞这样后面升级或换版本不会污染其他项目。如果你用的是uv管理Python环境也可以直接用uv tool install claude-mem效果一样还能自动隔离依赖。这里有个很容易忽略的点claude-mem的安装路径要在Shell的PATH里。之前遇到一个朋友装完后运行命令提示找不到排查半天发现是装到了用户目录下的Python环境里终端没有把那个目录加进PATH。用which claude-mem看一下能输出真实路径就没问题。2.2 bootstrap一键配置Claude Code hooks装好之后最推荐先跑这个命令claude-mem bootstrap它会扫描你的Claude Code配置目录一般在~/.claude/或者由$CLAUDE_CONFIG_DIR指定的位置然后询问你是否要把记忆注入到每次对话的提示中。确认之后它会自动帮你把hooks配置写进Claude Code的settings文件。为什么一定要用hooks而不是自己改启动脚本因为hooks是Claude Code官方支持的扩展点专门用来在特定时机执行自定义命令。claude-mem利用的是UserPromptSubmit这个时机用户在终端里按下回车、提示文本正式提交给模型之前先执行一次claude-mem读取当前相关的记忆并追加到提示文本前面。整个注入过程对用户是透明的什么都不用手动做。配置完成后可以去检查一下~/.claude/settings.json里面应该能看到一段跟hooks相关的配置。如果不想手动翻文件也可以跑claude-mem doctor它会诊断当前配置状态、依赖是否齐全、transcript目录是否可读一站式把配置问题暴露出来。这个命令很像体检报告省去自己猜的功夫。2.3 首次对话与记忆生成验证配置完不要急着下结论先跑一个真实会话验证效果。我当时的做法是打开一个项目目录跟Claude Code聊了几分钟特意说了一句“以后定义接口时方法参数都用关键字参数别用位置参数”。这句话是明显的偏好声明适合用来测试记忆有没有被抓到。结束会话后执行claude-mem search 关键字参数如果一切正常你应该能看到一条分类为preference的记忆内容就是刚才那句约定。也可以直接打开记忆目录~/.claude-mem/memories/看生成的Markdown文件文件名和YAML头部会标明分类、时间戳、来源会话等元信息。第一次验证时最常见的误判是会话刚结束就立刻搜索结果什么都没有。别急记忆构建是异步的transcript生成、扫描、LLM提炼需要一点时间慢的时候可能要等十几秒。等一小段时间再搜或者手动跑一次claude-mem schedule强制触发扫描基本就能看到结果了。3. 跑通之后拆一拆它的工作原理3.1 transcript扫描记忆从哪里来Claude Code每次通过CLI启动会话都会在本地留下会话记录路径一般是~/.claude/projects/项目路径哈希/这样的目录结构里面按时间存放JSON格式的transcript文件。这些文件记录了用户消息、助手回复、工具调用等完整交互过程。claude-mem做的事情就是主动去扫描这些新产生的transcript。这里有个设计思路很值得说它不去实时监听对话流而是基于事后的transcript做解析。实时旁路意味着要在Claude Code运行中途插入agent逻辑这会引入复杂度而且Claude Code一升级就可能挂。transcript方案是“事后重放”稳定性好可追踪即使扫描挂了也不会影响实际对话最多记忆延迟个几十秒。我后面踩坑时才发现这个设计救了很多次scan失败最坏也就是没记忆注入会话本身完全不受影响。需要注意的一点是claude-mem对transcript目录只读不写。它不会修改、删除或移动原始会话记录记忆文件独立放在自己的目录这对有审计需求的人很友好。3.2 记忆分类与提炼过程拿到transcript之后claude-mem要做的不是“整段存进去”而是“提炼”。它会调用LLM把一段冗长的对话压缩成若干条信息密度高的记忆条目每一条都要归类。默认支持的分类大致有这些preference用户偏好比如“代码注释用中文”“回复尽量精简”code-pattern固定代码习惯比如“实体类统一继承BaseEntity”project-decision项目级决策比如“认证模块用JWT不做Session”learning你在对话中学到的知识点bug-fix排查记录比如某类并发问题的根因pitfall坑位记录比如“这个库的旧版本有内存泄漏”project-structure项目结构约定比如“业务代码放在app/services下”分类不是锦上添花它直接决定记忆的筛选和注入粒度。想象一下你在一个Node项目里聊React组件结果把Python项目的pip依赖偏好也注入进来了这不但没帮助还纯属干扰。有了分类和项目维度的配合Claude Code才能做到“只带该带的记忆”。提炼过程依赖LLM分析所以这里也解释了一个现象为什么第一次运行时会感觉记忆生成有点慢因为每个transcript都要经过一次模型调用。等到积累一段时间后这个过程是在后台跑基本感知不到。3.3 记忆注入闭环理解了记忆来源再看记忆怎么回到对话里。完整的注入链路大概是用户在Claude Code里输入消息按下回车UserPromptSubmithook触发Claude Code在把用户提示交给模型之前调用claude-memclaude-mem根据当前工作目录和配置读取相关记忆记忆文本按模板包裹后追加到用户提示文本前面Claude Code把“用户提示 记忆上下文”一起发给模型模型在回答时天然能看到这些历史信息。为什么要把记忆放在用户提示的前面而不是改系统提示因为系统提示是模型行为的主基线随便往里塞内容会影响模型的整体性格和输出风格。而放在用户提示前部本质上只是补充了一段上下文模型能感知到但不会改动它底层的交互方式。说得直白一点系统提示是“身份”用户提示是“当次任务”记忆属于后者。4. 日常用法查询、搜索、会话摘要与手动添加4.1 用search找回关键记忆随着记忆库越来越大你不可能每次都翻Markdown文件。“claude-mem search”才是日常高频入口claude-mem search 分页器搜索结果会展示记忆内容、分类、创建时间、来源会话编号。用这个命令的时候有个经验它的搜索本质是本地文本匹配不是语义向量检索所以关键词要带“特征词”不要带“语气词”。搜“那个分页的问题”基本搜不到搜“分页器 后端分页”反而能精准命中。这个差别刚上手时很容易觉得“工具不好用”其实只是没用对。4.2 用session捡起上次会话还有一个我特别喜欢的命令是session相关的功能。如果你隔了几天回到项目完全忘了上次聊到哪直接执行claude-mem session 上次最后讨论的问题它会返回一条上次会话的摘要相当于对旧会话内容做了一次“快照压缩”。这个功能适合跨天工作流今天收工时讨论的方案三天后回来一句话就能接上。我的习惯是每个长时间任务结束前主动跟Claude Code做一次阶段性总结让摘要质量更高等下次回来时调session摘要衔接成本几乎为零。4.3 手动添加不等它自己发现自动沉淀再聪明也有漏网的时候。比如客户临时在电话里说了一个需求你没跟Claude Code聊过或者一个约定只在对话里出现了一次模型没把它当重点提炼。这时候就该手动补一条claude-mem add --content 客户明确要求导出功能必须支持Excel格式 --classification preference手动添加的意义不只是补漏它还能让Claude Code在未来的会话里马上表现出“懂你”的状态不用等它从某次历史对话里慢慢提炼。手动添加时content要写完整、具体别写“用户偏好excel导出”要写“用户明确要求导出功能必须支持Excel格式”因为注入提示时模型会原文看到这句话细节越清楚理解越准确。4.4 记忆的导出与备份claude-mem支持不同的输出格式比如把全部记忆导出为JSON、YAML或CSVclaude-mem --output-format json这个功能主要用于备份、迁移和二次处理。我自己换机器的时候习惯直接备份~/.claude-mem/整个目录记忆文件本来就是纯文本Markdown复制过去就能接着用。比导出再导入更省事。如果你需要把记忆丢给其他工具做统计分析再用--output-format格式化导出也不迟。5. 进阶记忆系统的定制与调教5.1 config.json 里的关键开关claude-mem的配置集中在~/.claude-mem/config.json。我用的版本里几个值得关注的配置项包括是否自动注入记忆、记忆作用范围、启用的记忆分类、输出格式偏好等。第一次接触时别急着全改先理清楚两个最核心的自动注入开关控制是否把记忆自动加到提示里。如果只想把claude-mem当记忆数据库用、不想影响每次对话可以关掉作用范围区分全局记忆和项目局部记忆。全局适合个人偏好局部适合单项目约定。修改配置之后新开一个会话才会生效因为hooks在会话启动时读取配置。如果改了没反应别疑惑退出当前会话重新进就好。5.2 用模板定制注入格式注入不是简单把记忆文本往前面一堆claude-mem允许你定义模板在模板里使用变量占位比如{{classification}}、{{content}}这样的字段。模板的主要用途是让注入内容带上分类标签让模型一眼就能看出这段记忆属于偏好还是代码模式。举例来说你可以把模板调整成带[preference]标签的结构模型看到标签后对这段记忆的语义把握会更强实际效果确实比自己不加标签好一些。不过别一上来就设计特别复杂的模板先跑默认配置几天观察注入内容是否符合预期再逐步调整。我见过有人第一次就去配置多级嵌套模板结果格式语法写错注入内容全是乱序的反而影响对话质量。5.3 控制记忆范围全局与项目的边界多项目场景下记忆范围是最容易被忽略的坑。全局记忆适合放个人通用偏好比如“所有代码注释用中文”“翻译时保持中英双语对照”但项目级约定必须隔离比如项目A用pnpm项目B用npm项目C用pip这类信息如果混进全局记忆就会出现一种很滑稽的情况在项目B里讨论依赖安装结果Claude Code用项目A的pnpm风格来提供建议让人摸不着头脑。我的建议是把scope配置改成更适合当前工作模式的策略通用偏好放全局单项目约定放局部。在哪个目录启用哪个范围的记忆关键词是“项目目录隔离”。用scopelocal的模式之后Claude Code在对应项目目录会话中只读取该项目自己的记忆干扰会大大减少。6. 踩坑记录与维护建议6.1 装了却不注入从三个方向排查我遇到过最头疼的问题就是配置半天结果Claude Code好像完全没读取记忆。这时候别慌按这个顺序排查配置位置对不对claude-mem读取的settings路径和Claude Code实际使用的路径是否一致。如果你设置了$CLAUDE_CONFIG_DIR两边指向就可能不同hook是否注册成功跑claude-mem doctor它会输出诊断状态直接告诉你哪一步异常transcript目录可读性有些项目目录权限受限或者Claude Code因为某些原因没生成transcript导致没有“原料”可扫。在终端里手动去~/.claude/projects/看一眼有没有新生成的JSON文件就知道。排查的耐心很重要这三个方向已经能覆盖绝大多数“不注入”情况。如果还不行打开调试日志一步一步定位不要盲目重装。6.2 记忆文件膨胀与定期维护自动记忆系统有个副作用记忆只增不减时间长了会积累大量过时信息。比如半年前你还在用某个库的旧API后来整个模块重写了但旧的记忆文件还躺在目录里。如果不清理Claude Code就可能把已经废弃的方案当成当前约定来用这时候记忆反而成了干扰源。我现在的维护节奏是每个月清理一次直接进入~/.claude-mem/memories/按文件修改时间排序把明显过期、错误、与当前项目无关的记忆删掉。记忆文件本身就是普通Markdown手动编辑和删除没有任何门槛。这就是本地明文存储的好处你永远可以兜底纠错不会被困在系统里。6.3 隐私与API调用的边界这一点必须认真提醒。claude-mem在构建记忆时依赖LLM来提炼这意味着部分transcript内容会被发送到对应模型的API端点。如果你的项目代码高度敏感要么选择本地兼容的模型端点要么对敏感域名关闭自动记忆只通过claude-mem add手动保存必要信息。另一个高频事故是密钥泄露。我见过有人把数据库密码、API token当成记忆内容保存下来理由是“让Claude Code下次直接帮我填”。这个想法很危险记忆文件是本地明文一旦本机被攻破或者目录被同步到云盘麻烦就大了。明文存储密钥永远是安全事故的导火索不要把它写进记忆库更不要让它出现在注入的提示里。最后说点个人体会。我刚开始用claude-mem时最不适应的一点是注入的旧记忆偶尔会把话题带偏后来用scope和分类过滤把这个问题收敛住了。但整体跑了两周之后重复沟通成本确实下降了一大半最明显的变化是开新会话时不用再啰嗦背景了Claude Code自己带着“记忆”进场。记忆系统这种东西刚开始觉得是锦上添花真正用上一段时间后就会变成工作流里的默认配置。当然任何第三方工具的版本迭代都会调整命令和配置字段我上面写的内容以你本地的claude-mem --help和官方文档为准工具是拿来用的别让它变成新的负担。

相关新闻

点可云ERP-V6.0:开源进销存系统源码解析与部署实战

点可云ERP-V6.0:开源进销存系统源码解析与部署实战

简介:点可云ERP-V6.0是一套面向中小企业的开源进销存管理系统,覆盖采购、销售、零售、多仓库及财务管理等核心业务,适用于批发零售、制造与服务等行业的信息化改造。压缩包内共1734个文件,整体大小约19.57MB,以PHP源码…

2026/10/10 1:57:35 阅读更多 →
基于深度学习与句向量的文本相似度检测系统实战

基于深度学习与句向量的文本相似度检测系统实战

简介:这是一份面向Python学习者和毕业设计选题的深度学习文本相似度检测系统完整项目包。系统基于BERT模型,集成欧氏距离、余弦相似度、曼哈顿距离等多种相似度算法,文件管理模块支持创建文件夹、记录文件属性、批量上传下载、搜索、收藏与重…

2026/10/8 21:07:34 阅读更多 →
Rime小狼毫五笔输入法配置指南:从安装到辅助码挂接

Rime小狼毫五笔输入法配置指南:从安装到辅助码挂接

简介:一套基于小狼毫(Rime)引擎深度定制的五笔输入方案,压缩包内为可直接部署的完整配置与安装脚本,专为长期使用五笔、追求高效打字体验的用户准备。核心词库经作者二十余年持续维护优化,配合预设的候选排…

2026/10/8 21:07:34 阅读更多 →

最新新闻

SpringBoot3多数据源实战:从选型配置到避坑指南

SpringBoot3多数据源实战:从选型配置到避坑指南

做后端这些年,只要业务稍微复杂一点,“一个应用连一个库”的理想状态基本撑不住。用户数据放用户库、订单数据放订单库、日志又要独立一套,再加上读写分离和多租户隔离的需求,所有问题都指向同一个核心:一个SpringBoot…

2026/10/10 3:20:15 阅读更多 →
07_在k8s集群中安装ingress-nginx

07_在k8s集群中安装ingress-nginx

文章目录0 背景与架构0.1 为什么需要ingress-nginx0.2 环境架构0.3 镜像拉取方案1 安装前准备1.1 下载ingress-nginx部署文件1.2 替换镜像地址1.3 修复DNS解析问题1.3.1 问题现象1.3.2 修复方法2 安装ingress-nginx2.1 应用部署文件2.2 验证部署3 测试Ingress3.1 部署测试应用3…

2026/10/10 3:20:15 阅读更多 →
基于Spring Boot的宠物用品商城系统开发与实践指南

基于Spring Boot的宠物用品商城系统开发与实践指南

毕业设计季总有人拿着“宠物用品系统”这个题目来找我聊,说白了这个题在Java Web方向的选题清单里几乎年年出现。还有一类人不是学生,是宠物店老板想把自己那套手工记账和微信群接单的流程搬到线上。这两类人虽然出发点不一样,但最终要的东西…

2026/10/10 3:20:15 阅读更多 →
河北省口碑好的母婴护理服务商盘点,资质齐全的正规家政机构不踩坑

河北省口碑好的母婴护理服务商盘点,资质齐全的正规家政机构不踩坑

在衡水,找月嫂、请育婴师,几乎是每个新手家庭的必经之路。可真到了挑选的时候,很多父母才发现,家政市场鱼龙混杂,有的机构只管牵线不管服务,有的月嫂短期培训就匆匆上岗,出了问题连人都找不到。…

2026/10/10 3:20:15 阅读更多 →
个人微信API二次开发:号掉线别急着新建,先救映射表

个人微信API二次开发:号掉线别急着新建,先救映射表

线上最危险的操作不是掉线本身,而是值班同学随手「再建一个号顶上」。半小时后你会看到:一半消息失败、一半回错人、客服觉得有两个机器人在抢答。 多设备与恢复路径见 GeWe 开放文档。 真正炸掉的是什么 不是微信,是你的 客户 → 主责设备…

2026/10/10 3:20:15 阅读更多 →
Docker安装报错全解析:从daemon权限到内核模块的排查指南

Docker安装报错全解析:从daemon权限到内核模块的排查指南

你有没有遇到过这样的场景:费了好大劲把 Docker 装上,兴冲冲地敲下docker ps,结果屏幕上一行红字:permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock这种感觉就像门锁装好了…

2026/10/10 3:19:15 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →