用 $tm_filename_base 配合正则 $tm_filename_base/^(a-z)|-(.)/u$1u$2/g 可可靠转为 pascalcase,如 user-profile.tsx→userprofile;占位符索引须唯一递增,ai 插件易与 snippets 冲突需手动触发规避。

如何用 Snippets 变量动态提取文件名并生成组件名
直接用 $TM_FILENAME_BASE 无法保证 PascalCase 风格,比如 user-profile.tsx 会变成 user-profile,而非 UserProfile。必须配合正则替换才能可靠转换。
-
$TM_FILENAME_BASE/:^([a-z])|-(.)/u$1u$2/g是最简可行写法:匹配开头小写字母或短横线后的字母,统一转大写 - 若文件名含多个短横线(如
api-user-list.vue),该正则仍能正确产出ApiUserList - 注意不要漏掉
g标志,否则只替换第一个匹配项 - VSCode 不支持原生的
toPascalCase()函数,别试图写 JS 表达式——它只认字符串替换语法
选中文本后用正则批量格式化命名的边界情况
${TM_SELECTED_TEXT/([a-z])([A-Z])/-/g} 看似能驼峰转短横线,但实际会把 XMLParser 错切为 XML-Parser。真正安全的做法是限定匹配范围。
- 优先用
${TM_SELECTED_TEXT/([a-z0-9])([A-Z])/$1-$2/g}:只在小写字母/数字后接大写字母时插入短横线 - 对全大写缩写(如
HTTPStatus)无效,需人工干预或额外规则 - 如果选中的是路径字符串(如
src/pages/HomePage.vue),先用${TM_SELECTED_TEXT/.*/(.*)..*/$1/}提取文件名再处理 - 所有正则中的
$1、$2必须用反斜杠转义,写成\$1,否则会被 VSCode 当作变量解析
Snippets 中占位符跳转顺序被意外打断的原因
写 ${1:default} ${2:another} ${1:again} 看似合理,但 VSCode 会把两个 ${1:...} 视为同一编辑域——光标跳过 ${2:...} 直接回到第一个位置,破坏预期流程。
- 占位符索引必须严格递增且唯一,重复索引会导致跳转逻辑失效
-
$0表示最终光标位,只能出现一次;多写会以最后一个为准 - 想实现“填完 A 再填 B,最后回到 A 修改”,得用
${1:default}→${2:another}→${3:final},再手动回退,不能靠索引复用 - 嵌套占位符(如
${1:${2:value}})不被支持,VSCode 解析器会直接忽略内层
为什么 AI 插件生成的代码常和 Snippets 冲突
AI 插件(如 Claude 或 Copilot)在补全时默认覆盖当前行,而 Snippets 插入后光标停在 $0 位置——两者触发时机重叠时,AI 可能误把 $0 当作待补全文本,生成无意义内容。
- 典型现象:输入
log触发 Snippet,刚插入console.log('$1');,AI 立刻接上undefined或随机字符串 - 临时解法:在 Snippets 的
body末尾加空行或注释,制造缓冲区,避免 AI 紧贴插入 - 长期规避:关闭 AI 插件的
autoTrigger,改用手动快捷键(如Ctrl+Enter)触发,与 Snippets 的Tab跳转错开 - 别指望插件自动识别
$1占位符——AI 模型看到的是纯文本,不是 VSCode 的语法树











