Emmet缩写展开(非补全)需满足:emmet.triggerExpansionOnTab为true、按Tab而非Enter/空格、语言模式为HTML、禁用全角字符;Vue/Svelte需配置emmet.includeLanguages;避免格式化插件干扰。

ul>li*5 这种连续生成列表项,靠的是 Emmet 缩写展开,不是“补全”
很多人搜“HTML列表自动补全”,实际想要的是输入 ul>li*5 按 Tab 就生成 5 个 。这不是语言服务的补全行为,而是 Emmet 的缩写展开逻辑——它不依赖光标位置是否在标签内、也不等你输完再提示,而是在你按下 Tab 的瞬间解析并渲染结构。
-
emmet.triggerExpansionOnTab必须为true;设成false后,Tab 只缩进,ul>li*5永远不会变出列表 - 输入后必须按
Tab,不是Enter或空格;按 Enter 会换行中断缩写,空格会插入空格并终止识别 - 右下角语言模式必须是
HTML;如果是.vue文件,默认不触发 Emmet,得加配置:"emmet.includeLanguages": {"vue-html": "html"} - 缩写中不能混用中文标点或全角字符;
ul>li*3(用了全角>)或ul>li*3(用了全角*)都会失败
输到一半想补全 li 标签?得手动唤出建议菜单
Emmet 默认只对完整缩写响应,比如你刚敲完 li,还没按 * 或 >,此时直接按 Tab 不会补 。它不提供“单标签补全”,只做“缩写展开”。
- 要让
li出现在补全列表里,需先按Ctrl+Space(Windows/Linux)或Cmd+Space(macOS)手动唤出建议框 - 确保
html.suggest.html5为true,否则li这类语义化标签可能被过滤掉 - 如果列表项要带文本内容,用
li{Item $}再按 Tab,会生成、- Item 1
等- Item 2
Vue/Svelte 文件里 ul>li 不生效?语言模式和 Emmet 配置要对齐
在 .vue 或 .svelte 文件的 区域,VS Code 默认用 vue 或 svelte 语言模式加载,Emmet 不自动启用——它只认 html 模式。
- 检查右下角语言标识,如果不是
HTML,点它 → “Configure File Association for '.vue'” → 设为HTML(临时方案) - 更稳妥的做法:在
settings.json中加这两行:"emmet.includeLanguages": {"vue-html": "html", "svelte": "html"}"html.suggest.html5": true - 如果用了 Volar 插件,它会接管
.vue的语言服务,此时还需确认volar.emmetHtml是否启用(新版默认开)
补全后嵌套错位或闭合标签消失?别让格式化插件抢了控制权
常见现象:输完 ul>li*3 按 Tab,生成了三行 ,但立刻被 Prettier 或 Beautify 插件重排,导致缩进混乱、甚至把 合并到上一行末尾,看起来像没闭合。
- 临时禁用格式化插件测试:关掉
prettier.formatOnSave和editor.formatOnType - 确认
html.autoClosingTag是true;它和 Emmet 展开无关,但影响后续手动输入时的自动闭合行为 - 嵌套过深(如
ul>li>div>p>span*2)时,若超过html.maxTagDepth默认值 6,部分编辑器行为会退化;可调高至12
真正难调的不是“怎么让它动起来”,而是当多个插件(Prettier、Volar、Auto Rename Tag、Auto Close Tag)同时监听 HTML 输入时,谁该在哪个环节介入、谁该让路。这些开关之间没有报错提示,只有静默失效。动手改设置前,先看右下角语言模式和状态栏有没有 ACT、EMMET 这类小图标——它们比日志更早告诉你哪一层断了。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











