当前位置:Linux教程 - Linux文化 - Vi的编辑操作及命令

Vi的编辑操作及命令


——TurboLinux网络教室(第十九周)

Vi中的行号

Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时,自己去数是非常不 方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左边,而相应行的 内容则显示在行号之后。

使用的命令为:在末行方式下输入命令:

:set number

需要说明的是,这里加的行号只是显示给用户看的,它们并不是文件内容的一部分。

在一个较大的文件中,用户可能需要了解光标当前行是哪一行,在文件中处于什么位 置,可在命令模式下用组合键<Ctrl+g>,此时Vi会在显示窗口的最后一行显示出相应信 息。该命令可以在任何时候使用。

[例7]

#include <stdio.h>

main ( )

{ int k ;

for ( k=0 ; k<3 ; k++) add( );

}

add( )

{ static int x=0;

x++ ;

printf(“x = %d\\n”, x);

}

~

~

~

~

~

“ example.c” [Modified] lines 4 of 10 --40%-- col 11

在末行方式下,我们可以输入命令nu(单词number的缩写)来获得光标当前行的行号与 该行内容。

光标移动操作

全屏幕文本编辑器中,光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使 用移动光标的这些命令,才能迅速准确地到达所期望的位置处进行编辑。

Vi中的光标移动既可以在命令模式下,也可以在文本输入模式下,但操作的方法不尽相 同。

在文本输入模式下,可直接使用键盘上的四个方向键移动光标。

在命令模式下,有很多移动光标的方法。不但可以使用四个方向键来移动光标,还可以 用h、j、k、l这四个键代替四个方向键来移动光标,这样可以避免由于不同机器上的不 同键盘定义所带来的矛盾,而且使用熟练后可以手不离开字母键盘位置就能完成所有操 作,从而提高工作效率。另外还可以用<Spacebar>、<Backspace>、<Ctrl+n>和 <ctrl+p>四个键或组合键移动光标。且以上这三种键在实现功能上是等价的。除此之 外,还有一些移动光标的命令。下面对它们的工作方式介绍如下:

<Spacebar>、(R) (均称为右向键)

右向键的作用是将光标向右移动一个位置。若在向右键前先输入一个数字n,那么光标 就向右移动n个位置。例如5l表示光标向右移动5个位置。需要注意的是,光标移动不能 超过当前行的末尾。若给定的n超过光标当前位置至行尾的字符个数,如果用右向键, 光标只能移到行尾;如果用<Spacebar>,光标移到下面一行或几行的适当位置。

h、<Backspace>、? (向左键)

执行一次向左键,光标向左移动一个位置。同向右键一样,也可以在向左键的前面输入 一个数字n,那么光标就向左移动n个位置。需要注意的是,如果用左向键,光标左移不 能超出该行的开头;如果用<Backspace>,光标移到上面一行或几行的适当位置。

j、<Ctrl+n>、? (向下键)

执行一次向下键光标向下移动一个位置(即一行),但光标所在的列不变。当这些命令 前面加上数字n,则光标下移n行。

Vi除了可以用向下键将光标下移外,还可以用<Enter>键和“+”键将光标下移一行或n 行(不包括本行在内),但此时光标下移之后将位于该行的第一个字符处。例如:

3j 光标下移3行,且光标所在列的位置不变。

3+或3<Enter> 光标下移3行,且光标位于该行的行首。

k、<Ctrl+p>、? (向上键)

执行一次向上键光标向上移动一个位置(即一行),但光标所在的列不变。同样在这些 命令前面加上数字n,则光标上移n行。

若希望光标上移之后,光标位于该行的行首,则可以使用命令“- ”。

L (移至行首)

L 命令是将光标移到当前行的开头,即将光标移至当前行的第一个非空白处(非制表符 或非空格符)。

$(移至行尾)

该命令将光标移到当前行的行尾,停在最后一个字符上。若在$命令之前加上一个数字 n,则光标下移n-1行并到达行尾。

[行号] G(移至指定行)

