!按Tab生成HTML5骨架的前提是Emmet启用且语言模式为text.html.basic;失效主因包括语言模式非HTML、插件冲突、emmet.triggerExpansionOnTab未启用或光标位置不当。

! 按 Tab 就能生成标准 HTML5 骨架,前提是 Emmet 插件已启用且语言模式设为 text.html.basic。不是所有 .html 文件默认触发,也不是所有缩写都可用。
为什么 ! + Tab 有时不生效
常见现象:输入 ! 后按 Tab,什么都没出来,或只补全成 <!>;新建文件未自动设为 HTML 模式,导致 Emmet 不响应。
- 检查右下角状态栏——确认当前语言是
HTML(不是Plain text或Text),点它手动切换 - Emmet 默认可能禁用 HTML 支持:进入 Settings → Packages →
emmet→ 勾选Enable Emmet for html - 某些插件(如
autocomplete-html)会劫持 Tab 行为,冲突时优先关掉它再试 -
emmet.triggerExpansionOnTab必须为true,可在 Settings → Core →config.cson手动加一行:'text.html.basic': {'emmet.triggerExpansionOnTab': true}
html:5 和 ! 有啥区别
两者等价,都是生成 HTML5 文档骨架,但触发逻辑略有不同:
-
!是 Emmet 的快捷别名,依赖语言模式和配置,更轻量、更常用 -
html:5是完整缩写,兼容性略高,即使部分配置异常也能 fallback 触发 - 都不支持自定义 lang 属性——生成的
<html lang="en">里的en是硬编码,要改中文得手动替换成zh-CN - 生成的
<title>Document</title>是固定文本,无法通过缩写参数动态替换
Vue/Svelte 文件里怎么让 ! 生效
.vue 或 .svelte 文件中的 <template> 块默认不走 HTML 缩写逻辑,因为 Atom 把整文件当作了 source.vue 或 source.svelte,没继承 text.html.basic 规则。
- 装
language-vue后,打开其源码 →grammars/vue.cson,确认有scopeName: 'text.html.vue';没有就手动加 - 对
language-svelte,需在config.cson中显式绑定:'source.svelte': {'emmet.syntaxProfiles': {'html': 'html'}} - 别用
file-types插件强行把.vue映射成text.html.basic——这会让<script>块失去 JS 语法高亮 - 生效后,在
<template>内光标位于空白行时输!+ Tab,就能生成骨架,但注意它只作用于当前 scope,不会污染 script 或 style 块
生成后发现 meta 标签顺序/charset 位置不对怎么办
Atom 自带的 Emmet 版本(尤其老版本)生成的骨架中,<meta charset="UTF-8"> 可能出现在 <title> 后面,不符合规范(必须在 <title> 前)。这不是 bug,是 Emmet 模板固化行为。
立即学习“前端免费学习笔记(深入)”;
- 临时方案:生成后手动剪切
<meta charset="UTF-8">到<title>上方 - 长期方案:编辑
~/.atom/packages/emmet/lib/snippets.json,找到html:5对应的 snippet,把meta[charset=UTF-8]移到title前面 - 注意:升级 Emmet 插件会覆盖修改,建议备份 snippet 文件或改用
snippets包自定义全局缩写 - 如果项目强制要求
<meta name="viewport">必须紧随 charset,也得手动调整——Emmet 不支持多行 meta 的顺序约束
!,卡住就查 emmet.triggerExpansionOnTab 是否生效。



















