autocomplete-plus只是调度器,真正提供补全建议的是对应语言的provider插件;若右下角grammar正确却无提示,说明provider未安装、未启用或scope不匹配,需逐一验证provider状态、scope配置及依赖环境。

autocomplete-plus 本身不报错,但 provider 没装对就会“没提示”
输入后完全没下拉框、右下角 grammar 显示正确却依然空白,不是 autocomplete-plus 坏了,而是它没找到能干活的 provider。它只是个调度器,真正干活的是 autocomplete-javascript、autocomplete-python 这类插件。
常见误操作:
- 只装了
autocomplete-plus,没装对应语言的 provider - 装了
language-babel却指望它提供 JS 补全——它只管高亮,不提供建议 - 文件后缀是
.js,但右下角显示的是JavaScript (JSX)或Babel JavaScript,而 provider 的 scope 只认source.js
验证方式:打开 Settings → Packages → 搜索 provider 名(如 autocomplete-python),确认 Enabled;再点开它的 Settings,检查 “Scope Selector” 是否包含当前 grammar 对应的 scope(比如 Python 必须含 source.python)。
补全卡死或报 Cannot read property 'getSuggestions' of undefined
这通常不是语法错误,而是某个 provider 在激活时 failed,且没被妥善 catch。最常出问题的是 vim-mode-plus 和 linter-eslint 冲突,或 autocomplete-paths 找不到项目根目录下的 jsconfig.json。
排查路径:
- 先运行
atom --safe,如果补全恢复,说明问题在插件之间;否则是 Atom 自身或系统 Node 环境问题 - 打开 DevTools(
Ctrl+Shift+I),刷新 Atom,在 Console 里搜getSuggestions,看哪一行抛错,定位到具体插件 - 禁用最近安装或更新的插件,尤其是
vim-mode-plus、linter-ui-default、autocomplete-paths—— 它们都可能在 activation 阶段直接 throw
注意:incompatible-packages 不会报这类错,它只检查编译兼容性,不涉及 runtime 逻辑。
Python 补全只认内置函数,不认自己写的类
autocomplete-python 单独装上基本没用,它依赖 python-integrator-base 和 php-integrator-reflection(没错,名字带 php 是历史遗留,实际负责 Python AST 解析)。
必须满足三个条件才生效:
- 系统能执行
php -v(该插件底层调用 PHP CLI 做反射分析) - 插件设置里填的 PHP 路径和
which php输出一致 - 项目根目录有有效的
composer.json,且不能是空的——否则插件误判为 Laravel 项目,启动冗余扫描拖慢响应甚至崩溃
PHP ≥ 8.1 时若报 ReflectionException,说明 php-integrator-reflection 版本太老,需手动切到 v3.0+ 分支。
Tab 键插入错位、CPU 占满、补全延迟超过 1 秒
这不是 Atom 性能差,而是 provider 启用了全局监听或模糊匹配策略。比如 autocomplete-clang 默认扫描整个 node_modules,autocomplete-paths 在大型 monorepo 里会递归读取所有 package.json。
可立即生效的缓解项(Settings → Packages → autocomplete-plus):
- 关掉
Enable Auto Completion→ 改用手动触发(Ctrl+Space) - 把
Minimum Word Length从 1 改成 2 或 3,减少无意义触发 - 禁用
Include Completions From All Scopes,避免跨 grammar 干扰
真正根治要进 provider 设置:比如 autocomplete-paths 里关闭 Scan All Directories,只保留 node_modules 和 src;autocomplete-python 关掉 Use Jedi(改用更轻量的 parser)。
最后提醒一句:Atom 自带 Node 是独立的,apm rebuild 必须在关掉所有 Atom 进程后执行,否则新编译的模块根本不会被加载。











