Neovim 中文周刊 第 5 期

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

本期周刊包含以下版块:

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

Neovim 开发近况

feat(checkhealth): use emoji for OK/WARN/ERROR (#33172)

效果如下:

checkhealth emoji

vim-patch:9.1.{1250,1255,1257}: 'pummaxwidth' (#33114)

原有的选项 pumwidth 只能用于设置 popup menu 的最小宽度,新增选项 pummaxwidth 用于设置其最大宽度。此外,如果 popup menu 条目因为 pummaxwidth 而被截断,将在该条目末尾显示省略号,太经典了(笑)。

原本开发者的想法是让 pumwidth 支持 pumwidth=min:xx,max:xx 的形式,但是出于向后兼容性的考量维护者拒绝了该方案。

justinmk 表示为啥 pumheight 指定最大高度而 pumwidth 是最小宽度……

feat(lsp): add workspace_required to lsp.config (#31824)

vim.lsp.ClientConfig 新增字段 workspace_required,用于控制在没有工作区时是否启动 language server,类似于 nvim-lspconfig 里的 single_file_support考虑到 nvim-lspconfig 里大部分的配置都是 single_file_support = trueworkspace_required 默认为 false

该 PR 旨在解决 #31762 报告称许多 language servers 在没有工作区的情况也能启动,但是基本没啥用还不如不要启动。

起初 PR 作者计划沿用 nvim-lspconfig 的 single_file_support,但是这一命名被 justinmk 拒绝,理由是首先 support 这个词很多余,其次意图表达不准确,这样的命名往往表达的是希望启用 XXX 功能,但是 vim.lsp.config 本来就有 single-file 支持,添加这一字段的动机是希望禁用该功能,因此类似 no_workspace 这样的命名更合适。

feat(editor): 'autowriteall' on SIGHUP/SIGQUIT (#32843)

autowriteall 将在 Neovim 收到致命信号后自动写入。过往 autowriteall 在 Neovim 退出时会自动写入,但仅限于用户显式地 :quit 等正常退出时。该 PR 旨在解决 #29411,该提案的使用场景是在使用桌面环境的快捷键关闭窗口时,这些快捷键将使用 SIGHUP 来让 Neovim 退出。

在 Neovim 中致命信号包括 SIGTERMSIGQUITSIGHUP,其中 SIGTERM 将被 autowriteall 忽略。此外,该 PR 错误地将 SIGTSTP 归类到致命信号中,导致 <C-z> 挂起时 Neovim 尝试退出而崩溃,该问题已经在 #33258 中修复。总结一下就是现在设置了 autowriteall 后 Neovim 在收到 SIGHUPSIGQUITSIGTSTP 时将自动写入。

feat(float): add bold style for border (#33189)

winborder 添加新样式 bold,创意源自 #33178,效果如下:

bold border

feat(clipboard): support string shortcuts for all builtin clipboard providers (#33235)

为所有 Neovim 支持的剪切板工具(:h clipboard-tool)添加一键启用,例如 vim.g.clipboard = "tmux"

feat(vim.hl): allow multiple timed highlights simultaneously (#33283)

#32012 引入后 vim.hl.range 支持 timeout 选项设置高亮的显示时间,超时将自动清除高亮,但是全局只支持单个具有超时功能的高亮,在设置新的超时高亮时上一个超时高亮将立刻被清除。该 PR 引入后,可拥有多个超时高亮,设置新的超时高亮不会清除上一个。vim.hl.range 将在设置了 timeout 后返回一个 uv.uv_timer_t 和一个函数,前者可用于追踪该高亮还有多久超时,后者可用于手动清除该高亮。

社区资讯

feat: emacs-lisp (#33242)

altermo 在 2025-04-01 提交的 Draft PR,为 Neovim 添加了 Lua 实现的 elisp 解释器,目标是实现在 Neovim 中使用 Emacs 插件,兼容 Emacs 29.4。该 PR 基本上是将作者的 nelisp 移植到 Neovim 核心中。

由于实在是过于重量级,clason 都要怀疑这是不是一个精心策划的愚人节玩笑,并表示目前看来这部分工作没有必要移植到 Neovim 里,应该作为一个插件即可。

在 PR 提交的第二天作者就关闭了该 PR ——我没有找到任何公开的解释——并留言可以关注他们的 nelisp 项目,此外,作者现在正在使用 C 重写这部分工作以提高性能。

Yeah, neovim is a great OS that lacks a decent text editor. Wait, what?

Vim Challenges

typecraft 的 Vim Challenges 在本周正式开始。该活动计划每周推出一道题目,要求使用尽可能少的按键完成任务,经常打高尔夫的朋友应该不陌生。

该网站会嵌入一个 Vim 实例,在里面会计时并统计挑战者的按键,具体效果可以查看他的视频。注意你的手速也很重要,此外每个用户只有一次成功挑战的机会,即当你成功完成挑战后就不能再继续刷分了。在你完成挑战后,网站还会根据你的答案生成评价和建议。

本周的题目是给一段日志文本,要求将其中以 DEBUGERROR 开头的行删掉,并在剩余的每一行之间添加空行,示例如下:

INFO 2024-04-01 10:00:00 Starting process
DEBUG pid=4837 user=admin
ERROR 2024-04-01 10:00:02 failed to connect to database
TRACE connection timeout after 5000ms
DEBUG retrying connection...
INFO 2024-04-01 10:00:05 Connection successful
DEBUG pid=4837 user=admin

期望改成

INFO 2024-04-01 10:00:00 Starting process

ERROR 2024-04-01 10:00:02 failed to connect to database

INFO 2024-04-01 10:00:05 Connection successful

就像我每期都会强调的那样,我不是啥 (Neo)vim 老法师,平常也不打高尔夫,所以我玩得很菜,还被网站的评价狠狠地嘲讽了一波(悲)。目前就这一道题,感兴趣的朋友可以试试。

And hey, thanks nerds :)

文章推荐

Beware of 'require' at startup in Neovim plugins

这文章我看了好几遍才明白作者想表达什么,感觉把一个简单的道理说复杂了。

注意作者强调的是 require 对 Neovim 启动速度的影响,主要有三个方面:

  • require 会在 runtimepath 下查找模块,这包括了 $VIMRUNTIMEstdpath("config") 以及插件目录,如果用户的插件分散在不同的目录——大多数插件管理器确实是这么干的,每个插件对应一个 Git 仓库——那么用户使用的插件越多 require 需要查找的目录就越多,调用成本就越昂贵。
  • 级联 require,即 require 一个 Lua 模块时,这个 Lua 文件很可能还会 require 其他文件,这样一条 require 语句实际上对应了多次 require 调用。
  • plugin 目录底下的 Lua 模块实际上都对应一次 require 调用。

这样大量插件引起的级联 require 累积起来很可能大幅影响 Neovim 的启动速度。作者提出的改进建议有两点:

  • 插件作者尽量不要让用户在配置的时候 require,比如说不要整这种 vim.g.foobar = { abc = require("foobar").abc }
  • 尽量将 require 调用移进函数体等局部作用域中

此外,echasnovski 提醒使用内置 vim 模块相当于一次 require 调用,也可能导致级联 require 大幅影响 Neovim 的启动速度。

插件推荐

nvim-scissors

  • 随时添加、编辑或删除 snippet
  • snippet 语法高亮,包括对制表符和占位符的高亮显示
  • 直观的 snippet 编辑界面
  • 自动热更新修改,无须重启 Neovim 即可使 snippet 修改生效
  • 支持 telescopesnacksvim.ui.select 选择 snippet
  • 仅支持 VSCode 风格

scope.nvim

将 buffer 按 tabpage 分组,切换 tabpage 的时候会自动将其他 tabpage 的 buffer set nobuflisted

scope

关于

这周每天晚上都在熬夜爽看漫画,状态不是很好,周刊也肝不动了,抱歉抱歉~(汗)

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

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