Usr_03
Nvim :help
页面,生成 于 源代码,使用 tree-sitter-vimdoc 解析器。
VIM 用户手册 - 作者 Bram Moolenaar
移动光标
在插入或删除文本之前,光标必须移动到正确的位置。Vim 有大量的命令来定位光标。本章将向您展示如何使用最重要的命令。您可以在下面的
Q_lr 中找到这些命令的列表。
字词移动
要将光标向前移动一个字词,请使用 "w" 命令。与大多数 Vim 命令一样,您可以使用数字前缀来移动多个字词。例如,"3w" 会移动三个字词。下图显示了它的工作原理(从标记为 "x" 的位置开始)。
这是一行包含示例文本的行
x-->-->->-----------------> w w w 3w
请注意,如果光标已处于字词开头,"w" 命令会移动到下一个字词的开头。 "b" 命令会向后移动到上一个字词的开头。
这是一行包含示例文本的行
<----<--<-<---------<--x b b b 2b b
还有 "e" 命令,它会移动到下一个字词的结尾,以及 "ge" 命令,它会移动到上一个字词的结尾。
这是一行包含示例文本的行
<----<----x---->------------> 2ge ge e 2e
如果您位于一行的最后一个字词,"w" 命令会将您带到下一行的第一个字词。因此,您可以使用此命令快速浏览一段文字,比使用 "l" 命令快得多。 "b" 在另一个方向上执行相同的操作。
一个字词以非字词字符结束,例如 ".", "-" 或 ")"。要更改 Vim 认为的字词,请参阅
'iskeyword' 选项。如果您直接在帮助中尝试此操作,则需要重置
'iskeyword' 选项才能使示例正常工作。
:set iskeyword&
也可以按以空格分隔的 WORD 移动。这不是正常意义上的字词,因此使用大写字母表示。按 WORD 移动的命令也使用大写字母,如下图所示。
ge b w e <- <- ---> --->
这是一行,包含特殊/分隔/字词(以及更多字词)。
<----- <----- --------------------> -----> gE B W E
使用此大小写命令混合,您可以快速在段落中前后移动。
"$" 命令将光标移动到行尾。如果您的键盘上有 <End>
键,它也会执行相同的操作。
"^" 命令会移动到行的第一个非空白字符。 "0" 命令(零)会移动到行的第一个字符,<Home>
键也会执行相同的操作。在下图中("." 表示空格)
^ <-----------x
.....这是一行包含示例文本的行
<----------------x x--------------> 0 $
("....." 表示此处有空格)
"$" 命令接受计数,与大多数移动命令一样。但多次移动到行尾没有意义。因此,它会导致编辑器移动到另一行的末尾。例如,"1$" 会将您移动到第一行的末尾(您当前所在的行),"2$" 会移动到下一行的末尾,以此类推。 "0" 命令不接受计数参数,因为 "0" 本身是计数的一部分。出乎意料的是,对 "^" 使用计数不会产生任何影响。
最实用的移动命令之一是单字符搜索命令。 "fx" 命令会在行中向前搜索单字符 x。提示:"f" 代表 "Find"(查找)。例如,您位于以下行的开头。假设您要移动到 "human" 的 "h"。只需执行 "fh" 命令,光标就会定位在 "h" 上。
To err is human. To really foul up you need a computer.
---------->---------------> fh fy
这也表明 "fy" 命令会移动到 "really" 的结尾。您可以指定计数;因此,您可以使用 "3fl" 移动到 "foul" 的 "l"。
To err is human. To really foul up you need a computer.
---------------------> 3fl
"F" 命令会向左搜索。
To err is human. To really foul up you need a computer.
<--------------------- Fh
"tx" 命令的工作方式类似于 "fx" 命令,但它会在搜索的字符之前停止一个字符。提示:"t" 代表 "To"(到)。此命令的反向版本是 "Tx"。
To err is human. To really foul up you need a computer.
<------------ -------------> Th tn
这四个命令可以使用 ";" 重复。"," 会在另一个方向上重复。光标永远不会移动到另一行。即使句子继续也不会移动。
有时您会开始搜索,但随后意识到您输入了错误的命令。例如,您输入 "f" 来向后搜索,但随后意识到您实际上是想输入 "F"。要中止搜索,请按 <Esc>
。因此,"f<Esc>" 是一个中止的向前搜索,它不会执行任何操作。注意: <Esc>
会取消大多数操作,而不仅仅是搜索。
在编写程序时,您经常会遇到嵌套的 () 结构。这时 "%" 命令就非常方便:它会移动到匹配的括号。如果光标位于 "(" 上,它会移动到匹配的 ")"。如果光标位于 ")" 上,它会移动到匹配的 "("。
%
<----->
if (a == (b * c) / d)
<---------------->
%
当光标不在有用的字符上时,"%" 会向前搜索以找到一个。因此,如果光标位于上一个示例行的开头,"%" 会向前搜索并找到第一个 "(". 然后它会移动到其匹配项。
if (a == (b * c) / d)
---+---------------->
%
如果您是 C 或 C++ 程序员,您应该熟悉以下类型的错误消息:
prog.c:33: j undeclared (first use in this function)
这告诉您您可能需要修复第 33 行中的某些内容。那么如何找到第 33 行呢?一种方法是使用 "9999k" 移动到文件顶部,然后使用 "32j" 向下移动 32 行。这不是最好的方法,但它有效。更好的方法是使用 "G" 命令。带有计数时,此命令会将您定位到给定的行号。例如,"33G" 会将您定位到第 33 行。(要了解如何更好地处理编译器的错误列表,请参阅
usr_30.txt,了解 :make 命令的信息。)不带参数时,"G" 会将您定位到文件末尾。使用 "gg" 可以快速移动到文件开头。 "1G" 会执行相同的操作,但需要多输入几个字符。
| 文件的第一行 ^ | 文本 文本 文本 文本 | | 文本 文本 文本 文本 | gg 7G | 文本 文本 文本 文本 | | 文本 文本 文本 文本 | 文本 文本 文本 文本 V 文本 文本 文本 文本 | 文本 文本 文本 文本 | G 文本 文本 文本 文本 | 文件的最后一行 V
另一种移动到特定行的方法是使用带有计数的 "%" 命令。例如,"50%" 会将您移动到文件的中间,"90%" 会移动到接近文件末尾的位置。
上述内容假定您想要移动到文件中的某一行,无论它当前是否可见。如果您想要移动到您可以看到的行之一,可以使用下图中所示的三个命令。
+---------------------------+ H --> | 文本样本 文本 | | 样本 文本 | | 文本样本 文本 | | 样本 文本 | M --> | 文本样本 文本 | | 样本 文本 | | 文本样本 文本 | | 样本 文本 | L --> | 文本样本 文本 | +---------------------------+
提示:"H" 代表 Home(首页),"M" 代表 Middle(中间),"L" 代表 Last(最后)。或者,"H" 代表 High(高),"M" 代表 Middle(中间),"L" 代表 Low(低)。
要查看您在文件中的位置,有三种方法:
1. 使用
CTRL-G
命令。您会收到类似于以下消息(假设
'ruler' 选项已关闭):
"usr_03.txt" line 233 of 650 --35%-- col 45-52
这显示了您正在编辑的文件名、光标所在的行号、总行数、文件中的百分比位置以及光标所在的列。有时您会看到拆分的列号。例如,"col 2-9"。这表示光标定位在第二个字符上,但由于第一个字符是制表符,占据 8 个空格的列宽,因此屏幕列为 9。
2. 设置
'number' 选项。这会在每一行前面显示一个行号。
:set number
由于
'number' 是一个布尔选项,因此在它的名称前面加上 "no" 会将其关闭。布尔选项只有这两个值,它要么打开,要么关闭。Vim 有许多选项。除了布尔选项之外,还有数值选项和字符串选项。您将在它们的使用场景中看到这些选项的示例。
3. 设置
'ruler' 选项。这会在 Vim 窗口的右下角显示光标位置。
:set ruler
使用
'ruler' 选项的优点是它不会占用太多空间,因此文本有更多的空间。
CTRL-U
命令会向下滚动半屏幕文本。想象一下,您正在通过一个观看窗口查看文本,并将此窗口向上移动窗口高度的一半。因此,窗口会向上移动到文本之上,这在文件中是向后的。如果您难以记住哪个端点朝上,请不要担心。大多数用户都会遇到这个问题。CTRL-D
命令会将观看窗口向下移动半屏幕,从而在文件中向上滚动半屏幕文本。
+----------------+ | 一些文本 | | 一些文本 | | 一些文本 | +---------------+ | 一些文本 | | 一些文本 | CTRL-U
--> | | | | | 123456 | | 123456 | +----------------+ | 7890 | | | +----------------+ | 例如 | CTRL-D
--> | 7890 | +---------------+ | | | 例如 | | 例如 | | 例如 | | 例如 | +----------------+
要一次滚动一行,请使用 CTRL-E
(向上滚动)和 CTRL-Y
(向下滚动)。将 CTRL-E
想象成给你一行额外的空间。(如果你使用 MS-Windows 兼容的按键映射,CTRL-Y
将会重做更改,而不是滚动。)
要向前滚动一整屏(除了两行),请使用 CTRL-F
。要向后滚动,请使用 CTRL-B
。这些命令应该很容易记住:F 代表 Forwards(向前),B 代表 Backwards(向后)。
一个常见的问题是,在使用 “j” 向下移动很多行后,你的光标会出现在屏幕的底部。你可能想要看到光标所在行的上下文。这时可以使用 “zz” 命令。
+------------------+ +------------------+ | 之前的文本 | | 之前的文本 | | 之前的文本 | | 之前的文本 | | 之前的文本 | | 之前的文本 | | 之前的文本 | zz --> | 带有光标的行 | | 之前的文本 | | 后面的文本 | | 之前的文本 | | 后面的文本 | | 带有光标的行 | | 后面的文本 | +------------------+ +------------------+
“zt” 命令将光标所在行放在顶部,“zb” 将其放在底部。还有几个其他的滚动命令,请查看
Q_sc。要始终在光标周围保留几行上下文,请使用
'scrolloff' 选项。
要搜索一个字符串,请使用 “/string” 命令。例如,要查找单词 include,请使用以下命令
/include
你会注意到,当你输入 “/” 时,光标会跳到 Vim 窗口的最后一行,就像使用冒号命令一样。这就是你输入单词的地方。你可以按下退格键(退格键或
<BS>
)进行修正。必要时可以使用
<Left>
和
<Right>
方向键。按下
<Enter>
执行命令。
注意: 字符 .*[]^%/\?~$ 在搜索中具有特殊含义。如果你想在搜索中使用它们,必须在它们前面加上一个 \。请参见下文。
要查找同一字符串的下一个出现位置,请使用 “n” 命令。使用它来查找光标后面的第一个 #include
/#include
然后输入几次 “n”。你会移动到文本中的每个 #include。如果你知道要查找的是哪个匹配项,也可以使用计数。因此,“3n” 会查找第三个匹配项。你也可以在 “/” 中使用计数:“4/the” 会跳转到 “the” 的第四个匹配项。
“?” 命令的工作原理类似于 “/”,但它是向后搜索
?word
“N” 命令会以相反的方向重复最后一次搜索。因此,在 “/” 命令后使用 “N” 会向后搜索,在 “?” 后使用 “N” 会向前搜索。
忽略大小写
通常情况下,你必须精确地输入要查找的内容。如果你不关心单词的大小写,请设置
'ignorecase' 选项
:set ignorecase
现在如果你搜索 “word”,它也会匹配 “Word” 和 “WORD”。要再次匹配大小写
:set noignorecase
历史记录
假设你进行了三次搜索
/one
/two
/three
现在让我们尝试通过输入一个简单的 “/” 而不按
<Enter>
来开始搜索。如果你按下
<Up>
(方向键),Vim 会在命令行上显示 “/three”。此时按下
<Enter>
会搜索 three。如果你没有按下
<Enter>
,而是再次按下
<Up>
,Vim 会将提示更改为 “/two”。再按一次
<Up>
会将你移动到 “/one”。你也可以使用
<Down>
方向键以相反的方向在搜索命令历史记录中移动。
如果你知道以前使用过的模式的开头是什么,并且想再次使用它,请在按下 <Up>
之前输入该字符。在上面的示例中,你可以输入 “/o<Up>”,Vim 会在命令行上显示 “/one”。
以 “:” 开头的命令也拥有历史记录。这让你可以回忆起之前的命令并再次执行它。这两个历史记录是独立的。
在文本中搜索单词
假设你在文本中看到了单词 “TheLongFunctionName”,并且想要查找它的下一个出现位置。你可以输入 “/TheLongFunctionName”,但这需要输入很多东西。而且当你犯错误时,Vim 无法找到它。有一种更简单的方法:将光标放在该单词上并使用 “*” 命令。Vim 会获取光标下的单词并将其用作搜索字符串。 “#” 命令会在另一个方向执行相同的操作。你可以在前面加上一个计数:“3*” 会搜索光标下单词的第三个出现位置。
搜索完整单词
如果你输入 “/the”,它也会匹配 “there”。要仅查找以 “the” 结尾的单词,请使用
/the\>
“\>” 项目是一个特殊标记,它只在单词末尾匹配。类似地,“\<” 仅在单词开头匹配。因此,要仅搜索 “the” 这个单词
/\<the\>
这不会匹配 “there” 或 “soothe”。请注意,“*” 和 “#” 命令会使用这些单词开头和结尾标记来仅查找完整单词(你可以使用 “g*” 和 “g#” 来匹配部分单词)。
突出显示匹配项
在编辑程序时,你看到一个名为 “nr” 的变量。你想检查它在哪里使用。你可以将光标移动到 “nr” 上,使用 “*” 命令并按下 “n” 来遍历所有匹配项。
Vim 会突出显示所有匹配项。这是查看变量使用位置的非常好的方法,无需输入命令。要关闭此功能
:set nohlsearch
如果你想在下次搜索命令中使用它,则需要再次打开它
:set hlsearch
如果你只想删除突出显示,请使用以下命令
:nohlsearch
这不会重置选项。相反,它会禁用突出显示。只要你执行搜索命令,突出显示就会再次使用。对于 “n” 和 “N” 命令也是如此。
调整搜索
有一些选项会改变搜索的工作方式。以下是一些重要的选项
:set nowrapscan
这会停止搜索,直到文件末尾。或者,当你向后搜索时,它会停止搜索,直到文件开头。
'wrapscan' 选项默认情况下是打开的,因此搜索会绕过文件末尾。
:set noincsearch
这会禁用在输入搜索内容时显示匹配项。
插曲
如果你喜欢之前提到的某个选项,并且每次使用 Vim 时都设置它,你可以在 Vim 启动文件中添加该命令。使用以下命令编辑该文件,例如
:edit ~/.config/nvim/init.vim
然后添加一行包含设置选项的命令,就像你在 Vim 中输入的一样。例如
Go:set hlsearch<Esc>
“G” 会移动到文件末尾。“o” 会开始一个新行,你可以在其中输入 “:set” 命令。使用
<Esc>
退出插入模式。然后写入并关闭文件
ZZ
如果你现在再次启动 Vim,
'hlsearch' 选项就会被设置。
Vim 编辑器使用正则表达式来指定要搜索的内容。正则表达式是一种非常强大且简洁的方式来指定搜索模式。不幸的是,这种强大之处也伴随着代价,因为正则表达式有点难以指定。在本节中,我们只提到了一些必不可少的表达式。关于搜索模式和命令的更多信息,请查看第 27 章
usr_27.txt。你可以在此处找到完整的解释:
pattern.
行首和行尾
^ 字符匹配行首。在英文 US 键盘上,它位于 6 的上方。“include” 模式会匹配行中任何位置的单词 include。但 "^include” 模式只会在单词 include 出现在行首时才会匹配它。$ 字符匹配行尾。因此,“was$” 只会在单词 was 出现在行尾时才会匹配它。
让我们用 “x” 来标记以下示例行中 “/the” 匹配的位置
the solder holding one of the chips melted and the
xxx xxx xxx
使用 “/the$” 会找到以下匹配项
the solder holding one of the chips melted and the
xxx
使用 “/^the” 会找到以下匹配项
the solder holding one of the chips melted and the
xxx
你可以尝试使用 “/^the$” 进行搜索;它只会匹配完全由 “the” 组成的单行。空格在这里很重要,因此如果一行在单词后面包含空格,例如 “the ”,则模式将不会匹配。
匹配任何单个字符
.(点)字符匹配任何存在的字符。例如,“c.m” 模式会匹配第一个字符为 c、第二个字符为任何字符、第三个字符为 m 的字符串。示例
We use a computer that became the cummin winter.
xxx xxx xxx
匹配特殊字符
如果你真的想匹配一个点,你必须通过在其前面加上一个反斜杠来避免它的特殊含义。如果你搜索 “ter.”,你会找到以下匹配项
We use a computer that became the cummin winter.
xxxx xxxx
搜索 “ter\.” 仅会找到第二个匹配项。
当你使用 “G” 命令跳转到某个位置时,Vim 会记住你跳转之前的那个位置。这个位置被称为标记。要返回到你之前的位置,请使用以下命令
``
这是一个反引号或左单引号字符。如果你第二次使用相同的命令,你会再次跳回去。这是因为 “`” 命令本身也是一次跳转,而 Vim 会记住你跳转之前的那个位置。
通常,当你执行一个命令时,如果该命令可以将光标移动到同一行的范围之外,那么这就被称为一次跳转。这包括搜索命令 “/” 和 “n”(无论匹配项有多远)。但不包括使用 “fx” 和 “tx” 的字符搜索或使用 “w” 和 “e” 的单词移动。此外,“j” 和 “k” 不被认为是跳转,即使你使用计数来使它们移动光标很远。
“``” 命令在两个点之间来回跳转。
CTRL-O
命令会跳转到更早的位置(提示:O 代表 older(更早))。
CTRL-I
则会跳回更新的位置(提示:对于许多常见的键盘布局,I 就在 O 的旁边)。请考虑以下命令序列
33G
/^The
CTRL-O
你首先跳转到第 33 行,然后搜索以 “The” 开头的行。然后使用
CTRL-O
跳回第 33 行。另一个
CTRL-O
会将你带回到你开始的地方。如果你现在使用
CTRL-I
,你会再次跳转到第 33 行。另一个
CTRL-I
会跳转到 “The” 的匹配项。
| 示例文本 ^ | 33G | 示例文本 | CTRL-O
| CTRL-I
| 示例文本 | | V 第 33 行文本 ^ V | 示例文本 | | /^The | 示例文本 | CTRL-O
| CTRL-I
V 这就是它 | V 示例文本
注意: CTRL-I
等同于 <Tab>
。
“:jumps” 命令会显示你跳转过的所有位置。你最后使用的那一个条目会被标记为 “>”。
Vim 允许你将自己的标记放在文本中。“ma” 命令会将光标下的位置标记为标记 a。你可以在文本中放置 26 个标记(a 到 z)。你看不到它们,它们只是 Vim 记住的一个位置。要移动到某个标记,请使用 {mark} 命令,其中 {mark} 是标记字母。因此,要移动到标记 a
`a
命令 "'mark"(单引号,或撇号)将你移动到包含标记的行首。这与命令 "`mark" 不同,后者还会将你移动到标记的列。
标记在处理文件中的两个相关部分时非常有用。假设你在文件开头附近有一些需要查看的文本,同时又在文件末尾附近处理一些文本。移动到开头处的文本并将 s(开始)标记放置在那里。
ms
然后移动到你要处理的文本并放置 e(结束)标记。
me
现在你可以四处移动,当你想要查看文件开头时,可以使用它跳到那里。
's
然后你可以使用 '' 跳回你所在的位置,或使用 'e 跳回你最后处理的末尾文本。使用 s 表示开始和 e 表示结束并没有什么特殊之处,它们只是容易记住。
你可以使用此命令来获取标记列表。
:marks
你会注意到一些特殊标记。这些包括
' 跳跃之前的游标位置 " 最后编辑文件时的游标位置 [ 上次更改的开始 ] 上次更改的结束