Usr_24

Nvim :help 页面,从 源文件 使用 tree-sitter-vimdoc 解析器 生成


VIM 用户手册 - 作者 Bram Moolenaar
快速插入
在输入文本时,Vim 提供多种方式来减少按键次数并避免输入错误。使用插入模式补全来重复之前输入的单词。将长单词缩写为短单词。输入键盘上没有的字符。
24.1 进行修正 24.2 显示匹配项 24.3 补全 24.4 重复插入 24.5 从另一行复制 24.6 插入寄存器 24.7 缩写 24.8 输入特殊字符 24.9 二字符 24.10 正常模式命令
下一章:usr_25.txt 编辑格式化文本 前一章:usr_23.txt 编辑其他文件 目录:usr_toc.txt

进行修正

<BS> 键已经提到了。它删除光标之前的字符。<Del> 键对光标下(之后)的字符执行相同的操作。当你输入了一个错误的单词时,使用 CTRL-W
The horse had fallen to the sky
CTRL-W
The horse had fallen to the
如果你确实弄乱了一行并想重新开始,使用 CTRL-U 删除它。这保留了光标后的文本和缩进。只有从第一个非空白字符到光标的文本会被删除。在下一行中,光标位于“fallen”的“f”上,按 CTRL-U 会执行以下操作
The horse had fallen to the
CTRL-U
fallen to the
当你发现几个单词前的错误时,你需要将光标移动到那里才能更正它。例如,你输入了以下内容
The horse had follen to the ground
你需要将“follen”更改为“fallen”。当光标位于末尾时,你可以输入以下内容来更正它
<Esc>4blraA
退出插入模式 <Esc> 向前移动 4 个单词 4b 移动到“o”上方 l 将其替换为“a” ra 重新进入插入模式 A
另一种方法是
<C-Left><C-Left><C-Left><C-Left><Right><Del>a<End>
向前移动 4 个单词 <C-Left><C-Left><C-Left><C-Left> 移动到“o”上方 <Right> 删除“o” <Del> 插入“a” a 转到行末 <End>
这使用特殊键在插入模式下移动,就像你在无模式编辑器中所做的一样。它更容易记住,但需要更多时间(你必须将手从字母移到光标键,<End> 键很难在不看键盘的情况下按下)。这些特殊键在编写不会退出插入模式的映射时最有用。额外的输入在这种情况并不重要。在插入模式下可以使用的键的概述
<C-Home> 转到文件开头 <PageUp> 向上翻页 <Home> 转到行首 <S-Left> 向左移动一个单词 <C-Left> 向左移动一个单词 <S-Right> 向右移动一个单词 <C-Right> 向右移动一个单词 <End> 转到行尾 <PageDown> 向下翻页 <C-End> 转到文件末尾
还有一些其他的键,请查看 ins-special-special

24.2 显示匹配项

