修改VSCode扩展中provideCompletionItems补全功能的触发命令
VSCode扩展自定义命令触发补全功能修改方案
核心修改思路
让原有补全提供者仅响应自定义命令发起的补全请求,同时注册自定义命令的执行逻辑,主动触发带私有标识的补全调用,和默认的Trigger Suggest命令完全隔离。
完整修改后的代码
扩展入口代码(extension.ts)
import * as vscode from 'vscode'; // 私有触发标记,选用正常编码场景下几乎不会输入的特殊字符即可 const PRIVATE_TRIGGER_MARK = '∑'; export function activate(context: vscode.ExtensionContext) { const command = 'getairesponse'; const supportedLanguages = ['c','cpp','csharp','java','javascript', 'php', 'python', 'SQL', 'HTML', 'plaintext']; // 注册补全提供者,仅响应私有标记触发的补全请求 const completionProvider = vscode.languages.registerCompletionItemProvider(supportedLanguages, { async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext) { // 非自定义命令触发的补全请求直接跳过 if (context.triggerCharacter !== PRIVATE_TRIGGER_MARK) { return undefined; } const editor = vscode.window.activeTextEditor; if (!editor) { return undefined; } const cursorPosition = editor.selection.active; const inputContent = editor.document.getText(new vscode.Range(0, 0, cursorPosition.line, cursorPosition.character)); const completionContent = await getOutput(inputContent); return [new vscode.CompletionItem(completionContent)]; } }); // 注册package.json中声明的自定义命令 const aiCompletionCommand = vscode.commands.registerCommand(command, async () => { const editor = vscode.window.activeTextEditor; if (!editor) { return; } // 主动触发补全,传入私有触发标记,仅匹配自己的补全提供者 await vscode.commands.executeCommand('editor.action.triggerSuggest', { triggerCharacter: PRIVATE_TRIGGER_MARK }); }); context.subscriptions.push(completionProvider, aiCompletionCommand); }
可选:配置快捷键(package.json)
如果需要给自定义命令绑定触发快捷键,可在contributes字段下新增快捷键配置:
"contributes": { "commands": [ { "command": "getairesponse", "title": "Get AI Response" } ], "keybindings": [ { "command": "getairesponse", "key": "ctrl+shift+.", "mac": "cmd+shift+.", "when": "editorTextFocus" } ] }
内容的提问来源于stack exchange,提问作者Aryagm
相关产品推荐
相关产品推荐

