插入

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


插入模式 插入和替换文本 模式-ins-repl
此文件的大部分内容与插入和替换模式有关。最后是几种以其他方式插入文本的命令。
用户手册第 24 章 usr_24.txt 中概述了最常用的命令。
另请参见 'virtualedit',用于将光标移动到没有字符的位置。这对编辑表格很有用。

1. 特殊键 ins-special-keys

在插入和替换模式下,以下字符具有特殊含义;其他字符将直接插入。要将这些特殊字符中的一个插入缓冲区,请在它之前加上 CTRL-V。要插入一个 <Nul> 字符,请使用“CTRL-V CTRL-@”或“CTRL-V 000”。在某些系统上,您必须使用“CTRL-V 003”来插入一个 CTRL-C注意:CTRL-V 被映射时,您通常可以使用 CTRL-Q 代替 i_CTRL-Q
如果您在插入文本时正在使用特殊的语言模式,请参阅 'langmap' 选项,'langmap',了解如何避免始终切换此模式。
char 操作
<Esc>CTRL-[ 结束插入或替换模式,返回到正常模式。完成缩写。注意:如果您的 <Esc> 键很难按,请尝试使用 CTRL-[ 代替。 i_META i_ALT ALT (META) 如果和弦未映射,则可能像 <Esc> 一样起作用。例如,<A-x> 如果 <A-x> 没有插入模式映射,则像 <Esc>x 一样起作用。 i_CTRL-C
CTRL-C 退出插入模式,返回到正常模式。不要检查缩写。不会触发 InsertLeave 自动命令事件。
i_CTRL-@
CTRL-@ 插入先前插入的文本并停止插入。
i_CTRL-A
CTRL-A 插入先前插入的文本。
i_CTRL-H i_<BS> i_BS <BS>CTRL-H 删除光标前的字符(有关联接行,请参阅 i_backspacing)。 i_<Del> i_DEL <Del> 删除光标下的字符。如果光标位于行尾,并且 'backspace' 选项包含“eol”(默认值),则删除 <EOL>;下一行将追加到当前行的后面。 i_CTRL-W
CTRL-W 删除光标前的单词(有关联接行,请参阅 i_backspacing)。有关单词的定义,请参阅“词运动”部分,word-motions
默认情况下,在删除之前设置一个新的撤销点。 default-mappings i_CTRL-U
CTRL-U 删除当前行中光标之前的所有已输入字符。如果没有新输入的字符并且 'backspace' 不为空,则删除当前行中光标之前的所有字符。如果启用 C-缩进,则如果行变为空白,则缩进将进行调整。有关联接行,请参阅 i_backspacing
默认情况下,在删除之前设置一个新的撤销点。 default-mappings i_CTRL-I i_<Tab> i_Tab <Tab>CTRL-I 插入一个制表符。如果 'expandtab' 选项处于打开状态,则会插入等效数量的空格(使用 CTRL-V <Tab> 以避免扩展;如果 CTRL-V 被映射,请使用 CTRL-Q <Tab> i_CTRL-Q)。另请参见 'smarttab' 选项和 ins-expandtabi_CTRL-J i_<NL> <NL>CTRL-J 开始新行。 i_CTRL-M i_<CR> <CR>CTRL-M 开始新行。 i_CTRL-K
CTRL-K {char1} [char2] 输入二元图(请参阅 二元图)。当 {char1} 是一个特殊键时,该键的代码将以 <> 形式插入。例如,字符串“<S-Space>”可以通过键入 <C-K><S-Space>(两个键)来输入。这两个字符都不被视为映射。
CTRL-N 查找下一个关键字(请参阅 i_CTRL-N)。CTRL-P 查找上一个关键字(请参阅 i_CTRL-P)。
CTRL-R {register} i_CTRL-R
插入寄存器的内容。在键入 CTRL-R 和第二个字符之间,将显示“"”,以指示您需要输入寄存器的名称。文本将像您键入它一样插入,但不会使用映射和缩写。如果设置了诸如 'textwidth''formatoptions''autoindent' 之类的选项,这将影响将要插入的内容。这与使用“p”命令和使用鼠标粘贴不同。特殊寄存器:“" 未命名的寄存器,包含最后一次删除或 yank 的文本 "%" 当前文件名 "#" 备用文件名 "*" 剪贴板内容(X11:主要选择) "+" 剪贴板内容 "/" 最后一次搜索模式 ":" 最后一次命令行 "." 最后插入的文本 i_CTRL-R_-
'-' 最后一次小的(小于一行)删除寄存器。这是可重复的,因为它使用 . 因为它记得要放置的寄存器,而不是要插入的文字。 i_CTRL-R_=
'=' 表达式寄存器:系统将提示您输入一个表达式(请参阅 表达式)请注意,0x80(十进制为 128)用于特殊键。例如,您可以使用它向上移动光标:CTRL-R ="\<Up>" 使用 CTRL-R CTRL-R 来逐字插入文本。当结果是 List 时,这些项目用作行。它们内部也可以有换行符。当结果是 Float 时,它会自动转换为 String。当调用 append() 或 setline() 时,撤销序列将被破坏。有关寄存器,请参阅 registers
CTRL-R CTRL-R {register} i_CTRL-R_CTRL-R
插入寄存器的内容。与使用单个 CTRL-R 一样,但文本将逐字插入,而不是像键入一样插入。当寄存器包含 <BS> 之类的字符时,这一点会有所不同。例如,当寄存器 a 包含“ab^Hc”时
CTRL-R a                results in "ac".
CTRL-R CTRL-R a                results in "ab^Hc".
选项 'textwidth''formatoptions' 等仍然适用。如果还希望避免这些,请使用 CTRL-R CTRL-O,见下文。'.' 寄存器(最后插入的文本)仍然像键入一样插入。在此命令之后,'.' 寄存器包含来自寄存器的文本,就好像它是通过键入插入的一样。
CTRL-R CTRL-O {register} i_CTRL-R_CTRL-O
逐字插入寄存器的内容,不自动缩进。与使用鼠标粘贴相同 <MiddleMouse>。当寄存器是按行时,这将像 P 一样在当前行的上面插入文本。'.' 寄存器(最后插入的文本)仍然像键入一样插入。在此命令之后,'.' 寄存器包含键入的命令,而不是文本。即,文字 "^R^O" 而不是来自寄存器的文本。不会替换 替换模式 中的字符!
CTRL-R CTRL-P {register} i_CTRL-R_CTRL-P
逐字插入寄存器的内容并修正缩进,就像 [<MiddleMouse> 一样。'.' 寄存器(最后插入的文本)仍然像键入一样插入。在此命令之后,'.' 寄存器包含键入的命令,而不是文本。即,文字 "^R^P" 而不是来自寄存器的文本。不会替换 替换模式 中的字符!
i_CTRL-T
CTRL-T 在当前行的开头插入一个 shiftwidth 的缩进。缩进始终四舍五入到一个 'shiftwidth'
CTRL-D 删除当前行的开头的一个 shiftwidth 的缩进。缩进始终四舍五入到一个 'shiftwidth'
i_0_CTRL-D
0 CTRL-D 删除当前行中的所有缩进。
i_^_CTRL-D
^ CTRL-D 删除当前行中的所有缩进。缩进将在下一行恢复。当插入标签时,这很有用。
i_CTRL-V
CTRL-V 逐字插入下一个非数字字符。也可以输入字符的十进制、八进制或十六进制值 i_CTRL-V_digit。在 CTRL-V 之后键入的字符不会被视为映射。对于特殊键,CTRL 修饰符可以包含在键中以生成一个控制字符。如果该键没有控制字符,则会插入它的 key-notation注意:CTRL-V 被映射(例如,粘贴文本)时,您通常可以使用 CTRL-Q 代替 i_CTRL-Q
i_CTRL-Q
CTRL-Q 与 CTRL-V 相同。注意:某些终端连接可能会吃掉 CTRL-Q,在这种情况下它不起作用。它在 GUI 中有效。

CTRL-SHIFT-V i_CTRL-SHIFT-V i_CTRL-SHIFT-Q

CTRL-SHIFT-Q 的工作方式与 CTRL-V 相同,但不要尝试将 CTRL 修饰符包含在键中。
CTRL-X 进入 CTRL-X 模式。这是一个子模式,可以在其中给出命令来完成单词或滚动窗口。请参阅 i_CTRL-Xins-completion
i_CTRL-E
CTRL-E 插入光标下方的字符。 i_CTRL-Y
CTRL-Y 插入光标上方的字符。请注意,对于 CTRL-ECTRL-Y,不会使用 'textwidth',以便能够从长行中复制字符。
i_CTRL-_
CTRL-_ 在插入方向之间切换,方法是切换 'revins'
CTRL-_ 将光标移动到键入文本的末尾。
此命令仅在设置了 'allowrevins' 选项时才可用。有关从右到左模式的更多信息,请参阅 rileft.txt
i_CTRL-^
CTRL-^ 切换是否使用键入语言字符。当定义语言 :lmap 映射时
如果 'iminsert' 为 1(使用 langmap 映射),则变为 0(不使用 langmap 映射)。
如果 'iminsert' 有其他值,则变为 1,从而启用 langmap 映射。当未定义任何语言映射时
如果 'iminsert' 为 2(使用输入法),则变为 0(不使用输入法)。
如果 'iminsert' 有其他值,则变为 2,从而启用输入法。当设置为 1 时,“b:keymap_name” 变量的值、'keymap' 选项或“<lang>” 会出现在状态行中。语言映射通常用于输入与键盘产生的字符不同的字符。 'keymap' 选项可用于安装大量语言映射。
i_CTRL-]
CTRL-] 触发缩写,不插入字符。
i_<Insert>
<Insert> 在插入和替换模式之间切换。
<BS>CTRL-WCTRL-U 的效果取决于 'backspace' 选项(除非设置了 'revins')。这是一个用逗号分隔的项目列表
项目 行动
indent 允许在自动缩进上退格 eol 允许在行尾退格(合并行) start 允许在插入开始位置退格;CTRL-WCTRL-U 在开始位置停止一次
'backspace' 为空时,将使用与 Vi 兼容的退格功能。您不能在自动缩进上退格,也不能在第 1 列之前或插入开始位置之前退格。
为了向后兼容,也允许使用值“0”、“1”、“2”和“3”,请参见 'backspace'
如果 'backspace' 选项包含“eol”,并且当使用这三个键之一时光标位于第 1 列,则当前行将与前一行合并。这实际上是删除了光标前的 <EOL>
i_CTRL-V_digit
使用 CTRL-V,可以直接输入字符的十进制、八进制或十六进制值。通过这种方式,您可以输入任何字符,但换行符 (<NL>,值为 10) 除外。有五种方法可以输入字符值
第一个字符 模式 最大字符数 最大值
(无) 十进制 3 255 o 或 O 八进制 3 377 (255) x 或 X 十六进制 2 ff (255) u 十六进制 4 ffff (65535) U 十六进制 8 7fffffff (2147483647)
通常,您会输入最大数量的字符。因此,要输入空格(值为 32),您需要输入 <C-V>032。您可以省略前导零,在这种情况下,在数字后输入的字符必须是非数字字符。这在其他模式下也是如此:只要您输入的字符对该模式无效,之前的数值就会被使用,并且“无效”字符将以正常方式处理。
如果您输入的值为 10,它将以 0 的形式出现在文件中。10 是一个 <NL>,它在内部用于表示 <Nul> 字符。将缓冲区写入文件时,<NL> 字符将被转换为 <Nul><NL> 字符将写入每行末尾。因此,如果您要在文件中插入 <NL> 字符,则需要进行换行。另请参见 'fileformat'
i_CTRL-X insert_expand CTRL-X 进入子模式,可以在其中使用多个命令。大多数命令都执行关键字补全;请参见 ins-completion
可以使用两个命令在不退出插入模式的情况下上下滚动窗口
i_CTRL-X_CTRL-E
CTRL-X CTRL-E 将窗口向上滚动一行。在进行补全时,请查看此处:complete_CTRL-E
i_CTRL-X_CTRL-Y
CTRL-X CTRL-Y 将窗口向下滚动一行。在进行补全时,请查看此处:complete_CTRL-Y
按下 CTRL-X 后,每次 CTRL-E (CTRL-Y) 将窗口向上 (向下) 滚动一行,除非这会导致光标从其在文件中的当前位置移动。只要按下另一个键,CTRL-X 模式就会退出,并且该键将按插入模式解释。

2. 特殊特殊键 ins-special-special

以下键是特殊的。它们会停止当前插入操作,执行某些操作,然后重新开始插入操作。这意味着您可以在不退出插入模式的情况下执行某些操作。如果您希望始终使用插入模式,就像没有单独的普通模式的编辑器一样,这将非常方便。如果要将功能键映射到命令,可以使用 CTRL-O
这些键之前和之后的变化(插入或删除的字符)可以分别撤消。只能重做最后一次更改,并且始终表现得像“i”命令。
char 操作

<Up> 光标向上移动一行 i_<Up>

<Down> 光标向下移动一行 i_<Down>
CTRL-G <Up> 光标向上移动一行,插入开始列 i_CTRL-G_<Up>
CTRL-G k 光标向上移动一行,插入开始列 i_CTRL-G_k
CTRL-G CTRL-K 光标向上移动一行,插入开始列 i_CTRL-G_CTRL-K
CTRL-G <Down> 光标向下移动一行,插入开始列 i_CTRL-G_<Down> CTRL-G j 光标向下移动一行,插入开始列 i_CTRL-G_j CTRL-G CTRL-J 光标向下移动一行,插入开始列 i_CTRL-G_CTRL-J <Left> 光标向左移动一个字符 i_<Left>
<Right> 光标向右移动一个字符 i_<Right>
<S-Left> 光标向后移动一个单词(类似“b”命令) i_<S-Left>
<C-Left> 光标向后移动一个单词(类似“b”命令) i_<C-Left>
<S-Right> 光标向前移动一个单词(类似“w”命令) i_<S-Right> <C-Right> 光标向前移动一个单词(类似“w”命令) i_<C-Right> <Home> 光标移动到行中的第一个字符 i_<Home>
<End> 光标移动到行中最后一个字符之后 i_<End>
<C-Home> 光标移动到文件中的第一个字符 i_<C-Home>
<C-End> 光标移动到文件中的最后一个字符之后 i_<C-End>
<LeftMouse> 光标移动到鼠标点击的位置 i_<LeftMouse>
<S-Up> 将窗口向上移动一页 i_<S-Up>
<PageUp> 将窗口向上移动一页 i_<PageUp>
<S-Down> 将窗口向下移动一页 i_<S-Down>
<PageDown> 将窗口向下移动一页 i_<PageDown>
<ScrollWheelDown> 将窗口向下移动三行 i_<ScrollWheelDown> <S-ScrollWheelDown> 将窗口向下移动一页 i_<S-ScrollWheelDown>
<ScrollWheelUp> 将窗口向上移动三行 i_<ScrollWheelUp>
<S-ScrollWheelUp> 将窗口向上移动一页 i_<S-ScrollWheelUp>
<ScrollWheelLeft> 将窗口向左移动六列 i_<ScrollWheelLeft> <S-ScrollWheelLeft> 将窗口向左移动一页 i_<S-ScrollWheelLeft>
<ScrollWheelRight> 将窗口向右移动六列 i_<ScrollWheelRight> <S-ScrollWheelRight> 将窗口向右移动一页 i_<S-ScrollWheelRight>
CTRL-O 执行一个命令,返回插入模式 i_CTRL-O CTRL-\ CTRL-O 类似于 CTRL-O,但不移动光标 i_CTRL-\_CTRL-O
CTRL-G u 关闭撤消序列,开始新的更改 i_CTRL-G_u
CTRL-G U 不要使用下一个 i_CTRL-G_U 左右光标移动开始新的撤消块,如果光标保持在同一行内
CTRL-O 命令有时会有副作用:如果光标位于行尾之后,它将被放在行中的最后一个字符上。在映射中,最好使用 <Esc>(首先在文本中输入“x”,<Esc> 之后会始终将光标放在它上面)。或者使用 CTRL-\ CTRL-O,但要小心光标可能位于行尾之后。请注意,CTRL-\ CTRL-O 后面的命令仍然可以移动光标,它不会恢复到原始位置。
CTRL-O 命令将您带到普通模式。如果您随后使用一个命令再次进入插入模式,它通常不会嵌套。因此,当输入“a<C-O>a”然后 <Esc> 将您带回到普通模式时,您不需要输入 <Esc> 两次。一个例外是当不输入命令时,例如执行映射或加载脚本时。这使得简要切换到插入模式的映射能够正常工作。
并非所有终端都提供移位光标键。
另一个副作用是,在“i”或“a”命令之前指定的计数将被忽略。这是因为在 CTRL-O 之后重复命令的效果过于复杂。
使用 CTRL-G u 的示例
:inoremap <C-H> <C-G>u<C-H>
这会重新定义退格键,使其开始新的撤消序列。现在,您可以撤消退格键的效果,而不会更改在此之前键入的内容,方法是使用 CTRL-O u。另一个示例
:inoremap <CR> <C-]><C-G>u<CR>
这会在每个换行符处开始一个新的撤消块。它还会在此之前扩展缩写。
使用 CTRL-G U 的示例
inoremap <Left>  <C-G>U<Left>
inoremap <Right> <C-G>U<Right>
inoremap <expr> <Home> col('.') == match(getline('.'), '\S') + 1 ?
 \ repeat('<C-G>U<Left>', col('.') - 1) :
 \ (col('.') < match(getline('.'), '\S') ?
 \     repeat('<C-G>U<Right>', match(getline('.'), '\S') + 0) :
 \     repeat('<C-G>U<Left>', col('.') - 1 - match(getline('.'), '\S')))
