Ui

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


Nvim UI 协议 ui
UI 可以实现为通过 RPC API 与 Nvim 通信的外部客户端进程。默认的 UI 模型是一个类似终端的网格,使用单个等宽字体。UI 可以选择在单独的网格上绘制窗口,并让 UI 本身而不是 Nvim 来呈现某些元素(“小部件”)(“外部化”)。
ui-option
调用 nvim_ui_attach() 来告诉 Nvim 您的程序想要绘制大小为 width × height 个单元格的 Nvim 屏幕网格。这通常由嵌入器在启动时完成(参见 ui-startup),但 UI 也可以连接到正在运行的 Nvim 实例并调用 nvim_ui_attach()。options 参数是一个具有以下(可选)键的映射
ui-rgb
rgb 决定颜色格式。
true:(默认)24 位 RGB 颜色
false: 终端颜色(8 位,最大 256)
ui-override
override 决定如何解析 UI 功能。
true: 启用请求的 UI 功能,即使所有连接的 UI(包括 TUI)不支持。
false:(默认)禁用所有连接的 UI(包括 TUI)不支持的 UI 功能。
ui-ext-options
ext_cmdline 外部化命令行。 ui-cmdline
ext_hlstate 详细的突出显示状态。 ui-hlstate 隐式地设置 ext_linegrid
ext_linegrid 基于行的网格事件。 ui-linegrid 隐式地停用 ui-grid-old
ext_messages 外部化消息。 ui-messages 隐式地设置 ext_linegridext_cmdline
ext_multigrid 每个窗口的网格事件。 ui-multigrid 隐式地设置 ext_linegrid
ext_popupmenu 外部化 popupmenu-completion'wildmenu'ui-popupmenu
ext_tabline 外部化选项卡栏。 ui-tabline
ext_termcolors 使用外部默认颜色。
term_name 设置终端的名称 'term'
term_colors 设置支持的颜色数量 't_Co'。
stdin_fd 从该 fd 中读取缓冲区 1,就好像它是 stdin -- 一样。仅从 --embed UI 在启动时使用。 ui-startup-stdin
stdin_tty 表示 stdin 是否是 tty
stdout_tty 表示 stdout 是否是 tty
指定未知选项会产生错误;UI 可以检查 api-metadata ui_options 键以查看支持的选项。
默认情况下,Nvim 要求所有连接的 UI 都支持相同的功能,因此活动功能是请求的功能的交集。UI 可以指定 ui-override 来反转此行为(对调试很有用)。“option_set”事件会宣布哪些功能是活动的。
Nvim 向所有连接的 UI 发送 RPC 通知,方法名称为“redraw”,只有一个参数:屏幕“更新事件”数组(批处理)。每个更新事件本身都是一个数组,其第一个元素是事件名称,其余元素是事件参数元组。因此,可以连续发送同类事件而无需重复事件名称。
典型的“redraw”批处理的示例,包含在单个 RPC 通知中
['notification', 'redraw',
  [
    ['grid_resize', [2, 77, 36]],
    ['grid_line',
      [2, 0, 0, [[' ' , 0, 77]], false],
      [2, 1, 0, [['~', 7], [' ', 7, 76]], false],
      [2, 9, 0, [['~', 7], [' ', 7, 76]], false],
      ...
      [2, 35, 0, [['~', 7], [' ', 7, 76]], false],
      [1, 36, 0, [['[', 9], ['N'], ['o'], [' '], ['N'], ['a'], ['m'], ['e'], [']']], false],
      [1, 36, 9, [[' ', 9, 50]], false],
      [1, 36, 59, [['0', 9], [','], ['0'], ['-' ], ['1'], [' ', 9, 10], ['A'], ['l', 9, 2]], false]
    ],
    ['msg_showmode', [[]]],
    ['win_pos', [2, 1000, 0, 0, 77, 36]],
    ['grid_cursor_goto', [2, 0, 0]],
    ['flush', []]
  ]
]
必须按顺序处理事件。Nvim 在完成整个屏幕的重绘时(因此所有窗口都对缓冲区状态、选项等具有一致的视图)发送“flush”事件。在整个屏幕重绘完成之前,可能会发送多个“redraw”批处理,并且只有最后一个批处理之后才会发送“flush”。用户只应该看到最终状态(当发送“flush”时),而不是处理批处理数组的一部分时出现的任何中间状态,或者是在没有以“flush”结尾的批处理之后出现的任何状态。
默认情况下,Nvim 会发送 ui-globalui-grid-old 事件(为了向后兼容);这些事件足以实现类似终端的界面。但是,新的 ui-linegrid 更有效地表示文本(尤其是突出显示的文本),并且允许需要多个网格的 UI 功能。新的 UI 应该实现 ui-linegrid 而不是 ui-grid-old
Nvim 可选地将各种屏幕元素“语义化”地发送为结构化事件,而不是原始网格线,如 ui-ext-options 所指定。UI 必须自己呈现这些元素,Nvim 不会在网格上绘制它们。
Nvim 的未来版本可能会添加新的更新类型,并且可能会向现有的更新类型追加新的参数。为了向前兼容,客户端必须准备好忽略这些扩展。 api-contract

