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:一个代码库和社区,能够让实验和低成本地尝试新功能成为可能。
事实证明,我们已经朝着这一目标取得了实质性的进展。我们已经成功地执行了重要的“非路线图”补丁:这些功能对它们的作者来说很重要,但对于项目来说并非最高优先级。
:tchdir
支持标签本地“工作目录”'statusline'
支持无限对齐部分(PR #4489)man.vim
提供了自动完成、改进的高亮显示等功能这些补丁之所以被纳入,是因为它们
它们在:help nvim-features
中被简单地提及了:)
:smile
的乐趣?新的客户端和创新应用的出现频率比以往任何时候都高。
<neovim-editor>
Web 组件可以用于你自己的项目,包括 VS Code、Atom 以及其他 Electron 或 nw.js 项目!nvim
,并迅速开发了nvim
的新后端,用于他的著名项目VimR,这是一个为 macOS 打造的精致GUI。在发布页面上提供了为 macOS 10.11 打造的预构建.app
包。:Lispdo
!--servername
、--remote
等。 nvr
非常适合从:terminal
缓冲区与父级nvim
实例进行通信。有针对 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 上的工作包括
msgpackparse()
和os/fileio.c
(缓冲 I/O)资金并不总是由一个人获得。它可以由任何核心贡献者获得,他们想要花一个月或更长时间专注于 Neovim。
由于资金是按月支付的,因此(希望)这是一个低摩擦的决定
:smile
,但不知何故),请继续认捐!Neovim API 是该项目定义性的技术和“软”功能之一。在PR #5535中,我们制定了在不破坏客户端的情况下扩展 API的策略。
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 包。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*
命令(因此现有的 Vim+ruby 插件可以在 Neovim 中使用,例如 Command-t 和 vim-github-dashboard)。gem install neovim
。您无需担心针对特定版本进行编译。:CheckHealth
检测常见问题(例如 Homebrew 的 doctor
)。在您安装或升级 Neovim 时运行它。:help api-highlights
)类似于 matchaddpos()
,但有一些关键区别:它与缓冲区相关联,并适应行插入和删除。对于 linter 或语义突出显示插件很有用,这些插件会监视缓冲区以进行更改并在后台计算突出显示。在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
这项功能之所以能够实现,是因为我们的开发模型:尽管没有时间进行副项目,但我们概述了基本思路,学生们在非正式场合做出了决定,我们根据需要提供了澄清。
Eric 写下了这段经历。感谢 Eric、ENSIMAG 的学生、@KillTheMule 以及 @bfredl 将这项功能发展到我们引以为傲的程度。
在 2017 年的 Neovim 0.3
中,期待以下进展。
eval.c
将被分成模块,标志着 Neovim 的 VimL 实现偏离 Vim 的一个点。这将是世界上第二个替代 VimL 实现(ZyX 的 VimL 到 Lua 的 PR 是第一个)。所以这就是 Neovim 的 2016 年。2017 年会是 Neovim 桌面之年吗?
Neovim 的理念正在渗透到其他项目中,例如 Xi 编辑器 和 Vim 本身,它今年的活跃度比其历史上的任何一年都高。
在 gitter 和 IRC 频道(由matrix 桥接,感谢@leonerd!)中,到处都是忙碌的身影。访问我们 以讨论该项目。
别忘了,在 neovim.io 上有一个路线图,如果您想了解该项目的未来方向。
感谢您的阅读。
—Justin M. Keyes (@justinmk)
$ 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
$ ohcount msgpack_rpc/ api/ os/ event/ tui/ shada.c rbuffer.c terminal.c memory.c
c 79 14576 2863 16.4% 2154 19593
Neovim 是一款基于 Vim 的文本编辑器,专为可扩展性 和可用性 而设计,以鼓励新的应用程序和贡献。
访问#neovim:matrix.org 或 irc.libera.chat 上的 #neovim 与团队聊天。