通过语言服务器协议 (LSP) 使用 Markdown 弹出(悬停)

问题描述 投票:0回答:1

我正在用 C#(使用 VS2022)构建一个语言服务器,它实现语言服务器协议(LSP)17.2.8(https://www.nuget.org/packages/Microsoft.VisualStudio.LanguageServer.Protocol.Extensions )

我是语言服务器协议的新手,可能有一个简单的解决方案可以解决我的问题。我为悬停弹出窗口创建了 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>[]{
             new SumType<string, MarkedString>(new MarkedString
             {
                 Language = MarkupKind.PlainText.ToString(),
                 Value = full_Descr + "\n",
             }),
             new SumType<string, MarkedString>(new MarkedString
             {
                 Language = MarkupKind.Markdown.ToString(),
                 Value = "```text\n" + performanceStr + "\n```",
             })
         };

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

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

语言服务器将以下消息发送到我的 VisualStudio 扩展 (vsix):

{
  "contents": [
    {
      "language": "PlainText",
      "value": "VPCONFLICTQ : [NONE,AVX512_CD] Detect Conflicts Within a Vector of Packed Dword/Qword Values into Dense Memory/ Register\n"
    },
    {
      "language": "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```"
    }
  ]
}

初始化语言服务器时,它会发送(到我的 VS 扩展)带有功能的 JSON(删除所有其他功能)。

{
  "capabilities": {
    "hoverProvider": {}
  }
}

问题:我还需要配置其他内容才能获得带有 Markdown 布局的弹出窗口吗? Visual Studio 端不支持 Markdown 吗?我需要 HoverClientCapability 来配置内容吗?

事实上的参考实现可以在 VSSDK-Extensibility-Samples (https://github.com/microsoft/VSSDK-Extensibility-Samples/tree/master/LanguageServerProtocol) 中找到,但它没有 Markdown 弹出窗口。即使是指向工作 C# 代码的链接也将不胜感激。

编辑:请参阅此处了解我的尝试。

c# vsix languageservice
1个回答
0
投票

据我了解,markdown 还不能用。 Roslyn 和其他 Microsoft 产品显然使用

Microsoft.VisualStudio.LanguageServer.Protocol.VSInternalHover
,它有一个附加的
RawContent
字段,告诉 Visual Studio 有关分类等信息。请参阅下面的示例。

示例:

  • 罗斯林

    return new VSInternalHover
    {
        Range = ProtocolConversions.TextSpanToRange(info.Span, text),
        Contents = new MarkupContent
        {
            Kind = MarkupKind.Markdown,
            Value = GetMarkdownString(descriptionBuilder)
        },
        RawContent = new ClassifiedTextElement(descriptionBuilder.Select(tp => new ClassifiedTextRun(tp.Tag.ToClassificationTypeName(), tp.Text)))
    };
    
  • 剃须刀

另请注意,在 roslyn

 中引用了 
Microsoft.VisualStudio.LanguageServer.Protocol.VSInternalClientCapabilities

根据

此评论,他们的内部问题跟踪器中有一个支持 Markdown 的开放问题。

© www.soinside.com 2019 - 2024. All rights reserved.