vscode 1.80+ 已彻底移除 editor.suggestsorting,唯一可控排序维度是 editor.suggest.orderby(default/usage/type),但仅影响客户端二次加权,不改变语言服务器原始顺序;需配合 editor.suggest.sortselecteditems: false 与 localitybonus: true 才能使本地定义项优先,且语言专属设置会静默覆盖全局配置。

VSCode 1.80+ 版本已完全移除 editor.suggestSorting,任何沿用旧文档配这个字段的操作都无效——不是你设错了,是它真没了。
editor.suggest.orderBy 是目前唯一可控的排序维度
这个配置决定补全候选列表的整体排序逻辑,但仅影响客户端对语言服务器返回结果的二次加权,不改变语言服务器(如 TS Server、Pylance)原始返回顺序。
-
default:依赖语言服务器提供的sortText字段,多数情况下最可靠 -
usage:按历史选择频次排序,需持续使用数小时才开始明显生效;首次打开新项目时几乎无感 -
type:配合editor.suggest.kindSortOrder控制类型权重,例如{"function": "0", "method": "1"}可让函数优先于方法,但对同类型项(比如多个函数)无区分力
注意:orderBy 在不同语言块中可独立设置,比如 "[javascript]": { "editor.suggest.orderBy": "usage" },但若全局和语言块同时存在,语言块会覆盖全局。
editor.suggest.localityBonus: true 必须配合 editor.suggest.sortSelectedItems: false
这是让当前文件里定义的变量、函数、Hook 等高频项稳定靠前的关键组合。单独开 localityBonus 几乎没效果,因为默认 sortSelectedItems: true 会把“你上次选过的”强行置顶,直接压过本地定义项。
- 设
editor.suggest.sortSelectedItems: false后,不再记忆“上次选哪个”,每次补全都重新按规则算权重 -
localityBonus: true会让光标附近作用域内的符号获得更高初始分,比如你在src/hooks/useAuth.ts里输use,useAuth就比useState更可能排第一 - 该机制对 TypeScript/JavaScript 最有效;Python(Pylance)也支持,但效果弱于 TS,因 Pylance 更依赖 AST 分析而非局部文本位置
语言专属设置常静默覆盖全局配置
VSCode 补全行为的优先级链是:[javascript] > [typescript] > 工作区设置 > 用户设置。你以为改了全局就生效,其实 JS 文件里早被语言块劫持了。
- 打开
settings.json,搜索"[javascript]": {或"[typescript]": {,检查是否含重复的editor.suggest.*配置 - 常见冲突项:
editor.suggestSelection(控制默认高亮项)、editor.suggest.snippetsPreventQuickSuggestions(影响代码片段触发) - 临时验证法:在
settings.json顶部加一行"editor.suggestSelection": "first",保存后在 JS 文件里按Ctrl+Space,看首项是否高亮;不生效,基本就是语言块覆盖了 - 修改后务必执行 Developer: Reload Window,仅重载设置不刷新语言服务器状态
高频内置项(如 console.log、useState)无法主观置顶
VSCode 不提供“手动钉住某几个补全项”的能力。所谓“让 console.log 总在第一行”,本质是缩小候选池 + 提升匹配精度:
- 关闭干扰源:禁用非必要补全插件(如某些老旧的 snippets 扩展),它们常注入大量低相关项
- 精简触发字符:
editor.suggestOnTriggerCharacters: false+ 手动Ctrl+Space,避免输入.时混入大量对象属性 - 用前缀过滤:输
con再触发,比输c触发候选数少 80% 以上;us比u更快锁定useState - 自定义 snippet 是最稳方案:为
console.log单独建一个log前缀片段,比等补全快且确定
真正难调的不是“怎么排”,而是“哪些项不该出现”——删掉噪音,剩下的自然清晰。











