关于在Visual Studio Code扩展中调用并触发GitHub Copilot Chat的技术问询
在Visual Studio Code扩展中调用并触发GitHub Copilot Chat的技术问询
嘿,这个需求完全可行!我之前研究过类似的场景,下面给你拆解具体的实现思路和关键步骤:
核心实现逻辑
GitHub Copilot Chat本身作为VSCode的官方扩展,暴露了一系列内部命令供其他扩展调用,我们可以借助VSCode的扩展API来完成你的需求,大致分为两步:
1. 获取用户选中的代码
这是VSCode扩展开发的基础操作,通过编辑器API就能轻松拿到选中文本:
import * as vscode from 'vscode'; const getSelectedCode = (): string | undefined => { const activeEditor = vscode.window.activeTextEditor; if (!activeEditor) return undefined; return activeEditor.document.getText(activeEditor.selection); };
2. 触发Copilot Chat并发送自定义提示
Copilot Chat提供了两个关键命令可以直接调用:
github.copilot.chat.focus:聚焦到Copilot Chat的输入框github.copilot.chat.sendMessage:直接发送指定内容到Chat
结合起来的完整命令注册示例如下:
export function activate(context: vscode.ExtensionContext) { // 注册你的自定义源命令 const triggerChatCommand = vscode.commands.registerCommand( 'your-extension-name.code-to-copilot', async () => { const selectedCode = getSelectedCode(); if (!selectedCode) { vscode.window.showErrorMessage('请先选中一段代码再执行命令!'); return; } // 自定义你的提示模板,比如让Copilot优化、解释代码 const customPrompt = `请帮我优化这段代码,并说明优化点:\n${selectedCode}`; try { // 先检查Copilot Chat是否已安装并激活 const copilotChatExt = vscode.extensions.getExtension('GitHub.copilot-chat'); if (!copilotChatExt) { vscode.window.showErrorMessage('请先安装GitHub Copilot Chat扩展!'); return; } if (!copilotChatExt.isActive) { await copilotChatExt.activate(); } // 触发Chat并发送提示 await vscode.commands.executeCommand('github.copilot.chat.focus'); await vscode.commands.executeCommand('github.copilot.chat.sendMessage', customPrompt); } catch (err) { vscode.window.showErrorMessage(`触发Copilot Chat失败:${(err as Error).message}`); } } ); context.subscriptions.push(triggerChatCommand); }
额外注意事项
- 记得在你的扩展
package.json中声明对Copilot Chat的依赖,避免用户未安装时出错:"extensionDependencies": [ "GitHub.copilot-chat" ] - Copilot Chat的内部命令可能会随版本更新调整,如果遇到命令失效的情况,可以查看Copilot Chat扩展的
package.json文件,在contributes.commands节点里找最新的命令名称。 - 你可以根据需求自由定制提示模板,比如添加代码上下文、指定任务类型(重构、注释、bug排查等)。
亲测这个方案完全符合你描述的使用场景——用户选中代码后执行你的命令,就能自动触发Copilot Chat并返回定制化结果。
备注:内容来源于stack exchange,提问作者Will Huang




