必须将editor.snippetSuggestions设为"top",这是唯一稳定使自定义代码片段置顶的方式;需手动写入settings.json,且不受editor.suggest.orderBy等配置影响。

VSCode 的代码段(Snippets)默认不按你期望的顺序触发——不是写得越靠前就越先出现,而是由语言模式、范围和权重共同决定。
为什么 console.log 总是压过你自定义的 log 片段?
VSCode 对内置或扩展提供的 Snippet 会自动设置 "scope": "javascript,typescript" 和隐式高权重;而用户自定义 Snippet 若没显式指定 scope 或 prefix 冲突,就会被降权甚至忽略。
- 没有
scope的 Snippet 默认作用于所有语言,但匹配优先级极低 - 多个 Snippet 共享相同
prefix(如都设为log)时,VSCode 按“语言 scope 精确度”排序:具体语言 > 通用语言 > 无 scope - 扩展自带的 Snippet(比如 ESLint、Prettier 插件)可能动态注入,覆盖用户配置
如何强制让自己的 Snippet 排第一?
关键不是删别人,而是提高自己片段的“匹配确定性”和“上下文贴合度”。
- 在用户 Snippet JSON 中明确写死
"scope": "javascript,typescript,jsx,tsx",不要留空 - 把
prefix改得更特异,比如不用log,改用logd(debug log)或logt(timestamped log),避开和内置冲突 - 添加
"body": ["console.log('$1');"]后,加一行"description": "My debug log"—— VSCode 会用 description 做模糊匹配辅助,提升曝光 - 避免在
snippets/下放多个同名文件(如javascript.json和js.json),它们会合并,但 scope 冲突时行为不可控
检查 Snippet 是否真的生效了?
别只看 Ctrl+Space 弹窗——那个是智能提示(IntelliSense),混合了 Snippet、变量、函数等。要单独验证 Snippet:
- 在目标文件中输入你的
prefix,然后按Ctrl+Shift+Space(触发 Snippet 专用补全) - 如果没出现,打开命令面板(
Ctrl+Shift+P),运行Developer: Toggle Developer Tools,切换到 Console 标签页,输入editor.getLanguageConfiguration('javascript').onEnterRules可查当前语言是否禁用了 snippet 触发 - 临时禁用所有插件(
code --disable-extensions启动),再试一次——确认是不是某扩展劫持了 snippet 注册逻辑
真正难调的不是怎么写 Snippet,而是理解 VSCode 把它当“语言辅助规则”而非“静态模板”来调度。scope 错一位、prefix 多一个点、JSON 多一个逗号,都可能导致整个片段静默失效。











