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
相关产品推荐
相关产品推荐

