星期二, 一月 29, 2008

利用google突破各种封锁来下载你要的东西

在搜索框上输入: “index of/ ”  inurl:lib

再按搜索你将进入许多图书馆,并且一定能下载自己喜欢的书籍。

在搜索框上输入: “index of /”  cnki

再按搜索你就可以找到许多图书馆的CNKI、VIP、超星等入口!

在搜索框上输入: “index of /”  ppt

再按搜索你就可以突破网站入口下载powerpint作品!

在搜索框上输入: “index of /”  mp3

再按搜索你就可以突破网站入口下载mp3、rm等影视作品!

在搜索框上输入: “index of /”  swf

再按搜索你就可以突破网站入口下载flash作品!

在搜索框上输入: “index of /”  要下载的软件名

再按搜索你就可以突破网站入口下载软件!

注意引号应是英文的!

再透露一下,如果你输入:

“index of /”  AVI

另补上第二篇
用GOOgle看世界!!!只要你在GOOGLE里输入特殊的关键字,就可以搜到数千个摄象头的IP地址!通过他你就可以看到其所摄的实时影象!!
在google里输入
inurl:"viewerframe?mode="

随便打开一个,然后按提示装一个插件,就可以看到了!!!

再补上第三篇
三则黑客的Google搜索技巧简介
大 家都知道,Google毫无疑问是当今世界上最强大的搜索引擎。然而,在黑客手中,它也是一个秘密武器,它能搜索到一些你意想不到的信息。赛迪编者把他们 进行了简单的总结不是希望您利用他去攻击别人的网站,而是利用这些技巧去在浩如烟海的网络信息中,来个大海捞针,寻找到对您有用的信息。

如 果您是一名普通网民,您可以使用黑客的技巧扩大自己的视野,提高自己的检索效率;如果您是一名网管,请您赶快看看您的网站是否做好了对下面黑客探测手段的 防范措施,如果没有就赶快来个亡羊补牢,毕竟隐患胜于明火,防范胜于救灾;如果您是一名黑客,相信您早以在别的黑客站点上见过类似的方法,这篇文章对您没 什么用处,这里的技巧对您是小儿科,菜鸟级!您可以节省宝贵的时间做更有意义的事情,这篇文章您不用看了,到别处去吧!

基于上面的考虑我编发了这篇文章。

  搜索URL

  比如我们提交这种形式:passwd.txt site:virtualave.net

   看到了什么?是不是觉得太不可思议了!有很多基于CGI/PHP/ASP 类型的留言板存在这种问题。有时我们得到密码甚至还是明码的!管理员或许太不负责了,或许安全防范的意识太差了,如果你是网络管理员,赶快检查一下不要让 恶意攻击者捡了便宜。不要太相信DES加密,即使我们的密码经过DES 加密的密码,黑客们还是可以通过许多破解软件来搞定。

  这次我们能得到包含密码的文件。“site:virtualave.net”意思是只搜索 virutalave.net 的URL。virutalave.net是一个网络服务器提供商。

  同样,我们可以搜索一些顶级域名,比如:.net .org .jp .in .gr

  config.txt site:.jp

  admin.txt site:.tw

  搜索首页的目录

  首页是非常有用的,它会提供给你许多有用的信息。

  我们提交如下的形式:

  "Index of /admin"

  "Index of /secret"

  "Index of /cgi-bin" site:.edu

  你可以自己定义搜索的首页字符。这样就可以获得许多信息。

  搜索特定的文件类型

  比如你想指定一种文件的类型,可以提交如下形式:

  filetype:.doc site:.mil classified

  这个就是搜索军方的资料,你可以自定义搜索。
再提供一个第四篇

Google 的特殊功能
1 、查询电话号码
Google 的搜索栏中最新加入了电话号码和美国街区地址的查询信息。
个人如想查找这些列表,只要填写姓名,城市和省份。
如果该信息为众人所知,你就会在搜索结果页面的最上方看到搜索的电话和街区地址
你还可以通过以下任何一种方法找到该列表:
名字(或首位大写字母),姓,电话地区号
名字(或首位大写字母),姓,邮递区号
名字(或首位大写字母),姓,城市(可写州)
名字(或首位大写字母),姓,州
电话号码,包括区号
名字,城市,州
名字,邮递区号

2 、查找 PDF 文件
现在 GOOGLE 的搜索结果中包括了 PDF 文件。尽管 PDF 文件不如 HTML 文件那么多,但他们经常具备一些其他文件不具备的高质量信息
为了显示一个搜索结果是 PDF 文件而不是网页, PDF 文件的标题开头显示蓝色文本。
这就是让你知道 ACRTOBAT READER 程序会启动来阅读文件
如果你的计算机没装有该程序,计算机会指导你去能免费下载该程序的网页。
使用 PDF 文件时,相关的网页快照会由“ TEXT VERSION ”代替,它是 PDF 文档的复制文件,该文件除去了所有格式化命令。
如果你在没有 PDF 链接的情况下想看一系列搜索结果,只要在搜索栏中打上 -inurldf 加上你的搜索条件。

3 、股票报价
用 Google 查找股票和共有基金信息,只要输入一个或多个 NYSE , NASDAQ , AMEX 或
共有基金的股票行情自动收录机的代码,也可以输入在股市开户的公司名字。
如果 Google 识别出你查询的是股票或者共有基金,它回复的链接会直接连到高质量的金融信息提供者提供的股票和共有基金信息。
在你搜索结果的开头显示的是你查询的股市行情自动收录器的代码。如果你要查找一家公司的名字(比如, INTEL ),请查看“股票报价”在 Google 搜索结果的金融栏里会有那个公司的主页的链接(比如, WWW.INTEL.COM )。
Google 是以质量为基础来选择和决定金融信息提供者的,包括的因素有下载速度,用户界面及其功能。

4 、找找谁和你链接
有些单词如果带有冒号就会有特殊的意思。比如 link :操作员。查询 link:siteURL ,就会显示所有指向那个 URL 的网页。举例来说,链接 www.Google.com 会向你显示所有指向 GOOGLE 主页的网页。但这种方法不能与关键字查询联合使用。

5 、查找站点
单词 site 后面如果接上冒号就能够将你的搜索限定到某个网站。具体做法是:在 c 搜索栏中使用 site:sampledomain.com 这个语法结构。比如,在斯坦福找申请信息,输入:
admission site:www.stanford.edu

6 、查找字典释意
查找字典释意的方法是在搜索栏中输入你要查询的内容。在我们根据要求找到所有的字典释意都会标有下划线,位于搜索结果的上面,点击链接你会找到字典提供者根据要求给出的相关定义。 7 、用 GOOLGE 查找地图
想用 Google 查找街区地图,在 Google 搜索栏中输入美国街区地址,包括邮递区号或城市 / 州(比如 165 大学大街 PALO ALTO CA )。通常情况下,街区地址和城市的名字就足够了。
当 Google 识别你的要求是查找地图,它会反馈给你有高质量地图提供者提供的链接,使你直接找到相关地图。我们是以质量为基础选择这些地图提供者。值得注意的是 Google 和使用的地图信息提供者没有任何关联。

Read More...

一个北大学子毕业后的14点感悟【转】

    1,我刚工作的时候,在一家小公司,很小很小的。和我一起进去的另外2个都是普通一点 的学校的。我们刚去的时候,基本上有了电话都是我站起来跑过去接,其它人根本就不动身。以至于到了后来,电话一响,如果我不起身,大家就会一直等着,一直 等到我终于忍不了了起身去接。每天下班以后,我要检查办公室的垃圾袋,看看是不是需要把垃圾袋提走。而其他人,比如老员工和另外的实习生,他们根本不会去 提垃圾袋。

  2,工作形势非常严峻。尤其是对于刚毕业的学生。如果是大公司,它们可能有能力支 付生手的培训时间和金钱,也有能力承受生手因不熟悉业务而给公司带来的损失,但是对于绝大部分小公司,它们根本就不愿意或者说无法承受这些。所以在一个大 专毕业的熟手和一个北大毕业的生手中间,他们宁可选择前者。

  3,中关村乃至海淀乃至北京,是一个廉价高等教育人才市场。这个大环境决定了我们 在用人单位眼里,都是金属,而不是金子。在这里,大学生就是廉价劳动力,商人看刚毕业的大学生的感觉,和建筑工地上包工头看民工的眼光没有任何区别。尤其 在以赚钱为唯一目的的大部分小公司。所以,刚毕业的同学最需要做的,就是赶紧让自己成为一个熟工。

  4,在学校的时候,好好享受自尊的感觉。有人说,他读大学的时候,以为他毕业后要 变成一条狗只需要3年的时间,但是工作后,他发现对自己真是太不自信了,其实要变成一条狗根本不用3年,半年就足够了。这话是我大4时看见的,过了2年 后,我发现这条伟大真理完全可以和牛顿定律媲美。我们在北大里,享受的是中国最大的自由和民主,这是个可怕的甜蜜。因为当你第一次受到指着鼻子的责骂时你 一下子无法接受。

  5,你在北大的时候,可能会觉得某人很俗。离开北大的时候,你可能会立志你绝对不 要俗。但是过了几年后,你会发现只有那些完成了由不俗到俗的成功转变的同学才能衣着不俗地参加聚会,而那些尚未完成转变的同学则可能潦倒落魄地出现在你面 前。所以,当你在学校的时候,千万不要讥笑(哪怕是在心里)身边那些俗又俗的同学,因为他们很可能就是将来同学聚会上的主角,也是你mm对你进行再教育的 榜样。

  6,在我们所受到的教育里,师长一直告诉我们要诚实、对人真诚。还有,中国的老话 叫“买卖不成仁义在”。这在企业竞争已经到人性化程度的西方世界可能还是真理,但是在现在的中国商场上那是……胡说。举个例子吧,我的诚实让公司失去了一 个客户,让我个人赢得了一个朋友;当这个朋友因我的诚实而给我带来一个大买卖时,我已经被公司老板因那次业务失败而炒了鱿鱼;所以最后我把这宗大买卖带到 了新服务的公司。

  这件事的结果最后是好的;但是这只是一个幸运的偶然。我想大部分人不会这么幸运。 工作以后,如果你每天统计一下,你会惊讶于自己现在从早晨走进办公室的那一刻起就开始说假话。这假话对同事说、对老板说、对客户说、一直说到家里,如果你 的女友or男友还没有工作,而是留在学校上研上博(就像我的情况),你会让他们大为震惊,他们很可能悲痛欲绝地对你说“你怎么能这么说?”然后,你可能更 加愤慨地对她or他说:“这只是交际的手段/业务的需要/如果你能给我提供一个饭碗我肯定不这么说……”最后的最后,你们很可能对彼此失望,比如,对方觉 得你变了;你觉得对方toonaive,toosimple,不理解你。

  7,当你还在学校的时候,平时有空多看几部白痴一点幼稚一点的片子,比如《流星花 园》那种。当年我对此嗤之以鼻,现在我一想起一个宿舍的女生围着一台破电脑看它的情景我就鼻子发酸!!!!现在我们已经没什么心思能沉在一部片子里耐心地 看下去了,偶尔看看电视,就是拿着遥控器拼命跳台。

  8,当你还在学校的时候,多去上上课,少在宿舍打游戏睡觉。多看看那些底高望重的老教授,没问题也找几个出来问问吧,就当小时候听奶奶讲故事。因为,工作 以后就不要指望谁这么耐心给你讲东西了,老板要是让你做啥,不懂的话千万别问!自己想办法查!不要以为像在学校一样,好问是美德!你多问几句,脾气好的老 板会不理你,晾着你知道你自己讪讪地走开,脾气稍微不好地老板会对你阴阴地说:“你们北大的就这素质?这都不会?”你可能会心里喊冤:“拜托!我接触这项 业务才2天,我不问我怎么知道?”你这么想就错了。老板要的是结果,不是过程。他管你怎么做到的,总之你做到了才算完。我现在每想到大学时候不少次我都在 课堂上睡觉,我就觉得特别对不起讲堂上的老师。

  9,当你还在学校的时候,能谈恋爱就谈场恋爱,那时候谈恋爱才叫谈恋爱!你的她很 可能只是因为喜欢你而跟你谈恋爱;你们可能大夏天一起挤公交去动物园,在臭气烘烘的车厢里晃来晃去都是一种甜蜜一种幸福;工作以后你就别指望了!如果她跟 你谈了3年你还没有能买房能加薪的迹象,你就完蛋了!如果你跟她谈了3年你还没有能买房能跟她结婚的迹象,你也完蛋了,你可能会开始怀疑你是不是在耽误她 的青春她的时间。那时候你们一起再坐公交车,你都会觉得心酸:你堂堂一个北大男子汉,还要让lp挤公交车!

  10,当你还在学校的时候,多原谅舍友的小过失。不要因为她or他不小心把一杯水 泼在你的英语词典上就对她or他生气甚至要求赔偿;不要因为她or他的臭袜子忘记从你床上拿走你就对别人抱怨!不要因为她or他借了你2块钱买水果一直忘 记还就在意。不要不要因为她or他的无意中的缺点或失误而对他生气。当你工作以后,你会发现其实他们原来并没有那么讨厌,你会惊讶当初你干吗总是为这种事 情而生气,你会慢慢忘记他们的不好而只记得当初你们床头夜话时的温馨、买一包零食回来大家一起吃的开心。当你刚上大学的时候,你可能感叹过真心朋友只有在 高中才交得到;但当你工作以后你会发现,大学才最可能交到一辈子的能互相倾诉互相帮忙的朋友!
  11,如果你是女生,当你还在学校的时候,多体谅那些你不喜欢甚至讨厌但是狂追你 的男生!因为无论你多讨厌他,毕竟他们是真心喜欢你的,在他们眼里,你很可能就是天使!而在工作后,你在老板看来,很可能你只不过是狗屎!人的一生中没有 多少机会得到一些最真最纯的东西,很多年后那些看起来又矮又丑的男生可能结婚成家,你很可能已经被世事磨得没有知觉,而当你再和他们相遇,你很可能会突然 发现他们原来这么好、这么好、这么这么好,原来他们一点都不丑……你会很想很想哭!

  12,当你在学校的时候,多读一点书,少上网做一些没有意义的东西,比如灌水比如 聊qq!因为你一旦离开校园,你就很可能顶多只有读读《瑞丽》《成都今夜将我遗忘》这样的垃圾杂志和快餐书,而不再有机会去想万圣和风入松!更不会有机会 有时间有气氛去看那里的书!我在大2的时候,曾经惊觉我读的名著基本上停留在高中时代,而当我工作后我发现我读过的书完全停留在大学毕业以前!

  13,当你还在学校的时候,你可能为那些该死的偷车贼而痛不欲生咬牙切齿,你可能 会在临上课前5分钟才起床,然后慢悠悠散步去上课;当工作以后,你最大的可能就是每天6点起床,在沙丁鱼罐头一样的公交车里焦急地等待你的公交车在堵车长 龙里挤牙膏一样一点一点地往前爬;当你因某天某段路发生交通事故而迟到了5分钟却因为老板还没来而庆幸时,很可能某个你的亲密同事已经在准备报告给老板 了。当你晚上再经历同样的堵车回到家想看点书时,你很可能发现时钟已经指到9了,而你这时候很可能还没吃饭!

  14,如果你是女生,当你还在学校的时候,不要为了减肥而 生饿自己把自己弄出胃病来!因为你会发现一旦你有了胃病而后工作你会郁闷todeath!你在学校的时候,很可能因为某天例假来了而轻易就选择不去上课, 而当你工作后,哪怕你痛得浑身发凉你也可能强迫自己不请假!因为你要把一年里有限的几个请假机会留给你最最需要的时候!在学校的时候,你可能觉得在苗条和 健康中你会选择前者,等到你工作了,你会发现,健康才是人生最大的财富!

