欢迎来到 Neovim 的第六期新闻简报,这是一个旨在通过添加 新功能 来改进 Vim 并将其包装在一个漂亮、现代的面孔中的项目。
嗨,我是 @tarruda,我将在本期新闻简报中直接与 Neovim 社区进行交流。除此之外,我会尽力保持与之前 @jdavis 一样的结构。让我们开始吧!
Neovim 现在有了它的第一个公开版本!
几个月前,@justinmk 创建了 0.1 里程碑,这极大地帮助我们专注于更紧急的任务,从而导致了第一个版本的发布。我们计划了许多 0.1 版本中尚未提供的功能,但决定将它们推迟到未来的里程碑,这些里程碑将在本期新闻简报之后更加频繁。
这说明了 Neovim 从现在开始将采用的路径:与其准备需要很长时间才能实现的大型版本,我们将专注于更小、更频繁、更稳定的版本。
0.1 版本基本上只是一个标签,供用户在版本中编译 Neovim,该版本具有最低的稳定性水平,但未来的版本也可能包含预编译的二进制文件,甚至安装程序(当 Windows 正式支持时)。
Neovim 0.1.0 和 0.1.1 已经在 发布页面 中提供,并且可以用于 Homebrew/Linuxbrew 和 Arch Linux。查看 Neovim Wiki 上的安装页面,了解安装 Neovim 的更多可能性(尽管在撰写本文时,大多数安装将安装 Neovim 的最新开发版本而不是 0.1.x 版本)。
对于那些更喜欢(或需要)从 git 手动编译的人,构建说明 仍然像往常一样有效。
对于那些还不知道的人,Bountysource 推出了一个新平台,允许开源项目获得可持续的众筹。这个平台方便地称为 “salt”,Neovim 是首批使用它的项目之一。
第一次活动 非常成功,筹集了大约 35,000 美元,这使我能够全职工作在 Neovim 上大约 6 个月。我对这个项目非常热情,无法在那些月中完成所有目标,因此我继续将我大部分时间投入到 Neovim 上,以至于它开始损害我的个人和职业生活。这种情况一直持续到 2 月,我发现我无法再以我过去的速度继续下去。大约在那时,@rappo 邀请我测试 salt 平台的测试版,我把它看作是继续我在 Neovim 上工作的途径。
与它的前身一样,盐分活动 非常成功,使我能够在过去 8 个月内继续对 Neovim 做出贡献(以健康的方式),感谢您!
我们有没有提到从源代码构建和安装 Neovim 有多么容易?虽然它有很多依赖项,但构建系统会自动下载和构建所有内容,而不会弄乱您的系统。查看 Neovim Wiki 上的安装页面,了解确切的步骤。
Neovim 现在遵循 XDG 目录规范。这在项目开始时由 @ZyX-I 提出,但直到几个月前我们才收到来自 @Yamakaky 的 PR,该 PR 被 @jck 在 之后的 PR 中取代,然后又被 @ZyX-I 在 最终的 PR 中取代,该 PR 最近被合并。
由于遵循了 XDG 目录规范,Neovim 现在在 ~/.config
目录中查找用户配置文件,例如 .nvimrc
和 ~/.nvim
下的配置文件,这可以通过 $XDG_CONFIG_HOME
环境变量覆盖。该规范还指出,缓存文件应存储在单独的目录 (~/.local/share
) 中,这是 viminfo(现在是 ShaDa)或备份/交换文件可以选择去的地方。
此更改使用户可以更轻松地备份和管理其配置,因为它将与其他也遵循该规范的程序一起存储,更不用说它使主目录更干净。
有关如何迁移现有配置的分步说明可以在 :h nvim-from-vim 中找到。
@ZyX-I 的 主要 ShaDa PR 已合并。它完全替换了 viminfo 文件以存储用户数据,例如寄存器内容、命令历史记录、变量、跳转列表等等。
viminfo 的一个 已知问题 是,两个同时运行的 Vim 实例会互相覆盖对方的数据。ShaDa 是由 @ZyX-I 创建的一种新的存储格式,它不仅解决了这个问题,而且还为 Neovim 带来了许多增强功能
cat 1.shada 2.shada > joined.shada
,Neovim 将在读取时正确处理此操作”。虽然 PR 非常大,但 @ZyX-I 已经小心地添加了很好的测试覆盖率。做得太好了,@ZyX-I!
这不是什么秘密,libuv 是 Neovim 使用的事件循环库,它使我们能够轻松地实现需要与编辑器进行异步通信(不是由用户发起的)的功能。不幸的是,由于 Neovim 代码的当前组织方式,集成 libuv 并非易事。
基本思想是,Neovim 在轮询用户输入时接收任意事件,但这些事件无法立即处理,因为 Neovim 可能处于无法处理任意操作的状态。因此,如果 Neovim 在检查用户输入时收到一个事件,它会将该事件放入队列中以供以后处理。
以下场景就是一个例子:Neovim 检查用户是否在正则表达式引擎执行时键入了 ctrl+c,但它无法处理收到的事件,因为它可能想要执行调用正则表达式引擎的 vimscript,而该引擎不是可重入的,因为它严重依赖于全局变量。因此,它必须推迟事件,直到安全为止,而确定何时安全处理事件本身就是另一个问题。
与 libuv 集成带来的另一个复杂之处是,有时 Neovim 只能处理来自特定来源的事件。例如,当 Neovim 正在发送 msgpack-rpc 调用时,它应该只处理来自
为了允许这种选择性事件处理,Neovim 必须维护多个队列,这些队列相互集成,而执行此操作的逻辑非常重复。在我的一个 最新的 PR 中,一些 libuv“类”以一种使管理这些队列更容易的方式被包装起来。
jemalloc 现在是默认使用的通用高性能内存分配器。由于 Neovim 在其内部循环中大量使用了动态队列(见上文),因此 malloc(3)
的调用次数比 Vim 多得多,因此使用在各个平台上都具有稳定性能的快速实现非常重要。
在最近的一个 PR 中,@fmoralesc 修改了我们的构建系统使用的 jemalloc 版本,以针对 jemalloc 4.0,它带来了更多性能增强并添加了对更多平台的支持。
我们现在使用 Travis 基于容器的基础设施 来运行 Neovim 构建,这使得 CI 构建能够立即开始。这是由 @fwalch 实现 的,他还对我们的构建基础设施进行了许多其他改进,允许开发人员在提交 PR 时收到更快的反馈。
@jszakmeister 在他自己的基础设施中运行了一个 快速构建 服务器。这为我们提供了一个备份 CI,它对 Neovim PR 进行双重检查,也在 FreeBSD 上运行测试,而 FreeBSD 不在 travis 的覆盖范围内。感谢您提高了 Neovim 的稳健性,@jszakmeister!
您知道有一个替代 syntastic 的插件,它利用了 Neovim 的异步功能吗?Neomake 是 Neovim 上用于语法检查的最佳插件:它像 syntastic 一样可扩展,并且它使用 作业控制 使其能够在后台执行检查,而不会阻塞用户界面。这对编译速度较慢的语言(typescript、java、.NET)非常有用。
从 syntastic 迁移也非常简单,做得太好了,@benekastah!
fzf 是一款命令行模糊查找器,由于它的作者(@junegunn,也就是 vim-plug 的开发者),通过一个使用我们 内置终端模拟器 的插件,对 Neovim 具有出色的支持。
FZF 是 ctrlp 等插件的绝佳替代方案:它非常快,并且具有在另一个进程中运行的优势,可以利用多核系统,并且不会阻塞 Neovim 用户界面。要查看它的速度和响应能力,只需尝试运行 :FZF
以在 linux 源代码树中搜索文件!
除了 fzf 之外,用户还鼓励安装 fzf.vim,这是一个插件,它公开了一些非常有用的命令,这些命令是在 fzf 之上实现的。
@Shougo 创建了 deoplete.nvim,这是一个异步代码补全引擎,以 远程插件 的形式编写,它利用 Neovim 的异步功能,使代码补全的计算不会阻塞用户界面。他决定从头开始编写一个新的插件,因为 Neovim 不支持 neocomplete 所需的 lua 接口。 @Shougo 是 Vim 插件的大师,这里列出了他之前的一些作品
社区可以期待 deoplete.nvim 带来的美好未来!
(最近 @Shougo 发布了一份 幻灯片 解释 deoplete 背后的理念。)
Neoterm 是一个插件,用于在 终端窗口 中轻松运行测试。它由 @kassio 编写,支持以下测试库
非常棒 @kassio!
Neovim 是一款基于 Vim 的文本编辑器,旨在实现 可扩展性 和 可用性,以鼓励新的应用程序和 贡献。
访问 #neovim:matrix.org 或 irc.libera.chat 上的 #neovim 与团队聊天。