命令使用
Visual Studio Code 命令使用指南
1. 命令概述
在 Visual Studio Code 中,命令(Command) 用于触发各类操作。无论是使用快捷键、点击菜单,还是通过扩展程序编程调用,最终都会落实到命令的执行上。
- 内置命令:VS Code 自带大量命令,用于编辑、导航、控制界面等。
- 扩展命令:扩展程序可以暴露自己的命令,供用户或其他扩展使用。
2. 使用命令
2.1 以编程方式执行命令
通过 vscode.commands.executeCommand API 可以在代码中直接执行任意命令。
示例:注释当前活动编辑器中的选中行(使用内置命令 editor.action.addCommentLine)。
import * as vscode from 'vscode';
function commentLine() {
vscode.commands.executeCommand('editor.action.addCommentLine');
}
带参数与返回值:
某些命令需要传入参数,并可能返回结果。例如 vscode.executeDefinitionProvider 会返回定义列表。
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);
}
}
2.2 命令 URI
命令 URI 是一种特殊链接(格式为 command:<命令名>),可在悬停提示、补全详情、WebView 等位置作为可点击链接使用。
示例:在悬停提示中显示“添加注释”链接,点击后执行 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})`);
// 必须将 isTrusted 设为 true 才能执行命令
contents.isTrusted = true;
return new vscode.Hover(contents);
}
})()
);
}
传递参数:将参数以 JSON 数组形式编码后附加在 URI 的查询字符串中。
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;
WebView 支持:在创建 WebView 时,设置 enableCommandUris: true 即可启用命令 URI 点击。
3. 创建新命令
3.1 注册命令
使用 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)
);
}
3.2 将命令暴露给用户(贡献命令)
仅注册命令不足以让用户在命令面板中看到它。你还需要在 package.json 的 contributes.commands 中声明。
{
"contributes": {
"commands": [
{
"command": "myExtension.sayHello",
"title": "Say Hello"
}
]
}
}
注意:如果扩展兼容 VS Code 1.74.0 之前的版本,还必须在
activationEvents中添加onCommand:myExtension.sayHello,以确保扩展在命令调用前激活。
3.3 控制命令在命令面板中的显示
通过 menus.commandPalette 配合 when 条件,可以限制命令仅在特定场景下显示。
{
"contributes": {
"menus": {
"commandPalette": [
{
"command": "myExtension.sayHello",
"when": "editorLangId == markdown"
}
]
}
}
}
上述配置使得 myExtension.sayHello 仅在当前文件为 Markdown 时显示在命令面板中。
3.4 命令的启用状态(Enablement)
使用 enablement 属性(值为 when 子句)来控制命令是否可点击。它适用于所有菜单和快捷键。
区分
enablement与菜单when:
when决定菜单项是否显示,用于避免界面杂乱。enablement决定已显示的菜单项是否可用。
命令面板会过滤掉禁用项,而编辑器上下文菜单则会显示为灰色不可用状态。
{
"contributes": {
"commands": [
{
"command": "myExtension.analyzeRegex",
"title": "Analyze Regex",
"enablement": "editorHasSelection && editorLangId == javascript"
}
]
}
}
3.5 自定义 when 子句上下文
如果现有的上下文键(如 editorLangId)不能满足需求,你可以通过 setContext 命令自定义上下文。
// 设置布尔值
vscode.commands.executeCommand('setContext', 'myExtension.showMyCommand', true);
// 设置数值,用于比较
vscode.commands.executeCommand('setContext', 'myExtension.numberOfCoolOpenThings', 2);
然后在 when 子句中使用:
"when": "myExtension.showMyCommand && myExtension.numberOfCoolOpenThings > 1"
4. 命令命名规范
标题(Title) 采用标题式大小写(Title Case)。
- 介词(如 on, to, in, of, with, for)若长度≤4个字母,不大写,除非位于首尾。
- 以动词开头,描述操作。
- 使用名词描述操作目标。
- 避免在标题中出现“command”一词。
命令 ID(Command ID) 通常采用小写字母与点号分隔的格式,例如
myExtension.sayHello。
5. 常用命令参考
- 内置命令完整列表可查阅 VS Code 高级命令 API。
- 通过键盘快捷键设置(
Ctrl+K Ctrl+S)可以浏览所有可用命令及其 ID。
本文档基于 VS Code 官方文档整理,涵盖了命令的核心用法和开发要点。
