跳转到内容

第 3 章 · VS Code 按语言的扩展

一句话:让 VS Code 懂某种语言的扩展:补全和报错、格式化与 lint、测试、调试,按 Python、JavaScript/TypeScript、C#、Go 分组。 用它还是用别的:每种语言只装官方或装机量最大的那一套,同一件事(语言服务、格式化)只留一个扩展;Prettier、EditorConfig 这类不分语言的扩展见第 2 章。 核对版本:VS Code 1.138,Python 扩展 2026.6,C# Dev Kit 3.40,Go 扩展 0.56,2026-10

扩展只负责“懂”这门语言,真正编译和运行代码的是语言本身,所以先装语言,再装扩展。四种语言的安装命令和查版本命令:

语言 Windows macOS Linux(Debian/Ubuntu) 查版本
Python winget install Python.Python.3.14 brew install python@3.14 sudo apt install python3 python3-venv python --version
Node.js winget install OpenJS.NodeJS.LTS brew install node sudo apt install nodejs npm node --version
.NET SDK winget install Microsoft.DotNet.SDK.10 brew install --cask dotnet-sdk sudo apt install dotnet-sdk-10.0 dotnet --info
Go winget install GoLang.Go brew install go sudo apt install golang-go go version

macOS 和 Linux 上 Python 的命令是 python3,后文写 python 的地方照此替换。Ubuntu 软件源里的 Node 和 Go 版本通常落后一两个大版本,项目要求新版本时按官网说明安装。Ubuntu 24.04 及以后的自带软件源里有 .NET 10,22.04 要先加 ppa:dotnet/backports。装完语言后关掉已打开的终端和 VS Code 再重开,新的 PATH 才生效。

再装扩展。一条 code 命令可以连写多个 --install-extension,一次装一组,适合放进新机器的初始化脚本:

终端窗口
code --install-extension ms-python.python --install-extension charliermarsh.ruff --install-extension ms-toolsai.jupyter
code --install-extension dbaeumer.vscode-eslint --install-extension esbenp.prettier-vscode --install-extension vitest.explorer
code --install-extension ms-dotnettools.csdevkit
code --install-extension golang.go

有的扩展会连带装上别的扩展:Python 扩展带上 Pylance、Python Debugger 和 Python Environments,C# Dev Kit 带上 C# 扩展和 .NET Install Tool,Jupyter 带上四个笔记本辅助扩展。装完核对一遍:

终端窗口
code --list-extensions --show-versions
  • 语言服务器(Language Server):补全、悬停提示、转到定义、红色波浪线都来自它。它是扩展在后台起的一个独立进程,Python 是 Pylance,TypeScript 是 VS Code 自带的 tsserver,Go 是 gopls,C# 是 Roslyn。它卡住或崩溃时,这些功能会一起失效,命令面板里都有对应的“Restart Language Server”一类命令。
  • 调试适配器(Debug Adapter):VS Code 和真正的调试器之间的翻译。按 F5 时,Python 走 debugpy,Go 走 dlv(Delve),Node 用 VS Code 自带的 JavaScript 调试器。启动参数写在 .vscode/launch.json 里。
  • 解释器或 SDK 选择:语言服务器和调试器都要知道用哪个 Python、哪个 TypeScript、哪个 .NET SDK。打开对应语言的文件后,状态栏右下角显示当前选的是哪一个,点它可以换。选错了,语言服务器到你的虚拟环境之外找包,结果就是代码明明能跑,编辑器里却到处是“找不到模块”。
  • 格式化器(Formatter)与 lint 是两件事:格式化器只管排版,缩进、空格、换行、引号,改完代码意思不变;lint(代码检查)找的是可能的错误和坏写法,比如未使用的变量、let 应改 const,有些能自动修。保存时排版靠 editor.formatOnSave 加默认格式化器,保存时自动修 lint 问题靠 editor.codeActionsOnSave,两项分开设。Ruff 一个扩展两件事都做,ESLint 只做 lint,排版交给 Prettier。
  • 测试资源管理器(Testing 视图):左侧烧杯图标。语言扩展发现项目里的测试后在这里列成一棵树,每个测试旁边有运行和调试按钮,失败的测试直接在代码行上标红并显示断言信息。没有出现测试,多半是测试框架没配置或没装进当前环境。

语言服务器和调试器都不自带语言,都靠状态栏里选中的那个解释器或 SDK 找依赖、跑程序:

编辑器、语言服务器、调试适配器和解释器或 SDK 的关系:两条路都落到状态栏选中的解释器或 SDK 上

先看总表,按“要解决什么问题”找到该装哪个扩展:

