需将 auto_complete_commit_on_tab 设为 true 并确保 auto_complete 启用;lsp 环境下还需开启 auto_complete_with_fields;语义优先级依赖 lsp 服务端配置或手动添加 .sublime-completions 文件。

怎么让 Tab 键真正确认补全项,而不是缩进?
Sublime 默认按 Tab 不会选中高亮的补全项,而是插入制表符——这是绝大多数人卡住的第一步。根本原因在于 auto_complete_commit_on_tab 默认是 false。
- 打开 Preferences → Settings,在右侧用户设置中加入:
"auto_complete_commit_on_tab": true - 必须同时确保
"auto_complete": true已启用,否则补全框根本不弹 - 如果用了 LSP 插件(如
LSP-typescript),这个设置依然生效;但若服务端返回的是带占位符的补全(如console.log(${1:msg})),还需开启"auto_complete_with_fields": true
如何让 console. 输入后优先显示 log 而不是 table?
Sublime 原生不支持“权重排序”或“语义优先级”,它只按三项简单打分:匹配位置(越靠前越优)、前缀相似度(log 比 table 更贴近 console.l)、当前文件内出现频次。所以“首选字符”本质是引导它排第一。
- 最直接办法:在当前 JS 文件里手动写几遍
console.log(),让它成为高频词 - 更稳定方案:新建一个
console.sublime-completions文件,放在Packages/User/目录下,内容如下:{ "scope": "source.js", "completions": [ { "trigger": "log", "contents": "log(${1:msg})" }, { "trigger": "error", "contents": "error(${1:msg})" } ] }注意:这个文件只对明确输入log再按Tab有效,对console.l后自动补全无效 - 真正解决语义排序,得靠 LSP 服务端(如
typescript-language-server)——但它不提供 UI 权重开关,只能通过配置completion.preselect等服务端参数间接影响
为什么输 . 后没反应,或者 HTML 里输 不提示标签?
触发逻辑被 auto_complete_triggers 或语法范围锁死了。默认 Sublime 只在部分 selector 下响应特定字符,且不覆盖所有语言场景。
- 检查是否设置了过于严格的
auto_complete_selector,比如只写了"source.python",那 JS 文件就完全不触发 - 显式添加触发规则(推荐):
"auto_complete_triggers": [ { "selector": "source.js", "characters": "." }, { "selector": "text.html", "characters": "<" } ] - 注意:HTML 中
触发依赖 Emmet 或 LSP-html 插件;光靠原生设置只会补全你文件里曾经写过的标签名,不会补全标准 HTML5 元素
哪些设置组合最容易引发冲突?
常见踩坑点不在单个配置,而在叠加逻辑失效。比如开了 auto_complete_commit_on_tab 却忘了关掉 Vintage 模式,结果 Tab 被 vi 键绑定劫持;或装了多个补全插件互相抢焦点。
- 禁用 Vintage 模式(除非你真用 vi 键绑定):
"ignored_packages": ["Vintage"] - 避免同时启用
AutoComplPop和LSP—— 前者是老式自动弹框,后者自带完整补全生命周期管理,共存会导致建议重复、延迟异常 - 如果发现补全项顺序混乱,先清空
Packages/User/下所有自定义.sublime-completions文件,再逐个启用测试
真正能控制“首选”的,从来不是编辑器本身,而是你喂给它的数据(文件内词频)、你写的 snippet 触发器、以及语言服务器返回的 completion item 排序逻辑——别在用户设置里找不存在的 completion_weight 字段。