Read More...

星期一, 一月 28, 2008

Linux启动时间的极限优化

  在上次完成嵌入式应用的Linux裁减后, Linux的启动时间仍需要 7s 左右,虽然勉强可以接受,但仍然没有达到我个人所追求的目标——2s 以内。况且,在实际的商用环境中,设备可靠性的要求可是“5个9”(99.999%,即OOS时间低于5分钟/年),这就意味着每减少一秒钟Linux启 动(设备复位)时间,对可靠性都是一个明显的提升。

  言归正传,如何着手对Linux的启动时间进行优化呢?

  CELF(The Consumer Electronics Linux Forum)论坛为我们指引了一个方向。

(1)首先是对Linux启动过程的跟踪和分析,生成详细的启动时间报告。

  较为简单可行的方式是通过PrintkTime功能为启动过程的所有内核信息增加时间戳,便于汇总分析。PrintkTime最早为CELF所 提供的一个内核补丁,在后来的Kernel 2.6.11版本中正式纳入标准内核。所以大家可能在新版本的内核中直接启用该功能。如果你的Linux内核因为某些原因不能更新为2.6.11之后的版 本,那么可以参考CELF提供的方法修改或直接下载它们提供的补丁:http://tree.celinuxforum.org/CelfPubWiki/PrintkTimes

  开启PrintkTime功能的方法很简单,只需在内核启动参数中增加“time”即可。当然,你也可以选择在编译内核时直接指定 “Kernel hacking”中的“Show timing information on printks”来强制每次启动均为内核信息增加时间戳。这一种方式还有另一个好处:你可以得到内核在解析启动参数前所有信息的时间。因此,我选择后一种 方式。

  当完成上述配置后,重新启动Linux,然后通过以下命令将内核启动信息输出到文件:

dmesg -s 131072 > ktime

  然后利用一个脚本“show_delta”(位于Linux源码的scripts文件夹下)将上述输出的文件转换为时间增量显示格式:

/usr/src/linux-x.xx.xx/scripts/show_delta ktime > dtime

  这样,你就得到了一份关于Linux启动时间消耗的详细报告。

(2)然后,我们就来通过这份报告,找出启动中相对耗时的过程。

  必须明确一点:报告中的时间增量和内核信息之间没有必然的对应关系,真正的时间消耗必须从内核源码入手分析。

  这一点对于稍微熟悉编程的朋友来说都不难理解,因为时间增量只是两次调用printk之间的时间差值。通常来说,内核启动过程中在完成一些耗时 的任务,如创建hash索引、probe硬件设备等操作后会通过printk将结果打印出来,这种情况下,时间增量往往反映的是信息对应过程的耗时;但有 些时候,内核是在调用printk输出信息后才开始相应的过程,那么报告中内核信息相应过程的时间消耗对应的是其下一行的时间增量;还有一些时候,时间消 耗在了两次内核信息输出之间的某个不确定的时段,这样时间增量可能就完全无法通过内核信息反应出来了。

  所以,为了准确判断真正的时间消耗,我们需要结合内核源码进行分析。必要的时候,例如上述第三种情形下,还得自己在源码中插入printk打印,以进一步确定实际的时间消耗过程。

  以下是我上次裁减后Linux内核的启动分析:

  内核启动总时间: 6.188s

  关键的耗时部分:
  1) 0.652s - Timer,IRQ,Cache,Mem Pages等核心部分的初始化
  2) 0.611s - 内核与RTC时钟同步
  3) 0.328s - 计算Calibrating Delay(4个CPU核心的总消耗)
  4) 0.144s - 校准APIC时钟
  5) 0.312s - 校准Migration Cost
  6) 3.520s - Intel E1000网卡初始化

  下面,将针对上述各部分进行逐一分析和化解。

(3)接下来,进行具体的分项优化。

  CELF已经提出了一整套针对消费类电子产品所使用的嵌入式Linux的启动优化方案,但是由于面向不同应用,所以我们只能部分借鉴他们的经验,针对自己面对的问题作出具体的分析和尝试。

  内核关键部分(Timer、IRQ、Cache、Mem Pages……)的初始化目前暂时没有比较可靠和可行的优化方案,所以暂不考虑。

  对于上面分析结果中的 2、3 两项,CELF已有专项的优化方案:“RTCNoSync”和“PresetLPJ”。

  前者通过屏蔽启动过程中所进行的RTC时钟同步或者将这一过程放到启动后进行(视具体应用对时钟精度的需求而定),实现起来比较容易,但需要为 内核打补丁。似乎CELF目前的工作仅仅是去掉了该过程,而没有实现所提到的“延后”处理RTC时钟的同步。考虑到这个原因,我的方案中暂时没有引入这一 优化(毕竟它所带来的时间漂移已经达到了“秒”级),继续关注中。

  后者是通过在启动参数中强制指定LPJ值而跳过实际的计算过程,这是基于LPJ值在硬件条件不变的情况下不会变化的考虑。所以在正常启动后记录下内核信息中的“Calibrating Delay”数值后就可以在启动参数中以下面的形式强制指定LPJ值了:

lpj=9600700

  上面分析结果中的 4、5 两项都是SMP初始化的一部分,因此不在CELF研究的范畴(或许将来会有采用多核的MP4出现?……),只能自力更生了。研究了一下SMP的初始化代 码,发现“Migration Cost”其实也可以像“Calibrating Delay”采用预置的方式跳过校准时间。方法类似,最后在内核启动参数中增加:

migration_cost=4000,4000

  而Intel的网卡驱动初始化优化起来就比较麻烦了,虽然也是开源,但读硬件驱动完全不比读一般的C代码,况且建立在如此肤浅理解基础上的“优 化”修改也实在难保万全。基于可靠性的考虑,我最终在两次尝试均告失败后放弃了这一条路。那么,换一个思维角度,可以借鉴CELF在 “ParallelRCScripts”方案中的“并行初始化”思想,将网卡驱动独立编译为模块,放在初始化脚本中与其它模块和应用同步加载,从而消除 Probe阻塞对启动时间的影响。考虑到应用初始化也可能使用到网络,而在我们的实际硬件环境中,只有eth0是供应用使用的,因此需要将第一个网口初始 化的0.3s时间计算在内。

  除了在我的方案中所遇到的上述各优化点,CELF还提出了一些你可能会感兴趣的有特定针对性的专项优化,如:

  ShortIDEDelays - 缩短IDE探测时长(我的应用场景中不包含硬盘,所以用不上)
  KernelXIP - 直接在ROM或Flash中运行内核(考虑到兼容性因素,未采用)
  IDENoProbe - 跳过未连接设备的IDE口
  OptimizeRCScripts - 优化initrd中的linuxrc脚本(我采用了BusyBox更简洁的linuxrc)

  以及其它一些尚处于设想阶段的优化方案,感兴趣的朋友可以访问CELF Developer Wiki了解详情。

(4)优化结果

  经过上述专项优化,以及对inittab、rcS脚本的冗余裁减,整个Linux内核的启动时间从优化前的 6.188s 下降到了最终的 2.016s,如果不包含eth0的初始化,则仅需 1.708s(eth0初始化可以和系统中间件及部分应用加载并行),基本达到了既定目标。与Kexec配合,可以大大降低软件故障导致的复位时间,有效的提升了产品的可靠性。

  大家如果对内核启动时间的优化还有什么建议或疑惑,都欢迎与我探讨。:)

Read More...

