Usr_04
Nvim :help
页面,生成自 源代码 使用 tree-sitter-vimdoc 解析器。
VIM 用户手册 - 作者 Bram Moolenaar
进行小修改
本章介绍几种进行修正和移动文本的方法。它将教你三种基本的文本修改方式:操作-移动、可视模式和文本对象。
操作和移动
在第 2 章中,你学习了 "x" 命令来删除单个字符。使用计数: "4x" 删除四个字符。你可能认出了 "w" 命令是移动单词的命令。事实上,"d" 命令可以后接任何移动命令,它会从当前位置删除到光标移动到的位置。例如,"4w" 命令将光标移动到四个单词。 "d4w" 命令删除四个单词。
人非圣贤,孰能无过。要真正搞砸,你需要一台电脑。
------------------> d4w
Vim 只删除到移动命令将光标移动到的位置。这是因为 Vim 知道你可能不想删除单词的第一个字符。如果你使用 "e" 命令移动到单词末尾,Vim 会猜测你确实想包含最后一个字符
人非圣贤,孰能无过。你需要一台电脑。
--------> d2e
光标下的字符是否包含在内,取决于你用来移动到该字符的命令。参考手册将此称为 "exclusive"(排他性)当字符不包含在内时,以及 "inclusive"(包含性)当字符包含在内时。
"$" 命令移动到行末。 "d$" 命令从光标删除到行末。这是一个包含性移动,因此行的最后一个字符包含在删除操作中
人非圣贤,孰能无过。电脑。
------------> d$
这里有一个模式:操作-移动。你首先输入一个操作命令。例如, "d" 是删除操作符。然后你输入一个移动命令,例如 "4l" 或 "w"。这样你就可以对任何你可以移动的文本进行操作。
另一个操作符是 "c",更改。它的作用与 "d" 操作符完全一样,只是它会让你进入插入模式。例如, "cw" 更改一个单词。更准确地说,它删除一个单词,然后把你带入插入模式。
人非圣贤,孰能无过
-------> c2wbe<Esc>
这个 "c2wbe<Esc>" 包含以下部分
c 更改操作符 2w 移动两个单词(它们被删除,插入模式启动) be 插入此文本 <Esc>
返回普通模式
你可能已经注意到一些奇怪的地方: "human" 前面的空格并没有被删除。有句谚语说,对于每一个问题,都有一个简单、清晰且错误的答案。这就是这里对 "cw" 命令使用的例子的情况。c 操作符的作用与 d 操作符一样,只有一个例外:"cw"。它实际上像 "ce" 一样工作,更改到单词末尾。因此,单词后的空格不会被包含在内。这是一个可以追溯到旧 Vi 的例外。由于现在很多人都习惯了它,所以这种不一致性仍然存在于 Vim 中。
更多更改
就像 "dd" 删除整行一样, "cc" 更改整行。不过,它会保留现有的缩进(前导空格)。
就像 "d$" 删除到行末一样, "c$" 更改到行末。这就像执行 "d$" 删除文本,然后执行 "a" 开始插入模式并追加新文本。
快捷键
一些操作-移动命令使用频率很高,因此被赋予了一个单字母命令
x 代表 dl(删除光标下的字符) X 代表 dh(删除光标左侧的字符) D 代表 d$(删除到行末) C 代表 c$(更改到行末) s 代表 cl(更改一个字符) S 代表 cc(更改整行)
计数的位置
命令 "3dw" 和 "d3w" 删除三个单词。如果你真的要挑剔,第一个命令 "3dw" 删除一个单词三次;命令 "d3w" 删除三个单词一次。这是一种没有区别的区别。实际上,你可以输入两个计数。例如, "3d2w" 删除两个单词,重复三次,总共删除六个单词。
用一个字符替换
"r" 命令不是操作符。它会等待你输入一个字符,并将光标下的字符替换为它。你可以用 "cl" 或 "s" 命令做同样的事情,但使用 "r",你不需要按 <Esc>
来退出插入模式。
在 "r" 命令中使用计数会导致替换这么多字符为同一个字符。例如
要将字符替换为换行符,请使用 "r<Enter>"。这会删除一个字符并插入一个换行符。在这里使用计数只适用于删除的字符数:"4r<Enter>" 将四个字符替换为一个换行符。
"." 命令是 Vim 中最简单但功能强大的命令之一。它会重复最后一次更改。例如,假设你正在编辑一个 HTML 文件,并且想要删除所有 <B>
标签。你将光标放在第一个 < 上,并使用 "df>" 命令删除 <B>
。然后你转到下一个 <
/B> 并使用 "." 命令删除它。 "." 命令会执行最后一个更改命令(在本例中是 "df>")。要删除另一个标签,将光标放在 < 上,并使用 "." 命令。
要 <B>
生成</B> 一个 <B>
内容表
f< 查找第一个 < ---> df> 删除到 > --> f< 查找下一个 < ---------> . 重复 df> ---> f< 查找下一个 < -------------> . 重复 df> -->
"." 命令适用于你做出的所有更改,除了 "u"(撤销)、CTRL-R
(重做)和以冒号 (:) 开头的命令。
另一个例子:你想要将 "four" 这个词改为 "five"。它在你的文本中出现了好几次。你可以使用以下命令序列快速完成:
/four<Enter> 查找第一个字符串 "four" cwfive<Esc> 将单词改为 "five" n 查找下一个 "four" . 重复更改为 "five" n 查找下一个 "four" . 重复更改等等。
对于删除简单项目,操作-移动更改效果很好。但通常情况下,很难确定哪个命令可以移动到你想更改的文本上。这时你可以使用可视模式。
你可以按 "v" 键启动可视模式。将光标移动到你想要操作的文本上。在此过程中,文本会被高亮显示。最后输入操作命令。例如,要从一个单词的中间删除到另一个单词的中间
这是一个可视模式的示例
----------> velllld
这样做时,你不需要真正计算你必须按多少次 "l" 才能到达正确的位置。当你按下 "d" 时,你可以立即看到将要删除的文本。
如果你在任何时候决定不想对高亮显示的文本做任何操作,只需按下 <Esc>
,可视模式就会停止,没有任何操作。
选择行
如果你想要操作整个行,请使用 "V" 启动可视模式。你会立即看到整行都被高亮显示,而无需移动光标。当你向左或向右移动时,没有任何变化。当你向上或向下移动时,选择将一次扩展整行。例如,使用 "Vjj" 选择三行
+------------------------+ | text more text | >> | more text more text | | 选择的行 >> | text text text | | Vjj >> | text more | V | more text more | +------------------------+
选择块
如果你想要操作一个矩形的字符块,请使用 CTRL-V
启动可视模式。这在处理表格时非常有用。
姓名 Q1 Q2 Q3 pierre 123 455 234 john 0 90 39 steve 392 63 334
要删除中间的 "Q2" 列,将光标移动到 "Q2" 的 "Q" 上。按下 CTRL-V 启动块可视模式。现在使用 "3j" 将光标向下移动三行,并使用 "w" 移动到下一个单词。你可以看到最后一列的第一个字符被包含在内。要排除它,请使用 "h"。现在按下 "d",中间列就消失了。
转到另一侧
如果你在可视模式下选择了某些文本,并且发现你需要更改选择的另一端,请使用 "o" 命令(提示:o 代表另一端)。光标将移到另一端,你可以移动光标来更改选择的开始位置。再次按下 "o" 将把你带回另一端。
在使用块可视模式时,你有四个角。"o" 只会带你到另一个角,斜向。使用 "O" 移动到同一行上的另一个角。
请注意,在可视模式下 "o" 和 "O" 的作用与普通模式下完全不同,在普通模式下,它们会在光标下方或上方打开新行。
当你使用 "d"、"x" 或其他命令删除某些东西时,文本会被保存。你可以使用 "p" 命令将其粘贴回来。(Vim 将此称为 put)。让我们看看它是如何工作的。首先,你将删除整行,将光标放在要删除的行上,然后输入 "dd"。现在你将光标移动到要放置行的位置,并使用 "p"(put)命令。该行将插入到光标下面的行。
一行 一行 一行 行 2 dd 行 3 p 行 3 行 3 行 2
因为你删除了整行,所以 "p" 命令将文本行放置在光标下面。如果你删除了部分行(例如一个单词), "p" 命令会将其放在光标之后。
一些更无聊的文本来尝试命令。
-------> welp
更多关于放置
"P" 命令像 "p" 一样放置文本,但在光标之前。当你使用 "dd" 删除整行时, "P" 会将其放在光标之上。当你使用 "dw" 删除一个单词时, "P" 会将其放在光标之前。
你可以重复放置任意多次。将使用相同的文本。
你可以在 "p" 和 "P" 命令中使用计数。文本将根据计数指定的次数重复。因此, "dd" 然后 "3p" 会放置三份相同已删除行的副本。
交换两个字符
当你打字时,你的手指经常会超过你的大脑(反之亦然?)。结果是打字错误,例如将 "the" 打成 "teh"。Vim 使得纠正这些问题变得容易。只需将光标放在 "teh" 的 e 上,并执行 "xp" 命令。它的工作原理如下:"x" 删除字符 e 并将其放在一个寄存器中。"p" 将文本放在光标之后,即 h 之后。
要将文本从一个地方复制到另一个地方,您可以先删除它,使用“u”撤销删除,然后使用“p”将其粘贴到其他地方。有一个更简单的方法: yank(提取)。“y”操作符将文本复制到一个寄存器中。然后可以使用“p”命令将其粘贴。Yanking 只是 Vim 对复制的称呼。“c”字母已经被用作改变操作符,而“y”仍然可用。将该操作符称为“yank” 使得更容易记住使用“y”键。
由于“y”是一个操作符,因此您可以使用“yw”来提取一个单词。通常可以计数。要提取两个单词,请使用“y2w”。示例
let sqr = LongVariable *
--------------> y2w
let sqr = LongVariable *
p
let sqr = LongVariable * LongVariable
请注意,“yw” 包括单词后面的空格。如果您不想要这些空格,请使用“ye”。
“yy” 命令提取整行,就像“dd” 删除整行一样。
a text line yy a text line a text line line 2 line 2 p line 2 last line last line a text line last line
“Y” 最初等效于“提取整行”,而“D” 等效于“删除到行尾”。“Y” 因此已被重新映射为“提取到行尾”,使其与“D” 的行为一致。映射将在后面的章节中介绍。
如果您使用的是 Vim 的 GUI 版本(gvim),您可以在“编辑”菜单中找到“复制”项。首先使用可视模式选择一些文本,然后使用“编辑/复制”菜单项。选定的文本现在被复制到剪贴板中。您可以在其他程序中粘贴该文本。也可以在 Vim 本身中粘贴。
如果您已在另一个应用程序中将文本复制到剪贴板中,您可以在 Vim 中使用“编辑/粘贴”菜单项将其粘贴。这在普通模式和插入模式下有效。在可视模式下,选定的文本将被粘贴的文本替换。
“剪切”菜单项会在将文本放入剪贴板之前将其删除。“复制”、“剪切”和“粘贴”项也出现在弹出菜单中(当然,只有在有弹出菜单时才会出现)。如果您的 Vim 有工具栏,您也可以在那里找到这些项目。
如果您没有使用 GUI,或者不喜欢使用菜单,您必须使用其他方法。您可以使用正常的“y”(提取)和“p”(粘贴)命令,但要在它们之前添加“*”(双引号星号)。要将一行复制到剪贴板
"*yy
要将剪贴板中的文本放回文本中
"*p
这仅适用于包含剪贴板支持的 Vim 版本。有关剪贴板的更多信息,请参阅第
09.3 节和此处:
clipboard。
如果光标位于单词中间,并且您想删除该单词,您需要先移动到它的开头,然后才能执行“dw”。有一个更简单的方法:“daw”。
this is some example text.
daw
“daw” 中的“d” 是删除操作符。“aw” 是一个文本对象。提示:“aw” 代表“一个单词”。因此“daw” 是“删除一个单词”。准确地说,单词后的空格也会被删除(或者如果在行尾,则会删除单词前的空格)。
使用文本对象是进行 Vim 修改的第三种方法。我们已经有了操作符-移动和可视模式。现在我们添加操作符-文本对象。它与操作符-移动非常相似,但它不是操作光标在移动命令前后位置之间的文本,而是将整个文本对象作为整体使用。光标在对象中的位置无关紧要。
要更改整个句子,请使用“cis”。以这段文本为例
Hello there. This
is an example. Just
some text.
移动到第二行的开头,在“is an” 上。现在使用“cis”
Hello there. Just
some text.
光标位于第一行空格之间。现在您键入新句子“Another line.”。
Hello there. Another line. Just
some text.
“cis” 包含“c”(更改)操作符和“is” 文本对象。这意味着“内部句子”。还有一个“as”(“一个句子”)对象。区别在于“as” 包含句子后的空格,而“is” 不包含。如果您想删除一个句子,您想同时删除空格,因此使用“das”。如果您想键入新文本,则空格可以保留,因此您使用“cis”。
您也可以在可视模式下使用文本对象。它将包括可视选择中的文本对象。可视模式会继续,因此您可以多次执行此操作。例如,使用“v” 启动可视模式,并使用“as” 选择一个句子。现在您可以重复“as” 以包含更多句子。最后,您使用操作符对选定的句子执行一些操作。
“R” 命令使 Vim 进入替换模式。在此模式下,您键入的每个字符都会替换光标下的字符。这将持续到您键入 <Esc>
为止。在本示例中,您在“text” 的第一个“t” 上启动替换模式
This is text.
Rinteresting.<Esc>
您可能已经注意到,此命令将行中的 5 个字符替换为 12 个其他字符。“R” 命令会在字符不足以替换时自动扩展行。它不会继续到下一行。
您可以使用 <Insert>
键在插入模式和替换模式之间切换。
当您使用 <BS>
(退格键)进行更正时,您会注意到旧文本被放回。因此,它就像对先前键入的字符的撤销命令。
操作符、移动命令和文本对象为您提供了进行大量组合的可能性。现在您知道了它们的工作原理,您可以使用 N 个操作符和 M 个移动命令来创建 N * M 个命令!
例如,还有许多其他方法可以删除文本片段。以下是一些常见的操作
x 删除光标下的字符(“dl” 的简写) X 删除光标前的字符(“dh” 的简写) D 从光标删除到行尾(“d$” 的简写) dw 从光标删除到下一个单词开头 db 从光标删除到上一个单词开头 diw 删除光标下的单词(不包括空格) daw 删除光标下的单词(包括空格) dG 删除到文件末尾 dgg 删除到文件开头
如果您使用“c” 而不是“d”,它们将变成更改命令。使用“y” 可以提取文本,等等。
有一些常见的命令可以进行更改,这些更改不适合放在其他地方
~ 更改光标下字符的大小写,并将光标移动到下一个字符。这不是操作符(除非设置了
'tildeop'),因此您不能将其与移动命令一起使用。它在可视模式下有效,在可视模式下,它会更改所有选定文本的大小写。
I 在将光标移动到行中的第一个非空格字符后开始插入模式。
A 在将光标移动到行尾后开始插入模式。