tab键补全与缩进冲突因sublime默认让tab同时承担缩进、提交补全及emmet展开三重职责,需同步关闭"tab_completion": false和"auto_complete_commit_on_tab": false,并单独配置emmet禁用tab_key_activation,确保snippet在正确scope下仍可用。

Tab键补全和缩进为什么总打架
因为Sublime默认让Tab既负责缩进,又负责提交补全项,而Emmet、语言服务器、snippet等插件还会各自加一层监听——结果就是你在Python里敲for按Tab,可能弹出补全菜单、展开Emmet缩写、插入空格三选一,全看光标在哪、当前语法是什么、有没有插件在后台抢键。
关掉原生Tab补全的两个开关必须同时设
只改tab_completion或只改auto_complete_commit_on_tab都不够,必须一起关:
-
"tab_completion": false——Tab永远不填候选词,哪怕补全框开着也只当缩进用 -
"auto_complete_commit_on_tab": false——补全框弹出来也不响应Tab提交(默认已是false,但显式写上更稳妥)
这两项必须加到Preferences → Settings – User(右侧用户设置),不是Settings – Default,也不是某个插件的配置页。
Emmet的Tab行为得单独处理
Emmet根本不理tab_completion,它自己监听Tab键。想让它不抢,得去Preferences → Package Settings → Emmet → Settings里改:
- 把
"disable_auto_insert"设为true,或者 - 删掉
"tab_key_activation"相关配置(比如整个"tab_key_activation": true这一行) - 检查
"disabled_keymap_actions"里没包含"expand_abbreviation_by_tab",否则它照旧展开
注意:别去Package Settings → Emmet → Key Bindings – User里瞎删Tab绑定,那个路径压根不加载,白忙活。
保留snippet但禁用补全的平衡点
自定义snippet(比如log+Tab输出console.log($1);)走的是另一套机制,依赖tabTrigger和scope匹配,只要tab_completion为false且snippet文件放在Packages/User/xxx.sublime-snippet、scope写对(如source.js),它就照常工作。
真正容易被忽略的是:如果当前文件语法识别错了(比如.vue里的<script></script>块被当成HTML),snippet的scope就匹配不上——这时Tab既不补全也不展开,只默默插空格或制表符,你还以为是配置失效。











