You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:36:29