语言 语言服务 格式化与 lint 测试 调试
Python Pylance Ruff Python 扩展(pytest、unittest) Python Debugger
JavaScript/TypeScript 内置 Prettier、ESLint Vitest 或 Jest 扩展 内置
C# C#(随 C# Dev Kit) C#(随 C# Dev Kit) C# Dev Kit C# Dev Kit
Go Go(gopls) Go(gofmt) Go Go(dlv)

明细按语言分组,括号里的 ID 可直接用于 code --install-extension。

扩展 装它干什么 注意
Python
Python(ms-python.python) 选解释器、运行文件、发现和运行测试 装它会连带装上下面三个,不用单独装
Pylance(ms-python.vscode-pylance) Python 的语言服务器:补全、跳转、类型检查、找不到模块时画红线 默认不做严格类型检查,要检查时把 python.analysis.typeCheckingMode 设为 "standard"
Python Debugger(ms-python.debugpy) 按 F5 调试 Python 文件、Flask、Django、pytest 第一次按 F5 选“Python File”即可调试当前文件
Python Environments(ms-python.vscode-python-envs) 侧边栏里看、建、删虚拟环境,装包 自动发现项目里的 .venv,新开的终端会自动激活它
Ruff(charliermarsh.ruff) Python 的格式化加 lint,删未使用的 import、整理 import 顺序 要设为 [python] 的默认格式化器(见 3.5);规则写在 pyproject.toml 的 [tool.ruff] 里
Jupyter(ms-toolsai.jupyter) 打开和运行 .ipynb 笔记本,在 # %% 分隔的单元格里逐段运行 内核用的是右上角选的解释器,要在那个环境里装 ipykernel
JavaScript/TypeScript
TypeScript 语言服务(内置) JS、TS 的补全、跳转、类型报错,打开文件就有 不用装;状态栏 {} 图标里能看到用的是哪个 TypeScript 版本
ESLint(dbaeumer.vscode-eslint) 在编辑器里显示 ESLint 的报错,保存时自动修 项目里要先装 eslint 并有配置文件,扩展本身不带 ESLint
Prettier(esbenp.prettier-vscode) JS、TS、CSS、JSON 的格式化 设置方法见第 2 章
Vitest(vitest.explorer) 把 Vitest 测试列进测试视图,单个测试点击运行或调试 项目里要先装 vitest,扩展本身不带测试框架
Jest(Orta.vscode-jest) 把 Jest 测试列进测试视图,改代码后自动重跑相关测试 和 Vitest 扩展二选一,按项目用的测试框架装
Pretty TypeScript Errors(yoavbls.pretty-ts-errors) 把一大段类型报错排版成带高亮、可点击跳转的形式 只改显示,不改报错内容
C#
C# Dev Kit(ms-dotnettools.csdevkit) 解决方案资源管理器、生成、测试视图、调试 个人、学术和开源开发免费,条款与 Visual Studio Community 相同;组织使用时,它包含在 Visual Studio Professional 和 Enterprise 订阅以及 GitHub Codespaces 中
C#(ms-dotnettools.csharp) C# 的语言服务器(Roslyn):补全、跳转、重构、格式化 随 C# Dev Kit 自动装上;只装它不装 Dev Kit 也能用,但没有解决方案视图和测试视图
.NET Install Tool(ms-dotnettools.vscode-dotnet-runtime) 给上面两个扩展下载它们自己要用的 .NET 运行时 自动装上;它不会替你装开发用的 .NET SDK,SDK 按 3.1 自己装
Go
Go(golang.go) Go 的全部支持:gopls 语言服务、保存时 gofmt 和整理 import、测试视图、dlv 调试 第一次打开 .go 文件会提示安装 gopls 等工具,点“Install”或“Install All”;以后运行“Go: Install/Update Tools”更新
其他语言
rust-analyzer(rust-lang.rust-analyzer) Rust 的语言服务器 要先装 Rust 工具链;调试另装 CodeLLDB 等调试器扩展
Extension Pack for Java(vscjava.vscode-java-pack) Java 语言服务、Maven 和 Gradle、调试、测试,一次装六个扩展 要先装 JDK
C/C++(ms-vscode.cpptools) C/C++ 的补全、跳转和调试 不带编译器,要自己装 GCC、Clang 或 MSVC
Dockerfile 和 Compose 文件 补全、校验和管理容器 用 Container Tools 扩展,见第 2 章

