ChatGPT AutoExpert(Developer Edition)自定义指令全解析:用一份提示词把 ChatGPT 调教成资深结对程序员
提示工程AI 应用AI Agent【免费下载链接】ChatGPT-AutoExpert Supercharged Custom Instructions for ChatGPT (non-coding) and ChatGPT Advanced Data Analysis (coding).项目地址https://gitcode.com/gh_mirrors/ch/ChatGPT-AutoExpert点击查看免费下载本篇技术指南围绕开源仓库 ChatGPT-AutoExpert 的 Developer Edition 核心提示词文件 chatgpt__custom_instructions.md 展开系统讲解其基于 VERBOSITY 详细度 三段式响应协议 的代码生成控制机制从V[0-3]的详细度调节到每条回复开头的 Preamble语言/专家/计划声明、结尾的 Epilogue历史/源码树/下一步任务再到配套的autodev.py沙箱脚本与/slash命令体系。读完本文你将完整掌握这套自定义指令的工作原理、逐字段含义、安装激活流程以及如何在 ChatGPT Advanced Data Analysis 环境中用它管理跨会话的编码记忆。一、Developer Edition 是什么一条提示词如何重构 ChatGPT 的编码行为ChatGPT-AutoExpert 是 Dustin Miller 维护的一套用于增强 ChatGPT 输出质量的提示词工程方案仓库中分为两个版本Standard Editionstandard-edition/README.md面向非编码任务详细度档位为V[1-5]Developer Editiondeveloper-edition/README.md面向编码任务需要 GPT-4 与Advanced Data Analysis即 ChatGPT 的代码沙箱环境配合使用详细度档位为V[0-3]。本篇文章的绝对核心是 Developer Edition 中填入 ChatGPT Custom Instructions 第二个文本框的提示词文件 chatgpt__custom_instructions.md。它虽然只有三十多行却完整定义了 ChatGPT 在编码场景下的人格与响应协议。其设计思想README 中明示每次 ChatGPT 写代码前都被要求先输出一段 Preamble自动调整其注意力机制去关注你的需求、所需代码类型与执行计划每次回复末尾再输出一段 Epilogue把已完成的工作、写过的文件、类与符号的清单持久化在上下文里即使对话上下文不断变长也不会丢失关键记忆。它的工作方式可以用一条链路概括用户输入含 V 前缀 → Preamble语言 专家、包含项、需求、计划 → 按 CODING STYLE 编写代码 → EpilogueHistory、Source Tree、Next Task → 用户上传 autodev.py 后附加 /slash 命令与跨会话记忆恢复能力二、VERBOSITY用V[0-3]一键控制代码详细度原文档开篇即定义了编码场景下的详细度档位前缀含义说明V0code golf极简代码追求最短最巧类似代码高尔夫V1concise简洁但不过度炫技V2simple简单清晰默认档V3verbose, DRY详尽且格外注重 DRYDont Repeat Yourself原则会抽取函数使用方式非常直接把请求以V[0-3]前缀开头即可例如V0 写一个解析 CSV 的函数。该声明会随请求一并被 Preamble 中的Requirements字段读取并执行。值得对比的是Standard Edition 的详细度范围是V[1-5]V3为默认的 detailed且 Standard Edition 面向的是答案的详尽程度而 Developer Edition 的V[0-3]面向的是生成代码的冗余程度——最低档甚至允许刻意写golf 式紧凑代码最高档则要求模块化抽取与 DRY 重构。这是两个版本在提示词语义上的本质区别。从源码佐证看V语义的分化也体现在配套文件上Standard Edition 的 chatgpt_GPT4__about_me.md 将其定义为答案长度档位而 Developer Edition 的 chatgpt__about_me.md 中的 Coding Style 规则Prioritize modularity, DRY, performance, and security与V3的 DRY 要求一脉相承。三、ASSISTANT_RESPONSE逐行拆解核心响应协议原文档正文以# ASSISTANT_RESPONSE为标题声明 ChatGPT 的角色是用户资深的、好奇的、聪明的结对程序员pair programmer并规定逐步进行Lets go step by step。整段协议由三大步骤构成。步骤 1开场即 Preamble——先声明上下文再动手除非只是回答一个快速问题否则每条回复必须以如下模板开头**Language Specialist**: {programming language used} {the subject matter EXPERT SPECIALIST role} **Includes**: CSV list of needed libraries, packages, and key language features if any **Requirements**: qualitative description of VERBOSITY, standards, and the software design requirements ## Plan Briefly list your step-by-step plan, including any components that wont be addressed yet四个字段各自的职责Language Specialist锁定编程语言与领域专家角色如JavaScript Software Engineer通过角色术语激活模型对该领域风格的注意力Includes用逗号分隔列出需要的库、包与关键语言特性相当于预先锚定待使用技术栈Requirements用文字描述 VERBOSITY 档位、编码标准与软件设计要求把V2、V3这样的缩写转化为可执行的定性描述Plan简要列出逐步计划并明确本回合暂不处理的部分为多轮任务铺路。developer-edition 的 README 给出了一个完整的 Preamble 实战示例见 developer-edition/README.md用户请求展示一个包含类与方法、以及若干顶层函数的示例 JavaScript 文件暂不使用沙箱ChatGPT 的开场即为Language Specialist: JavaScript Software EngineerIncludes: ES6 syntax, classes, methods, and functionsRequirements: V2, focusing on readability, modularity, and standard JavaScript conventions.PlanCreate a JavaScript file outline in text form.Define two classes with methods.Add two top-level functions.步骤 2以专家角色执行编码风格协议要求 ChatGPT 以所选语言的专家角色回应并同时遵守 chatgpt__about_me.md 中定义的Coding Style规则代码必须以单行注释的形式标明路径/文件名注释必须描述**意图purpose**而非效果effect优先保证模块化、DRY、性能与安全。同时遵循其Coding process编码流程除非被告知避免使用 Jupyter展示简洁的逐步推理优先说明本回合要处理的任务/步骤一次完成一个文件再进入下一个若无法完成代码添加TODO:注释必要时主动中断并请求继续。关于代码编辑方式about_me 文件还规定了三档优先级选择① 返回完整编辑后的文件② 谨慎地使用 Jupyter 拆分、编辑、拼接并保存③ 只返回被编辑符号的定义。这套规则保证了长文件也能在沙箱中安全地增量修改。步骤 3结尾即 Epilogue——用 History / Source Tree / Next Task 锁住记忆每条回复结束时ChatGPT 必须考虑整个会话并输出如下结尾块--- **History**: complete, concise, and compressed summary of ALL requirements and ALL code youve written **Source Tree**: (sample, replace emoji) - (saved: link to file, ⚠️unsaved but named snippet, no filename) file.ext - Class (if exists) - (✅finished, ⭕️has TODO, otherwise incomplete) symbol - global symbol - etc. - etc. **Next Task**: NOT finishedshort description of next task FINISHEDlist EXPERT SPECIALIST suggestions for enhancements/performance improvements.三段各自的职能History对全部需求与全部已写代码的完整、简洁、压缩的总结防止长会话中早期内容被遗忘Source Tree以缩进树形结构列出所有文件及其中的类、方法、全局符号并用 emoji 标注每个符号的保存状态与完成状态Next Task若任务未完成写简短的下步任务描述若已完成则列出专家级增强/性能改进建议。README 中的 Epilogue 示例见 developer-edition/README.md展示了这个结构在实际会话中的样子History: Provided a sample JavaScript file with two classes (CalculatorandAdvancedCalculator) and their methods, along with two top-level functions (addandsubtract).Source Tree:⚠️ sample.js Calculator✅ add✅ subtract AdvancedCalculator✅ multiply✅ divide✅ add (global function)✅ subtract (global function)Next Task: No pending tasks. Would you like to implement this sample in a real JavaScript file?协议还明确要求尽量不省略或裁剪任何代码复杂任务要拆解到多个聊天回合完成并在需要时请求用户继续在明知下个回合要修改的位置预先埋下// TODO:注释。Emoji 状态字典Epilogue 中使用的状态 emoji 由 README 的 Emoji key 表见 developer-edition/README.md统一定义Emoji含义文件已保存到沙箱文件名可链接下载⚠️ChatGPT 生成了带文件名的代码片段但尚未保存ChatGPT 生成了代码片段但没有文件名类名如果使用了类✅符号函数/方法已完成⭕️符号尚未完成且带 TODO 注释符号尚未完成且没有 TODO 注释这套状态可视化让用户在每一回合都能一眼看出哪些文件已落盘、哪些类还欠着什么也正是跨会话恢复记忆的基础数据。四、Slash 命令沙箱内的记忆与工程化工具链命令一览配合上传的autodev.pyDeveloper Edition 在会话中获得五个/slash命令见 developer-edition/README.mdSlash Command描述/help展示有哪些可用 slash 命令/install_ctags若附带了ctags发布包则解压并安装到沙箱实验性/ctags若ctags已安装则为已保存的代码构建 ctags 文件实验性/memory保存文件、会话历史等并打包成 zip 供下载/stash准备暂存一段文本稍后用/recall取回/recall使用命令后的键名或描述取回先前/stash的文本底层实现AutoDev 类与 autodev_functions 字典这些命令并非硬编码在提示词里而是由 autodev.py 动态生成的。脚本顶部定义了SLASH_PREFIX/SLASH_SUFFIX系统提示模板并声明执行 slash 命令期间不遵循 ASSISTANT_RESPONSE 的指令见 autodev.py。核心结构是AutoDev类autodev.py每个静态方法对应一条 slash 命令方法 docstring 即该命令的执行指令help()让 ChatGPT 读取autodev_functions字典并输出一张 Markdown 命令表autodev.pystash()/recall()操作全局字典autodev_stash实现以单个名词为键暂存文本、按键名取回的临时记忆autodev.pyinstall_ctags()校验用户是否上传了uctags-*.tar.xz再调用_install_ctags()解压、寻找bin/ctags并移动至~/.local/bin/ctagsautodev.py 与 L260-L278ctags()先检查全局标志autodev_ctags然后执行ctags -R --sortyes -o /mnt/data/tags /mnt/data/最后调用_get_simple_ctag_tree()把 ctags 结果解析成源码树并合并进 Epilogue 的 Source Treeautodev.py 与 L223-L256memory()保存未落盘代码 → 生成 YAML 格式的memory.yml→ 导出 Jupyter 笔记本为jupyter.json→ 全部压缩进/mnt/data/memory.zip供下载autodev.py。脚本入口autodev.py会初始化四个全局变量——autodev_rerun是否跳过欢迎流程、autodev_ctagsctags 是否已安装、autodev_ctag_tree源码树缓存、autodev_stash暂存字典——再通过_get_methods_and_docstrings(AutoDev)把每个命令方法及其 docstring 收集进autodev_functions字典最后调用_setup()播放一段角色扮演式欢迎词。/memory会话记忆的脱水与还原memory()生成的memory.yml结构由 autodev.py 中的指令定义仓库提供了真实示例 example_memory.yml其顶层结构为memory: - timestamp: 2023-09-30T21:49:05.147752 - requirements: [] stash: stack: JavaScript - summary: Provided a sample JavaScript file, saved it, installed ctags, and generated a ctags file. - source_tree: - classes: - class: Calculator symbols: - description: Addition method name: add state: Complete ... path/filename: sample.js saved: true可见memory.yml完整记录了会话时间戳、用户全部需求列表、autodev_stash暂存内容、会话总结、以及带描述与完成状态的源码树——这正是新会话恢复记忆的数据源。跨会话工作流README 的 Slash Command Tipsdeveloper-edition/README.md每次会话结束前先执行/memory打包下载下次开始新会话时把 zip 与autodev.py放在同一条消息里一起上传AutoExpert 会自动解压 zip 并恢复上一次会话的记忆源码中由_setup()的 Uploads 步骤执行解压与memory.yml解码见 autodev.py。环境注意事项_setup()输出的欢迎信息中还包含几条重要的环境警示autodev.py沙箱环境在闲置 10 分钟后超时超时会丢失文件因此应随时用/memory下载备份已保存到沙箱的文件不受编辑历史消息或重新生成影响若出现dict object has no attribute kernel_id错误说明代码执行内核崩溃可能丢失已保存文件。这些限制直接决定了/memory工作流勤打包、勤下载的必要性。五、安装激活首次配置与逐会话启动首次安装Custom Instructions 一次性配置按 developer-edition/README.md 的步骤下载仓库最新的Source Code (zip)发布包并解压登录 ChatGPT点击左下角个人资料 省略号按钮打开设置进入Custom Instructions注意先备份你现有的自定义指令内容因为即将覆盖两个文本框将 developer-edition/chatgpt__about_me.md 的内容粘贴到第一个文本框About Me将本文的核心文档 developer-edition/chatgpt__custom_instructions.md 的内容粘贴到第二个文本框Custom Instructions点击右下角Save保存然后继续逐会话安装。逐会话启动每个编码会话都要做开启一个新对话在对话顶部选择GPT-4从菜单中启用Advanced Data Analysis点击输入框左侧的()按钮上传autodev.py不要输入任何其他文字直接点击纸飞机图标发送空消息上传该文件若一切正常你会看到标题 ChatGPT AutoExpert (Developer Edition) 及配套的工具介绍该欢迎词即_setup()的输出见 autodev.py。值得一提的是_setup()还会从CHARACTERS常量数组autodev.py中随机挑选一个虚构角色如 Gilfoyle、Deadpool、Marvin 等来主持开场欢迎随后立即回归 AutoExpert 的结对程序员角色——这是纯粹的彩蛋设计不影响后续编码协议。六、把整套机制串起来一个完整的编码会话流综合以上内容一次典型会话的实际运行链路为启动新对话上传autodev.py→_setup()播放欢迎词 → 全局变量与autodev_functions就绪提问用户以V2 实现一个带类的模块这类格式发问响应ChatGPT 先输出 PreambleLanguage Specialist / Includes / Requirements / Plan→ 按 Coding Style 与 Coding process 编写代码文件开头带路径注释、可落盘到/mnt/data→ 结尾输出 EpilogueHistory / Source Tree / Next Task中途用户随时可用/stash暂存片段、/recall取回安装了 ctags 后可用/ctags构建符号索引并自动合并进 Source Tree收尾/memory生成memory.ymljupyter.json 全部代码文件的 zip续接新会话中zip autodev.py同消息上传 → 自动解压、解码autodev_memory→ 恢复 History 与 Source Tree从上次的 Next Task 继续。这套设计把提示词工程Preamble/Epilogue 的注意力引导 沙箱工程化slash 命令与文件落盘 跨会话记忆memory.zip 还原三层能力叠加在一起是 Developer Edition 与普通请把代码写详细点式提示词的本质区别所在。若你想从零复刻或进一步改造它最直接的方式就是通读 chatgpt__custom_instructions.md、chatgpt__about_me.md 与 autodev.py 三个文件的对应关系——提示词负责定规则脚本负责给工具两者缺一不可。赞分享提示工程AI 应用AI Agent【免费下载链接】ChatGPT-AutoExpert Supercharged Custom Instructions for ChatGPT (non-coding) and ChatGPT Advanced Data Analysis (coding).项目地址https://gitcode.com/gh_mirrors/ch/ChatGPT-AutoExpert点击查看免费下载相关推荐React DayPicker 的 Root 组件自定义日历根元素的实现与源码剖析React DayPicker 的 Root 组件自定义日历根元素的实现与源码剖析 Root 是 React DayPicker 中负责渲染整个日历最外层 UI组件前端AI ShortChatGPT-Shortcut配置与自定义指南修改标题、提示词与对接自定义后端AI ShortChatGPT Shortcut配置与自定义指南修改标题、提示词与对接自定义后端 AI Short 是一个开源的 AI 提示词快捷指令库站AI 应用提示工程人工智能前端上一篇如何用WindowResizer 3步强制调整顽固窗口尺寸免费开源搞定无法拖拽的程序窗口下一篇Paradox 游戏模组管理告别混乱Irony Mod Manager 保姆级上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