inoremap <expr> <End> repeat('<C-G>U<Right>', col('$') - col('.'))
inoremap ( ()<C-G>U<Left>
这使得可以在插入模式下使用光标键,而不会开始新的撤消块,因此使用 .(重做)将按预期工作。同样,输入类似的文本(使用上述“(”映射)
Lorem ipsum (dolor
可以使用 . 重复到预期的
Lorem ipsum (dolor)
使用 CTRL-O 会拆分撤消操作:它之前和之后键入的文本会分别撤消。如果您想避免这种情况(例如,在映射中),您可以使用 CTRL-R = i_CTRL-R。例如,要调用一个函数
:imap <F2> <C-R>=MyFunc()<CR>
'whichwrap' 选项适当地设置时,行首/行尾的 <Left><Right> 键会使光标环绕到前一行/后一行。
CTRL-G j 和 CTRL-G k 命令可用于在列前插入文本。示例
int i;
int j;
将光标放在第一个“int”上,键入“istatic <C-G>j”。结果是
static int i;
       int j;
要在每行中列前插入相同的文本,请使用视觉块命令“I” v_b_I
可以使用 'textwidth' 选项在行过长时自动换行。将 'textwidth' 选项设置为所需的行的最大长度。如果然后输入更多字符(不是空格或制表符),最后一个词将放在新行上(除非它是该行上的唯一词)。如果将 'textwidth' 设置为 0,则此功能将被禁用。
'wrapmargin' 选项的功能几乎相同。区别在于 'textwidth' 具有固定宽度,而 'wrapmargin' 取决于屏幕宽度。使用 'wrapmargin' 时,这等同于使用 'textwidth' 并将值设置为 (columns - 'wrapmargin'),其中 columns 是屏幕宽度。
'textwidth''wrapmargin' 都设置时,将使用 'textwidth'
如果您不想真正换行,而是希望在方便的位置看到换行的行,请参见 'linebreak' 选项。
只有在使用插入模式或追加到行时才会自动换行。在替换模式下,如果行长度未更改,则不会换行。
如果在边距后输入非空白字符,则会换行。可以通过在 'formatoptions' 选项中添加字符来限制换行的情况:“l” 只有在插入开始时行长度不超过 'textwidth' 时才换行。“v” 只有在当前插入命令中输入的空白字符处换行。这与 Vi 大致兼容。“lv” 只有在插入开始时行长度不超过 'textwidth' 且只有在当前插入命令中输入的空白字符处换行。只有在跨越 'textwidth' 边界时输入非空白字符时,才会与“l” 不同。
通常会使用内部函数来决定在何处换行。如果您想以其他方式进行操作,请将 'formatexpr' 选项设置为一个表达式,该表达式将负责换行。
如果您想格式化一段文本,可以使用 "gq" 操作符。键入 "gq" 和一个移动命令以将光标移动到块的末尾。在很多情况下,命令 "gq}" 将执行您想要的操作(格式化到段落末尾)。或者,您可以使用 "gqap",它将格式化整个段落,无论光标当前位于何处。或者,您可以使用可视模式:按下 "v",移动到块的末尾,然后键入 "gq"。另请参见 gq
如果 'expandtab' 选项处于打开状态,则将使用空格来填充制表符的空格量。如果您要输入真实的 <Tab>,请先键入 CTRL-V(如果 CTRL-V 已映射 i_CTRL-Q,则使用 CTRL-Q)。默认情况下, 'expandtab' 选项处于关闭状态。请注意,在替换模式下,单个字符将替换为多个空格。这样会导致行中的字符数增加。退格键将一次删除一个空格。只有当您退格一个空格(最后一个)时,才会还原原始字符。
ins-smarttab
'smarttab' 选项处于打开状态时,一个 <Tab> 会在行首插入 'shiftwidth' 个位置,在其他位置插入 'tabstop' 个位置。这意味着通常会插入空格而不是 <Tab> 字符。当 'smarttab' 处于关闭状态时,一个 <Tab> 始终会插入 'tabstop' 个位置,而 'shiftwidth' 只用于 ">>" 等操作。
ins-softtabstop
'softtabstop' 选项不为零时,一个 <Tab> 会插入 'softtabstop' 个位置,而用于删除空白的 <BS> 将删除 'softtabstop' 个位置。这感觉就像 'tabstop' 被设置为 'softtabstop',但实际的 <Tab> 字符仍然占用 'tabstop' 个位置,因此您的文件在其他应用程序中使用时仍然会保持正确的外观。
如果 'softtabstop' 不为零,则 <BS> 将尝试删除尽可能多的空白以移动到上一个 'softtabstop' 位置,除非之前插入的字符是空格,在这种情况下,它只会删除光标之前的字符。否则,您不能总是删除光标之前的单个字符。您必须先删除 'softtabstop' 个字符,然后键入额外的空格才能到达您想要的位置。
在普通模式下使用 "R" 命令进入替换模式。
在替换模式下,您键入的每个字符都会删除行中的一个字符。如果没有字符可删除(在行尾),则会追加键入的字符(如插入模式)。因此,行中的字符数保持不变,直到您到达行尾。如果键入 <NL>,则会插入换行符,不会删除任何字符。
注意 <Tab> 字符。如果在 <Tab> 字符的位置键入普通打印字符,字符数将保持不变,但列数将变小。
如果在替换模式下删除字符(使用 <BS>CTRL-WCTRL-U),则会删除更改。被替换的字符将被还原。如果您已键入超过现有文本,则会删除您添加的字符。这实际上是一次性撤销字符。
如果 'expandtab' 选项处于打开状态,则 <Tab> 将用多个空格替换一个字符。这样会导致行中的字符数增加。退格键将一次删除一个空格。只有当您退格一个空格(最后一个)时,才会还原原始字符。

6. 虚拟替换模式 vreplace-mode Virtual-Replace-mode

在普通模式下使用 "gR" 命令进入虚拟替换模式。
虚拟替换模式类似于替换模式,但它不会替换文件中实际的字符,而是替换屏幕空间,这样,文件中的后续字符似乎永远不会移动。
因此,如果您键入 <Tab>,它可能会替换多个普通字符,如果您在 <Tab> 上键入一个字母,它可能根本不会替换任何内容,因为 <Tab> 仍然会与之前对齐到相同的位置。
键入 <NL> 仍然不会导致文件中的后续字符似乎移动。当前行的其余部分将被 <NL> 替换(即,它们将被删除),并且替换将在下一行继续。除非您超过文件末尾,否则不会插入新行。
使用 CTRL-TCTRL-D 时,会看到有趣的效果。光标之前的字符会像平常一样向侧面移动,但行中的后续字符仍然保持静止。CTRL-T 会将一些旧行隐藏在移动的字符下方,但 CTRL-D 会再次显示它们。
与替换模式一样,使用 <BS> 等将还原被替换的字符。这仍然与 'smartindent'CTRL-T 和 CTRL-D、 'expandtab''smarttab''softtabstop' 等一起工作。
'list' 模式下,虚拟替换模式会像没有处于 'list' 模式一样,除非 "L" 在 'cpoptions' 中。
请注意,光标后的字符似乎移动的唯一情况是在列表模式 'list' 中,以及偶尔在 'wrap' 设置时(并且行长度发生变化,变得比屏幕宽度更短或更宽)。在其他情况下,可能会插入空格以避免后续字符移动。
此模式对于编辑表格中用 <Tab> 分隔的列,以及在保持所有列对齐的情况下输入新数据非常有用。

7. 插入模式完成 ins-completion

在插入和替换模式下,有几个命令可以完成已键入的关键字或行的一部分。如果您使用复杂的关键字(例如,包含大写字母和下划线的函数名),这将非常有用。
完成可以针对以下内容进行:
1. 整行 i_CTRL-X_CTRL-L 2. 当前文件中的关键字 i_CTRL-X_CTRL-N 3. 'dictionary' 中的关键字 i_CTRL-X_CTRL-K 4. 'thesaurus' 中的关键字,同义词词典样式 i_CTRL-X_CTRL-T 5. 当前文件和包含文件中包含的关键字 i_CTRL-X_CTRL-I 6. 标记 i_CTRL-X_CTRL-] 7. 文件名 i_CTRL-X_CTRL-F 8. 定义或宏 i_CTRL-X_CTRL-D 9. Vim 命令行 i_CTRL-X_CTRL-V 10. 用户定义的完成 i_CTRL-X_CTRL-U 11. 全能完成 i_CTRL-X_CTRL-O 12. 拼写建议 i_CTRL-X_s 13. 'complete' 中的关键字 i_CTRL-N i_CTRL-P
此外, i_CTRL-X_CTRL-Z 会停止完成,而不会更改文本。
除了 CTRL-NCTRL-P 之外,所有这些操作都在 CTRL-X 模式下完成。这是插入和替换模式的子模式。您可以通过键入 CTRL-X 和一个 CTRL-X 命令来进入 CTRL-X 模式。您可以通过键入一个不是有效 CTRL-X 模式命令的键来退出 CTRL-X 模式。有效的键是 CTRL-X 命令本身、CTRL-N(下一个)和 CTRL-P(上一个)。
要获取当前完成信息,可以使用 complete_info() 。如果要调整匹配的大小写,请参见 'infercase' 选项。
complete_CTRL-E
当完成处于活动状态时,可以使用 CTRL-E 来停止它并返回到最初键入的文本。不会插入 CTRL-E
complete_CTRL-Y
当弹出菜单显示时,可以使用 CTRL-Y 来停止完成并接受当前选定的条目。不会插入 CTRL-Y 。键入空格、回车或其他不可打印字符将退出完成模式并插入键入的字符。
当弹出菜单显示时,还有一些其他特殊键,请参见 popupmenu-keys
注意:CTRL-X 模式下有效的键不会被映射。这允许 :map <C-F> <C-X><C-F> 工作。结束 CTRL-X 模式的键(任何不是有效 CTRL-X 模式命令的键)都已映射。此外,当使用 'complete' 进行完成时,映射会照常应用。
E565
注意:在完成操作处于活动状态时,不能递归使用插入模式,也不能更改缓冲区文本。以某种方式调用“:normal i..”的映射将生成 E565 错误。
建议使用以下映射来简化输入完成命令的过程(尽管它们会隐藏其他命令)。
:inoremap <C-]> <C-X><C-]>
:inoremap <C-F> <C-X><C-F>
:inoremap <C-D> <C-X><C-D>
:inoremap <C-L> <C-X><C-L>
作为一个特殊情况,输入CTRL-R执行寄存器插入(参见 i_CTRL-R)不会退出CTRL-X模式。这主要是为了允许使用“=”寄存器调用某些函数来确定下一个操作。如果寄存器的内容(或“=”寄存器评估的结果)不是有效的CTRL-X模式键,则CTRL-X模式将退出,就像这些键已被输入一样。
例如,以下将映射<Tab>,如果当前行当前仅包含空格,则实际插入<Tab>,或者启动/继续CTRL-N完成操作。
function! CleverTab()
   if strpart( getline('.'), 0, col('.')-1 ) =~ '^\s*$'
      return "\<Tab>"
   else
      return "\<C-N>"
   endif
