新闻-0.10

Nvim 的:help 页面,生成使用 tree-sitter-vimdoc 解析器。


自 Nvim 0.9 以来显着的变化
有关上一个版本的更改,请参阅 news-0.9

重大更改

这些更改可能需要您在配置或插件中进行调整。
API
nvim_open_win() 现在在设置 noautocmd 时会阻塞所有自动命令,而不仅仅是那些来自设置要在窗口中显示的 buffer 的自动命令。
默认值
默认颜色方案已更新为“Nvim 品牌”且可访问。使用 :colorscheme vim 恢复旧的传统颜色方案。
这些 Nvim 特定的突出显示组现在以一种有意义的不同方式定义,可能需要更新
hl-FloatBorderhl-NormalFloat 链接,而不是 hl-WinSeparator
hl-NormalFloat 不与 hl-Pmenu 链接。
hl-WinBar 的背景不同。
hl-WinBarNChl-WinBar 相似,但不是粗体。
hl-WinSeparatorhl-Normal 链接,而不是 hl-VertSplit
这也可能导致某些颜色方案看起来不同,因为它们依赖于关于默认情况下如何定义突出显示组的隐式假设。为了解决这个问题,请显式定义突出显示组的所有属性。或者,使用 :colorscheme vim:source $VIMRUNTIME/colors/vim.lua 恢复以前的定义。
'termguicolors' 在 Nvim 能够确定主机终端模拟器支持 24 位颜色时默认启用。
编辑器
在切换窗口时,CursorMoved 自动命令会在 Nvim 返回主循环时触发,而不是立即触发。这与 Vim 更兼容。
“#”后跟一个数字不再表示映射的左侧开头处的函数键。
shm-q 现在完全隐藏宏记录消息,而不是只缩短它。
通过传统 sign-commands 放置的符号现在在内部存储和显示为 extmarks。以及以下更改
在同一个组中使用相同的标识符放置两次的符号将被移动。
传统符号始终与它所在的线路一起删除。
传统符号和 extmark 符号将在 :sign-place-listnvim_buf_get_extmarks() 中显示。
传统符号和 extmark 符号以相同的优先级显示和列出:行号 -> 优先级 -> 符号 ID -> 最近放置的
:behave 已被移除。
如果您使用 :behave xterm,则以下等效
set mousemodel=extend
如果您使用 :behave mswin,则以下等效
set selection=exclusive
set selectmode=mouse,key
set mousemodel=popup
set keymodel=startsel,stopsel
事件
从传递给 nvim_create_autocmd() 的回调中返回任何真值(而不是仅仅 true)将删除自动命令。
LSP
LanguageTree:parse() 默认情况下不再解析注入,现在需要传递显式范围参数。如果需要注入,请通过 parser:parse({ start_row, end_row }) 提供显式范围。
vim.lsp.util.parse_snippet() 现在将严格遵循 LSP 定义的片段语法,因此以前解析的片段现在可能被视为无效输入。
vim.lsp.codelens.refresh() 现在接受一个 opts 参数。随着这一改变,默认行为只是刷新当前缓冲区,已被刷新所有缓冲区所取代。
vim.lsp.util.extract_completion_items() 将不再返回可靠的结果,因为它在输入是 CompletionList 时不会应用 itemDefaults。此外,由于增加了对 LSP completionList.itemDefaults 的支持,一些第三方插件可能会受到负面影响,如果语言服务器支持该功能但插件不支持。如有必要,在调用 vim.lsp.protocol.make_client_capabilities() 时,可以删除相应的 功能。
LspRequest 和 LspProgressUpdate(更名为 LspProgress)自动命令已从 User 自动命令提升为一等公民。
Lua
-l 确保如果脚本打印消息并且不会导致 Nvim 退出,则输出以换行符结尾。
vim.json 模块中删除了函数
不必要的、未记录的函数,这些函数会造成全局副作用。
vim.json.nullvim.NIL 重复。
vim.json.array_mt(以及相关内容)与 vim.empty_dict() 重复。
vim.islist() 现在检查一个表是否实际上是列表状的(即,具有从 1 开始且没有间隙的整数键)。对于以前的行为(只检查整数键,允许间隙或不从 1 开始),请使用 vim.isarray()
vim.treesitter.playground 重命名为 vim.treesitter.dev
选项
删除了一些 Vim 5.0<= 选项兼容性
'backspace' 不再支持数字值。相反
对于 backspace=0 设置 backspace=(空)
对于 backspace=1 设置 backspace=indent,eol
对于 backspace=2 设置 backspace=indent,eol,start(Nvim 中的默认行为)
对于 backspace=3 设置 backspace=indent,eol,nostop
'backupdir''directory' 将不再删除选项开头的 >
OptionSet 自动命令参数 v:option_newv:option_oldv:option_oldlocalv:option_oldglobal 现在具有选项的类型,而不是始终是字符串。 v:option_old 现在是所有全局-局部选项的旧全局值,而不仅仅是字符串全局-局部选项。
当设置选项(例如,使用 :setnvim_set_option_value())时,没有作用域的全局-局部数字/布尔选项的局部值现在被取消设置,这意味着它们现在与字符串选项的行为相同。
插件
:TOhtml 已用 Lua 重写以支持 Nvim 特定的装饰,并且许多选项已被删除。
Treesitter
Treesitter 突出显示组已重命名以更符合上游 tree-sitter 和 Helix,以便更容易共享查询。完整列表在 treesitter-highlight-groups 中记录。
TUI
在某些情况下,Nvim TUI 中的光标过去即使在不配置 'guicursor' 时也会闪烁,如 cursor-blinking 中所述。这是一个 bug,现在已修复。如果您的光标停止闪烁,请将以下内容(或类似内容,根据用户偏好调整)添加到您的 config 文件中
set guicursor+=n-v-c:blinkon500-blinkoff500