该命令将光标移至指定行号所指定的行的行首。这种移动称为绝对定位移动。

[例8]

#include <stdio.h>

main ( )

{ int k ;

for ( k=0 ; k<3 ; k++) add( );

}

add( )

{ static int x=0;

x++ ;

printf(“x = %d\\n”, x);

}

~

~

~

~

~

“ example.c” 12 lines, 125 characters

键入命令:6G后,屏幕显示如下:

#include <stdio.h>

main ( )

{ int k ;

for ( k=0 ; k<3 ; k++) add( );

}

add( )

{ static int x=0;

x++ ;

printf(“x = %d\\n”, x);

}

~

~

~

~

~

“ example.c” 12 lines, 125 characters

光标移到了第6行的行首。

若省略行号,则光标移至该文件的最后一行的行首,即无论该文件有多少屏,都跳至最 后一行。

第二十七课 vi命令   2000年/6月/26日

在屏幕上移动

Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是 H、M和L命令。

1.H命令

该命令将光标移至屏幕首行的行首(即左上角),也就是当前屏幕的第一行,而 不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之 前加上数字n,则将光标移至第n行的行首。

[例9] 屏幕显示如下内容:

#include <stdio.h>

main ( )

{ int k ;

for ( k=0 ; k<3 ; k++) add( ); }

add( )

{ static int x=0;

x++ ;

printf(“x=%d\\n”, x);

}

~

~

~

~

~

“ example.c” [ New File]

在命令模式下输入4H命令后,光标移到以for开头的这一行的字母f上。

值得一提的是,使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部 内容。

2.M命令

该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移 动到整个屏幕的中间行;如果并未充满,则移动到文本的那些行的中间行。利用 此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。 例如,在上面屏幕显示的情况下(不论光标在屏幕的何处),在命令模式下,输 入命令M之后,光标都将移到add这一行的字母a上。

同样值得一提的是,使用命令dM将会删除从光标当前所在行至屏幕显示文件的中 间行的全部内容。

3.L命令

当文件显示内容超过一屏时,该命令将光标移至屏幕上的最底行的行首;当文件显示内 容不足一屏时,该命令将光标移至文件的最后一行的行首。可见,利用此命令可以快速 准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n,则将光标移 至从屏幕底部算起第n行的行首。例如,在上面屏幕显示的情况下(不论光标在屏幕的 何处),在命令模式下,输入命令3L之后,光标都将移到x++这一行的字母x上。

同样值得一提的是,使用命令dL将会删除从光标当前行至屏幕底行的全部内容。

按字移动光标

首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字,它可以 是两个空格之间的任何内容。

[例10] 在文件example.c 中的第4行:

