Neovim 中文周刊 第 5 期
欢迎收看第 5 期 Neovim 中文周刊!
本期周刊包含以下版块:
Neovim 开发近况
feat(checkhealth): use emoji for OK/WARN/ERROR (#33172)
效果如下:
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 = true
,workspace_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 中致命信号包括 SIGTERM
、SIGQUIT
和 SIGHUP
,其中 SIGTERM
将被 autowriteall
忽略。此外,该 PR 错误地将 SIGTSTP
归类到致命信号中,导致 <C-z>
挂起时 Neovim 尝试退出而崩溃,该问题已经在 #33258 中修复。总结一下就是现在设置了 autowriteall
后 Neovim 在收到 SIGHUP
、SIGQUIT
和 SIGTSTP
时将自动写入。
feat(float): add bold style for border (#33189)
winborder
添加新样式 bold
,创意源自 #33178,效果如下:
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 实例,在里面会计时并统计挑战者的按键,具体效果可以查看他的视频。注意你的手速也很重要,此外每个用户只有一次成功挑战的机会,即当你成功完成挑战后就不能再继续刷分了。在你完成挑战后,网站还会根据你的答案生成评价和建议。
本周的题目是给一段日志文本,要求将其中以 DEBUG
和 ERROR
开头的行删掉,并在剩余的每一行之间添加空行,示例如下:
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
下查找模块,这包括了$VIMRUNTIME
、stdpath("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 修改生效
- 支持
telescope
、snacks
和vim.ui.select
选择 snippet - 仅支持 VSCode 风格
scope.nvim
将 buffer 按 tabpage 分组,切换 tabpage 的时候会自动将其他 tabpage 的 buffer set nobuflisted
。
关于
这周每天晚上都在熬夜爽看漫画,状态不是很好,周刊也肝不动了,抱歉抱歉~(汗)
那么,一如既往,希望本期周刊能对您有所裨益,感谢您的阅读。