VSCode扩展Middleware中provideCompletionItem输入引号不触发如何解决
问题根因
VS Code 触发自动补全的前提是:当前输入的字符被注册为对应语言的补全触发字符。你自定义的mylang语言默认没有把单引号'、双引号"加入触发字符列表,输入这两个字符时不会启动补全流程,自然不会进入provideCompletionItem中间件。
修复方案
1. 为自定义语言补充补全触发字符配置
根据你的语言服务实现方式二选一即可:
- 直接在扩展
package.json中声明补全能力的,把单双引号加入triggerCharacters配置:
{ "contributes": { "languages": [ { "id": "mylang", "extensions": [".mylang"], "aliases": ["MyLang"] } ], "completionProviders": [ { "language": "mylang", "triggerCharacters": ["'", "\"", ".", " "] } ] } }
- 基于
vscode-languageclient实现语言客户端的,在中间件中拦截初始化请求,给服务端返回的补全能力追加触发字符。同时修正原有代码中语言ID配置错误的问题(语言ID不需要带扩展名前缀的.,直接填声明的mylang即可,否则会出现语言匹配失效):
let clientOptions: LanguageClientOptions = { documentSelector: [{ scheme: 'file', language: 'mylang' }], middleware: { // 拦截初始化请求,补全补全触发字符 async handleRequest(method, params, token, next) { const result = await next(params, token); if (method === 'initialize' && result.capabilities.completionProvider) { const existTriggers = result.capabilities.completionProvider.triggerCharacters || []; result.capabilities.completionProvider.triggerCharacters = [ ...new Set([...existTriggers, "'", "\"", "."]) ]; } return result; }, // 原有补全转发逻辑保持不变 provideCompletionItem: async (document, position, context, token, next) => { if ( !isInsideSQLRegion( myLanguageService, document.getText(), document.offsetAt(position) ) ) { return await next(document, position, context, token); } const originalUri = document.uri.toString(); virtualDocumentContents.set( originalUri, getSQLVirtualContent(myLanguageService, document.getText()) ); const vdocUriString = `embedded-content://sql/${encodeURIComponent(originalUri)}.sql`; const vdocUri = Uri.parse(vdocUriString); return await commands.executeCommand<CompletionList>( 'vscode.executeCompletionItemProvider', vdocUri, position, context.triggerCharacter ); } } };
2. 校验虚拟文档逻辑
VS Code 内置的SQL语言服务默认已经支持单双引号触发补全,不需要额外配置。如果配置触发字符后能进入中间件但拿不到SQL补全结果,检查两个点:
- 你提前注册了
embedded-content协议的TextDocumentContentProvider,能正常返回虚拟文档内容 getSQLVirtualContent生成的虚拟SQL内容和原文档的位置偏移完全对齐,光标在虚拟文档中对应的上下文和原文档一致,否则SQL服务无法正确解析上下文返回补全项
内容的提问来源于stack exchange,提问作者Aneesha Fernando
相关产品推荐
相关产品推荐

