身为程序员还不知道?Xtext与LSP让一个语言服务器横扫多个IDE!-lsp文件

Xtext与LSP的组合是向多个IDE添加语言支持的可行方法。语言服务器协议有很多说法:它允许使用多种语言编写,并使用一种基于JSON-RPC的轻量级协议通过stdin/stdout与编辑器交换信息。虽然最初设计用于Visual Studio代码,但现在许多编辑器都开始支持,并出现了许多用于多种语言的语言服务器。

本文将展示一个YANG语言的单一语言服务器,它使用Xtext实现,连接三个不同的编辑器客户端:VSCode,Theia IDE和Eclipse。由于Theia允许两者兼容:一个基于浏览器的IDE和一个基于Electron的rich-client,这产生了四种不同类型的IDE。所有资源均在Github上公开提供。

YANG语言服务器

YANG是一种数据建模语言,用于对由NETCONF协议、远程过程调用和通知操纵的配置和状态数据进行建模。

在项目yang-lsp中,我们使用Xtext实现了一个YANG语言服务器。Xtext生成一个LSP很简单,几乎和其他所有语言一样,YANG有一些定制,诸如验证、范围界定和格式化这样的服务pecularites。为了改善用户体验,团队还调整了一些语言服务器IDE服务,如内容辅助、代码lens、符号等。Xtext的依赖注入使得这样的定制变得容易。然而,额外的努力是希望避免使用相应的本机API重做每个IDE。

YANG语言服务器是用Xtend(Java方言)编写的,所以用户必须运行Gradle来构建它。语言服务器通常在自己的进程中运行,因此构建还会创建一些脚本来启动LS。然后,运行的服务器通过标准输入/输出或套接字连接到客户端。

身为程序员还不知道?Xtext与LSP让一个语言服务器横扫多个IDE!

The YANG editor in VSCode

VSCode客户端

VSCode是Microsoft的可扩展,轻量级的开源IDE。在yang-vscode中,我们基于yang-lsp实现了VSCode的扩展。它主要由以下部分组成:

  • 启动语言服务器的方法

  • 配置的语法高亮和括号匹配,在VSCode中始终由客户端完成

  • VSCode扩展的配置文件

用户可以直接从VSCode市场安装yang扩展。如果要从源代码构建它,必须将yang-lsp项目签出并轻松构建在yang-vscode repo旁边的文件夹中,因为它将在构建期间复制。

身为程序员还不知道?Xtext与LSP让一个语言服务器横扫多个IDE!

The YANG editor in Theia (browser mode)

Theia客户端

Theia是在浏览器或rich-client使用相同代码运行的IDE新框架。它是用TypeScript编写的,对LSP有一级支持,并使用Microsoft的编辑器小部件Monaco。Theia尚未正式发布,但预计将于2017年12月推出beta 1.0。

项目yangster包含YIA语言的Theia扩展。该项目包含各种npm软件包,并以其他方式连接为Git子模块。虽然这个设置看起来很复杂,乍一看,它可以同时在YANG,Theia和sprotty上工作。与VSCode扩展一样,yang-lsp将在构建期间从相邻目录复制。

核心包是theia-yang扩展:它将YANG特定服务的绑定添加到Theia的DI容器,注册上下文菜单,并为前端设置语法高亮。它还可以在后台启动语言服务器。

身为程序员还不知道?Xtext与LSP让一个语言服务器横扫多个IDE!

The YANG editor in Theia (electron mode)

Eclipse客户端

最后但并非不重要的是,团队将yang-lsp集成到Eclipse中。这里使用lsp4e,允许通用的Eclipse编辑器由语言服务器支持。项目yang-eclipse主要包含适应lsp4e的插件,即

  • 启动yang-lsp,

  • 使用TextMate语法定义语法高亮,以及添加一些漂亮的图标。

请注意,虽然客户端也是在Xtend /Java中编写的,但在单独的进程中使用与上述相同的机制启动语言服务器。

身为程序员还不知道?Xtext与LSP让一个语言服务器横扫多个IDE!

The YANG editor in Eclipse

当然,Xtext也可以生成一个本机Eclipse编辑器,通常会有更多功能和更好的用户体验。此次避免使用这种方法,不仅仅是为了在Eclipse中演示一个LSP,而且还因为不得不使用本机Eclipse API重新实现一些IDE功能,因此需要保留两倍的代码。

tl;dr

本文介绍了在Xtext中实现的单一语言服务器如何将YANG语言的支持添加到四个不同的IDE中。只需要一些IDE特定样板,主要是启动服务器并实现被LSP视为客户端的服务,如语法高亮。

除此之外,对于Emacs,vim和更多的编辑器,以同样的方式来服务这些应该很容易。

推荐阅读