Neovim 中文周刊 第 10 期

点击查看原文

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

本期周刊包含以下版块:

  • Neovim 开发近况:摘录近期合并的 PR,以新功能为主
  • 插件推荐

Neovim 开发近况

feat(lsp): support documentColor dynamic registration (#33800)

:h lsp-document_color 支持动态注册,但其实和原来也没有很大差别,现在您在启用 lsp-document_color 时可以无须自行判断 LSP 是否支持 textDocument/documentHighlight,即直接

vim.api.nvim_create_autocmd('LspAttach', {
  callback = function(args)
    vim.lsp.document_color.enable(true, args.buf)
  end
})

feat(lua): allow function behavior for vim.tbl_extend/vim.tbl_deep_extend (#33819)

vim.tbl_extend()vim.tbl_deep_extend()behavior 参数现在支持传入一个函数来决定合并策略,函数签名为 fun(key:any, prev_value:any?, value:any): any,其中 prev_value 指的是当前已合并的表项计算出的值,我不明白为啥给这个参数取了这么个抽象名字,感觉 acc 会更好,类似于 :h Iter:fold。单元测试提供了一个很好的使用示例:

local a = { a = 1, b = 2, c = 1 }
local b = { a = -1, b = 5, c = 3, d = 4 }
-- Return the maximum value for each key.
local c = vim.tbl_extend(function(k, prev_v, v)
  if prev_v then
    return v > prev_v and v or prev_v
  else
    return v
  end
end, a, b)
assert(vim.deep_equal(c, { a = 1, b = 5, c = 3, d = 4 }))

feat(lsp): vim.lsp.is_enabled() (#33703)

新增 API vim.lsp.is_enabled(),可传入 LSP 配置名作为参数,用于检查是否 :h vim.lsp.enable 了指定的 LSP。

fix(window): skip unfocusable and hidden floats with "{count}w" (#33810)

现在带 :h count 地使用 <C-w>w<C-w>W 之类的命令也会跳过 unfocusable 或隐藏的窗口了。此前只有不带 count 地使用才会跳过 unfocusable 窗口,这在使用 :h vim._extui 时会相当碍事,因为 vim._extui 使用许多 unfocusable 窗口作为 UI 组件。

feat(lsp): automatically stop LSP clients when filetype changes (#33707)

当 buffer 的 'filetype' 改变时,该 buffer 上 attach 的 LSP 客户端将被 :h vim.lsp.buf_detach_client()。值得注意的是,该 PR 的标题并不十分准确:LSP 客户端仅仅只是从 buffer 上 detach 掉,:checkhealth vim.lsp 能观察到该 LSP 客户端的状态仍然是 active,对应的 language server 也仍在运行。PR 作者指出当前 vim.lsp.buf_detach_client() 并没有实现在没有活跃的 LSP 客户端时关闭 language server 的功能,而这超出了该 PR 的范围。

feat(api): nvim_cmd supports plus ("+cmd", "++opt") flags (#30103)

:h vim.api.nvim_cmd 现在支持解析 :h +cmd:h ++opt 参数。根据 #21687 的报告,此前会出现执行

vim.api.nvim_cmd({ cmd = "edit", args = { "++ff=unix test.txt" } }, {})

时打开一个文件名为 ++ff=unix test.txt 的文件这种搞笑的事情。

feat(diagnostic): add on_jump callback option (#33850)

vim.diagnostic.JumpOpts 新增 on_jump 字段,并弃用了 float 字段。on_jump 字段用于指定 vim.diagnostic.jump() 跳转到 diagnostic 时执行的回调,而被弃用的 float 字段是一个 boolean 值,启用后在 vim.diagnostic.jump() 跳转后会自动调用 vim.diagnostic.open_float() 显示 diagnostic 详情。

#33154 请求在 vim.diagnostic.JumpOpts 增加 virtual_lines 字段在跳转后自动显示 virtual_lines,justinmk 指出这个设计很有问题,不应该像这样为每种显示方式都加一个字段,这样没完没了,而应该使用回调,让用户可以自由控制跳转后的行为。

该 PR 合并后,#33933 提供了一个实现 #33154 的示例。值得注意的是 vim.diagnostic.Opts.Jump 同样有 float 字段,但目前并没有同步更新。不过,由于 vim.diagnostic.jump() 的实现会直接合并全局的 vim.diagnostic.Optsjump 字段,所以我们可以直接使用全局配置,即

vim.diagnostic.config({
  jump = {
    on_jump = function(diagnostic, bufnr)
      -- show diagnostics in `virtual_lines`
    end,
  }
})

而无须像 #33933 的示例那样在每次 vim.diagnostic.jump 调用都指定一次 on_jump

vim-patch:9.1.{1373,1374} (#33918)

现在 'smartcase' 会影响补全列表的筛选计算。引用上游 PR vim#17271 作者报告的示例来解释该 PR 尝试解决的问题:

该 PR 合并以前,在输入 T 后使用 :h i_CTRL-N 触发补全,这个补全候选项的计算是考虑了 'smartcase' 的,补全列表会列出所有以大写字母 T 开头的单词,但是后续用户继续输入大写字母 R 后,补全列表并没有过滤掉以 Tr 开头的单词,没有考虑 'smartcase',如图所示

no 'smartcase' filter

该 PR 合并后,当启用 'smartcase' 时,在继续输入大写字母 R 后,补全列表将只保留以 TR 开头的单词。

feat(extui): assign 'filetype' to extui windows (#33924)

vim._extui 的各个 UI 窗口设置了 'filetype',这样用户可以使用 autocmd FileType 来自定义这些 UI 组件的设置,如 'winblend' 等。目前共有 4 种:cmdboxmoreprompt,详情可参见 :h vim._extui

feat(messages): drop "Error executing" in error messages (#33789)

简化了错误消息的格式,

  • 形如 Error detected while processing: 的消息简化为 Error in:
  • 形如 Error executing Lua: 的消息简化为 Lua:
  • 去掉了一大票错误消息里头的 Error,以避免级联错误消息中重复 Error 这个词,例如
failed request to "nvim_exec_lua": Error: nvim_exec_lua: Error executing lua: ...

插件推荐

debugmaster.nvim

debugmaster.nvim 是 dap-ui 的替代品,类似于 dap-view,它还引入了独立的 Debug Mode(类似于 Insert 或 Normal Mode,但专为调试而设计)并紧密集成到该插件提供的 UI 中。

mini.keymap

  • 将按键映射为多种操作。如果符合第一步的条件则执行第一步操作,否则检查第二步,依此类推,直到 fallback 到原始按键。这通常被称为 "smart" keys(如 "smart tab")。该插件为 <Tab><S-Tab><CR><BS> 等按键提供了许多操作,包括
  • 将按键映射为 "Combo"。每个按键按下后都将立刻执行,当多个按键在指定时间内连续按下后将执行指定的操作。例如按下 "jk" 后回到 Normal Mode。

nvim-laurel

一系列为 Neovim 配置设计的 Fennel 宏

nvim-laurel-demo

关于

绝地潜兵2 好玩哎

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

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