Neovim 新闻稿 #7 - 夏日征程

2016 年 11 月

Neovim 新闻稿发布啦!如果你只想了解新功能,请直接跳到趣味功能部分。同时,我们还做了一些项目管理方面的调整,请务必了解。

什么是 Neovim?

每分钟都会诞生一个新的文本编辑器(来源:Hacker News)。有无数的文本编辑器都能满足“一般需求”。

与其他类似 Vim的文本编辑器不同,Neovim 用户想要的是一个更好的 Vim。Vim 核心包含着数千个细微的决定,这些决定是在几十年间积累起来的。其中大多数决定至今仍然有效,解决了新项目尚未遇到、消化和决定的一些细微问题。

Neovim 对 Vim 进行了重构,使它能够在未来 30 年的开发中依然适用。请查看:help vim-differences,了解更改和改进的参考。

我应该切换吗?

Neovim 非常有意地构建在 Vim 社区长期积累的知识和用户习惯之上。这意味着“从 Vim 切换到 Neovim 仅仅是一个“升级”——就像安装 Vim 的新版本一样。如果你登录到只有 Vim 的服务器或工作站,你不会迷路。如果你找到一篇关于 Vim 的文章,它很可能也适用于 Neovim,除非它与:smile有关。

因此,如果你喜欢 Vim,请尝试 Neovim。如果你热爱 Vim,请尝试这个;)

开发……或者说是纯粹的工程

从一开始,Neovim 的明确目标之一就是

简化维护并鼓励贡献

我们想要一个可定制的 Vim:一个代码库和社区,能够让实验和低成本地尝试新功能成为可能。

事实证明,我们已经朝着这一目标取得了实质性的进展。我们已经成功地执行了重要的“非路线图”补丁:这些功能对它们的作者来说很重要,但对于项目来说并非最高优先级。

这些补丁之所以被纳入,是因为它们

  1. 符合现有的规范/设计
  2. 包含了强大的测试覆盖率(由先进的测试框架和 CI 支持)
  3. 获得了其他贡献者的仔细审查

它们在:help nvim-features中被简单地提及了:)

没有:smile的乐趣?

新的客户端和创新应用的出现频率比以往任何时候都高。

  • NyaoVim 是一个精心设计的、模块化的Electron GUI
    • 它的<neovim-editor> Web 组件可以用于你自己的项目,包括 VS Code、Atom 以及其他 Electron 或 nw.js 项目!
  • ONI 是一个基于 Electron 的Neovim IDE,展示了许多令人兴奋的可能性。它还有一个像 NyaoVim 一样的酷炫 logo:)
  • 用户喜欢deoplete,它是 vim 的第一个非阻塞自动完成插件。
  • @qvacua 将目光转向了nvim,并迅速开发了nvim 的新后端,用于他的著名项目VimR,这是一个为 macOS 打造的精致GUI。在发布页面上提供了为 macOS 10.11 打造的预构建.app 包。
  • 跨平台的neovim-qt GUI 持续改进:它与 gVim 一样快,闪烁更少,而且不依赖 GTK/KDE。
  • neovim.app 是一个 macOS Neovim GUI,可以通过 homebrew 在 macOS 10.9 及更高版本上使用。
  • nvim-hs 是一个主机,用于用 Haskell 编写 Neovim 插件
  • 查看cl-neovim,了解如何编写Neovim Lisp 插件。包含:Lispdo
  • nvr 现在支持 Vim 的“客户端-服务器”选项--servername--remote 等。 nvr非常适合从:terminal 缓冲区与父级nvim 实例进行通信。
  • Intero 用户对感到十分高兴intero.nvimintero-neovim

有针对 go、julia、perl、Java、R、Elixir、Clojure 等等的客户端。访问相关项目维基页面,发现新出现的项目!

项目管理

清晰度和一致性孕育着贡献。 — @robertmeta

有限期限的仁慈独裁者

7 月份,Thiago (@tarruda) 由于个人原因,在项目中的活跃度降低。他希望将来恢复积极贡献。

有些人要求指定“BDFL”。@justinmk 担任了这个角色,除非你想要担任这个角色:我们已经采取措施记录维护者的角色,以便未来任何获得大多数贡献者信任的人都可以接任。

最终目标是尽可能水平地分配任务,并继续向我们信任的人授予“提交权限”。目前有 14 位核心贡献者;我们希望将其扩展到 50 位。我们不希望项目依赖于英雄般的努力,而是希望有许多感兴趣的人在 Vim 社区的规范和礼仪下进行工作。

资金

正在进行的、成功的资金筹集活动产生了libmpack:terminal 以及重大的重构和改进(例如,将 UI 逻辑与 TUI 解耦)。随着 Thiago 在项目中的活跃度降低,资金将可以用于其他开发人员。