UI 启动 ui-startup

UI 嵌入器(使用 --embed 启动 Nvim 并在稍后调用 nvim_ui_attach() 的客户端)必须在没有 --headless 的情况下启动 Nvim
nvim --embed
Nvim 会在加载启动文件和读取缓冲区之前暂停,以便 UI 有机会调用请求并进行早期初始化。一旦 UI 调用 nvim_ui_attach(),启动就会继续进行。
一个简单的 UI 只需要执行一次 nvim_ui_attach() 请求,然后准备处理任何 UI 事件。一个更具特色的 UI 可能会需要对 Nvim 进程进行额外的配置,应该使用以下启动过程
1. 调用 nvim_get_api_info(),如果需要设置客户端库和/或获取支持的 UI 扩展列表。
2. 执行任何应该在加载用户配置之前发生的配置。此时无法使用缓冲区和窗口,但可用于设置对 init.vim 可见的 g: 变量
3. 如果 UI 希望在加载用户配置后执行额外的设置,请注册一个 VimEnter autocmd
nvim_command("autocmd VimEnter * call rpcrequest(1, 'vimenter')")
4. 现在调用 nvim_ui_attach()。UI 现在必须处理用户输入:源 init.vim 和加载缓冲区可能会导致阻塞提示。
5. 如果使用步骤 3,Nvim 会向 UI 发送一个阻塞的“vimenter”请求。在该请求处理程序中,UI 可以安全地执行任何在进入普通模式之前进行的初始化,例如读取 init.vim 设置的变量。
ui-startup-stdin
UI 可以支持从 stdin 中读取的原生功能,如使用 command | nvim - 对内置 TUI 所调用功能一样。 -- 嵌入进程可以检测到它的 stdin 是否对一个不是终端的文件开放,就像 Nvim 所做的一样。然后,它需要将该 fd 转发给 Nvim。由于 fd=0 已经用于从嵌入器发送 rpc 数据到 Nvim,因此它需要使用其他文件描述符,如 fd=3 或更高。
然后,应该将 stdin_fd 选项传递给 nvim_ui_attach,Nvim 将隐式地将其读取为缓冲区。该选项只能在使用 --embed 选项启动 Nvim 时使用,如上所述。

全局事件 ui-global

