LWN: Neovim 0.5 中的新功能!

Neovim 0.5版本发布,引入原生支持语言服务器协议(LSP),改进Lua API,以及使用Tree-sitter提升语法高亮。LSP使高级编辑功能得以实现,Lua集成旨在提高可扩展性和易用性,Tree-sitter提供了更高效的语法分析。这些改进将使现有用户满意,并可能吸引更多新用户和贡献者。
摘要由CSDN通过智能技术生成

关注了就能看到更多这么棒的文章哦~

New features in Neovim 0.5

August 3, 2021
This article was contributed by Ayooluwa Isaiah
DeepL assisted translation
https://lwn.net/Articles/864712/

Neovim 0.5 是 Neovim 编辑器的第五个 major release 版本。Neovim 是由历史悠久的 vi 编辑器的 Vim 这一支演变而来,于今年 7 月 2 日正式发布了这个新版本。这是近两年工作的结晶,带有一些重要功能,旨在让编辑体验可以大幅现代化。其亮点包括原生支持了语言服务器协议(LSP),这样一来针对各种语言的高级编辑功能都可以用起来了;改进了用于配置和插件开发的 Lua API ;以及使用了 Tree-sitter 来更好地进行语法高亮。总的来说,0.5 版本是这个编辑器的一个重要升级版,这些改进应该会让现有的粉丝们满意,并有可能会吸引到新的用户和贡献者加入这个项目。

Neovim 项目是由 Thiago Padilha 在 2014 年启动的,当时他为 Vim 开发的多线程功能的 patch 在没有太多反馈的情况下就被拒绝了。导致 Padilha 创建这个 fork 分支的主要原因就是这一点,他的明确的目标是改善 Vim 的可用性、可维护性和可扩展性,同时促进一个更加开放和欢迎新人的社区。

A built-in LSP client

语言服务器协议(LSP,Language Server Protocol)是一个开源规范,目的是让各种不同的源代码编辑器和集成开发环境(IDE)中的编程语言相关的功能能更加标准化。它促进了代码编辑工具(客户端)和本地运行的语言服务器(language server)之间的通信,从而针对特定语言提供各种智能辅助功能,如自动补全、查找替换、跳转到定义位置、诊断分析和帮助重构的功能。

在开发 LSP 之前,每个 IDE 或者文本编辑器都需要针对目标的编程语言来实现支持,要么直接写在代码中,要么通过它的扩展功能,这就导致了不同语言和编辑器的组合所支持的功能变的差异很大。LSP 标准使得语言服务器与编辑器可以脱钩,成为了一个独立的部分,这样一来负责语言定义的社区就可以集中精力建立一个对某种语言有深刻理解的单一服务端版本。然后其他工具只需要能跟这个现有的语言服务端程序集成起来,就可以针对这个编程语言提供高级功能了。

虽然在第三方插件的帮助下已经可以在 Neovim 中使用 LSP,但 0.5 版本是第一次为 Neovim 的 LSP 增加了原生支持。在 Neovim 中引入 LSP 后,编辑器就可以作为一个客户端,将用户的操作(如执行 "go-to-definition" 命令)通知到语言服务器,服务器端会用回复相关信息,也许是光标位置的符号相关定义位置。这样一来编辑器就能够跳转到文件或项目中的指定位置了。

Neovim LSP 客户端提供的接口是一个通用接口,所以它不支持第三方 LSP 插件中的全部功能(如自动补全功能)。不过,它是为了更好的可扩展性而建立的,所以它包括了一个 Lua framework,这样一来插件就可以增加当前 Neovim core 尚未支持的功能了。为编辑器设置独立的语言服务器,只要调用 nvim-lspconfig 插件就可以,它会帮助启动和初始化当前安装在系统上的 language server 程序。注意,语言服务器不是由 Neovim 或 nvim-lspconfig 提供的,它们必须先单独安装好。nvim-lspconfig 插件支持的 LSP 服务器有很多,列表请查官方网站。

Lua integration

Neovim 最初支持 Lua 编程语言的版本是 2017 年的 0.2.1 版本。此后,在编辑器中 Lua 支持功能得到了持续的演进和更深入的整合集成。最值得一提的是,在 2019 年的 0.4 版本中增加了 Neovim 的 Lua 标准库。Neovim 开发者期望 Lua 成为编辑器中脚本语言的头等公民,从而变成 VimL 脚本语言(继承自 Vim 的脚本语言)的替代方案。Neovim 0.5 改进了 Lua API,增加了 init.lua 替代了 init.vim 用来配置编辑器,向实现这一目标迈出了一大步。

至于为什么决定在 Neovim 中深度集成 Lua,可以听一下项目首席维护者 Justin M. Keyes 的演讲视频。总之,Lua 是一种比 VimL 更容易上手的语言,主要得益于它很简单、且易于集成。它的运行速度也比 VimL 快一个数量级。Neovim 支持 2006 年发布的 Lua 5.1,而不是最新的 Lua 版本(如 5.3 或 5.4,分别发布于 2015 年和 2020 年),这主要是因为 LuaJIT 只支持 Lua 5.1。之所以要保持兼容 LuaJIT,主要是因为它相对于标准 Lua 编译器具有显著的性能优势。

