snippets.cson 中联动占位符需用 ${1:default} 声明式写法实现同步编辑,${1} 后续引用才联动;scope 必须精确匹配 grammar 作用域;body 多行用 \n 且缩进对齐;修改后须执行 Snippets: Reload Snippets。

snippets.cson 里怎么写联动占位符
联动占位符不是锦上添花,是避免重复改名出错的核心机制。比如函数名定义和调用处要同步更新,就得靠 ${1:MyComponent} + ${1} 这种写法。
常见错误现象:写了两个 $1,但光标跳转后改了第一个,第二个没变——那说明你用了 $1 而不是 ${1:xxx} 开头的声明式写法。
-
${1:MyComponent}必须出现在 body 中第一次出现的位置,之后所有同编号的${1}才会联动 - 不能混用
$1和${1:xxx};要么全用带默认值的声明式,要么全用裸编号(但裸编号无法设默认值) - 嵌套联动可用
${2:${1}},表示第二个位置默认取第一个位置的值,适合 props 透传场景 - 换行必须显式写
\n,否则 Atom 解析 body 时会把多行字符串截断,导致占位符丢失
scope 匹配失败时怎么快速定位
敲了 rfc + Tab 没反应?八成不是 snippet 写错了,而是 scope 根本没匹配上。Atom 不看文件后缀,只认当前 grammar 解析出的作用域链。
使用场景:你在写 .jsx 文件,但 snippet 的 scope 写的是 '.source.js',那它永远不会加载。
- 按
Ctrl+Shift+P(Win/Linux)或Cmd+Shift+P(macOS),输入Editor: Log Cursor Scope,回车查看光标所在位置的真实 scope 链,例如source.js.jsx meta.function.js - scope 键必须写成字符串或数组:
'.source.js.jsx'或['.source.js', '.source.js.jsx'],注意逗号后有空格 - 右下角语言标识显示
Plain Text?点它手动切到JavaScript (JSX),否则 scope 永远是text.plain - 别用
*当 fallback —— 它会让 Atom 对每个文件都扫描所有 snippet,明显拖慢 Tab 响应
body 多行模板怎么写才不崩
多行内容不是直接回车就行,CSON 对缩进和换行极其敏感。顶格写、空行、裸回车都会让 Atom 忽略整个 snippet。
参数差异:旧写法用数组存每行字符串(body: ['line1', 'line2']),现在推荐单字符串 + \n,但首行缩进必须对齐 body: 后的冒号。
-
body值必须缩进 2 空格(或 1 tab),与prefix对齐;顶格写直接失效 - 换行统一用
\n,不要依赖编辑器自动换行;return (\n \n $3\n $2>\n)是安全写法 - 字符串含单引号要转义:
'console.log(\'$1\', $2);',否则 CSON 解析报错 - body 里不能有未闭合的括号或引号,CSON 语法检查比 JSON 更严格,末尾逗号也不允许
为什么 reload 后还是不生效
改完 snippets.cson 保存,却没反应?不是 Atom 坏了,而是重载动作没走对路径。
性能影响:每次重载会重新解析全部 snippet,如果文件里有语法错误,Atom 会静默跳过整段,而不是报错提示。
- 必须执行
Snippets: Reload Snippets(不是Window: Reload或重启 Atom) - 命令面板里搜不到?确认
snippets.cson路径正确:~/.atom/snippets.cson(macOS/Linux)或%USERPROFILE%\.atom\snippets.cson(Windows) - 文件名大小写必须全小写,
Snippets.cson或snippets.CSON都不识别 - 删掉文件里所有注释(CSON 不支持
//或#注释),它们会导致解析中断
最易被忽略的点:CSON 不允许末尾逗号、不接受 JSON 引号规则、不读项目根目录下的 .snippets.cson —— 它只认那个唯一路径下的唯一文件。