以下 UI 事件始终会发出,并描述编辑器的全局状态。
["set_title", title]
["set_icon", icon]
分别设置窗口标题和图标(最小化)窗口标题。在不区分这两者的窗口系统中,可以忽略“set_icon”。
["mode_info_set", cursor_style_enabled, mode_info]
cursor_style_enabled 是一个布尔值,表示 UI 是否应该设置光标样式。mode_info 是模式属性映射列表。当前模式由 mode_change 事件的 mode_idx 字段给出。
每个模式属性映射可能包含以下键
键 描述
cursor_shape: "block", "horizontal", "vertical" cell_percentage: 光标占用的单元格百分比。 blinkwait, blinkon, blinkoff: 参见 cursor-blinkingattr_id: 光标属性 ID(由 hl_attr_define 定义)。当 attr_id 为 0 时,背景和前景颜色应该互换。 attr_id_lm: 当 :lmap 处于打开状态时的光标属性 ID。 short_name: 模式代码名称,参见 'guicursor'name: 模式描述性名称。 mouse_shape:(待实现。)
某些键在某些模式下不存在。
以下键已弃用
hl_id: 改用 attr_idid_lm: 改用 attr_id_lm
["option_set", name, value]
UI 相关的选项已更改,其中 name 是以下选项之一
在 UI 首次连接到 Nvim 时触发,以及每当用户或插件更改选项时触发。
如果选项的效果在其他 UI 事件中传达,则此处不会表示这些选项。例如,不是转发 'mouse' 选项值,而是 “mouse_on” 和 “mouse_off” UI 事件直接指示鼠标支持是否处于活动状态。某些选项(如 'ambiwidth')已经对网格生效,其中添加了适当的空单元格,但是 UI 仍然可以在渲染从 Nvim 发送的原始文本时使用这些选项,例如针对 ui-cmdline
["chdir", path]
嵌入的 Nvim 进程的 current-directory 已更改为 path
["mode_change", mode, mode_idx]
编辑器模式已更改。mode 参数是一个字符串,表示当前模式。mode_idx 是在 mode_info_set 事件中发出的数组中的索引。UI 应该根据相应项中指定的属性更改光标样式。报告的模式集将在 Nvim 的新版本中发生变化,例如,更多子模式和临时状态可能会表示为单独的模式。
["mouse_on"]
["mouse_off"]
'mouse' 在当前编辑器模式中已启用/禁用。对终端 UI 或嵌入到 Nvim 鼠标会与其他鼠标使用冲突的应用程序中很有用。其他 UI 可能会忽略此事件。
["busy_start"]
["busy_stop"]
指示 UI 必须停止渲染光标。此事件命名错误,实际上与繁忙无关。
["suspend"]
:suspend 命令或 CTRL-Z 映射正在使用。终端客户端(或其他有意义的客户端)可以挂起自身。其他客户端可以安全地忽略它。
["update_menu"]
菜单映射已更改。
["bell"]
["visual_bell"]
分别用声音或视觉铃声通知用户。
["flush"]
Nvim 已完成屏幕重绘。对于渲染到内部缓冲区的实现,此时应将重绘的部分显示给用户。

网格事件(基于行) ui-linegrid

