vscode代码补全依赖语言服务器(lsp)与项目上下文,规范依赖格式化器(prettier/black)与eslint协同;补全失效先查状态栏语言标识、jsconfig.json/tsconfig.json配置及ts服务重启,规范冲突需禁用eslint格式能力并精确配置defaultformatter。

VSCode 的代码补全和自动规范不是装几个插件就能“开箱即用”的两件事,它们各自依赖不同的底层机制,且容易互相干扰。补全靠语言服务器(LSP)+ 项目上下文,规范靠格式化器(Prettier/Black)+ ESLint 协同分工;两者配置错位,轻则提示失效,重则保存时代码乱跳、光标失焦。
补全不生效?先确认语言服务器真在跑
很多人改了一堆 editor.suggest.* 设置却没用,问题根本不在配置,而在语言服务压根没加载成功。
- 看右下角状态栏:必须显示具体语言名(如
TypeScript、Python),不能是Plain Text或Unknown - 按
Ctrl+Shift+P→ 输入Change Language Mode→ 手动选对语言(尤其.vue、.jsx、.pyi这类后缀极易错配) - 写一行明显报错的代码测试:TS 中写
const a: number = 'hello';没红色波浪线?说明 TS 服务没接管;Python 中输np.arra不提示array?大概率Pylance没加载 - 打开输出面板(
Ctrl+Shift+U),切换到对应语言 Server 日志,搜Starting或error
JS/TS 补全失效?缺 jsconfig.json 或 tsconfig.json 是硬伤
没有这个文件,VSCode 就当你的项目是“单个 JS 文件”,所有别名路径(如 @/utils)、模块推导、类型提示都会断掉——补全是盲猜,跳转是摆设。
- 在项目根目录新建
jsconfig.json(纯 JS)或tsconfig.json(TS),内容至少含compilerOptions.baseUrl和include - 要支持别名补全,必须配
paths,例如:"@/*": ["src/*"],否则import Button from '@/ui/Button'后按.不出方法列表 -
include要明确覆盖源码目录,比如"include": ["src/**/*"],漏掉就索引不到 - 改完立刻按
Ctrl+Shift+P→TypeScript: Restart TS server,不重启等于没改
Prettier 和 ESLint 一起用?必须让它们各干各的
ESLint 默认带格式规则(如 indent、quotes),Prettier 也管这些。二者同时启用且未协调,会导致保存时代码被反复重排、“抖动”,甚至光标跳到奇怪位置。
- 安装
eslint-config-prettier,并在.eslintrc.cjs或.eslintrc.json中最后extend它,关闭所有与 Prettier 冲突的格式类规则 - 确认 ESLint 配置里没手动开启
semi、comma-dangle等格式规则 - VSCode 设置中显式禁用 ESLint 的格式能力:
"eslint.format.enable": false(默认是true,不设false就会和 Prettier 抢着格式化) - 必须设:
"editor.defaultFormatter": "esbenp.prettier-vscode",且只对特定语言设,例如"[javascript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },不能全局硬塞一个格式器
settings.json 里这几个字段必须手写,GUI 点不开
VSCode 图形界面设置无法修改深层字段,很多补全和格式化行为开关只能靠直接编辑 settings.json 控制。
-
"editor.suggest.showKeywords": true—— 否则if、for、return不进补全列表 -
"editor.quickSuggestions": {"other": true, "comments": false, "strings": false}—— 字符串里触发补全是反模式,但普通代码块必须开 -
"editor.suggest.snippetsPreventQuickSuggestions": false—— 否则写for时不会自动弹出 for-loop 模板 -
"typescript.preferences.includePackageJsonAutoImports": "auto"—— 否则node_modules里的类型不进提示
最常被忽略的其实是语言 ID 和格式器支持范围的匹配问题:比如你配了 [typescript],但文件实际语言 ID 是 typescriptreact,那 Prettier 就不会响应。这类细节不出错时一切正常,一出错就很难定位。











