移动光标
当移动光标时,新位置的字符就成为当前字符。同样,如果光标移动到一个新行上,那么这一行就成为当前行。每当将光标移动到一个当前不在屏幕上的行时,vi将显示编辑缓冲区的不同部分,从而使新行可见。换句话说,就是如果要从编辑缓冲区的一部分跳到另一部分,只需要简单地移动光标。
按字符移动
将光标移动一个位置,有许多方法可以选择。
最好是使用h、j、k、l命令,作用如下:
h 将光标向左移动一个位置
j 将光标向下移动一个位置
k 将光标向上移动一个位置
l 将光标向右移动一个位置
此外,还有键盘上的光标控制键(箭头键),而且更加容易记忆:
<Left> 将光标向左移动一个位置
<Down> 将光标向下移动一个位置
<Up> 将光标向上移动一个位置
<Right> 将光标向右移动一个位置
还可以使用<Backspace>键向左移动一个位置,或者使用<Space>键向右移动一个位置:
<Backspace> 将光标向左移动一个位置
<Space> 将光标向右移动一个位置
按行移动
另一种上下移动光标的方法是使用-(减号)和+(加号)命令:按-键将把光标移动到上一行的开头,按+键将把光标移动到下一行的开头。另外还有一种方法,按<Return>键也可以移动到下一行的开头:
- 将光标移动到上一行的开头
+ 将光标移动到下一行的开头
<Return> 将光标移动到下一行的开头
在当前行中,0(数字0)命令将光标移动到行的开头;$(美元符号)命令将光标移动到行的末尾。如果当前行是缩进的,则可以使用^(音调符号)将光标移动到本行不是空格或者制表符的第一个字符上去。
0 将光标移动到当前行的开头
$ 将光标移动到当前行的末尾
^ 将光标移动到当前行的第一个非空格/制表符的字符上
按单词移动
使用w、e或b,可以快速准确地将光标移动到期望位置上,节省大量的按键动作。
w 将光标移动到下一个单词的词首
e 将光标移动到下一个单词的词尾
b 将光标移动到下一个单词的词首
所有这3条命令都在每个标点符号处停止,如果数据中不包含大多这样的字符,这几条命令就比较适合。但是如果数据中有大量的标点符号,那么以这种方式移动光标就比较慢。 作为替代,可以使用W、E或B命令。这几条命令的运行方式与前3条命令相同,只是它们仅识别作为单词末尾的空格和新行字符。
W 同w,忽略标点符号
E 同e,忽略标点符号
B 同b,忽略标点符号
按句子移动
对于更大范围的移动,可以使用圆括号命令从一个句子跳到另一个句子:
) 向前移动到下一个句子
( 向后移动到上一个句子
按段落移动
花括号命令可以从一个段落跳到另一个段落:
{ 向前移动到下一个段落
} 向后移动到上一个段落
这些命令应该自己试一试,以确保正确理解它们的作用。在练习每条命令时,要注意到能够以单词、句子或段落为单位跳动是多么的便利。
屏幕内移动
H、M或L命令可以分别跳到屏幕的顶部、中间或者底部(可以联想“high”、“middle”和“low”这三个单词)。
H 将光标移动到屏幕的顶部
M 将光标移动到屏幕的中间
L 将光标移动到屏幕的最后一行
重复次数
为了增强光标移动命令的功能,可以通过在命令前键入一个数字来重复执行光标移动命令,这个数字称为重复次数(repeat count)。注意数字后面不能有空格。
通常对任何vi命令使用重复次数都是允许的,只要这么做有意义。
例如:
为了向前移动10个单词,可以输入:10w
为了向下移动50行,可键入以下任意一条命令:
50j
50<Down>
50+
50<Return>
为了向后移动3个段落,可以对{(左花括号)命令使用一个重复次数:
3{
在编辑缓冲区中移动
无论什么时候,vi都会尽可能地将编辑缓冲区中的内容铺满屏幕。当希望查看另一部分文本时,需要将光标移动到编辑缓冲区中的对应位置上。完成这种移动的命令有好几种。
^F 向下(前)移动一屏
^B 向上(后)移动一屏
^D 向下移动半屏
^U 向下移动半屏
通常,如果在光标移动命令之前键入一个数字,那么这个数字就是重复次数。
例如,
6^F 向下移动6屏
10^B 向上移动10屏
因为可以使用^F和^B命令以这种方式跳转一段很长的时间,所以没有必要再对^D和^U命令使用重复次数。因此,当在^D或^U命令前面输入数字时,该数字拥有完全不同的含义:设置这两条命令应该跳转到行数。例如,考虑下述命令:
10^D
10^U
这两条命令都告诉vi跳转10行,并且所有随后的^D和^U命令也都跳转10行(直到重设重复次数复位)。
跳转到前一位置
有很多时候,当把光标移动了很长一段距离之后,发现又希望将其移回去。有时候,这种移动是有意义。例如,跳转到编辑缓冲区的末尾,添加一行,然后又希望回到原来那一行。
在这种情况下,可以使用``命令返回到前一位置(也就是说,连续键入两个反引号)。
该命令的一个变体就是使用''(两个单引号)取代两个反引号。这将跳转到行的开头,而不是行的中间。
该命令还有一个更强大的版本。允许用不可见的名称标识任意行。然而,每当需要时就可以使用这个名称跳转到这一行。为了以这种方式标识一行,可以键入m,后面跟一个字母。
例如,为了用名称“a”标记当前行,可以键入:
ma
则,
`a 跳转到标记行的准确位置
'a 跳转到标记行的开头
当标记行时,可以使用任何字母,原则上,这允许标记26行(从a到z)。实践中,极少需要同时标记多于两行。
搜索模式
另一种在编辑缓冲区中来回移动的方法就是跳转到包含某一特定模式的行上。
按下了 /键,vi就会在命令行上(屏幕的底部)显示一个/字符。然后可以键入希望的模式并按<Return>键。这将告诉vi搜索该模式的下一个匹配。例如:
/就在那里<Return>
如果希望再次搜索同一个模式并再次跳转,可以只键入/本身,然后按<Return>键。
因为没有指定新模式,所以vi假定和上一次的/命令使用相同的模式。
当vi查找模式时,它从光标位置开始向前搜索。如果光标到达编辑缓冲区的末尾,vi就会转过头来从头开始搜索。通过这种方式,vi可以搜索整个编辑缓冲区,不管起始位置位于何处。
为了向后搜索,可以使用?命令,?与/作用相同,只是vi向后搜索。例如:
?就在那里<Return>
一旦使用?指定了一种模式,就可以再次使用?本身向后搜索同一模式。如果vi到达编辑缓冲区的开头,vi将返回到文件的末尾并继续向后搜索。通过这种行为,vi可以向后搜索整个编辑缓冲区。
一旦使用/或?指定了模式,就可以用两种便捷的方式继续以原有模式进行搜索。
n(next,下一个)命令采取和原始命令相同的方向进行搜索。
N(大写字母“N”)命令以相反方向进行搜索。
n和N的准确含义取决于原始的搜索方向。例如,假设输入了向后搜索的命令:
?就在那里
那么按n键将向后搜索(相同方向),按N键将向前搜索(相反方向)。
为了获取更多的灵活性,可以使用正则表达式指定模式,此处不作讨论。
/regex 向前搜索指定的正则表达式
/ 向前重复搜索前一正则表达式
?regex 向后搜索指定的正则表达式
? 向后重复搜索前一正则表达式
n 重复上一条/或?命令,搜索方向相同
N 重复上一条/或?命令,搜索方向相反
使用行号
从内部讲,vi通过给编辑缓冲区中的每一行编一个号来区分各行。如果想查看这些行号,则可以打开number选项。所使用的命令是:
:set number
例如,编辑缓冲区中包含:
输入命令:set number后将会看到:
行号并不是数据的真正组成部分,它们只是为了使用方便而设置的。如果想除去行号,可以按如下方式关闭 number选项:
:set nonumber
如果行号关闭,则可以通过按^G键查看位于文件何处,这将显示文件的名称,以及光标在文件中的位置。
行号有两个主要用途。第一,可以在许多ex命令中使用行号;第二,可以使用G(goto,跳到)命令跳转到指定行。只需要简单地键入行号,后面跟上G即可。注意不要键入空格,也不需要按<Return>键。
nG 跳转到第n行
gg 跳转到第1行,相当于1G
G 跳转到最后一行
:1<Return> 跳转到第一行
:n<Return> 跳转到第n行
:$ <Return> 跳转到文件的最后一行
G、1G、gg命令特别有用。