ext_linegrid ui-option 激活。建议所有新的 UI 使用。隐式地停用 ui-grid-old
ui-grid-old 相比,最大的变化是使用单个 grid_line 事件来更新屏幕行的内容(而旧协议使用的是光标、突出显示和文本事件的组合)
大多数这些事件以 grid 索引作为第一个参数。网格 1 是用于整个编辑器屏幕状态的默认全局网格。ext_linegrid 功能本身永远不会导致创建任何其他网格;要启用每个窗口的网格,请激活 ui-multigrid
突出显示属性组是预定义的。UI 应该维护一个表,将数字突出显示 ID 映射到实际属性。
["grid_resize", grid, width, height]
调整一个grid的大小。如果客户端之前没有看到grid,则会创建具有此大小的新grid
["default_colors_set", rgb_fg, rgb_bg, rgb_sp, cterm_fg, cterm_bg]
前三个参数分别设置默认的前景色、背景色和特殊颜色。cterm_fgcterm_bg指定在 256 色终端中使用的默认颜色代码。
默认情况下,RGB 值始终为有效颜色。如果没有设置颜色,它们将默认为黑色和白色,具体取决于'background'。通过设置ext_termcolors选项,未设置的颜色将使用-1。这对于 TUI 实现非常有用,因为预期会使用终端内置(“ANSI”)默认值。
注意:与相应的ui-grid-old事件不同,发送此事件后并不总是会清除屏幕。UI 必须自行重新绘制具有更改后的背景颜色的屏幕。
ui-event-hl_attr_define
["hl_attr_define", id, rgb_attr, cterm_attr, info]
使用id将突出显示添加到突出显示表中,其属性由rgb_attrcterm_attr字典指定,包含以下(全部可选)键。
foreground:前景色。background:背景色。special:用于各种下划线的颜色(如果存在)。reverse:反转视频。前景色和背景色互换。italic:斜体文本。bold:粗体文本。strikethrough:删除线文本。underline:下划线文本。该线使用special颜色。undercurl:下划线文本。该下划线使用special颜色。underdouble:双下划线文本。该线使用special颜色。underdotted:点下划线文本。该点使用special颜色。underdashed:虚线文本。该虚线使用special颜色。altfont:替代字体。blend:混合级别(0-100)。UI 可以使用它来支持将浮动窗口混合到背景或指示透明光标。url:与该突出显示关联的 URL。UI 应将该区域显示为可单击的超链接。
对于缺失的颜色键,应使用默认颜色。不要在表中存储默认值,而是使用哨兵值,这样更改后的默认颜色将生效。所有布尔键默认为 false,并且仅在为 true 时才会发送。
始终针对 RGB 格式和终端 256 色代码(分别作为rgb_attrcterm_attr参数)传输突出显示。ui-rgb选项不再生效。大多数外部 UI 只需要存储和使用rgb_attr属性。
id 0 始终用于默认突出显示,其颜色由default_colors_set定义,并且不应用任何样式。
注意:如果 Nvim 的内部突出显示表已满,它可能会重用id值。在这种情况下,Nvim 将始终发出受重新定义的 id 影响的屏幕单元格的重绘,因此 UI 不需要自行跟踪。
info默认情况下是一个空数组,将在下面解释的ui-hlstate扩展中使用。
["hl_group_set", name, hl_id]
内置突出显示组name已设置为使用先前hl_attr_define调用定义的属性hl_id。此事件不需要呈现直接使用属性 id 的网格,但对于希望使用一致突出显示来呈现自身元素的 UI 很有用。例如,使用ui-popupmenu事件的 UI 可能会使用hl-Pmenu系列内置突出显示。
ui-event-grid_line
["grid_line", grid, row, col_start, cells, wrap]
重新绘制gridrow的连续部分,从列col_start开始。cells是一个数组,其中每个数组包含 1 到 3 个元素:[text(, hl_id, repeat)]text是要放在单元格中的 UTF-8 文本,其突出显示hl_id由先前hl_attr_define调用定义。如果hl_id不存在,则应使用相同调用中最最近看到的hl_id(始终针对事件中的第一个单元格发送)。如果repeat存在,则应将单元格重复repeat次(包括第一次),否则只重复一次。
双宽度字符的右侧单元格将表示为空字符串。双宽度字符从不使用repeat
如果单元格更改数组没有达到行尾,则其余部分应保持不变。如果要清除行的其余部分,将发送空格字符,并重复到足以覆盖剩余行的次数。
wrap是一个布尔值,指示该行是否换行到下一行。重新绘制换行到下一行的行时,Nvim 将发出一个grid_line事件,该事件覆盖行的最后一列,并将wrap设置为 true,然后紧随其后的是一个从下一行第一列开始的grid_line事件。
["grid_clear", grid]
清除一个grid
["grid_destroy", grid]
grid将不再使用,UI 可以释放与它关联的任何数据。
["grid_cursor_goto", grid, row, col]
使grid成为当前网格,并将row, col设为该网格上的光标位置。此事件将在一个redraw批次中最多发送一次,并指示可见的光标位置。
["grid_scroll", grid, top, bot, left, right, rows, cols]
滚动grid的区域。从语义上讲,这与编辑器滚动无关,而是说“复制这些屏幕单元格”的一种优化方法。
以下图表显示了每个滚动方向发生的情况。“===”表示 SR(滚动区域)边界。“---”表示移动的矩形。请注意,dst 和 src 共享一个公共区域。
如果rows大于 0,则向上移动 SR 中的矩形,这可能在向下滚动时发生。
+-------------------------+
| (clipped above SR)      |            ^
|=========================| dst_top    |
| dst (still in SR)       |            |
+-------------------------+ src_top    |
| src (moved up) and dst  |            |
|-------------------------| dst_bot    |
| src (invalid)           |            |
+=========================+ src_bot
如果rows小于零,则向下移动 SR 中的矩形,这可能在向上滚动时发生。
+=========================+ src_top
| src (invalid)           |            |
|------------------------ | dst_top    |
| src (moved down) and dst|            |
+-------------------------+ src_bot    |
| dst (still in SR)       |            |
|=========================| dst_bot    |
| (clipped below SR)      |            v
+-------------------------+
在本版本的 Nvim 中,cols始终为零,并为将来使用保留。
请注意,当从ui-grid-old事件更新代码时:范围是尾部独占的,这与 API 约定一致,但与set_scroll_region不同,后者是尾部包含的。
滚入区域将使用ui-event-grid_line在滚动事件之后立即直接填充。因此,UI 不需要将此区域作为处理滚动事件的一部分进行清除。