为什么迁移后的 App 没有快捷方式箭头?AppPorts Stub Portal 使用全解

为什么迁移后的 App 没有快捷方式箭头?AppPorts Stub Portal 使用全解

为什么迁移后的 App 没有快捷方式箭头?AppPorts Stub Portal 使用全解 【免费下载链接】AppPorts 📦 A macOS utility to seamlessly migrate applications to external storage and reclaim local disk space.【一款 macOS 工具,无缝迁移应用…

2026/10/13 11:27:45 阅读更多 →
不依赖第三方库:原版插件实现角色模型+IK+状态机

不依赖第三方库:原版插件实现角色模型+IK+状态机

很多人问过同一个问题:在游戏客户端里做角色表现,能不能不引入第三方插件库,只靠原版插件机制完成“模型显示、IK 动画、状态机控制”?这篇文章就是一次补档。上一版没有统一目录结构和接口说明,很多读者卡在导入阶段&…

2026/10/13 11:27:50 阅读更多 →
手搓SMTP+POP3协议栈:从零实现邮件系统教学实践

手搓SMTP+POP3协议栈:从零实现邮件系统教学实践

简介:本资源是一份面向计算机网络课程设计与Java Web开发初学者的SMTPPOP3邮件系统模拟实现,聚焦协议原理实践与MVC架构落地。项目基于ServletJSPMyBatisJavaMail构建,完整覆盖用户注册登录、信息管理、邮件发送/接收/回复等核心功能&#xf…

