Neovim 中文周刊 第 4 期

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

本期周刊包含以下版块:

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

Neovim 开发近况

feat(provider/python)!: add python 3.13, drop 3.7 and 3.8 (EOL) (#33022)

这是一条 BREAKING CHANGE。

因为 3.7 和 3.8 已经 end-of-life 了,所以把它们从 Python Provider 的候选名单里踢出去了。

虽然但是,大部分包管理器都会创建软链接 python3 ,而 python3 在候选名单的第一位,同时该提交没有修改 min_version,仍然为 3.7,而 Neovim 会检查 Python 版本是否大于等于 min_version,所以这俩版本还是能用的。该问题已由 #33088 修复。

feat(osc52): provide default OSC52 tool for vim.g.clipboard (#33021)

由于 OSC52 很常用,所以新增了 vim.g.clipboard = "osc52" 来方便用户指定使用 OSC52 作为系统剪切板,原本配置 OSC52 剪贴板需要

vim.g.clipboard = {
  name = 'OSC 52',
  copy = {
    ['+'] = require('vim.ui.clipboard.osc52').copy('+'),
    ['*'] = require('vim.ui.clipboard.osc52').copy('*'),
  },
  paste = {
    ['+'] = require('vim.ui.clipboard.osc52').paste('+'),
    ['*'] = require('vim.ui.clipboard.osc52').paste('*'),
  },
}

相当于一个快捷方式。justinmk 表示他计划未来引入 vim.os.clipboard 并废弃掉现有的 Vimscript 版本。此外,他还新建了提案计划为其他常用的剪切板工具,如 tmuxxclip 等,添加类似的“快捷方式”,实现难度应该不高,手痒了已经,不过貌似已经有人在跟进了。

vim-patch:9.1.{1214,1217,1219}: matchfuzzy() "camelcase" (#32953)

matchfuzzy() 新增开关 camelcase,用于控制 fuzzy 算法是否对驼峰命名项进行额外加分。

habamax 在 vim#16504 报告在搜索 "Cur" 时,形如 "ICursor" 的得分高于 "Cursor" 这样的前缀匹配项,有点反直觉。glepnir 最初通过添加选项 camelcase 允许用户禁用驼峰命名项的额外加分,habamax 认为应该优化算法本身使其更直观,glepnir 解释这种加分机制本身是合理的,这在大多数语言中都适用,但在某些情况这种机制就不那么合适了,而当前实现缺乏对这种加分机制的控制。随后 habamax 说服了 glepnir 改善当前算法的记分机制,并在一周的讨论和尝试之后达成共识:当前的驼峰命名项加分机制很奇怪,可能无法在不影响其他部分的前提下修复它,还是最开始的添加新选项的方法更好(笑)。

vim-patch: 'completefuzzycollect' option (#30189)

新增选项 completefuzzycollect。roccomao 在 vim#15294 报告 completeoptfuzzy 选项实际上不仅控制是否启用 fuzzy 匹配,还影响了如何收集补全候选项,该 PR 合并后,后者被独立出来使用新增的 completefuzzycollect 选项进行控制。

社区资讯

Spell files should use XDG data dir as default location (#32958)

目前 spellfile 的默认行为是使用 runtimepath 中第一个可写的目录,而这通常是 stdpath("config"),提案作者认为使用 XDG 标准中的 data 目录更符合直觉,也更符合 XDG 规范。

clason 提示现在 Vim 也支持 XDG 规范了,这个提案应当首先在上游实现。在上游提案中 Vim 社区拒绝了该提案,维护者认为 ~/.vim 的目录布局早于 XDG 规范,将 Vim 的目录分散到不同的位置没有太大的收益,此外,将所有 Vim 相关的配置或者数据全部放在一个单独的目录(~/.vim)底下更加方便使用和备份,用户也不需要记住哪些文件应该放到哪个目录。justinmk 认为如果 Vim 不同意迁移,就先在 Neovim 实现吧。

brianhuster 认为 这些 .add 文件放在 stdpath("config") 更合适,因为这些单词是用户明确设置的,此外,这些文件通常也是用户希望备份的,而大多数用户通常备份他们的配置文件,即 stdpath("config")。yochem 则认为这些文件包含的是数据,而不是配置,甚至都不是用户手写的,特别是二进制的 .spl 文件。此外,yochem 和 justinmk 都指出 stdpath("data") 才是收集用户希望备份的文件的目录。clason 则表示 .spl 文件肯定不应该放在 stdpath("config"),而 .add 文件的位置两边的意见都有道理,但是这两种拼写文件放在一个目录底下比较合适。此外,justinmk 还指出拼写文件可能包含私密信息,stdpath("data") 更适合用于存储这些私密文件,而 stdpath("config") 通常被上传到公开的仓库中。

目前,提案作者 yochem 已经提交了 Draft PR #33048

如何评价neovim 0.11?

本周最大的新闻莫过于 Neovim 0.11 release。截止至本期周刊发布该问题的回答不多,目前的高赞回答总结了一些本次 release 的一些新特性,推荐阅读。

大佬们总结得都挺好的,感觉我这期周刊都没啥更新的必要了(苦涩)。

Are there still benefits to using blink/nvim-cmp in 0.11?

相似话题: * For those who want to try Neovim 0.11's builtin LSP autocompletion * LSP completion in 0.11?

讨论内置补全 vim.lsp.completion 和社区补全插件 nvim-cmp 以及 blink.cmp 的区别。其中,blink.cmp 的官方文档提供了一个不错的参考,文档声称社区插件拥有

  • 更好的 fuzzy 匹配算法
  • 非 LSP 补全源
  • LSP 文档弹窗
  • 支持 Ghost Text
  • 支持 Signature Help

此外,不少用户推荐使用 mini.completion,该插件是大名鼎鼎的插件包 mini.nvim 的一个组件。mini.completion 和 vim.lsp.completion 都建立在 Vim 旧有的补全系统的基础上,这使得它们足够轻量。比起内置的 vim.lsp.completion,mini.completion 支持

  • 更加 out-of-box 的配置
  • 在任意字符上触发自动补全,而不仅限于 triggerCharacters
  • Treesitter 高亮的 Signature Help
  • 无可用 LSP 补全时,提供 :h i_CTRL-N 的单词补全

似乎在不少用户看来,mini.completion 才是 Neovim 内置补全框架的理想形态。用户 Florence-Equator 询问为什么 echasnovski 没有尝试把 mini.completion 移植到 Neovim 里,echasnovski 回复称他们愿意将任何 mini.nvim 组件移植到上游,并承诺这些模块的持续维护,但是 Neovim 核心开发者们并没有选择 mini.completion,而是使用 nvim-lsp-compl 作为移植的对象。

文章推荐

What's New in Neovim 0.11

该文由 Neovim 核心开发者 gpanders 撰写,总结了一些本次更新的重要的新功能,包括

  • vim.lsp.configvim.lsp.enable,旨在简化 LSP 的配置。原本配置 LSP 需要大量 boilerplate,大部分用户都依靠 nvim-lspconfig 的框架来配置。目前 nvim-lspconfig#3494 正在计划迁移到新 API,原有的框架代码将不再维护,插件的定位将转变为一个提供各种 LSP 客户端的默认配置选项的仓库。
  • vim.lsp.complete 内置的 LSP 自动补全功能。
  • Treesitter 异步解析,提高大文件启动速度。
  • 新的 diagnostics 渲染器 virtual_lines,就是将 lsp_lines.nvim 移植到了 Neovim 核心中。
  • 更多默认 keymaps,甚至包含了一些大家最喜欢的插件 vim-unimpaired 里的 keymaps!
  • g== 运行帮助文档中的代码块。

还有更多内容请阅读原文,总结得很不错,非常推荐阅读。

The Book of Neo

Neovim 圣经,整活文,看个乐呵~

Reddit 上的评论区也挺有意思的,不过好多宗教梗我看不懂……此外,有一条讨论则严肃地讨论了 Neovim 和 Unix 哲学:

文章里有一句

Do one thing, and do it well. Don’t be like Emacs.

用户 intercaetera 认为 Neovim 已经背离了 Unix 哲学,大量的插件实际上是各种 Linux/Unix 工具的重复轮子,现在的 Neovim 已经差不多是个 Emacs 青春版了。而用户 somebodddy 则认为 Unix 强调一个程序应该只做一件事情,是因为这允许用户可以自由地组合这些程序搭建自己的工作流。Neovim 是独立的程序,插件也应当被视为独立的程序,是用户的 Neovim 配置将这些程序组合在一起从而实现各种功能,这并不违背 Unix 哲学。

插件推荐

kitty-scrollback.nvim

在 Neovim 里浏览 Kitty Scrollback Buffer 以快速搜索、复制和执行命令。

kitty-scrollback.nvim demo

Kitty Scrollback Buffer 就是终端的历史输出内容,Kitty 支持通过快捷键(默认为 ctrl+shift+h)使用分页程序(默认为 less)回滚浏览历史输出。这个插件旨在将 Neovim 作为 scrollback 的浏览程序,从而使用 Neovim 的编辑功能快速选择文本进行拷贝、修改甚至直接作为 Shell 命令执行。

此外,该插件提供了对 tmux 的实验性支持。目前的 tmux 支持还存在一些问题,有概率发生内容获取不完整的问题,Darvinleo 已报告该问题。目前作者怀疑是 Neovim 的一个陈年 Bug 导致的,尚未有明确的修复计划或 workaround。嗯,未来可期。

satellite.nvim

Neovim 滚动条。

satellite.nvim demo

  • 滚动条支持显示多种标记,包括
    • 光标位置
    • 搜索结果
    • Diagnostics
    • Git 修改(gitsigns.nvim
    • :h mark
    • Quickfix
  • 正确处理 fold
  • 支持鼠标

试用过好几款滚动条插件,这个基本上是做得最好的一个了,作者是 Neovim 核心开发者 lewis6991,质量还是有保证的。

关于

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

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