- 文档
- 教程
【免费下载链接】vscode-docs
Public documentation for Visual Studio Code
导读
本指南以 VS Code 官方 UX 指南中的 Settings 章节为核心,讲解扩展作者如何通过contributes.configuration声明点向用户暴露配置项,让扩展设置原生融入 VS Code 的设置编辑器(Settings UI),并配合vscode.workspace.getConfiguration在代码中读取这些配置。读完本文,你将掌握设置项的完整声明语法(类型、枚举、作用域、排序、校验与弃用标记)、configurationDefaults默认值覆盖机制,以及"绝不自建设置页"等一系列可落地的 UX 最佳实践。
一、设置(Settings):扩展与用户之间的配置通道
在 VS Code 的扩展体系里,设置是用户配置扩展行为的标准途径。用户在设置界面中可以见到扩展贡献的各类设置控件,其形态包括:
- 输入框(input box)
- 布尔开关(boolean checkbox)
- 下拉菜单(dropdown / enum)
- 列表(array)
- 键值对(key/value pairs)
只要扩展需要用户进行配置,就可以通过 contributes.configuration 声明点 把设置项注册进 VS Code,用户既可以在设置 UI 中可视化地修改,也可以直接编辑settings.json。扩展代码内则通过设置 ID(setting ID)查询这些配置值。这也正是 extension-capabilities/common-capabilities.md 所总结的扩展能力模式:扩展先用contributes.configuration声明专属设置,再用workspace.getConfigurationAPI 读取它们。
必须做(✔️ Do)
- 为每个设置项提供默认值(
default) - 为每个设置项提供清晰简洁的描述(
description/markdownDescription) - 对复杂的设置项,通过文档链接引导用户进一步了解
- 对相关的设置项,互相建立链接,帮助用户发现邻近配置
- 当需要用户定位某个具体设置时,直接链接到设置 ID(例如
#gitMagic.blame.dateFormat#形式的设置 ID 链接)
不要做(❌ Don't)
- 不要自建设置页或 Webview来模拟设置界面——这会割裂用户对 VS Code 原生设置心智模型的依赖,也失去搜索、校验、同步等内置能力
- 不要写冗长的描述——长文本难以在设置项列表中阅读,复杂背景应放到链接文档中
上图所示示例即通过设置 ID 将界面上的配置项与具体设置链接起来。
二、声明设置:contributes.configuration 详解
contributes.configuration是扩展清单(package.json)中注册设置的入口。用户随后即可在 Settings 编辑器或settings.json中修改这些选项。该声明既可以是一个**单一分类(single category)的配置对象,也可以是多分类(multiple categories)**的对象数组——多分类时,设置编辑器会在该扩展的目录(table of contents)中显示子菜单,并用title字段作为子菜单名称。
2.1 最小可运行示例
参考 contribution-points.md 的 Configuration example,一个典型的声明如下:
{ "contributes": { "configuration": { "title": "Settings Editor Test Extension", "type": "object", "properties": { "settingsEditorTestExtension.booleanExample": { "type": "boolean", "default": true, "description": "Boolean Example" }, "settingsEditorTestExtension.stringExample": { "type": "string", "default": "Hello World", "description": "String Example" } } } } }关键点:
title是该分类在设置 UI 中的标题;properties是一个字典,键是设置 ID,值是描述该设置的元信息;- 扩展代码侧可用
vscode.workspace.getConfiguration('myExtension')读取这些值,其中参数即设置 ID 的前缀段(如上例的settingsEditorTestExtension)。
配置声明不仅决定设置 UI 的呈现方式,还被用来为settings.json的 JSON 编辑提供 IntelliSense 提示——一份声明同时驱动两处体验。
2.2 title:分类标题的命名规范
title是该分类的标题。对拥有多个分类的扩展,若某分类的 title 与扩展显示名相同,设置 UI 会将其视为"默认分类",忽略该分类的order字段并把它的设置直接放在扩展主标题之下。
在title与displayName中,"Extension""Configuration""Settings" 等词是冗余的:
- ✔
"title": "GitMagic" - ❌
"title": "GitMagic Extension" - ❌
"title": "GitMagic Configuration" - ❌
"title": "GitMagic Extension Configuration Settings"
2.3 properties:设置 ID 与显示标题的生成规则
properties中的每个键都是全局唯一的设置 ID。需要注意两条硬性约束:
- 一个扩展可以有多个设置分类,但每个设置必须拥有唯一 ID;
- 一个设置 ID 不能是另一个设置 ID 的完整前缀(否则会造成 ID 歧义)。
设置 UI 中每个设置的显示标题由多个字段拼接而成,键名中的大写字母用于指示单词分界。具体规则分两种场景:
- 单分类 / 默认分类配置:设置 UI 使用设置 ID 与扩展
name字段共同推导显示标题。例如设置 IDgitMagic.blame.dateFormat与扩展名authorName.gitMagic,因 ID 前缀与扩展名后缀匹配,gitMagic部分会在显示标题中被移除,最终显示为 "Blame:Date Format"。 - 多分类配置:当分类 title 与扩展显示名不同时,设置 UI 使用设置 ID 与分类
id字段推导。例如设置 IDcss.completion.completePropertyWithSemicolon与分类 IDcss,前缀匹配后移除css,得到标题 "Completion:Complete Property With Semicolon"。
未显式给出order的属性,在设置 UI 中按**字典序(lexicographical order)**排列,而非按清单中书写的顺序。
三、配置属性 schema:从简单类型到完整约束
配置键使用JSON Schema 的超集定义(参见 contribution-points.md 的 Configuration property schema),因此既可以使用标准校验属性,也可以使用 VS Code 扩展的 UI 相关属性。
3.1 基础类型:number / string / boolean
number、string、boolean类型的设置可以直接在设置 UI 中编辑:
{ "gitMagic.views.pageItemLimit": { "type": "number", "default": 20, "markdownDescription": "Specifies the number of items to show in each page when paginating a view list. Use 0 to specify no limit" }, "gitMagic.blame.compact": { "type": "boolean", "description": "Specifies whether to compact (deduplicate) matching adjacent gutter blame annotations" } }补充细节:
- 字符串设置可通过
"editPresentation": "multilineText"渲染为多行文本输入框; - 布尔设置的
markdownDescription(未指定时回退到description)会作为复选框旁边的标签文案使用。
3.2 description / markdownDescription
description出现在标题之后、输入控件之前;对布尔项则作为复选框标签。若改用markdownDescription,描述内容会在设置 UI 中以 Markdown 解析渲染:
{ "gitMagic.blame.heatMap.enabled": { "description": "Specifies whether to provide a heatmap indicator in the gutter blame annotations" }, "gitMagic.blame.dateFormat": { "markdownDescription": "Specifies how to format absolute dates (e.g. using the `${date}` token) in gutter blame annotations. See the [Moment.js docs](https://momentjs.com/docs/#/displaying/format/) for valid formats" } }使用markdownDescription时,若要换行或分段,应使用\n\n分隔段落,而不是单独使用\n。
3.3 下拉菜单:enum 及其描述
提供enum属性(值为数组)时,设置 UI 会渲染为下拉菜单。与之配套的属性包括:
enumDescriptions:与enum等长的字符串数组,在下拉菜单底部显示每项对应的说明;markdownEnumDescriptions:同enumDescriptions,但按 Markdown 解析,优先级高于enumDescriptions;enumItemLabels:自定义下拉菜单中选项的显示名称。
{ "settingsEditorTestExtension.enumSetting": { "type": "string", "enum": ["first", "second", "third"], "markdownEnumDescriptions": ["The *first* enum", "The *second* enum", "The *third* enum"], "enumItemLabels": ["1st", "2nd", "3rd"], "default": "first", "description": "Example setting with an enum" } }3.4 弃用标记:deprecationMessage / markdownDeprecationMessage
设置deprecationMessage或markdownDeprecationMessage后,设置项会获得带提示文字的下划线警告,并且除非用户已显式配置,否则该设置会从设置 UI 中隐藏。两条属性的渲染分工如下:
deprecationMessage:显示在设置悬停(hover)与问题面板(problems view)中;markdownDeprecationMessage:在设置 UI 中以 Markdown 渲染,但不会出现在设置悬停或问题面板中。
{ "json.colorDecorators.enable": { "type": "boolean", "description": "Enables or disables color decorators", "markdownDeprecationMessage": "**Deprecated**: Please use `#editor.colorDecorators#` instead.", "deprecationMessage": "Deprecated: Please use editor.colorDecorators instead." } }3.5 校验与约束:标准 JSON Schema 属性
以下标准校验属性均可用于约束配置值(详见 contribution-points.md 的 Other JSON Schema properties):
| 属性 | 作用 |
|---|---|
default | 定义设置项的默认值 |
minimum/maximum | 限制数值范围 |
maxLength/minLength | 限制字符串长度 |
pattern | 用正则表达式约束字符串 |
patternErrorMessage | pattern 不匹配时的定制错误信息 |
format | 限制为已知格式,如date、time、ipv4、email、uri |
maxItems/minItems | 限制数组长度 |
editPresentation | 控制字符串设置是渲染为单行输入框还是多行文本域 |
不支持的 JSON Schema 属性:$ref与definition不可用于配置节——配置 schema 必须自包含,不能假设聚合后的全局 settings JSON schema 文档的结构。
3.6 复杂类型:object / array 的可编辑性
部分object与array类型设置可以在设置 UI 中直接编辑:
- 简单数组(元素为
number、string或boolean)渲染为可编辑列表; - 简单对象(属性均为
string、number、integer和/或boolean)渲染为键值可编辑网格;此类对象设置还应设置additionalProperties为false或一个带合适type属性的对象,才能在 UI 中正确渲染。
如果object或array设置还可能包含嵌套对象、数组或null等类型,则无法在设置 UI 中渲染,只能通过直接编辑 JSON 修改——此时用户会看到Edit in settings.json链接入口。
3.7 order:分类与设置的排序控制
分类和分类内的设置都可以用整数order控制相对排序:
- 有
order的分类按数值升序排列在前,未指定的分类排在其后; - 分类内同理:带
order的设置先按数值升序排列,未指定的设置排在其后; - 若两个分类或两个设置的
order值相同,则按字典序升序排列。
四、scope:设置的作用域与生效层级
scope决定设置项在哪些层级可用、是否适用(详见 contribution-points.md 的 scope 小节)。可选值如下:
| scope | 含义 |
|---|---|
application | 应用于 VS Code 所有实例,只能在用户设置中配置 |
machine | 机器特定设置,只能在用户设置或远程设置中配置(如不应跨机器共享的安装路径),值不会同步 |
machine-overridable | 机器特定设置,但可被工作区或文件夹设置覆盖,值不会同步 |
window | 窗口(实例)特定设置,可在用户、工作区或远程设置中配置 |
resource | 资源级设置,作用于文件和文件夹,可在包括文件夹设置在内的所有层级配置 |
language-overridable | 可在语言级别覆盖的资源设置 |
若未声明scope,默认值为window。
内置 Git 扩展给出了三种 scope 的典型组合(参见 contribution-points.md 的示例):
{ "contributes": { "configuration": { "title": "Git", "properties": { "git.alwaysSignOff": { "type": "boolean", "scope": "resource", "default": false, "description": "%config.alwaysSignOff%" }, "git.ignoredRepositories": { "type": "array", "default": [], "scope": "window", "description": "%config.ignoredRepositories%" }, "git.autofetch": { "type": ["boolean", "string"], "enum": [true, false, "all"], "scope": "resource", "markdownDescription": "%config.autofetch%", "default": false, "tags": ["usesOnlineServices"] } } } } }可以看到:git.alwaysSignOff声明为resourcescope,可按用户、工作区或文件夹分别设置;而git.ignoredRepositories为windowscope,对 VS Code 窗口/工作区(可能是多根工作区)整体生效。git.autofetch还演示了联合类型["boolean", "string"]配合enum的使用方式。
ignoreSync:排除设置同步
设置"ignoreSync": true可阻止该设置随用户设置同步,适用于非用户特定(user-specific)的设置。例如remoteTunnelAccess.machineName这类不应同步的设置(见 contribution-points.md 的 ignoreSync 小节):
{ "contributes": { "configuration": { "properties": { "remoteTunnelAccess.machineName": { "type": "string", "default": "", "ignoreSync": true } } } } }注意:若scope已设置为machine或machine-overridable,则无论ignoreSync取值如何,该设置都不会被同步。
五、configurationDefaults:覆盖其他配置的默认值
contributes.configurationDefaults允许扩展为其他已注册配置贡献默认值并覆盖其原有默认值(详见 contribution-points.md 的 configurationDefaults)。
例如把files.autoSave的默认行为改为"焦点变化时自动保存":
"configurationDefaults": { "files.autoSave": "onFocusChange" }还可以按语言贡献默认的编辑器配置。下面这段为markdown语言开启自动换行、并关闭注释/字符串/其他位置的快速建议:
{ "contributes": { "configurationDefaults": { "[markdown]": { "editor.wordWrap": "on", "editor.quickSuggestions": { "comments": "off", "strings": "off", "other": "off" } } } } }六、在扩展代码中读取设置
设置声明之后,扩展运行时代码通过vscode.workspace.getConfiguration读取。getConfiguration接受一个可选段(section)参数,通常是设置 ID 的命名空间前缀:
import * as vscode from 'vscode'; // 读取前缀为 "gitMagic." 的配置段 const config = vscode.workspace.getConfiguration('gitMagic'); // 读取具体设置,可传入默认值兜底 const pageItemLimit = config.get<number>('views.pageItemLimit', 20); const compact = config.get<boolean>('blame.compact', false);配合onDidChangeConfiguration事件,还可以在用户修改设置后实时响应。这也是 common-capabilities.md 中描述的标准扩展能力链路:声明(manifest)→ 读取(API)→ 响应变化(事件)。
七、核心实践清单
把上述规则汇总成一份可直接对照的设计清单:
- 声明优先:所有设置统一通过
contributes.configuration声明,绝不另起炉灶自建设置页或 Webview; - 默认值必备:每个设置给出合理的
default,避免空值导致的运行时异常; - 描述精炼:用一句以内的话说清作用,复杂逻辑放进
markdownDescription的链接文档;布尔项描述即复选框标签,务必言简意赅; - 善用类型控件:单选用
enum+enumItemLabels,多行输入用editPresentation: "multilineText",列表/键值对尽量保持简单结构以获得 UI 内编辑能力; - 显式声明 scope:按实际生效层级选择
resource/window/machine等,不依赖默认值window掩盖设计意图; - 控制排序:用
order明确分类与设置的展示顺序,同名优先级下依赖字典序兜底; - 及时弃用:旧设置用
deprecationMessage/markdownDeprecationMessage引导迁移,并在设置 UI 中自动隐藏; - 同步策略清晰:机器相关或不含用户偏好的设置用
machinescope 或ignoreSync: true排除同步; - 链接引导:复杂设置与相关设置之间互相提供设置 ID 链接(
#namespace.settingName#格式),帮助用户在设置界面间快速跳转; - ID 纪律:设置 ID 全局唯一、命名空间化(
publisher.extensionName.settingName风格),且不得互为完整前缀。
遵循以上实践,你的扩展设置将获得与 VS Code 原生设置一致的可搜索、可校验、可同步、可被 JSON 编辑与 IntelliSense 提示的完整体验,这也是官方 UX 指南中 Settings 章节的核心诉求。
延伸阅读
- contributes.configuration 与 configurationDefaults 完整参考
- 扩展能力总览:设置声明与读取 API
- UX Guidelines 总览:理解容器(Containers)与条目(Items)体系
- 文档
- 教程
【免费下载链接】vscode-docs
Public documentation for Visual Studio Code
相关推荐
Self-hosted LiveSync 声明式设置适配:基于 Obsidian 1.13 设置 API 的架构决策与实践
Self hosted LiveSync 声明式设置适配:基于 Obsidian 1.13 设置 API 的架构决策与实践 导读 本文解读 Self hoste
数据同步NetAlertX 设置系统开发指南:从 config.json 到 Settings UI 的声明式配置最佳实践
NetAlertX 设置系统开发指南:从 config.json 到 Settings UI 的声明式配置最佳实践 导读 本指南面向需要在 NetAlertX
后端网络运维数据可视化Visual Studio Code 扩展 UX 指南:工作台容器、界面元素与设计最佳实践
Visual Studio Code 扩展 UX 指南:工作台容器、界面元素与设计最佳实践 本文基于 VS Code 官方文档仓库的 UX Guidelines
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考