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```" } ] }
能力配置补充
- 服务器能力声明:明确指定hover支持的内容格式,让客户端知晓服务器可发送Markdown:
{ "capabilities": { "hoverProvider": { "contentFormat": ["plaintext", "markdown"] } } }
- 客户端能力检查:在服务器
Initialize方法中,可检查客户端发送的InitializeParams.Capabilities.TextDocument.Hover.ContentFormat,确认包含MarkupKind.Markdown后再返回Markdown内容(VS2022默认支持该格式)。
关键说明
VS2022完全支持LSP悬停的Markdown渲染,问题出在内容格式的封装方式上。MarkedString主要用于旧版LSP或简单代码块场景,现代LSP推荐使用MarkupContent明确区分纯文本和Markdown内容。
内容的提问来源于stack exchange,提问作者HJLebbink
相关产品推荐
相关产品推荐