嵌入式应用Linux裁减的初次尝试

  前段时间因为嵌入式应用开发的需要,对Linux进行了一次大幅度的裁减。由于是初次接触Linux启动的核心部分,所以基本上还是对网上各种裁减方案的拼凑和整理,包含自己理解的部分实在很少。总的来说效果不算理想,后面还有很长的路要走。

这里就大致说说目前这个Linux裁减方案的“雏形”吧。

  1. 内核裁减

对Linux内核部分的裁减主要根据实际需求进行了重编译,去掉了大部分用不上的特性,以及实际硬件环境之外的设备驱动。这一过程没啥技术含量,就不细说了。

2. initrd改造

常规的Linux系统启动过程中,initrd仅仅充当一个临时的rootfs,在加载实际的rootfs后即被卸载或转移。出于精简的考虑,我将 原rootfs并入了initrd,让它直接充当rootfs,以节省启动时间,并减小体积。(这个改造方案相对来说最简单,也足以满足实际需要)

改造的过程主要是基于原make install自动生成的initrd镜像之上,进行以下“手术”:

(1) 用BusyBox的linuxrc替代原initrd中的初始化脚本,并将原linuxrc脚本中有用得上的初始化任务都合并至etc/inittab中,以节省启动时间。

(2) 因为要充当rootfs,所以还需为initrd添加Linux启动及运行所必须的一些文件夹和文件(主要复制自原rootfs):

/dev
tty3 - tty10 终端会话设备(Console登录使用)
ttyS0、ttyS1 串口终端设备(串口登录使用)
ptmx、pts 虚拟终端设备(远程登录使用)
/etc
fstab 加载设备的配置文件(后面详述)
gettydefs 仅保留Virtual Console一项
group 仅保留root对应的项
hostname 包含本机的主机名
inittab 初始化脚本(后面详述)
issue 包含本机的全程登录欢迎文字
passwd 仅保留root对应的项
shadow 仅保留root对应的项
termcap 仅保留用于本地console及远程登录的配置项
/etc/init.d
rcS 次级初始化脚本(后面详述)
/lib
libcrypt.so.1 登录认证(login)所需的库文件
/mnt
/proc
/sys
/tmp
/usr
/var

(3) 修改etc/fstab存储设备加载配置文件,只包含下面四行:

sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
tmpfs /dev/shm tmpfs size=512m 0 0
devpts /dev/pts devpts defaults 0 0

由于实际硬件环境的内存比较大,所以给临时文件系统分配的内存上限比较充裕

(4) 创建etc/inittab初始化脚本。由于init模块采用了BusyBox的精简版本,而它采用的inittab文件格式较普通版本有一些区别,所以特别按照BusyBox的格式重新编写了。文件较大,下面仅列举其中的关键部分:

::sysinit:/bin/mount -a 加载etc/fstab中配置的所有存储设备
::sysinit:/bin/mkdir /dev/shm/var 在tmpfs中划分用作var的部分
::sysinit:/bin/mkdir /dev/shm/tmp 在tmpfs中划分用作tmp的部分
::sysinit:/bin/chmod 1777 /dev/shm/var 修改var为合适的权限
::sysinit:/bin/chmod 1777 /dev/shm/tmp 修改tmp为合适的权限
::sysinit:/bin/mount --bind /dev/shm/var /var 将/var绑定到tmpfs中
::sysinit:/bin/mount --bind /dev/shm/tmp /tmp 将/tmp绑定到tmpfs中

::sysinit:/bin/hostname -F /etc/hostname 从etc/hostname中读取并设置主机名
::sysinit:/sbin/ifconfig lo 127.0.0.1 up 配置IP环回界面
::sysinit:/sbin/telnetd 启动Telnet Daemon
::sysinit:/etc/init.d/rcS 调用次级初始化脚本(完成不能在inittab中进行的初始化任务)

::sysinit:/bin/mkdir /var/log 创建日志文件夹
::sysinit:/bin/touch /var/log/messages 创建日志文件
::respawn:/sbin/syslogd -n -m 30 -C 加载循环缓冲模式的系统日志daemon
::respawn:/sbin/klogd -n

::askfirst:/bin/login 在console创建登录进程
tty2::askfirst:/bin/login 在tty2-tty6上创建额外的登录进程
tty3::askfirst:/bin/login
...
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 在串口COM1上创建登录进程
tty10::respawn:/sbin/logread -f 将所有日志打印输出到tty10

(5) 创建etc/init.d/rcS次级初始化脚本,包含以下内容:

/bin/mount -o remount,rw / 将rootfs重新加载为可读可写方式

注:由于试验的方便,生成的initrd采用了Ext2文件系统。在实际应用中考虑换为CRAMFS(压缩ROM镜像文件系统),以进一步缩减镜像文件体积并提高读取效率。

3. Boot Loader修改

由于这个裁减方案仅仅使用了内核镜像及initrd,保持了与标准引导方式的高度兼容,因此适用于几乎任何Boot Loader。由于裁减实验中需要频繁替换内核和initrd镜像,因此使用了便于控制的GRUB,以提高实验效率。如果最终方案采取Flash作为镜像 载体,则建议使用LILO,以提高兼容性并节省空间。
为了与本方案中以initrd作为rootfs保持一致,Boot Loader的配置文件中需要修改引导参数,指定“root=/dev/ram0”,无需其它额外的参数。

经过上述裁减,整个Linux的启动时间已经缩短到10s以内。内核+initrd的镜像大小也不足3M,基本达到了预期的目标。后续会针对启动的各个环节作进一步的分析和优化,以期进一步缩短启动时间。

Read More...

2.6的Kernel LOGO真容易改

试着改了一下,似乎比2.4容易。2.6的logo数据在/drivers/video/logo里,ppm文件就是logo图像了。每个ppm对应一 个.c文件,内容大概就是图像尺寸、调色板、位图数据等信息。.c文件无需自己建立,在make的时候如果不存在某个ppm文件对应的.c文件,就会自动 从ppm生成一个,然后把它编译成.o文件。所以看看目录下哪些.ppm文件有同名的.o文件,就说明那个logo被编译进了kernel。标准的224 色logo是logo_linux_clut224.ppm,因此修改这个图片就可以实现修改logo了。 在windows下,可以用PaintShopProX直接打开ppm进行编辑,编辑完毕后用decrease color depth命令降为224色,然后保存,把logo_linux_clut224.c删掉,重新make就可以了。这个是我昨晚随便改的logo :


在 深入一点点。很容易发现,对于一般的vga console,logo是由drivers/video/fbmem.c里的fb_show_logo()函数显示的,这个函数的调用者是 drivers/video/console/fbcon.c(跟2.4差不多,嗯)。这个函数做的事情不多,就是先把非8位色深的位图转换为8位色深, 然后用info->fbops->fb_imageblit(info, &image);把logo显示出来,有一个cpu时显示一个logo,有2个cpu时显示2个,以此类推。
略加修改,就可以实现将logo居中显示,并加入一个“重复显示右边界”,也就是把logo最右边4个点宽的区域作为背景填充到整个logo bar。diff如下:

--- /gs2e/source/linux26-2edev/drivers/video/fbmem.c2006-08-29 14:07:15.000000000 +0800
+++ ./fbmem.c2006-09-27 20:40:08.000000000 +0800
@@ -375,9 +375,9 @@
int fb_show_logo(struct fb_info *info)
{
u32 *palette = NULL, *saved_pseudo_palette = NULL;
-unsigned char *logo_new = NULL;
-struct fb_image image;
-int x;
+unsigned char *logo_new = NULL, *border = NULL;
+struct fb_image image, imageborder;
+int x, xoffset;

/* Return if the frame buffer is not mapped or suspended */
if (fb_logo.logo == NULL || info->state != FBINFO_STATE_RUNNING)
@@ -421,12 +421,45 @@
image.height = fb_logo.logo->height;
image.dy = 0;

+#ifdef CONFIG_LOGO_REPEAT_RIGHT
+border = kmalloc(4 * fb_logo.logo->height, GFP_KERNEL);
+if (border != NULL){
+ for (x = 0; x < fb_logo.logo->height; x++){ /* use x as y */
+*((u32 *)border + x) = /* will repeat 4 pixels of the right side*/
+*(u32 *)(image.data + (x+1)*fb_logo.logo->width - 4);
+ }
+ imageborder.depth = 8;
+ imageborder.data = border;
+ imageborder.width = 4;
+ imageborder.height = image.height;
+ imageborder.dy = 0;
+ for (x = 0; x < info->var.xres; x+=4){
+imageborder.dx = x;
+info->fbops->fb_imageblit(info, &imageborder);
+ }
+ kfree(border);
+}
+#endif
+#ifndef CONFIG_CENTER_LOGO
+xoffset = 0;
for (x = 0; x < num_online_cpus() * (fb_logo.logo->width + 8) &&
x <= info->var.xres-fb_logo.logo->width; x += (fb_logo.logo->width + 8)) {
image.dx = x;
info->fbops->fb_imageblit(info, &image);
}
-
+#else
+xoffset = (info->var.xres - num_online_cpus() * (fb_logo.logo->width + 8))>>1;
+if (xoffset<0)xoffset = 0;
+ for (x = xoffset; x < num_online_cpus() * (fb_logo.logo->width + 8) + xoffset &&
+ x <= info->var.xres-fb_logo.logo->width+xoffset; x += (fb_logo.logo->width + 8)) {
+ image.dx = x;
+ info->fbops->fb_imageblit(info, &image);
+}
+#endif
kfree(palette);
if (saved_pseudo_palette != NULL)
info->pseudo_palette = saved_pseudo_palette;
我在这里定义了两个配置变量,CONFIG_LOGO_REPEAT_RIGHT和CONFIG_CENTER_LOGO,修改/drivers/video/logo/Kconfig,加上:
config CENTER_LOGO
bool "Center logo"
depends on LOGO
default n
config LOGO_REPEAT_RIGHT
bool "Repeat the right border (4 pixels)"
depends on LOGO
default n
这样就可以在make menuconfig之类的界面中设置是否开启这两项功能了。 更多关于logo hack的信息,可以参考: http://gentoo-wiki.com/HOWTO_Linux_Logo_Hack

Read More...

[Linux] 更換Linux Boot up Logo

2.4 kernel 需要浩大工程才能完成的 Logo更換, 沒想到在2.6 中是
a piece of cake....
如何換咧?

別吵!! 準備好飲料爆米花, silence your mobile phone, 我們正式開始.

1. 到http://kernel.org下載2.6 kernel, 目前已經到2.6.11.4了!

2. 準備好美美的圖片, 使用png 格式, 顏色要少於224, 此例是使用1024x80.
使用pngtopnm及pnmtoplainpnm這兩個tool來轉換
pngtopnm my_logo.png | pnmtoplainpnm > logo_linux_clut224.ppm
cp logo_linux_clut224.ppm /your_kernel_source/drivers/video/logo/

3. Untar kernel source code後, 執行 make menuconfig
Graphics Support ->
[*] Support for frame buffer devices
[*] VESA VGA graphics support

Console display driver support ->
[*] Video mode selection support

<*> Framebuffer Console support

[*]Select compiled-in fonts
[*]VGA 8x16 font

Logo configuration->
[*]Bootup logo
[*] Standard 224-color Linux logo

4. 接下來就是compile kernel囉, 這都不會就收工了 =.=|||
make bzImage

5. 選好心儀的bootloader, 在append 參數中, 加上 'vga=0x318' 會設定
開機時使用1024x768 24bit的模式.

6. 開機試試囉... Enjoy yourself ^_^

Read More...

lInux下修改logo

但你如果想在LCD上显示自己的Logo,那下面我介绍一下自定义Logo的方法:
    (1)进入
linuxkde图形界面,使用The  GIMP 图像编辑器打开你想要的图像文件,依次选择图像->模式->索引颜色,将颜色改为224色;至于图片大小,不要大于你的显示器分辨率就好(我只试过80*80和320*240的大小),最后将文件保存为ppm格式(ASCii码),文件名为:logo_linux_clut224.ppm。
    (2)将logo_linux_clut224.ppm拷贝到/drivers/video/logo文件夹下,替换原有的文件(记得备份啊,以防万一)。
    (3)重新编译内核,tftp到开发板启动。

Read More...

linux启动logo修改

本文针对的嵌入式系统为Intel Xscale pxa255 400MHz, Linux OS.

一般的嵌入式系统刚启动时,在显示屏的左上方都会出现一个小企鹅的logo,如何才能将该logo改为我们喜欢的图片,比如自己的照片,风景或公司的图标呢,下面给出了答案.虽然本文针对的是嵌入式系统,但对PC机系统也是一样的.

1)首先下载linux progress project软件包lpp-0.4.2.tar.gz,解压,在contrib的boot_logo目录中运行make,生成boot_logo工具;

