1. 为什么 TodoTree 一开就满屏噪音
TodoTree 是 VS Code 里一个把// TODO、// FIXME、// HACK这类注释聚合成侧边栏树形列表的插件。它本身不写代码,只做一件事:扫描工作区里的文件,把匹配到的标记按目录结构列出来,点一下就能跳转。适合谁?适合那种项目里 TODO 散落在几十个文件、靠 Ctrl+Shift+F 搜又嫌乱的人。
问题出在默认扫描范围。你打开一个前端项目,node_modules里成千上万个包,每个包里都可能带着原作者写的 TODO;dist、build、.next、coverage这些产物目录同样一堆。结果就是侧边栏刷出几千条待办,真正属于你业务代码的那几条被淹得看不见。我试过在一个中型项目里不配忽略规则,TodoTree 直接卡住好几秒才渲染完,列表里 95% 是第三方依赖的注释。
所以核心诉求很明确:让 TodoTree 只扫业务代码目录,把依赖、产物、缓存、日志全部挡在门外。这件事靠settings.json里的todo-tree.filtering.excludeGlobs就能解决,不需要改插件源码,也不需要装额外扩展。下面从配置骨架讲到逐项验证,顺带把 TaoToken 的 Key/API 通道校验一起串起来——因为很多人在配环境变量时会把 Key 写错位置,导致工具链报错却找不到原因,统一走一个通道能省不少排查时间。
2. TaoToken 前置:统一 Key 与 API 通道
在动手改 TodoTree 配置之前,先把环境通道理清楚。TaoToken 是一个统一的大模型 API 接入层,官网地址是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 入口是 https://taotoken.net/api 。它的作用是让你用一套 Key 去调用不同模型,不用在每个工具里分别填不同厂商的地址和密钥。
为什么配 TodoTree 要提这个?因为实际开发里,TodoTree 扫出来的待办经常要配合 AI 辅助去处理——比如把 TODO 列表丢给模型做优先级排序,或者在编码 Agent 里自动读取待办。如果你的 Key 散落在多个配置文件里,一旦某个工具报 401,你根本分不清是 Key 过期、地址写错还是环境变量没加载。统一走 TaoToken 之后,所有工具读同一个TAOTOKEN_API_KEY,排查面就收窄了。
你需要先拿到 Key。进入控制台创建:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite ,然后在 API Keys 页面生成:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。生成后复制那串以sk-开头的字符串,先别急着写进项目,放到系统环境变量里更安全。
# macOS / Linux:写入 shell 配置 echo 'export TAOTOKEN_API_KEY="sk-你的实际Key"' >> ~/.zshrc source ~/.zshrc # Windows PowerShell:写入用户级环境变量 [Environment]::SetEnvironmentVariable("TAOTOKEN_API_KEY", "sk-你的实际Key", "User")验证环境变量是否生效:
# macOS / Linux echo $TAOTOKEN_API_KEY # Windows PowerShell(新开一个窗口) $env:TAOTOKEN_API_KEY能打印出完整 Key 就说明通道就绪。这一步做完,后面 TodoTree 的配置校验才有统一的参照物——你可以用同一个 Key 去测模型对话、测 Coding Plan,确认不是通道问题再回头查插件配置。
3. 可复制的 settings.json 忽略配置骨架
TodoTree 的过滤配置分两层:一层是todo-tree.filtering.excludeGlobs,决定哪些路径不扫描;另一层是todo-tree.filtering.includeGlobs,决定只扫描哪些路径。两者可以配合用,但最省事的是只配 exclude,把噪音目录列全。
打开 VS Code,按Ctrl+Shift+P(macOS 是Cmd+Shift+P),输入Preferences: Open User Settings (JSON),在打开的settings.json里加入下面这段。如果你只想对当前项目生效,就改成打开工作区的.vscode/settings.json。
{ "todo-tree.filtering.excludeGlobs": [ "**/node_modules/**", "**/dist/**", "**/build/**", "**/out/**", "**/.next/**", "**/.nuxt/**", "**/coverage/**", "**/.cache/**", "**/tmp/**", "**/logs/**", "**/*.min.js", "**/*.min.css", "**/*.map", "**/vendor/**", "**/__pycache__/**", "**/.venv/**", "**/venv/**", "**/target/**", "**/.git/**" ], "todo-tree.filtering.includeGlobs": [ "**/src/**", "**/app/**", "**/lib/**", "**/components/**" ], "todo-tree.filtering.useBuiltInExcludes": "fileExcludesAndSearchExcludes", "todo-tree.general.tags": [ "TODO", "FIXME", "HACK", "XXX", "BUG" ], "todo-tree.highlights.defaultHighlight": { "foreground": "#ffffff", "background": "#ff6b35", "type": "text" } }逐项说明关键参数。excludeGlobs是数组,每一项是一个 glob 模式,**/表示任意层级,/**表示目录下所有内容。useBuiltInExcludes设为fileExcludesAndSearchExcludes后,TodoTree 会自动继承 VS Code 的files.exclude和search.exclude设置,你不用重复写一遍。includeGlobs是可选的,如果你项目结构规整,直接限定只扫src就够了,比列一长串 exclude 更干净。
注意 glob 的写法坑:**/node_modules和**/node_modules/**效果不同。前者匹配目录本身,后者匹配目录下所有文件。实测下来,写**/node_modules/**才能彻底挡住里面的文件。另外*.min.js这种要写成**/*.min.js,否则只匹配根目录。
如果你用的是工作区配置,记得.vscode/settings.json会覆盖用户级配置,两边都写了 exclude 的话以工作区为准。改完保存,TodoTree 会自动重新扫描,不需要重启 VS Code。
4. 验证请求与成功结果
配置写完不能只看侧边栏变没变,要做几个确定性验证。
第一步,确认插件读到了你的配置。按Ctrl+Shift+P输入Todo Tree: Refresh,强制重扫。然后打开 TodoTree 侧边栏,看列表顶部有没有出现node_modules相关的条目。正常情况下应该一条都没有。
第二步,用命令面板查实际生效的排除规则。按Ctrl+Shift+P输入Todo Tree: Show Output,在输出面板里能看到插件启动时加载的 glob 列表。如果你写的**/dist/**出现在里面,说明配置被正确解析。
第三步,造一个测试用例。在node_modules下随便找个包,往它的index.js里加一行// TODO test-ignore,保存。等 TodoTree 刷新,侧边栏不应该出现这条。然后在src下建个test.js,写// TODO test-visible,保存后侧边栏应该立刻出现这条。一负一正两个用例都通过,才算配置生效。
第四步,验证 TaoToken 通道。用同一个 Key 发一次请求,确认通道没被配置改动影响:
curl -X POST https://taotoken.net/api/v1/chat/completions \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "claude-3-5-sonnet", "messages": [{"role": "user", "content": "回复 OK 两个字母"}], "max_tokens": 10 }'返回里带"content": "OK"就说明 Key 和 API 地址都正常。如果这里报 401,先别怀疑 TodoTree,去控制台确认 Key 状态:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。如果报模型不存在,去模型对话页面确认可用模型名:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=chat&utm_campaign=rewrite 。
成功结果长这样:TodoTree 侧边栏只列出src、app、components下的待办,条目数从几千降到几十,点击跳转精准落在业务文件。输出面板里能看到 exclude 规则被加载,node_modules不在扫描范围内。
5. 本篇常见错排查
配置写了但没生效。最常见原因是 JSON 语法错误。settings.json里多一个逗号、少一个引号,整个文件解析失败,VS Code 会静默忽略。打开文件看有没有红色波浪线,或者按Ctrl+Shift+P输入Developer: Reload Window重载后看右下角有没有报错提示。
excludeGlobs 写了但 node_modules 还在。检查 glob 是不是写成了**/node_modules(少了尾部/**)。另外确认你改的是用户设置还是工作区设置,如果项目里.vscode/settings.json也定义了excludeGlobs,它会覆盖用户级配置,两边要合并写。
includeGlobs 和 excludeGlobs 冲突。如果 include 里写了**/src/**,exclude 里又写了**/src/generated/**,exclude 优先级更高,generated目录会被排除。这个行为是符合预期的,但如果你发现某个业务目录没被扫到,先检查是不是被某条 exclude 规则误伤了。
TaoToken 请求报 401 或 403。先确认环境变量在当前终端会话里能打印出来。VS Code 的集成终端可能没加载你刚写的 shell 配置,重启 VS Code 或者手动source一次。如果 Key 确认无误还是 401,去控制台看 Key 是否被禁用或额度耗尽。
模型名写错导致 404。TaoToken 的模型名要和平台文档一致,别自己拼。去模型对话页面发一条测试消息,看它实际用的模型标识,复制过来用。
TodoTree 扫描卡顿。如果项目特别大,即使配了 exclude 还是慢,把todo-tree.filtering.includeGlobs收窄到只扫src,并且关掉todo-tree.general.showActivityBarBadge减少渲染压力。
6. 把配置和通道固定下来
TodoTree 的忽略配置本质是一份 glob 清单,写一次就能长期用。建议把excludeGlobs和includeGlobs放进项目的.vscode/settings.json并提交到版本库,这样团队每个人拉下来就是一致的扫描范围,不会出现你这边干净、同事那边满屏的情况。
TaoToken 这边,Key 放环境变量、地址统一用 https://taotoken.net/api ,所有工具读同一个来源。需要长期跑编码任务或 Agent 的,可以看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite ,它把调用额度和通道管理放在一起,省得每个工具单独配。接入细节查文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Claude Code 相关的接入说明在:https://taotoken.net/claude-code-anthropic?utm_source=taotoken_aicg_blog_end&utm_content=claude-code-anthropic&utm_campaign=rewrite 。
最后留一个实用习惯:每次改完settings.json,用Todo Tree: Refresh强制重扫一次,再打开输出面板扫一眼加载的 glob 列表。这个动作花不了十秒,但能帮你确认配置真的被解析了,而不是改了个寂寞。