VSCode HTML自动补全失效主因是语言模式非HTML、html.suggest.html5为false、Emmet触发未启用;需确认右下角为HTML模式,设置"html.suggest.html5": true,并开启emmet.triggerExpansionOnTab。

VSCode 的 HTML 自动补全不是“坏了”,而是被几个关键开关或语言识别状态悄悄关掉了。恢复它不需要重装、不靠玄学重启,只用检查三处配置和一个状态栏标识。
右下角语言模式是不是 HTML?
这是 90% 补全失效的根源。VSCode 不看文件名后缀是否为 .html,只认右下角状态栏显示的语言 ID。如果显示的是 Plain Text、PHP、Markdown 或空着,HTML 语言服务根本没加载,补全菜单里连 <div> 都不会出现。
<ul>
<li>点击右下角语言标识(比如 “Plain Text”),选 <code>Configure File Association for '.xxx' → 设为 HTML
Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 Change Language Mode,回车后选 HTML
test.html,此时状态栏通常会自动切为 HTML
html.suggest.html5 是否为 true?
这个设置控制原生 HTML5 标签(<section></section>、<article></article>)、全局属性(contenteditable)、事件(oninput)以及 input 的 type 枚举值(email、date 等)是否出现在补全列表里。它默认开启,但容易被插件或手动修改关掉。
- 打开设置(
Ctrl+,),搜索html.suggest.html5,确认开关是开启状态 - 更可靠的方式:打开
settings.json(命令面板输入Preferences: Open Settings (JSON)),确保有这一行:"html.suggest.html5": true - 如果同时启用了实验性提示,可加:
"html.suggest.experimental.customHtml5": true(部分 VS Code 版本支持,用于增强枚举值补全)
Emmet 的 Tab 触发是否启用?
Emmet 是 VSCode HTML 补全的主力引擎,但它只响应 Tab 键(不是 Enter 或空格),且必须绑定到当前语言模式。输 ul>li*3 按 Tab 没反应?大概率是这个开关被关了,或 Emmet 没绑定到当前文件类型。
立即学习“前端免费学习笔记(深入)”;
- 搜索设置项:
emmet.triggerExpansionOnTab,确保为true - 如果在
.md或.vue文件里写 HTML 片段,需额外配置:"emmet.includeLanguages": {"markdown": "html", "vue": "html"} - 避免冲突:某些 Vim 插件会劫持
Tab;临时禁用 Vim 扩展测试,或改用Ctrl+Enter触发 Emmet(需在键盘快捷键中查Emmet: Expand Abbreviation绑定)
为什么 input type="|" 不提示枚举值?
这不是补全“失效”,而是 VSCode 原生 HTML 语言服务对属性值语义的感知有限。它默认只补标签和基础属性,type、autocomplete、inputmode 这类强约束枚举值需要明确启用上下文感知,且依赖语言服务未被降级。
- 确认
html.suggest.html5已开启(上一点已覆盖) - 大文件(>5MB)或含大量内联 JS/CSS 的 HTML 会导致语言服务卡顿甚至停摆,补全延迟或不弹出——关掉大日志文件再试
- 禁用所有扩展后测试:有些轻量主题或语法高亮插件会禁用默认语言功能,造成补全退化为纯字符串匹配
- 真正要补自定义 Web Component 属性(如
<my-button size="|"></my-button>),必须配html.customData指向 JSON Schema,原生不支持
最常被忽略的一点:补全行为受语言模式、html.suggest.html5、emmet.triggerExpansionOnTab 三者共同约束,缺一不可。单独调一个设置,往往看起来“好像好了”,实则换种写法(比如在注释里写 HTML、在 JSX 中写 div)又失效——得同步确认这三项都稳住,才算是真正恢复。



















