Sublime Text 的自动补全无原生过滤规则,仅通过作用域控制(auto_complete_selector)、触发字符配置(auto_complete_triggers)和插件协同间接实现;All Autocomplete 仅扫描已打开文件,LSP 才提供基于 AST 的语义补全。

Sublime Text 的自动补全默认只做“当前文件 + 已打开标签页”的单词级匹配,不识别语法、不过滤语义、也不支持正则或条件式过滤——它压根没有「过滤规则」这个概念。所谓“自定义过滤”,实际是通过作用域控制、触发时机调整、插件协同这三层来间接实现的。
auto_complete_selector 决定补全在哪种文件里生效
它不是过滤器,而是开关。默认值 "source, text" 覆盖大部分代码文件,但如果你在 .vue 文件的 块里写 CSS,右下角显示的是 source.css.embedded.html,原生补全就静默失效。
- 检查当前文件右下角语法名(如
Python、CSS、Plain Text),必须和auto_complete_selector中的 scope 匹配 - 若需在 Vue 的 style 块中启用补全,得把
"source.css.embedded.html"显式加进 selector 列表 -
comment、keyword类 scope 默认被跳过,哪怕你写了# todo也不会触发补全
auto_complete_triggers 控制“输什么才开始扫”
原生补全不会监听 . 或 :,必须靠它显式声明。比如 Python 里写 os. 没反应,就是因为缺这一行:
{
"auto_complete_triggers": [
{"selector": "source.python", "characters": "."},
{"selector": "text.html", "characters": "
-
selector必须严格为source.python,写成python或Python都无效 -
characters是字符串,不是正则;想让import后触发,得填空格字符" ",不是"\s" - 修改后必须切换 tab 或执行
Reload Snippets,否则配置不热更新
All Autocomplete 插件的“全局”其实很有限
它所谓“全局补全”,仅扫描所有已打开的 view(标签页),不读磁盘、不索引未打开文件、不解析 AST。它的“过滤”靠的是硬性限制:
- 文件大小超过 1MB 会被自动跳过,避免 UI 卡顿
- 只处理
source、text、string类 scope,comment和constant.numeric不参与匹配 -
show_overlay: false时即使enable_global_autocomplete: true也看不到候选列表 - 光标必须在单词中间或末尾(如
fetchU|),开头位置(|fetchUser)不触发
LSP 是唯一能做真·语义过滤的方案
想让 str. 只显示字符串方法、list. 只显示列表方法,必须用 LSP(如 LSP-pyright)。它不依赖单词匹配,而是靠语言服务器分析 AST 和类型系统。
- 原生补全和 LSP 补全是并存关系,不是替代关系;LSP 提供语义层,原生补全仍负责变量名、函数名等基础词
- 启用 LSP 后,
auto_complete_triggers依然要保留,否则.不会触发 LSP 的补全请求 - LSP 的补全项可被
completion_format等参数控制展示格式,但无法用正则自定义过滤逻辑——那是语言服务器自己的事
真正需要“过滤”的人,往往卡在 scope 不匹配或触发字符没声明上;而试图用正则或自定义脚本去筛补全项,基本是在和 Sublime 的设计哲学对抗——它从来就不是为这种需求造的。