网格事件(基于单元格) ui-grid-old

这是屏幕网格的旧版表示形式,如果ui-linegrid未处于活动状态,则会发出此表示形式。新的 UI 应该实现ui-linegrid
["resize", width, height]
网格调整为widthheight单元格。
["clear"]
清除网格。
["eol_clear"]
从光标位置清除到当前行尾。
["cursor_goto", row, col]
将光标移动到位置 (row, col)。目前,同一个光标用于定义文本插入的位置和可见的光标。但是,只有在处理完“redraw”事件中的整个数组之后,最后一个光标位置才是预期的可见光标位置。
["update_fg", color]
["update_bg", color]
["update_sp", color]
分别设置默认的前景色、背景色和特殊颜色。
ui-event-highlight_set
["highlight_set", attrs]
设置将在网格上放置的下一个文本所具有的属性。attrs是一个字典,包含以下键。任何缺失的键都将重置为其默认值。颜色默认值由update_fg等更新设置。所有布尔键默认为 false。
foreground:前景色。background:背景色。special:用于各种下划线的颜色(如果存在)。reverse:反转视频。前景色和背景色互换。italic:斜体文本。bold:粗体文本。strikethrough:删除线文本。underline:下划线文本。该线使用special颜色。undercurl:下划线文本。该下划线使用special颜色。underdouble:双下划线文本。该线使用special颜色。underdotted:点下划线文本。该点使用special颜色。underdashed:虚线文本。该虚线使用special颜色。
["put", text]
将(utf-8 编码的)字符串text放在光标位置(并移动光标),并使用最后一次highlight_set更新设置的突出显示。
["set_scroll_region", top, bot, left, right]
定义下面scroll使用的滚动区域。
注意:范围是尾部包含的,这与 API 约定不一致。
["scroll", count]
滚动滚动区域中的文本。以下图表说明了将要发生的情况,具体取决于滚动方向。“=”用于表示 SR(滚动区域)边界,“-”用于表示移动的矩形。请注意,dst 和 src 共享一个公共区域。
如果 count 大于 0,则向上移动 SR 中的矩形,这可能在向下滚动时发生。
+-------------------------+
| (clipped above SR)      |            ^
|=========================| dst_top    |
| dst (still in SR)       |            |
+-------------------------+ src_top    |
| src (moved up) and dst  |            |
|-------------------------| dst_bot    |
| src (cleared)           |            |
+=========================+ src_bot
如果 count 小于零,则向下移动 SR 中的矩形,这可能在向上滚动时发生。
+=========================+ src_top
| src (cleared)           |            |
|------------------------ | dst_top    |
| src (moved down) and dst|            |
+-------------------------+ src_bot    |
| dst (still in SR)       |            |
|=========================| dst_bot    |
| (clipped below SR)      |            v
+-------------------------+