当你输入一个 ) 时,能看到它与哪个 ( 匹配会很棒。要让 Vim 执行此操作,请使用以下命令
:set showmatch
现在当你输入类似 “(example)” 的文本时,只要你输入 ),Vim 就会将光标短暂地移动到匹配的 (,保持它在那里半秒钟,然后移动回你正在输入的位置。如果没有匹配的 (,Vim 会发出警报。然后你知道你可能忘记了 ( 或输入了过多的 )。匹配项也将显示在 [] 和 {} 对中。你不必等待输入下一个字符,只要 Vim 看到它,光标就会移回,插入会像以前一样继续。你可以使用 'matchtime' 选项来更改 Vim 等待的时间。例如,要让 Vim 等待一秒半
:set matchtime=15
时间以十分之一秒为单位。

24.3 补全

Vim 可以自动完成插入的单词。你输入一个单词的一部分,按 CTRL-P,Vim 会猜测剩余的部分。例如,假设你正在创建一个 C 程序,并想输入以下内容
total = ch_array[0] + ch_array[1] + ch_array[2];
你首先输入以下内容
total = ch_array[0] + ch_
此时,你告诉 Vim 使用 CTRL-P 命令完成单词。Vim 搜索以光标前面的内容开头的单词。在本例中,它是“ch_”,与单词 ch_array 匹配。因此,输入 CTRL-P 会得到以下结果
total = ch_array[0] + ch_array
经过一些额外的输入,你得到以下内容(以空格结尾)
total = ch_array[0] + ch_array[1] +
如果你现在输入 CTRL-P,Vim 会再次搜索以光标前面的单词开头的单词。由于光标前面没有任何内容,它会找到第一个反向的单词,即“ch_array”。再次输入 CTRL-P 会得到下一个匹配的单词,在本例中是“total”。第三次 CTRL-P 会继续向后搜索。如果没有其他内容,它会导致编辑器用完单词,因此它会返回到原始文本,即没有任何内容。第四次 CTRL-P 会导致编辑器再次从“ch_array”开始。
要向前搜索,请使用 CTRL-N。由于搜索会绕过文件结尾,因此 CTRL-NCTRL-P 会找到相同的匹配项,但顺序不同。提示:CTRL-N 代表下一个匹配项,CTRL-P 代表上一个匹配项。
Vim 编辑器会付出很多努力来查找要完成的单词。默认情况下,它会搜索以下位置
1. 当前文件 2. 其他窗口中的文件 3. 其他已加载文件(隐藏缓冲区) 4. 未加载的文件(非活动缓冲区) 5. 标记文件 6. 当前文件 #include 的所有文件

选项

你可以使用 'complete' 选项来自定义搜索顺序。
使用 'ignorecase' 选项。当它被设置时,在搜索匹配项时会忽略大小写差异。
用于补全的特殊选项是 'infercase'。这在忽略大小写 ('ignorecase' 必须设置) 但仍使用到目前为止输入的单词的大小写的情况下很有用。因此,如果你输入“For”,而 Vim 找到匹配项“fortunately”,它将得到“Fortunately”。

完成特定项

如果你知道你在找什么,你可以使用以下命令来完成特定类型的项
CTRL-X CTRL-F 文件名 CTRL-X CTRL-L 整行 CTRL-X CTRL-D 宏定义(也在包含文件中) CTRL-X CTRL-I 当前文件和包含文件 CTRL-X CTRL-K 字典中的单词 CTRL-X CTRL-T 同义词库中的单词 CTRL-X CTRL-] 标记 CTRL-X CTRL-V Vim 命令行
在每个命令之后,CTRL-N 可用于查找下一个匹配项,CTRL-P 可用于查找上一个匹配项。有关这些命令的更多信息,请查看:ins-completion

完成文件名

CTRL-X CTRL-F 为例。这将查找文件名。它会扫描当前目录以查找文件,并显示与光标前面的单词匹配的每个文件。例如,假设你当前目录中有以下文件
main.c sub_count.c sub_done.c sub_exit.c
现在进入插入模式并开始输入
The exit code is in the file sub
此时,你输入 CTRL-X CTRL-F 命令。Vim 现在会通过查看当前目录中的文件来完成当前单词“sub”。第一个匹配项是 sub_count.c。这不是你想要的,因此你通过输入 CTRL-N 来匹配下一个文件。这个匹配项是 sub_done.c。再次输入 CTRL-N 会带你到 sub_exit.c。结果
The exit code is in the file sub_exit.c
如果文件名以 / (Unix)或 C:\ (MS-Windows) 开头,你可以找到文件系统中的所有文件。例如,输入“/u”并按下 CTRL-X CTRL-F。这将匹配“/usr”(这是在 Unix 上)
the file is found in /usr/
如果你现在按 CTRL-N,你会回到“/u”。相反,要接受“/usr/”并深入一层目录,请再次使用 CTRL-X CTRL-F
the file is found in /usr/X11R6/
结果当然取决于你的文件系统中发现了什么。匹配项按字母顺序排序。

在源代码中完成

源代码文件结构良好。这使得能够以智能的方式进行补全。在 Vim 中,这被称为 Omni 补全。在其他一些编辑器中,它被称为 intellisense,但那是一个商标。
Omni 补全的关键是 CTRL-X CTRL-O。显然,O 在这里代表 Omni,这样你更容易记住它。让我们以编辑 C 源代码为例
{
    struct foo *p;
    p->
光标位于“p->”之后。现在输入 CTRL-X CTRL-O。Vim 会向你提供一个备选列表,这些备选是“struct foo”包含的项。这与使用 CTRL-P 非常不同,CTRL-P 会完成任何单词,而这里只有“struct foo”的成员是有效的。
要使 Omni 补全工作,你可能需要进行一些设置。至少要确保启用了文件类型插件。你的 vimrc 文件应该包含类似以下内容的一行
filetype plugin on
或者
filetype plugin indent on
对于 C 代码,你需要创建一个标记文件并设置 'tags' 选项。这在 ft-c-omni 中有解释。对于其他文件类型,你可能需要做类似的事情,请查看下面的 compl-omni-filetypes。它只适用于特定的文件类型。检查 'omnifunc' 选项的值,以确定它是否有效。

24.4 重复插入

如果你按下 CTRL-A,编辑器会插入你上次在插入模式下输入的文本。例如,假设你有一个以以下内容开头的文件
"file.h" ~
/* Main program begins */ ~
你通过在第一行的开头插入“#include ”来编辑此文件
#include "file.h" ~
/* Main program begins */ ~
你使用“j^”命令向下移动到下一行的开头。你现在开始插入一个新的“#include”行。因此你输入
i CTRL-A
结果如下
#include "file.h" ~
#include /* Main program begins */ ~
插入了“#include ”,因为 CTRL-A 会插入之前的插入文本。现在你输入“main.h”<Enter> 来完成这一行
#include "file.h" ~
#include "main.h" ~
/* Main program begins */ ~
CTRL-@ 命令会执行 CTRL-A 然后退出插入模式。这是一种快速执行完全相同的插入操作的方式。

24.5 从另一行复制

CTRL-Y 命令会插入光标上方的字符。当你复制前一行时,这很有用。例如,你有一行 C 代码
b_array[i]->s_next = a_array[i]->s_next;
现在你需要输入相同的行,但用“s_prev”代替“s_next”。开始新行,并按下CTRL-Y 14 次,直到你到达“next”的“n”。
b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_
现在输入“prev”。
b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev
继续按CTRL-Y 直到下一个“next”。
b_array[i]->s_next = a_array[i]->s_next;
b_array[i]->s_prev = a_array[i]->s_
现在输入“prev;”来完成它。
CTRL-E 命令的作用与CTRL-Y 相同,只是它在光标下方插入字符。

24.6 插入寄存器

CTRL-R {register} 命令插入寄存器的内容。这对于避免输入长词很有用。例如,你需要输入:
r = VeryLongFunction(a) + VeryLongFunction(b) + VeryLongFunction(c)
函数名是在另一个文件中定义的。编辑该文件,并将光标移动到该文件中的函数名称上,然后将其剪切到寄存器 v 中。
"vyiw
"v 是寄存器规范,“yiw” 是剪切内词。现在编辑要插入新行的文件,并输入前几个字母。
r =
现在使用 CTRL-R v 插入函数名称。
r = VeryLongFunction
继续输入函数名称之间的字符,并使用 CTRL-R v 两次。你也可以使用自动补全来完成相同的事情。当有很多以相同字符开头的词时,使用寄存器很有用。
如果寄存器包含<BS> 或其他特殊字符,它们将被解释为从键盘输入的字符。如果你不希望发生这种情况(你确实想要在文本中插入<BS>),请使用CTRL-R CTRL-R {register} 命令。

24.7 缩写

缩写是一个短词,它代替一个长词。例如,“ad”代表“advertisement”。Vim 允许你输入一个缩写,然后会自动为你展开它。要告诉 Vim 在每次你插入“ad”时都将其展开为“advertisement”,请使用以下命令:
:iabbrev ad advertisement
现在,当你输入“ad”时,整个词“advertisement”将被插入到文本中。这可以通过输入一个不能作为词的一部分的字符来触发,例如空格。
输入内容 显示内容
I saw the a I saw the a
I saw the ad I saw the ad
I saw the ad<Space> I saw the advertisement<Space>
在只输入“ad”时不会进行展开。这样你就可以输入像“add”这样的词,它不会被展开。只有完整的词会被检查缩写。

缩写多个词

可以定义一个缩写,它会产生多个词。例如,要定义“JB”为“Jack Benny”,请使用以下命令:
:iabbrev JB Jack Benny
作为一名程序员,我使用两个比较不寻常的缩写。
:iabbrev #b /****************************************
:iabbrev #e <Space>****************************************/
这些用于创建方框注释。注释以 #b 开头,绘制顶线。然后我输入注释文本,并使用 #e 绘制底线。请注意,#e 缩写以空格开头。换句话说,前两个字符是空格-星号。通常,Vim 会忽略缩写和展开之间的空格。为了避免这个问题,我将空格拼写为七个字符:<, S, p, a, c, e, >。
注意: ":iabbrev" 是一个很长的词。":iab" 也可以正常工作。这相当于缩写缩写命令!

纠正打字错误

每次都犯同样的打字错误很常见。例如,输入“teh”而不是“the”。你可以通过缩写来修复这个问题。
:abbreviate teh the
你可以添加一个完整的列表。每次你发现一个常见的错误时就添加一个。

列出缩写

":abbreviate" 命令列出缩写。
:abbreviate
i  #e                  ****************************************/
i  #b                 /****************************************
i  JB                 Jack Benny
i  ad                 advertisement
!  teh                 the
第一列中的“i”表示插入模式。这些缩写只在插入模式下有效。其他可能的字符是:
c 命令行模式 :cabbrev ! 同时在插入和命令行模式下有效 :abbreviate
由于缩写并不经常在命令行模式下有用,因此你主要会使用“:iabbrev”命令。这避免了例如在输入诸如以下命令时,“ad”被展开:
:edit ad

删除缩写

要删除一个缩写,请使用“:unabbreviate”命令。假设你拥有以下缩写。
:abbreviate @f fresh
你可以用以下命令删除它。
:unabbreviate @f
当你输入这个命令时,你会注意到 @f 被扩展为“fresh”。不要担心,Vim 仍然可以理解它(除非你有一个针对“fresh”的缩写,但这不太可能)。要删除所有缩写,请使用以下命令:
:abclear
":unabbreviate" 和 ":abclear" 也有适用于插入模式的变体(":iunabbreviate" 和 ":iabclear")以及命令行模式的变体(":cunabbreviate" 和 ":cabclear")。

重新映射缩写

在定义缩写时,有一点需要注意:生成的字符串不应该被映射。例如
:abbreviate @a adder
:imap dd disk-door
现在当你输入 @a 时,你将得到“adisk-doorer”。这不是你想要的。为了避免这种情况,请使用“:noreabbrev”命令。它与“:abbreviate”的作用相同,但它会避免生成的字符串被用于映射。
:noreabbrev @a adder
幸运的是,缩写的结果不太可能被映射。

24.8 输入特殊字符

CTRL-V 命令用于按字面意思插入下一个字符。换句话说,字符的任何特殊含义都将被忽略。例如
CTRL-V <Esc>
插入一个转义字符。因此你不会退出插入模式。(不要在CTRL-V 后输入空格,只是为了让这个更容易阅读)。
注意: 在 MS-Windows 上,CTRL-V 用于粘贴文本。请使用CTRL-Q 代替CTRL-V。另一方面,在 Unix 上,CTRL-Q 在某些终端上不起作用,因为它具有特殊的含义。
你也可以使用CTRL-V {digits} 命令来插入具有十进制数{digits} 的字符。例如,字符号 127 是<Del> 字符(但不一定是<Del> 键!)。要插入<Del>,请键入:
CTRL-V 127
你可以用这种方式输入高达 255 个字符。当你输入少于两位数字时,非数字字符将终止命令。为了避免需要输入非数字字符,请在前面加一个或两个零,使其成为三位数字。所有接下来的命令都插入一个<Tab>,然后是一个点。
CTRL-V 9. CTRL-V 09. CTRL-V 009.
要以十六进制输入字符,请在CTRL-V 后面加上一个“x”。
CTRL-V x7f
这也适用于高达字符 255(CTRL-V xff)。你可以使用“o”来用八进制数输入字符,还有两种方法允许你输入高达 16 位和 32 位的数字(例如,对于 Unicode 字符)。
CTRL-V o123
CTRL-V u1234
CTRL-V U12345678

24.9 二字符组合

有些字符不在键盘上。例如,版权字符(©)。要在 Vim 中输入这些字符,你使用二字符组合,其中两个字符代表一个字符。例如,要输入一个 ©,你需要按三个键。
CTRL-K Co
要找出哪些二字符组合可用,请使用以下命令:
:digraphs
Vim 将显示二字符组合表。这是其中的三行。
AC ~_ 159 NS | 160 !I ¡ 161 Ct ¢ 162 Pd £ 163 Cu ¤ 164 Ye ¥ 165
BB ¦ 166 SE § 167 ': ¨ 168 Co © 169 -a ª 170 << « 171 NO ¬ 172
-- ­ 173 Rg ® 174 'm ¯ 175 DG ° 176 +- ± 177 2S ² 178 3S ³ 179
这显示,例如,通过输入CTRL-K Pd 得到的二字符组合是字符(£)。这是字符号 163(十进制)。Pd 代表 Pound(英镑)。大多数二字符组合都是为了给你一个关于它们将产生的字符的提示。如果你仔细查看列表,你会理解其中的逻辑。你可以交换第一个和第二个字符,如果不存在该组合的二字符组合。因此CTRL-K dP 也有效。由于不存在“dP”的二字符组合,Vim 也会搜索“Pd”二字符组合。
注意: 二字符组合取决于 Vim 假设你正在使用的字符集。始终使用“:digraphs”来找出当前可用的二字符组合。
你可以定义自己的二字符组合。例如
:digraph a" ä
这定义了CTRL-K a" 插入一个 ä 字符。你也可以使用十进制数来指定字符。这定义了相同的二字符组合。
:digraph a" 228
有关二字符组合的更多信息,请参阅:digraphs 另一种插入特殊字符的方法是使用键映射。有关更多信息,请参阅:45.5

24.10 正常模式命令

插入模式提供数量有限的命令。在正常模式下,你拥有更多命令。当你想要使用一个命令时,你通常会使用<Esc> 退出插入模式,执行正常模式命令,然后使用“i”或“a”重新进入插入模式。还有一种更快捷的方法。使用CTRL-O {command},你可以从插入模式执行任何正常模式命令。例如,要从光标删除到行尾,请使用以下命令:
CTRL-O D
你只能用这种方法执行一个正常模式命令。但是你可以指定一个寄存器或一个计数。一个更复杂的例子:
CTRL-O "g3dw
这会将光标到第三个词之间的内容删除到寄存器 g 中。
下一章:usr_25.txt 编辑格式化文本
版权:请参阅 manual-copyright vim:tw=78:ts=8:noet:ft=help:norl
主页
命令索引
快速参考