2)将要在启动时显示的图片用GIMP打开,另存为origin.pcx格式文件;
3)运行#convert -colors 214 -dither -resize 640x480 origin.pcx converted.pcx生成214色,640x480的pcx文件,
注意不要生成800x600的格式,这种情况下生成的内核会死机,可能是因为内核太大,将存放文件系统的Flash给Erase掉的缘故;
4)运行./boot_logo convertd.pcx linux_logo.h生成linux_logo文件,将它拷贝到/include/linux/目录下,
修改drivers/video/fbcon.c为
#define LOGO_H 480
#define LOGO_W 640
重新编译内核即可.

Read More...

星期六, 一月 26, 2008

2410 第七章 时钟和电源管理

概述

时钟和电源管理模块由3部分组成:时钟控制、USB控制、电源控制。

时钟控制部分产生3种时钟信号:CPU用的FCLK,AHB总线用的HCLK,APB总线用的PCLK
2个锁相环,一个用于FCLK HCLK PCLK,另一个用48MHzUSB时钟。可以通过不使能锁相环来达到慢速省电目的。

电源管理模块提供了4种模式: Normal模式、Slow模式、Idle模式、Power_Off模式。
Normal Mode

该模式下如果所有外围设备都打开时电流消耗最大,允许用户通过软件关闭外围设备达到省电目的。

Slow Mode

不采用PLL的模式,能量消耗仅取决于外时钟的频率。由外部提供的时钟源作FCLK

Idle Mode

关掉了给cpuFCLK时钟,但外围设备时钟仍存在,任何到CPU的中断请求可以将cpu唤醒。

Power_off Mode

这种模式关掉了内部供电,仅有给wake_up部分的供电还存在。可以通过外部中断或实时时钟中断可以唤醒。

功能描述

时钟结构:主时钟源来自外部晶振XTlpll或外部时钟EXTCLK

时钟源选择:通过OM[3: 2]的高低电平选择,现在我们采用00OM[32]的状态在nRESET的上升沿锁存。尽管MPLL在上电复位后就开始工作,但是MPLL输出不作为系统时钟,只有对MPLLCON写入适当的数值后才可以。即使用户不想改变MPLLCON的值,也要重新写一遍才能使其起作用。

时钟控制逻辑:时钟控制逻辑决定要使用的时钟源,当锁相环被设置为一个新的值时,时钟控制逻辑切断FCLK直到PLL输出稳定。时钟控制逻辑在上电复位或从power_down状态启动时使能。

上电复位:注意上电后必须通过设置PLLCON才能使PLL作用。

在正常操作状态下改变PLL设置:通过改变PMS的值来实现。

USB时钟控制:UCLK不起作用直到UPLL被设置。

FCLK、HCLK、PCLK:可以通过HDIVNPDIVNCLKDIVN来改变3种时钟的比率,推荐采用124的比率。在设置完PMS的值后,需要设置CLKDIVN寄存器,该寄存器设置的值在PLL锁定后生效,只需要1.5HCLK即可完成比率的修改。

电源管理:4种模式及特点。

Power_Off模式:外部中断EINT[15:0]RTC alarm中断可以从该模式wakeup.

进入PowerOff模式的流程:1。将GPIO端口设置为适当的状态; 2……….

VDDiVDDiarm的控制:PowerOff模式,仅VDDiVDDiarm通过PWREN管脚控制被关闭。如果PWREN为高,VDDiVDDiarm被外部电源提供,如果为低则关闭。尽管VDDiVDDiarmVDDi_MPLLVDDi_UPLL可能被关闭,其他电源必须被提供。

EINT[15:0]启动信号: EINTn管脚必须被设置为中断管脚,在启动后,相应的EINTn管脚将不被用作启动,可以被用作外部中断请求。

电池故障信号(nBATT_FLT):cpu不在PowerOff模式时,nBATT_FLT将要引起低电平触发的中断。当在PowerOff模式时,nBATT_FLT信号将会禁止芯片从PowerOff模式启动,故所有的wakeup信号被屏蔽,此举用来保护系统电量低时不出现故障。

时钟和电源管理部分寄存器

LOCKTIME: UPLLMPLL 锁定时间的计数值。

MPLLCON UPLLCON:这两个寄存器都有MDIV PDIV SDIV设置,对于输入12M的晶振,有相应的推荐值,产生200M和48M的频率。

CLKCON: 为各种外围接口提供时钟。

CLKSLOW: 是否打开2个PLL。

CLKDIVN: 设置FCLKHCLKPCLK比率的寄存器。


Read More...

星期五, 一月 25, 2008

Best of Vim Tips 中文版

每个想深入学习 Vim 用户都会认真阅读的文章,官网链接:http://www.rayninfo.co.uk/vimtips.html

这篇文章被很多人翻译过,但那是都很早了,所在原来的一系列翻译的基础上修正原来翻译欠妥的,错误的,以及近两年更新的内容。


__BEGIN__

------------------------------------------------------------------------------
# searching 查找
/joe/e                      : cursor set to End of match
                              把光标定位在匹配单词最后一个字母处
/joe/e+1                    : cursor set to End of match plus 1
                              把光标定位在匹配单词最后一个字母的下一个字母处
/joe/s-2                    : cursor set to Start of match minus 2
                              把光标定位在匹配单词第一个字母往前数两个字母的位置
/^joe.*fred.*bill/          : normal
                              标准的正则表达式
/^[A-J]\+/                  : search for lines beginning with one or more A-J
                              查找以一个或多个 A-J 中的字母开头的行
/begin\_.*end               : search over possible multiple lines
                              查找在 begin 和 end 两个单词之间尽可能多的行
/fred\_s*joe/i              : any whitespace including newline
                              查找在 fred 和 joe 两个单词之间任意多的空格,包括新行
/fred\|joe                  : Search for FRED OR JOE
                              查找 fred 或 joe
/\([^0-9]\|^\)%.*%          : Search for absence of a digit or beginning of line
                              查找
/.*fred\&.*joe              : Search for FRED AND JOE in any ORDER!
                              查找同时包含 FRED 和 JOE 的行,不分前后顺序
/\<fred\>/i              : search for fred but not alfred or frederick
                              查找 fred, 而不是 alfred 或者 frederick,也就是全字匹配
/\<\d\d\d\d\>            : Search for exactly 4 digit numbers
                              查找4个数字的全字匹配
/\D\d\d\d\d\D               : Search for exactly 4 digit numbers
                              查找4个数字的全字匹配
/\<\d\{4}\>              : same thing
                              同上

# finding empty lines 查找空行
/^\n\{3}                    : find 3 empty lines
                              查找 3 行空行
# Specify what you are NOT searching for (vowels)
# 指定不要查找什么
/\c\v([^aeiou]&\a){4}       : search for 4 consecutive consanants

# using rexexp memory in a search
# 在查找中使用正则表达式存储
/\(fred\).*\(joe\).*\2.*\1

# Repeating the Regexp (rather than what the Regexp finds)
# 重复正则表达式
/^\([^,]*,\)\{8}

# visual searching
# 可视模式下的查找
:vmap // y/<C-R>"<CR>       : search for visually highlighted text
                                     查找被高亮显示的文本
:vmap <silent> //    y/<C-R>=escape(@", '\\/.*$^~[]')<CR><CR> : with spec chars

# searching over multiple lines \_ means including newline
# 查找多行。\_ 表示包括新行
/<!--\_p\{-}-->                : search for multiple line comments
                                     查找多行注释
/fred\_s*joe/i                    : any whitespace including newline
                                     查找在 fred 和 joe 两个单词之间任意多的空
格,包括新行
/bugs\(\_.\)*bunny                : bugs followed by bunny anywhere in file
                                     bugs 后任意位置含有 bunny 单词的多个行
:h \_                             : help
                                     帮助

# search for declaration of subroutine/function under cursor
# 查找光标下子程序/函数的声明
:nmap gx yiw/^\(sub\<bar>function\)\s\+<C-R>"<CR>

# multiple file search
# 在多个文件中查找
:bufdo /searchstr
:argdo /searchstr

# How to search for a URL without backslashing
# 如何不使用反斜线查找 URL
?http://www.vim.org/        : search BACKWARDS!!! clever huh!
----------------------------------------
# substitution
# 替换
:%s/fred/joe/igc            : general substitute command
                               普通替换命令
:%s/\r//g                   : Delete DOS returns ^M
                               删除 DOS 回车符 ^M

# Is your Text File jumbled onto one line? use following
# 你的文本文件是否乱七八糟的排成一行?使用如下命令
:%s/\r/\r/g                 : Turn DOS returns ^M into real returns
                               转换 DOS 回车符 ^M 为真正的回车符
:%s=  *$==                  : delete end of line blanks
                               删除行尾空格
:%s= \+$==                  : Same thing
                               同上
:%s#\s*\r\?$##              : Clean both trailing spaces AND DOS returns
                               删除行尾空格和 DOS 回车符
:%s#\s*\r*$##               : same thing
                               删除行尾空格和 DOS 回车符

# deleting empty lines
# 删除空行
:%s/^\n\{3}//               : delete blocks of 3 empty lines
                               删除三行空行
:%s/^\n\+/\r/               : compressing empty lines
                              压缩多行空行为一行

# IF YOU ONLY WANT TO KNOW ONE THING
# 如果你只想明白一件事情
:'a,'bg/fred/s/dick/joe/igc : VERY USEFUL
                               非常有用

# duplicating columns
# 复制列
:%s= [^ ]\+$=&&=            : duplicate end column
                               复制最后一列
:%s= \f\+$=&&=              : same thing
                               同上
:%s= \S\+$=&&               : usually the same
                               同上
# memory
# 记忆,或叫引用
:s/\(.*\):\(.*\)/\2 : \1/   : reverse fields separated by :
                               反转以 : 分隔的字段
:%s/^\(.*\)\n\1/\1$/        : delete duplicate lines
                               删除重复的行

# non-greedy matching \{-}
# 非贪婪匹配 \{-}
:%s/^.\{-}pdf/new.pdf/      : delete to 1st pdf only
                               只删除到第一个 pdf

# use of optional atom \?
:%s#\<[zy]\?tbl_[a-z_]\+\>#\L&#gc : lowercase with optional leading characters
                                        不懂

# over possibly many lines
# 匹配尽可能多的行
:%s/<!--\_.\{-}-->//        : delete possibly multi-line comments
                                  删除尽可能多的注释
:help /\{-}                 : help non-greedy
                               非贪婪匹配的帮助

