☰
Visual Studio Code 1.36(2019 年 6 月)更新全解析:终端、任务、调试与扩展开发新特性
2026/10/12 8:21:12 网站建设 项目流程
  • 文档
  • 教程

【免费下载链接】vscode-docs

Public documentation for Visual Studio Code

项目地址:https://gitcode.com/gh_mirrors/vs/vscode-docs
点击查看免费下载

本文基于 vscode-docs 仓库中的 June 2019 发布说明,系统梳理 Visual Studio Code 1.36 版本引入的工作台、集成终端、任务系统、语言服务、调试器与扩展开发相关的新特性。读者可借此掌握该版本新增配置项的作用与取值、任务依赖顺序执行与问题匹配器路径自动检测等实操方法,并理解vscode包拆分为@types/vscode与vscode-test的架构调整对扩展开发带来的影响。文中所有配置参数与行为描述均可在当前仓库的对应文档中交叉验证。

工作台(Workbench)

隐藏/显示单个状态栏条目

1.36 为状态栏增加了上下文菜单:在任意状态栏条目上右键,即可隐藏或显示单个条目,让状态栏只展示你关心的信息。该配置会全局持久化,对所有工作区生效。

注意:此前的设置项workbench.statusBar.feedback.visible已被移除,改用上述新方案。如果你想隐藏状态栏上的"笑脸"反馈按钮,请直接使用状态栏上下文菜单。

树形缩进引导线(Tree Indent Guides)

树控件(Tree Widget)在本版本开始支持缩进引导线,因此文件资源管理器、搜索视图、调试视图等基于树形结构的面板都能显示层级引导线,项目文件夹结构一目了然。

相关配置有两个:

  • workbench.tree.indent:沿用旧有功能,控制树的缩进级别;
  • workbench.tree.renderIndentGuides:控制缩进引导线的显示方式,可取以下三个值:
取值行为
onHover鼠标悬停在树上方时显示引导线,默认行为
always始终显示引导线
none不显示引导线

从外部拖放文件夹到资源管理器实现复制

此前把文件夹从 VS Code 外部拖入资源管理器,总会以该文件夹为根打开一个新工作区;现在拖放操作可以直接复制文件夹内容。这一行为变化让资源管理器对文件夹的拖入操作更符合文件管理器的直觉。

复制粘贴文件名递增规则的调整

在资源管理器中对同名文件/文件夹进行复制粘贴时,VS Code 会为粘贴副本自动递增命名。旧算法有时会产生意外结果,1.36 将其简化为如下规则:

"hello.txt" -> "hello copy.txt" -> "hello copy 2.txt" -> "hello copy 3.txt"

禁用 Alt 键聚焦自定义菜单栏

不少用户希望按下 Alt 键时不触发自定义菜单栏的焦点切换。新增设置window.customMenuBarAltFocus,将其设为false即可禁用该行为。

文件内搜索的 Minimap 装饰

在单文件内执行搜索时,匹配结果现在会同时在文件正文与右侧 Minimap(缩略图)中高亮,方便快速定位所有命中位置。

警告色更新

本版本更新了list.warningForeground与editorWarning.foreground两个颜色令牌,使其与编辑器其余警告色更一致;该变化会体现在文件资源管理器、Peek 错误视图与编辑器波浪线中。同时更新了editorOverviewRuler.findMatchForeground,让概览标尺(Overview Ruler)中的查找匹配标记与新的警告色更易区分。

在线服务设置(Online Services Settings)

VS Code 会出于下载产品更新、查找/安装/更新扩展、为设置编辑器提供自然语言搜索等目的使用在线服务。用户可在设置编辑器中以@tag:usesOnlineServices标签过滤出所有涉及在线服务的设置项,逐个开关。本版本新增菜单命令文件(File)> 首选项(Preferences)> 在线服务设置(Online Services Settings),执行后会自动在设置编辑器内应用该过滤标签。更详细的遥测与在线服务说明见仓库中的 遥测文档。

集成终端(Integrated Terminal)

更好的默认 Shell 选择器

Windows 平台早有Select Default Shell(选择默认 Shell)命令,上一版本已将其加入终端下拉菜单。1.36 将这一命令扩展到 macOS 与 Linux:它会读取系统的/etc/shells文件,枚举系统上已注册的全部 Shell,供用户一键切换默认终端 Shell。

以干净环境启动终端(inheritEnv)

