﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客网-骗子的测试点滴-随笔分类-骗子的linux学习</title><link>http://www.cnitblog.com/charester/category/4218.html</link><description>我说我是搞测试的。可是我还要系统维护。

我说我是搞系统维护的。我又要搞网络维护，

我说我是搞网络维护的，我又要。。。

所以说我是个打杂的。

</description><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2007 07:20:20 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2007 07:20:20 GMT</pubDate><ttl>60</ttl><item><title>也谈LINUX的学习方向及学习方法. （ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 13:15:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20948.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20948.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20948.html</trackback:ping><description><![CDATA[
		<p>首先,我想说的是,我自己接触LINUX是今年7月份,以前我接触的是一些UNIX系统,如SCO OPENSVER、HP UX、IBM AIX等。本人干的一直都是系统管理方面的工作，学习LINUX一半是由于自己的兴趣，一半是工作的需要（为以后打基础）。对LINUX而言，我还处在熟悉阶段。<br />其次，我要说的是，如果你整天就是美化界面、玩安装、汉化等，你并不能说你是一个LINUX的高手，甚至连一个LINUX的熟悉人士都谈不上。君不见老外有几个懂汉化的？但是你能说你的LINUX水平比他们高吗？<br />学习方向：<br />一、内核源码学习。我现在没时间也没精力来干着件事，大学时曾经读过UNIX的一些源码，我觉得即使你不分析它，读一遍对每个人都是有好处的。<br />二、系统管理、SHELL界面、图形外挂等。就系统管理、用户管理、文件管理等来说，LINUX跟UNIX很相象，很多的命令跟UNIX也差不多。在目前，这是我的学习方向。<br />三、应用开发。就目前而言，在易用性、应用系统多样化方面等，LINUX跟它的竞争对手WINDOWS相比还有一定的差距，我本人的工作性质的关系，基本上不作在LINUX上开发应用的尝试。采用的是拿来就用的原则。<br />四、应用集成。根据自己的工作环境，尝试将一些LINUX的应用集成到工作中，与公司中其它的各种系统、应用形成一个整体，进行统一的管理。这也是我的学习重点。<br />学习方法：<br />一、比较法。我喜欢将一些windows、UNIX中的知识、管理工具、思路跟LINUX作一些比较。发掘它们的相同之处和不同之处。如文件系统，LINUX支持哪些文件系统，而常用的UNIX中又有哪些文件系统，不同的文件系统有什么差异。不同的工作环境中应该怎样选用不同的文件系统？应该怎样在可管理性、安全性、性能等方面进行综合评估它们？如果你一点都说不上的话，我想你应该补补课了。<br />二、举一反三法。对任何的命令，我习惯性的就是先弄清楚它到底有那些参数，能做什么用；跟它相关的命令有哪些，又能做些什么？；这些命令它到底涉及到哪些系统文件？只有这样，才能对这个命令称得上说熟悉，说不定很多你自以为很熟悉的命令能干很多你意想不到的工作哦！<br />三、查询法。我不想对一个自己不知道的问题马上去问别人。很多时候MAN一下，用google查询一下，论坛中搜索一下，答案可能就在你的眼前。我发现很多的弟兄没有养成这种习惯，其实通过你自己查询来的知识，你可能领会得更深，因为你需要好好的从头看一下，看看有什么遗漏的，而不是别人简单的一就是一的告诉你。<br />四、交流法。如果对一个问题进行了思考，查询到了一定的知识，还是解决不了，那么最直接的方法就是上网问别人了，不耻下问嘛！将你的困难、理解、观点告诉别人，请别人来帮助你。<br />好啦，说了一堆费话，也该入正题了。<br />一、问问各位斑竹，咱们论坛的方向是什么，立足LINUX使用普及推广；LINUX系统管理；LINUX与其它系统的集成应用管理；LINUX应用开发；LINUX内核技术研究？？？？？怎样从不同的方向来引导弟兄们进行不同层次的学习？<br />二、也问问各位弟兄们。你们学习LINUX的目的是什么？成为一个使用者；LINUX系统管理者；各种系统综合管理者（集成方案提供者）；应用开发人员；LINUX研究者？？？？？<br />我抛砖引玉，请弟兄们能谈谈自己的一些观点及想法。谢谢！<br /><br /><br /><br /><br />wxz8兄抛砖引玉，我这块碎瓦也来说说。<br />美化界面、玩安装、汉化等是推广Linux的基础，我们都希望有更多的朋友加入Linux。一个论坛光推广Linux也不行的，也要在技术上有所成长。所以我想除了推广，咱们还要发展兄弟提到的LINUX系统管理；LINUX与其它系统的集成应用管理；LINUX应用开发；LINUX内核技术研究等等方面，这就是各个专题版块的所要做的。把新手带进了Linux大门，有了一定的基础，就要看各人自己喜好选择感兴趣的方面研究，这时候相应的版块就给这些朋友们提供了一个好地方。LinuxSir应该是个Linux技术的综合论坛。从入门到高手都会找到适合自己的版块，我是这么期望的。<br />关于大家学习Linux的目的，以前也讨论过，什么都有，很多人都是兴趣，就跟一个爱好一样。并不是都想着将来靠Linux吃饭，这点兄弟你有点现实了，Linux本来就是靠黑客等凭兴趣和自由的信念发展起来的。<br />wxz8兄分析得很好，尤其是学习法，值得大家学习，谢谢。<br /><br /><br />我的观点，入门级和高级应用都要做而且要做好（两手抓两手都要硬 <img class="inlineimg" title="使眼色" alt="" src="http://www.linuxsir.org/bbs/images/smilies/wink.gif" border="0" /> ）<br />虽然现在论坛中大部分的讨论都是很初级的，但想让让更多的人加入linux队伍<br />这些讨论显然还是远远不够的。我们和那些英语国家的人相比，在用linux时又多了语言障碍。汉化过程中会有许多问题，往往一个问题解决了，另一个问题又有了。需要中文输入法。还有就是看“帮助”，人家man一下就解决了很多问题，而我们呢，看不懂，还是得问。（虽然现在有中文的man但还是资料有限，所以一定要把英语学好）。推广linux的基础就是使linux外表更像windows，所以，安装、汉化的讨论是不可避免的，也是很重要的。<br /><br />企业级应用、高级应用也要做好，因为linux在这些方面是强项。而且只有学习这方面知识才能真正提高自己的水平。做好了才能吸引更多的高手到这个论坛。<br /><br />关于资金问题，我觉得可以卖linux的相关东西，国外许多非营利组织也是这么做的（也有许多兄弟没用刻录机没有上宽带，卖光盘也是方便了这些兄弟）<br />还可以找一个信誉比较好的网上广告站点，在页面放些banner 兄弟们会帮着点的。<img class="inlineimg" title="酷" alt="" src="http://www.linuxsir.org/bbs/images/smilies/cool.gif" border="0" /><br /><br /><br /><br />1.读核心源代码是绝对收益大的，而且需要极大的耐心。<br />2.如果能加入一些感兴趣的源码开发项目，收获自然不会少。<br />3.如果能在LINUX下试着开发一个小的项目(哪怕是一个小的工资程序)，则一定能收到意想不到的效果。<br />4.做网管不论做到什么境界，最后还得会编程序，一些东西不是随时有补丁可用的。如想弄懂shellcode，自然还得会看懂代码，不然认识不会深刻。<br />5.要在浓厚兴趣下，努力试着自己解决，自己查找，最后不行再到新闻组或BBS上问。呵呵，自己解决问题后的快感应该象打桥牌后，打了个打大满贯一样爽就可以了。<br /><br />观点可能不好，愿者上勾吧。:-)<br /><br /><br />我很早就想学学关于UNIX/LINUX方面的东西，去年的时候机子上就有了MANDRAKE 8.2了，可是当时一直没怎么用。<br />大概2，3个月前，带着对windows的一些厌倦，重新开始用linux了，开始有很多问题，很多东西都不懂。现在一般的安装、操作都没有什么问题。一是自己学到一些东西，另一方面，现在的发行版安装其实都比较简单了，各种语言一般都支持，只是可能离我们的期望还差那么一点点了。但是要能用总的来说不是太难的事情，但是要用好就是另外一回事。<br />我是做windows下的程序开发的，对windows的整个系统结构，特别是桌面程序还是比较了解，虽然不能进入windows的系统内核，不过写过这么多程序之后，我想对这方面的了解还是比这回用的人更深入一些。明白了他最基本的道理，你就可以驾驭他，让自己随心所欲做一些事情。linux也是一样的，你想驾驭他，那么你必须先了解他的习性，看一些系统较底层一些的东西是很有用处的，毕竟一个操作系统都不是在一定的范围内不断发展，很多基本的东西是不大会有大的改动。就像是unix上的东西大多数在linux上可以用的。了解他们之间的关系对你深入了解这个系统很有帮助的。现在在看两本书，一本是&lt;UNIX操作系统教程&gt;,一本是《unix环境高级编程》，很有启发。<br />我是从一个程序员的角度出发说这些的，如果你想在这个系统上作一些个性话的事情，那么你不了解他怎么性呢。至于“面子”上的事情，过得去就行了！不用太在意。<br /><br /><br />linux太难用了!(一通鼠标点击，进入/etc)<br />学习linux,你忘记windows的思维方式了吗？<br />怎么安装软件阿？那一堆文件是干什么的阿？<br />学习linux,你还在浮躁吗？<br />进入linux,随便按了几下.赶紧重启进入win<br />学习linux,你用心了吗？<br />.......<br />你我共勉之<br /><br />作者:GuCuiwen email:win2linux@163.com<br /><br /><font color="red">版权声明:<br />本文档可以在网络上在非商业范围内自由转载,转载请注明出处<br />如果转载版面包含商业广告,请向作者支付至少每千字100园的稿费<br />以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费</font><br /><br /><br />首先,我想引用一下别人说过的一句话:除非在过去的十年你一直生活在山洞里,否则你一定听说过linux.<br /><br />是的,现在听说过linux,会一点linux基本操作的人多如牛毛,然而真正能用linux做一点事情的确少之又少,这就造成了现在的状况:各大 linux论坛十分热闹,但我国linux人材却还十分紧缺.到底是什么原因造成了这样的状况? 纠其原因,只有两个字:浮燥!<br /><br />如果在论坛里来一次调查投票,看一下在论坛里的人到底有多少人手头有一本以上的正规linux教材.我想这个数字不会超过30%. 如果再问一下,有多少人完整的读过各发行版自带的入门文档,系统定制文档,系统管理文档和系统安全文档,恐怕这个数字不到10%. 如果进一步再调查一下究竟有多少人静下心来学习过操作系统和计算机网络等和linux学习十分密切的专业课程,那么恐怕只有3%的数字都不到了.<br /><br />这让我想到了98年前后IT泡沫时代的中关村.在中关村的大街小巷,到处是一个个意气分发牛哄哄的IT精英.他们戴着默镜,剔着小平头,张口闭口都是网络,安全,信息,黑客,代码,产业.T恤背后写着三个字:别惹我! 然而最后IT泡沫一过,只有那些真正肯安安心心静心学习的人在IT界存活了下来.<br /><br />现在国人学习linux的状况也是这样,学linux的人个个都意气分发,以为学习linux会用linux是多么了不起.学了一点皮毛就认为很牛了.但是那些企业用人单位却很难找到真正适合的linux人材.因此,我想就目前的状况发表一下我的看法.<br /><br />首先,这篇文章是写给那些想成为linux高手,并真正想用linux做些事情的人.如果你只想做一个菜鸟,没事的时候在你双系统启动的电脑上偶尔选一次linux,然后没事进去偷着乐,那就请你自便.另外,我想说明,和真正的牛人比起来,我自己还处于一个比较低的水平.我没有读过内核源代码,不知道linux工作原理等等,但是通过摸索,至少我已经找到了通往高手的道路的方向.因此还是想说两句.<br /><br />1,linux不是玩具<br /><br />如果你想系统的学习linux,你必需清楚的认识到这一点.现在有很多人,号称是linux爱好者,但是他们大部分的事情还是用windows 做,而linux只是作为一个随便玩玩的系统.他们懂得一些linux的基本操作,知道有linux这个玩艺,也因为经常听人家说linux好就咬定了 linux就是好.只要有人说linux比windows差,那么他们就奋起反驳,他们也看不起用windows的人,认为用windows的人水平低. 但是自己用电脑的大部分时间还是用windows并且把重要的文件都放在了windows分区,因为他们骨子里只把linux当做玩具,没有真正领悟 linux的精髓所在.如果你真正想系统的学习linux,想用linux有所作为,那么请忘记windows的思维方式,慢慢感受和习惯linux的操作方式,总有一天你会真正体验到他的奥妙所在,从而从自己内心深处喜欢他,使用他,而不是为了赶时髦或向人炫耀而使用他.<br /><br />2,手头有一本好的入门教材吗<br /><br />"如果你还没有好好的读完过一本linux安装及入门教材就不要到初学者论坛来问题!因为你连问问题的资格都没有! " 这是我的一个比较偏激的观点.<br /><br />如果你现在开始下决心学习linux了,那么第一件你要做的事情是到书店去挑一本好书.而不是到论坛社区去问该用什么版本,该如何学习 linux.一本好的入门教材可以让你快速领悟linux的操作方式,系统的基本使用等等.而且都是前人总结经验写出来的,他可以帮你搭起一个学习 linux的框架,对linux有一个总体的认识.就好比建一撞大楼前先打好地基,搭好混凝土框架.以后就可以慢慢往这个框架里添砖加瓦,最后建起大楼. 而那些想急于学习的,不想看书,只想靠混论坛来学习linux知识的人,就好比建一撞大楼,今天建好第一层,然后第一层就要全部粉刷好,装修好,家具买好住进去,然后第二天再开始建第二层.这样没有整体规划的学习是学不好linux的,最后的结果是浪费自己的时间,也浪费别人的时间. 如果你不信,可以让实事去告诉你,以一年为限,你和你的一个朋友同时从0开始学linux,计算机基础差不多.你去买几本好书自己慢慢看边看边做实验,让你的朋友整天到各大论坛瞎混零散的学些linux知识.也许一开始,你的朋友会比你懂得多,但是一年以后你的水平肯定在你的朋友之上. 在初学阶段,不要随便在论坛上发问,多看书是根本,即使真的非问不可的问题,也要先自己动手察资料解决.实在不行再来问,高手不会鄙视菜鸟,因为每一个高手都是从菜鸟过来的,他们都知道菜鸟的苦衷.但是高手会看不起那些自己不愿动手动脑不会学习解决问题而只想得到现成答案的人.那样的人会被高手在心里暗骂成不配用linux的蠢货.<br /><br />你需要以下几种书:<br />一本好入门教材-&gt;一本linux指令参考手册-&gt;linux系统管理手册-&gt;讲解linux系统原理的书.<br /><br />一开始,你只需要入门教材就可以了.并且严格安教材的讲解去学习,不要一天到晚想着去装显卡驱动啦,装游戏啦,装软件啦,这些都没有必要.你就当你自己的电脑不能上网,只能通过看书学习.慢慢看书,稳抓稳打.慢慢地就融会贯通了.这时候你再到linux初学者论坛去看看,你在那里早已经是高手了.<br /><br />另外,一开始你要选定一本入门教材,但是不能只看一本,因为有些书上讲的,可能是另外的书上没有的.因此,重点选一本教材看完.然后再看两三本入门教材浏览一下.作为对第一本书的知识的扩充和巩固. 在看书过程中,如果你有什么不懂的,不要急于上论坛问,自己认真看几次,实在不懂没有关系,把问题放在那里.不要钻牛角尖不懂不肯放手,这种精神是好的, 但是方法是错误的.你尽管学下去,也许你看完书本以后的内容,就对前面不懂的内容豁然开朗了.这是在学习linux中常有的情况.<br /><br />另外,现在很多入门书籍是针对非技术型用户的.(我把那些对linux本身不感兴趣,只想用他来上网,听音乐和打字的人称为非技术型用户,而把对linux本身感兴趣的人称为技术用户)<br />这些针对非技术型用户的入门书籍几乎通篇都是插图,讲解的内容都是如何在图形界面下操作.这些书籍并不能帮你成为一个高手.反而会让你养成倚赖鼠标和图形界面操作的习惯以后很难改掉.因此不能看这些书,一定要买那些一开始就从系统基本机构基本命令开始讲解的书籍.我看过的第一本linux入门书籍共有十多章,但是他从第十一章开始才大致的讲解了一下图形界面的知识.我很感谢这本书,让我一开始就脱离了windows的思维方式,给我以后的进一步学习带来了很大帮助.<br /><br />完成以上的内容,你就完成了建大楼打地基建混凝土框架的过程了.可以接下来进一步学习了.<br /><br />3,你看完系统自带的文档了吗?<br /><br />当你完成入门的过程后,就可以开始读其他的文档,然后到论坛的精华区看看,向你建起来的大楼框架中添砖头了.当然 ,首先要读的,还是系统自带的文档.<br /><br />绝大多数linux发行版都自带非常详细的文档.比如我一直在用的redhat,他有从系统安装到系统安全,针对不同层次的人的详尽文档.静下心来,把这些文档读完,比看任何论坛的精华区都有用.书籍和文档就好比是你每天都离不开的一日三餐,论坛区的精华文档就好比是点心和水果.你可以不吃点心和水果,但是决不能不吃正餐.<br /><br />当然,不能为看文档而看文档,你一定要边看边安文档中说的做试验验证.这样才印象深刻,否则看过就忘记了等于没有看.<br /><br />另外,如果真心想学习linux就不要吝啬,也不要害怕丢失数据而不敢做实验.我建议你去买一个小的二手硬盘,然后放开手干.不要怕丢失数据而不敢做,如果你没有学会技能,将来做了linux系统管理员或者网络管理员到那时因为不会而丢了数据就是大事情了.<br /><br />4,学习linux不是逛自由市场.<br /><br />经常看到有人问用什么版本的linux好,其实只要你认真学习无论什么版本都挺好的.要知道,开发linux发行版的人都是通读过linux内核代码,对linux原理极其精通的人,而且每一个开发团队都对他的发行版做过测试后放出的.那些国际知名的大品牌更是如此. 因此,讨论什么版本好并无意义,关键是你是不是真心想学.不过,为了避免曲高和寡,最好选用的人多的版本,比如redhat manrake suse 等等. 国内有一两个linux版本做的也不错,但是国内的linux都是面向非技术型用户开发的,因此,如果你想成为高手,建议不要用国内的版本.<br />学习linux不是逛自由市场,选定版本就要静下心来学习.不要今天换版本明天要升级.这样对你没有好处.我见过一些人号称用过十几种甚至几十种linux,向人谈论起来头头是到,好像懂的很多,但是如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了.<br /><br />5,你能看懂英文文档吗?<br /><br />谈论这个问题,我有点低气不足,因为我自己的英语很差.但是,至少我可以无障碍的读完一般的计算机文档.计算机英语很简单,只要熟悉了计算机专业英语,高中毕业的水平就可以轻松的阅读计算机文档了.如果你的英语实在太差了,连最简单的计算机英语文档都看不懂,那么在学习linux的同时,请赶紧学习英语.也许你说,你可以看翻译的文档,当我还是一个菜菜鸟的时候,也是这样认为的.但是,后来才发现,如果你想深入学习linux,看不懂因为文档实在是太难了.写的最好的,最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的.即便是非英语国家的人发布技术文档,也都首先翻译成英语在国际学术杂志和网络上发表.你去看看各大软硬件生产商的官方网站,有哪一个不是用英语作为其主站的? 长期用windows的人会很不习惯这一点,装个软件还要看半天文档,应为windows用起来实在太简单了.但是如果你想学习linux就必需学会看各种文档,而大部分的文档都是用英语写的.我发现很多人甚至连man文档都不会看,有什么命令不会用了就跑到论坛上来问,还装出一副可怜相,乞讨一个命令的用法.有这些时间还不如自己看看man文档,即使你一个一个单词的翻译成中文再自己看都比问别人强,因为别人的回答再怎么详尽都比不上man文档详尽.安装一个新的软件时先看README,再看INSTALL然后看FAQ,最后才动手安装,这样遇到问题就知道为什么.否则,说明文档都不看,结果出了问题再来找答案反而浪费时间! 古人说欲速则不达就是这个道理!<br /><br />6,忘记windows的思维方式<br /><br />思想性的转变比暂时性的技术提高更有用,因为他能帮助你加快学习速度.现在很多人用linux.但是,他们用linux的方式完全是 windows的那一套方式.骨子里都是windows的思想.这样是不能领悟linux的精髓体验不到他的优越性的.我前几天看到一个朋友要把刚装了不到2天的mandrake 10 删除掉,我问他为什么,他说太慢了,受不了,还是用windows快.然后我留意了一下他用linux的方式,他的所有操作都带着windows的影子. 他连最基本的删除,移动文件这样的操作都要用鼠标,这样当然慢了!最后我只好说,你删除吧,你不适合用linux,linux不是这样用的.各位可以去看看那些linux高级用户,他们是怎样操作的.通常他们都是在X上开一个xterm或者rxvt终端,80%以上的操作都在这个终端下用命令完成,因为 linux的命令行十分强大,速度也十分快,简单的几个命令的组合就能完成非常复杂的操作.举一个例子:linux的常用命令find,去看看man文档,初学者一定会觉得太复杂而不原意用,但是你一旦学会了就对他爱不释手.他的功能实在太强了,在配合exec参数或者通过管道重定向到xargs命令和 grep命令,那么他能完成非常复杂的操作,如果同样的操作你用图形界面的工具来完成,恐怕要多花十几陪的时间.因此linux高手经常会说:如果没有 find和grep我们还怎么活.但是现在大部分的linux初级用户受到windows影响都喜欢用图形界面的工具来完成一些基本的操作,我并不是说图形界面不好.只是由于linux和windows设计思想的不同他们的操作方式也有很大不同.在windows下用图形界面操作会比敲命令快,但是 linux是一个命令行组成的操作系统,他的精髓在命令行! 无论图形界面发展到什么水平这个原理是不会变的!<br /><br />7,入门以后多学命令<br /><br />当你看完了一两本入门书籍后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令,初学阶段只要学会书上提到过的命令就可以了.单靠学习各种命令而成为高手是不可能的,但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的.<br /><br />在linux中学习命令的最好办法是学习bash脚本编程.bash脚本比起其他语言来学习简单,但是功能却十分强大.通过学习bash编程,能让你掌握大量的linux命令.另外,买一本命令参考手册是必要的,遇到不知道怎么用的命令可以随时查询,这要比察man文档快.特别适合英语不好,看不懂man文档的人.<br /><br />在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有.比如ls,rm,rmdir,cp,cd,mv,cat等等.这样的基本命令大约有200个,这些命令是一定要掌握的,我买了一本&lt; redhat 7 指令参考手册&gt;这本书非常好,他根据命令的常用指数分类,标明3颗星的为最常用命令,一定要掌握,两颗星的其次,1颗星的只要知道一下就可以了虽然现在都已经FC3了,但是经典的UNIX基本命令几十年来都没有变过!另外有些命令是linux特有的或者是某一个应用程序的可执行文件比如xmms播放器.这些只要知道就可以了,不知道也无所谓.有些命令比较少用,因此通常都记不住他的用法,对于这些命令至少要知道有这个命令,脑子里有印象,需要用的时候察一下手册就可以了,但是决不能不知道这个命令的存在!<br /><br />8,学会管理系统<br /><br />等到有了基本知识,也掌握了一定量的命令用法后,就可以进一步学习管理系统.这些内容入门书上会有,但是不会很深入.要深入的学习系统管理,就要去买一本类似&lt;linux系统管理大全&gt;之类的书.认真的看书并做实验,可以让你很快的进步.学习配置各种网络服务器,用linux搭建网络,这些都是学习linux系统管理和网络管理的好方法. 到了这个阶段就可以经常上网察察资料,看发布软件的官方网站文档和FAQ,看看论坛精华区文章.但是不能本末倒置,多看书还是根本.书籍和官方文档可以让你系统的学习,但是论坛可以让你学到一些小知识,小技巧.我本人也经常到论坛上来看看,因为即便是一个新手,也可能会发现一些你所不知道的小技巧,看论坛可以学到这些小技巧.但是我看文档和看论坛的时间比不会小于4:1 . 可以把平时积累的问题一次在论坛上发问. 但是初学的时候不要频繁上论坛,因为你要问的问题都在书上写着,耐心一点,你很快就能看到了.<br /><br />9,了结系统结构<br /><br />等你有了一定的系统管理知识,知道了/etc下那些配置文件有什么用,知道了一般的网络服务器如何配置后,就可以去了解系统结构了. 了解系统结构不是要你去看什么文件夹放什么内容,而是要学习一些原理性的东西.比如系统是如何引导的,引导后启动了那些东西.系统中哪些是最基本的库文件,有什么用等等.学习系统结构的最好方法是自己做一个linux系统,再也没有什么能比自己做一个linux系统更能学习系统结构的了.LFS (linux from strach)可以教你从源代码自己编译一个系统.通过自己编译一个系统,你就可以了结linux系统结构,知道哪些文件是干什么用的,以及他们如何协调工作.当然,在你达到LFS水平之前还有很多事情要做,比如学会如何编译安装源代码发布的软件和编译新的内核等等.到了LFS水平,那么在大多数 linux论坛上你就可以被人称作"高手"了!到了这个地步,就相当于一撞大楼已经基本建好,但是还需要粉刷和装修,真正的细活还在后面!<br /><br />永远记住天外有天,人外有人的道理.即便有了LFS水平,在那些搞linux系统开发,通读过linux内核代码的人看来你还是一个菜鸟.因此, 请时刻保持虚心的态度.即便是在 论坛上只有一颗星级别的人,也有可能是一个潜在的,真正的高手! 大多数真正的高手平时都在搞研发工作,哪里有时间上论坛啊! 倒是有很多大学还没毕业的学生,整天混在论坛上.<br /><br />10,学习专业课程<br /><br />如果你不是计算机专业的,而想把linux学好,就一定要学习专业课程.学习微机原理,操作系统,计算机网络等等专业课程是必需的.为什么同时开始学习linux,有些人学的非常快,不到半年就成了高手,有些人玩来玩去还玩不出名堂,玩了一两年还是菜鸟? 因为那些学得快的人有基础,他们都学过专业课程.同样一篇文档,没有基础的人可能看了三遍还不明白,基础扎实的眼睛扫两下就懂了! 这就是专业和非专业的差别! 因此,要想达到更高的境界就一定要学习基础的专业课程.<br /><br />11,保持虚心学习的态度<br /><br />我想再重复一遍天外有天,人外有人的道理!<br />保持虚心的学习态度不仅能让你学到更多知识,而且会让你受人尊重.<br /><br />在linux的世界里,如果你想靠混论坛,发水贴,换几颗星星增加一下级别,然后再面对菜鸟说几句牛哄哄的话来赢得别人的尊重是不可能的.即便是一个刚入门的菜鸟,也能分辨你回答问题的质量,从而知道你到底有多少水平. 另外,当你成了"高手"的时候,你也能从"菜鸟"那里学到很多知识.因为有很多问题是你从来没有想过的,认为自己肯定会的,但是实际遇到的时候会有困难. 而"菜鸟"们往往更善于发现这类问题.这就是中国人常说的"教学相长"!<br /><br />在linux的世界里,越是水平高的人越谦虚,因为他们知道自己还有很多不知道的,而那些半瓶水就想晃荡的人反而自以为是,因为他们还不知道自己还有很多不知道的! 去看看,<a href="http://www.linuxforum.net/" target="_blank"><font color="#000000">www.linuxforum.net</font></a> 嵌入式开发和UNIX版块的牛人,他们很多都是有过好几年linux方面的工作经验,精通linux和unix的好手,但是每个人都保持着非常谦逊的态度,这些人是值得尊敬的<br /><br /><br /><br /><!-- vB 中文修改开始: 显示声望 --><!-- vB 中文修改结束 --></p>
<img src ="http://www.cnitblog.com/charester/aggbug/20948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 21:15 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（三）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20946.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20946.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20946.html</trackback:ping><description><![CDATA[动态库*.so在linux下用c和c++编程时经常会碰到，最近在网站找了几篇文章介绍动态库的编译和链接，总算搞懂了这个之前一直不太了解得东东，这里做个笔记，也为其它正为动态库链接库而苦恼的兄弟们提供一点帮助。<br />1、动态库的编译<br /><br />下面通过一个例子来介绍如何生成一个动态库。这里有一个头文件：so_test.h，三个.c文件：test_a.c、test_b.c、test_c.c，我们将这几个文件编译成一个动态库：libtest.so。<br /><br />so_test.h：<br /><br /><br /><br />#include <br /><br />#include <br /><br /><br /><br />void test_a();<br /><br />void test_b();<br /><br />void test_c();<br /><br /><br /><br />test_a.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_a()<br /><br />{<br /><br />printf("this is in test_a...\n");<br /><br />}<br /><br /><br /><br />test_b.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_b()<br /><br />{<br /><br />printf("this is in test_b...\n");<br /><br />}<br /><br /><br /><br />test_a.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />void test_c()<br /><br />{<br /><br />printf("this is in test_c...\n");<br /><br />}<br /><br /><br /><br />将这几个文件编译成一个动态库：libtest.so<br /><br /><br /><br />$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so<br /><br /><br />2、动态库的链接<br /><br />在1、中，我们已经成功生成了一个自己的动态链接库libtest.so，下面我们通过一个程序来调用这个库里的函数。程序的源文件为：test.c。<br /><br />test.c：<br /><br /><br /><br />#include "so_test.h"<br /><br /><br /><br />int main()<br /><br />{<br /><br />test_a();<br /><br />test_b();<br /><br />test_c();<br /><br /><br /><br />return 0;<br /><br />}<br /><br /><br /><br />l 将test.c与动态库libtest.so链接生成执行文件test：<br /><br /><br /><br />$ gcc test.c -L. -ltest -o test<br /><br /><br /><br />l 测试是否动态连接，如果列出libtest.so，那么应该是连接正常了<br /><br /><br /><br />$ ldd test<br /><br /><br /><br />l 执行test，可以看到它是如何调用动态库中的函数的。<br />3、编译参数解析<br />最主要的是GCC命令行的一个选项:<br />-shared 该选项指定生成动态连接库（让连接器生成T类型的导出符号表，有时候也生成弱连接W类型的导出符号），不用该标志外部程序无法连接。相当于一个可执行文件<br /><br />l -fPIC：表示编译为位置独立的代码，不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要，而不能达到真正代码段共享的目的。<br /><br />l -L.：表示要连接的库在当前目录中<br /><br />l -ltest：编译器查找动态连接库时有隐含的命名规则，即在给出的名字前面加上lib，后面加上.so来确定库的名称<br /><br />l LD_LIBRARY_PATH：这个环境变量指示动态连接器可以装载动态库的路径。<br /><br />l 当然如果有root权限的话，可以修改/etc/ld.so.conf文件，然后调用 /sbin/ldconfig来达到同样的目的，不过如果没有root权限，那么只能采用输出LD_LIBRARY_PATH的方法了。<br />4、注意<br /><br />调用动态库的时候有几个问题会经常碰到，有时，明明已经将库的头文件所在目录 通过 “-I” include进来了，库所在文件通过 “-L”参数引导，并指定了“-l”的库名，但通过ldd命令察看时，就是死活找不到你指定链接的so文件，这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。<img src ="http://www.cnitblog.com/charester/aggbug/20946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 21:06 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（四）（ZT） </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 13:06:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20947.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20947.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20947.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20947.html</trackback:ping><description><![CDATA[Linux编程入门-gcc、make和gdb简介<br /><br />欢迎来到Linux的编程世界！<br />　　如果你已是Windows下优秀的程序员，那么到了这里，你将会发现一个崭新的天地，虽然在Linux下编程比起在Windows下编程有种种的不便，但她的许多迷人之处一定会让你流连忘返-----只要你是一个真正"热爱"编程的程序员；如果你以前很少编程，只是刚刚迈进了这个大门，那么，你更是走对了地方，在这里，你会得到比MSDN更多的指引和帮助，你会迅速的成长为真正的程序员----如果你想成为的话。当然，这里最吸引人的，还应该是自由软件的精神。或许，在以后，你会把这里作为自己的家园。<br />　　要成为Linux下优秀的程序员，首先你要接触的便是gcc、make和gdb。如果你对微软的Visual系列开发工具有所了解的话，那么下面的等式会让你对它们有所了解，虽然并不是那么贴切：<br />　　　　gcc + make + gdb = Visual C ++<br />　　gcc(GNU cc)是一个编译器套件，它不仅能编译C、Objective C和C++程序，还能编译Fortran、Pascal等语言编写的程序。但就编译器而言，它是目前编译最快、效率最高的编译器，当然，这是非官方的说法。<br />　　make是一个项目管理工具。如果你早已习惯了敲F9、Ctrl+F9或者点击某个按钮来编译运行程序，那么，这个工具将会使你明白这一切如何发生的。<br />　　gdb（GNU DeBugger）是一个调试器，这对一个程序员是必不可少的。gdb的功能非常强大，但如果把友好的图形化的界面作为衡量的主要标准之一，那么现阶段在Linux下的确缺少好的调试器。xxgdb和kde下的Debugger正在这方面努力着。<br />　　和绝大多数教材、文章一样，我们从"Hello World!"开始。<br />　　我们先用vi或者其他一些图形化的编辑器生成一个hello.c文件： <br /><br />　　#include <br />　　void main(void)<br />　　{<br />　　　printf("Hello World!");<br />　　}<br /><br />　　我们使用gcc进行编译：<br />　　gcc hello.c -o hello<br />　　就在当前目录下生成可执行文件hello，运行这个文件，你自然就会看到Hello World!的字样。这里hello.c是源文件，-o是编译选项，hello是你指定的文件名。要注意的是，不要使用test、help这类"常用"的名字来命名自己的可执行文件，他们往往早已被系统捷足先登了。<br />　　在程序中如果引用了其它的头文件，则需要用 -I路径名 选项告诉编译器在那里才能找到这些头文件。例如，在hello.c文件中有如下的两行：<br />　　#include <br />　　#include <br />　　其中myheadfile1.h在目录/usr/local/include目录下，myheadfile2.h在上一层目录下，则编译命令如下：<br />　　gcc -I/usr/local/include -I.. hello.c -o hello<br />程序中如果使用了不在默认库中的调用，例如，要在hello.c中调用pthread_create( )函数创建多线程，输入如下代码：<br />　　……<br />　　#include <br />　　……<br />　　pthread_create(t,attr,0,0);<br />　　……<br />　　使用上面的命令编译将出错：undefined reference to 'pthread_create'。这是因为没有告诉编译器在哪里能找到包含了名为pthread_create的调用。pthread_create在/usr/lib目录下的库文件libpthread.a(静态库)和libpthread.so（动态库）中。用 -L路径名 指定库的位置，用 -lFILE 指定库名为libFILE的静态或动态库。包含了pthread_create的hello.c的编译命令为：<br />　　gcc -L/usr/lib -lpthread hello.c -o hello<br />　　当程序为一个项目，包含很多文件时，可以先用 -c 选项编译生成目标文件，然后再用-o选项连接目标文件生成可执行文件。例如，项目的源文件为server.c 和 client.c，想生成名为 myapp 的可执行文件，则编译命令为：<br />　　gcc -c server.c<br />　　gcc -c client.c<br />　　gcc server.o client.o -o myapp<br />　　以上编译命令和下面的编译命令是等价的：<br />　　gcc client.c server.c -o myapp<br />　　当项目包含多个文件时，每一次敲入繁琐的编译命令大概会吓跑所有慕名到Linux下来开发的程序员们。这时，就该make来大显身手了。<br />　　make会在当前目录下寻找名为Makefile或makefile的文件，然后依次执行该文件。以前面的myapp为例：<br />　　myapp: server.o client.o<br />　　gcc server.o client.o -o myapp<br />　　server.o: server.c<br />　　gcc -c server.c<br />　　client.o: client.c<br />　　gcc -c client.c<br />　　其中，为键盘Tab键，不能用几个空格代替，即使它们看起来一样。第1、3、5行定义了依赖关系，第2、4、6行定义了相应的编译命令。make扫描1、3、5行，目标不存在则调用相应的命令行编译，若已经存在，则比较文件日期，若冒号后的文件新于冒号前的，同样重新编译。这样，如果用户仅仅修改了client.c一个文件，则用make重新编译时server.o就不会被重新编译，这样大大节省了时间。<br />　　千里之行，始于足下。这虽然只是一个简单的开始，但是，通向一个神秘殿堂的大门已经打开了，如何才能成为一个合格的程序员，一切都要靠努力，努力养成看文档、看How-to、看高手程序的好习惯，努力自己去动手实践，一切都会好起来的<img src ="http://www.cnitblog.com/charester/aggbug/20947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 21:06 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（一）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20944.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20944.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20944.html</trackback:ping><description><![CDATA[学习GCC的时候,在网上搜集的部分入门的资料.希望对您有所帮助!<br /><br />一、GCC简介<br /><br />通常所说的GCC是GUN Compiler Collection的简称，除了编译程序之外，它还含其他相关工具，所以它能把易于人类使用的高级语言编写的源代码构建成计算机能够直接执行的二进制代码。GCC是Linux平台下最常用的编译程序，它是Linux平台编译器的事实标准。同时，在Linux平台下的嵌入式开发领域，GCC也是用得最普遍的一种编译器。GCC之所以被广泛采用，是因为它能支持各种不同的目标体系结构。例如，它既支持基于宿主的开发（简单讲就是要为某平台编译程序，就在该平台上编译），也支持交叉编译（即在A平台上编译的程序是供平台B使用的）。目前，GCC支持的体系结构有四十余种，常见的有X86系列、Arm、PowerPC等。同时，GCC还能运行在不同的操作系统上，如Linux、Solaris、Windows等。<br /><br /><br />除了上面讲的之外，GCC除了支持C语言外，还支持多种其他语言，例如C++、Ada、Java、Objective-C、FORTRAN、Pascal等。<br /><br /><br />本系列文章中，我们不仅介绍GCC的基本功能，还涉及到一些诸如优化之类的高级功能。另外，我们还考察GCC的一些映像操作工具，如size和objcopy等，这将在后续的文章中加以介绍。<br /><br /><br />二、程序的编译过程<br /><br /><br />对于GUN编译器来说，程序的编译要经历预处理、编译、汇编、连接四个阶段，如下图所示：<br /><br /><br /><br /><br /><br />从功能上分，预处理、编译、汇编是三个不同的阶段，但GCC的实际操作上，它可以把这三个步骤合并为一个步骤来执行。下面我们以C语言为例来谈一下不同阶段的输入和输出情况。<br /><br /><br />在预处理阶段，输入的是C语言的源文件，通常为*.c。它们通常带有.h之类头文件的包含文件。这个阶段主要处理源文件中的#ifdef、 #include和#define命令。该阶段会生成一个中间文件*.i，但实际工作中通常不用专门生成这种文件，因为基本上用不到；若非要生成这种文件不可，可以利用下面的示例命令：<br /><br /><br /><br /><br />gcc -E test.c -o test.i<br /><br /><br /><br /><br />在编译阶段，输入的是中间文件*.i，编译后生成汇编语言文件*.s 。这个阶段对应的GCC命令如下所示：<br /><br /><br /><br /><br />GCC -S test.i -o test.s <br /><br /><br /><br /><br />在汇编阶段，将输入的汇编文件*.s转换成机器语言*.o。这个阶段对应的GCC命令如下所示：<br /><br /><br /><br /><br />GCC -c test.s -o test.o <br /><br /><br /><br /><br />最后，在连接阶段将输入的机器代码文件*.s（与其它的机器代码文件和库文件）汇集成一个可执行的二进制代码文件。这一步骤，可以利用下面的示例命令完成：<br /><br /><br /><br /><br />GCC test.o -o test <br /><br /><br /><br /><br />上面介绍了GCC编译过程的四个阶段以及相应的命令。下面我们进一步介绍常用的GCC的模式。<br /><br /><br />三、GCC常用模式<br /><br /><br />这里介绍GCC追常用的两种模式：编译模式和编译连接模式。下面以一个例子来说明各种模式的使用方法。为简单起见，假设我们全部的源代码都在一个文件test.c中，要想把这个源文件直接编译成可执行程序，可以使用以下命令：<br /><br /><br /><br /><br />$ GCC -o test<br /><br /><br /><br /><br />这里test.c是源文件，生成的可执行代码存放在一个名为test 的文件中（该文件是机器代码并且可执行）。-o 是生成可执行文件的输出选项。如果我们只想让源文件生成目标文件（给文件虽然也是机器代码但不可执行），可以使用标记-c ，详细命令如下所示：<br /><br /><br /><br /><br />$ GCC -c test.c<br /><br /><br /><br /><br />默认情况下，生成的目标文件被命名为test.o，但我们也可以为输出文件指定名称，如下所示：<br /><br /><br /><br /><br />$ GCC -c test.c -o <br /><br /><br /><br /><br />上面这条命令将编译后的目标文件命名为mytest.o，而不是默认的test.o。<br /><br /><br />迄今为止，我们谈论的程序仅涉及到一个源文件；现实中，一个程序的源代码通常包含在多个源文件之中，这该怎么办？没关系，即使这样，用GCC处理起来也并不复杂，见下例：<br /><br /><br /><br /><br />$ GCC -o test first.c second.c third.c<br /><br /><br /><br /><br />需要注意的是，要生成可执行程序时，一个程序无论有有一个源文件还是多个源文件，所有被编译和连接的源文件中必须有且仅有一个main函数，因为main函数是该程序的入口点（换句话说，当系统调用该程序时，首先将控制权授予程序的main函数）。但如果仅仅是把源文件编译成目标文件的时候，因为不会进行连接，所以main函数不是必需的。<br /><br /><br />四、常用选项<br /><br /><br />许多情况下，头文件和源文件会单独存放在不同的目录中。例如，假设存放源文件的子目录名为./src，而包含文件则放在层次的其他目录下，如./inc。当我们在./src 目录下进行编译工作时，如何告诉GCC到哪里找头文件呢？方法如下所示：<br /><br /><br /><br /><br />$ gcc test.c �I../inc -o test<br /><br /><br /><br /><br />上面的命令告诉GCC包含文件存放在./inc 目录下，在当前目录的上一级。如果在编译时需要的包含文件存放在多个目录下，可以使用多个-I 来指定各个目录：<br /><br /><br /><br /><br />$ gcc test.c �I../inc �I../../inc2 -o test<br /><br /><br /><br /><br />这里指出了另一个包含子目录inc2，较之前目录它还要在再上两级才能找到。<br /><br /><br />另外，我们还可以在编译命令行中定义符号常量。为此，我们可以简单的在命令行中使用-D选项即可，如下例所示：<br /><br /><br /><br /><br />$ gcc -DTEST_CONFIGURATION test.c -o test<br /><br /><br /><br /><br />上面的命令与在源文件中加入下列命令是等效的：<br /><br /><br /><br /><br />#define TEST_CONFIGURATION<br /><br /><br /><br /><br />在编译命令行中定义符号常量的好处是，不必修改源文件就能改变由符号常量控制的行为。<br /><br /><br />五、警告功能<br /><br /><br />当GCC在编译过程中检查出错误的话，它就会中止编译；但检测到警告时却能继续编译生成可执行程序，因为警告只是针对程序结构的诊断信息，它不能说明程序一定有错误，而是存在风险，或者可能存在错误。虽然GCC提供了非常丰富的警告，但前提是你已经启用了它们，否则它不会报告这些检测到的警告。<br /><br /><br />在众多的警告选项之中，最常用的就是-Wall选项。该选项能发现程序中一系列的常见错误警告，该选项用法举例如下：<br /><br /><br /><br /><br />$ gcc -Wall test.c -o test<br /><br /><br /><br /><br />该选项相当于同时使用了下列所有的选项：<br /><br /><br />◆unused-function：遇到仅声明过但尚未定义的静态函数时发出警告。<br /><br />◆unused-label：遇到声明过但不使用的标号的警告。<br /><br />◆unused-parameter：从未用过的函数参数的警告。<br /><br />◆unused-variable：在本地声明但从未用过的变量的警告。<br /><br />◆unused-value：仅计算但从未用过的值得警告。<br /><br />◆Format：检查对printf和scanf等函数的调用，确认各个参数类型和格式串中的一致。<br /><br />◆implicit-int：警告没有规定类型的声明。<br /><br />◆implicit-function-：在函数在未经声明就使用时给予警告。<br /><br />◆char-subscripts：警告把char类型作为数组下标。这是常见错误，程序员经常忘记在某些机器上char有符号。<br /><br />◆missing-braces：聚合初始化两边缺少大括号。<br /><br />◆Parentheses：在某些情况下如果忽略了括号，编译器就发出警告。<br /><br />◆return-type：如果函数定义了返回类型，而默认类型是int型，编译器就发出警告。同时警告那些不带返回值的 return语句，如果他们所属的函数并非void类型。<br /><br />◆sequence-point：出现可疑的代码元素时，发出报警。<br /><br />◆Switch：如果某条switch语句的参数属于枚举类型，但是没有对应的case语句使用枚举元素，编译器就发出警告（在switch语句中使用default分支能够防止这个警告）。超出枚举范围的case语句同样会导致这个警告。<br /><br />◆strict-aliasing：对变量别名进行最严格的检查。<br /><br />◆unknown-pragmas：使用了不允许的#pragma。<br /><br />◆Uninitialized：在初始化之前就使用自动变量。<br /><br /><br />需要注意的是，各警告选项既然能使之生效，当然也能使之关闭。比如假设我们想要使用-Wall来启用个选项，同时又要关闭unused警告，利益通过下面的命令来达到目的：<br /><br /><br /><br /><br />$ gcc -Wall -Wno-unused test.c -o test<br /><br /><br /><br /><br />下面是使用-Wall选项的时候没有生效的一些警告项：<br /><br /><br />◆cast-align：一旦某个指针类型强制转换时，会导致目标所需的地址对齐边界扩展，编译器就发出警告。例如，某些机器上只能在2或4字节边界上访问整数，如果在这种机型上把char *强制转换成int *类型， 编译器就发出警告。<br /><br />◆sign-compare：将有符号类型和无符号类型数据进行比较时发出警告。<br /><br />◆missing-prototypes ：如果没有预先声明函数原形就定义了全局函数，编译器就发出警告。即使函数定义自身提供了函数原形也会产生这个警告。这样做的目的是检查没有在头文件中声明的全局函数。<br /><br />◆Packed：当结构体带有packed属性但实际并没有出现紧缩式给出警告。<br /><br />◆Padded：如果结构体通过充填进行对齐则给出警告。<br /><br />◆unreachable-code：如果发现从未执行的代码时给出警告。<br /><br />◆Inline：如果某函数不能内嵌（inline），无论是声明为inline或者是指定了-finline-functions 选项，编译器都将发出警告。 <br /><br />◆disabled-optimization：当需要太长时间或过多资源而导致不能完成某项优化时给出警告。<br /><br /><br />上面是使用-Wall选项时没有生效，但又比较常用的一些警告选项。本文中要介绍的最后一个常用警告选项是-Werror。使用该选项后，GCC发现可疑之处时不会简单的发出警告就算完事，而是将警告作为一个错误而中断编译过程。该选项在希望得到高质量代码时非常有用。 <br /><br /><br />六、小结<br /><br /><br />本文介绍了GCC的基本编译过程和编译模式，并详细阐述了GCC的一些常用选项以及警告功能。这些是在利用GCC进行应用编程时最基本也最常用的一些内容，我们会在后续文章中继续介绍GCC的调试和优化技术。<img src ="http://www.cnitblog.com/charester/aggbug/20944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 21:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GCC 入门资料（二）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 13:04:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20945.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20945.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20945.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20945.html</trackback:ping><description><![CDATA[GCC 是 GNU 的 C 和 C++ 编译器。实际上，GCC 能够编译三种语言：C、C++ 和 O <br />bject C（C 语言的一种面向对象扩展）。利用 gcc 命令可同时编译并连接 C 和 C++ <br />源程序。 <br />　　如果你有两个或少数几个 C 源文件，也可以方便地利用 GCC 编译、连接并生成可 <br />执行文件。例如，假设你有两个源文件 main.c 和 factorial.c 两个源文件，现在要编 <br />译生成一个计算阶乘的程序。 <br />代码: <br />----------------------- <br />清单 factorial.c <br />----------------------- <br />int factorial (int n) <br />{ <br />　　if (n &lt;= 1) <br />　　　return 1; <br />　　else <br />　　　return factorial (n - 1) * n; <br />} <br />----------------------- <br />清单 main.c <br />----------------------- <br />#include　&lt;stdio.h&gt; <br />#include　&lt;unistd.h&gt; <br />int factorial (int n); <br />int main (int argc, char **argv) <br />{ <br />　　int n; <br />　　if (argc &lt; 2) <br />　　{ <br />　　　　printf ("Usage: %s n\n", argv [0]); <br />　　　　return -1; <br />　　} <br />　　else <br />　　{ <br />　　　n = atoi (argv[1]); <br />　　　printf ("Factorial of %d is %d.\n", n, factorial (n)); <br />　　 } <br />　　return 0; <br />} <br />----------------------- <br />利用如下的命令可编译生成可执行文件，并执行程序： <br />$ gcc -o factorial main.c factorial.c <br />$ ./factorial 5 <br />Factorial of 5 is 120. <br />　　GCC 可同时用来编译 C 程序和 C++ 程序。一般来说，C 编译器通过源文件的后缀 <br />名来判断是 C 程序还是 C++ 程序。在 Linux 中，C 源文件的后缀名为 .c，而 C++ 源 <br />文件的后缀名为 .C 或 .cpp。但是，gcc 命令只能编译 C++ 源文件，而不能自动和 C <br />++ 程序使用的库连接。因此，通常使用 g++ 命令来完成 C++ 程序的编译和连接，该程 <br />序会自动调用 gcc 实现编译。假设我们有一个如下的 C++ 源文件（hello.C）： <br />#include &lt;iostream&gt; <br />void main (void) <br />{ <br />　　cout &lt;&lt; "Hello, world!" &lt;&lt; endl; <br />} <br />则可以如下调用 g++ 命令编译、连接并生成可执行文件： <br />$ g++ -o hello hello.C <br />$ ./hello <br />Hello, world! <br />**********************gcc/egcs 的主要选项********* <br />gcc 命令的常用选项 <br />选项 解释 <br />-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色， <br />例如 asm 或 typeof 关键词。 <br />-c 只编译并生成目标文件。 <br />-DMACRO 以字符串“1”定义 MACRO 宏。 <br />-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。 <br />-E 只运行 C 预编译器。 <br />-g 生成调试信息。GNU 调试器可利用该信息。 <br />-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。 <br />-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。 <br />-lLIBRARY 连接时搜索指定的函数库LIBRARY。 <br />-m486 针对 486 进行代码优化。 <br />-o FILE 生成指定的输出文件。用在生成可执行文件时。 <br />-O0 不进行优化处理。 <br />-O 或 -O1 优化生成代码。 <br />-O2 进一步优化。 <br />-O3 比 -O2 更进一步优化，包括 inline 函数。 <br />-shared 生成共享目标文件。通常用在建立共享库时。 <br />-static 禁止使用共享连接。 <br />-UMACRO 取消对 MACRO 宏的定义。 <br />-w 不生成任何警告信息。 <br />-Wall 生成所有警告信息。<img src ="http://www.cnitblog.com/charester/aggbug/20945.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 21:04 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20945.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（四）vi的使用总结（图形）（ZT）</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 13:01:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20943.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20943.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20943.html</trackback:ping><description><![CDATA[
		<p>
				<strong>
						<img onmouseover="if(this.alt) this.style.cursor='pointer';" style="CURSOR: pointer" onclick="if(this.alt) window.open('http://cache45.51.com/photo5/f4/1c/linuwa/f200ce85ff603dc59cdd3908822beb09.gif');" alt="��ͼƬ�ѱ���С�������鿴ԭ��СͼƬ��" src="http://cache45.51.com/photo5/f4/1c/linuwa/f200ce85ff603dc59cdd3908822beb09.gif" width="980" onload="if(this.width&gt;screen.width-300) {this.width=screen.width-300;this.alt='��ͼƬ�ѱ���С�������鿴ԭ��СͼƬ��';}" border="0" />
						<br />
						<br />
						<br />
						<br />
						<br />
						<br />
						<br />
						<img style="-MS-INTERPOLATION-MODE: nearest-neighbor" height="1252" src="http://www.linuxsir.org/bbs/attachment.php?attachmentid=30699&amp;d=1132376940" width="1218" />
				</strong>
		</p>
<img src ="http://www.cnitblog.com/charester/aggbug/20943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 21:01 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（三）屏幕文本编辑器Vi</title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 12:49:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20940.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20940.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20940.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20940.html</trackback:ping><description><![CDATA[
		<div id="post_message_27083" style="OVERFLOW-X: hidden">屏幕文本编辑器Vi<br /><br />本章介绍Linux上最常用的文本编辑器Vi。文本编辑器是所有计算机系统中最常使用的一种工具。用户在使用计算机的时候，往往需要建立自己的文件，无论是一般的文本文件、数据文件，还是编写的源程序文件，这些工作都离不开编辑器。<br /><br />Linux系统提供了一个完整的编辑器家族系列，如Ed、Ex、Vi和Emacs等，按功能它们可以分为两大类：行编辑器（Ed、Ex）和全屏幕编辑器（Vi、Emacs）。行编辑器每次只能对一行进行操作，使用起来很不方便。而全屏幕编辑器可以对整个屏幕进行编辑，用户编辑的文件直接显示在屏幕上，修改的结果可以立即看出来，克服了行编辑的那种不直观的操作方式，便于用户学习和使用，具有强大的功能。<br /><br />Vi是Linux系统的第一个全屏幕交互式编辑程序，它从诞生至今一直得到广大用户的青睐，历经数十年仍然是人们主要使用的文本编辑工具，足见其生命力之强，而强大的生命力是其强大的功能带来的。<br /><br />本章中，我们将循序渐进地介绍如何使用Vi来建立、编辑、显示以及处理文件。（注：文中的大写字母为［shift］键+相应的小写字母的组合）<br /><br />　Vi简介<br /><br />Vi是“Visual interface”的简称，它在Linux上的地位就仿佛Edit程序在DOS上一样。它可以执行输出、删除、查找、替换、块操作等众多文本操作，而且用户可以根据自己的需要对其进行定制，这是其他编辑程序所没有的。<br /><br />Vi不是一个排版程序，它不象Word或WPS那样可以对字体、格式、段落等其他属性进行编排，它只是一个文本编辑程序。<br /><br />Vi没有菜单，只有命令，且命令繁多。Vi有三种基本工作模式：命令行模式、文本输入模式和末行模式。<br /><br />命令行模式<br /><br />任何时候，不管用户处于何种模式，只要按一下键，即可使Vi进入命令行模式；我们在shell环境（提示符为$）下输入启动Vi命令，进入编辑器时，也是处于该模式下。<br /><br />在该模式下，用户可以输入各种合法的Vi命令，用于管理自己的文档。此时从键盘上输入的任何字符都被当做编辑命令来解释，若输入的字符是合法的Vi命令，则Vi在接受用户命令之后完成相应的动作。但需注意的是，所输入的命令并不在屏幕上显示出来。若输入的字符不是Vi的合法命令，Vi会响铃报警。<br /><br />文本输入模式<br /><br />在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下，用户输入的任何字符都被Vi当做文件内容保存起来，并将其显示在屏幕上。在文本输入过程中，若想回到命令模式下，按键即可。<br /><br />末行模式<br /><br />末行模式也称ex转义模式。<br /><br />Vi和Ex编辑器的功能是相同的，二者主要区别是用户界面。在Vi中，命令通常是单个键，例如i、a、o等；而在Ex中，命令是以按回车键结束的正文行。Vi有一个专门的“转义”命令，可访问很多面向行的Ex命令。在命令模式下，用户按“:”键即可进入末行模式下，此时Vi会在显示窗口的最后一行（通常也是屏幕的最后一行）显示一个“:”作为末行模式的提示符，等待用户输入命令。多数文件管理命令都是在此模式下执行的（如把编辑缓冲区的内容写到文件中等）。末行命令执行完后，Vi自动回到命令模式。例如：<br /><br />:1，$s / A / a / g<br /><br />则从文件第一行至文件尾将大写A全部替换成小写a。<br /><br />若在末行模式下输入命令过程中改变了主意，可按键，或用退格键将输入的命令全部删除之后，再按一下退格键，即可使Vi回到命令模式下。<br /><br />Vi编辑器的三种工作模式之间的转换如图11-1所示。<br /><br /><br />　<br /><br />如果要从命令模式转换到编辑模式，可以键入命令a或者i；如果需要从文本模式返回，则按Esc键即可。在命令模式下输入“:”即可切换到末行模式，然后输入命令。<br /><br />第二十五课 Vi的进入与退出　　　　　　2000年/6月/13日<br /><br /><br />Vi 的进入<br /><br />用户登录到系统中之后，系统给出提示符“$”。在提示符后键入Vi和想要编辑（或建立）的文件名，便可进入Vi。<br /><br />［例1］ 键入命令：<br /><br />$ vi example.c<br /><br />屏幕显示如下：<br /><br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［New File］<br /><br />如果只键入Vi，而不带文件名，也可以进入Vi。之后在光标处键入文件内容，退出Vi时，只需在退出命令后输入文件名即可。<br /><br />进入Vi之后，首先进入的就是命令模式，也就是说等待命令输入而不是文本输入。这时输入的字母都将作为命令来解释。光标停在屏幕第一行首位上（用表示），其余各行行首均有一个“~”符号，表示该行为空行。最后一行也称状态行，显示出当前正在编辑的文件名以及其状态。如本例是［New File］，表示example.c是一个新建的文件。如果example.c文件已在系统中存在，那么输入上述命令后，则在屏幕上显示出该文件的内容，并且光标停在第一行的首位，在状态行显示出该文件的文件名、行数和字符数。<br /><br />［例2］ 键入命令：<br /><br />$ vi example.c<br /><br />然后键入：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />注意，在这里我们为了节省篇幅起见，屏幕只显示15行。事实上，初始的显示行数与用户所用终端有关，一般的CRT终端可显示25行。在窗口系统中，显示行数与运行Vi的那个窗口有关。然而我们可以对显示行数进行设置。例如，在能显示25行的CRT终端上，让Vi只显示15行。设置的方法将在本节后面介绍。<br /><br />当用Vi建立一个新文件时，在进入Vi的命令中也可以不给出文件名，当编辑完文件需要保存数据时，再由用户指定文件名。<br /><br />进入Vi时，用户不仅可以指定一个待编辑的文件名，而且还有许多附加操作。<br /><br /><br />如果希望在进入Vi之后，光标处于文件中特定的某行上，可在Vi后加上任选项+n，其中n为指定的行数。<br /><br />［例3］ 键入命令：<br /><br />$ vi +5 example1.c<br /><br />后，屏幕显示如下：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标将位于文件example1.c中的第5行上。<br /><br />如果希望在进入Vi之后光标处于文件最末行，则只需把命令中附加项“+”后面的数字n省略掉即可。<br /><br /><br />在进入Vi时，除了可以指定一个光标起始行号之外，还可以在命令中指定一个模式串，此时在进入Vi后，光标就处于文件中第一个与指定模式串相匹配的那行上。<br /><br />［例4］ 键入命令：<br /><br />$ vi +/int example1.c<br /><br />屏幕显示如下：<br /><br />#include<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标将位于文件example1.c中的第3行上。<br /><br /><br />使用Vi可以同时编辑多个文件，只要在进入Vi的命令中写入所要操作的文件即可，还可以使用通配符。<br /><br />［例5］ 键入命令：<br /><br />$ vi *.cat<br /><br />就可以编辑所有后缀为cat的文件了。当然，您还可以使用shell中内置的模式匹配来装载文件，这样会更富技巧性。一旦您在命令行中包含了所有的待编辑文件名，就可以在Vi中方便地移来移去。<br /><br />退出Vi<br /><br />当编辑完文件，准备退出Vi返回到shell时，可以使用以下几种方法之一。<br /><br /><br />在命令模式中，连按两次大写字母Z，若当前编辑的文件曾被修改过，则Vi保存该文件后退出，返回到shell；若当前编辑的文件没被修改过，则Vi直接退出, 返回到shell。<br /><br /><br />在末行模式下，输入命令<br /><br />:w<br /><br />Vi保存当前编辑文件，但并不退出，而是继续等待用户输入命令。在使用w命令时，可以再给编辑文件起一个新的文件名。<br /><br /><br />［例6］<br /><br />:w newfile<br /><br />此时Vi将把当前文件的内容保存到指定的newfile中，而原有文件保持不变。若newfile是一个已存在的文件，则Vi在显示窗口的状态行给出提示信息：<br /><br />File exists （use ! to override）<br /><br />此时，若用户真的希望用文件的当前内容替换newfile中原有内容，可使用命令<br /><br />:w! newfile<br /><br />否则可选择另外的文件名来保存当前文件。<br /><br /><br />在末行模式下，输入命令<br /><br />:q<br /><br />系统退出Vi返回到shell。若在用此命令退出Vi时，编辑文件没有被保存，则Vi在显示窗口的最末行显示如下信息：<br /><br />No write since last change （use ! to overrides）<br /><br />提示用户该文件被修改后没有保存，然后Vi并不退出，继续等待用户命令。若用户就是不想保存被修改后的文件而要强行退出Vi时，可使用命令<br /><br />:q!<br /><br />Vi放弃所作修改而直接退到shell下。<br /><br /><br />在末行模式下，输入命令<br /><br />:wq<br /><br />Vi将先保存文件，然后退出Vi返回到shell。<br /><br /><br />在末行模式下，输入命令<br /><br />:x<br /><br />该命令的功能同命令模式下的ZZ命令功能相同。</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
		<div id="post_message_27084" style="OVERFLOW-X: hidden">Vi中的行号<br /><br />Vi中的许多命令都要用到行号及行数等数值。若编辑的文件较大时，自己去数是非常不方便的。为此Vi提供了给文本加行号的功能。这些行号显示在屏幕的左边，而相应行的内容则显示在行号之后。<br /><br />使用的命令为：在末行方式下输入命令：<br /><br />:set number<br /><br />需要说明的是，这里加的行号只是显示给用户看的，它们并不是文件内容的一部分。<br /><br />在一个较大的文件中，用户可能需要了解光标当前行是哪一行，在文件中处于什么位置，可在命令模式下用组合键&lt;Ctrl+g&gt;，此时Vi会在显示窗口的最后一行显示出相应信息。该命令可以在任何时候使用。<br /><br />［例7］<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［Modified］ lines 4 of 10 --40%-- col 11<br /><br />在末行方式下，我们可以输入命令nu（单词number的缩写）来获得光标当前行的行号与该行内容。<br /><br />光标移动操作<br /><br />全屏幕文本编辑器中，光标的移动操作无疑是最经常使用的操作了。用户只有熟练地使用移动光标的这些命令，才能迅速准确地到达所期望的位置处进行编辑。<br /><br />Vi中的光标移动既可以在命令模式下，也可以在文本输入模式下，但操作的方法不尽相同。<br /><br />在文本输入模式下，可直接使用键盘上的四个方向键移动光标。<br /><br />在命令模式下，有很多移动光标的方法。不但可以使用四个方向键来移动光标，还可以用h、j、k、l这四个键代替四个方向键来移动光标，这样可以避免由于不同机器上的不同键盘定义所带来的矛盾，而且使用熟练后可以手不离开字母键盘位置就能完成所有操作，从而提高工作效率。另外还可以用&lt;Spacebar&gt;、&lt;Backspace&gt;、&lt;Ctrl+n&gt;和&lt;ctrl+p&gt;四个键或组合键移动光标。且以上这三种键在实现功能上是等价的。除此之外，还有一些移动光标的命令。下面对它们的工作方式介绍如下：<br /><br />&lt;Spacebar&gt;、® （均称为右向键）<br /><br />右向键的作用是将光标向右移动一个位置。若在向右键前先输入一个数字n，那么光标就向右移动n个位置。例如5l表示光标向右移动5个位置。需要注意的是，光标移动不能超过当前行的末尾。若给定的n超过光标当前位置至行尾的字符个数，如果用右向键，光标只能移到行尾；如果用&lt;Spacebar&gt;，光标移到下面一行或几行的适当位置。<br /><br />h、&lt;Backspace&gt;、¬ （向左键）<br /><br />执行一次向左键，光标向左移动一个位置。同向右键一样，也可以在向左键的前面输入一个数字n，那么光标就向左移动n个位置。需要注意的是，如果用左向键，光标左移不能超出该行的开头；如果用&lt;Backspace&gt;，光标移到上面一行或几行的适当位置。<br /><br />j、&lt;Ctrl+n&gt;、¯ （向下键）<br /><br />执行一次向下键光标向下移动一个位置（即一行），但光标所在的列不变。当这些命令前面加上数字n，则光标下移n行。<br /><br />Vi除了可以用向下键将光标下移外，还可以用&lt;Enter&gt;键和“+”键将光标下移一行或n行（不包括本行在内），但此时光标下移之后将位于该行的第一个字符处。例如：<br /><br />3j 光标下移3行，且光标所在列的位置不变。<br /><br />3+或3&lt;Enter&gt; 光标下移3行，且光标位于该行的行首。<br /><br />k、&lt;Ctrl+p&gt;、­ （向上键）<br /><br />执行一次向上键光标向上移动一个位置（即一行），但光标所在的列不变。同样在这些命令前面加上数字n，则光标上移n行。<br /><br />若希望光标上移之后，光标位于该行的行首，则可以使用命令“- ”。<br /><br />L （移至行首）<br /><br />L 命令是将光标移到当前行的开头，即将光标移至当前行的第一个非空白处（非制表符或非空格符）。<br /><br />$（移至行尾）<br /><br />该命令将光标移到当前行的行尾，停在最后一个字符上。若在$命令之前加上一个数字n，则光标下移n-1行并到达行尾。<br /><br />［行号］ G（移至指定行）<br /><br />该命令将光标移至指定行号所指定的行的行首。这种移动称为绝对定位移动。<br /><br />［例8］<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />键入命令:6G后，屏幕显示如下：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）;<br /><br />}<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x = %d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” 12 lines, 125 characters<br /><br />光标移到了第6行的行首。<br /><br />若省略行号，则光标移至该文件的最后一行的行首，即无论该文件有多少屏，都跳至最后一行。<br /><br />第二十七课 vi命令　　　2000年/6月/26日<br /><br />　<br /><br />在屏幕上移动<br /><br />Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。<br /><br />1. H命令<br /><br />该命令将光标移至屏幕首行的行首（即左上角），也就是当前屏幕的第一行，而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n，则将光标移至第n行的行首。<br /><br />［例9］ 屏幕显示如下内容：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）; }<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x=%d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />在命令模式下输入4H命令后，光标移到以for开头的这一行的字母f上。<br /><br />值得一提的是，使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。<br />2. M命令<br /><br />该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行；如果并未充满，则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令M之后，光标都将移到add这一行的字母a上。<br /><br />同样值得一提的是，使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。<br />3. L命令<br /><br />当文件显示内容超过一屏时，该命令将光标移至屏幕上的最底行的行首；当文件显示内容不足一屏时，该命令将光标移至文件的最后一行的行首。可见，利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n，则将光标移至从屏幕底部算起第n行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令3L之后，光标都将移到x++这一行的字母x上。<br /><br />同样值得一提的是，使用命令dL将会删除从光标当前行至屏幕底行的全部内容。<br /><br />按字移动光标<br /><br />首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字，它可以是两个空格之间的任何内容。<br /><br />［例10］ 在文件example.c 中的第4行：<br /><br />{int k；<br /><br />它只有2个字，一个是{int ，另一个是k;<br /><br />Vi中另一种字是狭义上的字，在此种意义之下，英文单词、标点符号和非字母字符（如!、@、#、$、%、^、&amp;、*、（、）、-、+、{、}、［、］、~、|、\、&lt;、&gt;、/等）均被当成是一个字。因此，上面那一行中就包括{、int、k、；这4个字。<br /><br />Vi中使用大写命令一般就是指将字作为广义来对待，使用小写命令就是作为狭义对待。<br /><br />搞清楚Vi中字的含义后，我们就可以介绍按字移动光标的命令了。<br /><br />Vi 一共提供了三组关于按字移动光标的命令，分别是：<br /><br />1. w和W命令<br /><br />将光标右移至下一个字的字首；<br /><br />［例11］ 屏幕上显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用w命令，把光标移到下一个字（狭义）的字首“（”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />下面使用W命令，将把光标移到下一个字（广义）的字首“M”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br />2. e和E命令<br /><br />如果光标起始位置处于字内（即非字尾处），则该命令将把光标移到本字字尾；如果光标起始位置处于字尾，则该命令将把光标移动到下一个字的字尾。<br />3. b和B<br /><br />如果光标处于所在字内（即非字首），则该命令将把光标移至本字字首；如果光标处于所在字字首，则该命令将把光标移到上一个字的字首。<br /><br />［例12］ 屏幕显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用b命令，由于光标处于该字中间，所以光标移动到本字字首“H”处：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />如果使用B命令，则如下所示：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />按句移动光标<br /><br />在Vi中，一个句子被定义为是以逗号（,）、句号（.）、问号（?）和感叹号（!）结尾，且其后面跟着至少两个以上（含两个）空格或一个换行符的字符序列。<br /><br />Vi提供了关于按句移动光标的两个命令，分别为：<br /><br />1. （ 命令<br /><br />将光标移至上一个句子的开头。<br /><br />2. ） 命令<br /><br />该命令将光标移至下一个句子的开头。<br /><br />按段移动光标<br /><br />在Vi中，一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令，分别为：<br /><br />1. { 命令<br /><br />该命令将光标向前移至上一个段的开头；<br /><br />2. } 命令<br /><br />该命令将光标向后移至下一个段的开头。<br /><br />屏幕滚动<br /><br />屏幕命令是以屏幕为单位移动光标的，常用于文件的滚屏和分页。需要注意的是，屏幕命令不是光标移动命令，不能作为文本限定符用于删除命令中。<br /><br />在命令模式下和文本输入模式下均可以使用屏幕滚动命令。<br /><br />　<br /><br />1. 滚屏命令<br /><br />关于滚屏命令有两个：<br /><br />· &lt; Ctrl+u &gt; 将屏幕向前（文件头方向）翻滚半屏；<br /><br />· &lt; Ctrl+d &gt; 将屏幕向后（文件尾方向）翻滚半屏。<br /><br />可以在这两个命令之前加上一个数字n，则屏幕向前或向后翻滚n行。并且这个值被系统记住，以后再用&lt; Ctrl+u &gt;和&lt; Ctrl+d &gt;命令滚屏时，还滚相应的行数。<br /><br />2. 分页命令<br /><br />关于分页命令也有两个：<br /><br />· &lt; Ctrl+f &gt; 将屏幕向文件尾方向翻滚一整屏（即一页）；<br /><br />· &lt; Ctrl+b &gt; 将屏幕向文件首方向翻滚一整屏（即一页）。<br /><br />同样也可以在这两个命令之前加上一个数字n，则屏幕向前或向后移动n页。<br /><br />3. 状态命令&lt; Ctrl+G &gt;<br /><br />命令显示在vi状态行上的vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。<br /><br />4. 屏幕调零命令<br /><br />Vi 提供了三个有关屏幕调零的命令。它们的格式分别为：<br /><br />· ［行号］ z ［行数］ &lt;回车&gt;<br /><br />· ［行号］ z ［行数］ .<br /><br />· ［行号］ z ［行数］ _<br /><br />若省略了行号和行数，这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示；若给出行号，那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行；若给出行数，则它规定了在屏幕上显示的行数。<br /><br />［例13］<br /><br />8z16&lt;回车&gt; ：将文件中的第8行作为屏幕显示的首行，并一共显示16行。<br /><br />15z . ：将文件中的第15行作为屏幕显示的中间行，显示行数为整屏。<br /><br />15z 5_ ：将文件中的第15行作为屏幕显示的最末行，显示行数为5行。<br /><br />文本插入操作<br /><br />在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行，如果用户要将输入的字符当作是文本内容时，则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。<br /><br />　<br /><br />插入（Insert）命令<br /><br />Vi提供了两个插入命令：i和 I。<br /><br />　<br /><br />　<br /><br />1. i命令<br /><br />插入文本从光标所在位置前开始,并且插入过程中可以使用&lt;Backspace&gt;键删除错误的输入。此时Vi处于插入状态，屏幕最下行显示“--INSERT--”（插入）字样。<br /><br />［例14］ 有一正在编辑的文件，如下所示：<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />光标位于第一个“!”上，需在其前面插入：<br /><br />This is an example!<br /><br />使用i命令，并输入相应文本后，屏幕显示如下：<br /><br />Welcome to vi world This is an example!!Come on!<br /><br />~<br /><br />~<br /><br />由此例可以看到，光标本来是在第一个“!”处，但是由于是从光标所在位置前开始插入，所以这个“!”就被挤到了新插入的文本之后。<br />2. I命令<br /><br />该命令是将光标移到当前行的行首，然后在其前插入文本。</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
		<br />
		<br />
		<br />
		<div id="post_message_27085" style="OVERFLOW-X: hidden">vi命令<br /><br />在屏幕上移动<br /><br />Vi提供了三个关于光标在全屏幕上移动并且文件本身不发生滚动的命令。它们分别是H、M和L命令。<br /><br />1. H命令<br /><br />该命令将光标移至屏幕首行的行首（即左上角），也就是当前屏幕的第一行，而不是整个文件的第一行。利用此命令可以快速将光标移至屏幕顶部。若在H命令之前加上数字n，则将光标移至第n行的行首。<br /><br />［例9］ 屏幕显示如下内容：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{ int k ;<br /><br />for （ k=0 ; k&lt;3 ; k++） add（ ）; }<br /><br />add（ ）<br /><br />{ static int x=0;<br /><br />x++ ;<br /><br />printf（“x=%d\n”, x）;<br /><br />}<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />~<br /><br />“ example.c” ［ New File］<br /><br />在命令模式下输入4H命令后，光标移到以for开头的这一行的字母f上。<br /><br />值得一提的是，使用命令dH将会删除从光标当前所在行至所显示屏幕首行的全部内容。<br />2. M命令<br /><br />该命令将光标移至屏幕显示文件的中间行的行首。即如果当前屏幕已经充满,则移动到整个屏幕的中间行；如果并未充满，则移动到文本的那些行的中间行。利用此命令可以快速地将光标从屏幕的任意位置移至屏幕显示文件的中间行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令M之后，光标都将移到add这一行的字母a上。<br /><br />同样值得一提的是，使用命令dM将会删除从光标当前所在行至屏幕显示文件的中间行的全部内容。<br />3. L命令<br /><br />当文件显示内容超过一屏时，该命令将光标移至屏幕上的最底行的行首；当文件显示内容不足一屏时，该命令将光标移至文件的最后一行的行首。可见，利用此命令可以快速准确地将光标移至屏幕底部或文件的最后一行。若在L命令之前加上数字n，则将光标移至从屏幕底部算起第n行的行首。例如，在上面屏幕显示的情况下（不论光标在屏幕的何处），在命令模式下，输入命令3L之后，光标都将移到x++这一行的字母x上。<br /><br />同样值得一提的是，使用命令dL将会删除从光标当前行至屏幕底行的全部内容。<br /><br />按字移动光标<br /><br />首先介绍一下Vi中“字”的概念。在Vi中“字”有两种含义。一种是广义的字，它可以是两个空格之间的任何内容。<br /><br />［例10］ 在文件example.c 中的第4行：<br /><br />{int k；<br /><br />它只有2个字，一个是{int ，另一个是k;<br /><br />Vi中另一种字是狭义上的字，在此种意义之下，英文单词、标点符号和非字母字符（如!、@、#、$、%、^、&amp;、*、（、）、-、+、{、}、［、］、~、|、\、&lt;、&gt;、/等）均被当成是一个字。因此，上面那一行中就包括{、int、k、；这4个字。<br /><br />Vi中使用大写命令一般就是指将字作为广义来对待，使用小写命令就是作为狭义对待。<br /><br />搞清楚Vi中字的含义后，我们就可以介绍按字移动光标的命令了。<br /><br />Vi 一共提供了三组关于按字移动光标的命令，分别是：<br /><br />1. w和W命令<br /><br />将光标右移至下一个字的字首；<br /><br />［例11］ 屏幕上显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用w命令，把光标移到下一个字（狭义）的字首“（”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />下面使用W命令，将把光标移到下一个字（广义）的字首“M”上：<br /><br />printf（“Hello Mr.Huang!\n”）;<br />2. e和E命令<br /><br />如果光标起始位置处于字内（即非字尾处），则该命令将把光标移到本字字尾；如果光标起始位置处于字尾，则该命令将把光标移动到下一个字的字尾。<br />3. b和B<br /><br />如果光标处于所在字内（即非字首），则该命令将把光标移至本字字首；如果光标处于所在字字首，则该命令将把光标移到上一个字的字首。<br /><br />［例12］ 屏幕显示如下：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />现在使用b命令，由于光标处于该字中间，所以光标移动到本字字首“H”处：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />如果使用B命令，则如下所示：<br /><br />printf（“Hello Mr.Huang!\n”）;<br /><br />按句移动光标<br /><br />在Vi中，一个句子被定义为是以逗号（,）、句号（.）、问号（?）和感叹号（!）结尾，且其后面跟着至少两个以上（含两个）空格或一个换行符的字符序列。<br /><br />Vi提供了关于按句移动光标的两个命令，分别为：<br /><br />1. （ 命令<br /><br />将光标移至上一个句子的开头。<br /><br />2. ） 命令<br /><br />该命令将光标移至下一个句子的开头。<br /><br />按段移动光标<br /><br />在Vi中，一个段被定义为是以一个空白行开始和结束的片段。Vi提供了关于按段移动光标的两个命令，分别为：<br /><br />1. { 命令<br /><br />该命令将光标向前移至上一个段的开头；<br /><br />2. } 命令<br /><br />该命令将光标向后移至下一个段的开头。<br /><br />屏幕滚动<br /><br />屏幕命令是以屏幕为单位移动光标的，常用于文件的滚屏和分页。需要注意的是，屏幕命令不是光标移动命令，不能作为文本限定符用于删除命令中。<br /><br />在命令模式下和文本输入模式下均可以使用屏幕滚动命令。<br /><br />　<br /><br />1. 滚屏命令<br /><br />关于滚屏命令有两个：<br /><br />· &lt; Ctrl+u &gt; 将屏幕向前（文件头方向）翻滚半屏；<br /><br />· &lt; Ctrl+d &gt; 将屏幕向后（文件尾方向）翻滚半屏。<br /><br />可以在这两个命令之前加上一个数字n，则屏幕向前或向后翻滚n行。并且这个值被系统记住，以后再用&lt; Ctrl+u &gt;和&lt; Ctrl+d &gt;命令滚屏时，还滚相应的行数。<br /><br />2. 分页命令<br /><br />关于分页命令也有两个：<br /><br />· &lt; Ctrl+f &gt; 将屏幕向文件尾方向翻滚一整屏（即一页）；<br /><br />· &lt; Ctrl+b &gt; 将屏幕向文件首方向翻滚一整屏（即一页）。<br /><br />同样也可以在这两个命令之前加上一个数字n，则屏幕向前或向后移动n页。<br /><br />3. 状态命令&lt; Ctrl+G &gt;<br /><br />命令显示在vi状态行上的vi状态信息，包括正在编辑的文件名、是否修改过、当前行号、文件的行数以及光标之前的行占整个文件的百分比。<br /><br />4. 屏幕调零命令<br /><br />Vi 提供了三个有关屏幕调零的命令。它们的格式分别为：<br /><br />· ［行号］ z ［行数］ &lt;回车&gt;<br /><br />· ［行号］ z ［行数］ .<br /><br />· ［行号］ z ［行数］ _<br /><br />若省略了行号和行数，这三个命令分别为将光标所在的当前行作为屏幕的首行、中间行和最末行重新显示；若给出行号，那么该行号所对应的行就作为当前行显示在屏幕的首行、中间行和最末行；若给出行数，则它规定了在屏幕上显示的行数。<br /><br />［例13］<br /><br />8z16&lt;回车&gt; ：将文件中的第8行作为屏幕显示的首行，并一共显示16行。<br /><br />15z . ：将文件中的第15行作为屏幕显示的中间行，显示行数为整屏。<br /><br />15z 5_ ：将文件中的第15行作为屏幕显示的最末行，显示行数为5行。<br /><br />文本插入操作<br /><br />在命令模式下用户输入的任何字符都被Vi当作命令加以解释执行，如果用户要将输入的字符当作是文本内容时，则首先应将Vi的工作模式从命令模式切换到文本输入模式。切换的方式是使用下面的命令。<br /><br />　<br /><br />插入（Insert）命令<br /><br />Vi提供了两个插入命令：i和 I。<br /><br />　<br /><br />　<br /><br />1. i命令<br /><br />插入文本从光标所在位置前开始,并且插入过程中可以使用&lt;Backspace&gt;键删除错误的输入。此时Vi处于插入状态，屏幕最下行显示“--INSERT--”（插入）字样。<br /><br />［例14］ 有一正在编辑的文件，如下所示：<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />光标位于第一个“!”上，需在其前面插入：<br /><br />This is an example!<br /><br />使用i命令，并输入相应文本后，屏幕显示如下：<br /><br />Welcome to vi world This is an example!!Come on!<br /><br />~<br /><br />~<br /><br />由此例可以看到，光标本来是在第一个“!”处，但是由于是从光标所在位置前开始插入，所以这个“!”就被挤到了新插入的文本之后。<br />2. I命令<br /><br />该命令是将光标移到当前行的行首，然后在其前插入文本。<br /><br /><br /><br />}<br /><br />第二十九课 vi命令　　　2000年/7月/10日<br /><br />　<br /><br />　<br /><br />附加（append）命令<br /><br />Vi提供了两个附加插入命令：a和A。<br /><br />1. a命令<br /><br />该命令用于在光标当前所在位置之后追加新文本。新输入的文本放在光标之后，在光标后的原文本将相应地向后移动。光标可在一行的任何位置。<br /><br />［例15］ 以例14原始情况为例，使用a命令，并输入相应文本，屏幕显示如下：<br /><br />Welcome to vi world!This is an example!Come on!<br /><br />~<br /><br />~<br /><br />本例中光标后的文本“Come on!”被新输入的文本挤到了后面。<br />2. A命令<br /><br />该命令与a命令不同的是，A命令将把光标挪到所在行的行尾，从那里开始插入新文本。当输入A命令后，光标自动移到该行的行尾。<br /><br />a和A命令是把文本插入到行尾的唯一方法。<br /><br />　<br /><br />打开（open）命令<br /><br />不论是Insert命令也好，还是append命令也好，所插入的内容都是从当前行中的某个位置开始的。若我们希望在某行之前或某行之后插入一些新行，则应使用open命令。<br /><br />Vi提供了两个打开命令：o和O。<br /><br />1. o命令<br /><br />该命令将在光标所在行的下面新开一行，并将光标置于该行的行首，等待输入文本。要注意，当使用&lt;Backspace&gt;删除字符时只能删除从插入模式开始的位置以后的字符，对于以前的字符不起作用。而且还可以在文本输入方式下输入一些控制字符，例如，Ctrl+l即是插入分页符，显示为^L。<br /><br />［例16］ 以例14的原始情况为例，只是这次要在当前行下面一行输入文本。使用o命令，并输入相应文本，屏幕显示如下：<br /><br />Welcome to vi world!Come on!<br /><br />This is an example!<br /><br />~<br /><br />~<br /><br />新输入的文本出现在原来文本所在行的下一行。<br />2. O命令<br /><br />和o命令相反，O命令是在光标所在行的上面插入一行，并将光标置于该行的行首，等待输入文本。<br /><br />［例17］ 与例14的原始情况相同，要在当前行的上面一行输入文本。使用O命令并输入文本后，屏幕显示如下：<br /><br />This is an example!<br /><br />Welcome to vi world!Come on!<br /><br />~<br /><br />~<br /><br />文本插入到了当前行之上。<br /><br />11.3.4　文本修改<br /><br />在命令模式下可以使用Vi提供的各种有关命令对文本进行修改，包括对文本内容的删除、复制、取代和替换等。<br /><br />　<br /><br />　<br /><br />文本删除<br /><br />在编辑文本时，经常需要删除一些不需要的文本，我们可以用&lt;Backspace&gt;键将输错或不需要的文本删除，但此时有一个限制就是当删到行头之后，再想删上面那行的内容是不可能的。<br /><br />在命令模式下，Vi提供了许多删除命令。这些命令大多是以d开头的。常用的有：<br /><br />1. 删除单个字符<br /><br />x： 删除光标处的字符。若在x之前加上一个数字n，则删除从光标所在位置开始向右的n个字符。<br /><br />X：删除光标前面的那个字符。若在X之前加上一个数字n，则删除从光标前面那个字符开始向左的n个字符。<br /><br />显然这两个命令是删除少量字符的快捷方法。<br /><br />2. 删除多个字符<br /><br />dd：删除光标所在的整行。在dd前可加上一个数字n，表示删除当前行及其后n-1行的内容。<br /><br />D或d$：两命令功能一样，都是删除从光标所在处开始到行尾的内容。<br /><br />d0：删除从光标前一个字符开始到行首的内容。<br /><br />dw：删除一个单词。若光标处在某个词的中间，则从光标所在位置开始删至词尾。同dd命令一样，可在dw之前加一个数字n，表示删除n个指定的单词。<br /><br />如果用户不小心进行了误删除操作，也不要紧，Vi提供了恢复误操作的命令，并且可以将恢复的内容移动，放在文本的任何地方。恢复命令用² np，其中n为寄存器号。这是因为Vi内部有9个用于维护删除操作的寄存器，分别用数字1，2，¼ ，9表示，它们分别保存以往用dd命令删除的内容。这些寄存器组成一个队列，例如最近一次使用dd命令删除的内容被放到寄存器1中；当下次再使用dd命令删除文本内容时，Vi将把寄存器1的内容转存到寄存器2中，而寄存器1中又将是最近一次dd命令删除的内容。以此类推，Vi可以保存有最近九次用dd命令删除的内容，而前面的用dd命令删除的内容则被抛弃。<br /><br />［例18］ 假设当前编辑文件为xu.c<br /><br />/* this is a example */<br /><br />#include &lt;stdio.h&gt;<br /><br />void main（ ）<br /><br />{<br /><br />int i , j ;<br /><br />printf（ “ please input a number : / n ” ）;<br /><br />scanf （ “ % d ” , &amp;i ） ;<br /><br />j = i + 100 ;<br /><br />printf （ “ /n j = % d /n ” , j ） ;<br /><br />return ;<br /><br />}<br /><br />我们对其进行如下操作：<br /><br />1. 将光标移至文件第一行，按dd命令，此时文件第一行的内容被删除，且被删除的内容保存在寄存器1中；<br />2. 按5j使光标下移至第一个printf语句行；<br />3. 按dd命令将该行删除，此时寄存器1中将保存刚刚被删除的内容：<br /><br />printf （“ please input a number :\ n ” ）;<br /><br />而寄存器1原有的内容：<br /><br />/* this is a example */<br /><br />则被保存到寄存器2中；<br /><br />在最末行模式下，也可以对文件内容进行删除，但它只能删除整行，一次可将某个指定范围内（起始行号，终止行号）的所有行全部删除。需要注意的是，用此种方法进行删除时，Vi并不把所删内容放入寄存器中，因而当发生误删除操作时，不能用² np命令恢复，只能用u命令进行有限的恢复。<br /><br />最后提一下，如何在文本输入方式时将所输入文本删除。用户使用&lt;Ctrl+u&gt;组合键即可，此时光标将返回插入开始的位置，并且Vi仍处于文本输入方式。<br /><br />　<br /><br />取消上一命令（Undo）<br /><br />取消上一命令（Undo），也称复原命令，是非常有用的命令，它可以取消前一次的误操作或不合适的操作对文件造成的影响，使之回复到这种误操作或不合适操作被执行之前的状态。<br /><br />取消上一命令有两种形式，在命令模式下键入字符u和U。它们的功能都是取消刚才输入的命令，恢复到原来的情况。小写u和大写U在具体细节上有所不同，二者的区别在于，大写U命令的功能是恢复到误操作命令前的情况，即如果插入命令后使用U命令，就删除刚刚插入的内容；如果删除命令后使用U命令，就相当于在光标处又插入刚刚删除的内容。这里把所有修改文本的命令都视为插入命令。也就是说，U命令只能取消前一步操作，如果用U命令撤消了前一步操作，当再按U键时，并不是撤消再前一步的操作，而是撤消了刚才U命令执行的操作，也就是又恢复到第一次使用U命令之前的状态，结果是什么都没做。而小写u命令的功能是把当前行恢复成被编辑前的状态，而不管此行被编辑了多少次。<br /><br />　<br /><br />［例19］ 原来屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />}<br /><br />在命令模式下输入命令o，插入一新行，输入需要插入的内容后再按&lt;Esc&gt;回到命令模式，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />}<br /><br />若想取消这一插入操作，请按命令U后，屏幕恢复到原来显示的情况。<br /><br />注意：对于取消命令仍可以再使用取消命令。这时会产生一种“负负得正”的效果，文件状态将恢复到第一次执行取消命令之前的状态，如同没做任何操作一般。例如在上例中，再使用一次命令U，屏幕将显示的内容仍为插入后的内容。<br /><br />　<br /><br />重复命令（Redo）<br /><br />重复命令也是一个非常常用的命令。在文本编辑中经常会碰到需要机械地重复一些操作，这时就需要用到重复命令。它可以让用户方便地再执行一次前面刚完成的某个复杂的命令。<br /><br />重复命令只能在命令模式下工作，在该模式下按“.”键既可。执行一个重复命令时，其结果是依赖于光标当前位置的。<br /><br />［例20］ 屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />}<br /><br />输入命令o，并输入一行内容后，再&lt; Esc &gt;返回到命令模式下，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />}<br /><br />此时输入命令“.”，屏幕显示内容为：<br /><br />#include &lt;stdio.h&gt;<br /><br />main （ ）<br /><br />{<br /><br />printf （ “ How do you do ! ” ） ;<br /><br />printf （ “ How do you do ! ” ） ;</div>
		<!-- / message -->
		<!-- sig -->
		<br />
		<br />
<img src ="http://www.cnitblog.com/charester/aggbug/20940.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/charester/" target="_blank">骗子的天空</a> 2006-12-21 20:49 <a href="http://www.cnitblog.com/charester/archive/2006/12/21/20940.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VI 学习（二）vi的使用方法 </title><link>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html</link><dc:creator>骗子的天空</dc:creator><author>骗子的天空</author><pubDate>Thu, 21 Dec 2006 12:42:00 GMT</pubDate><guid>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html</guid><wfw:comment>http://www.cnitblog.com/charester/comments/20939.html</wfw:comment><comments>http://www.cnitblog.com/charester/archive/2006/12/21/20939.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/charester/comments/commentRss/20939.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/charester/services/trackbacks/20939.html</trackback:ping><description><![CDATA[
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">vi有三种工作状态：命令状态，文本插入状态，最后一行状态<?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">命令状态：是<span lang="EN-US">vi的初始状态及一般状态。在该状态下输入的内容均视为命令，调用命令后，若要返回初始状态，则需按〈Esc〉键。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">注意：命令状态下，其字母大小写在<span lang="EN-US">vi中是意义不同的的命令<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">（小窍门：若不知道当前是在什么状态，可按几次〈<span lang="EN-US">Esc〉键，以确保处于命令状态。）<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">插入状态：在命令状态调用插入命令后，进入插入状态，在此状态下输入的内容被视为文件内容，按〈<span lang="EN-US">Esc〉键回到命令状态。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 14.2pt; TEXT-INDENT: -2.85pt; mso-char-indent-size: 12pt; tab-stops: list 29.35pt; mso-list: l2 level1 lfo4">
				<span lang="EN-US" style="FONT-SIZE: 9pt; FONT-FAMILY: Wingdings; mso-bidi-font-size: 12.0pt">Ø<span style="FONT: 7pt 'Times New Roman'">       </span></span>
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">最后一行状态：用于存储文件、退出编辑、在<span lang="EN-US">vi中执行shell命令。在命令状态下输入引号中列出的任意一键均可进入该状态：“<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">：/ ？ ！</span>”。若要转换到命令状态，按<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">Enter</span>键即可。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">在<span lang="EN-US">vi中执行<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">shell</span>命令时，在命令前需加字符“<span style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">！</span>”。<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">例：<span lang="EN-US">1 最后一行状态下，执行shell的列表命令<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">!ls</span><span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">file1<span style="mso-spacerun: yes">   </span>file2.f<span style="mso-spacerun: yes">   </span>test.c<span style="mso-spacerun: yes">  </span>…<span style="mso-spacerun: yes">  </span>（当前目录中的文件表）<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">… …<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">Press RETURN or Enter command to continue<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<?XML:NAMESPACE PREFIX = V /?>
						<v:shape id="_x0000_i1030" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command3">
						</a>插入命令（注意字母大小写）<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">i 在光标前插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">I 在此行开始插入文本<span style="mso-spacerun: yes">      </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">a 在光标后插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">A 在此行未插入文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">o 在当前行下面加一空行并进入输入方式<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">O在当前行上面加一空行并进入输入方式<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-spacerun: yes">    </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1034" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command4">
						</a>删除、复制、移动命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">x<span style="mso-spacerun: yes">  </span>删除当前字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">d$ 删除当前行中从光标往后的所有字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">d0 删除当前行中从光标往前的所有字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">dd 删除当前行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">ndd 删除光标所在位置之下的n行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">：<span lang="EN-US" style="BACKGROUND: #d9d9d9; mso-shading: white; mso-pattern: gray-15 auto">n1 ,n2d</span><span lang="EN-US"> 删除n1行到n2行<span style="mso-spacerun: yes">  </span>(在最后一行状态)<o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<span style="mso-spacerun: yes"> </span>
						<span style="mso-spacerun: yes"> </span>yy<span style="mso-spacerun: yes">  </span>将当前行复制到缓冲区<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">nyy 将光标所在位置之下的n行文本复制到缓冲区<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">p：将上一次删除或复制的文本复制到光标的下方<span style="mso-spacerun: yes">  </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">P：将上一次删除或复制的文本复制到光标的上方<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">说明：移动正文时需先用删除命令将要移动的正文删除，然后使用复制命令<span lang="EN-US"><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1035" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command5">
						</a>光标移动命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 48.0pt">
				<span style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">键盘的←↑→↓键 分别是左移<span lang="EN-US">,上移,右移,下移 <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 42.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">O(数字), $<span style="mso-spacerun: yes">  </span>移至当前行首和行尾<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+h移动光标至当前窗口的起点<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt; tab-stops: 48.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+l移动光标至当前窗口的末尾<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;shift&gt;+g （或G）移动光标至文件的末尾 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+f前翻一页<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+b后翻一页<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">nG 移动光标至第n行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">&lt;ctrl&gt;+g 显示当前行号<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">J 将当前行与下一行连接<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">u 取消前一个命令<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN-LEFT: 42pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 12pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1036" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command6">
						</a>查找字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">/要查找的字符串(回车)：查找光标位置之后的字符串 <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">?要查找的字符串(回车)：查找光标位置之前的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">n<span style="mso-spacerun: yes">  </span>继续向同一方向查找匹配的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">N<span style="mso-spacerun: yes">  </span>继续进行反方向查找匹配的字符串<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">* 在查找的字符串中可匹配任意字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">? 在查找的字符串中可匹配一个字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: 1.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">
						<v:shape id="_x0000_i1037" style="WIDTH: 9pt; HEIGHT: 9pt" o:bullet="t" coordsize="21600,21600" type="#_x0000_t75">
								<v:imagedata src="./book_4.files/image003.gif" o:title="BD14581_">
								</v:imagedata>
						</v:shape>
						<span style="mso-spacerun: yes"> </span>
						<a name="command7">
						</a>修改字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">r 只替换光标位置上的一个字符<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">R 用重写的方法替换原来的字符串，结束替换按&lt;Esc&gt;键<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:[n1,n2]s/旧字符串/新字符串/g&lt;Enter&gt;<span style="mso-spacerun: yes">  </span>用新文本替换n1～n2行内的所有旧字符串, n1,n2缺省时只修改当前行<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">:g/旧文本/s//新文本/g&lt;Enter&gt;<span style="mso-spacerun: yes">  </span>用新文本替换缓冲区内找到的所有旧文本<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">. 重复上一次修改<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">u 取消上一次修改<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 18pt; mso-char-indent-count: 2.0; mso-char-indent-size: 9.0pt">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt">U 将当前行恢复到修改前的状态<o:p></o:p></span>
		</p>
		<p class="MsoNormal">
				<span lang="EN-US" style="FONT-SIZE: 9pt; mso-bidi-font-size: 12.0pt"> <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="TEXT-INDENT: 9pt; mso-char-indent-count: