lsp语言服务器协议
在工具(客户端)和语言智能提供程序(服务器)之间使用语言服务器协议,以将自动完成,转到定义,查找所有引用等功能集成到工具中。
来自语言服务器协议
换句话说,这是在编辑器和语言工具(例如linter,样式控件)之间进行通信的一种标准方法,通常来说,它需要检查源代码的所有内容。
从我的角度来看,这是一个改变规则的游戏,因为它可以重用所有级别的现有基础架构。 如果您现在是语言开发人员,则可以只构建一个语言服务器来支持许多编辑器 ,包括Visual Studio Code和Eclipse Che或Eclipse IDE。 如果要创建编辑器,则可以立即支持实现单个协议的多种语言。 如果您需要通过自己的软件使用该协议,那么已经有各种语言的库,例如PHP,Java或Haskell。
协议说明
Microsoft本身提供了典型会话的简单描述 :
- 用户打开一个文档 。 编辑器通知语言服务器用户打开了一个文档(
didOpen
),并且该文档已在内存中。 - 用户编辑文档。 编辑器将文件更改通知服务器(
didChange
)。 语言服务器将分析此信息,并将发现的错误和警告(diagnostics
)通知工具。 - 用户请求一些特定的命令 。 用户要求符号的定义(
definition
),当前光标位置的文本的完成(completion
),签名的帮助(signatureHelp
)等。编辑器将正确的请求发送到服务器,服务器做出相应的响应。 然后,编辑者可以使用此信息来满足用户的要求。 - 用户关闭文档 。 编辑器通知语言服务器用户关闭了一个文档(
didClose)
并且该文档不再在内存中。
观察结果
显然,在其存储库中也有对该协议的完整描述 。 它支持所有文本通用的请求,但以针对编程语言的方式支持。 例如,存在一个突出显示文档中的文本的请求( documentHighlight
),该documentHighlight
可用于各种文本,因为突出显示某些内容在许多情况下很有用。 但是LSP旨在通过专用于对符号的读/写访问的字段来更好地支持编程语言。 重要的是要记住,该协议仅支持文本表示,不能使用它对二进制代码进行操作。
尽管在设计时已考虑到源代码编辑器和本地开发的需要,但没有什么可以说它不能与远程服务和其他软件进行通信。 对于某些需要快速往返的功能(例如自动完成),延迟可能是个问题。 但是很容易想象它可以与MySQL Workbench等工具一起使用来检查SQL查询。
历史和当前实施
根据LSP的历史,最初的灵感来自像Vim和Emacs这样的编辑器,它们使用恶魔来支持多种语言。 然后,一组开发人员创建了OmniSharp ,这是一组库工具,可简化在许多平台和编辑器中使用.NET语言的过程。 最终,Microsoft在这项工作的基础上建立了一个语言中立的协议,该协议依赖于JSON-RPC。 尽管一开始它主要用于短毛绒,但现在已扩展为可用于所有目的:重构,语法检查和代码完成。
除了前面提到的Visual Studio Code , Eclipse Che和Eclipse IDE团队以外,还有对emacs和GNOME Builder的语言服务器协议支持。 这里列出了 23种语言服务器的实现 ,您不仅可以看到编程语言,还可以看到Swagger和API Blueprint的规范,例如API Elements。 您还可以在LangServer.org上查找,在其中可以找到每种实现所支持的功能的更详细列表,例如代码完成,转到Definiton,查找引用…。
为什么开放
您永远不会指责Microsoft不了解效率,但是您可能会指责它不关心开源。 当微软开始为开源做出贡献时,人们充满了怀疑和怀疑。 鉴于公司先前的某些声明和采取的行动,很难将其归咎于某人。 但是现在我们可以说该公司已经缴纳了会费。 它发布开放源代码软件,在开放源代码基础上构建,并创建旨在供所有人使用的组件。 这确实是一个巨大的变化。 在其创作中有Visual Studio Code ,它是开发人员最好的编辑器之一。 它成功的关键之一是智能组织和诸如语言服务器协议之类的创新。
微软为开源做出了贡献,因为它对企业有利。 它允许与其他公司合作,而无需太多的协调。 它仅通过支持每个人都可以在其上构建其软件和服务的通用平台来工作。
结论
如果您对语言开发感兴趣,那么您会知道支持它的工具对于创建成功的编程语言至关重要 。 语言服务器协议允许语言设计人员和工具开发人员使用一个简单的协议支持更多编辑器中的新创建。 即使您只是想创建用于静态代码分析的工具来帮助开发人员并简化您的生活,您也会发现将其提供给许多开发人员很有用。 还等什么呢? node中甚至有一个示例实现 。
翻译自: https://www.javacodegeeks.com/2017/02/know-language-server-protocol.html
lsp语言服务器协议