atom 的 tab stop 编号必须从 $1 开始连续递增,$1、$2、$3 须严格按自然数顺序出现,不可跳号或重复,否则占位符失效;默认值须用 ${1:"default"} 语法;scope 必须精确匹配 grammar 名如 '.source.js.jsx';修改 snippets.cson 后需手动执行 snippets: reload snippets。

tab stop 编号必须从 $1 开始连续递增
Atom 的 tab stop 是严格顺序机制,$1、$2、$3 必须按自然数依次出现,不能跳号(比如只有 $1 和 $3),也不能重复(两个 $2)。一旦编号断裂或重复,后续所有占位符都会失效——你 Tab 多次,光标可能卡在第一个位置不动,或者直接跳到 $0 退出编辑态。
常见错误包括:
- 手误写成
$01或$10:Atom 只认单数字编号,$01被当作普通文本,不触发跳转 - 想让某个参数可选却写成
${2:default}却漏了$1:编号断层,$2不生效 - 把
$0放在最前面:$0 $1 $2——一触发片段就立刻退出,根本没法填参数
默认值要写在 ${n:"value"} 里,不能用等号或花括号外赋值
给占位符设默认文本,必须用 ${1:"default"} 这种语法。它不是变量赋值,而是 Atom 片段引擎识别的特定 token。
这些写法都无效:
-
$1="default"→ 当作纯文本插入,无占位功能 -
$1{default}→ 解析失败,整个 body 可能错位 -
${1: "default"}(冒号后带空格)→ 部分版本会忽略默认值,只留空占位
多参数组合时,推荐显式写出全部编号,比如 React 函数组件片段:const ${1:name} = () => { return ${3:content}${2}> }; export default ${1};,这样 Tab 三次就能依次编辑名称、标签名、内容。
scope 写错,参数跳转根本不会启动
片段是否加载、参数能否跳转,第一步就卡在 scope 匹配上。scope 不是语言名,而是 Atom 实际识别的 grammar 名,比如 JavaScript 文件是 '.source.js',JSX 是 '.source.js.jsx',TypeScript 是 '.source.ts'。
查当前 scope 的唯一可靠方式:
- 打开目标文件,按
Cmd+Shift+P(macOS)或Ctrl+Shift+P(Win/Linux) - 输入并执行
Editor: Log Cursor Scope - 看输出,如显示
source.js.jsx,就写scope: '.source.js.jsx'
多个语法共用一个片段?必须用数组:scope: ['.source.js', '.source.ts'],写成字符串拼接或逗号分隔都会失效。
改完 snippets.cson 后不 reload,参数跳转永远不生效
Atom 不监听 snippets.cson 文件变化,改完必须手动重载。重启编辑器太慢,直接用命令更准:
- 按
Cmd+Shift+P/Ctrl+Shift+P→ 输入Snippets: Reload Snippets回车 - 或用快捷键:
Cmd+Alt+Ctrl+L(macOS)、Ctrl+Shift+F5(Win/Linux)
如果 reload 后仍没反应,优先检查三件事:
- 文件路径是否正确:
~/.atom/snippets.cson(macOS/Linux)或%USERPROFILE%\.atom\snippets.cson(Windows) - 文件后缀是不是
.cson(不是.json、.cson.bak或拼错成snippet.cson) - body 里有没有未闭合的三重单引号
'''或缩进混乱导致 CSON 解析失败
参数跳转看着简单,实际依赖编号规则、scope 精确匹配、CSON 语法和 reload 动作四者严丝合缝。少一个环节,$1 就只是个字符串。