2026/10/9 14:46:08 阅读更多 →

最新新闻

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

AI编程教程为何爆火2万Star:从零基础到生产落地的完整路径

1. 这个“2万Star”到底意味着什么:从GitHub数字看AI编程教程的真实分量很多人看到标题里“2万Star”第一反应是:哇,火了。但作为在开发者教育领域摸爬滚打十多年的老手,我得先泼一盆冷静的水——Star数从来不是教学内容质量的直接…

2026/10/14 7:19:37 阅读更多 →
DNN多分类任务核心设计:Softmax、交叉熵与PyTorch实战

DNN多分类任务核心设计:Softmax、交叉熵与PyTorch实战

2. 多分类任务的三个核心设计问题先说结论:DNN跑多分类,真正需要想清楚的只有三件事——输出层的神经元数量、输出层的激活函数、损失函数的选择。这三件事定下来,模型框架基本就定死了,后面做的都是调参和优化。2.1 输出层神经元…

2026/10/14 7:19:37 阅读更多 →
离线环境部署MySQL 5.7:tar.gz包安装与避坑指南

离线环境部署MySQL 5.7:tar.gz包安装与避坑指南

简介:本资源为 MySQL 5.7.40 在 Linux-glibc2.12 环境下的 x86_64 离线安装包,面向需要在无外网或内网环境中部署关系型数据库的运维与后端开发人员。压缩包共 379 个文件,约 646.59MB,以 h 头文件、so 动态库、xml 配置、sql 脚本…

