Neovim 中文周刊 第 8 期
欢迎收看第 8 期 Neovim 中文周刊!
本期周刊包含以下版块:
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 分别在 0d878b9 和 a4d131d 中被 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_row
和 end_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
(默认)
foreground
virtual
(类似 VSCode 的风格)
值得注意的是,与 vim.lsp.inlay_hint
一样,该功能默认不启用,您需要根据 :h vim.lsp.document_color.enable()
的指引启用该功能。 calops 认为 这个功能不像 inlay hint 那么具有破坏性,默认风格也不会添加任何 virtual text,用户应该不介意默认启用它。ofseed 表示由于缺乏全局配置的支持,当前实现只能通过 LspAttach
来为单个 buffer 启用。此外,ofseed 认为 vim.lsp.document_color
和 vim.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 规范之外的扩展内容(例如 clangd 的 textDocument/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.snippet
和 vim.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 插件。
鸣谢
关于
那么,一如既往,希望本期周刊能对您有所裨益,感谢您的阅读。