详细突出显示状态扩展 ui-hlstate

ext_hlstateui-option激活。隐式激活ui-linegrid
默认情况下,Nvim 将只使用最终计算的突出显示属性(如ui-event-highlight_set中的字典键所述)来描述网格单元格。ext_hlstate扩展允许 UI 接收有关单元格中活动突出显示的语义描述。在此模式下,突出显示将在表中预定义,请参见ui-event-hl_attr_defineui-event-grid_linehl_attr_define中的info参数将包含突出显示的语义描述。由于突出显示组可以组合,因此它将是一个项目的数组,其中具有最高优先级的项目位于最后。每个项目都是一个字典,包含以下可能的键
kind:始终存在。以下值之一: "ui":内置 UI 突出显示。 highlight-groups "syntax":由语法声明或其他运行时/插件功能(如nvim_buf_add_highlight())应用于缓冲区的突出显示 "terminal":来自终端模拟器中运行的进程的突出显示。不包含任何其他语义信息。ui_name:来自highlight-groups的突出显示名称。仅适用于 "ui" 种类。hi_name:使用属性定义的最终:highlight组的名称。id:表示此项目的唯一数字 ID。
注意:"ui" 项目将同时包含ui_namehi_name。它们可能不同,因为内置组已链接到另一个组:hi-link,或者因为使用了'winhighlight'。即使清除突出显示组,也会传输 UI 项目,因此ui_name始终可以用于可靠地标识屏幕元素,即使没有应用任何属性也是如此。

多网格事件 ui-multigrid

ext_multigridui-option激活。隐式激活ui-linegrid
有关网格事件,请参见ui-linegrid。有关请求更改网格大小,请参见nvim_ui_try_resize_grid()。有关将鼠标事件发送到 Nvim,请参见nvim_input_mouse()
多网格扩展让 UI 可以更好地控制窗口的显示方式
UI 接收每个窗口的单独网格上的更新。
UI 可以独立地设置网格大小,而与窗口在全局布局中占用多少空间无关。因此,UI 可以为每个窗口使用不同的字体大小。或者在窗口边框周围预留空间,用于其自己的元素,例如来自 UI 工具包的滚动条。
使用专用网格来显示消息,消息可能会在窗口区域上滚动。(或者可以使用ui-messages)。
默认情况下,网格大小由 Nvim 处理,并在创建拆分时设置为外部网格大小(即 Nvim 中窗口框架的大小)。一旦 UI 设置了网格大小,Nvim 就不再处理该网格的大小,UI 必须在外部大小发生变化时更改网格大小。要将网格大小处理委托回 Nvim,请请求大小 (0, 0)。
窗口可以隐藏并重新显示,而不会取消分配其网格。这对于同一个窗口可以发生多次,例如在切换标签时。
["win_pos", grid, win, start_row, start_col, width, height]
设置 Nvim 中网格的位置和大小(即外部网格大小)。如果窗口先前已隐藏,则现在应该再次显示。
["win_float_pos", grid, win, anchor, anchor_grid, anchor_row, anchor_col, mouse_enabled, zindex]
显示或重新配置浮动窗口 win。该窗口应显示在另一个网格 anchor_grid 上,位于指定位置 anchor_rowanchor_col。有关 anchor 的含义以及定位的更多详细信息,请参见 nvim_open_win()。如果窗口可以接收鼠标事件,则 mouse_enabled 为 true。
["win_external_pos", grid, win]
显示或重新配置外部窗口 win。该窗口应显示为桌面环境中的独立顶级窗口,或类似的东西。
["win_hide", grid]
停止显示窗口。该窗口可以稍后再次显示。
["win_close", grid]
关闭窗口。
["msg_set_pos", grid, row, scrolled, sep_char]
grid 上显示消息。该网格将在默认网格(grid=1)上的 row 处显示,覆盖整个列宽。scrolled 指示消息区域是否已滚动以覆盖其他网格。在绘制分隔符时,它可能会有用 msgsep。内置 TUI 绘制一条用 sep_char'fillchars' msgsep 字段)填充的完整行,以及 hl-MsgSeparator 突出显示。
ui-messages 处于活动状态时,不会使用消息网格,并且不会发送此事件。
["win_viewport", grid, win, topline, botline, curline, curcol, line_count, scroll_delta]
指示窗口中显示的缓冲区文本范围,以及缓冲区中的光标位置。所有位置都以零为基点。如果在末尾有填充行,则 botline 设置为缓冲区行数加一。scroll_delta 包含自上次发出 win_viewport 以来窗口顶行移动的距离。它旨在用于实现平滑滚动。为此,它只计算“虚拟”或“显示”行,因此折叠只计算为一行。当滚动超过一整屏时,它是一个近似值。
所有更新(例如 grid_line)在一个批次中都会影响新的视口,尽管 win_viewport 是在更新之后接收的。例如,实现平滑滚动的应用程序应该考虑到这一点,并将网格与屏幕上显示的内容分开,并在接收到 win_viewport 后将其复制到视口目标。
["win_viewport_margins", grid, win, top, bottom, left, right]
指示窗口网格的边距,这些边距 _不_ 是由 win_viewport 事件指示的视口的一部分。例如,在存在 'winbar' 和浮动窗口边框的情况下会发生这种情况。
["win_extmark", grid, win, ns_id, mark_id, row, col]
更新当前在窗口中可见的 extmark 的位置。只有当标记具有 ui_watched 属性时才会发出。

