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就是选择最准确的编辑命令。
www.2cto.com
再例如,某行为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设计者一个汇报吧、一个敬意吧
作者 n216