VSCode LSP 语言服务器协议总结

您所在的位置:网站首页 电脑上的lsp什么意思 VSCode LSP 语言服务器协议总结

VSCode LSP 语言服务器协议总结

2024-07-02 23:06| 来源: 网络整理| 查看: 265

为什么使用语言服务器协议?

LSP(Language Server Protocol)语言服务器是一种特殊的 Visual Studio Code 扩展,可为许多编程语言提供编辑体验。使用语言服务器,您可以实现自动完成、错误检查(诊断)、跳转到定义以及VS Code 支持的许多其他语言功能。

然而,在 VS Code 中实现对语言功能的支持时,我们发现了三个常见问题:

首先,语言服务器通常以其本机编程语言实现,这给将它们与具有 Node.js 运行时的 VS Code 集成带来了挑战。

此外,语言功能可能是资源密集型的。例如,为了正确验证文件,语言服务器需要解析大量文件,为它们建立抽象语法树并执行静态程序分析。这些操作可能会导致大量的 CPU 和内存使用,我们需要确保 VS Code 的性能不受影响。

最后,将多种语言工具与多个代码编辑器集成可能需要付出巨大的努力。从语言工具的角度来看,它们需要适应具有不同API的代码编辑器。从代码编辑者的角度来看,他们不能期望语言工具提供任何统一的 API。最终导致了为N种编辑器实现M种语言需要花费N*M的工作和精力。

在这里插入图片描述

为了解决这些问题,微软提供了语言服务器协议(Language Server Protocol)意图为语言插件和编辑器提供社区规范。这样一来,语言服务器就可以用任何一种语言来实现,用协议通讯也避免了插件在主进程中运行的高开销。而且任何LSP兼容的语言插件,都能和LSP兼容的代码编辑器整合起来,LSP是语言插件开发者和第三方编辑器的共赢方案。

在 VS Code 中,语言服务器有两部分:

语言客户端:用 JavaScript / TypeScript 编写的普通 VS Code 扩展。此扩展可以访问所有VS Code 命名空间 API。语言服务器:在单独进程中运行的语言分析工具。

如上所述,在单独的进程中运行语言服务器有两个好处:

该分析工具可以用任何语言实现,只要它能够按照语言服务器协议与语言客户端进行通信即可。由于语言分析工具通常会占用大量 CPU 和内存,因此在单独的进程中运行它们可以避免性能成本。 一、先了解下编程语言扩展

可以做哪些编程语言相关的扩展

我们先看一张图,看看vscode支持我们做哪些编程语言的扩展。 在这里插入图片描述 首先,我们在package.json下的contributes下增加对于语言配置的支持:

"languages": [{ "id": "basic", "extensions": [ ".bas" // 自定义语言扩展名 ], "configuration": "./language-configuration.json" } 注释

使用//来表示单行注释,用/**/来表示多行注释。我们这样来写language-configuation.json:

"comments": { "lineComment": "//", "blockComment": [ "/*", "*/" ] }

定义之后,我们就可以用Ctrl+K(Windows)或者Cmd-K(Mac)来触发打开或关闭注释了

括号匹配

我们对小括号和中括号进行配对:

"brackets": [ [ "[", "]" ], [ "(", ")" ], ], 括号的自动补齐

可以通过括号的自动补齐功能来防止少写一半括号:

"autoClosingPairs": [ { "open": "\"", "close": "\"" }, { "open": "[", "close": "]" }, { "open": "(", "close": ")" }, { "open": "Sub", "close": "End Sub" } ]

在上例中,输入一个",就会补上另一半"。对于其他括号也是如此。

选中区域加括号

在选中一个区域之后,再输入一半括号,就可以自动用一对完整括号将其包围起来,称为auto surrounding功能。

例:

"surroundingPairs": [ [ "[", "]" ], [ "(", ")" ], [ "\"", "\"" ], [ "'", "'", ] ], 代码折叠

函数和代码块多了以后,给代码阅读带来一定困难。我们可以选择将一个代码块折叠起来。这也是Vim和emacs时代就有的老功能了。

我们以折叠Sub/End Sub为例,看看代码折叠的写法:

"folding": { "markers": { "start": "^\\s*Sub.*", "end": "^\\s*End\\s*Sub.*" } }

我们来看下Sub折叠后的效果:

在这里插入图片描述

Diagnostic诊断信息(vscode插件扩展方式实现)

语言扩展中一个重要的功能是代码扫描的诊断信息。这个诊断信息是以vscode.Diagnostic为载体呈现的。 我们来看一下vscode.Diagnostic类的成员和与相关类的关系 在这里插入图片描述 以小到大,这些类为:

Position: 定位到一行上的一个字符的坐标Range: 由起点和终点两个Position决定Location: 一个Range配上一个URIDiagnosticRelatedInformation: 一个Location配一个messageDiagnostic: 主体是一个message字符串,一个Range和一个DiagnosticRelatedInformation.

构造一个诊断信息 下面我们来构造一个诊断信息。

for(var i = 0; i { validateTextDocument(change.document); }); async function validateTextDocument(textDocument: TextDocument): Promise { // In this simple example we get the settings for every validate run. const settings = await getDocumentSettings(textDocument.uri); // The validator creates diagnostics for all uppercase words length 2 and more const text = textDocument.getText(); const pattern = /\b[A-Z]{2,}\b/g; let m: RegExpExecArray | null; let problems = 0; const diagnostics: Diagnostic[] = []; while ((m = pattern.exec(text)) && problems


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3