VSCode大纲跳转需满足三条件:启用Outline显示、禁用自动折叠、语言模式为Markdown;仅识别顶格ATX标题(# 标题),忽略缩进、多空格、全角井号、Setext及注释行;中文锚点需统一用vscode规则生成。

VSCode 侧边栏大纲(Outline)能直接跳转到 Markdown 标题,但前提是它得“看见”那些标题——不是所有带 # 的行都会被识别,也不是点了快捷键就一定有反应。
为什么 Ctrl+Shift+O 按了没反应或显示空白?
这不是插件没装,而是三个基础条件没满足:
-
explorer.experimental.showOutline必须设为true(新版设置里叫 “Explorer > Show Outline”) -
outline.automaticCollapse必须是false,否则大纲一出来就自动收成单行 - 当前文件语言模式必须是
markdown:看右下角状态栏,如果不是,点击它 → 选Markdown
如果都对了还是空白,按 Ctrl+Shift+P 运行 Developer: Toggle Developer Tools,在 Console 里看有没有 Failed to resolve outline provider for 'markdown' —— 有就说明内置 Markdown 语言服务器没加载,重启 VSCode 或重装 vscode.markdown-language-features 扩展。
哪些 # 标题会被 Outline 忽略?
VSCode 只解析 ATX 风格、语义干净的标题行。以下写法会导致标题“消失”:
-
# 标题前有空格或制表符 → 不识别(必须顶格,或仅允许 1 个 tab 缩进) -
#和文字之间多于一个空格,比如# 标题(两个空格)→ 跳过 - 用了全角井号
#(U+FF03)→ 完全不识别 - 标题行末尾带注释或 HTML,比如
# 标题→ 解析中断,后续标题可能错位 - 用了 Setext 风格(
标题\n===或标题\n---)→ Outline 默认不支持
最稳妥写法:# 标题(一个 # + 一个空格 + 标题文本),整行不混入任何其他符号。
将任意网站转换为文件系统,自动抓取网站并将页面挂载为 Markdown 文件,可使用 grep、diff、cat 等标准 Unix 命令进行搜索、比较、读取和浏览。
中文标题能跳转,但点不动?锚点不匹配
这不是大纲的问题,是链接目标和实际锚点 ID 对不上。VSCode 内置预览把中文标题转成 URL 编码(如 #%E4%B8%AD%E6%96%87),而你用插件生成的 TOC 可能写了 #中文 —— 两者不一致,自然跳不了。
解决方法只有一条:统一用 VSCode 的规则。
- 装了
Markdown All in One?打开设置,搜markdown.extension.toc.slugifyMode,把它从默认的github改成vscode - 改完后,**手动删掉旧目录**,再运行
Markdown: Create Table of Contents重生成 - 别指望旧目录自动更新——这个插件不监听标题变更
大纲跳转和文档内 TOC 是两套系统,别混着调
侧边栏 Outline 是导航视图,靠语言服务器实时提取符号;文档里插的 TOC 是纯文本列表,靠正则或 AST 扫描生成。它们互不影响:
- 关掉 Outline,文档里的 TOC 照样可点击(只要渲染环境支持)
- 删掉文档里的 TOC,Outline 面板照样显示所有
#–######标题 - Outline 能跳转到
######级标题,但很多 TOC 插件默认只生成到#####(由markdown.extension.toc.levels控制)
最容易被忽略的一点:Outline 的跳转依赖光标所在位置是否“被语言服务器识别为标题符号”。如果你在代码块里写了 # 标题,或者 Front Matter 区域(---\n...)里写了标题,Outline 会直接跳过——它只看语义上属于正文的标题行。










