Neovim 中文周刊 第 8 期

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

本期周刊包含以下版块:

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

Neovim 开发近况

feat(runtime): revert cfilter, ccomplete to legacy Vim (#33548)

将 cfilter 和 ccomplete 恢复到以前的 Legacy Vimscript 的版本,并移除了 Neovim 的私有模块 _vim9script

cfilter 是 Vim 内置的插件,您可以查看 :h cfilter-plugin;ccomplete 则主要用于为 C 文件提供 omnifunc 支持。二者的位置分别在 $VIMRUNTIME/pack/dist/opt/cfilter$VIMRUNTIME/autoload/ccomplete.vim

cfilter 和 ccomplete 分别在 0d878b9a4d131d 中被 Vim 团队重写为了 Vim9script 的版本。tjdevries 分别在 #21623#21662 中通过 tjdevries/vim9jit 将 Vim9script 版本的 ccomplete 和 cfilter 转译成 Lua。

此次 revert 的原因是这些转译得到的 Lua 代码无法通过 Neovim 的静态分析,clason 表示比起只是像这样转译 Vim9script 插件,Neovim 团队更希望能使用 Neovim 的 API 和特性完全重写其中有价值的插件。

确实,目前 vim9jit 的维护并不活跃,tjdevries 本人也已经超过一年没有再向 Neovim 提交贡献,看起来社区似乎对 Neovim 支持 Vim9script 的工作的兴趣不大。

feat(ui): avoid setting 'cmdheight' with vim.ui_attach() (#33546)

vim.ui_attach()opts 参数新增字段 set_cmdheight。此前使用 ext_messages = true 调用 vim.ui_attach(),例如

vim.ui_attach(ns, { ext_messages = true }, on_event)

会自动设置 cmdheight,通过显式地设置 set_cmdheight = false 将阻止这一行为,以避免覆盖用户的 cmdheight 设置。

feat(api): add "max_height" argument to nvim_win_text_height (#32835)

vim.api.nvim_win_text_height()opt 参数新增字段 max_height,这样在计算文本高度的时候如果已经达到 max_height 就可以直接返回,避免继续计算剩余文本的无用功。另外,该 API 的返回值也新增两个字段 end_rowend_vcol

refactor: replace C implementation of default statusline with statusline expression (#33036)

原本默认的 statusline 是在 C 代码里实现的,您可能注意到此前 :h 'statusline' 的默认值为 ""。该 PR 引入后,默认的 statusline 被重写为使用其专用的 DSL 实现。值得注意的是 PR 作者指出 C 实现的一些动态调整宽度的功能在 statusline 专用的 DSL 中难以实现。

该 PR 是 #28809 的第一步,该提案接下来的目标是改进默认的 statusline,例如显示 LSP 进度。

vim-patch:9.1.{1329,1331,1338} (#33565)

新增事件 CmdlineLeavePre 和 Vimscript API cmdcomplete_info()

事件 CmdlineLeavePre 将在离开命令行窗口之前触发,可在此事件期间使用 cmdcomplete_info() 来获取命令行补全的信息,这些信息将在 CmdlineLeave 触发前被清除。值得注意的是,使用 : 的 keymap 也会触发该事件,但是使用 <Cmd> 的话则不会。

新增的 cmdcomplete_info() 可用于获取命令行补全的信息,将返回一张表,包含以下字段:

  • cmdline_orig:触发补全前命令行中已输入的文本
  • pum_visible:与 :h pumvisible() 同义
  • matches:所有补全候选项
  • selected:当前选中的补全候选项的索引,从 0 开始,-1 代表没有候选项被选中

vim-patch:9.1.1340: cannot complete :filetype arguments (#33602)

:h getcompletion()type 参数新增 filetypecmd 支持,该 API 用于获取命令行的补全候选项,vim#17165 报告 :filetype 没有命令行补全,该 PR 合并后,:filetype 现在也会提供命令行补全。

feat(lsp): support textDocument/documentColor (#33440)

Neovim 现在支持 textDocument/documentColor,并提供了三种渲染风格:

  • backgroud(默认)

background

  • foreground

foreground

  • virtual(类似 VSCode 的风格

virtual

值得注意的是,与 vim.lsp.inlay_hint 一样,该功能默认不启用,您需要根据 :h vim.lsp.document_color.enable() 的指引启用该功能。 calops 认为 这个功能不像 inlay hint 那么具有破坏性,默认风格也不会添加任何 virtual text,用户应该不介意默认启用它。ofseed 表示由于缺乏全局配置的支持,当前实现只能通过 LspAttach 来为单个 buffer 启用。此外,ofseed 认为 vim.lsp.document_colorvim.lsp.inlay_hint 都应该默认启用,尽管不是每个用户都喜欢 inlay hint,但是现在大部分 language server 都提供了合理的默认配置,像 Typescript 这种类型名称通常很长的,tsserver 就默认禁用了 inlay hint 功能,因此应该交给 language server 去决定是否使用 inlay hint。

社区资讯

LSP: upstream a subset of configs from nvim-lspconfig (#33575)

由于 Neovim 不包含任何 LSP 配置,因此用户必须手动添加配置或者安装 nvim-lspconfig。justinmk 希望能将一部分(不超过 20 ~ 40 个) nvim-lspconfig 的配置迁移到 Neovim 中。在此之前,还需要解决 #33577,该提案请求正确实现 vim.lsp.config 的合并语义,目前多个配置的合并仅仅只是 vim.tbl_deep_extend,因此无法移除配置中的字段。如果 Neovim 未来提供的 LSP 配置中包含了用户不想要的字段,用户也没有办法移除它们。

mfussenegger 反对这个提案,主要原因在于许多 language server 实现了 LSP 规范之外的扩展内容(例如 clangdtextDocument/switchSourceHeader),目前 Neovim 严格遵守 LSP 规范,但 nvim-lspconfig 又确实提供了这些扩展内容,该如何处理?如果放宽 Neovim 的标准,可以预见到 Neovim 会越来越臃肿。如果不添加这些扩展内容,那么 Neovim 提供的默认配置就会和 nvim-lspconfig 提供的产生差异,这不仅使迁移 nvim-lspconfig 的工作变得更加复杂,也会令用户更加迷惑。

justinmk 认为这是对提高 OOTB 体验非常重要的一个改进,并表示有价值的不合规范的扩展内容是可以接受的,这也是默认配置的用武之地,不能指望每个用户都花费精力去研究。

clason 则认为与其把 nvim-lspconfig 的配置迁移到上游,不如直接实现内置的插件管理器,让用户可以方便地一键安装 nvim-lspconfig。mfussenegger 同意这个观点,并指出这可以避免不必要的合并语义(#33577),用户可以自由选择是否使用默认配置,同时也能在 Neovim 的发布周期之外获取更新。echasnovski 则表示他们计划将在五月份推出一个可供 review 的内置插件管理器原型。

bluz71 表示既然 Neovim 都已经预装了一些 Tree-sitter parser,没道理不预装几个 LSP 配置。当然 20 个就太多了,可以只包含 C 和 Lua(这是 Neovim 开发需要的),以及几个最常用的编程语言(比如 Python 和 Javascript/Typescript)。mfussenegger 表示你说 Javascript/Typescript ?那要包含的 LSP 可多了:HTML、CSS……而且长期来看,如果有新的编程语言变得流行起来,我们要把旧有的已经不那么流行的踢掉吗?还是都留着,最后还是变成三四十个配置的模样。

Talk with Maria Solano (Neovim Core Maintainer) | LSP snippets, completion, document colors and more

这期访谈的嘉宾是 Maria Solano。MariaSolOs 是 Neovim 的核心维护者,是大家最喜欢的 vim.snippetvim.lsp.completion,以及前文提及的 vim.lsp.document_color 的主要贡献者,同时也是 VSCode 和 Typescript 的贡献者。节目中分享了 MariaSolOs 入门 Neovim 的经历、参与开源项目的经历和使用的工作流等。

echasnovski 表示Folke 的名字怎么念”这么重要的话题怎么才讨论了 74 秒啊(笑)。

插件推荐

golf

这款插件灵感来源于 Code Golf,每个挑战要求您使用尽可能少的按键将初始文本转换为目标文本。您的表现会被实时评分,完成挑战后,您还将获得一份详细的总结以及排行榜信息。

值得注意的是这个插件和 VimGolf 没有关系,所有题目和用户成绩信息都由作者自己的服务器维护。

此外,该插件的挑战允许用户使用插件,如 mini.surround。有用户质疑允许使用插件的话排行榜还有啥意义——毕竟有些编辑任务可以使用插件轻松解决,作者认为 Vim 的精髓就在于个性化,不给用插件的话就没那味儿了。

bullets.vim

Bullets.vim 是一个用于自动生成列表的 Vim/NeoVim 插件。

bullets.vim demo

鸣谢

关于

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

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