2026/10/14 7:19:37 阅读更多 →
华为HCIP-AI测试卷高效复习指南:从背答案到动手验证

华为HCIP-AI测试卷高效复习指南:从背答案到动手验证

简介:这份华为认证HCIP-AI测试卷与答案文档,面向备考华为人工智能高级认证的考生及希望系统检验AI基础知识的开发者,帮助梳理图像处理、语音合成、HiAI生态与快应用开发等核心考点。资源包共1个docx文件,约14KB,内容以…

2026/10/14 7:19:37 阅读更多 →
基于rSVD与软阈值的Matlab高效信号去噪方法

基于rSVD与软阈值的Matlab高效信号去噪方法

1. 项目背景与核心挑战谐波噪声是信号处理领域常见的干扰类型,广泛存在于电力系统监测、机械振动分析、生物医学信号采集等场景。传统去噪方法如傅里叶滤波、小波变换在面对高维大数据集时往往面临计算效率低下、噪声鲁棒性不足的问题。这个Matlab项目提出了一种融合…

2026/10/14 7:19:37 阅读更多 →
智慧农业最后一百米:破解乡村数字化落地的设备与运维难题

智慧农业最后一百米:破解乡村数字化落地的设备与运维难题

做了快八年农业数字化项目,我最深的一个体会是:智慧农业真正难的从来不是算法有多高级、传感器有多精密,而是怎么让技术在没有网线、没有专职IT人员、甚至不少农户只用老年机的村子里,持续稳定地转起来。前段时间复盘了一个扎根基…

2026/10/14 7:18:36 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →