Emmet 在 Sublime Text 中需同时满足语法识别为 HTML、快捷键未被劫持、缩写格式正确三者才生效;右下角语法必须为 HTML,Tab 冲突时可用 Ctrl+E 验证,缩写须严格遵循语法规则且不校验 HTML 语义。

Emmet 在 Sublime Text 里不是“装了就能用”,而是“设对了语法 + 按对键位 + 写对格式”三者同时满足才生效。绝大多数人卡在第一步:文件根本没被识别为 HTML。
确认当前文件是 HTML 语法模式
Emmet 不看文件后缀名,只认编辑器右下角显示的语法类型。哪怕你刚保存成 index.html,如果右下角写着 Plain Text 或 JavaScript,html:5 按 Tab 就一定没反应。
- 新建文件后,必须按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS),输入Set Syntax: HTML回车 - Vue / JSX 文件需额外配置:在
Preferences → Package Settings → Emmet → Settings的用户设置中加入:"emmet_include_languages": {"vue-html": "html", "javascriptreact": "html"} - 检查
Preferences → Settings用户设置里是否有"emmet_enabled": true(Sublime Text 4 默认禁用,必须显式开启)
Tab 键不展开?先换 Ctrl+E 验证
Tab 是默认触发键,但极易被其他插件劫持——比如 AutoIndent、EditorConfig 或某些主题会优先吞掉 Tab,导致缩写只缩进、不展开。这不是 Emmet 坏了,是快捷键冲突。
- 输入
html:5后,直接按Ctrl+E(Windows/Linux)或Cmd+E(macOS),看是否立刻生成完整 HTML5 结构 - 若
Ctrl+E有效,说明 Emmet 本身正常,问题出在Tab绑定上;可去Preferences → Key Bindings用户设置中加 context 限定,避免误触发 - 别在
<script>标签内测试:Emmet 默认不激活脚本块内的 HTML 缩写,除非手动配置emmet_include_languages
缩写写法错一个字符就失效
Emmet 不做语法纠错,只做字符串匹配。括号位置、空格、引号缺失、符号写错都会让整个缩写静默失败,且不报错。
-
div.container#header[data-role="banner"]✅ 正确;div .container❌ 点号前不能有空格 -
a[href="#top"].btn✅ 可以;a[href=#top]❌ 属性值必须用引号包裹(单双皆可,但不能省) -
ul>li*3✅ 子元素;ul + li*3❌ 这是兄弟关系,结果完全不同 -
lorem10✅ 生成 10 字占位文本;lorem单独写无效,不带数字不触发
别指望 Emmet 校验语义或修复结构
它只管生成,不管对错。比如 span>div 会被照常展开成 <span><div></div></span>,但 HTML 规范禁止块级元素嵌套在 <span> 里——Emmet 不提醒、不拦截、不修正。
真正省时间的是把 html:5、ul>li*3、div.container>h1+p、a[href=#]{Click} 这几个高频组合练成肌肉记忆,而不是依赖它写全页结构。复杂嵌套建议分步写,避免漏掉 > 或 + 导致整段重来。

















