vscode原生不支持为代码片段添加tags等自定义元数据,description是唯一可用于伪标签搜索的字段;需用冒号分隔关键词,且languageid必须严格匹配才能生效。

VSCode 原生不支持为代码片段(snippets)添加 tags、category 或任何自定义元数据字段——你写进 JSON 的任何非标准字段(比如 "tags": ["react", "component"])都会被完全忽略,既不生效,也不报错。
为什么 description 字段是唯一可用的“标签模拟区”
VSCode 的 snippet JSON Schema 严格遵循 TextMate 规范,只认 prefix、body、description 等固定字段。但 description 是唯一允许自由书写、且会在 IntelliSense 补全面板中显示的文本字段。实际效果上,它成了唯一能承载语义分类信息的位置。
- 别在
description里写模糊描述,比如 “React 组件模板” —— 搜索时无法精准匹配 - 推荐用冒号分隔关键词,例如:
"description": "react:fc:ts:hook"或"description": "[UI] Button component (Tailwind)" - VSCode 的补全过滤器会全文匹配
description,输入fc就能筛出所有带fc的片段,相当于伪标签搜索 - 注意:空格、括号、中括号都算有效字符,但斜杠
/和点.在某些版本中可能触发意外截断,优先用短横线-或冒号:
languageId 不对,再好的“标签”也出不来
你以为加了 "description": "go:cli:subcommand" 就能在 main.go 里搜到?错。VSCode 根本不会加载这个片段——除非它被放在正确的语言级配置文件里,且当前编辑器的 languageId 完全匹配。
- 打开命令面板 → 运行
Developer: Inspect Editor Tokens and Scopes,看右上角显示的 Language ID(不是文件后缀!) -
.go文件通常是go,但.tsx几乎总是typescriptreact,不是tsx(该 ID 不存在于内核) - 全局 snippets(
user.code-snippets)默认不生效,需手动开启设置:editor.suggest.showSnippets设为true,且当前语言支持 snippet 提示 - 工作区级 snippets 必须放
.vscode/snippets/xxx.code-snippets,不能放错目录层级,也不能被files.associations覆盖语言映射
body 里用 $TM_SELECTED_TEXT 实现“上下文感知标签”
真正有用的“标签”,不是静态分类,而是能根据选中文本动态生成结构的片段。比如你想快速把 fetchUser 包裹成 useQuery(...),靠 description 标签没用,得靠 body 里的变量注入能力。
-
$TM_SELECTED_TEXT是 VSCode 内置变量,仅在有选中文本时生效;没选中则为空字符串 - 示例(放入
typescriptreact.json):"useQuery wrapper": { "prefix": "uq", "body": ["const { data } = useQuery(['${1:$TM_SELECTED_TEXT}'], () => $TM_SELECTED_TEXT());$0"], "description": "react:query:hook" } - 必须搭配快捷键使用才高效:选中函数名 →
Ctrl+Shift+P→ 输入Insert Snippet→ 选该条目;或绑定快捷键到editor.action.insertSnippet - ⚠️ 注意:
$TM_SELECTED_TEXT不会自动转义引号或换行,若选中内容含双引号,会导致 JSON 解析失败——建议在body中用单引号包裹字符串
最易被忽略的点:VSCode 对 snippet JSON 格式零容忍——一个尾逗号、一个未闭合的引号、一个没包裹在数组里的 body 字符串,都会让整个文件的片段静默失效,且不提示任何错误。调试时别猜,直接用 JSON 验证工具过一遍,再检查 languageId 是否真实匹配。











