程序员人生 网站导航

学习vi和vim编辑器(4):快速移动位置

栏目:互联网时间:2014-11-07 08:41:14

通常,编辑文本需要做的第1步就是将光标移动到需要编辑的地方,因此编辑文本的速度1定程度上取决于将光标移动到目的地所需要的按键数。这1篇文章,主要介绍如何快速移动光标。

根据屏幕来移动:

在1个有几千行文本的文件中,如果依照行来移动的话,可能效力非常低。此时可以依照屏幕来移动。可以把文件看成1个具有文字的长长的卷轴,而屏幕是1个窗口,通常显示其中的24行文字(我的是显示26行)。

^F:往前(往文本结尾方向)转动1整屏;

^B:往后(往文本开头方向)转动1整屏;

^D:往前转动半屏;

^U:往后转动半屏;

^E:往前转动1行;

^Y:往后转动1行;

其中^F代表crtl键+f键。如果想往前或往下转动屏幕,但又想让光标保持在原来的文本行,可使用z命令:

z+enter:将光标移动到屏幕顶端并转动屏幕;

z.:将光标移动到屏幕中心并转动屏幕;

z-:将光标移动到屏幕底端并转动屏幕;

举个例子:当前光标在屏幕最底层的1行,现在想让光标依然在该行,但让该行移动到屏幕顶端,就能够直接输入z,接着输入enter键,以下图所示:

光标处于屏幕最后1行:


输入z enter 键以后,光标所在行移动到屏幕第1行:


所以你会发现重复相同的z命令并没成心义,由于第1次履行以后已到达目的了,再履行相同的命令没有效果。z命令可以接受数值参数,例如z+enter是将当前行移动到屏幕顶端,但是200z+enter就是将文件的第两百行移动到屏幕顶端。

当某些消息出现在屏幕上而影响工作时,可以通过转动屏幕来消除这些消息,也能够直接输入crtl+L键来重画但不转动屏幕。如图所示:


输入ctrl+L键以后,就能够重画屏幕,提示消息消失:


如果需要在保持当前屏幕视图的情况下,可以通过以下命令在屏幕范围内移动:

H:移动到屏幕顶真个行;

M:移动到屏幕中央的行;

L:移动到屏幕底真个行;

nH:移动到屏幕顶端往下第n行;

nL:移动到屏幕底端往上第n行;

其效果以下图所示,起初光标在当前屏幕视图的第1行:


输入M键以后,光标移动到当前屏幕的中间行,而且屏幕视图没有变化:


根据行移动:

之前已讲过了" j "和" k "这两个以行动单位进行移动的命令,这里补充几个命令:

enter:移动到下1行第1个字符;

+:移动到下1行的第1个字符;

-:移动到上1行的第1个字符;

以上3个命令在移动到目的行后,光标会置于该行的第1个非空字符。在当前行中移动,可使用以下命令:

^:移到当前行的第1个非空格处;

n|:移动到当前行的第n列;

根据文本块来移动:

vi编辑器中可以以文本块(单词,句子,段落或小节)为单位进行移动。之前已讲过了依照单词来移动(w,W,b,B),接下来再介绍几个根据文本块来移动光标的命令:

e:移动到单词的结尾;

E:移动到单词的结尾,算上标点符号;

(:移动到当前句子的开头;

):移动到下1个句子的开头;

{:移动到当前段落的开头;

}:移动到下1段落的结尾;

[[:移动到当前这1节的开头;

]]:移动到下1节的开头;

vi会寻觅" ? . ! "等标点符号作为句子的结束。当这些标点符号后面有最少两个空格或作为1行的最后1个非空格字符时,vi将其作为句子的结束。但是我实际操作的时候发现,其实只要这些标点符号后面跟上1个空格,vi就会将其作为句子的结束,不知道是否是书上又讲错了,还是哪里可以配置?暂时先记下这个问题吧。

段落的定义是指下1个空白行前的文本,或是出现在段落宏之前的文本。而小节的定义则是下1个节宏之前的文本。可以通过:set命令自定义这些被当做段或节分隔符的宏。

根据搜索模式的结果来移动文本:

在大文件中移动时,最快速的方法之1就是根据搜索模式的结果来进行移动。搜索命令是特殊字符" / ",格式为/patten。模式可以是完全的单词,或1连串字符串,如果在搜索模式中加入了空格,这个空格也会被成单词的1部份,固然还可使用更强大的模式匹配语法。vi会从光标当前位置开始搜索,并且会依照需要自动绕回文件开头或文件底部进行搜索,如果搜索到了,光标会定位在该搜索模式第1次出现的地方,否则在屏幕底端显示相应的信息。

/patten:从光标位置开始处往前搜索;

?patten:从光标位置开始处往回搜索;

上1次的搜索模式会留在你的编辑回话中,因此可以重复搜索,而不需要重新输入原来的搜索模式:

n: 往同1个方向上重复搜索;

N: 往相反方向上重复搜索;

/enter:往前重复搜索;

?enter:往后重复搜索;

由于重复搜索时,默许是会自动绕回文件头或文件尾的,因此可以通过设置vi编辑器的wrapscan选项来控制搜索是不是要绕回,当输入了指令:set nowrapscan 时,就能够取消搜索时绕过文件头或文件尾。这时候当我们往前搜索失败时,就会显示以下信息:


而如果往回搜索失败时,也会显示以下图所示的相应信息:


搜索命令可以与修改文本命令相结合1起使用。也就是说对(command)(TextObject)的使用情势,搜索命令可以出现在TextObject中,而command代表的是文本修改命令,如c,d等。例如 d?file就是删除光标所在位置到往回搜索第1次出现file的所有字符。

可以用以下命令在当前行中搜索:

fx:搜索(同时将光标移动到)本行下1个出现x的地方,x代表任何字符;

Fx:搜索(同时将光标移动到)本行前1个出现x的地方;

tx:搜索(同时将光标移动到)本行下1个出现x的地方的前1个字符;

Tx:搜索(同时将光标移动到)本行前1个出现x的地方的后1个字符;

;:重复上1个搜索,方向相同;

,:重复上1个搜索,方向相反;

这些命令加上数值参数,代表搜索x字符第n次出现的地方。这些命令在删除或拖曳时很有用,当需要修改的文本块有多个标点符号而难以统计单词数,此时用字符搜索结合文本修改命令可能非常方便。

根据行号来移动:

行号对http://www.wfuyu.com非常有用,由于编译报错时通常都会告知我们是哪行报错,如果能够直接移动到源文件中的那行,就能够非常便捷。通过:set nu选项来显示文件的行号。

CTRL+G命令会在屏幕底端显示相应的信息,包括当前的行号,文件的总行数,当前位置占全文的百分比。以下图所示:

G命令:数值参数加上G命令代表直接移动到相应的指定行。如果没有指定行号,则G命令直接移动到文件尾部。

输入两个反引号( `` )可以回到原来的位置(上1次使用G命令的位置)。如果你在这中间做了编辑操作,两个反引号将光标移回到上次编辑的位置。如果使用了搜索命令,``可以将光标移回到上1次搜索时的位置。 ''和``作用类似,只不过它将光标移回到上次位置所在行的开头而不是确切的位置。

依照行号来移动光标是在1个大文件中快速移动的方法。

本章vi编辑器命令总结:

^F,^B,^D,^U,^E,^Y,z+enter,z.,z-,^L,H,M,L,enter,+,-,^,n|,e,E,(,),{,},[[,]],/pattern,?pattern,n,N,/,?,fx,Fx,tx,Tx,;, , ,G,``,'',^G。


------分隔线----------------------------
------分隔线----------------------------

最新技术推荐