{int k;

它只有2个字,一个是{int ,另一个是k;

Vi中另一种字是狭义上的字,在此种意义之下,英文单词、标点符号和非字母字符(如 !、@、#、$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、\\、<、>、/等)均被当 成是一个字。因此,上面那一行中就包括{、int、k、;这4个字。

Vi中使用大写命令一般就是指将字作为广义来对待,使用小写命令就是作为狭义对待。

搞清楚Vi中字的含义后,我们就可以介绍按字移动光标的命令了。

Vi 一共提供了三组关于按字移动光标的命令,分别是:

1.w和W命令

将光标右移至下一个字的字首;

[例11] 屏幕上显示如下:

printf(“Hello Mr.Huang!\\n”);

现在使用w命令,把光标移到下一个字(狭义)的字首“(”上:

printf(“Hello Mr.Huang!\\n”);

下面使用W命令,将把光标移到下一个字(广义)的字首“M”上:

printf(“Hello Mr.Huang!\\n”);

2.e和E命令

如果光标起始位置处于字内(即非字尾处),则该命令将把光标移到本字字尾; 如果光标起始位置处于字尾,则该命令将把光标移动到下一个字的字尾。

3.b和B

如果光标处于所在字内(即非字首),则该命令将把光标移至本字字首;如果光标处于 所在字字首,则该命令将把光标移到上一个字的字首。

[例12] 屏幕显示如下:

printf(“Hello Mr.Huang!\\n”);

现在使用b命令,由于光标处于该字中间,所以光标移动到本字字首“H”处:

printf(“Hello Mr.Huang!\\n”);

如果使用B命令,则如下所示:

printf(“Hello Mr.Huang!\\n”);

按句移动光标

在Vi中,一个句子被定义为是以逗号(,)、句号(.)、问号(?)和感叹号(!)结 尾,且其后面跟着至少两个以上(含两个)空格或一个换行符的字符序列。

Vi提供了关于按句移动光标的两个命令,分别为:

1. ( 命令

将光标移至上一个句子的开头。

2. ) 命令

该命令将光标移至下一个句子的开头。

按段移动光标

在Vi中,一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光 标的两个命令,分别为:

1. { 命令

该命令将光标向前移至上一个段的开头;

2. } 命令

该命令将光标向后移至下一个段的开头。

屏幕滚动

屏幕命令是以屏幕为单位移动光标的,常用于文件的滚屏和分页。需要注意的是,屏幕 命令不是光标移动命令,不能作为文本限定符用于删除命令中。

在命令模式下和文本输入模式下均可以使用屏幕滚动命令。

1. 滚屏命令

关于滚屏命令有两个:

・ < Ctrl+u > 将屏幕向前(文件头方向)翻滚半屏;

・ < Ctrl+d > 将屏幕向后(文件尾方向)翻滚半屏。

可以在这两个命令之前加上一个数字n,则屏幕向前或向后翻滚n行。并且这个值被系统 记住,以后再用< Ctrl+u >和< Ctrl+d >命令滚屏时,还滚相应的行数。

2. 分页命令

关于分页命令也有两个:

・ < Ctrl+f > 将屏幕向文件尾方向翻滚一整屏(即一页);

・ < Ctrl+b > 将屏幕向文件首方向翻滚一整屏(即一页)。

同样也可以在这两个命令之前加上一个数字n,则屏幕向前或向后移动n页。

3. 状态命令< Ctrl+G >

命令显示在vi状态行上的vi状态信息,包括正在编辑的文件名、是否修改过、当前行 号、文件的行数以及光标之前的行占整个文件的百分比。

4. 屏幕调零命令

Vi 提供了三个有关屏幕调零的命令。它们的格式分别为:

・ [行号] z [行数] <回车>

・ [行号] z [行数] .

・ [行号] z [行数] _

若省略了行号和行数,这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行 和最末行重新显示;若给出行号,那么该行号所对应的行就作为当前行显示在屏幕的首 行、中间行和最末行;若给出行数,则它规定了在屏幕上显示的行数。

[例13]

8z16<回车> :将文件中的第8行作为屏幕显示的首行,并 一共显示16行。

15z . :将文件中的第15行作为屏幕显示的中间行,显示行 数为整屏。

15z 5_ :将文件中的第15行作为屏幕显示的最末行,显示 行数为5行。

文本插入操作

在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行,如果用户要将输入的 字符当作是文本内容时,则首先应将Vi的工作模式从命令模式切换到文本输入模式。切 换的方式是使用下面的命令。

插入(Insert)命令

Vi提供了两个插入命令:i和 I。

 

1.i命令

插入文本从光标所在位置前开始,并且插入过程中可以使用<Backspace>键删除错 误的输入。此时Vi处于插入状态,屏幕最下行显示“--INSERT--”(插入)字 样。

[例14] 有一正在编辑的文件,如下所示:

Welcome to vi world!Come on!

~

~

光标位于第一个“!”上,需在其前面插入:

This is an example!

使用i命令,并输入相应文本后,屏幕显示如下:

Welcome to vi world This is an example!!Come on!

~

~

由此例可以看到,光标本来是在第一个“!”处,但是由于是从光标所在位置前开 始插入,所以这个“!”就被挤到了新插入的文本之后。

2.I命令

该命令是将光标移到当前行的行首,然后在其前插入文本。