VS Code 集成终端的行为在 Linux/macOS 上与普通终端略有差异:其环境变量总是继承自 VS Code 窗口(Electron 实例),同时剔除 VS Code/Electron 相关的环境变量;而普通终端通常由 Dock/启动菜单启动,使用系统环境。这会导致某些场景出现异常——典型例子是 Python 虚拟环境因依赖$PATH变量而失效。

新增预览选项terminal.integrated.inheritEnv,设为false后终端将不再使用 VS Code 的环境,而是按平台执行不同策略:

  • Linux:获取并采用 VS Code "主进程"的父进程环境;
  • macOS:仅从当前环境提取少数关键变量保留;官方希望未来与 Linux 行为一致,但当前获取环境仍存在问题;
  • Windows:该设置暂不影响 Windows。

设置inheritEnv为false后最直接的可见效果是:$SHLVL(Shell 层级)应变为1,且只要启动脚本没有刻意引入重复项,$PATH不再包含重复路径。该设置的默认值为true(即旧行为),但官方计划未来将默认值切换为false。

当前仓库的 终端高级主题 进一步解释:VS Code 启动时会以登录 Shell 方式派生环境以加载~/.bash_profile等脚本,终端默认继承该环境并可能重复执行多个 profile 脚本,terminal.integrated.inheritEnv正是用于在 macOS/Linux 上关闭这一继承。终端配置文件文档 也指出,设false会剔除终端环境中大多数变量、仅保留如HOME、SHELL、TMPDIR等重要变量;终端启动问题排查表见 终端启动故障排查。

Ctrl+\ 行为变更

此前 Linux/Windows 上Ctrl+\绑定的是"拆分终端"命令;1.36 起改为向 Shell 透传SIGQUIT信号,与大多数终端的行为保持一致。若希望恢复旧行为,可在keybindings.json中手动添加:

{ "key": "ctrl+\\", "command": "workbench.action.terminal.split", "when": "terminalFocus" }

任务系统(Tasks)

顺序化依赖执行(Sequential Dependency Execution)

dependsOn任务属性默认以并行方式运行所有依赖任务;1.36 新增"dependsOrder": "sequence"声明,可让依赖任务按dependsOn数组中列出的顺序依次执行。注意:dependsOn中若包含后台/监视类任务(background/watch tasks),在顺序模式下必须配置能跟踪其"完成"状态的问题匹配器(problem matcher)。

下面示例任务会依次运行任务 Two、任务 Three,最后运行任务 One:

{ "label": "One", "type": "shell", "command": "echo Hello ", "dependsOrder": "sequence", "dependsOn":[ "Two", "Three" ] }

当前仓库的 任务文档 也收录了完全相同的行为说明与示例,可作为该特性的权威参考。

问题匹配器的路径自动检测

任务输出被扫描问题时,路径信息由问题匹配器的fileLocation属性提供。在原有的relative(相对)与absolute(绝对)取值之外,1.36 新增autoDetect取值:任务系统会自动尝试判定问题中路径是相对路径还是绝对路径,减少手动配置成本。

语言(Languages)

TypeScript 3.5.2

本版本内置 TypeScript 3.5.2,该小版本修复了若干重要缺陷。

更快地使用 JS/TS 的纯语法特性

VS Code 的 JavaScript/TypeScript 语言功能由 TypeScript 服务器(tsserver)驱动,既支撑 IntelliSense、错误报告等复杂特性,也支撑代码折叠、文档大纲等简单特性。像 IntelliSense 这类功能需要 tsserver 先评估整个项目才能返回结果,大型项目耗时较长;处理期间服务器无法响应其他请求——包括代码折叠这类只需当前文件基础语义理解的请求,这会造成"折叠/大纲迟迟不可用"的延迟感。

为加速上手编码,1.36 引入实验选项:VS Code 同时运行两个TypeScript 服务器——一个只处理基于纯语法结构的简单操作,另一个完整处理项目分析、IntelliSense、错误报告等高级特性。启用方法是在设置中写入:

"typescript.experimental.useSeparateSyntaxServer": true

该设置要求工作区内使用 TypeScript 3.4 或更高版本。

调试(Debugging)

Jump to Cursor(跳转到光标)

新增调试命令Jump to Cursor:可将程序执行位置直接移动到新位置,跳过中间所有代码的执行。若当前调试器支持该能力,调试期间命令会出现在编辑器上下文菜单与命令面板中。该命令在 1.36 中仅由 C# 扩展提供,其他调试扩展预计陆续跟进。

