Neovim 中文周刊 第 7 期

欢迎收看第 7 期 Neovim 中文周刊!

本期周刊包含以下版块:

  • Neovim 开发近况:摘录近期合并的 PR,以新功能为主
  • 社区资讯:摘录近期更新的 Issue 讨论以及 Reddit 等论坛的热门话题
  • 文章推荐
  • 插件推荐

Neovim 开发近况

feat(defaults): shelltemp=false (#33012)

旨在解决已经挂了十年的 #1008,该提案希望移除 :h shelltemp。启用 shelltemp 时,(Neo)vim 会在执行 shell 命令的时候创建临时文件,然后把 shell 命令的输入输出流重定向到临时文件中,从临时文件里读取命令的输出结果。justinmk 希望能使用 pipe 以提高性能和可靠性,但是 :h shelltemp 文档里有这么一段描述:

The advantage of using a temp file is that the file type and encoding can be detected.

而且根据 #1008 报告,确实存在禁用 shelltemp 后 shell 命令的输出内容的字符编码错误的情景,并怀疑这是 Windows 特有的缺陷。

目前该 PR 仅设置默认禁用 shelltemp,希望先看看 ban 了会出啥岔子。justinmk 表示接下来的目标是

  • 找出 Vim 在使用临时文件时进行字符编码检测的代码并重构
  • 由于 Filter{Read,Write}{Pre,Post} 事件仅在启用 shelltemp 时生效,所以如果后续彻底移除 shelltemp 那这些事件也可以下线了

Neovim 团队还发了条推特,希望能获取 Windows 用户的反馈。

feat(ui): include compositor info with multigrid (#31837)

:h ui-multigrid 协议新增合成器的信息。该 PR 由 Neovide 开发者 fredizzimo 发起,fredizzimo 在 #30586 提案中报告称 Neovim 使用一个内部的合成器来决定具有相同 zindex 的窗口的绘制顺序,许多插件都依靠这个合成器的事实标准来设计 UI,因此由于此前 Neovim 的 UI 协议不公开这个合成器的信息,导致像 Neovide 这样的 GUI 客户端难以实现与 TUI 一致的渲染效果,导致插件的 UI 渲染不正确。

fredizzimo 在该 PR 以及关联的 #30586、#30581#24801 中与 Neovim 团队以及 gnvim 作者就此次 UI 协议的扩展展开了激烈的讨论,感兴趣的读者可以查看。

vim-patch:9.1.1307: make syntax does not reliably detect different flavors (#33498)

增强 Makefile 风格的检测,现在支持检测 BSD、GNU 和 Microsoft 三种风格。原本仅对 Microsoft 风格进行了检测,这导致 ifeqwildcard 等 GNU 扩展功能在 BSDmakefile 里被错误地高亮。

改进后的检测步骤为

  1. 检查文件名。像 BSDmakefileGNUmakefile 这种就可以不用往下看了
  2. 检查用户设置。原先用户可以设置 let g:make_microsoft = 1 来显示地要求 Microsoft 风格,该 PR 合并后,该全局变量被弃用,用户可以将 g:make_flavor 分别设置为 bsd|gnu|microsoft 来强制要求某一风格。
  3. 最后用 regex 去匹配各个风格特有的关键字

社区资讯

Replace or remove unibilium (LGPLv3 dependency) (#31989)

该提案希望替换掉 Neovim 当前使用的 terminfo 解析库 unibilium,这个需求最早是在 #31966 提出,setjmp 指出 unibilium 是 Neovim 仓库中唯一的 LGPLv3 依赖,某些对开源许可要求比较严格的企业不允许 LGPLv3 软件的使用。

jamessan 指出只有贡献给 Neovim 的代码是以 Apache-2.0 协议授权的,所有来自 Vim 的代码依然以 :h license 授权。justinmk 补充 Vim 8.1 的代码库里包含了 xdiff,它的开源许可协议是 LGPL,但不是 v3。

eestrada 指出在 Neovim fork 之前 unibilium 只有 5 个贡献者,最简单的方法就是争取这些贡献者同意将 unibilium 重新授权新的许可协议。justinmk 非常乐观地期待 unibilium 作者 mauke 将会同意重新授权,mauke 表示为啥我要重新授权呢(尬住),eestrada 列举了一些重新授权(更宽松的许可)可能带来的收益,但截止至本期发布之前 mauke 没有公开回应这个话题。

仅从 #31966 的讨论来看似乎社区不是特别在意许可协议是否会阻碍企业使用,不过 justinmk 很希望能使用更加适合 Neovim 的许可协议的程序库,#31989 目前也 assign 给了 justinmk,Milestone 被定为 backlog,即优先级很低。

I am making a simple guide on modifying Neovim's UI using lua. Does this pique your interest?

markview.nvim 的作者计划推出一个使用 Lua 定制 Neovim 的 UI 的教程,并制作了一个教学用的示例插件 ui.nvim,目前该插件和教程还未完成,这条讨论更多的是一次意见征询,但也足够振奋人心。

nvim-lspconfig has now migrated to use the new vim.lsp.config

nvim-lspconfig#3659 合并以后,现在 nvim-lspconfig 已经迁移至 :h vim.lsp.config。值得注意的是仍有部分 language server 不支持使用 vim.lsp.config,您可以查看 nvim-lspconfig#3705 了解完整列表。不支持的原因是它们

  • 需要 on_new_config 字段,目前 vim.lsp.config 还不支持,#32287 提案正在跟进这部分工作
  • 或者需要 single_file_support = false#31824 通过引入 workspace_required 字段可以解决,但该功能在当前版本不可用,将在 0.11.1 发布

此外,社区抱怨现在使用 vim.lsp.config 配置相比起使用 nvim-lspconfig 还是很繁琐,像 root_markers 这样常规的字段应该在 Neovim 核心中设置一个合理的默认值,而不是像现在这样需要为每个 language server 都设置一遍。justinmk 表示计划将 nvim-lspconfig 中最常见的若干个配置 upstream 到 Neovim 核心中。

Seeking bounty hunters for cursortab.nvim! $1k of bounties for 3 issues

cursortab.nvim 是一个逆向了 Cursor 的 API 的 AI 辅助插件,最近作者发布了三条 Issue,并为它们设置了共计 1000 美元的奖金,希望贡献者能帮助他们完成开发。作者声称他们希望尽快完善该插件的功能,但是没有足够的时间。

目前 S1M0N38 已赢得 500 美元的奖金。

Talk with HiPhish (Neovim Plugin Creator) | rainbow-delimiters.nvim

采访 rainbow-delimiters.nvim 的作者 HiPhish,在访谈中分享了有关 rainbow-delimiters.nvim 的资讯,以及 HiPhish 本人的工作流(操作系统、插件管理等)。

Are there any plans to make a native DAP client?

省流:没有!#11732 提案请求 DAP 支持,它仍然开放,但是自 Neovim 核心开发者 mfussenegger 留言发布了 nvim-dap 后该提案就不再有任何进展。此外,justinmk 也表示 nvim-dap 的实现很优秀,假如 Neovim 团队哪天希望将 DAP 集成进 Neovim 的话,他们会直接将该插件迁移进核心。

frodo_swaggins233 表示 DAP 似乎比 LSP 小众得多,保持作为插件实现更好,遭到不少社区成员的反对,BrianHuster 锐评感觉不如 :h package-termdebug 小众(笑)。

文章推荐

A Better Man Page Viewer

省流:

export MANPAGER='nvim +Man!'

使用 Neovim 作为 MANPAGER 的好处是

  • 更好的语法高亮
  • K 可以直接跳转对应的手册页
  • gO 可以打开目录

Learning Fennel from Scratch to Develop Neovim Plugins

记录了作者使用 Fennel ——一种能编译到 Lua 的 Lisp ——来开发 Neovim 插件的心路历程和踩雷过程。

插件推荐

obsidian.nvim

为喜欢 Obsidian 的概念但同时又过于热爱 Neovim 而不愿在其他任何地方打字的人而构建。

这是 epwalsh/obsidian.nvim 的社区 fork

原项目已经有一段时间没有积极维护了,随着 Neovim 生态系统的不断变化,blink.cmpsnacks.picker 等广泛使用的新工具没有得到支持。随着堆积的 Bug、Issue 和 PR 越来越多,社区决定 fork 并维护该项目。这个 fork 旨尽量贴合原项目,同时修复错误,合并有用的改进,并确保长期的稳定性。

可以查看维护者在 Reddit 的公告了解该社区 fork 已实现了哪些新功能以及未来的计划。

obsidian.nvim demo

editable-term.nvim

此插件允许您像编辑常规 buffer 一样编辑终端提示符。 几乎所有操作都支持(除了 undo/redo 和 replace mode),甚至包括插件提供的操作,例如 nvim-surroundds

editable-term.nvim demo

VimMotions

这个 Chrome 扩展为各种文本输入元素(如标准文本框、contenteditable 字段和基于 virtual DOM 的文本框(如 Google Docs、VS Code 等))提供类似 Vim 的快捷键,用于导航和编辑文本。目前处于 alpha 阶段,此扩展旨在为基于 Web 的文本输入字段带来熟悉且高效的文本编辑体验。

插件,但是是浏览器插件。和热门插件 vimium 相比,vimium 侧重于网页的浏览,这个插件侧重于在文本框输入的时候使用 Vim 的按键操作,目标类似于 firenvim ,但不是 firenvim 那样通过将浏览器实现为 Neovim GUI 的方式实现的。

目前该插件仍处于 alpha 阶段,我试用了一下,确实是未来可期(高情商)。

另外我原以为 Vim 相关的浏览器插件不多,但是逛了一下 VimMotions 在 Reddit 的发布帖子发现其实也不算少了,除了上面提及的插件,还有

关于

那么,一如既往,希望本期周刊能对您有所裨益,感谢您的阅读。

  • 周刊项目地址 | RSS 订阅
  • 我不是 Neovim 贡献者,也不是任何有影响力的插件贡献者,甚至算不上一个 (Neo)vim 老手,我的观点很可能错漏百出。如果您希望贡献本周刊,请收下我的感谢并查看贡献指南
  • 发布日期:2025-04-19 修订日期:2025-04-19