新功能

添加了以下新功能。
API
将 0 传递给 nvim_get_chan_info() 会获取有关当前通道的信息。
nvim_buf_set_extmark() 支持内联虚拟文本。
nvim_win_text_height() 计算给定窗口中一段文本所占用的屏幕行数。
添加了新的 RPC 客户端类型 msgpack-rpc 用于 nvim_set_client_info() 以支持完全符合 MessagePack-RPC 的客户端。
现在可以通过在 nvim_open_win()nvim_win_set_config() 中设置 hide 来隐藏浮动窗口。
nvim_input_mouse() 支持鼠标按钮“x1”和“x2”。
nvim_open_term() 中添加了“force_crlf”选项字段。
添加了 nvim_tabpage_set_win() 来设置标签页的当前窗口。
映射 API 现在支持模式简称有后缀“a”时的缩写。
浮动窗口现在可以使用新的 footerfooter_pos 配置字段显示页脚。默认情况下使用 hl-FloatFooter
extmarks 可以设置“url”突出显示属性,因此文本区域可以成为可点击的超链接(假设 UI 支持)。TUI 使用 OSC 8 控制序列渲染 URL,在支持的终端中启用可点击文本。
nvim_open_win()nvim_win_set_config() 现在支持打开普通(拆分)窗口,将浮动窗口移动到拆分窗口中,以及在非当前标签页中打开窗口。
添加到 nvim_buf_set_extmark() 的标志
"undo_restore": 退出精确撤消跟踪的 extmarks。
"invalidate": 自动隐藏或删除 extmarks。
"virt_text_repeat_linebreak": 在换行符处重复虚拟文本。
Extmarks 现在完全支持多行范围,单个 extmarks 可用于突出显示任意长度的范围。 nvim_buf_set_extmark() API 函数已经允许您定义此类范围,但突出显示区域对于跨越多个换行符的范围来说,渲染不一致。现在已修复。定义为多行 extmark 部分的符号也应用于范围中的每一行,而不仅仅是第一行。此外,nvim_buf_get_extmarks() 已经获得了“overlap”选项,即使范围从指定位置之前开始,也会返回这些范围。
默认值
workspace/didChangeWatchedFiles LSP 客户端功能现在在 Mac 和 Windows 上默认启用。在 Linux 上禁用,因为目前还没有可行的后端用于监视文件,该后端可以很好地扩展到大型目录。
在 Windows 上,'isfname' 不包括“:” 。驱动器号在没有它的情况下被正确处理。(对以“:” 结尾的文件路径使用 gF)。
'comments' 包括 "fb:•"。
'shortmess' 包括 "C" 标志。
'grepprg' 默认情况下使用 -H 和 -I 标志来执行 grep,如果可用,则默认使用 ripgrep。
"]d" 和 "[d" 在 Normal 模式下分别映射到 vim.diagnostic.goto_next()vim.diagnostic.goto_prev()]d-default [d-default
<C-W>d(和 <C-W><C-D>)映射到 vim.diagnostic.open_float() CTRL-W_d-default
vim.lsp.start() 设置以下默认键映射(假设服务器支持)
在 Normal 模式下 K 映射到 vim.lsp.buf.hover(),除非在调用 vim.lsp.start() 之前自定义了 'keywordprg'
自动 lint treesitter 查询文件(参见 ft-query-plugin)。可以通过以下方式禁用
vim.g.query_lint_on = {}
为以下内容启用了 treesitter 突出显示
Treesitter 查询文件
Vim 帮助文件
Lua 文件
编辑器
更适合字符串选项值的命令行补全。 complete-set-option
试试 :set listchars=<Tab>
默认情况下,如果交换文件由正在运行的 Nvim 进程拥有,则会跳过交换文件 "ATTENTION" E325 对话框,而不是提示。如果您始终想要交换文件对话框,请删除默认的 SwapExists 处理程序:autocmd! nvim_swapfiledefault-autocmds
使用 CTRL+O、CTRL+I 导航 jumplist 在删除缓冲区时表现得更直观,并避免 “invalid buffer” 情况。 #25461
:fclose 命令。
v_Q-defaultv_@-default 对行级视觉选择中的每一行重复一个寄存器。
在标签栏中使用鼠标中键单击一个标签页,会将其关闭。
:checkhealth 缓冲区可以使用修饰符(如 :vertical:horizontal:botright)在分割窗口中打开。
事件
vim.on_key() 回调函数接收第二个参数,用于在应用映射之前输入的键。
LSP
LSP 方法名称可在 vim.lsp.protocol.Methods 中找到。
vim.lsp.status() 将最后一个进度消息作为字符串消费。
LSP 客户端现在始终在应用文本编辑时保存和恢复命名缓冲区标记。
LSP 客户端现在支持 positionEncoding 服务器功能。如果服务器在其初始化响应中使用 positionEncoding 功能进行响应,则 Nvim 会自动设置客户端的 offset_encoding 字段。
动态注册 LSP 功能。此更改的含义是,检查客户端的 server_capabilities 不再是查看服务器是否支持某个功能的充分指标。而是使用 client.supports_method(<method>)。它同时考虑动态功能和静态 server_capabilities
anchor_bias 选项可以帮助 lsp 处理程序定位浮动窗口。
vim.lsp.util.locations_to_items() 将每个项目的 user_data 设置为原始 LSP LocationLocationLink
添加了对使用命名管道(Windows)或 Unix 域套接字(Unix)通过 vim.lsp.rpc.connect() 连接到服务器的支持。
添加了对 completionList.itemDefaults 的支持,减少了在计算完成项时产生的开销,在这些完成项中,属性通常共享相同的值(例如 commitCharacters)。请注意,这可能会影响不支持该功能的插件和语言服务器,在这种情况下,可以取消设置相应的功能。
vim.lsp.start() 接受一个 "silent" 选项,用于在 LSP 服务器启动失败时抑制消息。
Lua
:lua 使用 [range] 在任何缓冲区中执行该范围作为 Lua 代码。
:source 在没有参数的情况下将 'filetype' 为 "lua" 的缓冲区视为 Lua 代码,无论其扩展名如何。
Vimscript 函数 exists() 支持检查 v:lua 函数。
vim.iter() 是所有 可迭代 对象(表、迭代器)的通用接口。
vim.snippet 提供了一种模式,用于扩展和导航代码片段。
vim.ringbuf() 是一个通用的环形缓冲区(数据结构)。
vim.deepcopy() 获得了一个 noref 参数,用于避免对表值进行哈希运算。
vim.keycode() 将字符串中的键码转换为键码。
vim.system() 运行命令/启动进程。
vim.lpegvim.re 公开了捆绑的 Lpeg 表达式语法解析器及其正则表达式接口。
vim.base64.encode()vim.base64.decode() 使用 Base64 编码对字符串进行编码和解码。
vim.text.hexencode()vim.text.hexdecode() 将字符串转换为字节表示形式,反之亦然。
vim.ui.open() 使用系统默认处理程序(macOS open、Windows explorer、Linux xdg-open 等)打开 URI。
vim.wo 现在可以使用双索引来实现 :setlocal 行为。目前仅支持缓冲区索引为 0 的情况。
改进了 vim.api.* 调用(包括 opts 参数)中类型错误的消息。
Lua 类型注释适用于
vim.*
vim.fn.*
vim.api.*
vim.v.*
接受严重程度作为可选参数的函数(例如 vim.diagnostic.get())现在也接受严重程度列表 vim.diagnostic.severity
vim.diagnostic.count() 返回给定缓冲区和/或命名空间的诊断数量,按严重程度。当只需要诊断数量,而不是诊断本身时,这比 vim.diagnostic.get() 更快。
vim.fs.root() 从 "根标记" 列表中查找项目根目录。
vim.tbl_contains() 现在适用于通用表,并允许指定一个针对每个值进行检查的谓词函数。(对于检查列表类表(整数键,没有间隙)中是否存在字面值,请使用 vim.list_contains()。)
vim.region() 可以使用 getpos() 接受的字符串作为位置。
选项
'winfixbuf' 使窗口保持聚焦在特定缓冲区上
'smoothscroll' 选项在设置 'wrap' 时,按屏幕行而不是按文本行滚动。
'foldtext' 现在支持虚拟文本格式。 fold-foldtext
'foldtext' 可以设置为一个空字符串,以禁用并按正常方式呈现行:使用常规突出显示,没有行换行。
'complete' 选项支持 "f" 标志,用于完成缓冲区名称。
'completeopt' 选项支持 "popup" 标志,以在浮动窗口中显示额外信息。
'errorfile' (-q) 接受 - 作为 stdin 的别名。
性能
'diffopt' "linematch" 评分算法现在更倾向于更大、更少的组 https://github.com/neovim/neovim/pull/23611
Tree-sitter 突出显示现在仅在屏幕重绘期间对正在渲染的行范围增量解析注入。这在包含大量注入的大型文件中显著提高了性能。
'breakindent' 的性能在换行行中得到了显著提高。
光标移动、插入 [count] 和 screenpos() 现在更快。
插件
Nvim 现在包含 注释 支持。
:Man 支持 :hide 修饰符,以便在当前窗口中打开页面。
启动
$NVIM_APPNAME 可以设置为相对路径,而不仅仅是名称。
--startuptime 报告两个进程(TUI + 服务器)的启动时间,作为单独的部分。
终端
:terminal 接受一些 :command-modifiers(特别是 :horizontal 以及影响窗口分割的那些修饰符)。
终端缓冲区在子进程发出 OSC 或 DCS 控制序列时,会发出 TermRequest 自动命令事件。
终端缓冲区响应 OSC 背景和前景请求。 default-autocmds
Treesitter
用于 Markdown 的捆绑解析器和查询(突出显示、折叠)(用于 LSP 悬停)。
:InspectTree 显示根节点。
:InspectTree 现在支持 折叠
:InspectTree 以 0 为基数而不是 1 为基数的索引显示节点范围。
vim.treesitter.foldexpr() 现在识别使用量化查询模式捕获的折叠。
vim.treesitter.query.omnifunc() 在 tree-sitter 查询文件中提供完成(默认设置)。
vim.treesitter.query.edit() 提供 tree-sitter 查询的实时编辑。
Query:iter_matches() 现在能够为匹配项设置最大开始深度。
@injection.language 现在具有更智能的解析功能,它将回退到通过 vim.treesitter.language.register() 注册的语言别名(例如,文件类型或自定义缩写)和/或尝试文本的小写变体。
@injection.filename 将尝试通过 vim.filetype.match() 匹配节点文本,并将结果作为语言名称与 @injection.language 相同的方式对待。
#set! 指令支持 injection.selfinjection.parent,分别用于注入当前节点的语言或父 LanguageTree 的语言。
#set! 指令可以将节点的 "url" 属性设置为使节点发出超链接。超链接是特定于 UI 的:在 TUI 中,使用 OSC 8 控制序列。
改进了查询解析的错误消息。
TUI
内置 TUI 现在可以识别支持 tui-csiu 的终端模拟器中的 "super" (<D-) 和 "meta" (<T-) 修饰符。
TermResponse 事件可以与 v:termresponse 一起使用,以读取来自主机终端的转义序列响应。
现在默认情况下捆绑了一个剪贴板提供程序,该提供程序使用 OSC 52 将选择内容复制到系统剪贴板,并且在某些条件下会自动启用。 clipboard-osc52
'termsync' 选项要求主机终端缓冲屏幕更新,直到重绘周期完成。需要主机终端的支持。
UI
增强了使用组合字符渲染多字节字符的支持:最大限制从 1+6 个代码点增加到 31 个字节,这保证了之前的所有字符都能够容纳,而且通常更多。
注意:正则表达式引擎仍然有一个硬编码限制,只考虑 6 个组合字符。

更改的功能

这些现有功能改变了其行为。
API
nvim_buf_call()nvim_win_call() 现在保留任何返回值(注意:不是多个返回值)
编辑器
gx 现在使用 vim.ui.open() 而不是 netrw。要进行自定义,可以重新定义 vim.ui.open 或重新映射 gx。要继续使用 netrw(已弃用)
:call netrw#BrowseX(expand(exists("g:netrw_gx") ? g:netrw_gx : '<cfile>'), netrw#CheckIfRemote())<CR>
LSP
LSP 悬停和签名帮助现在使用 Tree-sitter 来突出显示 Markdown 内容。请注意,代码示例的突出显示需要匹配的解析器,并且可能会受到自定义查询的影响。
LspRequest 自动命令回调包含有关发生的 LSP 请求状态更新的更多信息。
Lua
vim.wait() 不能在 api-fast 中调用。
vim.diagnostic.config() 现在在它的 "virtual_text" 表中接受与 nvim_buf_set_extmark() 相关的虚拟文本选项(例如 "virt_text_pos" 和 "hl_mode"),这使得用户能够更好地控制诊断虚拟文本的显示方式。
vim.diagnostic.get()vim.diagnostic.count() 接受多个命名空间,而不是只接受一个命名空间。
vim.diagnostic.enable() 获得了新的参数,旧的签名已弃用。
vim.diagnostic.config() 现在接受一个用于 virtual_text.prefix 选项的函数,这允许以不同的方式呈现例如诊断严重程度。
选项
尝试设置无效的键码选项(例如 set t_foo=123)不再报错。
终端
如果终端缓冲区在没有参数的情况下启动(并使用 'shell'),则在作业没有错误的情况下退出时会自动关闭,从而消除(通常不需要的)“[进程退出 0]”消息。 default-autocmds
Treesitter
Query:iter_matches()vim.treesitter.query.add_predicate()vim.treesitter.query.add_directive() 接受一个新的 all 选项,该选项确保所有匹配的节点都作为表格返回。默认选项 all=false 只返回单个节点,这会破坏带有量词(如 (comment)+ @comment)的捕获;它只为向后兼容而提供,将在 Nvim 0.10 之后删除。
vim.treesitter.query.add_predicate()vim.treesitter.query.add_directive() 现在接受一个选项表,而不是一个布尔类型的“force”参数。要强制谓词或指令覆盖现有谓词或指令,请使用 { force = true }

已删除的功能

这些已弃用的功能已被删除。
Vimball 支持,包括 :Vimuntar 命令
对旧版 treesitter 注入查询的支持
'shortmess' 标志
shm-f。始终使用“(3 of 5)”而不是“(file 3 of 5)”。
shm-i。始终使用“[noeol]”。
shm-x。始终使用“[dos]”、“[unix]”和“[mac]”。
shm-n。始终使用“[New]”。

弃用

参见 deprecated-0.10
主要
命令索引
快速参考