tab键不选中补全项只插缩进,根本原因是auto_complete_commit_on_tab默认为false;需在用户设置中设为true并启用auto_complete,lsp下还需开启auto_complete_with_fields,点号冒号等触发需配置auto_complete_triggers。

Tab 键不选中补全项,只插缩进?
根本原因是 auto_complete_commit_on_tab 默认为 false。它不控制“要不要弹框”,而是决定“按 Tab 是插入制表符,还是确认当前高亮项”。
- 必须在用户设置(
Preferences → Settings – User)里显式加这一行:"auto_complete_commit_on_tab": true - 同时确保
"auto_complete": true已启用,否则补全框压根不出现 - 若用了 LSP(如
LSP-typescript),这个设置依然生效;但遇到带占位符的补全(如console.log(${1:msg})),还需额外开启"auto_complete_with_fields": true
输入 . 或 : 后没反应?
Sublime 原生不监听这些字符,必须靠 auto_complete_triggers 显式声明。
- 例如让 Python 中输点号触发:
{"selector":"source.python","characters":"."} - CSS 中冒号后补全值:
{"selector":"source.css","characters":":"} - HTML 中输入
补标签,需配:<code>{"selector":"text.html","characters":"(注意:仅补你写过的标签名,标准 HTML5 标签需靠 <code>LSP-html或Emmet) - 改完设置后,已打开的文件要切换一次 tab 或执行
Ctrl+Shift+P → Reload Snippets才生效
为什么 console. 补全时 log 不排第一?
Sublime 原生没有语义权重排序,只按三项打分:匹配位置、前缀相似度、文件内出现频次。所谓“首选”,本质是让它排第一。
- 临时办法:在当前 JS 文件里多写几遍
console.log(),抬高频次 - 稳定办法:新建
Packages/User/console.sublime-completions,内容含{"trigger":"log","contents":"log(${1:msg})"}——但注意,这仅对单独输入log再按 Tab 有效,不改变console.l的自动排序 - 真正解决语义优先级,得靠 LSP 服务端(如
typescript-language-server),但它的completion.preselect是服务端参数,Sublime UI 层无开关
补全总失效,先查这三个地方
90% 的“开了没用”问题卡在这三处,不是插件没装好,而是作用域或配置被悄悄覆盖。
- 右下角语法显示是
Plain Text或Python 3?必须手动切到Python/CSS/JavaScript等标准语法名 - 用
Ctrl+Shift+P → Developer: Show Scope Name看光标实际 scope,再比对auto_complete_triggers里的selector是否匹配(比如source.python.embedded就不等于source.python) - 检查是否启用了
Vintage(vi 模式)或旧版Emmet——它们会劫持.、'、{等按键,直接拦截原生补全入口