@ZyX-I 是 Neovim(贡献了 21 kLOC)和 Vim (13 kLOC,包括if_python)的高产提交者,他同意担任“首席开发人员”一职,即接收资金的开发人员。他在 Neovim 上的工作包括

  • 一流的 XDG 支持、shada、构建时生成器、自动变更感知 linter、Lua 到 VimL 翻译器
  • 关键内部机制,例如msgpackparse()os/fileio.c(缓冲 I/O)
  • Vim JSON 支持的完全重写,包括细粒度的错误消息
  • 对所有上述内容的全面测试覆盖率

资金并不总是由一个人获得。它可以由任何核心贡献者获得,他们想要花一个月或更长时间专注于 Neovim。

捐赠

由于资金是按月支付的,因此(希望)这是一个低摩擦的决定

  • 要捐赠 10 美元,你可以每月认捐 1 美元。
  • 如果这个项目让你感到愤怒,只需取消你的认捐。
  • 如果这个项目让你感到快乐(尽管没有:smile,但不知何故),请继续认捐!

API

Neovim API 是该项目定义性的技术和“软”功能之一。在PR #5535中,我们制定了在不破坏客户端的情况下扩展 API的策略。

  • 我们建立了API 级别的概念,以实现简单的比较并强调 API 版本与 Neovim 版本是分开的。
  • 我们在 API 元数据中添加了版本和弃用字段。
  • 我们永远不会破坏在标记版本中发布的 API 函数签名。
  • 在 Neovim 版本2.0(如果有的话)之前,我们不会删除已弃用的 API 函数。

API 应该只增长,而不是破坏。每个 API 函数都由它首次可用的 API 级别标记。这使得众多 Neovim API 客户端能够支持任何已发布的 Neovim 版本。

PR #4934 以来,你就可以直接从 VimL 调用当前nvim 进程的 API

:echo nvim_buf_get_lines(42, 1, 3, v:false)

尝试在命令行中输入:call nvim_<Tab>,查看可用的 API 函数,或者安装nvim-api-viewer 插件,查看可用的 API 函数的概览。

我们非常重视 API 的可靠性,并且已经仔细考虑了设计。欢迎插件和客户端作者提供反馈!

发布策略

版本控制

一年前,我们宣布了我们的第一个版本0.1。我们已经简化了发布流程(版本控制、标记、变更日志、公告)。

一些用户想知道0.1 是否意味着 Neovim 不稳定。

  • 0.1 以来发布的每个版本都被认为是适用于除 Windows 之外所有系统的稳定版本
    • 0.2 开始,Windows 将成为一个一流的目标平台。
  • 1.0 之前,一些非 API 功能可能会破坏向后兼容性。这种情况并不常见,这些情况总是会记录下来。
  • 0.1.6 中,我们引入了API 版本控制。客户端可以动态地决定使用哪些函数。

我们遵循semver;其中的建议解释了0.x 系列的意图。

OS 包

出现了越来越多的 OS 包。Neovim 是Debian 的下一个版本的一部分!特别感谢@jamessan(Debian 维护者和 Neovim 贡献者)、@fwalch 以及其他为他们喜欢的系统构建包并与我们合作解决不可避免的编译器/平台问题的人。

进展

自 2014 年以来,Neovim 贡献者取得了哪些成就?

保守估计,至少编写了 20,000 行新的 C 代码。除了通过 Vim 自身的测试套件外,我们还编写了 2200 个测试。273 位不同的人员为核心项目做出了贡献。在 3 年内,核心项目 的提交次数超过了 Vim 在 12 年内的提交次数。

除了主要重构和功能工作之外,还投入了大量时间到 Neovim 持续集成 (CI) 系统。在稳定但脆弱的 C 代码库中,维护人员往往会忽略“小”功能,因为它们可能风险太大。CI 减少了脆弱性,因此我们可以欢迎大小功能工作,而不是害怕改变。

可以使用屏幕测试对新功能进行严格测试。例如,以下测试练习了'wildmode' 的 UI 行为

describe("'wildmenu'", function()
  it(':sign <tab> shows wildmenu completions', function()
    execute('set wildmode=full')
    execute('set wildmenu')
    feed(':sign <tab>')
    screen:expect([[
                               |
      ~                        |
      ~                        |
      define  jump  list  >    |
      :sign define^             |
    ]])
  end)
end)

在我们 2014 年从 Vim 分叉后,经历了一段不稳定的时期;这个差距越来越小,将在 2017 年消失。每个回归修复都由集成测试涵盖。每个拉取请求都会针对 12 个不同的环境进行构建。特别感谢@jszakmeister@fwalch@ZyX-I 对构建系统所做的工作,以及感谢@oni-link 修复了一些非常困难的错误。

细节很重要

社交媒体 上获得的最强烈的印象之一是,人们在尝试使用 Neovim 时真的欣赏更少的摩擦默认值很重要。Tim Pope 应该为整理 我们选择的许多默认值 而受到赞扬。

@fmoralesc 和其他人认真思考了如何实现 这些默认值,而不会造成回归(encoding=utf8 和 syntax/filetype 比较棘手)。这项工作很繁琐,但有道理:这是一次性的成本,可以帮助新用户、新系统上的老用户(如今新系统无处不在:VM、容器、服务器...),以及通过传播 Vim 的“最佳实践”来帮助所有用户。