在 Neovim 中加入 Lua 使得人们可以更加容易地扩展编辑器功能,以及对核心代码进行贡献,特别是那些被 VimL 挡住的用户受益更多,因为 VimL 在 Vim 之外完全没有什么地方使用。由于 Lua 也被大量用于编写 video game 脚本,以及用来扩展各种其他语言(C、C++、Java 等)编写的程序,因此有大量的资源可供学习这种语言之用,同时还有一些例子详细介绍了如何使用它与其他语言的 API 交互。这些关于 Lua 的丰富信息,使得新的插件作者和有志于投入 Neovim 开发的贡献者们可以迅速掌握这种语言。

Neovim 中对 Lua 的支持,使得它成为了 Neovim 后续新功能开发以及提供对外接口的首选语言,如 LSP 客户端,要想使用这些 API 就只能用 Lua 来完成,因为 VimL 无法与之交互。然而,Neovim 中的 VimL 支持并没有消失,Neovim 开发者也没有计划要废除它,所以目前将现有的 init.vim 配置迁移到 init.lua 的工作以及将移植 VimL 插件移植到 Lua 的工作,在目前来说都仅仅是个可选项而已,并不是必须要做这些事。唯一需要注意的是,在 init.vim 配置或 VimL 插件中使用这些 Neovim API(如 LSP 或 Tree-sitter)就只能通过在现有的 VimL 代码中嵌入一些 Lua 小代码来实现了。

尽管 Lua 更深入的集成是被看作是 0.5 版本的主要成就之一,但并非所有人都赞同在编辑器核心中推动 Lua 来取代 VimL。有一些人担心,对 Lua APIs 和 Lua 插件的强调会导致插件社区的分裂,越来越多的插件将只支持 Neovim(也就是无法同时支持 Vim 和 Neovim 了)。另外,Vim 创建者 Bram Moolenaar 和其他 Vim 贡献者正在积极开发一个改进版的、不能完全实现向后兼容的 VimL 版本(目前被称为 Vim9)。目前还不完全清楚 Neovim 的维护者是否计划支持 Vim9,因为他们对 Lua 这方面的投入更多一些。在写这篇文章的时候,已经有几个 Lua 插件只能在 Neovim 中使用了,还有一些 Vim9 插件则只能在 Vim 中使用。因此很容易预测到,这两个项目的生态系统在不久之后将可能会出现大量的差异化,毕竟目前还没有计划将类似的 Lua 功能加入 Vim 中。

Tree-sitter

Tree-sitter 是一个新实现的解析系统(parsing system),旨在取代当前的开发工具中普遍使用的、功能有限的、基于正则表达式的代码分析功能。Tree-sitter 是一个高性能的解析器生成器(parser generator),可以生成 parser,针对源文件生成一个相应的增量语法树(incremental syntax tree),并且可以在文件被编辑的时候高效实时更新这个语法树。在 Neovim 0.5 中,对 Tree-sitter 的支持已被添加到编辑器的核心中,尽管由于一些已知的错误和大文件的性能问题,它目前被归类为实验性。预计它将在下一个主要版本(0.6)中变得稳定,从过去的版本来看,应该是在一两年内。

在 Neovim 中使用 Tree-sitter 就使得编辑器更好地理解源文件中的代码,将其按照这个编程语言中的 structure(如变量、函数、类型、关键字等)生成语法树,并使用这些信息来对这些结构统一进行处理,保持一致性。如果针对当前语言,安装好了一个 Tree-sitter 分析器并启用,那么编辑器的语法高亮功能就会完全基于它所提供的语法树来实现了。这样一来就可以改进各种文字标记和颜色,从而能更清楚地勾勒出代码结构。特别是 object field, function name, keyword, type, variable 等在整个文件中的高亮显示方式将更加一致。

Tree-sitter 还能够进行增量解析,在编辑代码的过程中实时保持更新语法树。这样一来就不再需要为了在修改后能更新语法高亮而重新 parse 整个文件的做法了,目前基于正则表达式的代码高亮功能就是这么实现的。因此解析速度就可以显著提高了。

因为 Tree-sitter 改进了语法高亮功能,所以得到很多赞誉,比起编辑器中默认提供的功能来说,它能更好地定义出语言感知文本对象(language-aware text objects),从而更加适合代码开发工作。nvim-treesitter-textobjects module 可以为类、函数、参数、条件等创建 text object,对这些 object 的操作就像编辑单词或句子一样容易了。基于 Tree-sitter 的高亮显示的若干例子可以在 nvim-treesitter 仓库的 gallery 中看到。

Wrapping up

上述功能就是这个版本的主要更新了,当然 Neovim 0.5 还包括了对用户界面的不少改进以及 bug fix,以及一些更加小的功能,比如支持了在 Unix 平台上用 Perl 5.22+ 编写的 remote plugin。值得一提的是,在这个版本中还合并了大约 1000 个 Vim patch,对此编辑器的各个环节都有改动。完整的改动、fix 和改进的列表可以从 release note 里面看到。

Neovim 项目使用 GitHub issue 来跟踪所有的功能和 bug,因此要想进一步了解进入这个版本的改动的话,可以查看 github 上 0.5 milestone 中已关闭问题列表。后续版本的计划详见 project 的 roadmap 页面,而优先级则可以通过查看 GitHub 的 milestonen 页面来了解。当然,非常欢迎来自社区的贡献,可以通过 Gitter、Matrix 或 irc.libera.chat 上的 #neovim 聊天室联系到项目的维护者。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值