VS Code扩展开发:如何获取预渲染自动补全列表并按需过滤?
在VS Code中过滤现有自动补全项的可行方案
VS Code官方API没有直接提供修改其他CompletionItemProvider补全项的接口,但可以通过以下两种方式实现你的需求:
方法一:调用内置命令获取所有补全项并过滤(推荐)
通过vscode.executeCompletionItemProvider命令可以获取指定位置的所有补全结果,然后你可以按需过滤后返回。这种方式能在补全渲染前完成处理,体验更流畅。
实现步骤:
- 注册一个优先级更高的
CompletionItemProvider,确保你的Provider先被调用。 - 在
provideCompletionItems方法中,调用内置命令获取所有补全项。 - 过滤掉不需要的补全项,返回处理后的列表。
代码示例:
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { // 注册补全Provider,设置高优先级 const provider = vscode.languages.registerCompletionItemProvider( 'your-language-id', // 替换为你的目标语言ID,比如'javascript' { async provideCompletionItems(document: vscode.TextDocument, position: vscode.Position) { // 调用内置命令获取所有补全项 const completionList = await vscode.commands.executeCommand<vscode.CompletionList>( 'vscode.executeCompletionItemProvider', document.uri, position ); if (!completionList || !completionList.items) { return []; } // 过滤补全项:这里示例移除包含"deprecated"标签的项 const filteredItems = completionList.items.filter(item => { return !item.tags?.includes(vscode.CompletionItemTag.Deprecated); // 替换为你的过滤逻辑,比如:return !item.label.includes('不需要的关键词'); }); // 返回过滤后的补全列表 return new vscode.CompletionList(filteredItems, false); } }, ...['.', ' ', '('], // 添加需要触发补全的字符,覆盖目标语言的默认触发符 { providerMetadata: { priority: 100 } } // 设置高优先级,确保优先执行 ); context.subscriptions.push(provider); }
注意事项:
- 触发字符要覆盖目标语言的默认触发符,确保你的Provider能被触发。
- 优先级数值越大越优先,避免其他Provider的结果提前渲染。
方法二:监听补全列表变化事件(备选)
通过vscode.workspace.onDidChangeCompletionItems事件监听补全列表的变化,在事件回调中过滤不需要的项。但这种方式是在补全渲染后修改,可能会有视觉闪烁,适合简单场景。
代码示例:
import * as vscode from 'vscode'; export function activate(context: vscode.ExtensionContext) { const disposable = vscode.workspace.onDidChangeCompletionItems(event => { if (!event.items) return; // 过滤补全项,这里示例移除标签为Deprecated的项 const filteredItems = event.items.filter(item => { return !item.tags?.includes(vscode.CompletionItemTag.Deprecated); }); // 替换当前补全列表(注意:此内部命令可能存在版本兼容性问题) const editor = vscode.window.activeTextEditor; if (editor) { vscode.commands.executeCommand('editor.action.replaceCompletionItems', filteredItems); } }); context.subscriptions.push(disposable); }
注意事项:
editor.action.replaceCompletionItems是内部命令,无官方文档保障兼容性,VS Code版本升级时可能失效。- 会出现补全列表闪烁的情况,用户体验不如方法一。
内容的提问来源于stack exchange,提问作者Jarek
相关产品推荐
相关产品推荐

