命令
命令会触发 Visual Studio Code 中的操作。如果您曾经 配置过快捷键,那么您就接触过命令。命令也被扩展用来向用户公开功能、绑定到 VS Code UI 中的操作以及实现内部逻辑。
使用命令
VS Code 包含大量 内置命令,您可以使用它们与编辑器交互、控制用户界面或执行后台操作。许多扩展还将它们的核心功能公开为命令,供用户和其他扩展使用。
以编程方式执行命令
vscode.commands.executeCommand API 以编程方式执行命令。这使您能够使用 VS Code 的内置功能,并构建在 VS Code 内置的 Git 和 Markdown 扩展等扩展之上。
例如,editor.action.addCommentLine 命令会对活动文本编辑器中当前选定的行进行注释。
import * as vscode from 'vscode';
function commentLine() {
vscode.commands.executeCommand('editor.action.addCommentLine');
}
一些命令接受控制其行为的参数。命令也可能返回一个结果。例如,API 风格的 vscode.executeDefinitionProvider 命令会查询给定位置文档的定义。它接受文档 URI 和位置作为参数,并返回一个包含定义列表的 Promise。
import * as vscode from 'vscode';
async function printDefinitionsForActiveEditor() {
const activeEditor = vscode.window.activeTextEditor;
if (!activeEditor) {
return;
}
const definitions = await vscode.commands.executeCommand<vscode.Location[]>(
'vscode.executeDefinitionProvider',
activeEditor.document.uri,
activeEditor.selection.active
);
for (const definition of definitions) {
console.log(definition);
}
}
查找可用命令
命令 URI
命令 URI 是执行给定命令的链接。它们可以作为可点击链接出现在悬停文本、完成项详细信息或 Webview 中。
命令 URI 使用 command 方案,后跟命令名称。例如,editor.action.addCommentLine 命令的命令 URI 是 command:editor.action.addCommentLine。这是一个悬停提供程序,它会在活动文本编辑器中当前行的注释中显示一个链接。
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
vscode.languages.registerHoverProvider(
'javascript',
new (class implements vscode.HoverProvider {
provideHover(
_document: vscode.TextDocument,
_position: vscode.Position,
_token: vscode.CancellationToken
): vscode.ProviderResult<vscode.Hover> {
const commentCommandUri = vscode.Uri.parse(`command:editor.action.addCommentLine`);
const contents = new vscode.MarkdownString(`[Add comment](${commentCommandUri})`);
// To enable command URIs in Markdown content, you must set the `isTrusted` flag.
// When creating trusted Markdown string, make sure to properly sanitize all the
// input content so that only expected command URIs can be executed
contents.isTrusted = true;
return new vscode.Hover(contents);
}
})()
);
}
传递给命令的参数列表作为一个已正确 URI 编码的 JSON 数组。下面的示例使用 git.stage 命令创建一个悬停链接来暂存当前文件。
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
vscode.languages.registerHoverProvider(
'javascript',
new (class implements vscode.HoverProvider {
provideHover(
document: vscode.TextDocument,
_position: vscode.Position,
_token: vscode.CancellationToken
): vscode.ProviderResult<vscode.Hover> {
const args = [{ resourceUri: document.uri }];
const stageCommandUri = vscode.Uri.parse(
`command:git.stage?${encodeURIComponent(JSON.stringify(args))}`
);
const contents = new vscode.MarkdownString(`[Stage file](${stageCommandUri})`);
contents.isTrusted = true;
return new vscode.Hover(contents);
}
})()
);
}
您可以通过在创建 Webview 时在 WebviewOptions 中设置 enableCommandUris 来在 Webview 中启用命令 URI。
创建新命令
注册命令
vscode.commands.registerCommand 将命令 ID 绑定到扩展中的处理程序函数。
import * as vscode from 'vscode';
export function activate(context: vscode.ExtensionContext) {
const command = 'myExtension.sayHello';
const commandHandler = (name: string = 'world') => {
console.log(`Hello ${name}!!!`);
};
context.subscriptions.push(vscode.commands.registerCommand(command, commandHandler));
}
每当执行 myExtension.sayHello 命令时,都会调用处理程序函数,无论是通过 executeCommand 以编程方式执行,还是从 VS Code UI 执行,或通过快捷键执行。
创建面向用户的命令
vscode.commands.registerCommand 仅将命令 ID 绑定到处理程序函数。要将此命令公开在命令面板中,以便用户可以发现它,您还需要在扩展的 package.json 中具有相应的命令 contribution。
{
"contributes": {
"commands": [
{
"command": "myExtension.sayHello",
"title": "Say Hello"
}
]
}
}
commands contribution 告诉 VS Code 您的扩展提供了给定命令,并且在调用该命令时应激活扩展,并且还允许您控制命令在 UI 中的显示方式。创建命令时,请确保遵循 命令命名约定。

