vscode 默认 tab 不展开代码片段,需设 "editor.tabcompletion": "on" 并关闭 "editor.suggest.insertmode" 的 inline 模式;光标须严格位于 snippet 前缀末尾且语言 scope 匹配。

VSCode 的 Tab 补全默认不展开代码片段,这是设计使然
VSCode 默认把 Tab 当作「在补全建议间移动」的导航键,而不是「展开当前选中代码片段」的触发键。所以即使你定义了 console.log 的 snippet,按 Tab 通常只会跳到下一个占位符(如 ${1:message}),或直接插入文字而非展开模板——这不是 bug,是补全系统和 snippet 系统的职责分离导致的。
启用 Tab 展开代码片段必须关掉「在补全项中插入」
关键开关在设置里:关闭 "editor.suggest.insertMode" 的 "inline" 模式。否则 VSCode 会优先把补全建议(比如函数名、变量名)直接插进来,snippet 根本没机会被 Tab 触发。
- 打开设置(
Ctrl+,或Cmd+,),搜insertMode - 找到
Editor › Suggest › Insert Mode,设为"replace" - 再确保
Editor › Tab Completion是on(它控制的是「输入已有单词前缀后按 Tab 是否补全」,和 snippet 无关,但常被误调)
真正让 Tab 展开 snippet 的核心配置是 "editor.tabCompletion"
这个选项才是决定 Tab 能不能触发 snippet 的开关。它有三个值:on、off、onlySnippets。只有设为 on 或 onlySnippets 才有效:
-
on:Tab 优先尝试展开 snippet;若无匹配,则回退为传统补全导航 -
onlySnippets:Tab 只响应 snippet,完全不参与补全导航(适合重度 snippet 用户) - 别信网上说的改
"editor.acceptSuggestionOnTab"——它只影响补全列表选中行为,对 snippet 无效
推荐设为 on,并在 settings.json 中显式写入:
"editor.tabCompletion": "on"
常见失效场景和绕过方式
即使配置正确,以下情况仍会导致 Tab 不展开 snippet:
- 光标不在 snippet 前缀末尾(比如写了
conso但没写完console,或中间有空格) - 当前语言模式不匹配 snippet 的
"scope"(例如你在.js文件里定义了"scope": "typescript"的 snippet) - 有其他扩展劫持了 Tab 键(如 Vim 插件开启 Normal 模式时,Tab 默认被禁用)
- 补全弹窗开着且焦点在其中——此时 Tab 是在切选项,不是触发 snippet;先按
Esc关闭弹窗再试
临时验证是否生效:在 JS 文件中输入 log,不要呼出补全框,直接按 Tab。如果展开成 console.log($1);,说明配置成功。
最易忽略的一点:snippet 的 prefix 必须严格匹配光标前的字符,且不支持模糊匹配。多一个空格、少一个点,Tab 就不会动。