弹出菜单事件 ui-popupmenu

ext_popupmenu ui-option 激活。
此 UI 扩展委托 popupmenu-completion 和命令行 'wildmenu' 的呈现。
["popupmenu_show", items, selected, row, col, grid]
显示 popupmenu-completionitems 是要显示的补全项的数组;每个项都是一个数组,形式为 [word, kind, menu, info],如 complete-items 中定义,只是如果存在,word 被替换为 abbrselected 是最初选择的项目,是项目数组中的一个以零为基点的索引(如果没有选择项目,则为 -1)。rowcol 给出了锚点位置,完成的词的第一个字符将位于此处。当使用 ui-multigrid 时,grid 是锚点位置的网格。当 ext_cmdline 处于活动状态时,grid 设置为 -1,表示弹出菜单应锚定到外部 cmdline。然后 col 将是 cmdline 文本中的字节位置。
["popupmenu_select", selected]
在当前弹出菜单中选择一项。selected 是来自最后一个 popupmenu_show 事件的项目数组中的一个以零为基点的索引,或者如果没有选择项目,则为 -1。
["popupmenu_hide"]
隐藏弹出菜单。

标签栏事件 ui-tabline

ext_tabline ui-option 激活。
["tabline_update", curtab, tabs, curbuf, buffers]
标签栏已更新。UI 应该在一个自定义标签栏小部件中呈现这些数据。注意:选项 curbuf + buffers 是在 API7 中添加的。curtab:当前标签页 tabs:字典列表 [{ "tab": 标签页,"name": 字符串 }, ...] curbuf:当前缓冲区句柄。buffers:字典列表 [{ "buffer": 缓冲区句柄,"name": 字符串}, ...]

命令行事件 ui-cmdline