endfunction
inoremap <Tab> <C-R>=CleverTab()<CR>
完成整行 compl-whole-line
i_CTRL-X_CTRL-L
CTRL-X CTRL-L 向后搜索以当前行中光标之前的相同字符开头的行。忽略缩进。匹配的行插入到光标前面。 'complete' 选项用于决定搜索哪些缓冲区以进行匹配。同时使用加载和未加载的缓冲区。CTRL-LCTRL-P 向后搜索下一个匹配行。此行将替换上一个匹配行。
CTRL-N 向前搜索下一个匹配行。此行将替换上一个匹配行。
CTRL-X CTRL-L 在扩展行之后,您还可以通过再次输入CTRL-X CTRL-L 来获取其旁边的行,除非使用双CTRL-X。仅适用于已加载的缓冲区。
完成当前文件中的关键字 compl-current
i_CTRL-X_CTRL-P
i_CTRL-X_CTRL-N
CTRL-X CTRL-N 向前搜索以光标前的关键字开头的单词。找到的关键字插入到光标前面。
CTRL-X CTRL-P 向后搜索以光标前的关键字开头的单词。找到的关键字插入到光标前面。
CTRL-N 向前搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-P 向后搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-X CTRL-NCTRL-X CTRL-P 除非使用双CTRL-X,否则进一步使用CTRL-X CTRL-NCTRL-X CTRL-P 将复制先前扩展中其他上下文中的后续单词。
如果光标前有关键字(由字母字符和 'iskeyword' 中的字符组成的名称),则将其用作搜索模式,并在前面加上“\<” (含义:单词的开头)。否则,使用“\<\k\k” 作为搜索模式(至少两个字符的任何关键字的开头)。
在替换模式下,替换的字符数取决于匹配字符串的长度。这就像在替换模式下输入匹配字符串的字符一样。
如果光标前没有有效的关键字字符,则匹配任何至少两个字符的关键字。例如,要获取:printf("(%g, %g, %g)", vector[0], vector[1], vector[2]); 只要输入:printf("(%g, %g, %g)", vector[0], ^P[1], ^P[2]);
搜索将绕过文件末尾,'wrapscan' 的值在此处不适用。
跳过相同完成的多次重复;因此,每次CTRL-NCTRL-P 都将插入不同的匹配项(除非只有一个匹配的关键字)。
永远不包含单字符匹配,因为它们通常会妨碍您真正要做的。例如,要获取:printf("name = %s\n", name); 只要输入:printf("name = %s\n", n^P); 甚至:printf("name = %s\n", ^P); '\n' 中的 'n' 被跳过。
扩展单词后,您可以使用CTRL-X CTRL-PCTRL-X CTRL-N 来获取其他上下文中的后续单词。这些序列搜索刚刚扩展的文本并通过获取一个额外的单词来进一步扩展。如果您需要重复一系列复杂的单词,这将很有用。尽管CTRL-PCTRL-N 仅查找至少两个字符的字符串,但CTRL-X CTRL-P 和 CTRL-X CTRL-N 可用于扩展仅包含一个字符的单词。例如,要获取:M&eacute;xico,您可以输入:M^N^P^X^P^X^P CTRL-N 启动扩展,然后CTRL-P 取回单个字符“M”,接下来的两个CTRL-X CTRL-P 获取单词“&eacute”和“;xico”。
如果之前的扩展被拆分,因为它比 'textwidth' 更长,那么将只使用当前行中的文本。
如果找到的匹配项位于行尾,则将插入下一行的第一个单词,并显示消息“来自其他行的单词”。如果接受此单词,则下一个CTRL-X CTRL-PCTRL-X CTRL-N 将搜索以该单词开头的那些行。
完成 'dictionary' 中的关键字 compl-dictionary
i_CTRL-X_CTRL-K
CTRL-X CTRL-K 使用 'dictionary' 选项提供的文件搜索以光标前的关键字开头的单词。这与CTRL-N 相似,但只搜索字典文件,不搜索当前文件。找到的关键字插入到光标前面。这可能会非常慢,因为所有匹配项都会在使用第一个匹配项之前找到。默认情况下, 'dictionary' 选项为空。有关查找单词列表的位置的建议,请参见 'dictionary' 选项。 'ignorecase''smartcase''infercase' 适用。
CTRL-KCTRL-N 向前搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-P 向后搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
完成 'thesaurus' 中的单词 compl-thesaurus
i_CTRL-X_CTRL-T
CTRL-X CTRL-T 的工作方式与CTRL-X CTRL-K 相似,但方式特殊。它使用 'thesaurus' 选项而不是 'dictionary'。如果在词库文件中找到匹配项,则同一行上的所有剩余单词都将包含在匹配项中,即使它们不完成该单词。因此,可以完全替换单词。
CTRL-TCTRL-N 向前搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-P 向后搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
'thesaurus' 选项使用的文件中,文件中的每一行都应包含具有相似含义的单词,这些单词由非关键字字符分隔(首选空格)。最大行长为 510 字节。
例如,假设 'thesaurus' 文件有一行如下所示
angry furious mad enraged
将光标放在字母“ang”之后并输入CTRL-X CTRL-T 将完成单词“angry”;后续按压将更改单词为“furious”、“mad”等。
其他用途包括两种语言之间的翻译或按关键字对 API 函数进行分组。
一个英文单词列表已添加到此 github 问题中:https://github.com/vim/vim/issues/629#issuecomment-443293282 解压缩 thesaurus_pkg.zip,将 thesaurus.txt 文件放在某个位置,例如 ~/.vim/thesaurus/english.txt,并将 'thesaurus' 选项设置为该文件名。
使用 'thesaurusfunc' 完成关键字 compl-thesaurusfunc
如果设置了 'thesaurusfunc' 选项,则将调用用户指定的函数来获取完成匹配列表,并且不会使用 'thesaurus' 选项。有关如何调用函数及其应返回的内容的说明,请参见 complete-functions
这是一个使用“aiksaurus”命令(由 Magnus Groß 提供)的示例
func Thesaur(findstart, base)
  if a:findstart
    return searchpos('\<', 'bnW', line('.'))[1] - 1
  endif
  let res = []
  let h = ''
  for l in systemlist('aiksaurus ' .. shellescape(a:base))
    if l[:3] == '=== '
      let h = '(' .. substitute(l[4:], ' =*$', ')', '')
    elseif l ==# 'Alphabetically similar known words are: '
      let h = "\U0001f52e"
    elseif l[0] =~ '\a' || (h ==# "\U0001f52e" && l[0] ==# "\t")
      call extend(res, map(split(substitute(l, '^\t', '', ''), ', '), {_, val -> {'word': val, 'menu': h}}))
    endif
  endfor
  return res
endfunc
if exists('+thesaurusfunc')
  set thesaurusfunc=Thesaur
endif
完成当前文件和包含文件中的关键字 compl-keyword
'include' 选项用于指定包含包含文件名的一行。 'path' 选项用于搜索包含文件。
i_CTRL-X_CTRL-I
CTRL-X CTRL-I 在当前文件和包含文件中搜索以光标之前的相同字符开头的第一个关键字。匹配的关键字插入到光标前面。
CTRL-N 向前搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。 注意:CTRL-I<Tab> 相同,后者很可能在完成成功后输入,因此CTRL-I 不用于搜索下一个匹配项。
CTRL-P 向后搜索上一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-X CTRL-I 除非使用双CTRL-X,否则进一步使用CTRL-X CTRL-I 将复制先前扩展中其他上下文中的后续单词。
完成标签 compl-tag
i_CTRL-X_CTRL-]
CTRL-X CTRL-] 搜索以光标之前的相同字符开头的第一个标签。匹配的标签插入到光标前面。字母字符和 'iskeyword' 中的字符用于决定哪些字符包含在标签名中(与关键字相同)。另请参见 CTRL-]'showfulltag' 选项可用于添加标签定义周围的上下文。CTRL-]CTRL-N 向前搜索下一个匹配的标签。此标签将替换上一个匹配的标签。
CTRL-P 向后搜索上一个匹配的标签。此标签将替换上一个匹配的标签。
完成文件名 compl-filename
i_CTRL-X_CTRL-F
CTRL-X CTRL-F 搜索以光标之前的相同字符开头的第一个文件名。匹配的文件名插入到光标前面。字母字符和 'isfname' 中的字符用于决定哪些字符包含在文件名中。 注意:'path' 选项在此处不适用(尚未)。CTRL-FCTRL-N 向前搜索下一个匹配的文件名。此文件名将替换上一个匹配的文件名。
CTRL-P 向后搜索上一个匹配的文件名。此文件名将替换上一个匹配的文件名。
完成定义或宏 compl-define
'define' 选项用于指定包含定义的一行。 'include' 选项用于指定包含包含文件名的一行。 'path' 选项用于搜索包含文件。
i_CTRL-X_CTRL-D
CTRL-X CTRL-D 在当前文件和包含文件中搜索以光标之前的相同字符开头的第一个定义(或宏)名称。找到的定义名称插入到光标前面。CTRL-DCTRL-N 向前搜索下一个匹配的宏名称。此宏名称将替换上一个匹配的宏名称。
CTRL-P 向后搜索上一个匹配的宏名称。此宏名称将替换上一个匹配的宏名称。
CTRL-X CTRL-D 除非使用双CTRL-X,否则进一步使用CTRL-X CTRL-D 将复制先前扩展中其他上下文中的后续单词。
完成 Vim 命令 compl-vim
补全功能是上下文敏感的。它像在命令行中一样工作。它完成一个 Ex 命令及其参数。这在编写 Vim 脚本时很有用。
i_CTRL-X_CTRL-V
CTRL-X CTRL-V 猜测光标前的项目类型并找到第一个匹配项。 注意:CTRL-V 被映射时,你通常可以使用 CTRL-Q 来代替 i_CTRL-QCTRL-VCTRL-N 向前搜索下一个匹配项。此匹配项将替换上一个匹配项。
CTRL-P 向后搜索上一个匹配项。此匹配项将替换上一个匹配项。
CTRL-X CTRL-V CTRL-X CTRL-V 的进一步使用将与 CTRL-V 相同。这允许将一个键映射到执行 Vim 命令补全,例如
:imap <Tab> <C-X><C-V>
用户定义的补全 compl-function
补全功能由一个函数完成,该函数可以通过 'completefunc' 选项由用户定义。有关函数如何被调用以及一个示例,请参见 complete-functions
i_CTRL-X_CTRL-U
CTRL-X CTRL-U 猜测光标前的项目类型并找到第一个匹配项。 CTRL-UCTRL-N 使用下一个匹配项。此匹配项将替换上一个匹配项。
CTRL-P 使用上一个匹配项。此匹配项将替换上一个匹配项。
万能补全 compl-omni
补全功能由一个函数完成,该函数可以通过 'omnifunc' 选项由用户定义。这将用于特定于文件类型的补全。
有关函数如何被调用以及一个示例,请参见 complete-functions。有关特定文件类型的备注,请参见 compl-omni-filetypes。更多补全脚本将出现,请查看 www.vim.org。目前有一个 C++ 的第一个版本。
i_CTRL-X_CTRL-O
CTRL-X CTRL-O 猜测光标前的项目类型并找到第一个匹配项。 CTRL-OCTRL-N 使用下一个匹配项。此匹配项将替换上一个匹配项。
CTRL-P 使用上一个匹配项。此匹配项将替换上一个匹配项。
拼写建议 compl-spelling
找到光标之前或光标处的单词,并建议正确拼写的单词来替换它。如果行中有一个拼写错误的单词,在光标之前或下方,光标将移到它之后。否则,光标之前的单词将用于建议,即使它没有拼写错误。
注意: CTRL-S 在许多 Unix 终端中会暂停显示。使用 's' 代替。键入 CTRL-Q 以恢复显示。
i_CTRL-X_CTRL-S i_CTRL-X_s CTRL-X CTRL-S 或 CTRL-X s 找到光标前的单词并找到它的第一个拼写建议。 CTRL-SCTRL-N 使用下一个建议。这将替换上一个建议。注意,你不能在这里使用 's'。
CTRL-P 使用上一个建议。这将替换上一个建议。
从不同来源完成关键字 compl-generic
i_CTRL-N
CTRL-N 查找以光标前的关键字开头的单词的下一个匹配项,在 'complete' 选项中指定的范围内查找。找到的关键字将插入光标之前。
i_CTRL-P
CTRL-P 查找以光标前的关键字开头的单词的先前匹配项,在 'complete' 选项中指定的范围内查找。找到的关键字将插入光标之前。
CTRL-N 向前搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-P 向后搜索下一个匹配的关键字。此关键字将替换上一个匹配的关键字。
CTRL-X CTRL-NCTRL-X CTRL-P 除非使用双CTRL-X,否则进一步使用CTRL-X CTRL-NCTRL-X CTRL-P 将复制先前扩展中其他上下文中的后续单词。
停止补全 compl-stop
i_CTRL-X_CTRL-Z
CTRL-X CTRL-Z 停止补全,不改变文本。

