vscode 中输入 ! 后按 tab 可快速生成标准 html5 骨架,无需额外配置;必须在 html 模式、空行或标签外输入,旧写法 html:5 已废弃,lang 默认为 en,中文需手动改为 zh-cn。

输入 ! 然后按 Tab 就能生成完整 HTML5 骨架
VSCode 默认启用 Emmet,! 是最简触发方式,不用装插件、不改设置。敲完回车或 Tab,立刻输出带 <doctype html></doctype>、、 和 的标准结构。
常见错误是手敲 html:5 或 html5 —— 这些写法在新版 VSCode 里已废弃,只认 !。如果没反应,先检查是否在 HTML 模式下(右下角显示 HTML,不是 Plain Text 或 JavaScript)。
-
!必须在空行或标签外输入,写在<div> 里面不会生效 <li>生成的 <code>默认带lang="en",如需中文,手动改成lang="zh-CN"即可 - 部分旧项目用的是 HTML4,但
!只输出 HTML5,别指望它兼容过时 doctype - 多个 class 用点连写:
div.box.rounded→<div class="box rounded"> <li>id 和 class 顺序不影响结果,但习惯上 id 在前:<code>div#app.container -
*n重复生成 n 次,但li*0或负数会直接失效,不报错也不输出 - 禁用所有非必要主题插件后重启 VSCode,比反复调设置更有效
- 如果用 Prettier,确保它没开启
prettier.bracketSpacing对 Emmet 输出的格式化干扰 - 远程开发(SSH/WSL)时,Emmet 设置必须在远程环境里单独配,本地设置不继承
- 自定义缩写不支持变量或动态内容,比如不能写
"log": "console.log($1);"—— 那属于 snippet,不是 Emmet - 修改后无需重启,但已有打开的 HTML 文件要重新聚焦(点一下编辑区)才生效
- 别覆盖内置缩写如
!或ul,会导致骨架生成异常
Emmet 缩写支持嵌套和属性,但括号和引号要写对
比如想快速写一个带 class 的容器 div:div.container + Tab → <div class="container"></div>;加子元素就用 >:ul>li*3 + Tab → 生成带 3 个 <li> 的列表。
容易错的是属性写法:input[type="text"] 正确,input[type=text](缺引号)在某些版本会失败;img[src="a.jpg" alt="demo"] 中空格不能省,等号前后也不加空格。
VSCode 设置里关掉 emerald 类干扰项才能让 Emmet 稳定工作
有些用户发现缩写偶尔失灵,尤其是输入后没自动展开——大概率是启用了 "emerald" 或其他主题/插件覆盖了 Emmet 触发逻辑。这不是 Emmet 本身的问题,而是 VSCode 的 snippet 优先级冲突。
进设置搜 emerald,把所有带这个词的配置项(特别是 editor.suggest.showSnippets 相关)设为 false;再确认 emmet.triggerExpansionOnTab 是 true,否则只能靠回车不能用 Tab。
自定义 Emmet 缩写要改 emmet.json,别硬记或改默认规则
比如团队约定所有按钮都用 btn-primary class,不想每次打 button.btn-primary,可以加一条自定义缩写:"btn": "button.btn-primary"。这得写进工作区或用户级 emmet.json,不是改 VSCode 源码。
路径是:.vscode/emmet.json(项目级)或 settings.json 里加 "emmet.snippets" 字段。注意 key 必须全小写、无空格,value 是合法 Emmet 表达式。
Emmet 看似简单,真正卡住人的地方往往不是语法,而是当前文件语言模式、插件冲突、或者远程环境没同步配置。试一个缩写没反应,先看右下角语言标识,再关掉最近装的插件,比查文档快得多。











