You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VSCode扩展开发:如何在hover功能的命令中传参实现带查询的搜索

实现方案

VSCode的command:协议URI支持传递自定义参数,只需将参数数组做JSON序列化后进行URI编码,追加到命令路径后即可。以下是两种可直接落地的实现方式:

方式1:直接调用系统搜索命令(无需额外注册自定义命令)

直接构造带参数的workbench.action.findInFiles命令URI,修改hover提供者代码如下:

let disposable1 = vscode.languages.registerHoverProvider('javascript', {
  provideHover(document, position, token) {
    const word = "i_want_to_search";
    const searchOptions = {
        query: word,
        triggerSearch: true // 可选配置:点击后自动执行搜索,无需手动点击搜索按钮
    };
    // 构造带参数的命令URI:参数必须包裹在数组中,序列化后做URI编码
    const args = encodeURIComponent(JSON.stringify([searchOptions]));
    const commentCommandUri = vscode.Uri.parse(`command:workbench.action.findInFiles?${args}`);
    const contents = new vscode.MarkdownString(`[搜索关键词](${commentCommandUri})`);
    contents.isTrusted = true;
    return new vscode.Hover(contents);
  }
});
context.subscriptions.push(disposable1);

方式2:走自定义命令(扩展性更强)

如果后续需要添加搜索前的预处理逻辑,推荐先修改你已注册的自定义命令,支持接收传入的搜索词:

let disposable = vscode.commands.registerCommand('test-hover.helloWorldSearch', (targetWord) => {
    const word = targetWord || "默认搜索词"; // 支持传入参数,无参数时用默认值
    const searchOptions = {
        query: word,
        triggerSearch: true
    };
    vscode.commands.executeCommand('workbench.action.findInFiles', searchOptions);
});
context.subscriptions.push(disposable);

再修改hover代码调用自定义命令传参:

let disposable1 = vscode.languages.registerHoverProvider('javascript', {
  provideHover(document, position, token) {
    const targetWord = "i_want_to_search";
    const args = encodeURIComponent(JSON.stringify([targetWord]));
    const commentCommandUri = vscode.Uri.parse(`command:test-hover.helloWorldSearch?${args}`);
    const contents = new vscode.MarkdownString(`[搜索关键词](${commentCommandUri})`);
    contents.isTrusted = true;
    return new vscode.Hover(contents);
  }
});
context.subscriptions.push(disposable1);

注意事项

  • 所有命令参数必须包裹在数组中,哪怕只有一个参数,VSCode会按数组顺序将参数传入命令
  • 序列化后的JSON必须做URI编码,避免特殊字符导致URI解析失败
  • 必须给MarkdownString设置isTrusted = true,否则VSCode会拦截command链接无法触发

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 21:12:03