从一个只有代码的目录开始,到保存时自动排版、测试视图能跑、能下断点:

  1. 在项目目录建虚拟环境:python -m venv .venv。
  2. 用 VS Code 打开项目:code .。
  3. 打开任一 .py 文件,点状态栏右下角的 Python 版本,选 .venv 那一项;列表里没有就运行“Python: Select Interpreter”,选“Enter interpreter path…“填 .venv 里的 python。
  4. 按 Ctrl+` 开新终端,确认提示符前出现 (.venv),再装依赖:python -m pip install pytest ruff。
  5. 装 Ruff 扩展,把 3.5 的 [python] 设置块加进工作区设置:code --install-extension charliermarsh.ruff。
  6. 保存一个有多余 import 的文件,未使用的 import 被删掉、排版被整理;命令行上同样的检查是 ruff check --fix .。
  7. 命令面板运行“Python: Configure Tests”,选 pytest,再选测试所在目录;测试视图里出现测试树,在命令行核对:python -m pytest -q。
  8. 在要停下的行按 F9,按 F5 选“Python File”;调试 pytest 测试时在测试视图里点该测试旁的调试按钮。

TypeScript:类型检查与保存时自动修复

Section titled “TypeScript:类型检查与保存时自动修复”
  1. 建项目:npm init -y。
  2. 改为 ES 模块,和 tsc --init 生成的默认配置一致:npm pkg set type=module。
  3. 装项目自己的 TypeScript:npm install -D typescript。
  4. 生成 tsconfig.json:npx tsc --init。
  5. 打开任一 .ts 文件,类型错误边输入边出现,不用先编译;命令面板运行“TypeScript: Select TypeScript Version…”,选“Use Workspace Version”,让编辑器和命令行用同一个版本。
  6. 装 ESLint 和 TypeScript 规则:npm install -D eslint @eslint/js typescript-eslint。
  7. 在项目根目录建 eslint.config.js,内容见下面的代码块;在命令行核对规则生效:npx eslint .。
  8. 把 3.5 的 [typescript][typescriptreact] 设置块加进工作区设置,保存时 let 自动改 const 这类问题被修掉;命令行等价于 npx eslint --fix .。
  9. 装测试框架,测试视图里出现 *.test.ts 里的测试:npm install -D vitest,命令行运行是 npx vitest run。

第 7 步的 eslint.config.js:

import js from "@eslint/js";
import { defineConfig } from "eslint/config";
import tseslint from "typescript-eslint";
export default defineConfig(js.configs.recommended, tseslint.configs.recommended);

Go:工具安装、保存时整理、测试

Section titled “Go:工具安装、保存时整理、测试”
  1. 确认 Go 已装好:go version。
  2. 建模块:go mod init example.com/hello。
  3. 打开项目,新建 main.go:code .。
  4. 右下角弹出 The "gopls" command is not available. 时点“Install”(缺好几个工具时是“Install All”);没弹或要更新时运行“Go: Install/Update Tools”,全选后确定。命令行等价于 go install golang.org/x/tools/gopls@latest。
  5. 写代码时用到的包不用手写 import,保存时自动补上、删掉没用到的,并按 gofmt 排版(Go 扩展默认就开着);命令行核对:gofmt -l .。
  6. 新建 main_test.go 写一个 TestXxx 函数,测试视图里出现它,函数上方也会出现“run test | debug test”;命令行运行:go test ./...。
  7. 在测试函数里按 F9 下断点,点“debug test”;调试要用 dlv,第 4 步点了“Install All”或运行过“Go: Install/Update Tools”就已装上,否则第一次调试时会提示安装,命令行安装:go install github.com/go-delve/delve/cmd/dlv@latest。

按语言的设置写在哪:

文件 位置 放什么
用户设置 见 1.5 对所有项目生效的个人偏好
工作区设置 项目里的 .vscode/settings.json 本项目的格式化器、解释器、TS 版本,提交进仓库
调试配置 项目里的 .vscode/launch.json F5 的启动参数
工具自己的配置 pyproject.toml、eslint.config.js、tsconfig.json、go.mod 规则本身;命令行和编辑器读的是同一份

"[python]": { … } 这种带方括号的键是按语言的设置块,里面的设置只对这种语言的文件生效,所以可以给每种语言指定不同的默认格式化器。值得改的项:

配置项 建议值 效果
editor.defaultFormatter(写在 [语言] 里) 扩展 ID,如 "charliermarsh.ruff" 这种语言用哪个格式化器
editor.formatOnSave(写在 [语言] 里) true 保存时排版
editor.codeActionsOnSave 的 source.fixAll "explicit" 保存时自动修 lint 问题;只让 ESLint 修就写 source.fixAll.eslint
editor.codeActionsOnSave 的 source.organizeImports "explicit" 保存时整理 import,删掉没用到的
python.defaultInterpreterPath 项目 .venv 里的 python 路径 第一次打开项目时默认用这个解释器
python.testing.pytestEnabled true 用 pytest 发现测试,“Python: Configure Tests”会替你写上
python.analysis.typeCheckingMode "standard" Pylance 做类型检查,默认 "off" 只报语法和找不到的名字
js/ts.tsdk.path "node_modules/typescript/lib" 编辑器可以改用项目里的 TypeScript;旧名 typescript.tsdk 在 1.138 里已标为弃用

最小配置,放进项目的 .vscode/settings.json:

{
"[python]": { // 只对 Python 文件生效
"editor.defaultFormatter": "charliermarsh.ruff", // Ruff 排版
"editor.formatOnSave": true, // 保存时排版
"editor.codeActionsOnSave": {
"source.fixAll": "explicit", // 保存时修 lint 问题
"source.organizeImports": "explicit" // 保存时整理 import
}
},
"[typescript][typescriptreact]": { // 只对 TS、TSX 生效;JS 另写 [javascript]
"editor.defaultFormatter": "esbenp.prettier-vscode", // Prettier 排版
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit" // 只让 ESLint 自动修
}
},
"[csharp]": { // 只对 C# 文件生效
"editor.defaultFormatter": "ms-dotnettools.csharp", // C# 扩展自带的格式化
"editor.formatOnSave": true
},
"[go]": { // Go 扩展默认已这样设置,写出来便于团队看清
"editor.defaultFormatter": "golang.go", // gofmt 排版
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit" // 保存时补全和删除 import
}
},
"python.defaultInterpreterPath": "${workspaceFolder}/.venv/bin/python", // Windows 写 .venv/Scripts/python.exe
"python.testing.pytestEnabled": true, // 用 pytest 发现测试
"js/ts.tsdk.path": "node_modules/typescript/lib" // 可切换到项目里的 TypeScript
}
  • Python 代码到处是红线,报 Import "requests" could not be resolved,命令行却能跑。 原因:VS Code 选的解释器不是装了这些包的那个虚拟环境(见第 1 章 1.6)。处理:点状态栏右下角的 Python 版本,换成项目的 .venv。
  • 悬停提示和报错都出现两份。 原因:Pylance 之外还开着别的 Python 语言服务器,如另装的 Pyright 类扩展,或 python.languageServer 设成了 "Jedi"。处理:python.languageServer 设为 "Default",其他语言服务器扩展按工作区禁用。
  • ESLint 扩展不报任何问题。 原因:项目没装 eslint,或还用 .eslintrc.*(ESLint 9 起默认只认 eslint.config.*)。处理:npm install -D eslint;输出面板报 ESLint couldn't find an eslint.config.* file. 就按 3.4 写。
  • 编辑器里没报错,npx tsc 却报错,或反过来。 原因:编辑器用的是 VS Code 自带的 TypeScript,和项目 node_modules 里的版本不同。处理:命令面板运行“TypeScript: Select TypeScript Version…”,选“Use Workspace Version”。
  • 右下角提示 The "gopls" command is not available. 原因:gopls、dlv 等工具没装,或不在 PATH 里。处理:点“Install All”或运行“Go: Install/Update Tools”;仍不行把 go env GOPATH 下的 bin 加进 PATH。
  • C# Dev Kit 打不开项目,提示 No installed .NET SDK was found on the computer. 原因:没装 .NET SDK 或不在 PATH 里(.NET Install Tool 不装 SDK)。处理:dotnet --info 没列出 SDK 就按 3.1 安装。
  • 测试视图里是空的,没有任何测试。 原因:没配测试框架,或测试框架没装进当前选中的环境。处理:Python 运行“Python: Configure Tests”并在 .venv 里装 pytest;JS/TS 先在项目里装 vitest 或 jest,再装对应扩展。
  • 保存时 Python 文件没有排版,或弹出“有多个格式化器”。 原因:没给 [python] 指定默认格式化器,或同时装了 Ruff 和别的 Python 格式化扩展。处理:在 [python] 里设 "editor.defaultFormatter": "charliermarsh.ruff"。
  • Python 入门教程:从装扩展、选解释器、建虚拟环境到运行和调试第一个 Python 文件。
  • TypeScript:内置 TypeScript 支持、tsconfig.json、切换工作区 TypeScript 版本。
  • C#:C# Dev Kit 和 C# 扩展各管什么、许可说明、项目和测试。
  • Go:Go 扩展的工具安装、保存时格式化、测试和调试。
  • 调试配置:launch.json 的写法、常用属性和变量,各语言的调试配置都按它写。