Emmet在多光标下不展开缩写是设计限制,仅响应活动光标;需确保所有光标处于同一HTML语言模式,且不在属性值等非支持上下文中,推荐用复制粘贴或正则替换替代。

多光标下输入 div 按 Tab 不展开?根本不是 Emmet 的问题
VSCode 多光标模式(Ctrl+Click 或 Ctrl+D)下,div + Tab 无反应,不是 Emmet 被禁用,而是 Emmet 默认**不支持多光标触发缩写展开**。它只响应当前活动光标(即最后一个光标)的输入行为,其余光标被忽略。这是设计使然,不是 bug。
验证方式:单光标时输入 div + Tab 能正常生成 ,但选中三处 div 后按 Tab,只有最后一处补全——这就确认是机制限制。
-
emmet.triggerExpansionOnTab必须为true,否则单光标也不行 - 多光标时,所有光标必须处于**同一语言模式**(右下角显示
HTML),若混有Plain Text或JavaScript,Emmet 直接跳过整组 - 不能在属性值内多光标操作,比如同时选中多个
class="|"中的竖线位置,Emmet 不识别这种上下文
想批量生成 HTML 结构?换思路,别硬扛多光标 + Tab
强行让多光标支持 Emmet 展开没有官方路径,也容易引发光标错位、嵌套混乱。更可靠的做法是用「重复编辑」或「剪贴板广播」替代:
- 先用单光标写好一个完整结构,如
div>p{Hello}+ul>li*3+ Tab → 得到带列表的块 - 复制该结构(
Ctrl+C),再用多光标定位到目标位置,直接Ctrl+V—— 所有光标位置都会粘贴相同内容 - 若需差异化内容(如
item-1、item-2),用Ctrl+Shift+P→ 输入Insert Number(需装插件Numbered Bookmarks或Increment Selection) - 对齐类名等文本替换场景,优先用
Ctrl+H替换 + 正则(如class="(.+)"→class="item-$1"),比多光标补全更可控
html.autoClosingTag 在多光标下是否生效?
这个设置控制的是「输入开始标签后自动补闭合标签」,和 Emmet 展开无关。但它在多光标下**部分生效**:当你在多个位置同时输入 ,前提是:>,VSCode 会为每个光标插入对应的
- 所有光标都落在支持自动闭合的上下文中(即不在字符串、注释、JS 表达式内)
-
html.autoClosingTag为true,且editor.autoClosingBrackets设为languageDefined - 不要在输入过程中换行或插入空格——多光标对格式敏感,任意一处有换行,其他光标可能失效
注意:它不会帮你补 <script></script> 或 ,除非你额外配了 auto-close-tag.SublimeTextMode 或 auto-close-tag.activationOnLanguage。
Vue/JSX 文件里多光标补全为何更难?
因为 Vue 单文件组件中, 多光标补全 HTML 的本质矛盾在于:Emmet 是「单点驱动」的缩写引擎,而多光标是「位置广播」的编辑模型——它们底层逻辑冲突。接受这个限制,比花几小时调配置更省时间。 块内的 HTML 是由 Volar 插件接管的,而 JSX 中的
div + Tab 时,Volar 可能只响应主光标,其余被忽略div 是 React.createElement 调用,Emmet 默认不介入;需靠 TypeScript 插件或 ESLint 提示,而非补全.vue 里用 显式声明语言,或把重复结构抽成组件再批量引用
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