自动补全 compl-autocomplete

要获得基本的“自动补全”而不安装插件,请尝试使用此脚本
local triggers = {"."}
vim.api.nvim_create_autocmd("InsertCharPre", {
  buffer = vim.api.nvim_get_current_buf(),
  callback = function()
    if vim.fn.pumvisible() == 1 or vim.fn.state("m") == "m" then
      return
    end
    local char = vim.v.char
    if vim.list_contains(triggers, char) then
      local key = vim.keycode("<C-x><C-n>")
      vim.api.nvim_feedkeys(key, "m", false)
    end
  end
})

查找补全的函数 complete-functions

该函数以两种不同的方式调用
首先调用该函数以查找要补全的文本的开头。
稍后调用该函数以实际找到匹配项。
在第一次调用中,参数为:a:findstart 1 a:base empty
该函数必须返回补全开始的列。它必须是一个介于零和光标列“col('.')”之间的数字。这涉及查看光标之前的字符,并包括可能作为补全项目一部分的那些字符。此列和光标列之间的文本将被匹配项替换。如果返回的值大于光标列,则使用光标列。
负返回值:-2 静默取消并保持在补全模式。-3 静默取消并退出补全模式。另一个负值:补全从光标列开始
在第二次调用中,参数为:a:findstart 0 a:base 用于匹配匹配项的文本;在第一次调用中找到的文本(可以为空)
该函数必须返回包含匹配词的列表。这些匹配项通常包括“a:base”文本。当没有匹配项时,返回一个空列表。注意,光标可能已从第一次调用开始移动,文本可能已更改。
为了返回比匹配词更多的信息,返回一个包含列表的字典。该字典可以包含以下项:words 匹配词列表(必填)。refresh 用于控制函数重新调用的字符串(可选)。目前唯一识别的值为“always”,其效果是在引导文本更改时调用该函数。其他项被忽略。
有关在补全结束时执行的操作,请参见 CompleteDonePreCompleteDone 自动命令事件。
例如,该函数可以包含以下内容
let matches = ... list of words ...
return {'words': matches, 'refresh': 'always'}
补全项目
每个列表项可以是字符串或字典。当它是字符串时,它用作补全。当它是字典时,它可以包含以下项:word 将插入的文本,必填 abbr “word” 的缩写;如果非空,则在菜单中使用它代替“word” menu 弹出菜单的额外文本,显示在“word” 或“abbr” 之后 info 关于项目的更多信息,可以在预览窗口中显示 kind 表示补全类型的单个字母 icase 当非零时,在比较项目是否相等时忽略大小写;如果省略,则使用零,因此只在大小写上不同的项目将被添加为相等 当非零时,始终将此项目视为相等以进行比较。这意味着,“equal=1” 将禁用此项目的过滤。 dup 当非零时,即使已经存在具有相同 word 的项目,也会添加此匹配项。 empty 当非零时,即使它是空字符串,也会添加此匹配项 user_data 与项目关联的自定义数据,可在 v:completed_item 中使用;它可以是任何类型;默认值为一个空字符串 abbr_hlgroup 一个额外的突出显示组,其属性将与 hl-PmenuSelhl-Pmenuhl-PmenuMatchSelhl-PmenuMatch 突出显示属性在弹出菜单中应用 cterm 和 gui 属性(具有更高优先级)如删除线到补全项缩写 kind_hlgroup 一个专门用于设置补全 kind 的突出显示属性的额外突出显示组。当此字段存在时,它将覆盖 hl-PmenuKind 突出显示组,允许自定义 ctermfg 和 guifg 属性以用于补全 kind
除了“icase”、“equal”、“dup” 和“empty”之外,所有这些都必须是字符串。如果一个项目不满足这些要求,那么会显示错误消息,列表中的其他项目将不被使用。你可以在返回的列表中混合字符串和字典项。
“menu” 项在弹出菜单中使用,并且可能会被截断,因此它应该相对较短。 “info” 项可以更长,它将在“preview” 出现于 'completeopt' 时在预览窗口中显示。 “info” 项也将在弹出菜单删除后保持显示。这对于函数参数很有用。使用单个空格作为“info” 以删除预览窗口中现有的文本。预览窗口的大小为三行,但当 'previewheight' 的值为 1 或 2 时,使用它。
“kind” 项使用单个字母来表示补全的类型。这可能用于以不同的方式显示补全(不同的颜色或图标)。目前可以使用以下类型:v 变量 f 函数或方法 m 结构体或类的成员 t typedef d #define 或宏
当搜索匹配项需要一些时间时,调用 complete_add() 将每个匹配项添加到总列表。这些匹配项不应该出现在返回的列表中!不时调用 complete_check() 以允许用户在继续搜索匹配项的同时按下键。当它返回非零值时停止搜索。
E840
该函数被允许移动光标,它之后会被恢复。该函数不被允许移动到另一个窗口或删除文本。
一个完成月份名称的示例
fun! CompleteMonths(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    let res = []
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' .. a:base
        call add(res, m)
      endif
    endfor
    return res
  endif
endfun
set completefunc=CompleteMonths
相同,但现在假装搜索匹配项很慢
fun! CompleteMonths(findstart, base)
  if a:findstart
    " locate the start of the word
    let line = getline('.')
    let start = col('.') - 1
    while start > 0 && line[start - 1] =~ '\a'
      let start -= 1
    endwhile
    return start
  else
    " find months matching with "a:base"
    for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec")
      if m =~ '^' .. a:base
        call complete_add(m)
      endif
      sleep 300m        " simulate searching for next match
      if complete_check()
        break
      endif
    endfor
    return []
  endif
endfun
set completefunc=CompleteMonths

插入补全弹出菜单 ins-completion-menu

弹出菜单补全
Vim 可以以简单的弹出菜单形式显示匹配项。
该菜单在以下情况下使用
'completeopt' 选项包含“menu” 或“menuone”。
终端支持至少 8 种颜色。
至少有两个匹配项。如果使用“menuone”,则为一个。
'pumheight' 选项可用于设置最大高度。默认情况下使用所有可用空间。 'pumwidth' 选项可用于设置最小宽度。默认值为 15 个字符。
有三种状态:1. 已插入完整的匹配项,例如,在使用 CTRL-NCTRL-P 之后。2. 已使用光标键选择另一个匹配项。然后没有插入匹配项,只是弹出菜单中的条目被突出显示。3. 仅插入匹配项的一部分,并且输入了字符或使用了退格键。然后根据光标前的内容调整匹配项列表。
你通常从第一种状态开始,第一个匹配项被插入。当“longest” 在 'completeopt' 中并且有多个匹配项时,你从第三种状态开始。
如果你选择另一个匹配项,例如,使用 CTRL-NCTRL-P,你将进入第一种状态。这不会更改匹配项列表。
当你回到原始文本时,你将处于第三种状态。为了立即进入那里,你可以使用一个映射,该映射在启动补全后立即使用 CTRL-P
:imap <F7> <C-N><C-P>
弹出菜单键
在第一种状态下,这些键具有特殊含义:<BS>CTRL-H 删除一个字符,查找光标前单词的匹配项。这会减少匹配项列表,通常减少到一个条目,并切换到第二种状态。任何非特殊字符:停止补全,不更改匹配项,并插入键入的字符。
在第二种和第三种状态下,这些键具有特殊含义:<BS>CTRL-H 删除一个字符,查找光标前较短单词的匹配项。这可能会找到更多匹配项。CTRL-L 从当前匹配项中添加一个字符,可能会减少匹配项数量。任何可打印的非空白字符:添加此字符并减少匹配项数量。
在这三种状态下,都可以使用:CTRL-Y Yes:接受当前选定的匹配项并停止补全。CTRL-E 结束补全,返回到选择匹配项之前的状态(键入的内容或最长公共字符串)。<PageUp> 选择几个条目之前的匹配项,但不插入。<PageDown> 选择几个条目之后的匹配项,但不插入。<Up> 选择上一个匹配项,就像使用了 CTRL-P 一样,但不插入。<Down> 选择下一个匹配项,就像使用了 CTRL-N 一样,但不插入。<Space><Tab> 停止补全,不更改匹配项,并插入键入的字符。
<Enter> 键的行为取决于您所处的状态:第一种状态:使用文本原样并插入换行符。第二种状态:插入当前选定的匹配项。第三种状态:使用文本原样并插入换行符。
换句话说:如果您使用光标键在匹配项列表中选择了另一个条目,那么 <Enter> 键会插入该匹配项。如果您键入了其他内容,那么 <Enter> 键会插入换行符。
菜单的颜色可以使用以下高亮组更改:Pmenu 常规项目 hl-Pmenu PmenuSel 选定项目 hl-PmenuSel PmenuSbar 滚动条 hl-PmenuSbar PmenuThumb 滚动条的滑块 hl-PmenuThumb
当弹出菜单可见时,没有特殊的映射。但是,您可以使用一个在插入模式下的映射,该映射检查 pumvisible() 函数以执行不同的操作。示例
:inoremap <Down> <C-R>=pumvisible() ? "\<lt>C-N>" : "\<lt>Down>"<CR>
您可以在映射中使用 <expr>,以便在键入字符并满足某些条件时使用弹出菜单。例如,键入一个点
inoremap <expr> . MayComplete()
func MayComplete()
    if (can complete)
      return ".\<C-X>\<C-O>"
    endif
    return '.'
endfunc
有关更多信息,请参阅 :map-<expr>

OMNI 补全的特定于文件类型的说明 compl-omni-filetypes

用于 {filetype} 的文件应该在 'runtimepath' 中的 autoload/{filetype}complete.vim。因此,对于“java”,它是 autoload/javacomplete.vim。
C 代码的补全需要一个标签文件。您应该使用 Universal/Exuberant ctags,因为它添加了补全所需的额外信息。您可以在此处找到它:Universal Ctags:https://ctags.io
首选 Universal Ctags,Exuberant Ctags 已不再维护。
如果您想补全系统函数,您可以执行以下操作。使用 ctags 为所有系统头文件生成一个标签文件
% ctags -R -f ~/.config/nvim/systags /usr/include /usr/local/include
在您的 vimrc 文件中,将此标签文件添加到 'tags' 选项中
set tags+=~/.config/nvim/systags
在没有任何“.”或“->”的情况下,使用 CTRL-X CTRL-O 补全名称时,会直接从标签文件中补全。这适用于任何标识符,也包括函数名。如果您想补全一个不在标签文件中出现的局部变量名,请使用 CTRL-P 代替。
在使用 CTRL-X CTRL-O 补全带有“.”或“->”的内容时,Vim 会尝试识别变量的类型并找出它有哪些成员。这意味着只有对变量有效的成员才会被列出。
当成员名称已完成时,CTRL-X CTRL-O 会为复合类型添加“.”或“->”。
Vim 不包含 C 编译器,只有格式最明显的声明才会被识别。预处理器内容可能会造成混乱。当同一个结构名称出现在多个地方时,所有可能的成员都会被包含在内。
根据 CSS 2.1 规范补全属性及其相应的属性值。
CTRL-X CTRL-O 提供了对 (X)HTML 文件中各种元素的补全。它旨在支持编写 XHTML 1.0 Strict 文件,但也适用于 HTML 的其他版本。功能
在“<”之后补全标签名称,取决于上下文(在 a 标签内部不建议使用 div);“/>”表示空标签
在标签内部,补全合适的属性(a 标签没有 width 属性);也显示属性类型;“*”表示必填属性
当属性具有有限数量的可能值时,帮助补全它们
补全实体名称
<style> 标签和包含的 CSS 文件中获取数据,补全“class”和“id”属性的值
当补全“style”属性的值或在“style”标签内部工作时,切换到 ft-css-omni 补全
当补全事件属性的值或在“script”标签内部工作时,切换到 ft-javascript-omni 补全
当在“</”之后使用时,CTRL-X CTRL-O 会关闭最后一个打开的标签
注意:首次使用时,补全菜单会稍有延迟出现
这是加载数据文件所需的时间。注意:补全可能会在格式错误的文档中失败。在这种情况下,请尝试运行 :make 命令来检测格式问题。
HTML 风格 html-flavor
默认的 HTML 补全取决于文件类型。对于 HTML 文件,它是 HTML 4.01 Transitional ('filetype' 是“html”),对于 XHTML,它是 XHTML 1.0 Strict ('filetype' 是“xhtml”)。
在任何其他标签之外进行补全时,您将有机会选择 DOCTYPE,并将加载相应的数据文件并用于所有后续补全。
有关数据文件格式的更多信息,请参阅 xml-omni-datafile。一些数据文件可以在 Vim 网站 (www) 上找到。
请注意,b:html_omni_flavor 可能指向任何 XML 数据文件。这使得可以将 PHP (ft-php-omni) 补全与任何 XML 语言混合使用(假设您有它的数据文件)。如果没有设置该变量,将使用 XHTML 1.0 Strict。
补全 JavaScript 语言和 DOM 元素的大多数元素。
补全
变量
函数名;显示函数参数
函数参数
尝试检测变量类型的变量的属性
根据上下文补全 DOM 对象和属性
语言关键字
补全在单独的 JavaScript 文件 (&ft==javascript) 中、在 (X)HTML 的 <script> 标签内部以及在事件属性的值中进行(包括外部文件的扫描)。
DOM 兼容性
目前(2006 年初),有两个主要的浏览器 - MS Internet Explorer 和 Mozilla Firefox。这两个应用程序覆盖了超过 90% 的市场份额。理论上,标准是由 W3C 组织 (https://www.w3.org/) 制定的,但它们并不总是被遵守/执行。
IE        FF        W3C  Omni completion ~
+/-        +/-        +    +                     ~
+        +        -    +                     ~
+        -        -    -                     ~
-        +        -    -                     ~
无论浏览器中的实现状态如何,但如果元素在标准中定义,补全插件会将元素放在建议列表中。当这两个主要引擎都实现了该元素时,即使它不在标准中,它也会被建议。所有其他元素都不会被放在建议列表中。
PHP 代码的补全需要一个标签文件,用于从外部文件补全数据和进行类感知补全。您应该使用 Universal/Exuberant ctags 5.5.4 或更高版本。您可以在此处找到它
Universal Ctags:https://ctags.io
脚本补全
在 $ 变量名称之后
如果变量被声明为对象,添加“->”;如果标签文件可用,显示类名
在“->”之后,仅补全特定于给定类的函数和变量名。要找到类的位置和内容,需要标签文件。由于 PHP 不是强类型语言,用户可以使用 @var 标签声明类
/* @var $myVar myClass */
$myVar->
不过,要找到 myClass 的内容,需要标签文件。
带额外信息的函数名
对于内置函数,列出可能的参数,在 | 之后列出函数返回的数据类型
对于用户函数,列出参数和函数定义所在的文件名(如果它不是当前文件)
常量名
在“new”声明之后的类名
注意:首次进行补全时,Vim 会将所有必要的数据加载到内存中。这可能需要几秒钟。在下次使用补全时,延迟应该不明显。
脚本检测光标是否在 <?php ?> 标签内部。如果它在外部,它会自动切换到 HTML/CSS/JavaScript 补全。注意:与原始 HTML 文件不同,标签(仅限标签)的补全不是上下文感知的。
注意:Ruby 代码的 compl-omni 需要安装 provider-ruby
Ruby 补全会根据需要解析您的缓冲区,以便提供补全列表。这些补全将来自“require”加载的模块和当前缓冲区中定义的模块。
CTRL-X CTRL-O 提供的补全对上下文很敏感
提供的上下文补全
1. 不在类定义内部 类、常量和全局变量
2. 在类定义内部 在类中定义的方法或常量
3. 在“.”、“::”或“:”之后 对被解除引用的对象适用的方法
4. 在“:”或“:foo”之后 符号名称(以“foo”开头)
注意事项
Vim 会加载/评估代码以提供补全。这可能会导致一些代码执行,这可能令人担忧。此功能默认情况下不再启用,要启用此功能,请添加
let g:rubycomplete_buffer_loading = 1
<- 在上面的上下文 1 中,Vim 可以解析整个缓冲区,以将类列表添加到补全结果中。此功能默认情况下处于关闭状态,要启用它,请添加
let g:rubycomplete_classes_in_global = 1
到您的 vimrc
在上面的上下文 2 中,不支持匿名类。
在上面的上下文 3 中,Vim 会尝试确定对象支持的方法。
Vim 可以检测和加载 Rails 项目中文件的 Rails 环境。此功能默认情况下处于关闭状态,要启用它,请添加
let g:rubycomplete_rails = 1
到您的 vimrc
Vim 能够对近 500 种语言进行语法高亮。这种高亮的一部分包括了解哪些关键字属于某种语言。许多文件类型已经为它们编写了自定义补全脚本,syntaxcomplete 插件为所有其他文件类型提供了基本补全。它通过将 Vim 已经知道如何进行语法高亮的文本填充到 omni 补全列表来实现。它可以用于任何文件类型,并提供最小的语言敏感补全。
要启用语法代码补全,您可以运行
setlocal omnifunc=syntaxcomplete#Complete
您可以通过将以下内容放在您的 init.vim 中(在任何“:filetype”命令之后)来自动执行此操作
if has("autocmd") && exists("+omnifunc")
    autocmd Filetype *
                \        if &omnifunc == "" |
                \                setlocal omnifunc=syntaxcomplete#Complete |
                \        endif
endif
上面的命令将仅在特定插件不存在于该文件类型的情况下,将补全设置为该脚本。
每个文件类型都可以具有广泛的语法项。该插件允许您自定义要包含或排除在列表中的语法组。让我们看一下 PHP 文件类型,看看它是如何工作的。
如果您编辑名为 index.php 的文件,请运行以下命令
syntax list
您首先会注意到有很多不同的语法组。PHP 语言可以包含来自不同语言的元素,例如 HTML、JavaScript 等等。语法插件只会包含以文件类型“php”开头的语法组,在本例中。例如,这些语法组默认情况下包含在 PHP 中:phpEnvVar、phpIntVar、phpFunctions。
如果您希望也包含非文件类型语法项,可以使用正则表达式语法(在 autoload/syntaxcomplete.vim 的 13.0 版本中添加)来添加项。查看在编辑 PHP 文件时来自“:syntax list”的输出,我可以看到其中一些条目
htmlArg,htmlTag,htmlTagName,javaScriptStatement,javaScriptGlobalObjects
要拾取编辑 PHP 文件时的任何 JavaScript 和 HTML 关键字语法组,可以使用 3 个不同的正则表达式,每个语言一个。或者,您也可以简单地将包含组限制为特定值,而无需使用正则表达式字符串
let g:omni_syntax_group_include_php = 'php\w\+,javaScript\w\+,html\w\+'
let g:omni_syntax_group_include_php = 'phpFunctions,phpMethods'
此变量的基本形式为
let g:omni_syntax_group_include_{filetype} = 'regex,comma,separated'
PHP 语言有大量它知道如何语法高亮的项目。这些项目将在全能补全列表中可用。
有些人可能会发现此列表笨拙或只对某些项目感兴趣。有两种方法可以修剪此列表(如果需要)。如果您发现某些您不希望显示的语法组,可以使用两种不同的方法来识别这些组。第一个专门列出语法组的名称。第二个使用正则表达式来识别语法组。只需在您的 vimrc 中添加以下内容之一即可
let g:omni_syntax_group_exclude_php = 'phpCoreConstant,phpConstant'
let g:omni_syntax_group_exclude_php = 'php\w*Constant'
通过逗号分隔,将尽可能多的语法组添加到此列表中。此变量的基本形式为
let g:omni_syntax_group_exclude_{filetype} = 'regex,comma,separated'
您可以根据需要创建尽可能多的这些变量,仅在变量名称末尾的 文件类型 方面有所不同。
该插件使用 isKeyword 选项来确定语法项的单词边界在哪里。例如,在 Scheme 语言中,补全应该包括“-”,call-with-output-file。根据您的文件类型,这可能不会提供您期望的单词。将 g:omni_syntax_use_iskeyword 选项设置为 0 将强制语法插件在单词字符处中断。可以通过将以下内容添加到您的 vimrc 来控制这一点
let g:omni_syntax_use_iskeyword = 0
对于插件开发者,该插件公开了公共函数 OmniSyntaxList。此函数可用于请求语法项列表。当编辑 SQL 文件(:e syntax.sql)时,可以使用“:syntax list”命令查看各种组和语法项。例如
syntax list
生成类似于此的数据
sqlOperator xxx some prior all like and any escape exists in is not
or intersect minus between distinct
链接到运算符
sqlType xxx varbit varchar nvarchar bigint int uniqueidentifier
date money long tinyint unsigned xml text smalldate
double datetime nchar smallint numeric time bit char
varbinary binary smallmoney
image float integer timestamp real decimal
这里列出了两个语法组:sqlOperator 和 sqlType。要检索语法项列表,您可以通过多种不同的方式调用 OmniSyntaxList。要检索所有语法项,无论语法组如何
echo OmniSyntaxList( [] )
要仅检索 sqlOperator 语法组的语法项
echo OmniSyntaxList( ['sqlOperator'] )
要检索 sqlOperator 和 sqlType 两个组的所有语法项
echo OmniSyntaxList( ['sqlOperator', 'sqlType'] )
还可以使用正则表达式
echo OmniSyntaxList( ['sql\w\+'] )
在插件中,您通常会将输出分配给列表
let myKeywords = []
let myKeywords = OmniSyntaxList( ['sqlKeyword'] )

SQL ft-sql-omni

SQL 语言的补全包括语句、函数、关键字。它还将使用直接从数据库中提取的数据动态补全表、过程、视图和列列表。有关详细说明和教程,请参阅 omni-sql-completion.
SQL 补全插件可以与其他补全插件一起使用。例如,PHP 文件类型有自己的补全插件。由于 PHP 通常用于通过访问数据库生成动态网站,因此也可以启用 SQL 补全插件。这使您能够同时补全 PHP 代码和 SQL 代码。
Vim 7 提供了一种机制,用于对 XML 文件进行上下文感知补全。它依赖于一个特殊的 xml-omni-datafile 和两个命令::XMLns:XMLent。功能是
在“<”之后补全标签名称,具体取决于上下文
在标签内部补全适当的属性
当属性具有有限数量的可能值时,帮助补全它们
补全实体的名称(在 xml-omni-datafile 和在当前文件中使用“<!ENTITY”声明定义的实体的名称)
当在“</”之后使用时,CTRL-X CTRL-O 会关闭最后一个打开的标签
XML 数据文件的格式 xml-omni-datafile
XML 数据文件存储在 'runtimepath' 中的“autoload/xml”目录中。Vim 发行版在“$VIMRUNTIME/autoload/xml”目录中提供了数据文件的示例。它们具有有意义的名称,将在命令中使用。它应该是一个唯一的名称,不会产生冲突。例如,名称 xhtml10s.vim 表示它是 XHTML 1.0 Strict 的数据文件。
每个文件都包含一个名为 g:xmldata_xhtml10s 的变量。它是两部分的组合
1. “g:xmldata_”通用前缀,所有数据文件的常量 2. “xhtml10s”文件的名称和描述的 XML 方言的名称;它将用作 :XMLns 命令的参数
第二部分必须与文件的名称完全相同。
该变量是一个 Dictionary。键是标签名称,每个值都是一个包含两个元素的 List。列表的第一个元素也是一个包含可能子项名称的列表。第二个元素是一个包含属性名称作为键和属性可能值作为值的 Dictionary。示例
let g:xmldata_crippled = {
\ "vimxmlentities": ["amp", "lt", "gt", "apos", "quot"],
\ 'vimxmlroot': ['tag1'],
\ 'tag1':
\ [ ['childoftag1a', 'childoftag1b'], {'attroftag1a': [],
\ 'attroftag1b': ['valueofattr1', 'valueofattr2']}],
\ 'childoftag1a':
\ [ [], {'attrofchild': ['attrofchild']}],
\ 'childoftag1b':
\ [ ['childoftag1a'], {'attrofchild': []}],
\ "vimxmltaginfo": {
\ 'tag1': ['Menu info', 'Long information visible in preview window']},
\ 'vimxmlattrinfo': {
\ 'attrofchild': ['Menu info', 'Long information visible in preview window']}}
此示例将放在“autoload/xml/crippled.vim”文件中,可以帮助编写此文件
<tag1 attroftag1b="valueofattr1">
    <childoftag1a attrofchild>
            &amp; &lt;
    </childoftag1a>
    <childoftag1b attrofchild="5">
        <childoftag1a>
            &gt; &apos; &quot;
        </childoftag1a>
    </childoftag1b>
</tag1>
在示例中,四个特殊元素可见
1. “vimxmlentities” - 包含此 XML 方言的实体的列表的特殊键。 2. 如果包含属性可能值的列表有一个元素,并且此元素等于属性的名称,则此属性将被视为布尔值,并插入为“attrname”,而不是“'attrname='” 3. “vimxmltaginfo” - 包含标签名称作为键和包含两个元素的列表作为值的字典的特殊键,用于其他菜单信息和长描述。 4. “vimxmlattrinfo” - 包含属性名称作为键和包含两个元素的列表作为值的字典的特殊键,用于其他菜单信息和长描述。
注意:数据文件中的标签名称绝不能包含命名空间描述。查看 xsl.vim 获取示例。注意:所有数据和函数都作为全局变量/函数公开可用,可用于个人编辑函数。
DTD -> Vim dtd2vim
www 上是脚本 dtd2vim,它解析 DTD 并为 Vim XML 全能补全创建一个 XML 数据文件。
查看该文件开头以了解使用详情。该脚本需要 perl 和
命令
:XMLns {name} [{namespace}] :XMLns
Vim 必须知道应该使用哪个数据文件以及使用哪个命名空间。要加载数据文件并将数据连接到适当的命名空间,请使用 :XMLns 命令。第一个(强制性)参数是数据的名称(xhtml10s、xsl)。第二个参数是命名空间的代码(h、xsl)。当不使用第二个参数时,方言将用作默认值 - 无命名空间声明。例如,要在 .xsl 文件中使用 XML 补全
:XMLns xhtml10s
:XMLns xsl xsl
:XMLent {name} :XMLent
默认情况下,实体将从默认命名空间的数据文件中补全。当没有默认命名空间时,应使用 XMLent 命令
:XMLent xhtml10s
用法
在使用此情况(在之前部分的声明之后,| 是光标位置)时
<|
将补全到适当的 XHTML 标签,在这种情况下
<xsl:|
将补全到适当的 XSL 标签。
通过 autoload 机制提供的脚本 xmlcomplete.vim 具有 xmlcomplete#GetLastOpenTag() 函数,该函数可用于 XML 文件以获取最后一个打开标签的名称(b:unaryTagsStack 必须定义)
:echo xmlcomplete#GetLastOpenTag("b:unaryTagsStack")

8. 插入模式命令 inserting

以下命令可用于将新文本插入缓冲区。它们都可以通过“.”命令撤消和重复。
a
a 在光标之后追加文本 [count] 次。如果光标位于空行的第一列,则 Insert 将从那里开始。但当 'virtualedit' 设置时不会!
A
A 在行尾追加文本 [count] 次。有关在 Visual 块模式中使用“A”,请参阅 v_b_A.
<insert>i insert <Insert> i 在光标之前插入文本 [count] 次。在插入模式下使用 CTRL-Oi_CTRL-O 不支持计数。
I
I 在行中第一个非空白字符之前插入文本 [count] 次。当 'cpoptions' 中存在“H”标志且该行仅包含空格时,插入将从最后一个空格之前开始。有关在 Visual 块模式中使用“I”,请参阅 v_b_I.
gI
gI 在第 1 列中插入文本 [count] 次。
gi
gi 在当前缓冲区中上次停止插入模式的位置插入文本。这使用 '^ 标记。当标记位于行尾之后时,它与“`^i”不同。该位置已针对插入/删除的行进行了更正,但未针对插入/删除的字符进行更正。当使用 :keepjumps 命令修饰符时,'^ 标记不会改变。
o
o 在光标下方开始新行并插入文本,重复 [count] 次。
O
O 在光标上方开始新行并插入文本,重复 [count] 次。
这些命令用于开始插入文本。您可以使用 <Esc> 退出插入模式。有关插入模式中的其他特殊字符,请参阅 mode-ins-repl。[count] 的效果在退出插入模式后生效。
'autoindent' 打开时,新行的缩进将从上一行获得。当 'smartindent''cindent' 打开时,C 程序的行的缩进会自动调整。
'formatoptions' 可以设置为在打开新行时复制注释前缀。
'textwidth' 可以设置为每行的最大宽度。当一行在追加字符时变得过长时,会自动插入换行符。

9. Ex 插入命令 inserting-ex

:a :append :{range}a[ppend][!] 在指定行下方插入多行文本。如果{range}缺失,文本将在当前行之后插入。添加 [!] 会切换 'autoindent',在执行此命令时生效。
:i :in :insert :{range}i[nsert][!] 在指定行上方插入多行文本。如果{range}缺失,文本将在当前行之前插入。添加 [!] 会切换 'autoindent',在执行此命令时生效。
这两个命令会不断提示输入行,直到您输入一行只有 "." 的文本。注意以反斜杠开头的行,请参阅 line-continuation
在 "|" 命令分隔符之后输入的文本将被优先使用。因此在 ex 模式下的以下命令
:a|one
two
.
:visual
将在光标行之后追加以下文本
one
two
注意: 这些命令不能与 :global:vglobal 结合使用。":append" 和 ":insert" 在 ":if" 和 ":endif"、":for" 和 ":endfor"、":while" 和 ":endwhile" 之间不能正常工作。
:start :startinsert :star[tinsert][!] 在执行此命令后立即进入插入模式(或在 终端 缓冲区中进入 终端模式)。类似于在普通模式下输入 "i"。当包含 ! 时,它类似于 "A",追加到行尾。否则插入从光标位置开始。注意在函数或脚本中使用此命令时,插入将在函数或脚本完成后才开始。此命令不能从 :normal 使用。
:stopi :stopinsert :stopi[nsert] 尽快停止插入模式或 终端模式。类似于在插入模式下输入 <Esc>。可以在自动命令中使用,例如
:au BufEnter scratch stopinsert
replacing-ex :startreplace :startr[eplace][!] 在执行此命令后立即进入替换模式。类似于在普通模式下输入 "R"。当包含 ! 时,它类似于 "$R"(即从行尾开始替换模式)。否则替换从光标位置开始。注意在函数或脚本中使用此命令时,替换将在函数或脚本完成后才开始。
:startgreplace
:startg[replace][!] 类似于 :startreplace,但使用虚拟替换模式,就像使用 gR 一样。

10. 插入文件 inserting-file

:r :re :read :r[ead] [++opt] [name] 在光标下方插入文件 [name](默认:当前文件)。请参阅 ++opt 以了解 [++opt] 的可能值。
:{range}r[ead] [++opt] [name] 在指定行下方插入文件 [name](默认:当前文件)。请参阅 ++opt 以了解 [++opt] 的可能值。
:r! :read! :[range]r[ead] [++opt] !{cmd} 执行 {cmd} 并将它的标准输出插入到光标下方或指定行下方。一个临时文件用于存储命令的输出,然后将输出读取到缓冲区中。 'shellredir' 用于保存命令的输出,可以设置为包含或不包含标准错误输出。{cmd} 的执行方式与 ":!{cmd}" 相同,任何 '!' 都将被替换为前一个命令 :!。请参阅 ++opt 以了解 [++opt] 的可能值。
这些命令将文件内容或命令输出插入到缓冲区中。它们可以被撤消。它们不能使用 "." 命令重复执行。它们以行为单位工作,插入从光标所在的行下方或指定行下方开始。要将文本插入第一行上方,请使用命令 ":0r {name}"。
在执行 ":read" 命令后,光标将停留在第一个新行的第一个非空字符上。除非是在 Ex 模式下,在这种情况下光标将停留在最后一个新行上(抱歉,这是为了兼容 Vi)。
如果使用 ":r" 指定了文件名,它将成为备用文件。例如,当您想要编辑该文件而不是当前文件时,可以使用 ":e! #"。可以通过从 'cpoptions' 选项中移除 'a' 标志来关闭此行为。
在 [++opt] 参数中,有一个参数是专门针对 ":read" 的,即 ++edit 参数。当 ":read" 命令实际上用于将文件读取到缓冲区中,就像编辑该文件一样时,此参数很有用。在空缓冲区中使用此命令
:read ++edit filename
效果是 'fileformat''fileencoding''bomb' 等选项将被设置为 "filename" 检测到的值。注意会保留一个空行,您可能想要删除它。
file-read
'fileformat' 选项设置文件的 <EOL> 样式
'fileformat' 字符名称
"dos" <CR><NL><NL> DOS 格式 "unix" <NL> Unix 格式 "mac" <CR> Mac 格式
如果 'fileformat' 是 "dos",则 <NL> 前面的 <CR> 将被忽略,文件末尾的 CTRL-Z 将被忽略。
如果 'fileformat' 是 "mac",则文件中的 <NL> 将在内部表示为 <CR>。这是为了避免与表示 <NUL><NL> 混淆。请参阅 CR-used-for-NL
如果 'fileformats' 选项非空,Vim 会尝试识别 <EOL> 的类型(请参阅 file-formats)。但是,'fileformat' 选项不会改变,检测到的格式仅在读取文件时使用。'fileencodings' 也类似。
在非 Win32 系统上,如果以 DOS 格式读取文件,将显示消息 "[dos format]",提醒您执行了非正常操作。在 Macintosh 和 Win32 系统上,如果以 Unix 格式读取文件,将显示消息 "[unix format]"。在非 Macintosh 系统上,如果以 Mac 格式读取文件,将显示消息 "[mac format]"。
关于如何使用 ":r !" 的示例
:r !uuencode binfile binfile
此命令读取 "binfile",对其进行 uuencode,并将结果读取到当前缓冲区中。当您编辑电子邮件并想要包含二进制文件时,这很有用。
read-messages
当读取文件时,Vim 会显示一条包含有关读取文件的信息的消息。表中解释了一些项目。其他项目不言自明。使用长或短版本取决于 'shortmess' 选项。
long short meaning
[readonly] {RO} 文件是写保护的 [fifo/socket] 使用流 [fifo] 使用 fifo 流 [socket] 使用套接字流 [CR missing] 使用 "dos" 'fileformat' 读取,发现没有前导 CR 的 NL。 [NL found] 使用 "mac" 'fileformat' 读取,发现 NL(可能是 "unix" 格式) [long lines split] 至少有一行被拆分为两行 [NOT converted] 从 'fileencoding''encoding' 的转换需要进行,但不可行 [converted] 从 'fileencoding''encoding' 的转换已完成 [READ ERRORS] 文件无法完全读取
Main
Commands index
Quick reference