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

VS2022 C# LSP语言服务悬停弹窗Markdown渲染异常问题

解决LSP悬停弹窗Markdown显示为纯文本的问题

核心问题原因

你当前使用的MarkedString是LSP旧格式,且误用了Language字段——该字段用于指定代码块的语言类型(如csharp、text),而非标记内容为Markdown格式。VS2022的LSP客户端需要通过标准的MarkupContent类型来识别Markdown内容。

代码修改方案

将原代码中的SumType<string, MarkedString>数组替换为SumType<string, MarkedString, MarkupContent>数组,直接用MarkupContent封装Markdown内容:

[JsonRpcMethod(Methods.TextDocumentHoverName)]
public Hover OnHover(JToken arg)
{
    LogInfo($"OnHover: Received: {arg}");
    var parameter = arg.ToObject<TextDocumentPositionParams>();

    // [SNIP details]

    var hoverContent = new SumType<string, MarkedString, MarkupContent>[]
    {
        // 纯文本内容
        new SumType<string, MarkedString, MarkupContent>(full_Descr + "\n"),
        // Markdown格式内容
        new SumType<string, MarkedString, MarkupContent>(new MarkupContent
        {
            Kind = MarkupKind.Markdown,
            Value = "```text\n" + performanceStr + "\n```"
        })
    };

    var result = new Hover()
    {
        Contents = hoverContent
    };

    LogInfo($"OnHover: Sent: {JToken.FromObject(result)}");
    return result;
}

修改后服务器发送的JSON格式:

{
  "contents": [
    "VPCONFLICTQ : [NONE,AVX512_CD] Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register\n",
    {
      "kind": "markdown",
      "value": "```text\n                                      µOps   µOps     µOps                                              \nArchitecture  Instruction             Fused  Unfused  Port                Latency  Throughput           \nSkylakeX      VPCONFLICTQ x,x         3      3        p01 p5              4        2                    \nSkylakeX      VPCONFLICTQ y,y         15     15       p01 p5              13       7                    \nSkylakeX      VPCONFLICTQ z,z         22     22       p0 p5               17       12                   \n```"
    }
  ]
}

能力配置补充

  1. 服务器能力声明:明确指定hover支持的内容格式,让客户端知晓服务器可发送Markdown:
{
  "capabilities": {
    "hoverProvider": {
      "contentFormat": ["plaintext", "markdown"]
    }
  }
}
  1. 客户端能力检查:在服务器Initialize方法中,可检查客户端发送的InitializeParams.Capabilities.TextDocument.Hover.ContentFormat,确认包含MarkupKind.Markdown后再返回Markdown内容(VS2022默认支持该格式)。

关键说明

VS2022完全支持LSP悬停的Markdown渲染,问题出在内容格式的封装方式上。MarkedString主要用于旧版LSP或简单代码块场景,现代LSP推荐使用MarkupContent明确区分纯文本和Markdown内容。

内容的提问来源于stack exchange,提问作者HJLebbink

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 08:26:23