Neovim 在 2022 年发布了什么

2022 年 12 月

Neovim 是 世界上最受欢迎的编辑器。这只是科学。

以下是 Neovim 2022 (Nvim 0.8) 开发的一些亮点。

UI

首先是视觉效果!

  • ‘winhighlight’ 已被彻底 重新实现 为窗口本地突出显示命名空间。这向后兼容,同时启用了许多新用例,例如窗口本地语法高亮。
  • 全局 ‘statusline’ 为所有窗口指定一个状态栏。试试看。
    :set laststatus=3
    
  • 'winbar' 就像每个窗口顶部的一个额外的状态栏。它补充了 laststatus=3
    set winbar=%f
    set laststatus=3
    
  • 'winbar''statusline' 获得了 对鼠标点击区域的支持(就像 ‘tabline’ 自 2016 年起就拥有的一样)。
  • 实验性 零高度命令行
    :set cmdheight=0
    
  • The ‘mousescroll’ 选项 控制垂直/水平鼠标滚动行为。
    :set mousescroll=ver:5,hor:2
    
  • The new ‘statuscolumn’ 选项提供了对“边距”的完全控制,并具有与 ‘statusline’ 相同的熟悉格式。它甚至支持点击事件,就像 ‘statusline’、‘tabline’ 和 ‘winbar’ 一样。
    • 功能作者 @luukvbaal 还提供了一个 插件,其中包含各种预先打包的 ‘statuscolumn’ 配置。
    • 试试看!
      :set rnu nu 
      :let &stc='%#NonText#%{&nu?v:lnum:""}%=%{&rnu&&(v:lnum%2)?"\ ".v:relnum:""}%#LineNr#%{&rnu&&!(v:lnum%2)?"\ ".v:relnum:""}'
      
  • 标记可以 保存和恢复视窗信息
    :set jumpoptions=view
    
    • 当您四处跳跃或使用 ctrl-^ 切换缓冲区时,视窗将被恢复,而不是垂直重置/重新居中。
  • vim.ui_attach(实验性)使进程内 Lua 插件能够挂钩到公开给所有 Nvim UI 的相同事件。 pic.twitter.com/w9U87jGfIL
    • noice.nvim 是早期采用者(几天时间!)。