现在,当用户首次从命令面板或通过快捷键调用 myExtension.sayHello 命令时,扩展将被激活,registerCommand 会将 myExtension.sayHello 绑定到正确的文件处理程序。
注意:针对 VS Code 1.74.0 之前的版本的扩展必须为其所有面向用户的命令显式注册一个
onCommandactivationEvent,以便扩展被激活并执行registerCommand。{ "activationEvents": ["onCommand:myExtension.sayHello"] }
您不需要为内部命令添加 onCommand 激活事件,但必须为任何以下命令定义它们:
- 可以通过命令面板调用。
- 可以通过快捷键调用。
- 可以通过 VS Code UI 调用,例如通过编辑器标题栏。
- 旨在作为其他扩展可用的 API。
控制命令在命令面板中的显示
默认情况下,通过 package.json 的 commands 部分贡献的所有面向用户的命令都会显示在命令面板中。但是,许多命令仅在特定情况下相关,例如当有给定语言的活动文本编辑器时,或者当用户设置了特定配置选项时。
menus.commandPalette contribution point 允许您限制命令显示在命令面板中的时间。它需要目标命令的 ID 和一个 when 子句,该子句控制命令的显示方式。
{
"contributes": {
"menus": {
"commandPalette": [
{
"command": "myExtension.sayHello",
"when": "editorLangId == markdown"
}
]
}
}
}
现在,当用户处于 Markdown 文件中时,myExtension.sayHello 命令将仅显示在命令面板中。
命令的启用
命令通过 enablement 属性支持启用,其值是一个 when 子句。启用适用于所有菜单和已注册的快捷键。
注意:
enablement和菜单项的when条件之间存在语义重叠。后者用于防止出现充满禁用项的菜单。例如,一个分析 JavaScript 正则表达式的命令应在文件是 JavaScript 时显示,并且仅在光标位于正则表达式上时才**启用**。when子句通过不为所有其他语言文件显示命令来防止菜单混乱。强烈建议防止菜单混乱。
最后,显示命令的菜单(如命令面板或上下文菜单)实现了不同的启用/禁用处理方式。编辑器和资源管理器上下文菜单会渲染启用/禁用项,而命令面板会过滤它们。
使用自定义 when 子句上下文
如果您正在编写自己的 VS Code 扩展,并且需要使用 when 子句上下文来启用/禁用命令、菜单或视图,而现有的键都不适合您的需求,那么您可以添加自己的上下文。
下面的第一个示例将键 myExtension.showMyCommand 设置为 true,您可以在命令的启用或 when 属性中使用它。第二个示例存储了一个值,您可以使用它与 when 子句来检查打开的酷炫事物数量是否大于 2。
vscode.commands.executeCommand('setContext', 'myExtension.showMyCommand', true);
vscode.commands.executeCommand('setContext', 'myExtension.numberOfCoolOpenThings', 2);
命名约定
创建命令时,应遵循以下命名约定:
- 命令标题
- 使用标题式大写。不要大写长度为四个或更少的介词(如 on、to、in、of、with 和 for),除非介词是第一个或最后一个单词。
- 以动词开头,描述将要执行的操作。
- 使用名词描述操作的目标。
- 避免在标题中使用“command”。