prefix需满足三条件:长度2–4、纯小写或数字、不与内置补全冲突;须匹配语言id而非扩展名;body须为字符串数组,含prefix、body、description三字段,$1–$9为跳转位,$0为终落点。

prefix填什么才真正生效
触发词不是随便打几个字母就能用的,它必须满足三个硬条件:长度 2–4 个字符、纯小写字母或数字、不和当前语言内置补全冲突。比如在 JavaScript 文件里设 for 为 prefix,VSCode 会优先展示语言服务自带的 for 循环模板,你的片段基本不会出现。
实操建议:
- 用语义缩写,比如
ffn(fat arrow function)、mt(mock test)、hdr(header comment) - 避免单字符如
l或c,容易被 Emmet、Prettier 或其他扩展劫持 - 同一类功能加统一前缀,例如测试相关全用
test开头:testfn、testskip - 改完保存后,别急着输——先按
Ctrl+Space手动唤出建议列表,搜你的prefix,看到带「snippet」图标的条目才算加载成功
为什么 prefix 输对了也不弹出来
90% 的失效不是因为 prefix 写错了,而是语言模式没对上。VSCode 绑定的是语言 ID(如 javascript、typescriptreact),不是文件扩展名。一个 .js 文件如果右下角显示的是 Plain Text,哪怕你配置了 javascript.json,它也完全不响应。
排查要点:
- 点右下角语言标识 → 选 “Change Language Mode” → 手动切到正确 ID(注意:React 相关要选
javascriptreact,不是javascript) - 在
body里临时加一行"// lang=${TM_LANGUAGE}",触发后看输出是不是你预期的语言 ID - 工作区级片段必须放在
.vscode/snippets/javascript.json,不能是.vscode/snippets/js.json或.vscode/my-snippets.json - 全局片段要选 “New Global Snippets file”,生成的文件名必须以
.code-snippets结尾,不是.json
body 里 $1、$0 和变量怎么配合才不翻车
到 是跳转位,<p><code>$1 到 $9 是跳转位,$0 是最终光标落点——漏掉 $0,编辑完最后一个占位符就自动退出,没法补分号或闭合括号;漏掉 $1,光标直接卡在开头,交互完全断掉。
<p><code>$1 到 $9 是跳转位,$0 是最终光标落点——漏掉 $0,编辑完最后一个占位符就自动退出,没法补分号或闭合括号;漏掉 $1,光标直接卡在开头,交互完全断掉。,编辑完最后一个占位符就自动退出,没法补分号或闭合括号;漏掉 ,光标直接卡在开头,交互完全断掉。
变量不是实时响应的,全是插入瞬间的快照:
-
$TM_FILENAME_BASE在新建未保存文件里是空字符串,别指望它填出名字 -
$TM_SELECTED_TEXT必须先选中文本再触发,否则留空,不会报错也不会提示 -
$CLIPBOARD在 macOS 上需要手动授权,Windows/Linux 通常可用,但别在关键流程里强依赖它 - 想带默认值?用
${1:console},不是$1(console),括号位置错一个字符就失效
JSON 格式和字段哪些不能省
一个能跑起来的片段,prefix、body、description 这三个字段缺一不可。body 必须是字符串数组,写成 "body": "console.log($1);" 看似简洁,实际静默失败,VSCode 控制台会报 Invalid snippet definition。
常见掉坑点:
-
body是数组,哪怕只有一行也要写成["console.log(${1:msg});"] - JSON 里不能有单行注释
//,多一个逗号、少一个引号,整个文件就废 - 片段外层是对象
{},不是数组[],别套错结构 - 语言专属文件名必须和语言 ID 完全一致:
python.json可用,py.json不识别;typescriptreact.json有效,tsx.json无效
最麻烦的是变量上下文依赖——$TM_FILENAME_BASE 要求文件已保存,$TM_SELECTED_TEXT 要求先选中,这些限制不会在编辑时提醒,只会在触发后留个空值让你自己猜。











