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.Opts
的 jump
字段,所以我们可以直接使用全局配置,即
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'
,如图所示
该 PR 合并后,当启用 'smartcase'
时,在继续输入大写字母 R 后,补全列表将只保留以 TR 开头的单词。
feat(extui): assign 'filetype' to extui windows (#33924)
为 vim._extui
的各个 UI 窗口设置了 'filetype'
,这样用户可以使用 autocmd FileType
来自定义这些 UI 组件的设置,如 'winblend'
等。目前共有 4 种:cmd
、box
、more
和 prompt
,详情可参见 :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>
等按键提供了许多操作,包括- 浏览和选中 Neovim 内置补全/ hrsh7th/nvim-cmp / Saghen/blink.cmp 的补全候选项
- 跳转到当前 tree-sitter 节点之前/后
- 跳转到左括号前或右括号后
- 浏览和展开
:h vim.snippet
/ L3MON4D3/LuaSnip 的 snippet
- 将按键映射为 "Combo"。每个按键按下后都将立刻执行,当多个按键在指定时间内连续按下后将执行指定的操作。例如按下 "jk" 后回到 Normal Mode。
nvim-laurel
一系列为 Neovim 配置设计的 Fennel 宏
关于
绝地潜兵2 好玩哎
那么,一如既往,希望本期周刊能对您有所裨益,感谢您的阅读。