功能

以下是自上次通讯以来的新进展。

  • Ruby 支持已在 0.1.5 中实现。这意味着您可以使用 ruby 编写 Neovim 插件,以及支持传统的 Vim :ruby* 命令(因此现有的 Vim+ruby 插件可以在 Neovim 中使用,例如 Command-t 和 vim-github-dashboard)。
    • 要启用 Ruby 支持,只需使用 gem install neovim。您无需担心针对特定版本进行编译。
  • 使用 Neovim API 的 Go 客户端使用 Go 编写插件!(感谢@garyburd!)
  • :CheckHealth 检测常见问题(例如 Homebrew 的 doctor)。在您安装或升级 Neovim 时运行它。
  • 缓冲区本地突出显示:help api-highlights)类似于 matchaddpos(),但有一些关键区别:它与缓冲区相关联,并适应行插入和删除。对于 linter 或语义突出显示插件很有用,这些插件会监视缓冲区以进行更改并在后台计算突出显示。

外部 UI 小部件

PR #4432 中,@bfredl 迈出了让 UI 对“小部件”的显示有更多控制权 的第一步。 @romgrk 很快做了一个概念验证

很快就出现了一个雄心勃勃的补丁,将命令行、标签、通配符菜单和预览窗口小部件外部化。演示展示了激动人心的潜力

这项工作之所以能够完成,是因为@tarruda 清晰地将终端 UI(TUI)与内部屏幕分离,因此即使是内置的 TUI 也由 UI 事件驱动,就像任何其他外部 UI 一样。

增量(“实时”):substitute

2016 年 5 月,一群由 Eric Burel 指导的学生联系我们,希望为 Neovim 做出贡献。从我们提供的一系列想法中,他们决定为 :substitute 实现“实时预览”。我们在PR #5561 中合并了它,在 0.1.7 中发布。设置 inccommand 选项以尝试使用它

:set inccommand=split

这项功能之所以能够实现,是因为我们的开发模型:尽管没有时间进行副项目,但我们概述了基本思路,学生们在非正式场合做出了决定,我们根据需要提供了澄清。

  • 学生们发布了一个 PR 以便进行持续反馈。PR 分支定期更新,因此审阅者可以拉取、构建和测试。
  • 使用屏幕测试 编写的测试有助于覆盖率/ASan/等测试功能,并帮助审阅者可视化行为
  • 自动构建系统会持续针对 12 个不同的系统运行更改。

Eric 写下了这段经历。感谢 Eric、ENSIMAG 的学生、@KillTheMule 以及 @bfredl 将这项功能发展到我们引以为傲的程度。

即将推出

在 2017 年的 Neovim 0.3 中,期待以下进展。

  • 我们将在 2017 年发布 Lua 作为默认的脚本替代方案。下一个“拐点”是降低风险、快速增强,即使用 Lua 使核心可扩展。对于PR #4411,这是重要的一步。
  • 借助 ZyX 的 eval.c 重构,单片 eval.c 将被分成模块,标志着 Neovim 的 VimL 实现偏离 Vim 的一个点。这将是世界上第二个替代 VimL 实现(ZyX 的 VimL 到 Lua 的 PR 是第一个)。
  • 扩展的标记 将为插件作者提供更强大、更灵活的标记。
  • 我们将仔细研究Microsoft 语言服务器实现,以决定它以及类似的中间件如何与 Neovim 优雅地集成。

EOF

所以这就是 Neovim 的 2016 年。2017 年会是 Neovim 桌面之年吗?

Neovim 的理念正在渗透到其他项目中,例如 Xi 编辑器 和 Vim 本身,它今年的活跃度比其历史上的任何一年都高

在 gitter 和 IRC 频道(由matrix 桥接,感谢@leonerd!)中,到处都是忙碌的身影。访问我们 以讨论该项目。

别忘了,在 neovim.io 上有一个路线图,如果您想了解该项目的未来方向。

感谢您的阅读。

—Justin M. Keyes (@justinmk)


注释1
$ git log --grep='\([zZ]y[xX]\)\|\([nN]ikolai [pP]av\)\|\([nN]ikolay [pP]av\)' --numstat --pretty=tformat: --numstat|gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
added lines: 22590 removed lines: 8620 total lines: 13970

$ git log --grep='[cC]hristian [bB]rab' --numstat --pretty=tformat: --numstat|gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc }'
added lines: 10000 removed lines: 3033 total lines: 6967
注释2
$ ohcount msgpack_rpc/ api/ os/ event/ tui/ shada.c rbuffer.c terminal.c memory.c
c                    79      14576       2863      16.4%       2154      19593

新闻

新闻存档 中查找更多更新。还有一个RSS 提要

什么是 Neovim?

Neovim 是一款基于 Vim 的文本编辑器,专为可扩展性可用性 而设计,以鼓励新的应用程序和贡献

讨论

访问#neovim:matrix.org 或 irc.libera.chat 上的 #neovim 与团队聊天。