第 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
3.1 安装与版本
Section titled “3.1 安装与版本”扩展只负责“懂”这门语言,真正编译和运行代码的是语言本身,所以先装语言,再装扩展。四种语言的安装命令和查版本命令:
| 语言 | Windows | macOS | Linux(Debian/Ubuntu) | 查版本 |
|---|---|---|---|---|
| Python | winget install Python.Python.3.14 |
brew install [email protected] |
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.jupytercode --install-extension dbaeumer.vscode-eslint --install-extension esbenp.prettier-vscode --install-extension vitest.explorercode --install-extension ms-dotnettools.csdevkitcode --install-extension golang.go有的扩展会连带装上别的扩展:Python 扩展带上 Pylance、Python Debugger 和 Python Environments,C# Dev Kit 带上 C# 扩展和 .NET Install Tool,Jupyter 带上四个笔记本辅助扩展。装完核对一遍:
code --list-extensions --show-versions3.2 五分钟概念
Section titled “3.2 五分钟概念”- 语言服务器(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 找依赖、跑程序:
3.3 常用扩展
Section titled “3.3 常用扩展”先看总表,按“要解决什么问题”找到该装哪个扩展:
| 语言 | 语言服务 | 格式化与 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 章 |
3.4 典型工作流
Section titled “3.4 典型工作流”Python:从虚拟环境到调试
Section titled “Python:从虚拟环境到调试”从一个只有代码的目录开始,到保存时自动排版、测试视图能跑、能下断点:
- 在项目目录建虚拟环境:
python -m venv .venv。 - 用 VS Code 打开项目:
code .。 - 打开任一
.py文件,点状态栏右下角的 Python 版本,选.venv那一项;列表里没有就运行“Python: Select Interpreter”,选“Enter interpreter path…“填.venv里的python。 - 按
Ctrl+`开新终端,确认提示符前出现(.venv),再装依赖:python -m pip install pytest ruff。 - 装 Ruff 扩展,把 3.5 的
[python]设置块加进工作区设置:code --install-extension charliermarsh.ruff。 - 保存一个有多余 import 的文件,未使用的 import 被删掉、排版被整理;命令行上同样的检查是
ruff check --fix .。 - 命令面板运行“Python: Configure Tests”,选 pytest,再选测试所在目录;测试视图里出现测试树,在命令行核对:
python -m pytest -q。 - 在要停下的行按
F9,按F5选“Python File”;调试 pytest 测试时在测试视图里点该测试旁的调试按钮。
TypeScript:类型检查与保存时自动修复
Section titled “TypeScript:类型检查与保存时自动修复”- 建项目:
npm init -y。 - 改为 ES 模块,和
tsc --init生成的默认配置一致:npm pkg set type=module。 - 装项目自己的 TypeScript:
npm install -D typescript。 - 生成
tsconfig.json:npx tsc --init。 - 打开任一
.ts文件,类型错误边输入边出现,不用先编译;命令面板运行“TypeScript: Select TypeScript Version…”,选“Use Workspace Version”,让编辑器和命令行用同一个版本。 - 装 ESLint 和 TypeScript 规则:
npm install -D eslint @eslint/js typescript-eslint。 - 在项目根目录建
eslint.config.js,内容见下面的代码块;在命令行核对规则生效:npx eslint .。 - 把 3.5 的
[typescript][typescriptreact]设置块加进工作区设置,保存时let自动改const这类问题被修掉;命令行等价于npx eslint --fix .。 - 装测试框架,测试视图里出现
*.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:工具安装、保存时整理、测试”- 确认 Go 已装好:
go version。 - 建模块:
go mod init example.com/hello。 - 打开项目,新建
main.go:code .。 - 右下角弹出
The "gopls" command is not available.时点“Install”(缺好几个工具时是“Install All”);没弹或要更新时运行“Go: Install/Update Tools”,全选后确定。命令行等价于go install golang.org/x/tools/gopls@latest。 - 写代码时用到的包不用手写 import,保存时自动补上、删掉没用到的,并按 gofmt 排版(Go 扩展默认就开着);命令行核对:
gofmt -l .。 - 新建
main_test.go写一个TestXxx函数,测试视图里出现它,函数上方也会出现“run test | debug test”;命令行运行:go test ./...。 - 在测试函数里按
F9下断点,点“debug test”;调试要用 dlv,第 4 步点了“Install All”或运行过“Go: Install/Update Tools”就已装上,否则第一次调试时会提示安装,命令行安装:go install github.com/go-delve/delve/cmd/dlv@latest。
3.5 配置要点
Section titled “3.5 配置要点”按语言的设置写在哪:
| 文件 | 位置 | 放什么 |
|---|---|---|
| 用户设置 | 见 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}3.6 注意事项
Section titled “3.6 注意事项”- 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"。
3.7 深入阅读
Section titled “3.7 深入阅读”- Python 入门教程:从装扩展、选解释器、建虚拟环境到运行和调试第一个 Python 文件。
- TypeScript:内置 TypeScript 支持、tsconfig.json、切换工作区 TypeScript 版本。
- C#:C# Dev Kit 和 C# 扩展各管什么、许可说明、项目和测试。
- Go:Go 扩展的工具安装、保存时格式化、测试和调试。
- 调试配置:launch.json 的写法、常用属性和变量,各语言的调试配置都按它写。