# substitute using a register
# 使用寄存器替换
:s/fred/<c-r>a/g         : sub "fred" with contents of register "a"
                               用"a"寄存器里的内容替换"fred"
:s/fred/\=@a/g              : better alternative as register not displayed
                               更好的方法,不用显示寄存器内容

# multiple commands on one line
# 写在一行里的复杂命令
:%s/\f\+\.gif\>/\r&\r/g | v/\.gif$/d | %s/gif/jpg/

# ORing
:%s/suck\|buck/loopy/gc     : ORing (must break pipe)
                               不懂
# Calling a VIM function
# 调用 Vim 函数
:s/__date__/\=strftime("%c")/ : insert datestring
                                插入日期

# Working with Columns sub any str1 in col3
# 处理列,替换所有在第三列中的 str1
:%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2:

# Swapping first & last column (4 columns)
# 交换第一列和最后一列 (共4列)
:%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1:

# filter all form elements into paste register
# 把所有的form元素(就是html里面的form啦)放到register里
:redir @*|sil exec 'g#<\(input\|select\|textarea\|/\=form\)\>#p'|redir END
:nmap ,z :redir @*<Bar>sil exec
'g@<\(input\<Bar>select\<Bar>textarea\<Bar>/\=form\)\>@p'<Bar>redir END<CR>

# increment numbers by 6 on certain lines only
# 不懂
:g/loc\|function/s/\d/\=submatch(0)+6/

# better
# 更好的方法
:%s#txtdev\zs\d#\=submatch(0)+1#g
:h /\zs

# increment only numbers gg\d\d  by 6 (another way)
# 不懂
:%s/\(gg\)\@<=\d\+/\=submatch(0)+6/
:h zero-width

# find replacement text, put in memory, then use \zs to simplify substitute
# 查找需替换的文本,保存,然后使用 \zs 命令简单替换
:%s/"\([^.]\+\).*\zsxx/\1/

# Pull word under cursor into LHS of a substitute
# 不懂
:nmap <leader>z :%s#\<<c-r>=expand("<cword>")<cr>\>#

# Pull Visually Highlighted text into LHS of a substitute
# 不懂
:vmap <leader>z :<C-U>%s/\<<c-r>*\>/

----------------------------------------

# all following performing similar task, substitute within substitution
# Multiple single character substitution in a portion of line only

:%s,\(all/.*\)\@<=/,_,g     : replace all / with _ AFTER "all/"

# Same thing
:s#all/\zs.*#\=substitute(submatch(0), '/', '_', 'g')#

# Substitute by splitting line, then re-joining
:s#all/#&^M#|s#/#_#g|-j!

# Substitute inside substitute
:%s/.*/\='cp '.submatch(0).' all/'.substitute(submatch(0),'/','_','g')/
----------------------------------------
# global command display (see tip 227)
# 全局命令显示(参见 tip 227)
:g/fred.*joe.*dick/         : display all lines fred,joe & dick
                              显示所有包含fred,joe 和 dick 的行
:g/\<fred\>/             : display all lines fred but not freddy
                               显示所有全字匹配 fred 的行
:g/<pattern>/z#.5        : display with context
                               显示上下文
:g/<pattern>/z#.5|echo "=========="  : display beautifully
                                           显示得很漂亮
:g/^\s*$/d                  : delete all blank lines
                               删除所有的空行
:g!/^dd/d                   : delete lines not containing string
                               删除所有行首不是 dd 的行
:v/^dd/d                    : delete lines not containing string
                              同上
:g/fred/,/joe/d             : not line based (very powerfull)
                               并不基于行(非常强大)
:g/{/ ,/}/- s/\n\+/\r/g     : Delete empty lines but only between {...}
                               删除在 {...} 只见的空行
:v/./.,/./-1join            : compress empty lines
                               压缩空行
:g/^$/,/./-j                : compress empty lines
                               压缩空行
:g/<input\|<form/p    : ORing
                               不懂
:g/^/pu _                   : double space file (pu = put)
                               把文件中空行增加一倍
:g/^/m0                     : Reverse file (m = move)
                               翻转文件
:g/fred/t$                  : copy lines matching fred to EOF
                               把匹配 fred 的行拷贝到文件最后
:g/stage/t'a                : copy lines matching stage to marker a
                               把匹配 stage 的行做标记a
:%norm jdd                  : delete every other line
                               隔一行删除一行

# incrementing numbers (type <c-a> as 5 characters)
:.,$g/^\d/exe "norm! \<c-a>": increment numbers
                                  增加每行行首的数字
:'a,'bg/\d\+/norm! ^A          : increment numbers
                                  增加标记 a 到标记 b 只见每行行首的数字

# storing glob results (note must use APPEND)
# 保存全局命令的结果 (注意必须使用添加模式)
:g/fred/y A                 : append all lines fred to register a
                               添加所有为fred所匹配的行到register a
:'a,'b g/^Error/ . w >> errors.txt

# duplicate every line in a file wrap a print '' around each duplicate
# 复制每一行,然后在复制出来的每一行两侧加上一个 print '复制出来的内容'
:g/./yank|put|-1s/'/"/g|s/.*/Print '&'/

# replace string with contents of a file, -d deletes the "mark"
# 用文件中的内容替换字符串,-d 表示删除“标记”
:g/^MARK$/r tmp.ex | -d

----------------------------------------

# Global combined with substitute (power editing)
# 全局命令和替换命令联姻 (强大的编辑能力)
:'a,'bg/fred/s/joe/susan/gic :  can use memory to extend matching
                                 可以使用反向引用来匹配
:g/fred/,/joe/s/fred/joe/gic :  non-line based (ultra)

----------------------------------------

# Find fred before beginning search for joe
# 先找fred,然后找joe
:/fred/;/joe/-2,/sid/+3s/sally/alley/gIC

----------------------------------------

# Absolutely essential
# 基础

----------------------------------------
* # g* g#           : find word under cursor (<cword>) (forwards/backwards)
                       寻找光标处的狭义单词(<cword>) (前向/后向)
%                   : match brackets {}[]()
                       括号配对寻找 {}[]()
.                   : repeat last modification

matchit.vim         : % now matches tags <tr><td><script> <?php etc
                       使得 % 能够配对标记 <tr><td><script> <?php 等等
<C-N><C-P>          : word completion in insert mode
                             插入模式下的单词自动完成
<C-X><C-L>          : Line complete SUPER USEFUL
                             行自动完成(超级有用)
/<C-R><C-W>         : Pull <cword> onto search/command line
                             把狭义单词 <cword> 写到 搜索命令行
/<C-R><C-A>         : Pull <CWORD> onto search/command line
                             把广义单词 <cWORD> 写到 搜索命令行
:set ignorecase     : you nearly always want this
                       搜索时忽略大小写
:syntax on          : colour syntax in Perl,HTML,PHP etc
                       在 Perl,HTML,PHP 等中进行语法着色
:h regexp<C-D>      : type control-D and get a list all help topics containing
                          按下 control-D 键即可得到包含有 regexp 的帮助主题的列表
                       regexp (plus use TAB to Step thru list)
                       (使用TAB可以实现帮助的自动补齐)
----------------------------------------
# MAKE IT EASY TO UPDATE/RELOAD _vimrc
# 使更新 _vimrc 更容易
:nmap ,s :source $VIM/_vimrc
          # 译释:nmap 是绑定一个在normal模式下的快捷键
:nmap ,v :e $VIM/_vimrc
          # 译释:在normal模式下,先后按下 ,s 两个键执行_vimrc,而 ,v 则是编辑_vimrc

----------------------------------------

#VISUAL MODE (easy to add other HTML Tags)
# visual 模式 (例子是:轻松添加其他的 HTML Tags)
:vmap sb "zdi<b><C-R>z</b><ESC>  : wrap <b></b> around VISUALLY selected Text
                                                在visual模式下选中的文字前后分别
加上<b>和</b>
:vmap st "zdi<?= <C-R>z ?><ESC>  : wrap <?=   ?> around VISUALLY selected Text
                                             在visual模式下选中的文字前后分别加
上<?= 和 ?>

----------------------------------------

# Exploring
# 文件浏览
:Exp(lore)                      : file explorer note capital Ex
                                   开启目录浏览器,注意首字母E是大写的
:Sex(plore)                     : file explorer in split window
                                   在一个分割的窗口中开启目录浏览器
:ls                             : list of buffers
                                   显示当前buffer的情况
:cd ..                          : move to parent directory
                                   进入父目录
:args                           : list of files
                                   显示目前打开的文件
:lcd %:p:h                      : change to directory of current file
                                   更改到当前文件所在的目录
:autocmd BufEnter * lcd %:p:h   : change to directory of current file
automatically (put in _vimrc)
                                   自动更改到当前文件所在的目录 (放到 _vimrc)

----------------------------------------

# Buffer Explorer (Top Ten Vim Script)
# 缓冲区(buffer)浏览器 (第三方的一个最流行的脚本)
# needs bufexplorer.vim  http://www.vim.org/script.php?script_id=42
# 需要下载 bufexplorer.vim
\be                             : buffer explorer list of buffers
                                   在缓冲区浏览器中打开缓冲区列表
\bs                             : buffer explorer (split window)
                                   以分割窗口的形式打开缓冲区浏览器

----------------------------------------

# Changing Case
guu                             : lowercase line
                                   行小写
gUU                             : uppercase line
                                   行大写
Vu                              : lowercase line
                                   行小写
VU                              : uppercase line
                                   行大写
g~~                             : flip case line
                                   行翻转
vEU                             : Upper Case Word
                                   字大写(狭义字)
vE~                             : Flip Case Word
                                   字翻转(狭义字)
ggguG                           : lowercase entire file
                                   把整个文章全部小写

# Titlise Visually Selected Text (map for .vimrc)
vmap ,c :s/\<\(.\)\(\k*\)\>/\u\1\L\2/g<CR>
# Uppercase first letter of sentences
# 大写所有句子的第一个字母
:%s/[.!?]\_s\+\a/\U&\E/g

----------------------------------------

gf                              : open file name under cursor (SUPER)
                                   取当前光标处的广义字作为文件名,然后试图打开它!
ga                              : display hex,ascii value of char under cursor
                                   显示光标处字符的ascii,hex,oct,...
ggVGg?                          : rot13 whole file
                                   用rot13编码整个文件
ggg?G                           : rot13 whole file (quicker for large file)
                                   用rot13编码整个文件(对大文件更快一些)
:8 | normal VGg?                : rot13 from line 8
                                   从第8行开始,用rot13编码后面的文本
:normal 10GVGg?                 : rot13 from line 8
                                   从第8行开始,用rot13编码后面的文本

# 【关于rot13——谁让英文是偶数个字母啊】
# ROT13 是一种简单的编码,它把字母分成前后两组,每组13个,编码和解码
# 的算法相同,仅仅交换字母的这两个部分,即:[a..m] --> [n..z] 和 [n..z]
# --> [a..m] 。 ROT13 用简易的手段使得信件不能直接被识别和阅
# 读,也不会被搜索匹配程序用通常的方法直接找到。经常用于 USENET 中发表一
# 些攻击性或令人不快的言论或有简单保密需要的文章。
# 由于 ROT13 是自逆算法,所以,解码和编码是同一个过程。

<C-A>,<C-X>               : increment,decrement number under cursor
                                   增加,减少 光标处的狭义字所表示的数字
                                   win32 users must remap CNTRL-A
                                   Win32的用户可能需要重新定义一下Ctrl-A
<C-R>=5*5                    : insert 25 into text (mini-calculator)
                                   插入25 (一个迷你计算器)

----------------------------------------

