贡献点
贡献点是您在 package.json
扩展清单的 contributes
字段中进行的一组 JSON 声明。您的扩展通过注册贡献点来扩展 Visual Studio Code 中的各种功能。以下是所有可用贡献点的列表:
认证
断点 (breakpoints)
颜色 (colors)
命令
配置 (configuration)
默认配置 (configurationDefaults)
自定义编辑器 (customEditors)
调试器 (debuggers)
语法 (grammars)
图标 (icons)
图标主题 (iconThemes)
JSON 验证 (jsonValidation)
键绑定 (keybindings)
语言
菜单 (menus)
问题匹配器 (problemMatchers)
问题模式 (problemPatterns)
产品图标主题 (productIconThemes)
资源标签格式化程序 (resourceLabelFormatters)
语义令牌修饰符 (semanticTokenModifiers)
语义令牌作用域 (semanticTokenScopes)
语义令牌类型 (semanticTokenTypes)
代码片段 (snippets)
子菜单 (submenus)
任务定义 (taskDefinitions)
终端 (terminal)
主题 (themes)
TypeScript 服务器插件 (typescriptServerPlugins)
视图 (views)
视图容器 (viewsContainers)
视图欢迎页面 (viewsWelcome)
演练 (walkthroughs)
contributes.authentication
贡献身份验证提供程序。这将为您的提供程序设置激活事件,并将其显示在扩展的功能中。
{
"contributes": {
"authentication": [
{
"label": "Azure DevOps",
"id": "azuredevops"
}
]
}
}
contributes.breakpoints
通常,调试器扩展也会有一个 contributes.breakpoints
条目,其中扩展列出了将启用设置断点的语言文件类型。
{
"contributes": {
"breakpoints": [
{
"language": "javascript"
},
{
"language": "javascriptreact"
}
]
}
}
contributes.colors
贡献新的可主题化颜色。这些颜色可以由扩展在编辑器装饰器和状态栏中使用。定义后,用户可以在 workspace.colorCustomization
设置中自定义颜色,用户主题可以设置颜色值。
{
"contributes": {
"colors": [
{
"id": "superstatus.error",
"description": "Color for error message in the status bar.",
"defaults": {
"dark": "errorForeground",
"light": "errorForeground",
"highContrast": "#010203",
"highContrastLight": "#feedc3"
}
}
]
}
}
颜色默认值可以为浅色、深色和高对比度主题定义,并且可以是现有颜色的引用或十六进制颜色值。
扩展可以通过 ThemeColor
API 使用新的和现有的主题颜色。
const errorColor = new vscode.ThemeColor('superstatus.error');
contributes.commands
为命令贡献 UI,包括标题和(可选)图标、类别和启用状态。启用状态通过when 子句表示。默认情况下,命令显示在命令面板(⇧⌘P(Windows, Linux Ctrl+Shift+P))中,但它们也可以显示在其他菜单中。
贡献命令的呈现方式取决于包含的菜单。例如,命令面板会在命令前加上其 category
,以便于分组。然而,命令面板不显示图标,也不显示已禁用的命令。另一方面,编辑器上下文菜单显示已禁用的项目,但不显示类别标签。
注意: 当命令被调用时(通过键绑定、命令面板、任何其他菜单或以编程方式),VS Code 将发出一个激活事件
onCommand:${command}
。
注意: 使用产品图标中的图标时,设置
light
和dark
将禁用图标。正确的语法是"icon": "$(book)"
。
命令示例
{
"contributes": {
"commands": [
{
"command": "extension.sayHello",
"title": "Hello World",
"category": "Hello",
"icon": {
"light": "path/to/light/icon.svg",
"dark": "path/to/dark/icon.svg"
}
}
]
}
}
请参阅命令扩展指南,了解如何在 VS Code 扩展中使用命令的更多信息。
命令图标规范
大小:
图标应为 16x16,带 1 像素内边距(图像为 14x14),并居中。颜色:
图标应使用单一颜色。格式:
建议图标为 SVG 格式,但也接受任何图像文件类型。
contributes.configuration
贡献将暴露给用户的设置。用户可以在设置编辑器中设置这些配置选项,或通过直接编辑 settings.json 文件来设置。
此部分可以是一个表示单个设置类别的对象,也可以是一个表示多个设置类别的对象数组。如果存在多个设置类别,设置编辑器将在该扩展的目录表中显示一个子菜单,并且标题键将用于子菜单条目名称。
配置示例
{
"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"
}
}
}
}
}
您可以使用 vscode.workspace.getConfiguration('myExtension')
从扩展中读取这些值。
配置架构
您的配置条目既用于在 JSON 编辑器中编辑设置时提供智能感知,也用于定义它们在设置 UI 中的显示方式。
标题 (title)
类别的 title
1️⃣️ 是该类别使用的标题。
{
"configuration": {
"title": "GitMagic"
}
}
对于具有多个设置类别的扩展,如果其中一个类别的标题与扩展的显示名称相同,则设置 UI 会将该类别视为“默认类别”,忽略该类别的 order
字段,并将其设置放在主扩展标题下方。
对于 title
和 displayName
字段,像“Extension”、“Configuration”和“Settings”这样的词是多余的。
- ✔
"title": "GitMagic"
- ❌
"title": "GitMagic Extension"
- ❌
"title": "GitMagic Configuration"
- ❌
"title": "GitMagic Extension Configuration Settings"
属性 (properties)
configuration
对象中的 properties
2️⃣ 将构成一个字典,其中键是设置 ID,值提供有关设置的更多信息。尽管一个扩展可以包含多个设置类别,但扩展的每个设置仍然必须具有其自己的唯一 ID。设置 ID 不能是另一个设置 ID 的完整前缀。
没有显式 order
字段的属性将按字典顺序显示在设置 UI 中(不是它们在清单中列出的顺序)。
设置标题
在设置 UI 中,将使用多个字段为每个设置构建显示标题。键中的大写字母用于指示单词分隔符。
单类别和默认类别配置的显示标题
如果配置只有一个设置类别,或者如果该类别与扩展的显示名称具有相同的标题,则对于该类别内的设置,设置 UI 将使用设置 ID 和扩展 name
字段来确定显示标题。
例如,对于设置 ID gitMagic.blame.dateFormat
和扩展名 authorName.gitMagic
,由于设置 ID 的前缀与扩展名的后缀匹配,因此设置 ID 中的 gitMagic
部分将在显示标题中删除:“Blame: Date Format”。
多类别配置的显示标题
如果配置有多个设置类别,且类别标题与扩展显示名称不同,则对于该类别内的设置,设置 UI 将使用设置 ID 和类别 id
字段来确定显示标题。
例如,对于设置 ID css.completion.completePropertyWithSemicolon
和类别 ID css
,由于设置 ID 的前缀与类别 ID 的后缀匹配,css
部分将在设置 UI 中从设置 ID 中删除,生成的设置标题将是“Completion: Complete Property With Semicolon”。
配置属性架构
配置键使用 JSON Schema 的超集进行定义。
description / markdownDescription
您的 description
3️⃣ 出现在标题之后和输入字段之前,除了布尔值,其描述用作复选框的标签。6️⃣
{
"gitMagic.blame.heatMap.enabled": {
"description": "Specifies whether to provide a heatmap indicator in the gutter blame annotations"
}
}
如果您使用 markdownDescription
而不是 description
,您的设置描述将在设置 UI 中被解析为 Markdown。
{
"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://moment.js.cn/docs/#/displaying/format/) for valid formats"
}
}
对于 markdownDescription
,为了添加新行或多个段落,请使用字符串 \n\n
来分隔段落,而不是仅仅使用 \n
。
type
number
4️⃣、string
5️⃣、boolean
6️⃣ 类型的条目可以直接在设置 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"
}
}
如果字符串设置在配置条目上设置了 "editPresentation": "multilineText"
,则可以使用多行文本输入框呈现。
对于 boolean
条目,markdownDescription
(如果未指定 markdownDescription
则为 description
)将用作复选框旁边的标签。
{
"gitMagic.blame.compact": {
"type": "boolean",
"description": "Specifies whether to compact (deduplicate) matching adjacent gutter blame annotations"
}
}
某些 object
和 array
类型设置将在设置 UI 中呈现。简单的 number
、string
或 boolean
数组将呈现为可编辑列表。具有 string
、number
、integer
和/或 boolean
类型属性的对象将呈现为可编辑的键值网格。对象设置还应将 additionalProperties
设置为 false
或具有适当 type
属性的对象,以便在 UI 中呈现。
如果 object
或 array
类型设置还包含其他类型,如嵌套对象、数组或 null,则该值将不会在设置 UI 中呈现,并且只能通过直接编辑 JSON 进行修改。用户将看到一个“在 settings.json 中编辑”链接,如上图所示。8️⃣
order
类别和这些类别中的设置都可以采用整数 order
类型属性,这提供了它们相对于其他类别和/或设置应该如何排序的参考。
如果两个类别具有 order
属性,则顺序号较低的类别排在前面。如果类别未给定 order
属性,则它出现在已给定该属性的类别之后。
如果同一类别中的两个设置具有 order
属性,则顺序号较低的设置排在前面。如果同一类别中的另一个设置未给定 order
属性,则它将出现在该类别中已给定该属性的设置之后。
如果两个类别具有相同的 order
属性值,或者同一类别中的两个设置具有相同的 order
属性值,则它们将在设置 UI 中按字典顺序递增排序。
enum / enumDescriptions / markdownEnumDescriptions / enumItemLabels
如果您在 enum
7️⃣ 属性下提供项目数组,设置 UI 将呈现这些项目的下拉菜单。
您还可以提供 enumDescriptions
属性,这是一个与 enum
属性长度相同的字符串数组。enumDescriptions
属性在设置 UI 中提供下拉菜单底部与每个 enum
项目对应的描述。
您还可以使用 markdownEnumDescriptions
代替 enumDescriptions
,并且您的描述将作为 Markdown 进行解析。markdownEnumDescriptions
优先于 enumDescriptions
。
要自定义设置 UI 中的下拉选项名称,您可以使用 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"
}
}
deprecationMessage / markdownDeprecationMessage
如果您设置了 deprecationMessage
或 markdownDeprecationMessage
,则该设置将带有指定消息的警告下划线。此外,该设置将从设置 UI 中隐藏,除非用户对其进行了配置。如果您设置了 markdownDeprecationMessage
,则 Markdown 不会在设置悬停或问题视图中呈现。如果您同时设置了这两个属性,则 deprecationMessage
将显示在悬停和问题视图中,而 markdownDeprecationMessage
将以 Markdown 形式呈现在设置 UI 中。
示例
{
"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."
}
}
其他 JSON 模式属性
您可以使用任何验证 JSON 模式属性来描述配置值的其他约束
default
用于定义属性的默认值minimum
和maximum
用于限制数值maxLength
、minLength
用于限制字符串长度pattern
用于限制字符串符合给定正则表达式patternErrorMessage
用于在模式不匹配时提供定制的错误消息。format
用于限制字符串符合已知格式,例如date
、time
、ipv4
、email
和uri
maxItems
、minItems
用于限制数组长度editPresentation
用于控制在设置编辑器中为字符串设置呈现单行输入框还是多行文本区域
不支持的 JSON 模式属性
配置部分不支持以下内容:
$ref
和definition
:配置架构需要自包含,不能对聚合的设置 JSON 架构文档的外观做出假设。
有关这些和其他功能的更多详细信息,请参阅 JSON Schema 参考。
scope
配置设置可以具有以下可能的作用域之一
application
- 适用于所有 VS Code 实例的设置,只能在用户设置中配置。machine
- 机器特定的设置,只能在用户设置或远程设置中设置。例如,不应在机器之间共享的安装路径。这些设置的值将不会同步。machine-overridable
- 机器特定的设置,可以被工作区或文件夹设置覆盖。这些设置的值将不会同步。window
- 窗口(实例)特定的设置,可以在用户、工作区或远程设置中配置。resource
- 资源设置,适用于文件和文件夹,可以在所有设置级别(甚至文件夹设置)中配置。language-overridable
- 可以在语言级别覆盖的资源设置。
配置范围决定了用户何时可以通过设置编辑器访问设置,以及设置是否适用。如果未声明 scope
,则默认为 window
。
以下是内置 Git 扩展的示例配置范围
{
"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
具有 resource
范围,可以按用户、工作区或文件夹设置,而具有 window
范围的忽略的仓库列表更全局地适用于 VS Code 窗口或工作区(可能是多根)。
ignoreSync
您可以将 ignoreSync
设置为 true
,以防止该设置与用户的设置同步。这对于非用户特定的设置很有用。例如,remoteTunnelAccess.machineName
设置并非用户特定,不应同步。请注意,如果您已将 scope
设置为 machine
或 machine-overridable
,则无论 ignoreSync
的值如何,该设置都不会同步。
{
"contributes": {
"configuration": {
"properties": {
"remoteTunnelAccess.machineName": {
"type": "string",
"default": "",
"ignoreSync": true
}
}
}
}
}
```json
{
"remoteTunnelAccess.machineName": {
"type": "string",
"default": '',
"ignoreSync": true
}
}
链接到设置
您可以通过在 Markdown 类型属性中使用此特殊语法 `#target.setting.id#`
插入指向另一个设置的链接,该链接将在设置 UI 中呈现为可单击链接。这适用于 markdownDescription
、markdownEnumDescriptions
和 markdownDeprecationMessage
。示例:
"files.autoSaveDelay": {
"markdownDescription": "Controls the delay in ms after which a dirty editor is saved automatically. Only applies when `#files.autoSave#` is set to `afterDelay`.",
// ...
}
在设置 UI 中,这会呈现为
contributes.configurationDefaults
贡献其他已注册配置的默认值并覆盖其默认值。
以下示例覆盖了 files.autoSave
设置的默认行为,以在焦点更改时自动保存文件。
"configurationDefaults": {
"files.autoSave": "onFocusChange"
}
您还可以为提供的语言贡献默认编辑器配置。例如,以下代码片段为 markdown
语言贡献了默认编辑器配置
{
"contributes": {
"configurationDefaults": {
"[markdown]": {
"editor.wordWrap": "on",
"editor.quickSuggestions": {
"comments": "off",
"strings": "off",
"other": "off"
}
}
}
}
}
contributes.customEditors
customEditors
贡献点是您的扩展如何告知 VS Code 它提供的自定义编辑器。例如,VS Code 需要知道您的自定义编辑器适用于哪些文件类型,以及如何在任何 UI 中识别您的自定义编辑器。
以下是自定义编辑器扩展示例的基本 customEditor
贡献
"contributes": {
"customEditors": [
{
"viewType": "catEdit.catScratch",
"displayName": "Cat Scratch",
"selector": [
{
"filenamePattern": "*.cscratch"
}
],
"priority": "default"
}
]
}
customEditors
是一个数组,因此您的扩展可以贡献多个自定义编辑器。
-
viewType
- 自定义编辑器的唯一标识符。这是 VS Code 如何将
package.json
中的自定义编辑器贡献与代码中的自定义编辑器实现关联起来。这在所有扩展中必须是唯一的,因此不要使用通用的viewType
,例如"preview"
,请确保使用对您的扩展唯一的名称,例如"viewType": "myAmazingExtension.svgPreview"
。 -
displayName
- 在 VS Code UI 中标识自定义编辑器的名称。显示名称显示在 VS Code UI 中,例如“视图:重新打开方式”下拉菜单中。
-
selector
- 指定自定义编辑器适用于哪些文件。selector
是一个或多个全局模式的数组。这些全局模式与文件名匹配,以确定自定义编辑器是否可用于它们。filenamePattern
,例如*.png
,将为所有 PNG 文件启用自定义编辑器。您还可以创建更具体的模式,匹配文件或目录名称,例如
**/translations/*.json
。 -
priority
-(可选)指定何时使用自定义编辑器。priority
控制在打开资源时何时使用自定义编辑器。可能的值是"default"
- 尝试为与自定义编辑器的selector
匹配的每个文件使用自定义编辑器。如果给定文件有多个自定义编辑器,用户将需要选择他们要使用的自定义编辑器。"option"
- 默认情况下不使用自定义编辑器,但允许用户切换到它或将其配置为默认编辑器。
您可以在自定义编辑器扩展指南中了解更多信息。
contributes.debuggers
向 VS Code 贡献调试器。调试器贡献具有以下属性:
type
是一个唯一的 ID,用于在启动配置中标识此调试器。label
是此调试器在 UI 中用户可见的名称。program
是调试适配器的路径,该适配器针对实际调试器或运行时实现 VS Code 调试协议。runtime
如果调试适配器的路径不是可执行文件但需要运行时。configurationAttributes
是此调试器特有的启动配置参数的模式。请注意,不支持 JSON 模式构造$ref
和definition
。initialConfigurations
列出了用于填充初始 launch.json 的启动配置。configurationSnippets
列出了在编辑 launch.json 时可通过智能感知获得的启动配置。variables
引入了替换变量并将它们绑定到调试器扩展实现的命令。languages
调试扩展可能被认为是“默认调试器”的那些语言。
调试器示例
{
"contributes": {
"debuggers": [
{
"type": "node",
"label": "Node Debug",
"program": "./out/node/nodeDebug.js",
"runtime": "node",
"languages": ["javascript", "typescript", "javascriptreact", "typescriptreact"],
"configurationAttributes": {
"launch": {
"required": ["program"],
"properties": {
"program": {
"type": "string",
"description": "The program to debug."
}
}
}
},
"initialConfigurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${workspaceFolder}/app.js"
}
],
"configurationSnippets": [
{
"label": "Node.js: Attach Configuration",
"description": "A new configuration for attaching to a running node program.",
"body": {
"type": "node",
"request": "attach",
"name": "${2:Attach to Port}",
"port": 9229
}
}
],
"variables": {
"PickProcess": "extension.node-debug.pickNodeProcess"
}
}
]
}
}
有关如何集成 debugger
的完整演练,请参阅调试器扩展。
contributes.grammars
为语言贡献 TextMate 语法。您必须提供此语法适用的 language
、语法的 TextMate scopeName
和文件路径。
注意: 包含语法的文件可以是 JSON 格式(文件名以 .json 结尾)或 XML plist 格式(所有其他文件)。
语法示例
{
"contributes": {
"grammars": [
{
"language": "markdown",
"scopeName": "text.html.markdown",
"path": "./syntaxes/markdown.tmLanguage.json",
"embeddedLanguages": {
"meta.embedded.block.frontmatter": "yaml"
}
}
]
}
}
请参阅语法高亮指南,了解如何注册与语言关联的 TextMate 语法以实现语法高亮。
contributes.icons
通过 ID 贡献一个新图标,以及一个默认图标。然后,该图标 ID 可以由扩展(或依赖于该扩展的任何其他扩展)在任何可以使用 ThemeIcon
的地方使用 new ThemeIcon("iconId")
,在Markdown 字符串中($(iconId)
),以及作为某些贡献点中的图标使用。
{
"contributes": {
"icons": {
"distro-ubuntu": {
"description": "Ubuntu icon",
"default": {
"fontPath": "./distroicons.woff",
"fontCharacter": "\\E001"
}
},
"distro-fedora": {
"description": "Ubuntu icon",
"default": {
"fontPath": "./distroicons.woff",
"fontCharacter": "\\E002"
}
}
}
}
}
contributes.iconThemes
向 VS Code 贡献文件图标主题。文件图标显示在文件名旁边,指示文件类型。
您必须指定一个 id(在设置中使用)、一个标签和文件图标定义文件的路径。
文件图标主题示例
{
"contributes": {
"iconThemes": [
{
"id": "my-cool-file-icons",
"label": "Cool File Icons",
"path": "./fileicons/cool-file-icon-theme.json"
}
]
}
}
请参阅文件图标主题指南,了解如何创建文件图标主题。
contributes.jsonValidation
为特定类型的 json
文件贡献验证模式。url
值可以是扩展中包含的模式文件的本地路径,也可以是远程服务器 URL,例如 json 模式存储。
{
"contributes": {
"jsonValidation": [
{
"fileMatch": ".jshintrc",
"url": "https://json.schemastore.org/jshintrc"
}
]
}
}
contributes.keybindings
贡献一个键绑定规则,定义当用户按下键组合时应调用哪个命令。请参阅键绑定主题,其中详细解释了键绑定。
贡献键绑定将使“默认键盘快捷方式”显示您的规则,并且命令的每个 UI 表示现在都将显示您添加的键绑定。当然,当用户按下键组合时,命令将被调用。
注意: 因为 VS Code 在 Windows、macOS 和 Linux 上运行,这些平台上的修饰符不同,您可以使用“key”设置默认键组合,并用特定平台覆盖它。
注意: 当命令被调用时(通过键绑定或命令面板),VS Code 将发出一个激活事件
onCommand:${command}
。
键绑定示例
定义 Windows 和 Linux 下的 Ctrl+F1 以及 macOS 下的 Cmd+F1 触发 "extension.sayHello"
命令
{
"contributes": {
"keybindings": [
{
"command": "extension.sayHello",
"key": "ctrl+f1",
"mac": "cmd+f1",
"when": "editorTextFocus"
}
]
}
}
contributes.languages
贡献编程语言的定义。这将引入一种新语言或丰富 VS Code 对某种语言的认知。
contributes.languages
的主要作用是
- 定义一个
languageId
,可以在 VS Code API 的其他部分(例如vscode.TextDocument.languageId
和onLanguage
激活事件)中重复使用。- 您可以使用
aliases
字段贡献一个人类可读的名称。列表中的第一个项目将用作人类可读的标签。
- 您可以使用
- 将文件扩展名 (
extensions
)、文件名 (filenames
)、文件名全局模式 (filenamePatterns
)、以特定行(例如 hashbang)开头的文件 (firstLine
) 和mimetypes
与该languageId
关联。 - 为贡献的语言贡献一组声明性语言功能。在语言配置指南中了解有关可配置编辑功能的更多信息。
- 贡献一个图标,如果主题不包含该语言的图标,则该图标可在文件图标主题中使用
语言示例
{
"contributes": {
"languages": [
{
"id": "python",
"extensions": [".py"],
"aliases": ["Python", "py"],
"filenames": [],
"firstLine": "^#!/.*\\bpython[0-9.-]*\\b",
"configuration": "./language-configuration.json",
"icon": {
"light": "./icons/python-light.png",
"dark": "./icons/python-dark.png"
}
}
]
}
}
contributes.menus
向编辑器或资源管理器贡献一个命令菜单项。菜单项定义包含选中时应调用的命令以及项目应显示的条件。后者由 when
子句定义,它使用键绑定when 子句上下文。
command
属性指示选择菜单项时要运行的命令。submenu
属性指示在此位置呈现哪个子菜单。
声明 command
菜单项时,还可以使用 alt
属性定义替代命令。在打开菜单时按 Alt 键时,它将显示并调用。在 Windows 和 Linux 上,Shift 键也有此作用,这在 Alt 键会触发窗口菜单栏的情况下很有用。
最后,group
属性定义菜单项的排序和分组。navigation
组很特殊,因为它将始终排序到菜单的顶部/开头。
请注意,
when
子句适用于菜单,而enablement
子句适用于命令。enablement
适用于所有菜单甚至键绑定,而when
仅适用于单个菜单。
目前,扩展作者可以贡献到
commandPalette
- 全局命令面板comments/comment/title
- 注释标题菜单栏comments/comment/context
- 注释上下文菜单comments/commentThread/title
- 注释线程标题菜单栏comments/commentThread/context
- 注释线程上下文菜单debug/callstack/context
- 调试调用堆栈视图上下文菜单debug/callstack/context
组inline
- 调试调用堆栈视图内联操作debug/toolBar
- 调试视图工具栏debug/variables/context
- 调试变量视图上下文菜单editor/context
- 编辑器上下文菜单editor/lineNumber/context
- 编辑器行号上下文菜单editor/title
- 编辑器标题菜单栏editor/title/context
- 编辑器标题上下文菜单editor/title/run
- 编辑器标题菜单栏上的运行子菜单explorer/context
- 资源管理器视图上下文菜单extension/context
- 扩展视图上下文菜单file/newFile
- 文件菜单和欢迎页面中的新建文件项interactive/toolbar
- 交互式窗口工具栏interactive/cell/title
- 交互式窗口单元格标题菜单栏notebook/toolbar
- 笔记本工具栏notebook/cell/title
- 笔记本单元格标题菜单栏notebook/cell/execute
- 笔记本单元格执行菜单scm/title
- SCM 标题菜单scm/resourceGroup/context
- SCM 资源组菜单scm/resourceFolder/context
- SCM 资源文件夹菜单scm/resourceState/context
- SCM 资源菜单scm/change/title
- SCM 更改标题菜单scm/sourceControl
- SCM 源代码控制菜单terminal/context
- 终端上下文菜单terminal/title/context
- 终端标题上下文菜单testing/item/context
- 测试资源管理器项目上下文菜单testing/item/gutter
- 测试项目装订线装饰的菜单timeline/title
- 时间线视图标题菜单栏timeline/item/context
- 时间线视图项目上下文菜单touchBar
- macOS Touch Barview/title
- 视图标题菜单view/item/context
- 视图项目上下文菜单webview/context
- 任何webview上下文菜单- 任何贡献的子菜单
注意 1: 当从(上下文)菜单调用命令时,VS Code 会尝试推断当前选定的资源,并在调用命令时将其作为参数传递。例如,资源管理器内的菜单项会传递选定资源的 URI,编辑器内的菜单项会传递文档的 URI。
注意 2: 贡献到
editor/lineNumber/context
的菜单项的命令也会传递行号。此外,这些项目可以在其when
子句中引用editorLineNumber
上下文键,例如通过使用in
或not in
运算符将其与扩展管理的数组值上下文键进行测试。
除了标题之外,贡献的命令还可以指定 VS Code 在调用菜单项作为按钮(例如在标题菜单栏上)时将显示的图标。
菜单示例
这是一个命令菜单项
{
"contributes": {
"menus": {
"editor/title": [
{
"when": "resourceLangId == markdown",
"command": "markdown.showPreview",
"alt": "markdown.showPreviewToSide",
"group": "navigation"
}
]
}
}
}
同样,这是一个添加到特定视图的命令菜单项。以下示例贡献到任意视图,例如终端
{
"contributes": {
"menus": {
"view/title": [
{
"command": "terminalApi.sendText",
"when": "view == terminal",
"group": "navigation"
}
]
}
}
}
这是一个子菜单菜单项
{
"contributes": {
"menus": {
"scm/title": [
{
"submenu": "git.commit",
"group": "2_main@1",
"when": "scmProvider == git"
}
]
}
}
}
命令面板菜单项的上下文特定可见性
在 package.json
中注册命令时,它们将自动显示在命令面板 (⇧⌘P (Windows, Linux Ctrl+Shift+P)) 中。为了更好地控制命令的可见性,可以使用 commandPalette
菜单项。它允许您定义一个 when
条件来控制命令是否应在命令面板中可见。
以下代码片段使“Hello World”命令仅在编辑器中选中某些内容时在命令面板中可见
{
"commands": [
{
"command": "extension.sayHello",
"title": "Hello World"
}
],
"menus": {
"commandPalette": [
{
"command": "extension.sayHello",
"when": "editorHasSelection"
}
]
}
}
组排序
菜单项可以分组。它们按字典顺序排序,并遵循以下默认值/规则。您可以在这些组中添加菜单项,或在它们之间、下方或上方添加新的菜单项组。
编辑器上下文菜单具有这些默认组
navigation
- 在所有情况下,navigation
组都排在最前面。1_modification
- 此组接下来,包含修改代码的命令。9_cutcopypaste
- 倒数第二个默认组,包含基本编辑命令。z_commands
- 最后一个默认组,包含打开命令面板的入口。
资源管理器上下文菜单具有这些默认组
navigation
- 与 VS Code 中的导航相关的命令。此组在所有情况下都排在最前面。2_workspace
- 与工作区操作相关的命令。3_compare
- 与在差异编辑器中比较文件相关的命令。4_search
- 与在搜索视图中搜索相关的命令。5_cutcopypaste
- 与文件的剪切、复制和粘贴相关的命令。6_copypath
- 与复制文件路径相关的命令。7_modification
- 与文件修改相关的命令。
编辑器标签上下文菜单具有这些默认组
1_close
- 与关闭编辑器相关的命令。3_preview
- 与固定编辑器相关的命令。
编辑器标题菜单具有这些默认组
navigation
- 与导航相关的命令。1_run
- 与运行和调试编辑器相关的命令。1_diff
- 与使用差异编辑器相关的命令。3_open
- 与打开编辑器相关的命令。5_close
- 与关闭编辑器相关的命令。
navigation
和 1_run
显示在主编辑器标题区域。其他组显示在辅助区域 - ...
菜单下方。
终端标签上下文菜单具有这些默认组
1_create
- 与创建终端相关的命令。3_run
- 与在终端中运行/执行某些内容相关的命令。5_manage
- 与管理终端相关的命令。7_configure
- 与终端配置相关的命令。
终端上下文菜单具有这些默认组
1_create
- 与创建终端相关的命令。3_edit
- 与操作文本、选择或剪贴板相关的命令。5_clear
- 与清除终端相关的命令。7_kill
- 与关闭/终止终端相关的命令。9_config
- 与终端配置相关的命令。
时间线视图项目上下文菜单具有这些默认组
inline
- 重要或常用时间线项目命令。呈现为工具栏。1_actions
- 与时间线项目操作相关的命令。5_copy
- 与复制时间线项目信息相关的命令。
扩展视图上下文菜单具有这些默认组
1_copy
- 与复制扩展信息相关的命令。2_configure
- 与配置扩展相关的命令。
组内排序
组内的顺序取决于标题或 order 属性。菜单项的组内局部顺序通过在组标识符后附加 @<number>
指定,如下所示
{
"editor/title": [
{
"when": "editorHasSelection",
"command": "extension.Command",
"group": "myGroup@1"
}
]
}
contributes.problemMatchers
贡献问题匹配器模式。这些贡献在输出面板运行器和终端运行器中都有效。下面是一个示例,用于在扩展中贡献用于 gcc 编译器的错误匹配器
{
"contributes": {
"problemMatchers": [
{
"name": "gcc",
"owner": "cpp",
"fileLocation": ["relative", "${workspaceFolder}"],
"pattern": {
"regexp": "^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$",
"file": 1,
"line": 2,
"column": 3,
"severity": 4,
"message": 5
}
}
]
}
}
此问题匹配器现在可以通过名称引用 $gcc
在 tasks.json
文件中使用。例如:
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "gcc",
"args": ["-Wall", "helloWorld.c", "-o", "helloWorld"],
"problemMatcher": "$gcc"
}
]
}
另请参阅:定义问题匹配器
contributes.problemPatterns
贡献可在问题匹配器(见上文)中使用的命名问题模式。
contributes.productIconThemes
为 VS Code 贡献产品图标主题。产品图标是 VS Code 中使用的所有图标,除了文件图标和扩展贡献的图标。
您必须指定一个 id(在设置中使用)、一个标签和图标定义文件的路径。
产品图标主题示例
{
"contributes": {
"productIconThemes": [
{
"id": "elegant",
"label": "Elegant Icon Theme",
"path": "./producticons/elegant-product-icon-theme.json"
}
]
}
}
请参阅产品图标主题指南,了解如何创建产品图标主题。
contributes.resourceLabelFormatters
贡献资源标签格式化程序,指定如何在工作台中的所有位置显示 URI。例如,扩展可以这样贡献一个用于 scheme remotehub
的 URI 格式化程序
{
"contributes": {
"resourceLabelFormatters": [
{
"scheme": "remotehub",
"formatting": {
"label": "${path}",
"separator": "/",
"workspaceSuffix": "GitHub"
}
}
]
}
}
这意味着所有 scheme 为 remotehub
的 URI 将仅显示 URI 的 path
部分,并且分隔符将为 /
。具有 remotehub
URI 的工作区将在其标签中包含 GitHub 后缀。
contributes.semanticTokenModifiers
贡献新的语义令牌修饰符,可以通过主题规则进行高亮显示。
{
"contributes": {
"semanticTokenModifiers": [
{
"id": "native",
"description": "Annotates a symbol that is implemented natively"
}
]
}
}
请参阅语义高亮指南,了解有关语义高亮的更多信息。
contributes.semanticTokenScopes
贡献语义令牌类型和修饰符与作用域之间的映射,作为回退或支持特定语言主题。
{
"contributes": {
"semanticTokenScopes": [
{
"language": "typescript",
"scopes": {
"property.readonly": ["variable.other.constant.property.ts"]
}
}
]
}
}
请参阅语义高亮指南,了解有关语义高亮的更多信息。
contributes.semanticTokenTypes
贡献新的语义令牌类型,可以通过主题规则进行高亮显示。
{
"contributes": {
"semanticTokenTypes": [
{
"id": "templateType",
"superType": "type",
"description": "A template type."
}
]
}
}
请参阅语义高亮指南,了解有关语义高亮的更多信息。
contributes.snippets
为特定语言贡献代码片段。language
属性是语言标识符,path
是代码片段文件的相对路径,该文件以 VS Code 代码片段格式定义代码片段。
以下示例展示了为 Go 语言添加代码片段。
{
"contributes": {
"snippets": [
{
"language": "go",
"path": "./snippets/go.json"
}
]
}
}
contributes.submenus
贡献一个子菜单作为占位符,菜单项可以贡献到其中。子菜单需要一个 label
才能在父菜单中显示。
除了标题之外,命令还可以定义 VS Code 将在编辑器标题菜单栏中显示的图标。
子菜单示例
{
"contributes": {
"submenus": [
{
"id": "git.commit",
"label": "Commit"
}
]
}
}
contributes.taskDefinitions
贡献并定义一个对象字面量结构,允许唯一标识系统中贡献的任务。任务定义至少具有一个 type
属性,但通常定义额外的属性。例如,表示 package.json 文件中脚本的任务的任务定义如下所示
{
"taskDefinitions": [
{
"type": "npm",
"required": ["script"],
"properties": {
"script": {
"type": "string",
"description": "The script to execute"
},
"path": {
"type": "string",
"description": "The path to the package.json file. If omitted the package.json in the root of the workspace folder is used."
}
}
}
]
}
任务定义使用 JSON 模式语法定义 required
和 properties
属性。type
属性定义任务类型。如果上面的示例
"type": "npm"
将任务定义与 npm 任务关联"required": [ "script" ]
将script
属性定义为强制性。path
属性是可选的。"properties" : { ... }
定义附加属性及其类型。
当扩展实际创建任务时,它需要传递符合 package.json 文件中贡献的任务定义的 TaskDefinition
。对于 npm
示例,在 package.json 文件中为测试脚本创建任务如下所示
let task = new vscode.Task({ type: 'npm', script: 'test' }, ....);
contributes.terminal
为 VS Code 贡献终端配置文件,允许扩展处理配置文件的创建。定义后,配置文件应在创建终端配置文件时出现
{
"activationEvents": ["onTerminalProfile:my-ext.terminal-profile"],
"contributes": {
"terminal": {
"profiles": [
{
"title": "Profile from extension",
"id": "my-ext.terminal-profile"
}
]
}
}
}
定义后,配置文件将显示在终端配置文件选择器中。激活后,通过返回终端选项来处理配置文件的创建。
vscode.window.registerTerminalProfileProvider('my-ext.terminal-profile', {
provideTerminalProfile(
token: vscode.CancellationToken
): vscode.ProviderResult<vscode.TerminalOptions | vscode.ExtensionTerminalOptions> {
return { name: 'Profile from extension', shellPath: 'bash' };
}
});
contributes.themes
为 VS Code 贡献颜色主题,定义工作台颜色和编辑器中语法令牌的样式。
您必须指定一个标签、主题是深色主题还是浅色主题(以便 VS Code 的其余部分随主题而变化)以及文件路径 (JSON 格式)。
主题示例
{
"contributes": {
"themes": [
{
"label": "Monokai",
"uiTheme": "vs-dark",
"path": "./themes/monokai-color-theme.json"
}
]
}
}
请参阅颜色主题指南,了解如何创建颜色主题。
contributes.typescriptServerPlugins
贡献 TypeScript 服务器插件,以增强 VS Code 的 JavaScript 和 TypeScript 支持
{
"contributes": {
"typescriptServerPlugins": [
{
"name": "typescript-styled-plugin"
}
]
}
}
上述示例扩展贡献了 typescript-styled-plugin
,它为 JavaScript 和 TypeScript 添加了 styled-component IntelliSense。此插件将从扩展中加载,并且必须作为正常的 NPM dependency
安装在扩展中
{
"dependencies": {
"typescript-styled-plugin": "*"
}
}
当用户使用 VS Code 版本的 TypeScript 时,TypeScript 服务器插件将为所有 JavaScript 和 TypeScript 文件加载。如果用户使用工作区版本的 TypeScript,除非插件明确设置 "enableForWorkspaceTypeScriptVersions": true
,否则它们不会被激活。
{
"contributes": {
"typescriptServerPlugins": [
{
"name": "typescript-styled-plugin",
"enableForWorkspaceTypeScriptVersions": true
}
]
}
}
插件配置
扩展可以通过 VS Code 内置的 TypeScript 扩展提供的 API 向贡献的 TypeScript 插件发送配置数据
// In your VS Code extension
export async function activate(context: vscode.ExtensionContext) {
// Get the TS extension
const tsExtension = vscode.extensions.getExtension('vscode.typescript-language-features');
if (!tsExtension) {
return;
}
await tsExtension.activate();
// Get the API from the TS extension
if (!tsExtension.exports || !tsExtension.exports.getAPI) {
return;
}
const api = tsExtension.exports.getAPI(0);
if (!api) {
return;
}
// Configure the 'my-typescript-plugin-id' plugin
api.configurePlugin('my-typescript-plugin-id', {
someValue: process.env['SOME_VALUE']
});
}
TypeScript 服务器插件通过 onConfigurationChanged
方法接收配置数据
// In your TypeScript plugin
import * as ts_module from 'typescript/lib/tsserverlibrary';
export = function init({ typescript }: { typescript: typeof ts_module }) {
return {
create(info: ts.server.PluginCreateInfo) {
// Create new language service
},
onConfigurationChanged(config: any) {
// Receive configuration changes sent from VS Code
}
};
};
此 API 允许 VS Code 扩展将 VS Code 设置与 TypeScript 服务器插件同步,或动态更改插件的行为。请参阅 TypeScript TSLint 插件和 lit-html 扩展,了解此 API 在实践中如何使用。
contributes.views
为 VS Code 贡献一个视图。您必须为视图指定一个标识符和名称。您可以贡献到以下视图容器中
explorer
:活动栏中的资源管理器视图容器scm
:活动栏中的源代码控制管理 (SCM) 视图容器debug
:活动栏中的运行和调试视图容器test
:活动栏中的测试视图容器- 自定义视图容器,由扩展贡献。
当用户打开视图时,VS Code 将发出一个激活事件 onView:${viewId}
(对于下面的示例,为 onView:nodeDependencies
)。您还可以通过提供 when
上下文值来控制视图的可见性。指定的 icon
将在标题无法显示时使用(例如,当视图被拖到活动栏时)。contextualTitle
在视图移出其默认视图容器并需要额外上下文时使用。
{
"contributes": {
"views": {
"explorer": [
{
"id": "nodeDependencies",
"name": "Node Dependencies",
"when": "workspaceHasPackageJSON",
"icon": "media/dep.svg",
"contextualTitle": "Package Explorer"
}
]
}
}
}
视图内容可以通过两种方式填充
- 使用 TreeView,通过
createTreeView
API 提供 数据提供程序,或者直接通过registerTreeDataProvider
API 注册 数据提供程序 来填充数据。TreeView 非常适合显示分层数据和列表。请参阅 tree-view-sample。 - 使用 WebviewView,通过
registerWebviewViewProvider
注册 提供程序。Webview 视图允许在视图中渲染任意 HTML。有关更多详细信息,请参阅 webview 视图示例扩展。
contributes.viewsContainers
贡献一个视图容器,自定义视图可以贡献到其中。您必须为视图容器指定一个标识符、标题和图标。目前,您可以将它们贡献到活动栏 (activitybar
) 和面板 (panel
)。以下示例展示了如何将 Package Explorer
视图容器贡献到活动栏,以及如何将视图贡献到其中。
{
"contributes": {
"viewsContainers": {
"activitybar": [
{
"id": "package-explorer",
"title": "Package Explorer",
"icon": "resources/package-explorer.svg"
}
]
},
"views": {
"package-explorer": [
{
"id": "package-dependencies",
"name": "Dependencies"
},
{
"id": "package-outline",
"name": "Outline"
}
]
}
}
}
图标规范
-
大小:
图标应为 24x24 并居中。 -
颜色:
图标应使用单一颜色。 -
格式:
建议图标为 SVG 格式,但也接受任何图像文件类型。 -
状态:
所有图标继承以下状态样式状态 不透明度 默认值 60% Hover 100% 活动 100%
contributes.viewsWelcome
为自定义视图贡献欢迎内容。欢迎内容仅适用于空树视图。如果树没有子节点且没有 TreeView.message
,则视图被视为空。按照惯例,任何单独一行上的命令链接都显示为按钮。您可以使用 view
属性指定欢迎内容应适用的视图。欢迎内容的可见性可以通过 when
上下文值控制。要显示的欢迎内容文本通过 contents
属性设置。
{
"contributes": {
"viewsWelcome": [
{
"view": "scm",
"contents": "In order to use git features, you can open a folder containing a git repository or clone from a URL.\n[Open Folder](command:vscode.openFolder)\n[Clone Repository](command:git.clone)\nTo learn more about how to use git and source control in VS Code [read our docs](https://aka.ms/vscode-scm).",
"when": "config.git.enabled && git.state == initialized && workbenchState == empty"
}
]
}
}
可以为单个视图贡献多个欢迎内容项。发生这种情况时,来自 VS Code 核心的内容排在前面,其次是来自内置扩展的内容,最后是来自所有其他扩展的内容。
contributes.walkthroughs
贡献演练以显示在“入门”页面上。演练在您的扩展安装时自动打开,并提供了一种方便的方式向用户介绍您的扩展功能。
演练包括标题、描述、ID 和一系列步骤。此外,可以设置 when
条件以根据上下文键隐藏或显示演练。例如,一个解释 Linux 平台设置的演练可以给定 when: "isLinux"
以仅在 Linux 机器上显示。
演练中的每个步骤都有一个标题、描述、ID 和媒体元素(图像或 Markdown 内容),以及一组可选的事件,这些事件将导致该步骤被选中(如下例所示)。步骤描述是 Markdown 内容,支持 **粗体**
、__下划线__
和 ``代码``
渲染,以及链接。与演练类似,步骤可以给定何时条件以根据上下文键隐藏或显示它们。
建议使用 SVG 作为图像,因为它们具有缩放能力并支持 VS Code 的主题颜色。使用 Visual Studio Code Color Mapper Figma 插件可以轻松地在 SVG 中引用主题颜色。
{
"contributes": {
"walkthroughs": [
{
"id": "sample",
"title": "Sample",
"description": "A sample walkthrough",
"steps": [
{
"id": "runcommand",
"title": "Run Command",
"description": "This step will run a command and check off once it has been run.\n[Run Command](command:getting-started-sample.runCommand)",
"media": { "image": "media/image.png", "altText": "Empty image" },
"completionEvents": ["onCommand:getting-started-sample.runCommand"]
},
{
"id": "changesetting",
"title": "Change Setting",
"description": "This step will change a setting and check off when the setting has changed\n[Change Setting](command:getting-started-sample.changeSetting)",
"media": { "markdown": "media/markdown.md" },
"completionEvents": ["onSettingChanged:getting-started-sample.sampleSetting"]
}
]
}
]
}
}
完成事件
默认情况下,如果未提供 completionEvents
事件,则当点击步骤的任何按钮时,或者如果步骤没有按钮,则在打开步骤时,该步骤将被勾选。如果需要更精细的控制,可以提供 completionEvents
列表。
可用的完成事件包括
onCommand:myCommand.id
:当命令已运行时勾选步骤。onSettingChanged:mySetting.id
:一旦给定设置被修改,勾选步骤。onContext:contextKeyExpression
:当上下文键表达式评估为 true 时勾选步骤。extensionInstalled:myExt.id
:如果给定扩展已安装,则勾选步骤。onView:myView.id
:一旦给定视图可见,勾选步骤。onLink:https://...
:一旦通过演练打开给定链接,勾选步骤。
一旦步骤被勾选,它将保持勾选状态,直到用户明确取消勾选步骤或重置其进度(通过“入门:重置进度”命令)。