补全列表混入无关项的根本原因是VSCode默认宽泛匹配策略,需通过"editor.suggest.showBuiltins": false、"typescript.suggest.autoImports": "off"、"editor.suggest.localityBonus": true等配置协同控制数据源、排序与过滤。

为什么补全列表里总出现不需要的项
补全列表混入 node_modules、内置 API 或拼写相近但语义无关的符号,本质是 VSCode 默认开启宽泛匹配策略。它不区分“当前项目用到的”和“理论上存在的”,而是把所有能解析到的符号一股脑扔进建议池,再靠模糊匹配排序——editor.suggest.localityBonus 和 editor.suggest.filterOnType 才是控制过滤优先级的关键开关。
如何关闭第三方包和内置 API 的干扰
默认情况下 editor.suggest.showBuiltins 和 typescript.suggest.autoImports 都为 true,导致 console.log、Array.from 甚至 lodash.throttle 全部出现在任意文件的补全里。实际开发中你往往只关心当前模块定义的变量和方法。
-
"editor.suggest.showBuiltins": false—— 屏蔽全局内置对象方法(如JSON.parse、setTimeout) -
"typescript.suggest.autoImports": "off"—— 关闭自动导入提示,避免补全列表被未显式引入的包成员污染 -
"editor.suggest.showWords": false—— 关掉基于文档内单词的联想(比如你写过userList,它就可能推荐userLogin,纯靠字符串相似度,无语义)
怎样让补全优先显示当前文件/作用域内的符号
真正影响“过滤结果”的不是“删掉什么”,而是“先排什么”。VSCode 的补全排序逻辑依赖两个隐藏权重:localityBonus(本地性加成)和 filterOnType(输入匹配强度)。不启用它们,光关掉某些项只是减少数量,不提升相关性。
-
"editor.suggest.localityBonus": true—— 当前文件定义的符号永远排在最前面,哪怕你只打了两个字母 -
"editor.suggest.filterOnType": true—— 输入越精确,过滤越严格;比如打getU就不会出现getUserById和getUserName并列,而是按前缀匹配度动态排序 -
"editor.suggest.selectionMode": "recentlyUsedByPrefix"—— 比first更合理:记住你上次用getById补全了哪个函数,下次输getById就默认选它
Python 和 TypeScript 的过滤差异在哪
语言服务器决定你能“看到什么”,编辑器设置决定你“怎么看到”。TypeScript 依赖 tsconfig.json 的 include/exclude 控制 AST 解析范围,而 Python 依赖 Pylance 对 python.defaultInterpreterPath 下环境的索引质量。两者都绕不开一个事实:补全列表的源头数据,比前端过滤参数更重要。
- TypeScript:如果
tsconfig.json里"exclude": ["node_modules"]缺失,LSP 仍会加载所有声明文件,editor.suggest.showMethods关了也没用——符号根本不在模型里 - Python:若
python.defaultInterpreterPath指向空虚拟环境,Pylance 看不到requests包的任何定义,自然不会补全requests.get,此时调高localityBonus也无济于事 - 通用陷阱:修改
settings.json后没重启语言服务器——改完配置要手动触发Developer: Restart Language Server命令,否则新设置不生效
showVariables,先确认状态栏右下角显示的是 Pylance 还是 None,或者 TypeScript 是否报错 “No project found”。


