LSP

  • 摘要 Nvim 内置 LSP 支持的历史和现状。
  • Nvim LSP 客户端现在 支持 通过 TCP 连接到语言服务器。
    vim.lsp.start({ name = 'godot', cmd = vim.lsp.rpc.connect('127.0.0.1', 6008) })
    
  • 新的 LSP 的核心事件LspAttachLspDetach。示例。
    vim.api.nvim_create_autocmd('LspAttach', {
      group = yourGroupID,
      callback = function(args)
        local client = vim.lsp.get_client_by_id(args.data.client_id)
        your_callbac_func(client, args.buf)
      end
    }
    
  • vim.lsp.get_active_clients() 了解了如何过滤(这将是 Lua 标准库中的标准模式)。
    get_active_clients({id=42})
    get_active_clients({bufnr=99})
    get_active_clients({name='tsserver'})
    

编辑器

  • Nvim 现在 包含 用于 C、Lua 和 Vimscript 的树状解析器。这是朝着“默认使用树状解析器”迈出的一步,而不是基于正则表达式的 vim 语法定义。
  • 树状解析器拼写检查 限制在 extmark 区域。
  • diff 模式 “linematch” 功能 改进了同一行 diff 更改的呈现方式。
    :set diffopt+=linematch:60
    
  • Nvim 支持 editorconfig,并 默认启用它。Nvim 在您的项目中检测 “.editorconfig” 文件并应用设置。
    • 要选择退出此功能,请将此添加到您的配置中。
      vim.g.editorconfig_enable = false
      
  • 插件可以提供用户定义命令的 实时预览
    • 这扩展了内置的 'inccommand' 功能(自 2017 年起),它在您键入时显示 :substitute (:s/foo/bar) 的效果。
    • 示例:live-command.nvim 插件为 :normal 和宏添加了预览。
  • 现在可以 为任何用户定义的命令实现 ‘inccommand’ 预览。这为 :normal:global 等等的实时预览奠定了基础。
    vim.api.nvim_create_user_command(
      'MyCmd',
      my_cmd,
      { …, preview = my_cmd_preview })
    
  • The :write 命令 获得了 ++p 标志,因此这将创建父/目录/(如果它不存在)。
    :edit parent/dir/file.txt
    :write ++p
    
  • Nvim 现在将 “会话数据”(shada、持久撤消等)存储在 $XDG_STATE_HOME (~/.local/state) 而不是 $XDG_CACHE_HOME (~/.cache) 中。此更改仅影响 macOS/unix,Windows 位置保持不变。
  • 插件还可以使用 stdpath('log') 来获取日志文件的推荐位置。
  • gO 在手册页查看器 (:help :Man) 中显示位置列表中的大纲(目录)。现在大纲也 列出了标志

性能

  • 文件类型检测 使用 Lua(而不是 Vimscript)+ “按需”策略 => 比旧的 filetype.vim 快 7 倍,启动时节省了 5 毫秒以上。
    before:
      9.0ms: sourcing …/runtime/filetype.vim
    after:
      1.3ms: sourcing …/runtime/filetype.lua
    
  • nvim --startuptime 现在报告 Lua require() 时间。
    000.010  000.010: --- NVIM STARTING ---
    000.198  000.188: event init
    ...
    026.333  001.109  001.101: require('vim.lsp.protocol')
    028.144  000.423  000.423: require('vim.lsp._snippet')
    ...
    
  • Nvim ‘packpath’ 改进的简要总结。
  • 快速、流畅的折叠 由插件提供。

默认值

  • ‘mouse’ 选项 默认设置(再次)。自 2017 年起被禁用,“直到出现更好的方法”。现在我们有了它。
    mouse=nvi
    Type ":" (cmdline-mode) to temporarily disable mouse. Right-click shows a popup menu.
    Try it!
    

API

  • nvim_parse_cmd()nvim_cmd([list]) 和“用户 cmd-preview”奠定了基础!对于定义自定义 cmdline (:) 行为也非常有用。
    :echo nvim_parse_cmd('.,$g/foo/bar', {})
    {
     'cmd': 'global',
     'args': ['/foo/bar'],
     'mods': {…},
     'magic': {'file': v:false, 'bar': v:false}
    }
    
  • 使用 nvim_cmd() 以结构化的方式调用任何 Vim 遗留命令,例如 system([...])
    • 不需要 fnameescape():特殊字符由 magic 参数控制。
      nvim_cmd({cmd='vimgrep', args={'/%s/j', '**'}}, {})
      
  • nvim-oxi:“对 Neovim 公开的丰富 API 的一流 Rust 绑定(到 Nvim C 的 FFI)。”

Lua

  • 查看 vim.fs 模块以了解文件系统操作。
    • vim.fs.find() 现在是查找“根文件”的规范方法,这在 LSP 配置中很常见。
  • vim.cmd 是 Lua nvim_cmd 包装器。它支持将 Ex 命令作为函数而不是字符串调用。
    vim.cmd.colorscheme('nightfox')
    
  • Lua 插件 继续成熟

    “Lua 插件基本上与 vim 插件相同,只是文件扩展名是 .lua 而不是 .vim,并且文件包含 Lua 代码而不是 Vimscript。”

    • 这个优雅的接口需要大量的细致工作,这在很大程度上要归功于 @bfredl

维护

  • @dundargoc 完成的工作关闭了 2014 年和 2017 年开始的两个重构史诗:#567 #7401
  • 进展 在 vim9script => Nvim-Lua 转译器来自核心维护者 @teej_dv 将使我们能够继续从 Vim 中提取测试覆盖率,以及语法、ftplugins,甚至 cfilter 之类的插件。
  • 夜间版 + 稳定版发布 现在 提供 用于 macOS 11+ 的通用二进制文件(ARM/M1、Intel)。

文档

通过用 Lua + 树状解析器替换旧的 AWK 脚本,重写了 在线 Nvim 文档 的自动生成。 我们可以拥有美好的事物。

  • 改进的样式
  • 嵌套列表
  • 在选定页面上的软换行“流”布局 (示例)
  • 改进了 vim :help token 的解析。

比较旧的布局(左)和新的布局(右)

作业控制

Nvim 现在 设置 $NVIM 环境变量在 jobstart():terminal 作业中,因此子进程有一个明确的提示,表明它们是 Nvim 的子进程。旧的 $NVIM_LISTEN_ADDRESS 具有冲突的“双重用途”,不再传递给子进程。

RPC

Nvim UI 只是(反转的)插件。现在 nvim 本身就是一个 自托管 UI:当您在终端中运行 nvim 时,它会将 TUI 启动为一个 nvim --embed 子进程。

就像 Nvim GUI 一样,您可以将 nvim TUI 连接到任何 Nvim 服务器以查看其 UI!您现在就可以尝试一下。

  1. 在地址 ./foo 启动服务器(在当前目录中创建一个 foo 文件)。
    nvim --listen ./foo
    
  2. 从另一个终端(与 ./foo 相同的目录),将 nvim 连接到服务器。
    nvim --remote-ui --server ./foo
    

弃用

  • 删除了 'insertmode' 选项,该选项在 Vim 中用于实现“简单 vim”。
    • 我们正在努力使相同的行为成为可能,就像插件一样。参见 :help 'insertmode'
  • cscope 支持被 删除,因为它在很大程度上与 LSP 客户端 (:help lsp) 重复。
    • 注意:ctags 支持将永远不会被删除,它要普遍得多,而且通常很有用。

新闻

新闻档案 中查找更多更新。还有一个 RSS 订阅

什么是 Neovim?

Neovim 是一款基于 Vim 的文本编辑器,专为 可扩展性可用性 而设计,以鼓励新的应用程序和 贡献

讨论

访问 #neovim:matrix.org 或 irc.libera.chat 上的 #neovim 与团队聊天。