Emmet是Sublime中HTML/CSS结构补全的唯一高效路径,需确保文件语法为HTML、Tab键触发且未被劫持,LSP对HTML模板展开基本无效。

Sublime里HTML补全靠Emmet,不是LSP
Emmet是Sublime中HTML/CSS结构补全的唯一高效路径,LSP对HTML语法支持极弱,装了也基本不触发。它不是“提示”,而是“生成”:输入ul>li*5按Tab直接输出带缩进的完整列表结构。
常见错误现象:装了LSP-pyright或LSP-html后仍无法用div+Tab生成<div></div>——这不是配置问题,是LSP根本不处理这类模板展开。
- 必须确认当前文件语法为
HTML(右下角显示“HTML”,不是“Plain Text”或“Vue Component”) - 别指望
Ctrl+Space唤出Emmet菜单,它默认绑定在Tab上;如果按Tab只缩进不展开,检查是否被其他插件劫持,可临时禁用All Autocomplete或AutoFileName测试 - Vue单文件中
<template></template>块需配合Vue Syntax Highlight插件,否则Emmet识别不到上下文,script和style块默认不生效
CSS属性与值补全必须用CSS3插件
原生Sublime和Emmet都不提供CSS属性/值的上下文感知补全。display:后面不弹flex、grid,background:后不列url(可选文件,说明你没装CSS3插件,或它没正确加载。
别混淆CSS3和SublimeCodeIntel:SublimeCodeIntel已停更,对gap、aspect-ratio等现代属性无支持,且常导致Sublime Text 4卡顿。
立即学习“前端免费学习笔记(深入)”;
- 安装后必须手动开启冒号触发:在
Preferences.sublime-settings(用户侧)中加入"auto_complete_triggers": [ {"selector": "source.css", "characters": ":"} ] -
.scss文件要补全,得额外确保SCSS语法继承source.css作用域;可在Packages/SCSS/SCSS.sublime-settings中加"auto_complete_selector": "source.scss -comment" -
AutoFileName只管路径,比如background: url(后列出图片,但它不提供display、transform这些属性名,必须和CSS3共存
Tab键不确认CSS/HTML补全?检查auto_complete_commit_on_tab
很多人输完dis按Tab没反应,或display:弹出菜单后按Tab只插入空格——这和插件无关,是Sublime默认关闭了Tab提交补全的行为。
必须在用户设置中显式启用:
{
"auto_complete": true,
"auto_complete_commit_on_tab": true,
"auto_complete_with_fields": true
}
漏掉"auto_complete_commit_on_tab": true,哪怕Emmet和CSS3都装对了,Tab也永远只是缩进键。
-
"auto_complete_with_fields": true影响占位符跳转,比如Emmet生成img[src=${1} alt=${2}]后,按Tab能从src跳到alt,否则光标卡死 - 别碰
"tab_completion": true,它控制的是普通文本单词补全逻辑,和HTML/CSS结构生成完全无关 - 如果
Tab依然无效,用Ctrl+Shift+P→Developer: Show Scope Name看光标位置是否落在source.css或text.html.basic内;不在就说明语法识别失败
补全失效时最该先查的三件事
90%的“插件没反应”其实和插件本身无关,是环境链断在开头:语法识别 → 作用域匹配 → 触发条件满足。卡住的位置往往藏得深,但检查成本极低。
- 右下角语法标识是不是
Plain Text?点它手动切换成HTML或CSS,这是第一优先级动作 - 按
Ctrl+Shift+P→Package Control: List Packages,确认Emmet和CSS3出现在列表中;名字拼错(如css3小写)、安装中途失败都会导致静默不加载 -
auto_complete_triggers是否覆盖了当前语法?比如把{"selector": "source", "characters": ":"}加进去,会导致所有语言都在冒号后弹窗,但source不包含source.css,实际还是不触发
真正难调的不是插件怎么装,而是作用域和触发器怎么对得上;一个scope写错,补全就彻底消失,连报错都没有。



















