要移动光标向前跳一个词,可以使用 "w" 命令。像大多数 Vim 命令一样,你可以在命令
前加数字前缀表示把这个命令重复多次。例如,"3w" 表示向前移动 3 个单词。用图表示
如下 (从 "x" 标记的位置开始):
This is a line with example text ~ x-->-->->-----------------> w w w 3w
要注意的是,如果光标已经在一个单词的词首,"w" 移动到下一个单词的词首。
"b" 命令向后移动到前一个词的词首:
This is a line with example text
<----<--<-<---------<--x
b b b 2b b
还有一个 "e" 命令可以移到下一个单词的词末,而 "ge" 则移动到前一个单词的末尾:
This is a line with example text
<----<----x---->------------>
2ge ge e 2e
如果你在一行的最后一个单词,"w" 命令将把你带到下一行的第一个单词。这样你可以用
这个命令在一段中移动,这比使用 "l" 要快得多。"b" 则在反方向完成这个功能。
一个词以非单词字符结尾,例如 ".","-" 或者 ")"。要改变 Vim 认为是单词组成部分
的字符,请参见 'iskeyword' 选项。如果你在此帮助文件里直接试验,先复位
'iskeyword',此例才能工作:
:set iskeyword&
还可以用空白字符分隔的 "字串" (大写的 WORD) 移动。这不是我们通常意义的 "单
词"。这就是为什么使用大写形式的 WORD 的原因。按字串移动的命令也全都是大写的,
如下图所示:
ge b w e
<- <- ---> --->
This is-a line, with special/separated/words (and some more).
<----- <----- --------------------> ----->
gE B W E
ge b w e
组合运用这些大写和小写的命令,你可以在段落内快速前后移动。
单字符查找命令是最有用的移动命令之一。"fx" 命令向前查找本行中的字符 x。提示:
"f" 代表 "Find" (寻找)。
例如,假定你在下行行首,而想移动到单词 "human" 的 h 那里。执行命令 "fh" 即
可:
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> 可以中止大部分命令,而不仅仅
是查找。
如果你是一个 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" 也能完成这个功能,但稍复杂一点。
| first line of a file ^
| text text text text |
| text text text text | gg
7G | text text text text |
| text text text text
| text text text text
V text text text text |
text text text text | G
text text text text |
last line of a file V
另一个定位行的方法是使用带计数前缀的 "%" 命令。例如,"50%" 移动到文件的中间,
而 "90%" 移到差不多结尾的位置。
前面的描述假定你想移动到文件中的某一行,而不在乎它是否可见。那么如何移动到视野
之内的一行呢?下图演示了三个可以使用的命令:
+---------------------------+
H --> | text sample text |
| sample text |
| text sample text |
| sample text |
M --> | text sample text |
| sample text |
| text sample text |
| sample text |
L --> | text sample text |
+---------------------------+
提示: "H" 表示 Home (头),"M" 表示 Middle (中) 而 "L" 表示 Last (尾)。另外一种
记法,"H" 表示 High (高),"M" 表示 Middle (中) 而 "L" 表示 Low (低)。
CTRL-U 命令向下滚动半屏。想象一下通过一个视窗看着你的文本,然后把这个视窗向上
移动该窗口的一半高度。这样,窗口移动到当前文字的上面,而文字则移到窗口的下面。
不用担心记不住那边是上。很多人都是这样。
CTRL-D 命令把视窗向下移动半屏,所以把文字向上移动半屏。
+----------------+ | some text | | some text | | some text | +---------------+ | some text | | some text | CTRL-U --> | | | | | 123456 | | 123456 | +----------------+ | 7890 | | | +----------------+ | example | CTRL-D --> | 7890 | +---------------+ | | | example | | example | | example | | example | +----------------+
每次滚一行的命令是 CTRL-E (上滚) 和 CTRL-Y (下滚)。可以把 CTRL-E 想象为是多给
你一行 (one line Extra)。
正向滚动一整屏的命令是 CTRL-F (减去两行)。反向的命令是 CTRL-B。CTRL-F 是向前
(forward) 滚动,CTRL-B 是向后 (backward) 滚动,这比较好记。
移动中的一个常见问题是,当你用 "j" 向下移动的时候,你的光标会处于屏幕的底部,
你可能希望,光标所在行处于屏幕的中间。这可以通过 "zz" 命令实现。
+------------------+ +------------------+ | earlier text | | earlier text | | earlier text | | earlier text | | earlier text | | earlier text | | earlier text | zz --> | line with cursor | | earlier text | | later text | | earlier text | | later text | | line with cursor | | later text | +------------------+ +------------------+
"zt" 把光标所在行移动到屏幕的顶部,而 "zb" 则移动到屏幕的底部。Vim 中还有另外
一些用于滚动的命令,可以参见 Q_sc 。要使光标上下总保留有几行处于视窗中用作上
下文,可以使用 'scrolloff' 选项。
Vim 用正则表达式来定义要查找的对象。正则表达式是一种非常强大和紧凑的定义查找模
式的方法。但是非常不幸,这种强大的功能是有代价的,因为使用它需要掌握一些技巧。
本章我们只介绍一些基本的正则表达式。要了解更多的关于查找模式和命令,请参考
第 27 章 usr_27.txt 。你还可以在 pattern 中找到正则表达式的完整描述。
行 首 与 行 尾
^ 字符匹配行首。在美式英文键盘上,它在数字键 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\.",只会匹配第二个位置。