如何自定义 Emmet 的 snippets、preferences 和 syntaxProfiles

Emmet 的自定义能力来自三个配置文件:snippets.json 用来定义或覆盖代码片段,preferences.json 用来调整行为偏好,syntaxProfiles.json 用来控制不同语法的输出格式。三者都通过编辑器的 Emmet 配置入口加载,适合需要统一团队缩写习惯、适配特定框架写法或改变输出缩进与属性风格的场景。如果只是日常写 HTML/CSS,默认配置通常够用;一旦发现某个缩写展开结果不符合项目规范,就应该从这三个文件入手。

三个配置文件分别管什么

文件 作用 典型改动
snippets.json 定义缩写到输出的映射,可新增或覆盖已有片段 把 ! 展开成团队统一的 HTML 骨架
preferences.json 调整 Emmet 的全局行为偏好 改变属性输出顺序、是否输出自闭合斜杠
syntaxProfiles.json 针对某种语法(如 html、xml)设定输出格式 让 HTML 输出使用单引号属性、指定缩进

三者的关系是:snippets.json 决定“展开成什么”,preferences.json 决定“整体怎么表现”,syntaxProfiles.json 决定“某种语法下怎么排版”。改错文件往往表现为“改了没生效”,所以先确认要改的是哪一层。

用 snippets.json 定义或覆盖片段

snippets.json 的核心是键值对:键是缩写,值是展开后的内容。Emmet 会先解析你输入的缩写,再查这张表决定输出。

例如想让 ! 生成一个带特定 lang 和视口设置的骨架,就在 snippets.json 的 html 段里覆盖 doc 或 ! 对应的条目。覆盖已有片段时,键名必须与内置片段一致,否则会变成新增而不是替换。

需要注意两点:

  • 片段值里可以包含 ${1}、${2} 这类占位符,展开后光标会依次停在这些位置,和内置片段的行为一致。
  • 如果新增的缩写与内置缩写重名,你的定义会覆盖内置定义;想保留内置行为又想加新写法,换一个不冲突的键名。

用 preferences.json 调整行为偏好

preferences.json 存放的是影响 Emmet 整体行为的选项,而不是具体某个缩写的输出。它适合处理“所有展开结果都要这样”的需求,比如属性书写风格、是否保留某些默认行为。

判断该不该放这里的方法:如果这个改动对每一个缩写展开都成立,放 preferences.json;如果只对某类标签或某种语法成立,放 syntaxProfiles.json 或 snippets.json。

用 syntaxProfiles.json 控制语法输出格式

syntaxProfiles.json 按语法名组织配置,常见的是 html 和 xml。它决定的是输出格式层面的规则,例如:

  • 属性值使用单引号还是双引号
  • 空元素是否输出自闭合斜杠
  • 缩进用空格还是制表符、缩进几格

因为它是按语法生效的,所以同一份配置里可以给 html 和 xml 设定不同规则。改完后,用同一个缩写分别在两种语法的文件里展开,就能验证是否按预期分流。

验证与常见卡点

改完配置后,用一条能体现改动的缩写做验证,而不是凭感觉判断。例如改的是属性引号风格,就展开一个带属性的标签,直接看输出。

常见卡点:

  • 改了没生效:先确认编辑器是否重新加载了配置文件,很多编辑器需要重启或重新打开配置入口才会读取新内容。
  • 覆盖失败:覆盖内置片段时键名拼写必须完全一致,大小写和层级都要对上。
  • 放错文件:把只该影响 HTML 的规则写进了 preferences.json,结果影响了其他语法。
  • JSON 语法错误:配置文件是 JSON,多一个逗号或少一个引号都会导致整份配置不被加载,改动后先确认文件能被正常解析。

该从哪里开始

如果目标是统一团队的 HTML 骨架,从 snippets.json 覆盖 ! 开始;如果目标是统一输出风格(引号、缩进、自闭合),从 syntaxProfiles.json 开始;如果某个行为对所有语法都该变,再考虑 preferences.json。一次只改一个文件、用一条缩写验证,比三个文件一起改更容易定位问题。

docs.emmet.io