sublime需配置auto_complete_triggers才能在python中输入.触发方法提示,正确设置为{"selector": "source.python", "characters": "."},且文件路径、json格式、scope范围须严格匹配。

怎么让 Sublime 在 Python 里输 . 就弹出方法提示
Sublime 原生不识别语法结构,输 . 默认不会触发补全——必须靠 auto_complete_triggers 显式声明。否则你写 os. 后光标停着,啥也不出来。
- 打开
Preferences → Settings,在右侧用户设置中加入:{ "auto_complete_triggers": [ {"selector": "source.python", "characters": "."} ] } -
selector必须写成source.python(不是text.python或python),大小写和前缀都不能错 - 如果同时写多个语言,比如加 JS 支持,就再塞一个
{"selector": "source.js", "characters": "."} - 修改后无需重启,但已打开的 .py 文件要切换 tab 再切回来,或按
Ctrl+Shift+P→ 输入Reload Snippets手动刷新
常见错误:只加了 "auto_complete": true 就以为万事大吉;或者把 selector 写成 text.html 却用在 Python 文件里——它压根不匹配,自然不触发。
为什么自定义的 .sublime-completions 文件不生效
文件放错位置、名字拼错、JSON 格式有误,三者占失效原因的 90%。它不像 snippet 那样能靠 scope 降级兜底,错一点就彻底沉默。
- 文件必须放在
Packages/User/目录下,且后缀严格为.sublime-completions(不是.json、.completion或漏掉-) - Windows 路径示例:
%APPDATA%\Sublime Text\Packages\User\myfuncs.sublime-completions
macOS/Linux:~/Library/Application Support/Sublime Text/Packages/User/或~/.config/sublime-text/Packages/User/ - JSON 内容必须合法,尤其注意逗号结尾、引号闭合、
trigger和contents字段名不能拼错
示例最小可用结构:{ "scope": "source.python", "completions": [ { "trigger": "log", "contents": "print($1)" } ] } -
scope决定在哪种文件里生效,写成text.plain能快速验证是否加载成功;确认后再细化成source.python
容易被忽略:Sublime 不会扫描子目录,Packages/User/snippets/log.sublime-snippet 是合法的,但 Packages/User/completions/my.sublime-completions 就完全不认。
Tab 键补全没反应?检查这三项设置
很多人以为按 Tab 就该填入高亮项,结果只是插入一个制表符——其实是几个开关没对齐。
- 确保
"tab_completion": true已开启(默认是 true,但某些插件或旧配置可能覆盖它) - 必须配合
"auto_complete_commit_on_tab": true,否则 Tab 只移动光标,不提交选中项 - 如果用了 LSP 插件(如
LSP-pyright),还要确认没有启用"auto_complete_with_fields": false这类干扰字段跳转的设置
另外,原生单词补全和 LSP 补全共存时,Tab 的行为优先级由当前激活的 provider 决定。比如你在函数调用里输 func(,LSP 会弹参数提示,此时 Tab 是跳字段;但如果你刚输完变量名还没打点,Tab 就走单词补全逻辑——行为不一致不是 bug,是设计如此。
自定义补全和 Emmet / AutoFileName 插件冲突怎么办
Emmet 把 div + Tab 展开成 <div></div>,而你的 .sublime-completions 也设了 trigger: "div",结果要么不出现,要么顺序错乱。
- 最直接办法:给自定义补全加精确
scope,比如限定source.python,Emmet 默认只在text.html和source.css生效,天然隔离 - 如果非要同 scope 共存(比如都用在 HTML 中),就避免 trigger 重名;把你的补全 trigger 改成
div!或my-div,避开 Emmet 的缩写词表 - AutoFileName 会在路径输入时劫持 Tab,若你希望它只在引号内生效,可在设置里加:
"auto_filename_scope": "string.quoted"
真正麻烦的是 scope 写得太宽,比如 text.plain ——它会让所有补全在任意文件里打架,调试时很难定位谁抢了优先权。越具体越可控,哪怕多写几行配置。