ext_cmdline ui-option 激活。
此 UI 扩展委托 cmdline(除了 'wildmenu')的呈现。对于命令行 'wildmenu' UI 事件,激活 ui-popupmenu
["cmdline_show", content, pos, firstc, prompt, indent, level]
content: [attrs, string] 列表 [[{}, "t"], [attrs, "est"], ...]
当 cmdline 显示或更改时触发。content 是应在 cmdline 中显示的完整内容,pos 是 cmdline 中光标的位置。内容被分成具有不同突出显示属性的块,这些属性以字典的形式表示(参见 ui-event-highlight_set)。
firstcprompt 是文本,如果非空,应该显示在命令行前面。firstc 始终表示内置命令行,例如 :(ex 命令)和 / ?(搜索),而 prompt 是一个 input() 提示。indent 表示内容应该缩进多少个空格。
Nvim 命令行可以递归调用,例如在命令行提示符下输入 <c-r>=level 字段用于区分同时处于活动状态的不同命令行。第一次调用的命令行级别为 1,下次递归调用的提示级别为 2。从 cmdline-window 调用 的命令行比编辑的命令行具有更高的级别。
["cmdline_pos", pos, level]
更改 cmdline 中的光标位置。
["cmdline_special_char", c, shift, level]
在 cmdline 中光标位置显示特殊字符。这通常用于指示挂起状态,例如在 c_CTRL-V 之后。如果 shift 为 true,则光标后的文本应移位,否则应覆盖光标处的字符。
应在下一个 cmdline_show 处隐藏。
["cmdline_hide"]
隐藏 cmdline。
["cmdline_block_show", lines]
向当前命令行显示一个上下文块。例如,如果用户以交互方式定义一个 :function
:function Foo()
:  echo "foo"
:
lines 是突出显示块的行列表,形式与 "cmdline_show" 的 contents 参数相同。
["cmdline_block_append", line]
在当前显示的块末尾追加一行。
["cmdline_block_hide"]
隐藏块。

消息/对话框事件 ui-messages

ext_messages ui-option 激活。隐式激活 ui-linegridui-cmdline
此 UI 扩展委托消息和对话框的呈现。本来会在消息/命令行屏幕空间中呈现的消息,会作为 UI 事件发出。
Nvim 不会为命令行或消息分配屏幕空间。'cmdheight' 将被设置为零,但可以更改并用于替换命令行或消息窗口。命令行状态以 ui-cmdline 事件的形式发出,UI 必须处理这些事件。
["msg_show", kind, content, replace_last]
向用户显示一条消息。
kind 指示消息类型的名称:"" (空) 未知 (考虑一个功能请求:bugs) "confirm" confirm():confirm 对话框 "confirm_sub" :substitute 确认对话框 :s_c "emsg" 错误 (errors,内部错误,:throw,…) "echo" :echo 消息 "echomsg" :echomsg 消息 "echoerr" :echoerr 消息 "lua_error" :lua 代码中的错误 "rpc_error" 来自 rpcrequest() 的错误响应 "return_prompt" 多条消息后的 press-enter 提示 "quickfix" 快速修复导航消息 "search_count" 搜索计数消息('shortmess' 的 "S" 标志) "wmsg" 警告("search hit BOTTOM",W10,…) 未来可能会添加新的类型;客户端应将未知类型视为空类型。
content [attr_id, text_chunk] 元组的数组,构成具有不同突出显示的块的消息文本。块之间不应添加额外的空格,text_chunk 本身包含任何必要的空格。消息可以包含换行符 "\n"。
replace_last 决定如何显示多条消息:false:将消息与所有仍然可见的先前消息一起显示。true:在最新的 msg_show 调用中替换消息,但任何其他可见消息应仍然保留。
["msg_clear"]
清除当前由 "msg_show" 显示的所有消息。(由下面其他 "msg_" 事件发送的消息不会受到影响)。
["msg_showmode", content]
显示 'showmode'recording 消息。content 的格式与 "msg_show" 中的格式相同。此事件以空的 content 发送以隐藏最后一条消息。
["msg_showcmd", content]
显示 'showcmd' 消息。content 的格式与 "msg_show" 中的格式相同。此事件以空的 content 发送以隐藏最后一条消息。
["msg_ruler", content]
用于显示 'ruler',当状态行中没有空间放置标尺时。content 的格式与 "msg_show" 中的格式相同。此事件以空的 content 发送以隐藏最后一条消息。
["msg_history_show", entries]
在调用 :messages 命令时发送。历史记录以条目列表的形式发送,每个条目都是一个 [kind, content] 元组。
["msg_history_clear"]
清除 :messages 历史记录。
主要
命令索引
快速参考