第五步,学习多次操作命令
vi为了避免反复操作,vi设计了多次操作命令,操作为:操作次数+操作命令。这样大大提高了编辑的效率。
例如1:要删去50行。我们可以连续50次dd,但是,我们更应该利用多次操作命令,输入50dd就ok了!
例如2:要复制当前行以下的50行,我们可以键入:
1、50
2、yy
3、将光标移到第50行
4、p
这个命令非常非常有用,且考验编程者的眼力。比如,我们常常要编写一个while、for等循环语句或一个函数。我们往往会将以前的while、for等循环语句或函数拷贝过来,做些修改。而拷多少条语句这就要看编程者的眼力了。比如,实际要拷35条。而如果编程者认为这段语句是30条,则要重新再拷5条。如果编程者这段语句是40条,则要在拷贝后,删除5条。如果编程者一眼就能看出要拷35条,那就如同中奖一样的高兴。毕竟眼力准确可以减少额外的操作。
例如3,将hello myself 改成hi world
1、将光标移到hello
2、2
3、cw
4、hi world
5、Esc
上面的2表示将修改2个单词。
多次操作是一次操作的重复,不学多次操作,也可以通过一次一次操作完成,但是,超过2次,超过3次以上的操作,选择多次操作,可以大大提高编辑效率。
第六步,vi 命令行
vi不但在可以在编辑对象上进行各种操作,而且可以在vi的命令行上进行操作。这个命令行是通过键入“:”产生的,在文件的屏幕的最后一行。
我们的第一步中的,q命令,就是一个命令行的命令。
上面介绍的q!,x,x!命令都是命令行命令。
下面介绍一个有用行删除的命令。
假定文件内容为:
Hello world
Hello myself
Hello c
当前光标在第一行
1、现要求,将第二行到第三行删除。
方法1:将光标移至第二行,输入dddd。这个上面讲的一种方法。
方法2:
1,:
2,2,3d
这种方法是在命令行输入d命令。表示,从第二行到第三行都要删除。这种方法也叫绝对删除法。
方法3:
1,将光标移到第二行
2,:
3,.,+1d
这种方法也是命令行命令。表示从当前行(.)到当前行后面的一行(+1)进行删除。这种方法叫相对删除法。意思删除的行是相对于当前行的。
方法4:
1,当前光标在第一行
2,:
3,+1,+2d
这种方法上,表示,将第一行的下面一行到第一行下面的第二行之间全部删除。
方法5:
1,:
2,2,$d
这种方法表示将第二行,到文件的最后一行都删掉。$表示文件的最后一行。这个命令也十分有用。
如果我们不知道我们当前行是哪一行,我们可以键入:ctrl-g,这个时候,命令行就会出现提示:The cursor is at line 1 of 3—33%--,就可以看到当前行是第几行,整个文件有多少行了。其中1是当前行,3是所有的行。
Ctrl-g也是很常用的命令。
在vi长期实践中,相对法用于删除20行之内语句比较有效,快捷;绝对法用于删除大批语句有效。
2、替换所有hello 为hi
1,:
2,1,$s/hello/hi/g
我是这样理解这个命令的:从第一行到最后一行,查到(s)hello用hi来全部(g)替换。这样今后就忘不了了。
第七步,读文件,写文件
前面都是基于语句级、单词级的编辑。在我们初学vi的时候,十分有用,在我们编写少量的C语言时候,也很有用,也足够了。但是,当我们编写的C语言程序越来越多的时候,我们看到的别人C语言程序越来越多的时候,我们往往会复制别人的程序和自己的程序,会复制某一段成程,用在自己的程序之中。这个时候,我们就会出现一个以文件级程序“复制、粘贴”的操作。
例如,我们要将a.c中的open_deal这个函数,拷贝到b.c中。
1,vi a.c
2,/open_deal
3,n
4,ctl-g
5,记下当前行,假定243
6,将光标移到open_deal最后一行
7,ctl-g
8,记下当前行,假定343
9,:
10,243,343w open.c
11,q!
12,vi b.c
13,将光标移动open_deal要放的地方那一行。
14,:
15,r open.c
16,:
17,x!
这个例子,有两个重点,一个是243,343w open.c.这个操作说明,将第243行到343行的open_deal函数程序,写到open.c文件之中。
另个重点是,r open.c,这个操作说明,将open.c 读到当前行之下。
通过w和r我们完成了函数的复制和粘贴。
很多情况下,我们会将整个文件r进来,在进行修改的。
此外,很多情况下,我们会起找一下我们过去的程序,去找一下某一个我们想要的函数,和一些语句的用法,但是,我们又不知道在那个文件之中。这个时候,我们可以通过同时打开多个文件的方法,一个一个文件去查看是否有我们想要的东西,一旦发现,我们就会知道这个函数在那个文件之中了。
例如,假定我们的目录下,有a1.c,a2.c,a3.c,b1.c,b2.c,b3.c六个文件,我们记得其中有一个名为open_deal函数,我们想改造这个函数,但是,我们不知道这个函数在什么文件之中。这时候我们可以这样操作。
1,vi *.c
2,/open_deal
3,:n
4,/open_deal
直到找到为止。
这里重点有2个,一是vi *.c,表示编辑所有的.c文件;二是,:n(next)读下一个文件。
找到open_deal之后,你可以通过w命令,将函数写成一个文件,以便以后r用。
学习vi一定要从简单到复杂,从第一步到第七步要慢慢而来,不要着急,一口吃个胖子。第一步到第四步是入门和基础,了解需要半天到一天,操作练习估计要2天到3天,后面几步也要3天左右。有人在旁,估计1周掌握vi应该不成问题。但是要精通vi则是很难给出一个时间的。我可以肯定地说,如果你能掌握这7个步骤,几乎所有的C语言的编写是没有问题的(编辑方面)。
四、 Vi命令小结
将我认为的vi常用的命令小结一下,便于大家查询(其他命令因为很少用,我就不列举在其中了,想学的可以去网上查询。)
1、 进入和退出vi
1)vi 文件名 编辑一个文件。
2)vi *.c 编辑多个文件。
3):q 退出vi(不保存退出,文件没有被编辑过)。
4):q! 退出vi(不保存退出,文件被编辑过)。
5):x 退出vi(保存退出)。
6):x! 退出vi(保存退出,文件被编辑过)。
2、 增加、修改、删除、查询、取消命令
1)i 在当前字符前插入,Esc退出插入状态
2)I 在行首插入,Esc退出插入状态
3)a 在当前字符后插入,Esc退出插入状态
4)A 在行尾插入,Esc退出插入状态
5)o 在当前行下面插入,Esc退出插入状态
6)O 在当前行上面插入,Esc退出插入状态
7)r 修改当前字符
8)cw 修改当前单词,以空格,(),[]等为界,Esc退出插入状态
9)s 修改当前字符并插入,Esc退出插入状态
10)x 删除当前字符。
11)dd 删除当前行
12)/ 查询,后面跟查询内容
13)n 满足查询的下一个内容
14)u 放弃前一次操作
3、复制和粘贴
1)yy 复制当前行
2)p 将复制行粘贴到当前行下
4、光标移动、行数、操作次数
1)光标键 将光标按光标键所指的方向,向上,向下,向左,向右移动。
2):1 将光标移动打文件首行
3)G 将光标移动到文件尾行
4). 表示当前行
5)+n n是数值,表示当前行后nn行
6)ctrl-g 查看当前行的是第几行,当前文件的文件名,文件总行数。
7)n操作符 进行n次操作。例如5yy 就是将yy重复5次。5x就等于xxxxx。
5、替换
1)n1,n2s/字符串1/字符串2/g
将n1行到n2行中字符串1全部替换成字符串2
6、写文件,读文件
1)n1,n2 w 文件名 将n1行到n2行写入文件名的文件之中。
2)r 文件名 将文件名的文件装入到当前行下面。
五、 编辑工具的掌握程度
不少程序员满足于会,不追求于精;编程如此,编辑也是如此。这种程序员真的可以选择转行。程序员是属于更高更快更精的职业,不进则退,否则,枉然程序员这个称号。对于vi也是这样,程序员千万不要满足于我会这个命令,我知道这个命令,因为会和知道仅仅是一个手段,目的是要用,要用好这个命令,让程序编的更快才是最重要的。
对于一个编辑工具掌握程度有没有一个标准?当然有!那就是使用编辑命令的准确性,也就是说,什么时候该用什么命令。把这用于可量化的标准,那就是:在相同的最终的编辑内容,我们所用的击键次数最少为高。这就要求我们尽量减少修改、删除的次数,一次就能把程序编写好(一次几乎不可能,但是次数越少越好,这样可以迫使自己考虑更完美一些。),在需要修改情况下,用准确的命令进行修改,使得击键次数最少。
例如,某行有50个字符,当前光标在字首,现要在字尾加上hello。一种方法是,将光标直至第50个字符,键入i,键入hello,键入Esc。这种方法一共要击50+1+5+1=57个键。第二种方法是,键入A,键入hello,键入Esc,这种方法一共要击1+5+1=7个键。你说哪种方法好?当然是第二种方法好!因为A命令就是为在行尾增加而设计的,你选择A就是选择最准确的编辑命令。
再例如,某行为this is a new world,光标在行首,现要将改成this is a cat。第一种方法,单字删除插入法:将光标移动到new,键入xxx,键入x,键入xxxxx,键入i,键入cat,键入Esc。这种方法一共要击11+3+1+5+1+3+1=25个键。第二种方法,词组删插入法:将光标移动到new,键入2cw,键入cat,键入Esc。这种方法一共要击11+3+3+1=18个键。第三种方法,删除插入法,将光标移动到new,键入D,键入A,键入cat,键入Esc。这种方法一共要击11+1+1+3+1=16个键。当然还有其他方法,这里就不一一例举了。就这三种方法而言,当然是第三种方法最好,它准确了运用了尾删除命令,总的击键数最少。而第二种方法,要远好于第一种方法,它成功运用了词组修改和次数的结合,使得修改相比第一种更加快捷和合理。
以上我们可以看出我们对编辑命令的掌握程度高低是可以通过击键数多少而得出。击键数少,说明运用编辑命令合理,运行编辑命令巧妙,编程时间短,可以节约编程时间用于其他诸如设计,调试等工作。反之,则说明不能正确的使用编辑命令,击键数多,编程时间就长,减少了设计时间和调试时间。
另外,除了正确掌握编辑命令之外,单纯的打字速率是必须要提高的,无论是英文还是汉字都要盲打才行。在我们那个年代,打字不被重视,有的程序员竟然是单手单指打字,被人戏称为“一指禅”。这种基本功在现在看来是绝对不允许的。可以容忍的打字速度是和语速相当那种水平,或再低一些也行。但是,语速不能间断。
很多程序员,如果你站在他的身边看他编程序,那只打字的手,打打停停,不知道他在想什么,是在思考程序的编法?是在考虑程序语法如何?是在考虑如何编辑?很简单很简单的程序到他们那里就会变的很复杂很复杂似的,看得你非急死了不可,这那叫编程序呀,这简直要了别人的命,要了自己的命!
优秀的程序员不但要程序编的好,在一些基本功方面,比如打字、编辑方面也要同样的出色。很难想象一个优秀程序员,用一个手指,不停地思索着,不断地修改着,慢慢吞吞编出来个优秀程序。编辑应该像行云流水一样,没有停顿(停顿不超过2秒),一气呵成,程序就出来了,这才是我们追求的境界。
总之,vi 与C语言有不解之缘,尤其是在unix操作系统平台上,更是密不可分,相依相伴。砍柴需要快刀,而vi就是砍C语言这个柴的快刀。每当你举起快刀利利索索砍下C语言这个硬柴的时候,你心中有说不出的快感。当yy落下,当dd落下,你不得不感叹vi设计者的神奇,他复制了从前,他又删除了当前,一切又回到了原点。
后记:
写到此处,我不禁对自己刮目相看了,这篇文章让我断断续续写了近十天,本来只想写个大概,写几个命令举例举例就完了。那晓得越写越想写,越写越写得细,恨不得将我所有有关vi的东西都写出来。毕竟我写了几十年的程序,用了几十年的vi却从来没有看过一本vi书,所有的命令都是从同事那里学来的。可以说是我是草根vi。有时候,我在vi的时候,一直在想vi设计者当时为啥这样设计这个命令的,这些简单而又复杂,好记又很巧妙的设计,千变万化的vi,甚至能比C语言本身更能让我激动,让我叫好。我一直在想我能否有一天能编出一个程序象vi设计者那样,让我的用户感到激动和叫好呢?没想到我为了写博客能把这些命令系统地写出来。我把一些vi要点、重点、体会告诉给想学vi的新手,希望能给他们一些参考。同时把这也算自己学习和操作vi做个总结吧,也算是我给vi设计者一个汇报吧、一个敬意吧。