# Makes all other tips superfluous
:h 42            : also http://www.google.com/search?q=42
:h holy-grail
:h!

----------------------------------------

# Markers & moving about
# 标记和移动
'.               : jump to last modification line (SUPER)
                    跳到最后修改的那一行 (超级有用)
`.               : jump to exact spot in last modification line
                    不仅跳到最后修改的那一行,还要定位到修改点
g;               : cycle thru recent changes (oldest first) (new in vim6.3)
                    循环跳转修改点(从最老的修改点开始) (vim6.3中新增)
g,               : reverse direction (new in vim6.3)
                    反向循环跳转修改点 (vim6.3中新增)

:changes
:h changelist    : help for above
<C-O>            : retrace your movements in file (starting from most recent)
                       依次沿着你的跳转记录向回跳 (从最近的一次开始)
<C-I>            : retrace your movements in file (reverse direction)
                       依次沿着你的跳转记录向前跳
:ju(mps)         : list of your movements
                    列出你跳转的足迹
:help jump-motions
:history         : list of all your commands
                    列出历史命令记录
:his c           : commandline history
                    命令行命令历史
:his s           : search history
                    搜索命令历史
q/               : Search history Window
                    搜索命令历史的窗口
q:               : commandline history Window
                    命令行命令历史的窗口
:<C-F>        : history Window
                    历史命令记录的窗口
----------------------------------------
# Abbreviations & maps
# # 缩写和键盘映射
:map   <f7>   :'a,'bw! c:/aaa/x
                  # 译释:map是映射一个normal模式下的键
                  # 这里是把F7键映射成把标记a到标记b中间的内容另存为一个文件/aaa/x
                  # 标记(mark)的方法:把光标移动到需要标记的地方,输入m,然后输
入标记名,例如a
                  # 引用标记的方法:'a ,即:单引号加标记名
:map   <f8>   :r c:/aaa/x
                  # 译释:把F8键映射成在当前位置插入文件/aaa/x的内容
:map   <f11>  :.w! c:/aaa/xr<CR>
                  # 译释:.(点号)表示当前行
                  # 所以F11就是把当前行存为/aaa/xr
                  # 最后的<CR>表示一个回车
:map   <f12>  :r c:/aaa/xr<CR>
:ab php          : list of abbreviations beginning php
                    列出php表示的缩写
                  # 译释:定义一个缩写使用::iab hm hmisty
                  # 一个有趣的现象是,它列出的会是php和它的前子串开头的缩写
                  # 例如,有这么几个缩写:
                  # h => hmisty1 , hm => hmisty2 , hmi => hmisty3, m => hmisty4
                  # 那么使用 :ab hm会显示这么几个缩写:hm 和 h
                  # 而不是你想象中的 hm 和 hmi

:map ,           : list of maps beginning ,
                    列出以逗号开始的键盘映射

# allow use of F10 for mapping (win32)
# 允许 F10 的映射用法 (win32)
set wak=no       : :h winaltkeys
                    参见 :h winaltkeys

# For use in Maps
# 在键盘映射中常用的表示
<CR>             : carriage Return for maps
                       回车
<ESC>            : Escape
                       ESC
<LEADER>         : normally \
                       转义符号 \
<BAR>            : | pipe
                       管道符号
<BACKSPACE>      : backspace
                       退格符号

# display RGB colour under the cursor eg #445588
# 显示光标下数值的 RGB 颜色
:nmap <leader>c :hi Normal guibg=#<c-r>=expand("<cword>")<cr><cr>

----------------------------------------

# Using a register as a map (preload registers in .vimrc)
:let @m=":'a,'bs/"
:let @s=":%!sort -u"

----------------------------------------
# List your Registers
# 列出寄存器(Registers)
:reg             : display contents of all registers
                   显示所有寄存器的内容
:reg a           : display content of individual registers
                    显示 a 寄存器的内容
"1p....          : retrieve numeric registers one by one
:let @y='yy@"'   : pre-loading registers (put in .vimrc)

----------------------------------------

# Useful tricks
# 有用的窍门
"ayy@a           : execute "Vim command" in a text file
                    把当前行作为一个Vim命令来执行
yy@"             : same thing using unnamed register
                    同上,不过是用匿名寄存器
u@.              : execute command JUST typed in
                    只执行键入的命令

----------------------------------------

# Get output from other commands (requires external programs)
# 从其他程序获取输出 (需要外部程序)
:r!ls.exe        : reads in output of ls
                    读取ls的输出到当前位置
!!date           : same thing (but replaces/filters current line)
                    读取date的输出 (但是会替换当前行的内容)
                  # 译释:其实你输入了!!后,vim就自动转换到 :.! 等待你继续输入
# Sorting with external sort
# 使用外部程序sort进行排序(sort是Unix标准命令,ls,date也是)
:%!sort -u       : use an external program to filter content
                    使用sort程序排序整个文件(用结果重写文件)
                  # 译释:%表示整个文件的所有行
                  # !sort表示执行外部命令sort
                  # -u是sort的参数,man sort看看,这个参数的意义是合并相同的行
                  # u就是unique,如果两行内容相同,则结果中只保留一行的说
:'a,'b!sort -u   : use an external program to filter content
                    对mark a 到mark b中间的内容进行排序
!1} sort -u      : sorts paragraph (note normal mode!!)
                    排序当前段落 (只能在normal模式下使用!!)
                  # 译释:!表示使用filter,1}表示filter的对象是从当前行开始向后
数一段
                  # 段落指到空行处结束,不包括空行
                  # 其实你一旦输入 !1},vim就自动计算当前段落应该到那一行(eg.+
5),然后生成
                  # :.,.+5! 等待之后输入sort -u,回车,完成操作
                  # .表示当前行,.+5当然就是当前行向后数5行

----------------------------------------

# Multiple Files Management (Essential)
# 多文档操作 (基础)
:bn              : goto next buffer
                    跳转到下一个buffer
:bp              : goto previous buffer
                    跳转到上一个buffer
:wn              : save file and move to next (super)
                    存盘当前文件并跳转到下一个
:wp              : save file and move to previous
                    存盘当前文件并跳转到上一个
:bd              : remove file from buffer list (super)
                    把这个文件从buffer列表中做掉
:bun             : Buffer unload (remove window but not from list)
                    卸掉buffer (关闭这个buffer的窗口但是不把它从列表中做掉)
:badd file.c     : file from buffer list
                    把文件file.c添加到buffer列表
:b 3             : go to buffer 3
                    跳到第3个buffer
:b main          : go to buffer with main in name eg main.c (ultra)
                    跳到一个名字中包含main的buffer,例如main.c
:sav php.html    : Save current file as php.html and "move" to php.html
                    把当前文件存为php.html并打开php.html
:sav! %<.bak  : Save Current file to alternative extension
                    换一个后缀保存
:sav! %:r.cfm    : Save Current file to alternative extension

:e!              : return to unmodified file
                    返回到修改之前的文件(修改之后没有存盘)
:w c:/aaa/%      : save file elsewhere
                    把文件存到一个地儿
:e #             : edit alternative file
                    编辑标记为#的buffer(这个buffer必须含有一个可编辑的文件)
                 # 用ls命令就能看到哪一个buffer有#
                  # %a表示当前正在编辑的buffer
                  # u 表示不能编辑或者已经被做掉的buffer
:rew             : return to beginning of editted files list (:args)
                    回到第一个可编辑的文件
:brew            : buffer rewind
                    回到第一个buffer
:sp fred.txt     : open fred.txt into a split
                    在一个水平分割的窗口中打开文件fred.txt # 译注:vs fred.txt可
以实现垂直分割
:sball,:sb       : Split all buffers (super)
                    把当前所有含有可编辑文件的buffer显示到一个分割窗口中
:scrollbind      : in each split window
:map   <F5> :ls<CR>:e # : Pressing F5 lists all buffer, just type number
                                 在normal模式下按F5键,则会显示所有含有一个
                                 可编辑文件的buffer,然后提示你输入buffer的序号,
                                 输入后回车,则编辑这个buffer
:set hidden      : Allows to change buffer w/o saving current buffer
                    允许不保存buffer而切换buffer (w/o=without)
----------------------------------------
# Quick jumping between splits
# 在分割窗口中快速切换
:map <C-J> <C-W>j<C-W>_
# 这是一个键盘绑定,把Ctrl-J定义成切换到下一个窗口并最大化
:map <C-K> <C-W>k<C-W>_
# 这是一个键盘绑定,把Ctrl-K定义成切换到上一个窗口并最大化

----------------------------------------
# Recording (BEST TIP of ALL)
# 命令录制 (最佳技巧)
qq  # record to q
       录制到q
your complex series of commands  # 输入一系列复杂的指令
q   # end recording
       再次按q停止录制
@q  # to execute
       执行q中存储的指令
@@  # to Repeat
       重复执行
5@@ # to Repeat 5 times
       重复执行5遍

# editing a register/recording
# 编辑寄存器/录制
"qp            :display contents of register q (normal mode)
                 显示寄存器 q 的内容 (普通模式)
<ctrl-R>q   :display contents of register q (insert mode)
                显示寄存器 q 的内容 (插入模式)

# you can now see recording contents, edit as required
# 你现在可以看到记录内容,随便编辑
"qdd           :put changed contacts back into q
@q             :execute recording/register q
                 执行记录/寄存器 q

# Operating a Recording on a Visual BLOCK
# 在可视块中运行记录
1) define recording/register
1) 定义记录/寄存器
qq:s/ to/ from/g^Mq
2) Define Visual BLOCK
2) 定义可视块
V}
3) hit : and the following appears
3) 键入 : 将显示下面信息
:'<,'>
4)Complete as follows
4) 完成如下操作
:'<,'>norm @q
----------------------------------------
# Visual is the newest and usually the BEST editting mode
# 可视模式是最新也通常是最好的编辑模式
# Visual basics
# 可视模式基础
v              : enter visual mode
                  进入可视模式
V              : visual mode whole line
                  整行的可视模式
<C-V>       : enter VISUAL BLOCK mode
                  进入可视块模式
gv             : reselect last visual area
                  重新选取最新的可视区域
o              : navigate visual area
                  浏览可视区域
"*y            : yank visual area into paste buffer
                  复制可视区域到剪贴板
V%             : visualise what you match
                  ???
V}J            : Join Visual block (great)
                  连接可视块

----------------------------------------

# Delete first 2 characters of 10 successive lines
# 删除连续10行中每行的头2个字符
0<c-v>10j2ld

----------------------------------------

# how to copy a set of columns using VISUAL BLOCK
# 如何用可视块拷贝几列
# visual block (AKA columnwise selection) (NOT BY ordinary v command)
# 可视块(并非通常的 v 命令)
<C-V> then select "column(s)" with motion commands (win32 <C-Q>)
<C-V>,然后通过移动命令选择列 (win32 <C-Q>)
then c,d,y,r etc
然后执行 c,d,y,r 等命令

----------------------------------------
# _vimrc essentials
# _vimrc基础
:set incsearch : jumps to search word as you type (annoying but excellent)
                  实时匹配你输入的内容
:set wildignore=*.o,*.obj,*.bak,*.exe : tab complete now ignores these
                                         tab键的自动完成现在会忽略这些
:set shiftwidth=3                     : for shift/tabbing
                                         自动缩进设为4个字符
                                       # 译注:一个tab位通常是8个字符
                                       # 所以,我们还要设定 :set tabstop=4,这
样,所有的缩进都是4字符了
:set vb t_vb=".                       : set silent (no beep)
                                         沉默方式(不要叫beep!)
:set browsedir=buffer                 : Maki GUI File Open use current directory
                                         设置 GUI 版本文件打开时,使用当前路径
----------------------------------------
# launching Win IE
# 加载 IE 浏览器
:nmap ,f :update<CR>:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p<CR>
:nmap ,i :update<CR>: !start c:\progra~1\intern~1\iexplore.exe <cWORD><CR>
# 译释:nmap是做一个normal模式下的键盘绑定
# 这里绑定了一个逗号命令 ,f
# :update是写这个文件,与:w不同,它只有当文件被修改了的时候才写
# :silent别让弹出窗口报告执行结果
# !...后面就是执行windows命令了。呵呵,去问bill gates什么意思吧。

----------------------------------------

# FTPing from VIM
# 用 VIM 通过 ftp 编辑文件
:cmap ,r  :Nread ftp://209.51.134.122/public_html/index.html
:cmap ,w  :Nwrite ftp://209.51.134.122/public_html/index.html
gvim ftp://209.51.134.122/public_html/index.html
# 译注:cmap是命令(command)模式绑定

----------------------------------------

# appending to registers (use CAPITAL)
# 附加到一个register (用大写的register名字)
"a5yy   #复制5行到a中
10j     #下移10行
"A5yy   #再添加5行到a中

----------------------------------------

[I     : show lines matching word under cursor <cword> (super)
          显示光标处的狭义字可以匹配的行(高级指令)
        # 译注:# 可以全文查找与光标处的狭义字相匹配的字,
        # 这在查找函数原型和实现,或者变量使用的时候很有用

----------------------------------------

# Conventional Shifting/Indenting
# 常规缩进
:'a,'b>>   # 把mark a到mark b之间的内容缩进两次

# visual shifting (builtin-repeat)
# 在visual模式下缩进 (无限可重复)
:vnoremap < <gv
# 译释::vnoremap 重定义了visual模式下 < 符号的含义
# 把它定义成 <gv
# 即:先<向外缩进,然后gv重新选择上一次选择了的区域
# 这样在visual模式下就可以实现连续按<而连续缩进了
:vnoremap > >gv
# 同里,内缩

# Block shifting (magic)
# 块缩进
 >i{
 >a{
# also
 >% and <%
----------------------------------------
# Redirection & Paste register *
# 重定向到剪贴板和从剪贴板粘贴
:redir @*                    : redirect commands to paste buffer
                                重定向命令的输出结果(最下方命令行上的结果)
:redir END                   : end redirect
                                结束重定向
:redir >> out.txt            : redirect to a file
                                重定向到一个文件
# Working with Paste buffer
# 操作剪贴板
"*yy                         : yank to paste
                                复制到剪贴板中
"*p                          : insert from paste buffer
                                从剪贴板中粘贴
# yank to paste buffer (ex mode)
# 拷贝到剪贴板 (ex 模式)
:'a,'by*                     : Yank range into paste
                                把标记a到标记b见的内容拷贝到剪贴板
:%y*                         : Yank whole buffer into paste
                                把整个文件拷贝到剪贴板
# filter non-printable characters from the paste buffer
# 从剪贴板上过滤非可打印字符
# useful when pasting from some gui application
# 当从一些 GUI 程序粘贴时会有用处
:nmap <leader>p :let @* = substitute(@*,'[^[:print:]]','','g')<cr>"*p
----------------------------------------
# Re-Formatting text
# 重新格式化文本
gq}                          : Format a paragraph
                                格式化一个段落
ggVGgq                       : Reformat entire file
                                重新格式化整个文件
Vgq                          : current line
                                格式化当前行
# break lines at 70 chars, if possible after a ;
# 在70列的时候换行
:s/.\{,69\};\s*\|.\{,69\}\s\+/&\r/g
----------------------------------------
# Operate command over multiple files
# 对多个文档实施命令
:argdo %s/foo/bar/e          : operate on all files in :args
                                对所有:args列表中的文档执行命令
:bufdo %s/foo/bar/e
:windo %s/foo/bar/e
:argdo exe '%!sort'|w!       : include an external command
                                使用外部命令
:bufdo /foo/
----------------------------------------
# Command line tricks
# 命令行上的技巧
gvim -h                    : help
                              启动帮助
ls | gvim -                : edit a stream!!
                              编辑一个数据流
cat xx | gvim - -c "v/^\d\d\|^[3-9]/d " : filter a stream
gvim -o file1 file2        : open into a split
                              以分割窗口打开两个文件

# execute one command after opening file
# 指出打开之后执行的命令
gvim.exe -c "/main" joe.c  : Open joe.c & jump to "main"

# execute multiple command on a single file
# 对一个文件执行多个命令
vim -c "%s/ABC/DEF/ge | update" file1.c

# execute multiple command on a group of files
# 对一组文件执行多个命令
vim -c "argdo %s/ABC/DEF/ge | update" *.c

# remove blocks of text from a series of files
# 从一组文件中删除文本块
vim -c "argdo /begin/+1,/end/-1g/^/d | update" *.c

# Automate editting of a file (Ex commands in convert.vim)
# 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了)
vim -s "convert.vim" file.c

#load VIM without .vimrc and plugins (clean VIM)
# 不要加载.vimrc和任何plugins (启动一个干净的VIM)
gvim -u NONE -U NONE -N

# Access paste buffer contents (put in a script/batch file)
# 读取剪贴板内容 (放到脚本或批处理文件中)
gvim -c 'normal ggdG"*p' c:/aaa/xp

# print paste contents to default printer
# 把剪贴板内容打印到默认打印机
gvim -c 's/^/\=@*/|hardcopy!|q!'
----------------------------------------
# GVIM Difference Function (Brilliant)
gvim -d file1 file2        : vimdiff (compare differences)
                              vimdiff (比较不同)
dp                         : "put" difference under cursor to other file
                              把光标处的不同放到另一个文件
do                         : "get" difference under cursor from other file
                              在光标处从另一个文件取得不同
----------------------------------------
# Vim traps
# Vim陷阱
In regular expressions you must backslash + (match 1 or more)
In regular expressions you must backslash | (or)
In regular expressions you must backslash ( (group)
In regular expressions you must backslash { (count)
# 在vim的正则表达式中, + | ( { 前都必须加转义符 \
/fred\+/                   : matches fred/freddy but not free
                              匹配fred或freddy但是不匹配free
/\(fred\)\{2,3}/           : note what you have to break
                              ???
----------------------------------------
# \v or very magic (usually) reduces backslashing
# \v ,或叫做very magic (通常都是这么叫)可以取消转义符
/codes\(\n\|\s\)*where  : normal regexp
                           普通的正则表达式
/\vcodes(\n|\s)*where   : very magic
----------------------------------------
# pulling objects onto command/search line (SUPER)
# 把东西送到命令行/搜索行 (SUPER)
<C-R><C-W> : pull word under the cursor into a command line or search
                    送一个狭义词
<C-R><C-A> : pull WORD under the cursor into a command line or search
                    送一个广义词
<C-R>-                  : pull small register (also insert mode)
                             送一个小型寄存器 (插入模式下也有效)
<C-R>[0-9a-z]           : pull named registers (also insert mode)
                              送一个命名寄存器 (插入模式下也有效)
<C-R>%                  : pull file name (also #) (also insert mode)
                              送文件名过去 (#也行) (插入模式下也有效)
----------------------------------------
# manipulating registers
# 操作寄存器
:let @a=@_              : clear register a
                           清空寄存器a
:let @a=""              : clear register a
                           同上
:let @*=@a              : copy register a to paste buffer
                           拷贝寄存器 a 的内容到剪贴板
map   <f11> "qyy:let @q=@q."zzz"

----------------------------------------

# help for help
# 关于帮助的帮助
:h quickref             : VIM Quick Reference Sheet (ultra)
                           VIM 快速参考手册 (ultra)
:h tips                 : Vim's own Tips Help
                           Vim自己的tips
:h visual<C-D><tab>     : obtain  list of all visual help topics
                                得到一个关于visual关键字的帮助列表
                         : Then use tab to step thru them
                        : 然后用tab键去选择
:h ctrl<C-D>         : list help of all control keys
                           显示所有关于Ctrl的帮助
:helpg uganda           : Help grep
                           显示 grep 帮助
:h :r                   : help for :ex command
                           :ex冒号命令
:h CTRL-R               : normal mode
                           普通模式命令
:h /\r                  : what's \r in a regexp (matches a <CR>)
                           \r在正则表达式中是什么意思呢?
:h \\zs                 : double up backslash to find \zs in help
:h i_CTRL-R             : help for say <C-R> in insert mode
                           insert模式下的Ctrl-R
:h c_CTRL-R             : help for say <C-R> in command mode
                           命令行(command-line)模式下的Ctrl-R
:h v_CTRL-V             : visual mode
                           visual模式下的Ctrl-V
:h tutor                : VIM Tutor
                           VIM 指南
<C-[>, <C-T>      : Move back & Forth in HELP History
                           在帮助历史中,向前/后移动
gvim -h                 : VIM Command Line Help
                           关于 VIM 命令的帮助
----------------------------------------
# where was an option set
# 选项设置在哪里?
:scriptnames            : list all plugins, _vimrcs loaded (super)
                           列出所有加载的 plugins, _vimrcs
:verbose set history?   : reveals value of history and where set
                           显示history的值并指出设置文件的位置
:function               : list functions
                           列出所有函数
:func SearchCompl       : List particular function
                          列出指定的函数

----------------------------------------

# making your own VIM help
# 制作你自己的VIM帮助
:helptags /vim/vim63/doc  : rebuild all *.txt help files in /doc
                             重建 /doc 中所有的 *.txt 帮助文件
:help add-local-help

----------------------------------------
# running file thru an external program (eg php)
# 用外部程序来运行程序 (例如 php)
map   <f9>   :w<CR>:!c:/php/php.exe %<CR>
map   <f2>   :w<CR>:!perl -c %<CR>
----------------------------------------
# capturing output of current script in a separate buffer
# 在另一个buffer中,捕捉当前脚本的输出
:new | r!perl #                   : opens new buffer,read other buffer
                                     新建一个buffer,从另一个buffer中读入结果
:new! x.out | r!perl #            : same with named file
                                    同上,并指定一个新文件名

----------------------------------------

# Inserting DOS Carriage Returns
# 插入DOS换行符
:%s/nubian/<C-V><C-M>&/g          :  that's what you type
:%s/nubian/<C-Q><C-M>&/g          :  for Win32
                                            对于Win32应该这样
dn_t...@yahoo.ca
:%s/nubian/^M&/g                  :  what you'll see where ^M is ONE character
                                      你看到的^M是一个字符
:%s/nubian/\r&/g                  :  better
                                      更好的形式

----------------------------------------

# automatically delete trailing Dos-returns,whitespace
# 自动删除行尾 Dos回车符和空格
autocmd BufRead * silent! %s/[\r \t]\+$//
autocmd BufEnter *.php :%s/[ \t\r]\+$//e
----------------------------------------
# perform an action on a particular file or file type
# 对指定文件或文件类型执行某个动作
autocmd VimEnter c:/intranet/note011.txt normal! ggVGg?
autocmd FileType *.pl exec('set fileformats=unix')
----------------------------------------
# Retrieving last command line command for copy & pasting into text
# 把最后一个命令贴到当前位置
i<c-r>:
# Retrieving last Search Command for copy & pasting into text
# 把最后一个搜索指令贴到当前位置
i<c-r>/
# 译释:i是进入insert模式,
# Ctrl-r是开启插入模式下register的引用
# :和/分别引用了两个register的内容
----------------------------------------
# more completions
# 更多的完成功能
<C-X><C-F>     :insert name of a file in current directory
                      插入当前目录下的一个文件名到当前位置
# 在insert模式下使用
# 然后用 Ctrl-P/Ctrl-N 翻页

----------------------------------------

# Substituting a Visual area
# 替换一个visual区域
# select visual area as usual (:h visual) then type :s/Emacs/Vim/ etc
# 选择一个区域,然后输入 :s/Emacs/Vim/ 等等,vim会自动进入:模式
:'<,'>s/Emacs/Vim/g               : REMEMBER you dont type the '<.'>
                                        前面的'<,'>是vim自动添加的
gv                                : Re-select the previous visual area (ULTRA)
                                     重新选择前一个可视区域 (ULTRA)
----------------------------------------
# inserting line number into file
# 在文件中插入行号
:g/^/exec "s/^/".strpart(line(".")."    ", 0, 4)
:%s/^/\=strpart(line(".")."     ", 0, 5)
:%s/^/\=line('.'). ' '
----------------------------------------
#numbering lines VIM way
# 用VIM的方式来编号行
:set number                       : show line numbers
                                     显示行号
:map <F12> :set number!<CR>       : Show linenumbers flip-flop
:%s/^/\=strpart(line('.')."        ",0,&ts)

#numbering lines (need Perl on PC) starting from arbitrary number
#从任意行开始编号(需要perl)
:'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++'

# Produce a list of numbers
# 产生数字列表
#Type in number on line say 223 in an empty file
qqmnYP`n^Aq                       : in recording q repeat with @q
# increment existing numbers to end of file (type <c-a> as 5 characters)
# 递增已存在数字到文件末
:.,$g/^\d/exe "normal! \<c-a>"
# advanced incrementing
# 高级递增,参见:
http://vim.sourceforge.net/tip_view.php?tip_id=150
----------------------------------------
# advanced incrementing (really useful)
# 高级递增 (真的很有用)
" put following in _vimrc
" 把下面几句放到 _vimrc #vimrc脚本用 " 做行注释符
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction
" eg create list starting from 223 incrementing by 5 between markers a,b
" 例如从mark a 到mark b 递增,从223开始,步长为5
:let I=223
:'a,'bs/^/\=INC(5)/
" create a map for INC
cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/
----------------------------------------
# editing/moving within current insert (Really useful)
# 在当前插入模式下编辑/移动 (真得很有用)
<C-U>                             : delete all entered
                                        删除全部
