必须同时将"tab_completion"和"auto_complete_commit_on_tab"设为false才能彻底禁用tab补全;emmet需单独配置disable_auto_insert或移除tab_key_activation;snippet不受影响但需正确放置、匹配scope且确保tab_completion为false。

Tab 键还在补全?先关掉这两个开关
Sublime 默认的 Tab 补全行为由两个独立配置控制:tab_completion 和 auto_complete_commit_on_tab。只关一个,Tab 仍可能在补全或缩进之间“随机切换”。必须同时设为 false 才能彻底禁用 Tab 的补全语义:
-
"tab_completion": false—— Tab 永远不填充候选词,哪怕补全框开着也只当缩进用 -
"auto_complete_commit_on_tab": false—— 即使补全框弹出,Tab 也不提交高亮项(默认就是false,但显式写出来更稳妥)
这两个值都得加到 Preferences → Settings – User(右侧用户设置)里。别只改 auto_complete: false,它只管弹窗,不管 Tab 按键逻辑。
Emmet 还在抢 Tab?它根本不听原生设置
装了 Emmet 后,div+Tab 变成 <div></div>,这不是 Sublime 原生补全,而是 Emmet 插件自己监听按键实现的。关掉 auto_complete 或 tab_completion 对它完全无效。
- 打开 Preferences → Package Settings → Emmet → Settings
- 把
"disable_auto_insert"设为true,或删掉"tab_key_activation"相关配置 - 确认
"disabled_keymap_actions"里没包含"expand_abbreviation_by_tab"
否则你改完所有原生设置,Emmet 依然会拦截 Tab 并展开缩写。
想让 Tab 只缩进、不补全,但又不想影响 Snippet?
自定义 snippet(比如 log+Tab 输出 console.log($1);)走的是另一套机制,依赖 tabTrigger 和 scope 匹配,和 auto_complete 无关。只要 snippet 文件放对位置(Packages/User/xxx.sublime-snippet),且 scope 正确(如 source.js),它就照常工作。
- 确保
"tab_completion": false已启用(否则 snippet 可能被原生补全覆盖) - 检查 snippet 的
scope是否匹配当前文件语法(右下角显示的语法名,比如JavaScript对应source.js) - 别把 snippet 放在
Packages/Default下——那里会被忽略
Snippet 的触发优先级高于原生单词补全,但前提是它加载成功;路径错、scope 错、JSON 格式错,都会导致它静默失效。
补全框弹不出来,不是 Tab 的问题,是触发条件没配对
很多人以为关了补全再开,Tab 就该工作,结果补全框压根不弹——这说明问题不在提交逻辑,而在触发源头。关键看 auto_complete_triggers 和 auto_complete_selector。
- Python 中想输
os.弹函数列表,得在 Preferences → Settings – Syntax Specific(打开 .py 文件后调出)里加:"auto_complete_triggers": [{"selector": "source.python - string - comment", "characters": "."}] - CSS 中想输
:弹属性值,得单独配:"auto_complete_triggers": [{"selector": "source.css", "characters": ":"}] - 别在全局设置里笼统写
"source",会污染其他语言
真正容易被忽略的是:即使 auto_complete: true,Sublime 也绝不会无脑弹窗——它严格按 selector 判断光标是否落在允许补全的 scope 内。字符串里、注释里、正则字面量里,默认都不触发,除非你主动放宽规则。