禁用调试控制台自动换行

新设置debug.console.wordWrap控制调试控制台(Debug Console)是否换行:默认开启,所有行自动换行;关闭后,长行不再断行,控制台出现水平滚动条,便于保持调试输出单行阅读。

Node.js 调试配置 useWSL 属性弃用

随着 WSL 扩展带来通用 Windows Subsystem for Linux 支持(所有扩展都可在 WSL 中无缝使用),两年前为 Node.js 调试器加入的 WSL 支持已显多余,官方计划移除。1.36 起,launch.json中若含useWSL属性,编辑器会显示波浪线提示;启动包含useWSL的调试会话时还会弹出通知。

迁移既有useWSL项目到 WSL 扩展调试的步骤:

  1. 确保已安装 WSL 扩展;
  2. 在 VS Code 中打开项目文件夹;
  3. 使用WSL: Reopen Folder in WSL命令在 WSL 中重新打开项目;
  4. 按下kb(workbench.action.debug.start)启动调试;
  5. 从调试配置中移除useWSL标志。

更详细的 WSL 开发说明见仓库中的 WSL 文档。

对扩展生态的贡献

JavaScript 和 TypeScript nightly 扩展

新的 JavaScript and TypeScript nightly 扩展使用 TypeScript 的 nightly 构建(typescript@next)替代 VS Code 内置 TypeScript 版本,为 JS/TS IntelliSense 提供动力,让开发者可以提前体验并反馈最新 TypeScript 特性。

TSLint 1.2

发布新版 TSLint 扩展,修复若干重要缺陷;若工作区内存在tslint.json但 TSLint 未正确安装,状态栏会出现警告指示器。

面向 Java 开发者的安装器

新增 Visual Studio Code Installer for Java,帮助初学者一键搭建 Java 环境:自动检测 JDK、VS Code 及所需扩展是否已安装,缺失时自动下载并配置;也可用于为既有 VS Code 安装补充 Java 相关组件。配合 Java 扩展,VS Code 可提供智能补全、重构、调试、测试以及项目管理与应用服务器集成等完整 Java 开发能力。

Remote Development(预览)改进

Remote Development 系列扩展持续迭代,允许以容器、远程机器或 WSL 作为完整开发环境;其独立发布说明见仓库中的 Remote Development 发布说明。

Debugger for Chrome 作为远程 UI 扩展

在远程窗口中开发 Web 项目时,可借助 Debugger for Chrome 扩展在本地 Chrome 窗口调试:安装扩展、在远程启动开发服务器、转发服务器端口,然后启动 launch 配置即可。

扩展开发(Extension authoring)

拆分 vscode 包为 @types/vscode 与 vscode-test

受去年的 event-stream 事件影响,官方发现vscode包因其 223 个传递依赖包含event-stream而受影响,且这些依赖还频繁触发 GitHub 安全告警。为降低依赖复杂度,vscode包被拆分:

  • @types/vscode:按版本提供vscode.d.ts。例如npm i @types/vscode@1.34.0安装的是 VS Code 1.34 扩展 API。不同于旧vscode包通过postinstall脚本拉取类型文件,该包可被包管理器完整缓存;
  • vscode-test:提供一套 API 用于运行 VS Code 集成测试。旧vscode包仍可工作,但新特性只会进入vscode-test(其依赖图更精简、API 更灵活且文档化更明确)。使用说明见 Testing Extensions 文档。

配套变化:

  • vscode-dtsCLI 可快速下载任意版本 VS Code API 类型文件;
  • vsce现在会将@types/vscode版本与engines.vscode对照检查,防止在旧版 VS Code 上使用不兼容的新 API;
  • 官方样例、测试与持续集成文档均已改用vscode-test,扩展生成器也改用@types/vscode与vscode-test脚手架;
  • Testing Extensions 文档内附有从vscode迁移的指南,持续集成文档 同样已更新。

当前仓库的 扩展清单文档 中可以看到@types/vscode已成为扩展devDependencies的标准成员。

Node.js 版本更新

VS Code 运行的 Electron 版本更新,Node.js 从10.2.0升级到10.11.0,所有扩展将运行在更新的 Node.js 上。