<C-W>                             : delete last word
                                        删除最后一个单词
<HOME><END>                       : beginning/end of line
                                           移动到行首/行尾
<C-LEFTARROW><C-RIGHTARROW>       : jump one word backwards/forwards
                                           向前/后移动一个单词
<C-X><C-E>,<C-X><C-Y>             : scroll while staying put in insert
----------------------------------------
#encryption (use with care: DON'T FORGET your KEY)
# 加密(小心使用,不要忘了密码)
:X                                : you will be prompted for a key
                                     vim会提示你输入密码
:h :X
----------------------------------------
# modeline (make a file readonly etc) must be in first/last 5 lines
# 模式行 (使文件只读等),必须在前/后 5行内
// vim:noai:ts=2:sw=4:readonly:
# vim:ft=html:                    : says use HTML Syntax highlighting
                                     使用 HTML 语法高亮
:h modeline
----------------------------------------
# Creating your own GUI Toolbar entry
# 建立你自己的菜单项
amenu  Modeline.Insert\ a\ VIM\ modeline <Esc><Esc>ggOvim:ff=unix ts=4
ss=4<CR>vim60:fdm=marker<esc>gg

----------------------------------------

# A function to save word under cursor to a file
# 一个保存当前光标下的狭义字到一个文件的函数
function! SaveWord()
    normal yiw
    exe ':!echo '.@0.' >> word.txt'
endfunction
map ,p :call SaveWord()

----------------------------------------

# function to delete duplicate lines
# 删除重复行的函数
function! Del()
  if getline(".") == getline(line(".") - 1)
    norm dd
  endif
endfunction

:g/^/ call Del()  #使用该函数的一个例子

----------------------------------------

# Digraphs (non alpha-numerics)
# 双字节编码 (non alpha-numerics)
:digraphs                         : display table
                                     显示编码表
:h dig                            : help
                                     帮助
i<C-K>e'                          : enters �
                                        输入 é
i<C-V>233                         : enters � (Unix)
                                       输入 é (Unix)
i<C-Q>233                         : enters � (Win32)
                                        输入 é (Win32)
ga                                : View hex value of any character
                                     查看字符的hex值

# Deleting non-ascii characters (some invisible)
# 删除非 ascii 字符
:%s/[<C-V>128-<C-V>255]//gi       : where you have to type the Control-V
:%s/[€-�]//gi                     : Should see a black square & a dotted y
:%s/[<C-V>128-<C-V>255<C-V>01-<C-V>31]//gi : All pesky non-asciis
:exec "norm /[\x00-\x1f\x80-\xff]/"        : same thing
#Pull a non-ascii character onto search bar
yl/<C-R>"                         :
----------------------------------------
# All file completions grouped (for example main_c.c)
# 文件名自动完成 (例如 main_c.c)
:e main_<tab>                     : tab completes
                                        tab 键完成
gf                                : open file under cursor  (normal)
                                     打开光标处广义字命名的文件 (normal模式)
main_<C-X><C-F>                   : include NAME of file in text (insert mode)
                                           文件名自动完成(insert模式)
----------------------------------------
# Complex Vim
# Vim复杂使用
# swap two words
# 交换两个单词
:%s/\<\(on\|off\)\>/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g
# swap two words
# 交换两个单词
:vnoremap <C-X> <Esc>`.``gvP``P
----------------------------------------
# Convert Text File to HTML
# 把text文件转换成html文件(oh,ft)
:runtime! syntax/2html.vim        : convert txt to html
                                    转换 txt 成 html
:h 2html
----------------------------------------
# VIM has internal grep
# VIM 有一个内部自带的 grep 命令
:grep some_keyword *.c            : get list of all c-files containing keyword
                                     得到一个包含some_keyword的c文件名列表
:cn                               : go to next occurrence
                                     去下一个出现的位置
----------------------------------------
# Force Syntax coloring for a file that has no extension .pl
# 强制无扩展名的文件的语法着色方式
:set syntax=perl
# Remove syntax coloring (useful for all sorts of reasons)
# 取消语法着色 (很有用)
:set syntax off
# change coloring scheme (any file in ~vim/vim??/colors)
# 改变色彩主题 (在~vim/vim??/colors中的任何文件)
:colorscheme blue
# Force HTML Syntax highlighting by using a modeline
# 通过使用模式行强迫使用 HTML 语法高亮
# vim:ft=html:
----------------------------------------
:set noma (non modifiable)        : Prevents modifications
                                     防止修改
:set ro (Read Only)               : Protect a file from unintentional writes
                                     只读保护
----------------------------------------
# Sessions (Open a set of files)
# 对话 (打开一堆文件)
gvim file1.c file2.c lib/lib.h lib/lib2.h : load files for "session"
                                            在"对话"中加载这些文件
:mksession                        : Make a Session file (default Session.vim)
                                     生成一个Session文件 (默认是Session.vim)
:q
gvim -S Session.vim               : Reload all files
                                     重新加载所有文件
----------------------------------------
# tags (jumping to subroutines/functions)
# 标记(tags) (跳转到子程序/函数)
taglist.vim                       : popular plugin
                                     很流行的插件
:Tlist                            : display Tags (list of functions)
                                     显示标记 (函数列表)
<C-]>                             : jump to function under cursor
                                        跳转到光标处的函数
----------------------------------------
# columnise a csv file for display only as may crop wide columns
:let width = 20
:let fill=' ' | while strlen(fill) < width | let fill=fill.fill | endwhile
:%s/\([^;]*\);\=/\=strpart(submatch(1).fill, 0, width)/ge
:%s/\s\+$//ge
# Highlight a particular csv column (put in .vimrc)
function! CSVH(x)
     execute 'match Keyword /^\([^,]*,\)\{'.a:x.'}\zs[^,]*/'
     execute 'normal ^'.a:x.'f,'
endfunction
command! -nargs=1 Csv :call CSVH(<args>)
# call with
:Csv 5                             : highlight fith column
----------------------------------------
# folding : hide sections to allow easier comparisons
# 折叠:隐藏某些片断,是查看更容易
zf}                               : fold paragraph using motion
                                     使用动作命令折叠一个段落
v}zf                              : fold paragraph using visual
                                     使用可视模式折叠一个段落
zf'a                              : fold to mark
                                     折叠到一个标记上
zo                                : open fold
                                     打开折叠
zc                                : re-close fold
                                     重新关闭折叠
----------------------------------------
# displaying "invisible characters"
# 显示"不可见字符"
:set list
:h listchars
----------------------------------------
# How to paste "normal commands" w/o entering insert mode
# 如何在不进入插入模式的情况下粘贴"普通模式的命令"
:norm qqy$jq
----------------------------------------
# manipulating file names
# 处理文件名
:h filename-modifiers             : help
                                     帮助
:w %                              : write to current file name
                                     写入当前文件
:w %:r.cfm                        : change file extention to .cfm
                                     改变文件扩展名为 .cfm
:!echo %:p                        : full path & file name
                                     显示完整路径和文件名
:!echo %:p:h                      : full path only
                                     只显示完整路径
<C-R>%                            : insert filename (insert mode)
                                        插入文件名 (插入模式)
"%p                               : insert filename (normal mode)
                                    插入文件名 (普通模式)
/<C-R>%                           : Search for file name in text
                                        在文本中查找文件名
----------------------------------------
# delete without destroying default buffer contents
# 删除,但不破坏 buffer 内容
"_d                               : what you've ALWAYS wanted
                                     你一直想要的东西
"_dw                              : eg delete word (use blackhole)
                                     例如:删除一个单词 (使用黑洞???)
----------------------------------------
# pull full path name into paste buffer for attachment to email etc
# 送完整的路径名到剪贴板,用于邮件附件等
nnoremap <F2> :let @*=expand("%:p")<cr> :unix
nnoremap <F2> :let @*=substitute(expand("%:p"), "/", "\\", "g")<cr> :win32
----------------------------------------
# Simple Shell script to rename files w/o leaving vim
# 不用离开 Vim 就能修改文件名的简单 shell 脚本
$ vim
:r! ls *.c
:%s/\(.*\).c/mv & \1.bla
:w !sh
:q!
----------------------------------------
# count words in a text file
# 在一个文本里计算单词数
g<C-G>
----------------------------------------
# example of setting your own highlighting
# 你自己设置高亮显示的例子
:syn match DoubleSpace "  "
:hi def DoubleSpace guibg=#e0e0e0
----------------------------------------
# Programming keys depending on file type
# 根据文件类型映射快捷键
:autocmd bufenter *.tex map <F1> :!latex %<CR>
:autocmd bufenter *.tex map <F2> :!xdvi -hush %<.dvi&<CR>
----------------------------------------
# reading Ms-Word documents, requires antiword
# 读取 MS-Word 文档,需要 antiword
:autocmd BufReadPre *.doc set ro
:autocmd BufReadPre *.doc set hlsearch!
:autocmd BufReadPost *.doc %!antiword "%"
----------------------------------------
# Just Another Vim Hacker JAVH
vim -c ":%s%s*%Cyrnfr)fcbafbe[Oenz(Zbbyranne%|:%s)[[()])-)Ig|norm Vg?"
# 译释:呵呵,谁来解释一下吧!
# 其实不过是在启动vim的时候执行了一个命令
# 先写入了 Just Another Vim Hacker 的rot13编码
# 然后再解码


----------------------------------------
__END__

Read More...