面向远程的 API

  • 新增vscode.env.remoteName属性:只要存在远程扩展宿主(remote extension host),该属性即有定义,其值由引导远程扩展宿主的扩展决定,并在本地与远程扩展宿主上均可访问;
  • 扩展可用Extension#extensionKind判断自己运行在远程还是本地宿主:取值为ExtensionKind.UI或ExtensionKind.Workspace,对应扩展package.json中定义或用户覆盖的值;不存在远程扩展宿主时恒为ExtensionKind.UI。

DocumentLink.tooltip

新属性DocumentLink.tooltip允许DocumentLinkProvider自定义用户悬停文档链接时显示的文本。VS Code 会自动附加链接激活说明(例如示例中的cmd + click)连同tooltip文本一起展示。

端口转发与端口映射支持 127.0.0.1

vscode.env.openExternalAPI 使用默认外部应用打开 URI。当远程扩展以本地 URI(如http://localhost:8080)调用openExternal时,VS Code 会自动建立隧道,把本地某端口映射到远程机器上的目标端口。此前该自动隧道仅对localhostURI 启用,现在127.0.0.1同样生效;Webview 端口映射 API 也已同步支持127.0.0.1URI。Webview 相关开发可参考 Webview 指南。

更多属性标记为 readonly / ReadonlyArray

vscode.d.ts中更多 API 属性被标记为readonly,以更准确地向扩展表达意图。代表性变化:

  • 事件接口上的所有字段改为readonly——事件对象绝不应被修改,因为同一对象可能分发给多个监听器;
  • DiagnosticCollection的方法改为接收只读数组——集合只能通过方法更新,不能回头修改传入的数组;
  • Extensions.all变为只读数组;
  • TextEditor.insertSnippet改为接收只读数组,因为其不会修改入参。

这些readonly修饰符可能导致显式书写旧类型(非只读数组)的扩展代码编译报错:

vscode.window.onDidChangeTextEditorSelection(e => { // Error: `e.selections` is now a readonly array but // our `updateForSelections` function takes a mutable array updateForSelections(e.selections); }); function updateForSelections(selections: vscode.Selection[]) { ... }

修复方法是把readonly修饰符贯穿到扩展自身源码:

vscode.window.onDidChangeTextEditorSelection(e => { updateForSelections(e.selections); }); function updateForSelections(selections: readonly vscode.Selection[]) { ... }

TerminalOptions.hideFromUser 进入稳定 API

runInBackground终端的hideFromUser选项正式进入稳定 API。该选项可在用户调用Terminal.show()之前彻底隐藏终端:

const term = window.createTerminal({ hideFromUser: true }); term.sendText('do something')

结合sendText与onDidWriteDataAPI,扩展可先与交互式终端建立连接,仅在出错时才调用Terminal.show()展示给用户。

评论表情反应(Comment reactions)

Comments API 支持展示与管理评论上的用户反应(reactions)。当Comment.reactions存在时,反应会渲染在评论正文下方;若扩展通过CommentController.reactionHandler注册了反应处理器,用户即可对既有反应回应或通过反应选择器创建新反应。

提案扩展 API(Proposed Extension APIs)

每个里程碑都会带来新的提案 API,扩展作者可在本地试用。试用需满足三个条件:

  1. 必须使用 Insiders 版本(提案 API 变更频繁);
  2. 扩展package.json中需包含"enableProposedApi": true;
  3. 将最新版vscode.proposed.d.ts复制进项目。

提案 API 不可用于发布扩展——官方可能在下一版本做出破坏性变更,且不希望破坏既有扩展。当前仓库的 提案 API 使用指南 展示了该机制的最新形态:package.json中通过"enabledApiProposals": ["<proposalName>"]声明,并可用npx @vscode/dts dev一键下载对应的vscode.proposed.<proposalName>.d.ts类型文件。

vscode.workspace.fs

提案 APIvscode.workspace.fs允许扩展与文件系统提供者交互,在任意文件系统上创建、读取、写入、删除文件与文件夹——例如语言扩展可加载来自 FTP 服务器或其他远程来源的源文件。该 API 通过 workspace 对象上的新属性访问,试用反馈见 issue #48034。

代码插片(Code insets)API 重构

代码插片提案被重构并简化:不再使用 provider 模式,而是更接近文本装饰(text decorations)API:

export function createWebviewTextEditorInset(editor: TextEditor, line: number, height: number, options?: WebviewOptions): WebviewEditorInset;

给定编辑器、行号与高度即可创建插片;插片复用WebviewPanel中已熟悉的 Webview 能力;与装饰类似,插片在所属编辑器关闭时被销毁。

Webview.resourceRoot

提案常量resourceRoot暴露 webview 中本地资源的加载根路径。示例:创建受限 webview 面板并引用本地媒体资源。

const panel = vscode.window.createWebviewPanel(CatCodingPanel.viewType, 'Cat Coding', vscode.ViewColumn.One, { // Restrict the webview to only loading local content from our extension's `media` directory. localResourceRoots: [vscode.Uri.file(path.join(extensionPath, 'media'))] }); const resourceRoot = await panel.resourceRoot; panel.html = `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="Content-Security-Policy" content="default-src 'none'; img-src ${resourceRoot} https:;"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Cat Coding</title> </head> <body> <img src="${resourceRoot}/${path.join(extensionPath, 'media')}/cat.gif" width="300" /> </body> </html>`

桌面环境运行时resourceRoot为vscode-resource:;当 VS Code 运行于浏览器等其他环境时取值可能不同。

获取默认 Shell 的 API

由于terminal.integrated.shell.<platform>设置项默认值变为null,扩展无法再据此探测默认 Shell。新增提案 APIvscode.env.shell返回终端的默认 Shell:

const shell = vscode.env.shell; if (shell.search(/(powershell|pwsh)/i) !== -1) { // Do something special that PowerShell needs }

Language Server Protocol

面向 TypeScript 的 Language Server Index Format(LSIF)工具实现新版,其格式改进便于把大规模数据导入数据库且不绑定特定数据库;具体运行方式参见 lsif-node 仓库说明。

工程化(Engineering)

Electron 4.0 更新与 Electron 6.0 探索

本里程碑完成将 Electron 4 打包进 VS Code 的探索,这是该 Electron 版本首次随稳定版发布:带来 Chrome 69 与 Node.js 10.11.0(相对此前 Chrome 66 / Node.js 10.2.0 是大幅跃升)。由于 issue #75054,macOS 简单全屏支持("window.nativeFullScreen": false)被临时禁用一版,预计下月初在 Insiders 中修复。Electron 6 的升级探索已经启动,计划尽快推进到 Insiders。

更快的代码加载

Electron 4 带来新的脚本缓存 API,可在不影响首次启动的前提下创建缓存数据并反复覆盖懒解析函数,配合加载器改进使代码加载提速约 15%。

Linux 32 位支持终止

随着 Electron 4.x 的采用,VS Code 不再支持 Linux 32 位。请升级到 64 位版本,设置与扩展均无需迁移、照常工作。

基于 iframe 的 Webview 探索

本迭代探索用普通 iframe 替代 Electron 的<webview>标签实现 webview,主要动机是支持在浏览器中运行 VS Code;<webview>本身复杂且历史上出过问题。目前基于 iframe 的 webview 已能在浏览器中运行大量来自扩展的 webview,仍有大量工作待完成,探索将在下月继续。

值得关注的修复(Notable fixes)

  • 修复热键在编辑器内跳转上下一个错误时把 NVDA 焦点带出编辑器的问题(#41356);
  • 修复Uri#parse可能破坏 path-component 的问题(#45515);
  • 修复步进调试时调试触摸条按钮位置变动的问题(#54084);
  • 修复 Windows 10 1903(ConPTY)下cls命令无法清空终端的问题(#70248);
  • 图片预览只应为图片尺寸绘制"透明"棋盘格背景(#74710);
  • 修复经调试控制台修改变量值后变量窗格不更新的问题(#75359);
  • Git:修复.git位于已打开文件夹之外时文件事件不生效的问题(#41085)。

小结

Visual Studio Code 1.36 是一次覆盖面很广的迭代:工作台侧新增状态栏自定义、树形缩进引导线与拖放复制;终端侧引入跨平台默认 Shell 选择器与inheritEnv干净环境启动;任务系统支持dependsOrder: "sequence"顺序化依赖与fileLocation: "autoDetect"路径检测;调试侧带来 Jump to Cursor、调试控制台换行开关与useWSL弃用迁移路径。对扩展开发者而言,vscode包正式拆分为@types/vscode与vscode-test,配合hideFromUser、DocumentLink.tooltip、评论 reactions 等新稳定 API,以及workspace.fs、resourceRoot、env.shell等提案 API,为后续扩展生态的发展奠定了重要基础。

  • 文档
  • 教程

【免费下载链接】vscode-docs

Public documentation for Visual Studio Code

项目地址:https://gitcode.com/gh_mirrors/vs/vscode-docs
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询