1、SNS网店软文推广法:现在SNS类型的网店非常流行,去SNS网店主要是去几个有人气的SNS网店有针对性的加几百上千个用户。然后选择合适的软文并合理的附带上网店链接,发表到自己的日志里。再让自己的一些好友分享,这样就让很多人都关注到你的文章,关注到了你的网店。
2、SNS网店API合作推广法:如果你自己或下面的员工有一定的技术实力,可以开发一些和自己网店产品相关的小插件,插到校内上,插到海内上。只要有开放API的 SNS网店都去插下。现在很多网店都有在这么搞,去校内看看哪些开放的应用程序,很多都是一些小网店提供的,而且上面都或多或少有挂自己网店的广告。而且这个市场越早做越好,很多SNS网店都是才开始尝试开发API,审核的要求还不是特别严格。等以后做的网店多了,再想插到SNS网店里去就难了。
3、收藏夹推广法:把一些精彩内容的页面添加到QQ书签,百度搜藏,雅虎收藏等,让喜欢这些内容的网民去阅读,收藏。
4、版主联盟推广法:这个方法适合论坛社区网店的推广。也就是先去加入一些版主联盟,像大旗版主联盟就很不错,每天把论坛的一些精彩内容提交上去,等待被相关频道录用,一经录用,那就会给你带去不少的IP.我最多的一次是两天就给网店带去了3W多的IP点击量。
5、回复置顶推广法:其实这个方法我也不知道该叫什么名字,它的局限性很小,据我所知,只使用于猫扑大杂烩,就暂且叫回复置顶吧。这个方法是我偶然发现的,是在看网店IP来路的时候发现的,发现那天有200多的IP来自猫扑的一个帖子,但是我知道我们没有去那里发过推广帖,所以觉得有点奇怪,就去那个帖子看看,发现是有人放了我们网店的一个链接,并且回复置顶了,所以才给我们带来了200多的IP.后来我就去和一些常在猫扑混的网友聊,才知道可以用一种叫“月明符”的道具来置顶回复。版主还不能删,只要管理员才有权删,所以一般情况下都能置顶一段时间。
6、有奖注册推广法:以增加会员注册量来做的一种推广方法。一般大家都是以有奖注册,或者一些激励注册的方法来推广,现在的人都是现实很精的,无利可图的事,他们是不会做的。
7、免费游戏推广法:免费游戏就是在你的网店挂一中免费的游戏,但是是要和网店的主题相同,还要是有趣味性。。。

8、QQ群推广法:用几十个qq,每个qq加入几十个群,每天发一遍网店。平均、50个qq*每个qq加入50个群*每个群50个人=75000人观看。如果qq更多,加入的群更多,加入的是大群,每个群的人数更多,则宣传效果更好。即使排除不在线的qq用户,效果也不容低估。要忍辱负重,不怕被踢。另外就是在QQ群是是可以发群邮件的,例如你可以把你的网店******.com上的精彩内容在邮件中推荐。
9、搜索引擎推广法:如今的新手站长,最热衷的就是这个短平快的方法。搜索网店的功能就是整合网络资源,给网民找到最适合的网店内容,给其他网店带去流量是其意想不到的副作用。很多站长类网店的网店推广栏目,似乎都变成seo专区了。seo的最好方法,就是网页代码规范、访问速度快、内容独特少重复,对网民有用,而且具有唯一性。
10、软文推广法:写文章,或者引用好文章,里面巧妙地加入自己的网址。
11、博客推广法:软文要有发表的地方。一个是发到论坛,文章站,一个是发到博客里。发到博客里有个好处,不会被乱删。
12、媒体推广法:让传统的媒体,报纸、电视、广播等等报道。
13、手机推广法:wap网店、群发短信、彩铃提示等。手机的功能越来越强,小巧容易携带,以后手机的上网人数肯定超过电脑人数。
14、网摘推广法:提高优质网页、图片、帖子到网摘站和聚合类网店。如果被推荐,也能有不少流量。
15、论坛推广法:注册几十个几百个论坛,每个论坛注册几十个帐号,把签名设为自己的网店。发表热门内容,自己顶自己帖子。注意换马甲,发布有争议性的标题内容。好的标题是论坛推广成败的100%.这里说的论坛是指泛论坛,包含留言本、论坛、贴吧等等一切网民可能聚集的地方。
16、第三极推广法:在宣传网店的同时,缀上自己的财富第三极号码。在每个网页的内容后面,加上自己的财富第三极号码,扩大知名度,还有带来额外的财富收入。
17、QQ和MSN昵称推广法:把昵称修改为网址。
18、邮件列表推广法:就是定期不定期的给网民发送电子杂志。
19、非预期邮件推广法:用专业的邮件群发工具,上网批量搜集电子信箱地址,然后群发。如今的很多网店,都要用电子信箱作为用户名,因此,搜集电子信箱地址,比以前方便多了,而且这些电子信箱都是活信箱,网民经常用的信箱,而非失效的信箱,效果不错。邮件标题要“规范”,别让网民误以为是垃圾邮件。
20、口碑推广法:好好做内容,让网民自己主动传播你的网店。
21、限制访问内容推广法:给网店内容分出访问等级,设置访问条件。给网民一个推广链接,网民只有推荐够一定访客或者注册会员后,才能访问该内容。非主流色彩爱情网店多用此方法,效果奇佳。
22、网店排名投票推广法:加入其他的网店推出的网店排名,或者给其他站进行网店排名,都能有效地提高网店的展示率。
23、聚合链接推广法:将优秀内容聚合在一起,吸引网民。
24、BT电炉哇嘎资源推广法:可以在音视频文件里放入自己的网店,特别是在一些需要证书才能收看的视频文件里,甚至可以弹出网店。一些站长使用这种方法,借助最新的电影上映时机,发布一个视频文件,就能搞到几十万的ip,效果绝对一流。
25、图片打水印推广法:防止别的网店引用图片,不仅不友好没效果,而且阻挡了搜索引擎的收录。从某种角度来说,其他网店也是自己网店的特殊网民。如果给网店打上水印,放上网店地址,积极地让别的站引用图片,提高网址曝光率,那么宣传效果是很好。水印法,包括图片水印法、视频水印法、网页水印法……
26、视频源Flash 推广法:如今的视频网店,都提供外部的访问接口。在别的网店、日志引用这些视频的同时,直接宣传了网店,扩大了网店的影响力。
27、提交到网址站推广法:网店导航站,网店目录站。
28、电子邮件自动回复推广法:就是在邮箱设置自动回复,把网店的地址和网店介绍设置为自动回复内容。当你接收到任何一封邮件的时候,邮箱就会自动回复过去。
29、无偿单向链接推广法:无偿给其他网店做链接,既能丰富自己网店的信息,而且在网民搜索别的站的时候,又可能出现自己的网页结果。
30、网店间互换链接推广法:这是几年前最流行的网店宣传方法,如今存在的交换链网店很稀少了。

31、批量提交交换链接推广法:用自动提交工具,提交网店到其他网店的友情链接栏目。当站长们在审核是否通过你站的时候,就为你贡献了一个ip.人类社会的发展,就是得益于工具自动化程度的提高。要充分利用互联网传递信息的自动化、数字化、批量化优势,善于使用批量宣传工具,节省人力重复性劳动。
32、网店推广联盟推广法:单打独斗出不了英雄好汉,一个人的精力时间和聪明才智毕竟太小,因此,要懂得借用外力。几个站长联合在一起,达成宣传共识。在宣传自己网店的时候,顺便也捎带上别的网店。用同样的劳动,得到更多的收获。
33、流量统计推广法:在网店的所有页面上放置一个iframe页面引用代码,在所引用的页面上放上其他网店的统计器,用程序代码控制变换统计id,当其他站长查看统计,浏览访问来路来源的时候,你的网店就出现了。一般的站长都会点击查看的,这种宣传方法效果很好,属于密不外传的绝招,很多人知道百度和google的威力就是从网店访问来路知道的。
34、互换频道推广法:和其他网店互相交换频道。就是把对方网店当作自己的一个频道在网店上推广。这样互相捧场,互相帮衬,威力巨大。
35、免费资源推广法:给其他网店提供免费的服务,比如免费统计,免费评测,免费天气查询代码,免费博客,免费ip查询代码,免费股票查询代码,免费搜索代码,免费在线客服系统,免费留言本,免费域名,免费空间,免费pr评价,免费电子书,免费查询,免费挂qq,免费认证,免费素材等等。要让自己提供的服务,成为其他网店的标准配置。时间久了,流量自然有了。
36、内容联盟推广法:这个方法适合有服务器资源的站长。提供一个平台,可以绑定其他网店的域名,把网店的头尾广告位置送给其他站长,吸引其他网店加入。看似是为其他网店做嫁衣裳,实际上是在宣传自己的网店,扩大了网店知名度和影响力。网络上流量最大的地方不是搜索网店,而是其他网店。搜索网店流量大,但是平均到每个站,也就几个几十个,对自己实际意义不大。拉到一个站长,胜过拉到几千个网民。这种方法长期而持久。
37、威逼强迫推广法:比如网店**miibeian、各地公共安全局,都可以强迫网店放链接。一般人用不了。不过可以变相使用,比如黑客加链接法。
38、做大做强推广法:比如门户站。让小网店以加自己网店的链接为荣。尽管很少有站从门户网店得到一星半点的好处,但是对强者天然的崇拜心理,仍然让无数站长不由自主地献身链接,并以此为光荣。至于人家是否留意和领情,则是另外一回事了。
39、客户端软件插件推广法:有技术含量的站长可以采用此法。开发流行的网民常用的客户端软件,比如聊天工具类软件qq,网络游戏类工具,下载工具类网店迅雷等等,都可以弹出窗口,可以直接弹网店首页,也可以弹一些活动页。效果奇好。
40、收费资源免费推广法:比如长久提供软件注册码,注册号,序列号,免序列号版软件,提高网店粘性。比如操作系统的ghost版本,养活了好几个日访问量几十万ip的网店。
41、群组推广法:如今的web2.0等社交网店,都有这个功能。在群组里广发消息,吸引注意力。
42、发布任务推广法:在威客网店发布任务,不仅能够吸引接受任务的人,而且能够吸引一大批旁观者。要充分利用这种一对多的传播优势。
43、印发宣传单线下宣传推广法:既可以自己印发,也可以和其他传统企业合作,使用它们的现有渠道。比如和超市合作,在购物小票上印制自己网店的网址。可以拿网店上的资源和超市交换。
44、流量交换联盟推广法:加入流量交换联盟,运用专业的流量交换系统平台,直接和其他网店交换流量,互惠互利,共同发展。
45、鼓励访客宣传推广法:至于如何打动网民口碑宣传,则要根据网店内容,灵活安排了。一般新奇有趣互动性的内容效果教好。比如测试类啊、评比类啊、节日祝福类啊、搞怪类啊等等内容的网页容易被强烈传播。可以考虑自己的网店如何发掘这方面的素材。
46、名片推广法:在名片上,手册上,一切自己能掌控的纸上,印上网址、写上网址。
47、电子邮件签名推广法:在电子邮箱的设置里,设置一下。加上网店网址和网店介绍。以后写信就会自动加上,自己就省事不少。
48、网上竞赛推广法:比如美女评比、网店评比等等各种资格赛的评比。
49、付费推广法:如果一些方法免费行不通。只要性价比合适,出去一个,可以收回两个,不妨付费推广。舍得舍得,舍不去的还会跑回来的。
50、分工合作推广法:社会效率的提高一个是工具自动化水平的提高,另一个是分工的价值。自己的能力有限,善于整合外部力量,雇用别人推广,把专业的事情交给专业的人来做,可以达到事半功倍的效果。
51、按效果付费推广法:如果你有可以出售的资源,不妨在网络上以按效果付费的方法推广,可以免费得到大量的流量。
52、设为主页和加入收藏推广法:如果你站的内容足够好,访问者也许愿意长期访问你的网店。在这一点上,要多费点心思提醒网民哦。
53、厕所绘画推广法:这种方法慎用,已经有得不偿失的先例。不推荐使用。
54、搞活动推广法:各种线下活动,各种聚会等。
55、广场效应推广法:在身上衣服上画上网址,去人多的地方引人瞩目。最好是在记者出没的地方,容易产生新闻效应。因为记者整天没事干,最喜欢这类八卦事情。
56、贺卡推广法:当别人送贺卡的时候,就顺便推广了你的网店。
57、事件连锁反应推广法:炒作。具体就是挑战人们的心理承受底线,锻炼人们的心理承受能力。
58、问答网店推广法:像在百度知道、新浪爱问这些问答网店,选择一些网店的关键词去回答别人的问题。或者自问自答。
59、百科网店推广法:去网上的百科全书添加内容。
60、RSS推广法:有很多rss聚合类网店,可以制作自己网店的rss,提交到这些网店。
61、网吧推广法:如果有一些网吧资源,可以让网吧的老板帮忙把网吧的机子主页设为自己的网店。
62、站长交流推广法:多和其他站长交流,探讨推广方法。说不定什么时候就有意外惊喜。在和别人的经验交流中也往往会有灵感的火花跳跃。不要吝啬你自己的经验,在告诉别人的时候,也是对自己经验的一次系统化、条理化、理性化提纯。
63、网页病毒推广法:利用其他网店的dns漏洞、服务器漏洞,程序漏洞等,直接挂上自己的网店,迅速提高网店普及率。这是最强悍的另类推广方法。属于被清理的方法之列。
64、过路费推广法:如果你有电信等方面的资源,掌握了网页的传输通道,可以将每个网页都进行完善,加进你想加入的内容。
65、域名推广法:人是会犯错的动物。研究高流量网店的域名,分析其错误拼写的各种可能,注册相应域名,也可以从中得到不少流量。如果应用在网店内容建设上,则可以以热门内容的错误拼写文字来建设和优化内容。
66、分类信息推广法:去各类分类信息站发布网店信息.
67、免费域名推广法:给其他站提供二极域名,或者去申请其他站的免费域名指到自己的站,都可以。
68、聊天室推广法:其实和QQ群推广差不多,就是在在各种聊天室去和大家聊天,搞好相互关系,适当的时候发一些网店的链接推广。注意给出一个必须发链接的理由。
69、演讲推广法:举办各种讲座,演讲,不知不觉地给网店吸引来新访客。
70、特殊资源推广法:比如高考查询,英语四六级查询等资源,是利益相关者不得不访问的。
71、模仿推广法:处处留心皆学问。学习其他网店的推广方法,看看其他网店的链接都出现在了什么地方,想办法依葫芦画瓢。模仿是创新的基础,创新是模仿的升华。创新=模仿+经验积累+批量化+自动化。
72、被动推广法:提高网店质量,做一个对网民有独特帮助的网店,让网民喜欢你的网店,让网民自发地传播你的网店,是效果最好的推广方法。
73、化整为零推广法:在各大商务网店上,建立网店的副版本。借用其他网店的平台,推广自己的东西。
74、预告推广法:也叫系列法。不要将宝贵的内容一次性全部提供,每天提供一点点,连续几个星期、几个月,让网民不断重复地访问网店。类似电视台播放电视剧和报纸的小说连载等等模式。比如赤壁,拦腰劈成两半,就能卖两倍价钱,赚双倍票房。搞网店也要学会这种留一手的做法。
75、创建品牌推广法:其实品牌建设并不难,非常简单。网上信息浩如烟海,陈旧信息充斥在各个网店,价值极其微小。站长们可以持续搜集某个主题信息,根据最新条件和情况,不断对原先的旧内容维护、补充和更新,按照日期顺序有规律地发布到其他网店,提高网店影响力。当人们需要该方面信息的时候,唯一的去处就是此类信息发源地了,建立品牌就是这么容易。有了品牌知名度,网店自然而然有了流量,顺便也能带活整个网店。例如中关村在线的电脑配件报价,百度的搜索排行榜,雪缘园足球即时比分。
76、多语言版本推广法:利用一些网店提供的免费翻译功能,建设不同语言版本的网店,比如繁体版,英文版等等,扩大网店的适用人群。
77、免费建站程序推广法:开发一套网店程序,免费提供给别人使用。网店程序里少不了带上开发者的版权链接。目前流行非流行的博客程序、论坛程序等开发者网店,流量大的吓人。有点能力的站长朋友何不学习一下呢。即使开发不了完整版,搞个二次开发,推出美化版、各类主题版,发布到各类源码站。
78、网店模板推广法:这个容易理解,用网页建筑师html、网页美容师css、网页魔术师java script
给流行的网店程序设计新界面,发布到对应网店,在发布的时候,可以留下网店的模板地址的,例如提供上述模板等等,这样可以获得很高的曝光率。模板其实很容易制作的,改下颜色,改下字体,变变页面元素位置即可。只要用心,没有做不到的。关键是学会思路,凡事心中有谱。
79、讲故事出书推广法:书籍可以被长久反复阅读,对人们的影响是非常大的,网店也能给人留下不可磨灭的印象。
80、创造新概念推广法:让新概念成为网店的代名词。当人们使用这个概念的时候,自然就宣传了你的网店。给人们先入为主的信息,融入人们的生活之中,这样的宣传效果,具有不可动摇的地位。概念的名称可以固定,概念的内容却可以常变常新,满足人们持久而不断变化的需要。
81、改名推广法:将城市名称、公司名称、道路、人名、昵称、建筑物名称或者社区名称等等实体的名字,修改设置为网店地址。这样做的话,网址的曝光率和使用频率会非常高,网店也会非常自然地出现在各种名单中,比如地图上,新闻报道里,人们的日常交往中。总之,传播效率和传播有效性都会非常高。
82、月历墙纸推广法:制作各种精美独特风格多样的月历图片,提供给人们做电脑的桌面墙纸壁纸使用。只要网民一打开电脑,你的网址就跃然pc上。一年300多天,天天都在提醒网民,你的网店对其有用。
83、征婚推广法:在各类报刊杂志网络上以整版的方式征婚,联系方式就仅仅留下网址。不仅可以吸引应征者,也可以吸引无数喜欢猎奇的闲极无聊的大量人群。具体做法可以参考以往的“征婚门”事件。
84、公交车站推广法:在都市的热门地段设置一个车站,乘车的人必然能够留意到,绕都绕不过去。此方法最适合公交公司。
85、地图推广法:让网店总部出现在地图上。地图传播面广,受众大,使用频率高。此法适合财大气粗有特殊关系者。研究研究你所在地方的地图,看看有什么公司的名字出现在上面,想想人家是怎么出现在上面的,模仿一下吧。如果做不到,那么求人不如求己,让自己的网店成为一张地图,一个平台。
86、吹捧推广法:要让网店成为网民心中的唯一,只有抬高身价,自吹自擂,让网民相信,你是最好的,你是最棒的,你就是名牌。让网民访问贵站,成为一种身份的象征,成为显耀自身价值的标志,极大地满足人们的虚荣心。这个可以通过设置访问限制来达到。人们天生对打破限制有一种狂热的喜好。本来平淡无奇的东西,一旦设置了限制,身价就高了。人们始终不明白一个道理:世界上最有价值的东西是免费的。
87、出入口推广法:在茫茫人海中,每个人都在各个入口和出口里进进出出,徘徊奔波,寻找活着的乐趣和存在的意义。它们找到了吗?你也许可以为之做点什么。
88、招聘推广法:如今科技和社会发展,机器工具代替人们劳作的趋势越来越明显,没事可干就成了一种普遍的社会现象,工作岗位成了一种稀缺资源,“为人民服务” 的口号成为争权夺利的代名词,为人民服务不再光荣,主动放弃自己不能胜任的岗位才是光荣的,可是,有谁乐意放弃呢?可以预见的是,在不久的将来,自动化工具完全代替人类的重复性劳动,所有人都将没事可干,人人要靠社会保障生存,可是,如今普遍的社会生存保障在哪里呢?既然获取为人民服务的资格如此艰苦,那么以招聘的名义,去招聘会上宣传网店,效果想来一定差不到什么地方。
89、立碑推广法:石头是疯狂的,疯狂的石头,是可以让无数东西千古流芳的。石头的寿命远远超过人的寿命和数字化存储载体的生命周期。古往今来,能够流传下来的,都是以石头为载体的。人脑太不可靠,只有石头值得信赖。在繁华地带或者名山大川立个碑,其宣传的效果是非常久远的。甚至可以被史后时期的人看到。但是,到那个时候,你的网店还能访问吗?
90、故事推广法:人是感性的动物。人们不喜欢理性的说教,但是这不代表人们不喜欢经过故事包装或伪装的说教。尽管明眼人一眼就知道怎么回事,但是在100万个人中,你能找到一个明眼人吗?这是比大海捞针的难度系数还高上千倍万倍的极限任务。买椟还珠的故事在人们的消费行为中时时刻刻上演,所以,请不要忽视包装的效果。如果有可能,就把你的推广行为用故事润色一下,给人们口碑相传贵站一个足够分量的理由。只要一个理由,一切都可以风生水起,面朝大海,春暖花开。让网店的名称,成为整个故事的线索,成为故事走向完美结局的核心要素,成为不可磨灭的一部分。人们就算把整个故事情节都忘记了,也会依稀记得你的网店在其中的独特作用。动人的故事,动人的网店,动人的宣传推广效果,动人的提醒暗示功能。
91、信仰推广法:刺激人们有几个手段、途径和层次,“立,礼,理、利、力”,越往后越低级,越接近兽|性。“立”就是树立信仰,创造理想和心愿,从根本上变化人的思维模式和行为模式。“礼”就是让事情充满趣味性,人是喜欢测验自己思维能力的家伙,把简单的事情人为地搞复杂是人经常玩的智力游戏,它们宁愿柳暗花明地瞎折腾也不喜欢一路顺风。“理”就是讲事实摆道理,用美好的“活着、活好和活得长久”的对错价值观和消除破坏性增强建设性的逻辑达成共识。“利”就是用彼方面的利益来弥补此方面利益的缺失。这是一种亏处有补的让步和交换行为模式。“力”就是以强制力为后盾的兽|性行为方式。把“力”关到笼子里,才是人性的做法。人性是以创造和分享为手段,以人人自由如意为目标的公益事物。而兽|性是以争抢和独占为手段,以无穷的欲望满足为企图的破坏性事物。值得注意的是,人是兽|性和人性并存的事物。判断一个人成熟程度的标志,就是以其行为上的人性程度来衡量的。任何一个人,对任何刺激,都同时存在兽|性和人性两种情绪和想法,没有人可以例外,这是人为无法控制的。人可以控制的是自己的最终选择。“听话听内容,看人看行动”,思想什么都不是,重要的是看这个人(群体)在行动上的反应情况。行为的人性化程度,才体现了一个人(群体)的素质和价值。

93、公共元素推广法:研究各类网店,观察和思考一下这些网店有什么公共的雷同的东西。开发工具和系统,给这些网店提供统一的服务,免除这些网店的重复性的劳动。比如统计服务、留言服务、客服系统、日历系统、聚合服务、搜索服务、友情链接服务、图片服务、帐户服务、支付系统……其实,没有什么是不可以分拆的,需要解决的问题是信任。

94、线下实物推广法:赠送免费的纸质日历给人们。举一反三融会贯通敲山震虎打草惊蛇地推而广之,赠送免费手机、免费午餐、免费住宿、免费资格、免费门票、免费春联、免费杀毒软件、免费代码、免费服装、免费书籍、免费玩具、免费电话等等等等。自己想去吧。一切收费的都可以免费提供,只要间接收获的投入产出比性价比合算划算。提醒一下,你要让人们看到你自己的利益所在,否则人们会因害怕和难以置信而不敢接受。这是免费爱心东西在金钱时代遭遇的一个信任危机,也是金钱的负面效应的作用结果。
95、免费算命推广法:命运是固定的,算不算都一个样,正所谓“命运天注定,半点不由人”。“我是谁”这个问题的标准答案是,“我不是我,我是规律的傀儡”。既然人们有这个需要,给算一下也无妨。给人免费算命,建议人们把名字改为你的网店地址,如果成功,你就多了一个忠实的终身义务宣传员。这样的人走到哪里,你的网店就亮到哪里。实在没人改,就改你自己的名字吧。
96、与朋友分享独门秘籍推广法:为了防止好方法失传,强烈建议您公开出来。事物只使用才有价值。价值在使用的过程中才能激发出来。
97、卖站推广法:就说我现在的网店有一万个流量,现三百块低价出售,贴出网址,这样大家都过来看。
98、人工扛牌推广法:穿个有公司独特印记的T恤,找个美女,性感的美女,去人流量大的地方,这对地方站有特效。
99、图书推广法:搞个图书,在封面上打上网址就行了。
100、免费赠送推广法:批发一批有意思的小玩意,在论坛上免费派送,但是要收快递费的。而快递费赚的钱就是产品的本钱,这样就积累了人气,自己也不亏本。
101、修电脑推广法:这个适合地方站。给用户免费装机,装机后给他设个默认首页就行了。
102、媒体联合推广法:同样适合地方站,找当地的媒体和他们一起推广,借力打力

source insight是windows环境下用于代码开发和阅读的利器,功能强大,对于大规模代码的维护和开发几乎不可或缺(这里
指 它提供的功能,类似的商业工具还有很多)。使用emacs替代source insight原因有:a,si是商业软件,使用需要付费,虽然可以从网上
找 到破解版本;b,对于unix/linux爱好者或者需要同时工作于unix和windows环境下的开发人员,emacs是通用工具;emacs其它的 强大
功能暂且不表。
下面是基于windows xp平台的安装方法,其中大部分步骤和unix环境下的一样,只有cscope的有所不同。

<!–more–>

1)准备工作
首先,你得下载一下一些 工具(扩展),emacs,cscope,ecb,cedet是必须的,session,doxymacs不是必要的,但是装上会
更方便。下载这 些东西的网址链接如下:(当然,下面这些东西都可以从google找到下载链接,下面提供的网址都是google出来的,如果
下面提供的链接不可 用了,大家可以自己google一把)
i)emacs:http://www.gnu.org/software/emacs/
从 gnu的ftp网站上下载windows版本,最新的版本是emacs-22.1。下面的设置都是在这个版本上进行的。

ii)cscope:cscope 的主页http://cscope.sourceforge.net/, 其中有一个download的链接,从那里可以下载到编译好的压缩包。
win32版本的下载地址:http://iamphet.nm.ru/cscope/index.html, 压缩包中有两个编译好的exe文件:cscope.exe, sort.exe

iii)ecb:主页地址http://ecb.sourceforge.net/,download 页面中还有一个Xemcas的安装程序setup.exe,可以试试,我没有使用这个。
sourceforg下载地址http://sourceforge.net/project/showfiles.php?group_id=17484

iv)cedet: 主页http://cedet.sourceforge.net/, 下载release压缩包1.0pre4.tar.gz,这个包中已经包含了semantic,ede,eieio,
speedbar,因此下载 了这个大包后不用分别下载这些扩展插件。

v)session:sf下载地址http://sourceforge.net/project/showfiles.php?group_id=46019

vi)doxymacs: 地址http://doxymacs.sourceforge.net/
下 载http://sourceforge.net/project/s … p;release_id=514962

vii)下载windows下的bash工具,主要是用到其中的find工具,用来手工 生成cscope.files。如果安装了cygwin则不用安装这个了。
地址:http://folk.uio.no/andreass/unix_tools.html

2) 安装
安装emacs:这个很简单,只要将压缩包解开,放到你想放的位置就可以用了,如果要在windows的开始菜单中添加菜单项,点击bin目 录下
的addpm运行,就会在菜单中加入gnu菜单项。

安装cscope:a,解压平台不相关的那个tar.gz包,将 /contrib/xscope/xscope.el拷贝到emacs-22.1/site-lisp目录下(emacs-22.1是
你安装 emacs的目录);b,解压win32版本的cscope,将cscope.ext sort.exe拷贝到emacs-22.1/bin目录下(这个路径不是必要的,因为
cscope在windows下要用起来还得费点劲,4) 点会讲到)

安装ecb:解压,将解压后的ecb目录拷贝到site-lisp目录下。

安装cedet:解压,将解压后的 cedet目录拷贝到site-lisp目录下。

安装session:解压,将解压后的session目录拷贝到site-lisp目录 下。

安装doxymacs:解压,将解压后的doxymacs目录拷贝到site-lisp目录下。

安装 win32bash:点击user.exe安装文件一步步点到最后就行了。
到此安装工作完成。

3)配置.emacs启动文件
显 示指定扩展插件的加载地址(这一步好像不是必要的,只列出一个地址,其它类似)
(add-to-list ‘load-path “e:/emacs/site-lisp/ecb-2.31″
加载相应插件:
(require ‘xcscope) ;;加载xcscope
(require ‘cedet) ;;加载cedet
(require ‘ecb) ;;加载ecb
(require ‘session) ;;加载session
(add-hook ‘after-init-hook ‘session-initialize) ;; 启动时初始化session
(require ‘doxymacs) ;; 启动doxymacs
在配置文件中加入这些语句后,保存重启 emacs,重启后查看一下Message窗口中的加载信息,可以看到各个插件加载成功。
在.emacs中加入一些方便的设置就可以使用了,完整 的配置文件附在后面。(这些配置都是从google上到处搜刮来的,其中王垠博士的
网页上有很多emacs设置的好东西可以参考,还有一些英文网 站上贴出的配置文件中也有很多好东西,大家可以根据自己的习惯写自己的
配置)

4)问题及解决
安装进行到这里,大部分功能 都没有问题了,存在的问题有:
i)cscope的创建文件列表和创建代码符号索引两个命令不可用,按下C-c s L和C-c s I后minibuffer中显示cscope-indexer找不到。在
cscope的安装包中确实有一个cscope-indexer的文件, 我们安装时没有将它拷贝到emacs的安装路径中去,但是即使将它拷贝到bin目录下
也还是不能工作,用文本编辑器打开cscope- indexer会发现它其实是个shell脚本文件,从脚本中可以看到,它首先通过find,grep等工具
生成一个cscope.files的 文件,然后调用cscope使用cscope.files作为输入生成cscope.out的索引文件。
因此,只要能生成一个文件列表的文件就可 以使用win32版本的cscope.exe来生成cscope.out文件。到此,我们可以使用win32bash中的find
工具生成一个源 代码文件列表了(与unix下一样:find /my-project-source -name “*.[chs]” -print > cscope.files,不知windows下
是否有类似find这样功能的命令,xp下的find好像不能用通配符,如果有这样的东西就可以 不安装win32bash)。
生成了cscope.files源码文件列表后就可以使用它像si一样在代码间穿梭了:
C-c s a设定代码根目录,cscope.files必须放在这个设定目录下,否则cscope找不到;在第一次使用如下几条命令时cscope会自动生成
cscope.out, 也可以在windows的cmd中调用cscope.exe -b -i cscope.files -f cscope.out生成cscope.out。
C-c s g查找函数(或变量)定义;
C-c s c查看调用者;
C-c s C查看函数中调用的子函数;

ii)semantic中设置的项目根目录好像不起作用,在进行tag查找时semantic只查了当前目 录中的代码文件,如果引用的是其它目录中的函数
或变量,查找相应定义时就找不到。这个问题还不知道原因,可能是设置的问题,semantic的设 置项太多了。遇到相同问题的朋友请解答一下。

到此,si中常用的几个动作实现了。

还有个si中类似功能的实现:跳到函数 定义后如何在跳回刚才的调用函数的地方。
在王垠的网页中找到了一个实现
;;;临时记号
(global-set-key [(control ?\.)] ‘ska-point-to-register)
(global-set-key [(control ?\,)] ‘ska-jump-to-register)
(defun ska-point-to-register()
“Store cursorposition _fast_ in a register.
Use ska-jump-to-register to jump back to the stored
position.”
(interactive)
(setq zmacs-region-stays t)
(point-to-register )

(defun ska-jump-to-register()
“Switches between current cursorposition and position
that was stored with ska-point-to-register.”
(interactive)
(setq zmacs-region-stays t)
(let ((tmp (point-marker)))
(jump-to-register
(set-register 8 tmp)))
这样就可以在函数间跳来跳 去,
结合cscope的pop-mark,就可以跳来跳去了,这样基本可以满足大多数情况下的使用。
还有一些有用扩展:http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html

ecb,cedet(semantic) 提供了很多功能,不过由于太多了,需要慢慢摸索,目前使用cscope已经基本上实现了si上的几个常用功能,
ecb + semantic可以实现像si中的函数/变量上下文显示功能,但是由于4)ii)中提到的问题,这个显示上下文功能有时候不起作用。

C-c s s 序找符號
C-c s g 尋找全局的定義(即是 cscope-find-global-definition)
C-c s c 看看指定函數被哪些函數所調用
C-c s C 看看指定函數調用了哪些函數
C-c s e 尋找正則表達式
C-c s f 尋找文件
C-c s i 看看指定的文件被哪些文件include
C-c s u 回到上一個 symbol  (即cscope-pop-mark)

補充:修改 .emacs 取代常用的 cscope 命令,在 (require ‘xcscope) 後加上
(define-key global-map [f7] ‘cscope-pop-mark)
(define-key global-map [f8] ‘cscope-find-global-definition)
(define-key global-map [f9] ‘cscope-find-global-definition-no-prompting)
(define-key global-map [M-up] ‘cscope-prev-symbol)
(define-key global-map [M-down] ‘cscope-next-symbol)
(define-key global-map [f12] ‘c-down-conditional-with-else)
(define-key global-map [M-f12] ‘c-up-conditional-with-else)

查找配置文件目录:C-x C-f ~

本人_emac配置文件:

;;(setq initial-frame-alist ‘((top . 0) (left . 0) (width . 1024) (height . 768)))

(column-number-mode t)
(transient-mark-mode t)
(setq line-number-mode t)
(setq default-tab-width 8)

(customize-set-variable ‘scroll-bar-mode’ right)
;;(setq default-directory “home/jzj/backup/emacs/”)
(setq inhibit-startup-message t)
(setq global-font-lock-mode t)
(setq make-backup-files nil)
(setq auto-save-mode nil)
(setq x-select-enable-clipboard t)
(setq mouse-yank-at-point t)
;;(global-set-key [home] ‘beginning-of-buffer)

;;(global-set-key [end] ‘end-of-buffer)
(global-set-key [f3] ‘display-line-number-mode-on)
;;(global-set-key [f4] ‘other-window)
(global-set-key [f5] ‘compile)
(setq-default compile-command “make”)
;;(global-set-key [f7] ‘du-onekey-compile)
(global-set-key [f6] ‘gdb)
(global-set-key [C-f7] ‘previous-error)
(global-set-key [f7] ‘next-error)

;;(set-default-font “9×15″)
;;(set-default-font “-adobe-courier-medium-r-normal–14-100-100-100-m-90-iso10646-1″)
(set-default-font “10×20″)
;;(set-default-font “-outline-新宋体-normal-r-normal-normal-14-*-96-96-c-*-gb2312″)

;; cscope in emacs
(add-to-list ‘load-path “~/software/cscope-15.6/contrib/xcscope”)
(require ‘xcscope)

;; hotkey for cscope
(define-key global-map [(control f3)]  ‘cscope-set-initial-directory)
(define-key global-map [(control f4)]  ‘cscope-unset-initial-directory)
(define-key global-map [(control f5)]  ‘cscope-find-this-symbol)
(define-key global-map [(control f6)]  ‘cscope-find-global-definition)
(define-key global-map [(control f7)]
‘cscope-find-global-definition-no-prompting)
(define-key global-map [(control f8)]  ‘cscope-pop-mark)
(define-key global-map [(control f9)]  ‘cscope-next-symbol)
(define-key global-map [(control f10)] ‘cscope-next-file)
(define-key global-map [(control f11)] ‘cscope-prev-symbol)
(define-key global-map [(control f12)] ‘cscope-prev-file)
(define-key global-map [(meta f9)]  ‘cscope-display-buffer)
(define-key global-map [(meta f10)] ‘cscope-display-buffer-toggle)

(set-face-background ‘default “#334455″)
(set-face-foreground ‘default “wheat”)
(set-cursor-color “white”)
;;(add-to-list ‘load-path “~/software/color-theme-6.6.0″)
;;(require ‘color-theme)
;;(color-theme-dark-blue)

========================================================================

emacs是个强大的编辑器.在linux/unix下有广泛的使用群体.它既可以当做文字处理软件.也可以作为集成开发环境来用.很多人用 emacs编程序的时候只用到了内置的一些模式.其实emacs有个很好的集成开发环境ecb.安装之后可以让emacs有类似VS的样子.和自动补全等 诸多功能.本文会指导你在emacs下安装ecb和cedet.

我其实很懒的.如果网上能找到我也不会写出来了.如何在emacs下安装 ecb和cedet的中文文章确实很少.所以我来写一篇.本文内容都可以在.
ecb            http://ecb.sourceforge.net/
cedet         http://cedet.sourceforge.net/
网站上找到.但都是英文的.而且很罗嗦.我这个是精简版.如果还有安装问题.以上面 两个网站的内容为主.
ecb的主要功能是图形界面.有好几种模式可选
cedet里面又有好几个包semantic是语法分析.eieio 是面向对象设计的工具等等

本文目的:
指导安装ecb和cedet,搭建c,c++,lisp的开发环境

前提:
你 有个linux或unix系统.
GNU emacs

如果你不能满足这俩个条件,请现安装一个linux发行版.并且安装 emacs.

好吧,那么先展示一下装好的样子.很酷吧.

更多图片请看http://ecb.sourceforge.net/

先下载这两个软件的安装 包
ecb      http://ftp1.sourceforge.net/ecb/ecb-2.32.tar.gz
cedet

http://sourceforge.net/project/showfiles.php?group_id=17886&release_id=513873

然 后
tar zxvf ecb-2.32.tar.gz
tar zxvf cedet-1.0div4.tar.gz
cd cedet-1.0div4
make
等cedet生成完毕
在你的用户目录下面应该有一个.emacs文件(前面有个点).这个文 件是emacs的配置文件.现在我们要改这个文件(如果没有就自己创建一个).添加下面一段.注意,load-file那一行的目录要自己改一下
;; Load CEDET
(load-file “你存放cedet的目录/common/cedet.el”)
;;我的是(load- file “~/cedet-1.0/common/cedet.el”)

;; Enabling various SEMANTIC minor modes.  See semantic/INSTALL for more ideas.
;; Select one of the following:

;; * This enables the database and idle reparse engines
;;(semantic-load-enable-minimum-features)

;; * This enables some tools useful for coding, such as summary mode
;;   imenu support, and the semantic navigator
(semantic-load-enable-code-helpers)

;; * This enables even more coding tools such as the nascent intellisense mode
;;   decoration mode, and stickyfunc mode (plus regular code helpers)
;; (semantic-load-enable-guady-code-helpers)

;; * This turns on which-func support (Plus all other code helpers)
;; (semantic-load-enable-excessive-code-helpers)

;; This turns on modes that aid in grammar writing and semantic tool
;; development.  It does not enable any other features such as code
;; helpers above.
;; (semantic-load-enable-semantic-debugging-helpers)

这样cedet就装好了

接 下来安装ecb
在.emacs里面加入

(add-to-list ‘load-path “你放ecb的目录”)
;;例 如(add-to-list ‘load-path “~/.emacs.d/ecb-2.32″)
(require ‘ecb)

注 意这个段要加在cedet配置的后面

重启emacs

在emacs中打开一个c或者c++文件.选tool中的
Start Code Browser(ECB)
呵呵,看看有什么变化吧.

ecb和cedet都有多得吓人的功能.具体请看M-x ecb-show-help 和cedet包里面的install文件.

25
May
stored in: VIM相关 and tagged:
“============================
”任何system通用
“============================

” 显示中文帮助
if version >= 603
set helplang=cn
set encoding=utf-8
endif

” 设定默认解码
“set fenc =utf-8
“set fenc =utf-8,usc-bom,euc-jp,gb18030,gbk,gb2312,cp936

” 设定不与以前版本兼
set nocompatible

” 设置配色方案
colorscheme murphy

” 显示行号
set nu

” 侦测文件类型
filetype on

” 设置当文件被改动时自动载入
set autoread

“设置字体类型和大小 在窗口下使用 set guifont? 可以看到该命令
set gfn=Monospace\ 10

” 记录历史的行数
set history=100

” 显示语法高亮
syntax enable
syntax on

” 在处理未保存或只读文件的时候,弹出确认
set confirm

” 与windows共享剪贴板
set clipboard+=unnamed

” 载入文件类型插件
filetype plugin on
filetype indent on

” 为特定文件类型载入相关缩进文件
filetype indent on

” 保存全局变量
set viminfo+=!

” 带有如下符号的单词不要被换行分割
set iskeyword+=_,$,@,%,#,-

” 设置鼠标一直可用
set mouse=a

” 高亮当前行
set cursorline

” 命令行高度
set cmdheight=1

” 启动的时候不显示那个援助索马里儿童的提示
set shortmess=atI

” 不让vim发出讨厌的滴滴声
set noerrorbells

” 在被分割的窗口间显示空白,便于阅读
set fillchars=vert:\ ,stl:\ ,stlnc:\

“”””””””””””””””””””””””””””
” 文件设置
“”””””””””””””””””””””””””””
” 不要备份文件(覆盖文件时不备份)
set nobackup

” 不要生成swap文件,当buffer被丢弃的时候隐藏它
setlocal noswapfile
set bufhidden=hide

” 字符间插入的像素行数目
set linespace=0

” 增强模式中的命令行自动完成操作
set wildmenu

” 置粘贴模式,使得粘贴不错位
” set paste

” 保存文件,用习惯了Ctrl+S了
” nmap <C-s> <esc>:w<CR>
” imap <C-s> <esc>:w<CR>
noremap <C-S> :update<CR>
vnoremap <C-S> <C-C>:update<CR>
inoremap <C-S> <C-O>:update<CR>

“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
” 搜索和匹配
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
” 高亮显示匹配的括号
set showmatch

” 高亮显示被找到的句子(phrases)
“set hlsearch

” 在搜索时,输入的词句的逐字符高亮(类似firefox的搜索),即输入搜索内容时就显示搜索结果
set incsearch

” 搜索时忽略大小写
set ignorecase

” 不要闪烁
set novisualbell

“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
” 文本格式和排版
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
” 自动格式化
set formatoptions=tcrqn

” 继承前一行的缩进方式,特别适用于多行注释
set autoindent

” 为C程序提供自动缩进
set smartindent

” 使用C样式的缩进
set cindent

” 制表符为4
set tabstop=4

” 统一缩进为4
” 使得按退格键时可以一次删掉 4 个空格
set softtabstop=4
” 设定 << 和 >> 命令移动时的宽度为 4
set shiftwidth=4

” 不要用空格代替制表符
set noexpandtab

” 设置每行120个字符自动换行
set textwidth=120

” 自动切换当前目录为当前文件所在的目录
set autochdir

” 折叠代码
set foldmethod=syntax
” 文件打开时不折叠
set foldlevel=100

“””””””””””””””””””””””””””””””””””””””””””
“自动实例括号
“””””””””””””””””””””””””””””””””””””””””””
inoremap ( ()<ESC>i
inoremap ) <c-r>=ClosePair(‘)’)<CR>
inoremap { {}<ESC>i
inoremap } <c-r>=ClosePair(‘}’)<CR>
inoremap [ []<ESC>i
inoremap ] <c-r>=ClosePair(‘]’)<CR>
inoremap < <><ESC>i
inoremap > <c-r>=ClosePair(‘>’)<CR>
inoremap ‘ ”<ESC>i
inoremap ” “”<ESC>i
function ClosePair(char)
if getline(‘.’)[col('.') - 1] == a:char
return “\<Right>”
else
return a:char
endif
endf

“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“”””””””””””””””
” set mapleader
“”””””””””””””””
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
let mapleader = “,”

” platform
function! MySys()
if has(“win32″)
return “windows”
else
return “linux”
endif
endfunction

” if file not opened, create a new tab, or switch to the opened file
function! SwitchToBuf(filename)
” find in current tab
let bufwinnr = bufwinnr(a:filename)
if bufwinnr != -1
exec bufwinnr . “wincmd w”
return
else
” search each tab
tabfirst
let tb = 1
while tb <= tabpagenr(“$”)
let bufwinnr = bufwinnr(a:filename)
if bufwinnr != -1
exec “normal ” . tb . “gt”
exec bufwinnr . “wincmd w”
return
endif
tabnext
let tb = tb +1
endwhile
” not exist, new tab
exec “tabnew ” . a:filename
endif
endfunction
” fast edit .vimrc
if MySys() == ‘linux’
” fast reloading of the .vimrc
map <silent> <leader>ss :source ~/.vimrc<cr>
” fast editing of the .vimrc
map <silent> <leader>ee :call SwitchToBuf(“~/.vimrc”)<cr>
” when .vimrc is edited, reload it
autocmd! bufwritepost .vimrc source ~/.vimrc
elseif MySys() == ‘windows’
” Set helplang
set helplang=cn
“Fast reloading of the _vimrc
map <silent> <leader>ss :source ~/_vimrc<cr>
“Fast editing of _vimrc
map <silent> <leader>ee :call SwitchToBuf(“~/_vimrc”)<cr>
“When _vimrc is edited, reload it
autocmd! bufwritepost _vimrc source ~/_vimrc
endif
if MySys() == ‘windows’
source $VIMRUNTIME/mswin.vim
behave mswin
endif

“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“””””””””””””””””””””””””””””””””””””””””””””
” 插件
“””””””””””””””””””””””””””””””””””””””””””””
“”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””

“”””””””””””””””””””””””””””””
“加入工程使得能够访问ctags
“”””””””””””””””””””””””””””””
“project1″
set tags =~/prog/tags
“project2″
set tags +=~/kernelearn/tags
“后面的工程加在tags变量上

“”””””””””””””””””””””””””””””
” 设置Taglist
“”””””””””””””””””””””””””””””
” 按照名称排序
let Tlist_Sort_Type = “name”
” 在右侧显示窗口
let Tlist_Use_left_Window = 1
” 如果只有一个buffer,kill窗口也kill掉buffer
let Tlist_Exist_OnlyWindow = 1
” 使taglist只显示当前文件tag,其它文件的tag都被折叠起来(同时显示多个文件中的tag时)
let Tlist_File_Fold_Auto_Close = 1
” 不要显示折叠树
let Tlist_Enable_Fold_Column = 1
“不同时显示多个文件的tag,只显示当前文件的
let Tlist_Show_One_File = 1
” 键盘映射
nmap tl :TlistToggle<cr>

“””””””””””””””””””””””””””””””””””””””””””””
“设置 winManager winManager管理netrw和Taglist。
“””””””””””””””””””””””””””””””””””””””””””””
let g:winManagerWindowLayout = “BufExplorer,FileExplorer|TagList”
let g:persistentBehaviour = 0
let g:winManagerWidth = 30
let g:defaultExplorer = 0
nmap <C-W><C-F> :FirstExplorerWindow<cr>
nmap <C-W><C-B> :BottomExplorerWindow<cr>
“nmap <silent> <F8> :WMToggle<cr>
nmap wm :WMToggle<cr>
“设置 netrw
“”””””””””””””””””””””””””””””
“let g:netrw_winsize = 30
“nmap <silent> <leader>fe :Sexplore!<cr>
“let Tlist_File_Fold_Auto_Close=1

“”””””””””””””””””””””””””””””
“设置 MiniBufExploer
“”””””””””””””””””””””””””””””

” quickfix模式
autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>

“”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“”””””””””””””””””””””””””””””””””””””””””””””””””
“F5编译和运行C++程序
“F6编译和运行C程序
“”””””””””””””””””””””””””””””””””””””””””””””””””
“”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””

” C的编译和运行
map <F6> :call CompileRunGcc()<CR>
func! CompileRunGcc()
exec “w”
exec “!gcc % -o %<”
exec “! ./%<”
endfunc

” C++的编译和运行
map <F5> :call CompileRunGpp()<CR>
func! CompileRunGpp()
exec “w”
exec “!g++ % -o %<”
exec “! ./%<”
endfunc

source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = ‘-a –binary ‘
if &diffopt =~ ‘icase’ | let opt = opt . ‘-i ‘ | endif
if &diffopt =~ ‘iwhite’ | let opt = opt . ‘-b ‘ | endif
let arg1 = v:fname_in
if arg1 =~ ‘ ‘ | let arg1 = ‘”‘ . arg1 . ‘”‘ | endif
let arg2 = v:fname_new
if arg2 =~ ‘ ‘ | let arg2 = ‘”‘ . arg2 . ‘”‘ | endif
let arg3 = v:fname_out
if arg3 =~ ‘ ‘ | let arg3 = ‘”‘ . arg3 . ‘”‘ | endif
let eq = ”
if $VIMRUNTIME =~ ‘ ‘
if &sh =~ ‘\<cmd’
let cmd = ‘””‘ . $VIMRUNTIME . ‘\diff”‘
let eq = ‘”‘
else
let cmd = substitute($VIMRUNTIME, ‘ ‘, ‘” ‘, ”) . ‘\diff”‘
endif
else
let cmd = $VIMRUNTIME . ‘\diff’
endif
silent execute ‘!’ . cmd . ‘ ‘ . opt . arg1 . ‘ ‘ . arg2 . ‘ > ‘ . arg3 . eq
endfunction

” 自动补全(ctrl-p)时的一些选项: 多于一项时显示菜单,最长选择; 显示当前选择的额外信息
if v:version >= 700
set completeopt=menu,longest,preview
endif

“”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“””””””””””””””””””””””””””””””””””””””””””””””””
” 状态行相关动作
“””””””””””””””””””””””””””””””””””””””””””””””””
“”””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””

” 显示状态栏 (默认值为 1, 无法显示状态栏)
set laststatus=2

” 状态行颜色
highlight StatusLine guifg=#FFFFFF guibg=#00008B
highlight StatusLineNC guifg=#FFFFFF guibg=#00008B

function! CurDir()
let curdir = substitute(getcwd(), ‘/Users/amir/’, “~/”, “g”)
return curdir
endfunction

“””””””””””””””””””””””””””””””
“状态行显示内容
“””””””””””””””””””””””””””””””
” %F 当前文件名
” %m 当前文件修改状态
” %r 当前文件是否只读
” %Y 当前文件类型
” %{&fileformat} 当前文件编码
” %b 当前光标处字符的 ASCII 码值
” %B 当前光标处字符的十六进制值
” %l 当前光标行号
” %c 当前光标列号
” %V 当前光标虚拟列号 (根据字符所占字节数计算)
” %p 当前行占总行数的百分比
” %% 百分号
” %L 当前文件总行数
set statusline=\ %F%m%r%h\ %w\ \ CWD:\ %r%{CurDir()}%h\ \ \ Line:\ %l/%L:%c
” 设置在状态行显示的信息如下:

set nowrapscan

“Highlight current
if has(“gui_running”)
set cursorline
hi cursorline guibg=#333333
hi CursorColumn guibg=#333333
endif

“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
” => VIM userinterface
“””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””””
“Set 7 lines to the curors – when moving vertical..
set so=7

“Do not redraw, when running macros.. lazyredraw
set lz

“Change buffer – without saving
set hid

“Set magic on
set magic

“How many tenths of a second to blink
set mat=2

set lines=40
set columns=100

“””””””””””””””””””””””””””””””””””””””””””””””””””
“菜单栏、工具栏显示与隐藏的切换
“””””””””””””””””””””””””””””””””””””””””””””””””””
“set guioptions-=T
“set guioptions-=m
map <silent> <F4> :if &guioptions =~# ‘T’ <Bar>
\set guioptions-=T <Bar>
\set guioptions-=m <bar>
\else <Bar>
\set guioptions+=T <Bar>
\set guioptions+=m <Bar>
\endif<CR>

“”””””””””””””””””””””””””””””””””””””””””””””””””””
” 日历插件设置
“”””””””””””””””””””””””””””””””””””””””””””””””””””
” let g:calendar_diary = /calendar
” map ca :Calendar<cr>

” 让 gvim 支持 Alt+n 来切换标签页
function! BufPos_ActivateBuffer(num)
let l:count = 1
for i in range(1, bufnr(“$”))
if buflisted(i) && getbufvar(i, “&modifiable”)
if l:count == a:num
exe “buffer ” . i
return
endif
let l:count = l:count + 1
endif
endfor
echo “No buffer!”
endfunction
function! BufPos_Initialize()
for i in range(1, 9)
exe “map <M-” . i . “> :call BufPos_ActivateBuffer(” . i . “)<CR>”
endfor
exe “map <M-0> :call BufPos_ActivateBuffer(10)<CR>”
endfunction
autocmd VimEnter * call BufPos_Initialize()

” 按F11键让VIM全屏
if has(‘gui_running’) && has(“win32″)
map <F11> <Esc>:call libcallnr(“gvimfullscreen.dll”, “ToggleFullScreen”, 0)<CR>
endif

==============================华丽的分割线===========================
“以下用于MS
set nocompatible
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
let opt = ‘-a –binary ‘
if &diffopt =~ ‘icase’ | let opt = opt . ‘-i ‘ | endif
if &diffopt =~ ‘iwhite’ | let opt = opt . ‘-b ‘ | endif
let arg1 = v:fname_in
if arg1 =~ ‘ ‘ | let arg1 = ‘”‘ . arg1 . ‘”‘ | endif
let arg2 = v:fname_new
if arg2 =~ ‘ ‘ | let arg2 = ‘”‘ . arg2 . ‘”‘ | endif
let arg3 = v:fname_out
if arg3 =~ ‘ ‘ | let arg3 = ‘”‘ . arg3 . ‘”‘ | endif
let eq = ”
let g:html_tag_case = “lowercase”
if $VIMRUNTIME =~ ‘ ‘
if &sh =~ ‘\<cmd’
let cmd = ‘””‘ . $VIMRUNTIME . ‘\diff”‘
let eq = ‘”‘
else
let cmd = substitute($VIMRUNTIME, ‘ ‘, ‘” ‘, ”) . ‘\diff”‘
endif
else
let cmd = $VIMRUNTIME . ‘\diff’
endif
silent execute ‘!’ . cmd . ‘ ‘ . opt . arg1 . ‘ ‘ . arg2 . ‘ > ‘ . arg3 . eq
endfunction

let g:html_tag_case = “lowercase”
colo murphy
set helplang=cn
set enc=utf-8
set fileencodings=ucs-bom,utf-8,chinese
set langmenu=zh_CN.UTF-8
set nu
set nobackup
language message zh_CN.UTF-8
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
set termencoding=gbk
set ambiwidth=double
set guifont=NSimSun:h12
syntax on    “语法高亮度显示

“下面直到结束是文库使用的配置定义

iab tb <table id=””>
iab img <img src=””>

“下面是录入时用的缩写

iab he <h1></h1>
iab h2e <h2></h2>
iab be <b></b>
iab fe <footnote> </footnote>
iab ee <endnote> </endnote>
iab qe <quote> </quote>
iab hle <headline> </headline>
iab pe <pre> </pre>

“以下是校对时用的缩写,请特别注意</endnote>缩写为/e

iab h <h1>
iab eh </h1>
iab h2 <h2>
iab eh2 </h2>
iab b <b>
iab eb </b>
iab f  <footnote>
iab ef  </footnote>
iab e  <endnote>
iab /e  </endnote>
iab p  <pre>
iab ep  </pre>
iab q  <quote>
iab eq  </quote>
iab hl <headline>
iab ehl </headline>

filetype plugin on  “打开插件

inoremap ? ??<ESC>i
inoremap ? <c-r>=ClosePair(‘?’)<CR>
inoremap ( ()<ESC>i
inoremap ) <c-r>=ClosePair(‘)’)<CR>
inoremap { {}<ESC>i
inoremap } <c-r>=ClosePair(‘}’)<CR>
inoremap [ []<ESC>i
inoremap ] <c-r>=ClosePair(‘]’)<CR>
inoremap < <><ESC>i
inoremap > <c-r>=ClosePair(‘>’)<CR>
inoremap ‘ ”<ESC>i
inoremap ” “”<ESC>i
function ClosePair(char)
if getline(‘.’)[col('.') - 1] == a:char
return “\<Right>”
else
return a:char
endif
endf

前面两部分讲的都是如何使用现有的 Vim 系统,本部分则会通过实例来讲如何定制 Vim 的行为。良好的定制可以让使用 Vim 变得更为得心应手;同时,在掌握了基本的定制之后,也许你就会想进一步写一些自己的 Vim 脚本,从而真正地成为一个 Vim 专家。

3.1. Vim 脚本基础

在 .vimrc 文件中,和在第二章提到的插件和语法文件中,使用的语言就是 Vim 脚本语言。这种脚本语言语法有点像 BASIC,表达式有点像 C,还是比较容易理解的。本章中并不打算对其作很系统的介绍(要完整了解的话,请参见“:help usr_41.txt”),而只是介绍一些基本知识,特别是,了解定制 .vimrc 所需要的基本知识。

Vim 脚本相当于可直接在命令模式下执行的命令,只是不需要输入前面的冒号(如果用了冒号也不会出错)。因此,像设置选项、创建键盘映射这样的命令是直接可用 的。当然,作为一种脚本语言,除了普通键盘上会输入的命令外,我们还需要一些更复杂的功能,特别是:变量,表达式,条件和循环语句,函数。

3.1.1. 变量

Vim 中使用如下的语法对变量进行赋值(创建变量):

let 变量名 = 数值

变量类型有两种,整数和字符串,在第一次赋值之前都不能使用。变量名除了可使用常规的字母、下划线和数字外,还可以使用几种特殊的前缀:

  • “b:”——只对当前缓冲区(buffer)有效的变量;
  • “w:”——只对当前编辑窗口(window)有效的变量。
  • “g:”——全局变量(在函数中访问全局变量必须使用该前缀,不加前缀的话则认为是函数内的局部变量);
  • “s:”——变量名只在当前脚本中有效;
  • “a:”——函数的参数;
  • “v:”——Vim 内部预定义的特殊变量(参见“:help vim-variable”)。

下面三个前缀用来访问特殊的数值,由于行为和变量较为相似(可以读取和修改),也放在这儿一起讲:

  • “$”——访问环境变量;
  • “&”——访问 Vim 选项;
  • “@”——访问寄存器。

当变量不再使用时,可以使用“unlet 变量名”删除变量。

3.1.2. 表达式

和 C 非常类似,可以使用变量和常量,可以使用括号,可以调用函数(“函数名(…)”),支持加法(“+”)、减法(“-”)、乘法(“*”)、除法 (“/”)和取模(“%”),支持逻辑操作(“&&”、“||”和“!”),支持三元条件表达式(“a ? b : c”)。字符串操作方面当然比 C 要强,可以使用“.”进行字符串拼接;可使用“==”、“<=”等进行字符串大小比较,可使用“=~”和“!~”进行正则表达式匹配,而且可以在比 较操作符后面添加“#”或“?”来强制进行大小写敏感或不敏感的比较(缺省受 Vim 选项 ignorecase 影响)。显示一个表达式的结果,可以使用“:echo 表达式”显示到状态栏上,或者在插入模式下使用“Ctrl-R=表达式”插入到缓冲区的文本中。

和其它很多在 Unix 下成长起来的语言一样,Vim 的字符串常量有双引号和单引号两种方式。使用单引号的话,单引号间的任何字符都是字符串的一部分,其中不能再包含单引号。使用双引号的话,则可以使用 “\”产生换码序列(具体可参考“:help expr-quote”),如“\n”代表换行符,“\””代表双引号,“\\”代表反斜杠本身,等等。

需要注意的话,双引号除了可以表示字符串常量外,还可以表示注释。行首的“””,以及表达式中出现的成单的“””,都表示“””后面的部分全部是注 释。

3.1.3. 条件和循环语句

条件语句形式如下:

if 表达式
  语句
endif

if 表达式
  语句
else
  语句
endif

if 表达式
  语句
elseif 表达式
  语句
endif

循环语句形式如下:

while 表达式
  语句
endwhile

条件和循环语句都可以嵌套。这些比较简单,就不多加说明了。

3.1.4. 函数

在表达式中使用函数时,就跟 C 里面的方式类似,直接使用函数名加括号,括号里写上参数(可选)。在不需要返回值的情况下调用函数时,稍稍有些不同,要使用“call”命令,后面跟函数 名和括号(括号里面写上可能有的参数)。

定义函数使用下面的语法:

function 函数名称(参数列表)
  语句
endfunction

如果已有同名函数存在,Vim 会报错,除非在“function”后面加上一个“!”。

如果参数中不包含“…”,那么参数的数量是固定的,函数的调用者必须提供跟定义同样多的参数(在函数定义中使用参数名之前加上“a:”进行访 问)。如果参数中包含“…”,那么参数的数量不固定,除了可以使用参数名称访问传递过来的参数外,还可以使用“a:0”知道额外传递的参数数量,使用 “a:1”、“a:2”等访问这些额外传递的参数。

要在函数的中间返回,或者要返回数值的话,可以使用“return”语句。

Vim 内部定义了一百多个函数,详细列表请参见“:help function-list”。


3.2. 我的 .vimrc

作为一个 Vim 脚本的一个具体示例,我将讲解一下最实用的情况,我的 .vimrc 文件。文件 .vimrc.html (请下 载到本地打开) 是我的 .vimrc 文件通过以下步骤生成的 HTML 文件:

1. 在 Vim 中打开 .vimrc 文件;

2. 执行命令“:colorscheme koehler”(缺省配色可能在浏览器中效果不佳)

3. 执行命令“:%!nl -w4 -s’ ‘”(1.11 节)

4. 执行命令“:TOhtml”(1.13 节)

5. 执行命令“:w”

可以把浏览器中的文本内容粘贴到 Vim 中,然后使用下面这个替换命令“:%s/^ \+[0-9]\+ //”删除前面的行号,来恢复出最初的 .vimrc 文件。

下面逐行进行讲解,并包含理解其内容所需的资料的链接。建议大家直接阅读 .vimrc 文件的内容,并在有疑问时查阅下面的解释。

第 1 行:注释(3.1.2 节末段),其中包含一个模式行(1.4 节和 1.5 节)。

第 2 行:首先判断系统是否具有“自动命令”(autocmd)的支持,有的话才执行第3到第六行的内容(1.1 节、“:help has”和“:help feature-list”)。

第 3 行:纯注释(后面我将跳过注释行不再说明)。

第 4 行:清除所有的自动命令(“:help autocmd-remove”),以方便调试,可以使用“source ~/.vimrc”查看一些修改后的效果(“:help source”)。

第 6 行:对于后缀为“.asm”的文件,认为其是微软的 Macro Assembler 格式(“:help masm-syntax”)。

第 7 行:与第 2 行的 if 语句配对。

第 8-10 行:当使用了图形界面时(“:help feature-list”),确保所有的文件类型会在菜单“语法”(“Syntax”)下出现,而不是出现一个菜单项“Show filetypes in menu”。缺省行为可以让 Vim 启动得更快一点点。

第 11-13 行:当使用了图形界面,并且环境变量 LANG 中不含“.”(即没有规定编码)时,把 Vim 的内部编码设为 UTF-8。

第 14 行:不需要保持和 vi 非常兼容(“:help ‘compatible’”)。

第 15 行:执行 Vim 缺省提供的 .vimrc 文件的示例,包含了打开语法加亮显示等最常用的功能。

第 16 行:打开自动缩进(1.4 节)。

第 17 行:缺省不产生备份文件(“:help ‘backup’”)。

第 18 行:在输入括号时光标会短暂地跳到与之相匹配的括号处,不影响输入(“:help ‘showmatch’”)。

第 19 行:正确地处理中文字符的折行和拼接(1.12 节)。

第 20 行:可自动识别的文件类型为带 BOM 字符的 Unicode 文件、UTF-8 编码的文件和 GBK 编码的文件。

第 21 行:设置状态行,使其能额外显示文件的编码信息,如图 2 中的“gbk”和“big5”(“:help ‘statusline’”)。
图 2
图2

第 22-24 行:如果该 Vim 支持鼠标,则启用鼠标支持(1.3 节)。

第 25-29 行:判断 Vim 是否包含多字节语言支持(multi_byte 特性),并且版本号(“:help v:version”)大于 6.1(包含 ambiwidth 选项)。

第 26-28 行:如果 Vim 的语言(“:help v:lang”;受环境变量 LANG 影响)是中文(zh)、日文(ja)或韩文(ko)的话,将模糊宽度的 Unicode 字符的宽度(ambiwidth选项,1.2 节)设为双宽度(double)。

第 31-36 行:改变上、下方向键行为方式:通常情况下这些键的作用范围是逻辑行,所以如果行很长的话光标的移动可能会不太方便;这些键盘映射把这些键的作用范围改成 屏幕行(“help gk”),还为习惯使用“j”、“k”的人增加了映射“Ctrl-j”和“Ctrl-k”作用于屏幕行。前面四个映射使用的命令是“noremap”,作 用于正常模式、可视模式和命令执行时;后面两个映射使用的命令是“inoremap”,仅作用于插入模式,其中使用“Ctrl-O”临时执行一个普通模式 的命令(“:help i_CTRL-O”)。

第 38-41 行:在 Vim 中的插入模式中可以使用“Ctrl-R =”计算整数表达式的数值,但 Vim 本身没有计算浮点表达式的能力。这四个映射提供了浮点表达式的计算能力:使用“\ma”(假设 Leader 字符为缺省的“\”,参见“:help <Leader>”)可将计算的结果放到下一行上(待计算的表达式为当前行或在可视模式选中的内容),使用“\mr”则用计算的结果替换待计 算的表达式(同样为当前行或在可视模式选中的内容)。这些映射假设有一个命令“calcu”可用来计算一个表达式的内容。该命令可用下面的 shell 脚本简单实现:

#! /bin/sh
echo "$*" | sed -e $'s/\r$//' -e 's/sin *(/s(/g' -e 's/cos *(/c(/g' -e 's/atan * (/a(/g' -e 's/log *(/l(/g'
-e 's/exp *(/e(/g' | bc -l

该脚本把表达式转换成 bc [1] 能接受的形式(把“sin(x)”转换成“s(x)”,等等),并通过标准输出送到 bc 的标准输入。

该映射较为复杂,此处不详加解释了——其中心思想都是选取待计算的表达式,放到无名寄存器中,然后使用“Ctrl-R””粘贴到命令行上,使用 calcu 进行计算,再把结果粘贴回正在编辑的缓冲区中;最后一个最复杂,因为为了替换原先的表达式,还需要记住原先被选中的内容的起始和结束位置,你可能希望看一 下“:help gv”、“:help v_o”、“:help m”、“:help `”,并复习节 1.11。可以注意一下,在映射中使用了“<silent>”(“:help map-<silent>”),这会防止命令行上回显执行的内容。

第 43-44 行:允许用户使用 F2 来取消搜索/替换的加亮显示。此处一个映射用于正常模式(nmap),一个用于插入模式(imap)。上面已经提过一次,“Ctrl-O”可以在插入模式 中执行一个正常模式的命令。

第 46-47 行:这两个映射用于 taglist 插件,使用 F9 直接打开(或关闭)taglist 的窗口。

第 49-50 行:方便快速修订窗口(1.10 节)的使用,可使用 F11(和 F12)查看下一个(上一个)错误(或 grep 项等)。

第 52-65 行:一些适用于文本模式运行的 Vim 的设定;详见下面的具体说明。

第 54-56 行:将变量 Tlist_Inc_Winwidth 的值设为 0,防止 taglist 插件改变终端窗口的大小(有些情况下会引起系统不稳定)。使用“has(‘eval’)”是让该语句仅在功能较为完整、至少支持表达式的 Vim 版本中运行。

第 58-64 行:在系统支持 wildmenu 特性(“:help ‘wildmenu’”)启用文本模式的菜单。

第 59 行:打开 wildmenu 选项,启动具有菜单项提示的命令行自动完成。

第 60 行:确保字符序列“<C-Z>”被理解为 Ctrl-Z 而不是分开的五个字符(“:help ‘cpoptions’”)。

第 61 行:设置使用 Ctrl-Z 激活自动完成提示。

第 62-63 行:把正常模式和插入模式下的 F10 映射成执行菜单项,并自动提示菜单内容。注意缺省菜单仍不会自动载入,我使用该特性的主要目的是在文本模式的 Vim 中使用 CVS 菜单。图 16 是按 F10 键后再按 Tab 键的结果。
图 16
图16

第 66-161 行:使用自动命令(autocmd)特性的设置。使用“has”来防止该部分内容在不支持自动命令的 Vim 版本中运行。

第 67-129 行:定义了若干个下面的自动命令会用到的函数,具体在下面的自动命令中讲。请注意在每个“function”之后都用了一个“!”(“:help E122”):这也是为了方便调试,让“source ~/.vimrc”能正确运行而不会报告函数已定义的错误。

第 131-133 行:只要没有将环境变量 VIM_HATE_SPACE_ERRORS 的值设为零,则把变量 c_space_errors 的值设为 1——效果是在 C/C++ 代码中“不正确”的空白字符(行尾的空白字符和紧接在制表符之前的空格字符)将会被高亮显示。图 17所示的代码中,第 3 行的行尾多了两个空格,第 5 行的第一个制表符之前多了个空格。Vim 提示#935 里有一些额外的说明。同时请参看对第 160 行的说明。
图 17
图 17

第 135 行:使用的英文拼写变体为加拿大风格,即:使用拼写“abridgement”(而不是“abridgment”)、“colour”(而不是 “color”)、“realize”(而不是“realise”)、“theatre”(而不是“theater”)等,比较符合中国人一般的英语教科 书中的拼写方式,也比较适合于写“国际”英语。

第 138 行:使用键盘映射“\a”来查看光标下字符的属性,主要用于调试 Vim 的语法文件。图 18显示了光标下的字符所属的语法“组”为 vimOption,使用配色方案中的 PreProc(预处理符号)项,前景色为紫色(RGB:#a020f0)。有兴趣可查看 Vim 脚本#383 的具体内容。
图 18
图18

第 140 行:在函数找不到时(“:help FuncUndefined”),自动在运行环境(Linux 下一般为 ~/.vim)的 autoload 目录下读入与函数名同名的 .vim 文件。这是脚本#383 的建议安装方式(SyntaxAttr.vim 文件放在 autoload 目录下,仅在执行时载入)。

第 142 行:设置适用于 C/C++ 文件的选项(1.4 节)。

第 143 行:把补丁文件的缩进和制表符宽度设定设成和 C/C++ 文件相同(1.4 节)。

第 144 行:取消 Vim 对 HTML 标记自动产生的缩进,但打开自动缩进选项(1.4 节)。

第 145 行:对于变更日志类型的文件,设置行宽为 76 个字符(1.12 节)。

第 147 行:当文件后缀为“.gb”时,认为这是一个 GBK 编码的文件,在读入文件之前(“:help BufReadPre”)调用函数 SetFileEncodings 把原先的 fileencodings 选项的内容保存在本缓冲区的一个变量中(3.1.1 节),然后把 fileencodings 设成 gbk,即只尝试对文件内容作为 GBK 字符序列来解释。

第 148 行:类似于上面把“.big5”后缀的文件当作 Big5 编码的文件,在读入文件之前把 fileencodings 设成 big5,只尝试对文件内容作为 Big5 字符序列来解释。

第 149 行:类似于上面把“.nfo”后缀的文件当作 CP437 编码(即英文 DOS 的 OEM 字符集编码)的文件。效果可参看图 19。
图 19
图19

第 150 行:在读入 .gb、.big5 或 .nfo 文件之后(“:help BufReadPost”),调用函数 RestoreFileEncodings 恢复保存起来的 fileencodings 原数值。

第 151 行:对于 .txt 后缀的文件,在显示文件时(“:help BufWinEnter”,确保在模式行被执行之后)调用函数 CheckFileEncoding 检查文件是否已修改并且 fileencoding 设有数值。条件满足的话说明该文件在模式行中修改了 fileencoding,因而使用该编码(“:help ++enc”)重新强制(“!”)读入该文件以保证文件被正确解码。Vim 提示#911 里有一些额外的说明。

第 153 行:在遇到 HTML 文件时,如果 Vim 判断出的编码类型和 HTML 代码中使用“<meta http-equiv=”Content-Type” content=”text/html; charset=编码”>”规定的编码不一致,将使用网页中规定的编码重新读入该文件。函数 ConvertHtmlEncoding 会把一些网页中使用的编码名称转换成 Vim 能够正确处理的编码名称;函数 DetectHtmlEncoding 在判断文件类型确实是 HTML 之后,会记下当前的光标位置,并搜索上面这样的 HTML 代码行,找出字符集编码后,在编码不等于当前文件编码(fileencoding)时且当前文件编码为空或等于系统判断出的文件编码时,使用该编码强制重 新读入文件,忽略任何错误(“silent!”)。该自动命令写成是可嵌套执行的(“:help autocmd-nested”),目的是保证语法高亮显示有效,且上次打开文件的光标位置能够正确保持。Vim 提示#1074 里有一些额外的说明。

第 155-156 行:确保把 /usr/include/c++ 和 /usr/include/g++-3 目录下的所有文件都当成 C++ 类型的文件,不管 Vim 原先认定这些文件类型是什么(“:help BufEnter”)。C++ 的很多标准头文件(如“algorithm”)没有文件后缀,缺省情况下不会被 Vim 当作 C++ 文件。

第 158 行:第 142 行把 C/C++ 文件的制表符宽度设成了 4(个人设置),但系统的源代码一般使用 GNU 编码规范,制表符宽度为 8。该行设置所有 /usr 目录下的文件都使用 GNU 编码规范(1.4 节)。

第 160 行:在写文件之前(“:help BufWritePre”),调用函数 RemoveTrailingSpace:只要没有将环境变量 VIM_HATE_SPACE_ERRORS 的值设为零,则对于文件类型为 C、C++、Vim 脚本类型的文件,自动悄悄清除所有的行尾空白字符;“normal m`”记忆当前的光标位置,“normal “”恢复记忆下来的光标位置。

至此为此,我已经介绍了 Vim 的基本知识、很多实用技巧和一些最常用的 Vim 插件,并通过定制 .vimrc 文件介绍了脚本的基本知识。如果有需要进一步深入学习 Vim 或是想提什么关于 Vim 的特定问题的话,不妨参加从 Vim 的网站上参加 Vim 的邮件讨论列表,应该会获益良多。而作者也希望本文至此也已经完成了引导读者学习、了解 Vim 的高级特性的任务。

第 一部分介绍了一些基本的 Vim 使用技巧。掌握这些技巧可以很大地提高编辑效率,但是 Vim 的强大功能并不仅限于此。Vim 还可以通过“插件”来进行功能扩展。精确地说,是通过脚本来进行扩展,脚本类型有插件、语法加亮、配色方案、文件类型检测等多种。大部分的脚本都是由 Vim 的用户写的,解决了用户身边的问题,使 Vim 变得更加有用。本章将介绍最常用的一些脚本,其中除了一个属于“语法加亮”脚本外,其它都属于“插件”类型。关于如何写脚本的一些基础知识将在下一部分进 行一些介绍。

2.1. gzip(压缩文件支持)

作者:Bram Moolenar

网站脚本编号:无(包含在 Vim 的标准发布之中)

安装说明:

功能说明:

该脚本使得 Vim 可以直接打开使用 gzip [1]、bzip2 [2] 和 compress [3] 压缩的文件(要求存在相应的命令行工具)。后缀为“.gz”、“.bz2”和“.Z”的文件会在打开时被动态解压缩,并在写操作时被自动重新压缩。

打开压缩文件时,屏幕上出现一个(不正确的)“[noeol]”的提示是正常的,不必进行理睬。

2.2. netrw(网络文件支持)

作者:Charles E. Campbell, Jr.(绰号 Dr. Chip)

网站脚本编号:1075(Vim 的标准发布之中可能包含一个较老的版本)

安装说明:

Vim 6.4 的标准发布带的版本是 42,较老、功能不齐全,但无须安装。建议:

1. 在 Vim 网站上下载版本 62(更新的版本只能用于 Vim 7);
2. 使用“tar xvfj netrw.tar.bz2 -C ~/.vim”解开;
3. 在Vim中运行“:helptags ~/.vim/doc”安装文档。

功能说明:

支持直接读写网络上的文件,支持的协议有 ftp、http、rsync、scp 等。比如,使用 FTP 协议以用户名 adah 打开服务器 server 上 ~/temp 目录下的 test.cpp 文件,可以直接在命令行上使用:

vim ftp://adah@server/temp/test.cpp

Vim会自动提示用户输入口令,然后打开文件。

更多的帮助内容请参考“:help netrw”。

2.3. engspchk(英文拼写检查)

作者:Charles E. Campbell, Jr.(绰号Dr. Chip)

网站脚本编号:195

安装说明:
在 Vim 网站上下载最新版本(engspchk.tar.gz);
使用“tar xvfz engspchk.tar.gz -C ~/.vim”解开;
在Vim中运行“:helptags ~/.vim/doc”安装文档。
提示替换拼写功能需要 agrep [4],可能需要另外下载安装。

功能说明:
一个Vim专用的拼写检查器,其最主要的特点是:

  • 可以通过变量 spchkdialect 选择英语变体(英国、美国、加拿大),对于找不到的词、不常见的词、不在当前英语变体中的词以不同的方式加亮显示;
  • 支持用户词典(保存在 .vim/CVIMSYN 目录中)和项目词典(保存在被检查文件所在的目录中);
  • 对于源代码文件,只对注释进行拼写检查,而不会对你的变量名称胡乱提抗议;
  • 通过词典文件可支持除英语以外的其它语言。

图 5 中的窗口里 engspchk 正在运行中。其中可以看到,红色部分是插件所不能识别的单词,黄色部分是当前英文变体(缺省是美国英语)中不正确的拼法,而青色部分是很少见的单词。图中 运行的是包含图形界面支持的 Vim,因而还可以看到一个名为 DrChip 的菜单项(参见图6),在其中可通过菜单选择拼写检查相关的各项功能;同时还能看到快捷键:“\ec”开始拼写检查,“\ee”结束拼写检查,“\ea” 选择替换拼写,等等。在文本模式的 Vim 中,我们一般就只使用这些快捷键了。
图 5
图 5

图 6
图 6

更多的帮助内容请参考“:help engspchk”。

2.4. calendar(日历显示)

作者:Yasuhiro Matsumoto

网站脚本编号:52

安装说明:

在 Vim 网站上下载文件 calendar.vim,存到 ~/.vim/plugin 目录中。

功能说明:

图 6 的下半部分就是 calendar 的运行示例,是直接在正常模式下键入“\caL”显示出来的。光标在该窗口中时,可使用左箭头或上箭头显示前一个月,右箭头或下箭头显示后一个月,“t” 回到“今天”,“q”关闭日历窗口。在有鼠标支持时,也可以使用鼠标在黄色字样的“Prev”、“Today”、“Next”上双击达到类似的效果。

除使用“\caL”外,“\cal”也可以打开一个日历窗口,但显示位置是在 Vim 的左侧而不是下方。另外,命令“:Calendar”效果和“\cal”相同,但其后可以跟参数:一个参数的话表示月份,两个参数的话则分别表示年份和月 份。“:CalendarH”与“:Calendar”类似,但日历窗口的打开位置和“\caL”(而不是“\cal”)一样,是在下方而不是左侧。

2.5. project(文件的“项目”管理)

作者:Aric Blumer

网站脚本编号:69

安装说明:

1. 在 Vim 网站上下载最新版本(project-1.3.tar.gz);
2. 使用“tar xvfz project-1.3.tar.gz -C ~/.vim”解开;
3. 在 Vim 中运行“:helptags ~/.vim/doc”安装文档。

功能说明:

该插件可以把文件组织成一棵树的形式,以便于查找和管理。使用命令“:Project”即可打开一个用户的“项目文件” (~/.vimprojects)。项目文件采用普通的文本文件的形式,非常易于浏览和修改。图 7 是一个示例。其中左边窗口部分的就是一棵项目树,完整内容如下:
图 7
图7

CvsMenu="~/.vim" CD=. {
 plugin/cvsmenu.vim
 doc/cvsmenu.txt
}
Nvwa="~/nvwa_local" CD=. {
 doc=doc {
  ChangeLog
  README
  webupdate.sh
 }
 nvwa=nvwa {
  bool_array.cpp
  debug_new.cpp
  mem_pool_base.cpp
  static_mem_pool.cpp
  bool_array.h
  class_level_lock.h
  cont_ptr_utils.h
  debug_new.h
  fast_mutex.h
  fixed_mem_pool.h
  mem_pool_base.h
  object_level_lock.h
  pctimer.h
  set_assign.h
  static_assert.h
  static_mem_pool.h
 }
}

在这个项目文件中存在两个项目:CvsMenu 和 Nvwa。引号中的内容表示路径,“CD=.”则表示打开该项目中的文件时,当前目录会更改到项目所在的目录。项目下面可以再分子项目,如 Nvwa 项目下有 doc 和 nvwa 两个子项目,没有“CD=.”表示打开子项目里的文件时不再更改当前目录。

图中并没有显示出完整的内容,因为其中的内容可以折叠(缺省打开项目文件时是完全折叠起来的,即在上面的例子中,只能看到两个项目的名字 “CvsMenu”和“Nvwa”)。在非文件名行上使用鼠标双击或回车键可以进行展开或折叠,在文件名行上使用鼠标双击或回车键则可以打开对应的文件。

更多的帮助内容请参考“:help project”。

2.6. taglist(源代码结构浏览)

作者:Yegappan Lakshmanan

网站脚本编号:273

安装说明:

1. 确保机器上有一个可用的 Exuberant Ctags 的版本(可以执行命令“ctags”)

2. 在 Vim 网站上下载 taglist(假设为 taglist.zip);

3. 使用“unzip taglist.zip -d ~/.vim”解开;

4. 在 Vim 中运行“:helptags ~/.vim/doc”安装文档。

虽然 taglist 使用 ctags,但并不要求 tags 文件的存在。

功能说明:

使用命令“:Tlist”启用/关闭 taglist,效果请先看一下图 8。Taglist 的主要特性有:
图 8
图8

  • 可以显示宏(macro)、函数(function)、变量(variable)、类型定义(typedef)、类(class)、结构 (struct)等多种内容信息;
  • 打开多个文件时,可以同时看到多个文件的结构信息;
  • 在左边的 taglist 窗口显示的名称上双击鼠标或按回车键,右边主窗口中会跳转到相应的定义位置;
  • 右边窗口中光标的位置改变,左边的窗口也会在 4 秒内(缺省值,参见“:help ‘updatetime’”)黄色加亮显示相应的名称;
  • 在启用/关闭 taglist 时,插件能够自动改变当前 Vim 窗口的大小(不管是文本模式的 Vim 还是图形界面的 Vim),除非使用“:let Tlist_Inc_Winwidth=0”关闭这一功能(当使用这一功能导致兼容性问题时)。

更多的帮助内容请参考“:help taglist”。

2.7. cvsmenu(CVS集成)

作者:Thorsten Maerz/吴咏炜

网站脚本编号:1245

安装说明:

1. 在 Vim 网站上下载文件 cvsmenu.vim,存到 ~/.vim/plugin 目录中;
2. 启动 gvim,在菜单中选择“CVS-Settings-Install-Install updates”(文本模式的 Vim 可以使用快捷键“,cgii”),从网上(SourceForge)的 CVS 中安装最新版本和帮助文档(此步骤可选)。

功能说明:

在 Vim 中集成 CVS [24]版本管理功能。该插件最初由 Thorsten Maerz 编写,在 2002 年以来没有再得到维护。我在 2005 年初开始使用这个插件后,非常喜欢它,修正了其中存在的错误,并一直维护该插件。如果大家发现有 bug,报告给我就可以了。

主要功能可在图 9 的菜单中看到:
图 9
图9

  • 了解 CVS 环境的基本信息和 cvsmenu 中的变量设定(参见图 10);
    图 10
    图10
  • 调整设定,安装更新版本;
  • 插入 CVS 的可扩展关键字,如“$Date$”、“$Id$”;
  • 对目录进行基本操作(cvs update 等);
  • 接受附加参数的基本操作(文件比较等);
  • 管理功能,如登录;
  • 删除类操作;
  • 打标签;
  • 观察(跟踪)和编辑功能;
  • 将本地文件和 CVS 中的文件进行比较(以 Vim 的分左右两列使用颜色加亮显示修改、增加、删除部分的比较方式;效果参见图 11);
    图 11
    图11
  • 显示文件每一行的更改人和更改时间(cvs annotate,参见图 12);
    图 12
    图12
  • 显示库的访问历史(cvs history);
  • 显示文件修订日志(cvs log;参见图 13);
    图 13
    图13
  • 显示文件状态;
  • 显示较短的文件状态;
  • 根据本地信息显示文件状态(不访问库);
  • 签出模块(cvs checkout);
  • 查询更新;
  • 更新,如有冲突会高亮显示(cvs update);
  • 取消修改;
  • 添加当前文件到 CVS 中(cvs add);
  • 签入当前文件(cvs commit);
  • 导入文件(cvs import);
  • 添加并签入当前文件。

根据实际使用的需要,除了修订错误之外,我加入了一些编码相关的支持。拿一个最实际的情况,如果使用“set encoding=utf-8”,但源代码中仍使用了 GBK 编码的中文字符,那么,必须在 .vimrc 中加入一行“let g:CVScvsoutputencoding=’gbk’”才能保证“cvs annotate”操作的结果是正确的。

Thorsten 把该插件的易用性设计得相当好。举例来说,在作文件比较时,按 Tab 可跳转到下一个不同处,左侧的比较窗口中按一下“q”即可关闭该窗口。更多的帮助内容请参考“:help cvsmenu”。

2.8. doxygen(文档注释语法加亮)

作者:Michael Geddes

网站脚本编号:5

安装说明:

1. 在 Vim 网站上下载最新版本(doxygen.zip);
2. 使用“unzip doxygen.zip”解开;
3. 执行“cp -p doxygen.vim ~/.vim/syntax”和“cp -p doxygen.txt ~/.vim/doc”复制文件到 Vim 目录下;
4. 在 Vim 中运行“:helptags ~/.vim/doc”安装文档。
5. 如果 ~/.vim/after/syntax 目录不存在,使用“mkdir -p ~/.vim/after/syntax”创建该目录;
6. 进入 ~/.vim/after/syntax 目录,使用下面三行创建语法文件之间的关联,使得在 C、C++ 和Java 文件中可以识别文档注释:

ln -s ../../syntax/doxygen.vim c.vim
ln -s ../../syntax/doxygen.vim cpp.vim
ln -s ../../syntax/doxygen.vim java.vim"

6. 可选地,看一下我的个人编程网页 [6] 下有没有对 doxygen.vim 的更新(里面包含有作者尚未并入到标准发布中去的我的更改——好奇的话,你可以在 doxygen.vim 文件中数一下,看一看 Wu Yongwei 的名字出现了几次:-))。

功能说明:

如果你用过文档注释,相信我不需要多说,看一下图 14你就知道这个脚本的功能了。如果你没有用过文档注释,强烈建议你到 Doxygen [7] 的网站上看一下,了解一下这个非常有用的工具。作为示例,可在 http://nvwa.sourceforge.net/doc/debug__new_8cpp.html#a17 看一下图中的代码使用 Doxygen 自动生成的 HTML 网页。
图 14
图14

2.9. matrix(!)

作者:Don Yang

网站脚本编号:1189

安装说明:

在 Vim 网站上下载文件 matrix.vim,存到 ~/.vim/plugin 目录中即可。

功能说明:

是的,说的就是电影 Matrix!Vim 的脚本并不是都干“正经事”的。想看一下电影里那些酷酷的字符在 Vim 的窗口里翻滚吗?发一个命令“:Matrix”即可(按任意键退出)。效果见图 15。
图 15
图15

0. Vim 简介

作为开源世界最重要的编辑器之一(另一个是 Emacs),Vim 以其强大的功能和可定制能力被众多开发者所喜爱。不过,也许就是因为 Vim 的功能太强大了,要真正用好 Vim 并不容易。本文作者在多年的实际使用中逐渐掌握了一些实用技术,在此介绍给大家。——本文并不企图对 Vim 作全面而系统的介绍,但也绝非零星地点到即止;而是希望通过介绍一些重要特性和提供相关参考信息,引起大家的兴趣,去深入挖掘其能力,真正把这一强大的工 具用好。

下面首先对 Vim 做一下最基本的介绍,并给出一些参考信息,以方便对 Vim 不熟悉的读者也能够理解并自己查阅进一步信息。

与大部分其它编辑器不同,进入 Vim 后,缺省状态下键入的字符并不会插入到所编辑的文件之中。Vim 的模式(mode,可以简单地理解为“状态”)概念非常重要。需要知道,Vim 有以下几个模式:

  • 正常(normal)模式,缺省的编辑模式;下面如果不加特殊说明,提到的命令都直接在正常模式下输入;任何其它模式中都可以通过键盘上 的 Esc 键回到正常模式。
  • 命令(command)模式,用于执行较长、较复杂的命令;在正常模式下输入“:”(一般命令)、“/”(正向搜索)或“?”(反向搜 索)即可进入该模式;命令模式下的命令要输入回车键(Enter)才算完成。
  • 插入(insert)模式,输入文本时使用;在正常模式下键入“i”(insert)或“a”(append)即可进入插入模式(也有另 外一些命令,如“c”,也可以进入插入模式,但这些命令有其它的作用)。
  • 可视(visual)模式,用于选定文本块;可以在正常模式下输入“v”(小写)来按字符选定,输入“V”(大写)来按行选定,或输入 “Ctrl-V”来按方块选定。
  • 选择(select)模式,与普通的 Windows 编辑器较为接近的选择文本块的方式;在以可视模式和选择模式之一选定文本块之后,可以使用“Ctrl-G”切换到另一模式——该模式很少在 Linux 上使用,本文中就不再介绍了。

Vim 带有完整的帮助文档。在当前的 Vim 6.4 的标准发布中,有一百多章、近六十万英文词的帮助文件,进入 Vim 后输入“:help”(命令模式中输入的命令要敲回车键才结束输入,下面不再说明这一点)即可访问。本文在介绍特性时,对文档中已经说明得很详细的内容只 会提纲挈领地加以简短说明和提供应用范例,并提供访问相应的 Vim 文档的命令。

一般的发布版中还常常带有一个简单的 30 分钟的 Vim 教程,新手在操作系统的命令行上输入“vimtutor”命令即可开始学习。除上面的简单说明外,本文并不介绍最基本的 Vim 命令,Vim 的新手应该先通过教程熟悉一下 Vim,再继续往下阅读。

建议所有的 Vim 用户经常访问 Vim 的主站点 [1]。上面除了基本的发布、安装、下载等信息外,最有用的内容是用户可以上传自己写的 Vim 脚本(script)和撰写自己认为有用的提示(tip),供其他 Vim 用户使用。在写这一段的时候,Vim 站点上已有一千三百多个脚本,提示数刚好超过了一千。对于序号为 nn 的脚本,直接访问的 URL 是 http://www.vim.org/scripts/script.php?script_id=nn;对于序号为 nn 的提示,直接访问的 URL 是 http://www.vim.org/tips/tip.php?tip_id=nn。

不另加说明的话,本文讨论的内容适用于 Vim 版本 6(即从 6.0 到 6.4)。建议认真的 Vim 用户升级到 Vim 6.4,最好是自己编译升级所有的补丁包。相关信息网站上都有,此处不再赘述。

. 实用技巧

1.1 安装

如果从 Linux 发布版直接安装 Vim,需要注意的一点是,缺省情况下系统并不一定为你安装了一个完整的 Vim。比如,在 Red Hat(以及后来的 Fedora Core)的发布版中,Vim 被拆成了四个包:vim-common(公用部分),vim-minimal(最小安装),vim-enhanced(除 X Window 支持外的完整安装),和 vim-X11(X Window 图形界面支持)。最小安装不能完整展示 Vim 的优点,通常只是作为 vi 的替代品出现,缺少很多重要的特性如多字节语言支持、鼠标支持和脚本支持。如果装了 X Window 的话,图形界面的 gvim 也比文本模式的 vim 具有更多的特性。建议大家尽可能安装完全的 Vim。

如果愿意稍稍费一点功夫,自己编译 Vim 的话,可以更好地定制 Vim。——附带的另一个好处是,你如果发现什么错误的话,你就可以自己动手来修复这个错误,或至少找到错误所在的位置,让 Bram(Vim 的作者)可以更快地解决问题。图 1 是在 Vim 中执行“:version”的结果的一部分,可以看到 Vim 有很多不同的特性(feature)可在编译时打开或关闭。如果自己编译的话,就可以选择打开需要的功能,关闭不需要的功能,来获得一个既功能强大、又小 巧快速的 Vim 定制版本。
图 1
图1

1.2 中文支持

Vim 支持世界上的主要语言,当然也包括中文。如果你用 Vim 编辑中文,而中文不能正确显示,那有两种可能性:一是使用的 Vim 不完整,不含多字节语言支持(multi_byte 特性);二是某个配置出了问题。

说到多语言支持,最基本的概念有两个:一是文件的语言编码,而是环境的内部编码。在较老的操作系统中,不管 Linux 还是 Windows,这两个编码都是一样的,也就意味着,一次只能处理一种编码的文件:要么只能处理西文编码(Latin1,即 ISO-8859-1 [5]),要么只能处理中文编码(GB2312 [2])。而在新的操作系统中,这两者可以是不一样的。在 Linux 上,常见的情况是环境的内部编码使用 UTF-8 [6],而 UTF-8 可以同任何一种语言编码作无损转换,这就保证了系统的多语言处理能力。Vim 这方面秉承了 Unix/Linux 的传统,在内部编码使 UTF-8 的时候,可以同时处理不同意语言编码的文件。

以下列出了和语言编码的相关的设置:

  • 环境变量 LANG(使用的语言);
  • 环境变量 LC_CTYPE(使用的内部编码);
  • Vim 选项 encoding(Vim 的内部编码);
  • Vim 选项 termencoding(Vim 在与屏幕/键盘交互时使用的编码);
  • Vim 选项 fileencoding(Vim 当前编辑的文件在存储时的编码);
  • Vim 选项 fileencodings(Vim 打开文件时的尝试使用的编码);
  • Vim 选项 ambiwidth(对“不明宽度”字符的处理方式;Vim 6.1.455 后引入)。

如果你的环境只需要处理简体中文的话,那么,最简单的方式就是所有的设定全部使用简体中文。只需要:设定 LANG=zh_CN.GB2312,不设定 LC_CTYPE(默认跟 LANG 一样),不设定与编码相关的 Vim 选项(默认由 LANG 和 LC_CTYPE 决定),也无需设定 Vim 选项 ambiwidth。也就是说,我们把语言设定为中国(CN)使用的中文(zh),编码为 GB2312(注意:Vim 内部并不识别国标 GB18030 [3],所以此处只能设 GB2312;参看下面关于 UTF-8 的讨论)。

不过,如果按照目前 Linux 下的惯例,内部编码一律使用 UTF-8 的话,会有一些额外的好处,其中之一就是在这种情况下 Vim 支持同时编辑多种不同编码的文件,如简体中文和繁体中文(参见图 2);另外,此时 Vim 也可以通过编码转换支持 GBK [4] 和 GB18030了。这样,众多关于语言编码的 Vim 选项就有了用武之地了。下面进一步说明一下这些选项和推荐设定(如果适用的话):
图 2
图2

  • encoding=utf-8:不管文件的编码如何,不管如何显示和输入,Vim 内部使用的编码是 UTF-8;这是国际化支持的基础。
  • termencoding: 取决于实际的终端或 X Window 的设定。举例来说,如果选择语言简体中文登录到 X Window,或者正在使用 CXTERM [10] 的话,那么该选项应被设为 GB2312;如果使用缺省的语言(LANG=en_US.UTF-8)登录到 X Window,或者使用 PuTTY [11] 远程访问 Linux 机器、并且设定里的字符编码(配置中 Window-Translation)设为 UTF-8 的话,该选项就应该设为 utf-8。从 Windows 下使用 PuTTY 远程连接 Linux 的请特别注意,测试表明,仅在使用 UTF-8 的情况下,PuTTY 才能可靠地支持中文的显示和输入(显示字体必须设成中文字体)。
  • fileencoding:文件载入时, 该选项被置为 Vim 认定的文件编码,因此,存储时文件的编码不会改变。此处和下面 fileencodings 可使用的编码为 libiconv 支持的所有几百种编码(如果编译时包含了 iconv 特性的话),与中文相关的有 gb2312、gbk、gb18030、hz-gb-2312、iso-2022-cn、big5、cp936、cp950 等。如果创建新文件,你又不希望使用 UTF-8 作为文件编码时,那么,你可能需要手工设定该选项,如“:set fileencoding=gb2312”。需要注意的一点是,使用“set”来设定该选项的话会改变以后新建文件的缺省编码,而使用 “setlocal”的话则只影响当前文件(参考“:help setlocal”)。
  • fileencodings=ucs- bom,utf-8,chinese:Vim 会首先判断文件的开头是否是一个 Unicode [7] 的 BOM(byte order mark)字符 [8],是的话则把文件的其余内容解释成相应的 Unicode 序列;否的话再试图把文件内容解释成 UTF-8 的序列;再失败的话,则把文件解释为简体中文(chinese 是一个跨平台的简体中文字符集的别名,Linux 下相当于 gb2312 和 euc-cn;此处也可以根据需要以 gb2312、gbk 或 gb18030 等编码替代)。需要注意的是,该顺序不能颠倒,并且在后面再添加其它编码如 big5、latin1 也是没有意义的,因为 Vim 不能识别 8 比特编码中的错误,因此这些编码后列的编码永远不会被用到。
  • ambiwidth=double:把所有的“不明宽度”字符 [9]——指的是在 Unicode 字符集中某些同时在东西方语言中使用的字符,如省略号、破折号、书名号和全角引号,在西方文字中通常字符宽度等同于普通 ASCII 字符,而在东方文字中通常字符宽度等同于两倍的普通 ASCII 字符,因而其宽度“不明”——的宽度置为双倍字符宽度(中文字符宽度)。此数值只在 encoding 设为 utf-8 或某一 Unicode 编码时才有效。需要额外注意的是,如果你通过终端使用 Vim 的话,需要令终端也将这些字符显示为双宽度。比如,XTERM [12] 的情况下应该使用选项“-cjk”,即使用命令“uxterm -cjk”来启动使用双宽度显示这些字符的 Unicode X 终端;使用 PuTTY 远程连接的话则应在配置的 Window-Translation 中选中“Treat CJK ambiguous characters as wide”(参见图 3)。图 3
    图3

需要设定的选项通常放在用户的 Vim 资源配置文件中,即在 ~/.vimrc 文件中加入:

set encoding=utf-8
set fileencoding=chinese
set fileencodings=ucs-bom,utf-8,chinese
set ambiwidth=double

如果想进一步了解这些选项的话,可以使用“:help ‘选项’”查看帮助文档中的相关(英文)信息。帮助中也可以查到这些选项(以及命令)的缩写:本文中为方便理解,除一些极少有人使用完整拼写的命令如 “:e(dit)”、“:s(ubstitute)”等之外,一般使用完整拼写而不说明或使用缩写。关于配置文件 .vimrc,可以使用“:help .vimrc”查看相关信息。

在使用内部编码 UTF-8 的情况下,如需编辑 fileencodings 之外(其不能自动识别)的文件,则可以使用以下命令:“:e ++enc=编码 文件名”。详情可参考“:help ++enc”。

1.3. 鼠标支持

不管是文本界面还是图形界面的 Vim,都支持鼠标。不过,在文本界面中,鼠标支持缺省没有被激活;这就意味着,在终端上使用鼠标,所有的功能仍和没有使用 Vim 时相同,并不受 Vim 影响。要激活文本界面中的鼠标支持也很容易,只需要执行一句“:set mouse=a”即可。

启用了鼠标支持之后,Vim 主要支持的鼠标操作有:

  • 单击移动光标到点击的位置;
  • 在帮助的关键字上双击显示该关键字相关的帮助信息;
  • 在普通文本上双击选中点击位置的单词;
  • 拖动鼠标选中文本;
  • 使用鼠标滚轮滚动当前缓冲区中的文本;
  • 多窗口编辑时可以拖动窗口分栏的位置。

进一步的信息可参看“:help ‘mouse’”、“:help mouse-using”和“:help scroll-mouse-wheel”。

特别需要值得一提的是,在远程访问 Linux 系统时也是可以使用鼠标的。如果使用 X Window 系统,自然不必说;而使用 SSH 远程连接时,大部分 Linux 下的终端客户程序,如 XTERM、GNOME-Terminal [13]、较新版本的 Konsole [14],以及 Windows 下的 PuTTY,支持鼠标的使用:你只需简单地启动 Vim、执行一句“:set mouse=a”就可以了(当然,也可以把上面的语句去掉起始的冒号放到 .vimrc 文件中)。

1.4. 空格、制表符和缩进

对于编写代码,缩进是最基本的概念之一。至于缩进是使用空格还是制表符(Tab),或者缩进是否正好使用一个制表符来表示,很多程序员,特别是 Windows 开发出身的程序员,很容易混淆。幸好,Vim 对于这些概念有非常完整的支持,足以应付各种复杂的情况。以下是相关的主要 Vim 选项:

  • shiftwidth(缩进的空格数);
  • tabstop(制表符的宽度);
  • expandtab(是否在缩进和遇到 Tab 键时使用空格替代;使用 noexpandtab 取消设置);
  • softtabstop(软制表符宽度,设置为非零数值后使用 Tab 键和 Backspace 时光标移动的格数等于该数值,但实际插入的字符仍受 tabstop 和 expandtab 控制);
  • autoindent(自动缩进,即每行的缩进值与上一行相等;使用 noautoindent 取消设置);
  • cindent(使用 C 语言的缩进方式,根据特殊字符如“{”、“}”、“:”和语句是否结束等信息自动调整缩进;在编辑 C/C++ 等类型文件时会自动设定;使用 nocindent 取消设置);
  • cinoptions(C 语言缩进的具体方式,请参考“:help cinoptions-values”);
  • paste(粘贴模式,会取消所有上述选项的影响来保证后面的操作——通常是从剪贴板粘贴代码——保持原有代码的风格;使用 nopaste 取消设置)。

下面给出一些常用的组合:

  • shiftwidth=4 tabstop=4:很多 Windows 出身的程序员会习惯这样的设置,让缩进等于制表符宽度。
  • shiftwidth=4 tabstop=8:很多 Unix 程序员的设置,仍使用较常用的 4 格缩进,但制表符宽度为标准的 8。
  • cinoptions=>4,n-2,{2,^-2,:2,=2,g0,h2,p5,t0,+2,(0,u0,w1,m1 shiftwidth=2 tabstop=8:标准的 GNU 编码风格的设置,对 Vim 缺省的 C 缩进风格作了很多微调,比如,if 语句下的“{”、“}”要在“if”后缩进两格,但函数定义部分“{”、“}”仍和函数名一行对齐。开源软件经常使用该种缩进风格。

在编辑代码时一个很有用的命令是调整代码缩进,可以很方便地增加(或减少)若干级缩进,并自动根据选项设定使用正确的空格或制表符。只需要使用 “V”选中你要调整的代码行,然后键入“<”(或“>”)即可增加(或减少)一级缩进;在键入“<”(或“>”)之前键入数字则 可以指定增加(或减少)的缩进级数。

我们要讨论的最后一个相关的命令是“:retab”。在设定了 expandtab 选项时,该选项会把所有的制表符转换成空格。在没有设定 expandtab 选项时,使用“:retab!”可把空白字符转换成制表符(可能误转换,慎用),使用“:retab n”可以把 tabstop 重置为 n,并转换含制表符的连续空白字符为适当的制表符和空格的组合以保证含制表符的行看起来没有任何变化。详细信息请参看“:help :retab”。

1.5. 模式行(modeline)

没人愿意每次都手工输入一大堆的 Tab 和缩进设定。可是,放在 .vimrc 文件中似乎也不是个好主意:如果我编辑的代码不止一种风格呢?——考虑一下,如果你参加开源软件项目,你能保证你参加的所有项目,还有你公司里的软件项 目,代码风格都一样吗?——Vim 是我用过的第一个支持在文件中记录代码风格设定的编辑器。这个特性在 Vim 中叫做模式行,实际上,它所做的是在打开文件时根据文件中的 Vim 指令设定相关的 Vim 选项。下面就是一个嵌在 C 源代码中的模式行:

/* vim: set tabstop=4 shiftwidth=4 expandtab: */

模式行有好几种形式。本文只介绍上面的这种形式(其它形式类似,请自行参考“:help modeline”):行首的“/*”和尾部的“*/”告诉 C 编译器这是一行注释,不是代码的一部分;而 Vim 可通过后面的“vim:”识别出模式行的开始(必须出现在行首或前面有一个空白字符);后面则是“set”和空格间隔开的一串 Vim 选项;“:”表示模式行结束。

这种方式非常简单,功能也非常强大。另外请注意,出于安全的考虑,模式行中的选项只影响当前文件(“:help modeline-local”),也不能做任何设置选项以外的工作。

1.6. 寄存器

通常的编辑器有一个剪贴板,以存储复制和剪切的内容。Vim 中的类似概念叫做寄存器(register)。除了有一个无名寄存器外,Vim 还有一大堆有名的寄存器,可以通过“””(参见“:help “”)或“Ctrl-R”(参见“:help i_CTRL-R”和“:help c_CTRL-R”)加寄存器名(字母、数字和某些特殊字符,参见“:help registers”;“无名”寄存器的名字是“””)来访问。比如,你先使用“”ayy”复制了一行,然后使用“dd”删掉了一行,然后移动光标到要复 制到的位置,就可以使用“”aP”把先前复制的内容粘贴上去了。手工编辑是有名寄存器的作用还不是很大,但当你想让 Vim 通过类似于宏的方式自动完成工作时,有名寄存器就变成不可缺少的重要功能了。下面我们还会用到。

在使用 X Window 系统时,有两个特殊的寄存器是需要注意一下的:“”*”访问的寄存器是 X 的主选择区域(primary selection),“”+”访问的寄存器是 X 的剪贴板(clipboard)。如果你要在 Vim 和其它的 X 应用程序之间复制文本内容,你可以试一下这两个寄存器。

还有一个很特殊的“寄存器”:“=”。在插入模式或命令模式中,键入“Ctrl-R=”,Vim 会提示你输入一个表达式,普通的整数运算在此完全有效。如果想要进行浮点运算,请参见第 3.2 节中的技巧。

1.7. 搜索、替换和正则表达式

大家应该都已经知道 Vim 里使用“/模式”(或“?模式”)进行搜索,使用“:s/模式/字符串/标志”进行替换,其中的“模式”是一个正则表达式。关于正则表达式,不熟悉的话可 以边用边学,本节也不打算对 Vim 的正则表达式作完整的阐述(那可能可以专门写一本小册子了),而只抛砖引玉式地给出一些有用的例子加以说明,以及一些实用技巧。

先说一点点搜索。搜索里最最有用的一个快捷方式是“*”(向下完整匹配光标下的单词)。把光标移动到你要搜索的词(变量名、函数名等)上,比如 “test”,然后按“*”,Vim 将自动产生一个对“\<test\>”(参见“:help /\<”和“:help /\>”)的搜索,也就是说,搜索完整的单词“test”。不要小看这个技巧,它经常可以大幅度地提高搜索的速度。事实上,这是 Vim 网站上公布的第 1 号技巧,也是被评价最高的技巧。相似的技巧还有“#”(向上完整匹配光标下的单词)、“g*”(向下部分匹配光标下的单词)等,请自行查看(“:help #”等)。

Vim 在搜索和替换时会对匹配成功的文本进行加亮,在已经完成搜索和替换任务后,这种加亮有时反而会妨碍显示。Vim 专门提供一个命令取消这种加亮(直到用户再一次使用搜索或替换命令):“:nohlsearch”。建议用户创建一个键盘映射(key mapping)加入到 .vimrc 中,如:

nmap <F2> :nohlsearch<CR>

以上命令表示,在正常模式下按 F2 键相当于输入“:nohlsearch”后面跟一个回车,即取消搜索加亮显示。

再看几个搜索替换的实用例子。

  • 去掉所有的行尾空格:“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表 符),“\+”对前面的字符匹配一次或多次(越多越好),“$”匹配行尾(使用“\$”表示单纯的“$”字符);被替换的内容为空;由于一行最多只需替换 一次,不需要特殊标志。这个还是比较简单的。
  • 去掉所有的空白行:“:%s/\(\s*\n\)\+/\r/”。这回多了“ \(”、“\)”、“\n”、“\r”和“*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字 符),“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把 连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能 使用“\n”,而只能使用“\r”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
  • 去 掉所有的“//”注释:“:%s!\s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其 他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用 过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
  • 去掉所有的“/* */”注释:“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的 字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“int/* space not necessary around comments */main()”这样的表达式在替换之后仍然是合法的。

希望上面的这些简单的例子能够引起你使用 Vim 的正则表达式高效完成任务的兴趣。进一步的信息可参考“:help regexp”。

1.8. 自动完成和路径设定

Vim 支持单词的自动完成。比如,你前面使用了一个很长的变量名,叫 aLongVariable,下面你在输入时,就不用完整键入了。很可能,你只需要键入“aL”,然后按下“Ctrl-P”(向前搜索可匹配的单词并完 成)就可以得到完整的变量名(没有得到想要的结果的话,多按几下“Ctrl-P”;或者前面多输入几个字符,如“aLongV”)。类似的命令还有 “Ctrl-N”(向后搜索可匹配的单词并完成)、“Ctrl-X Ctrl-L”(搜索可匹配的行并完成)、“Ctrl-X Ctrl-F”(搜索可匹配的文件名并完成)等,具体可参看“:help ins-completion”。

如果你并不熟悉这些功能,但也并不觉得这有什么稀奇的话,下面这个例子可能会让你觉得吃惊。请尝试打开一个空白的 C 文件(vim test.c),并输入:

#include <stdio.h>
int main()
{
    pri

最后一行不要回车,直接在“pri”后面输入“Ctrl-P”,你将看到“printf”出现。是的,虽然文件里没有“printf”,但 Vim 知道到哪里去寻找它!在作关键字匹配完成时,如果当前文件和其它打开的文件中没有想要的结果,Vim 会自动到“#include”的文件中进行进一步的搜索(为什么是“#include”呢?请查阅“:help ‘include’”),搜寻的目录则由选项 path 决定,其缺省值在 Unix(含 Linux)下为“.,/usr/include,,”,代表搜索的目录依次是文件所在目录、/usr/include 和当前目录。根据实际情况,你可能需要在 .vimrc 文件中设置该选项,加入项目相关的包含目录,注意一般要保留最后的“,,”,除非你不需要在当前目录下搜索。

设置了合适的 path 后,另外带来的一个便利就是可以使用“gf”命令方便地跳转到光标下的文件名所代表的文件中。在上面的例子中,把光标移到“stdio.h”的任一字符 上,键入“gf”,则 Vim 会自动打开 /usr/include/stdio.h 文件。使用“Ctrl-O”(参见“:help CTRL-O”)可返回到原先的文件中。

1.9. 文件跳转和 Tags

大家一般都知道,在 Vim 的帮助窗口中的关键字上双击鼠标或者键入“Ctrl-]”即可跳转至该关键字相关的帮助主题。不过,“跳转至匹配的关键字”这一功能并不仅仅局限于帮助文 件。只要有合适的 tags 文件(参见“:help tags-file-format”),我们同样可以在源代码中使用这个方便的功能,跳转到与关键字匹配的“标记”处(通常是源代码中某一函数、类型、变 量或宏的定义位置)。

要产生 tags 文件,通常我们使用 Exuberant Ctags [15]。一般的 Linux 发布版中均带有这一工具。Ctags 带有的选项数量极多,此处我们仅简单介绍如何在一个典型的多文件、多层目录的项目中使用其基本功能:我们只需在项目的根目录处键入“ctags -R .”,Ctags 即可自动在文件中查找、识别支持的文件格式、生成 tags 文件。目前 Exuberant Ctags 支持多达 33 种编程语言 [16],包括了 Linux 下常用的 C、C++、Java、Perl、PHP 等。有了 tags 文件,以下的 Vim 命令就可以方便使用了(进一步的信息可参考“:help tags-and-searches”):

  • :tag 关键字(跳转到与“关键字”匹配的标记处)
  • :tselect [关键字](显示与“关键字”匹配的标记列表,输入数字跳转到指定的标记)
  • :tjump [关键字](类似于“:tselect”,但当匹配项只有一个时直接跳转至标记处而不再显示列表)
  • :tn(跳转到下一个匹配的标记处)
  • :tp(跳转到上一个匹配的标记处)
  • Ctrl-](跳转到与光标下的关键字匹配的标记处;除“关键字”直接从光标位置自动获得外,功能与“:tags”相同)
  • g](与“Ctrl-]”功能类似,但使用的命令是“:tselect”)
  • g Ctrl-](与“Ctrl-]”功能类似,但使用的命令是“:tjump”)
  • Ctrl-T(跳转回上次使用以上命令跳转前的位置)

当我们在项目的根目录下工作时,上面这些命令工作得很好。但如果我们进到多层目录的里层再运行 Vim 打开文件时,这些命令的执行结果通常就变成了错误信息“E433: No tags file”。这是因为缺省 Vim 只在文件所在目录和当前目录下寻找 tags 文件,而我们前面只在项目的根目录下生成了 tags 文件,Vim 无法找到该文件。解决方法有好几种,我认为一般较简单的做法是对每个项目都在 .vimrc 文件中增加一个路径相关设定。假设我们有两个项目,位置分别是 /home/my/proj1 和 /home/my/proj2,那我们可以使用:

au BufEnter /home/my/proj1/* setlocal tags+=/home/my/proj1/tags
au BufEnter /home/my/proj2/* setlocal tags+=/home/my/proj2/tags

Vim 选项 tags 用于控制检查的 tags 文件,缺省值为“./tags,tags”,即前面所说的文件所在目录下和当前目录下的 tags 文件。上面两行自动命令告诉 Vim,在打开项目目录下的文件时,tags 选项中的内容要增加项目的 tags 文件的路径。进一步信息可参看“:help ‘tags’”。

1.10. Make 和 grep

Make [17] 和grep [18] 应当算是 Unix 世界里无人不晓的基本工具了吧。很自然的,Vim 对它们有着特殊的支持。该支持主要通过访问一个特殊的快速修订窗口(quickfix window)来实现。直接在 Vim 的命令模式里输入相应的 make 或 grep 命令(如“:grep foo *.c”)即可将命令的执行结果放入该窗口,同时根据返回的结果跳转到第一个错误(make 的情况;在使用 grep 时是匹配成功之处)。以下是常用的“快速修订”命令:

  • :cn(显示下一个错误)
  • :cp(显示上一个错误)
  • :cl(列出所有的错误及其编号)
  • :cc(跳转到指定编号的错误)
  • :copen(打开快速修订窗口,在其中显示所有错误,可在错误上双击鼠标或按回车键跳转至该错误;示例参见图 4)图 4
    图4
  • :cclose(关闭快速修订窗口)

Vim 的这个特性也可以与 make 和 grep 以外的程序一起工作(事实上,在 Windows XP 上,“:grep”命令一般调起的是“findstr /n”)。具体调用那个程序由选项 makeprg(Linux 下缺省为“make”)和 grepprg(Linux 下缺省为“grep -n $* /dev/null”)控制,而如何解析返回的内容则由选项 errorformat 和 grepformat 控制。鉴于在 Unix/Linux 下一般不需更改这些选项的内容,此处不再详述。

1.11. 执行外部命令

在“:make”这样的命令中,Vim 会自动调用外部的程序。用户当然也可以自己执行外部的程序:估计很多的人都已经知道了用“:!命令”可以在 Vim 中执行一个外部命令。不过,估计大部分人都不知道,还有其它一些命令可以执行外部命令,并且,即使“:!”命令里面也有一些技巧可以使用。

最正规的执行外部命令的方法,如前所述,就是“:!”。比如,我们想要显示当前目录下的所有文件,就可以直接执行:“:!ls”。Vim 会在一个终端窗口中进行文件列表,然后提示我们按键返回 Vim 中。事实上,这种方式对于“cp”、“rm”这样基本不需要输出的命令比较实用,而对于“ls”这样关注于输出的命令并不太适用。

如果想把外部命令执行的结果插入到当前编辑的缓冲区中,可以考虑使用“:r!”。比如,我们使用“:r!ls”,就可以把“ls”命令的执行结果插 入到缓冲区中光标所在行下面。在使用宏时,这可能会特别有用。

Vim 的“:!”命令还有一个特别强大的技巧可以使用。拿一个实际例子,我们需要对在一个文件的每一行之前插入一个编号,该怎么做呢?——用 Vim 的宏或者脚本可以完成这一工作,但这不是最高效、最灵活的工作方式。Linux 下一般带有的 GNU 的 nl,可以用非常灵活的方式来完成这一任务——要对所有的非空行进行编号,只需要“:%!nl”;要对包含空行的所有行进行编号?OK,“:%!nl -ba”。

稍作一点解释。当使用可视模式选中文本行后然后键入“:!”(命令行上将出现“:’<,’>!”,表示命令的范围是选定的文本),或者 使用“:%!”(表示命令的范围是整个缓冲区中的文本),Vim 在执行后面的命令时,将把命令范围里的文本行作为后面执行的命令标准输入,并用命令执行后的标准输出替换当前缓冲区中的这些文本行。这就是上面的命令行的 工作原理。

1.12. 定宽文本排版

在传统的 Unix 环境下,文本文件的定义是具有一定长度限制的文本行的组合 [19]。虽然 Vim 本身对行的长度没有任何实际的限制,但有一些工具有这样的限制。为了最大程度的兼容性,也为了在显示、打印等处理上比较方便,一般推荐在邮件和源代码中一 般不要超出 72 列(最多不超出 80 列)。Vim 在处理定宽的文本方面具有特殊的支持能力。下面是一个在 Vim 中把行宽(使用选项 textwidth)设为 40 后输入 Harry Potter and the Half-Blood Prince 的第一句话的结果:

It was nearing midnight and the Prime
Minister was sitting alone in his
office, reading a long memo that was
slipping through his brain without
leaving the slightest trace of meaning
behind.

输入时我只使用了英文字母和空格,换行符都是 Vim 自动插入的。如果在某一行加入或删除了一些字符后行不就不齐了吗,该如何处理?很简单,把光标移到要重新格式化的文本开头,使用“gq”命令后面跟一个光 标移动命令确定重新格式化的范围。比如“gq}”(格式化一段),“gq5j”(格式化 5 行),“gqG”(格式化至文件末尾)。

除了选项 textwidth 外,选项 formatoptions 确定了跟文本格式化有关的基本选项,常用的数值有:

  • t:根据 textwidth 自动折行;
  • c:在(程序源代码中的)注释中自动折行,插入合适的注释起始字符;
  • r:插入模式下在注释中键入回车时,插入合适的注释起始字符;
  • q:允许使用“gq”命令对注释进行格式化;
  • n:识别编号列表,编号行的下一行的缩进由数字后的空白决定(与“2”冲突,需要“autoindent”);
  • 2:使用一段的第二行的缩进来格式化文本;
  • l:在当前行长度超过 textwidth 时,不自动重新格式化;
  • m:在多字节字符处可以折行,对中文特别有效(否则只在空白字符处折行);
  • M:在拼接两行时(重新格式化,或者是手工使用“J”命令),如果前一行的结尾或后一行的开头是多字节字符,则不插入空格,非常适合中文

上面提到的注释,可以是 C/C++ 中的“//”和“/*”,也可以是邮件中引用原文使用的“>”等字符(具体由 comments 选项控制;参见“:help ‘comments’”)。Vim 在遇到这些字符时,能够相当智能地进行处理,足以完成日常编辑源代码和邮件的需要。在使用一些处理纯文本不够强大的邮件客户端时,我通常使用 Vim 编辑邮件(特别是英文邮件),然后把结果贴回到邮件编辑窗口中进行发送。

Vim 中 formatoptions 的缺省值是“tcq”,一般我会在 .vimrc 文件中加入一行“set formatoptions+=mM”来确保 Vim 能在中文字符之间折行而不要求空格的存在,并且在大部分情况下可以正确地处理中文重新格式化。

1.13. 其它小技巧

也许你会觉得这些很有用:

  • %(跳转到与之匹配的括号处)
  • .(重复上次的修改命令)
  • `.(跳转到最近修改过的位置)
  • ZQ(无条件退出)
  • ZZ(存盘退出)
  • ga(显示光标下的字符在当前使用的 encoding 下的内码)
  • guw(光标下的单词变为小写)
  • gUw(光标下的单词变为大写)
  • :TOhtml(根据 Vim 的语法加亮的方式生成 HTML 代码;在图形界面中也可以使用菜单“Syntax—Convert to HTML”达到同样效果)

无聊的时候,还可以试试(呵呵!):

  • :help!
  • :help 42
  • :help holy-grail
25
May

1 程序设计

1.1 Tag List

下载地址: 官方站点

官方描述: The “Tag List” plugin is a source code browser plugin for Vim and provides an overview of the structure of source code files and allows you to efficiently browse through source code files for different programming languages.

滇狐评价: 这是一个非常非常非常非常重要的插件, 有了它, 我们才能够在 VIM 中查看一个文件中包含的函数列表, 或是一个类包含的方法列表, 为编程人员提供了极大方便。 推荐大家一定要安装!

安装注意事项: 有的系统内置的 ctags 功能太弱, 推荐大家安装 EXUBERANT CTAGS, 这个东西功能比较强大, 居然连 HTML 里面内嵌的 Java Script 都能够支持, 实在是匪疑所思!

滇狐个人习惯: 滇狐习惯把方法列表放在屏幕的右侧, 于是在 .vimrc 中设置了

let Tlist_Use_Right_Window=1

另外, 滇狐习惯让当前不被编辑的文件的方法列表自动折叠起来, 这样可以节约一些屏幕空间, 于是在 .vimrc 中设置了

let Tlist_File_Fold_Auto_Close=1。

1.2 A

下载地址: 官方站点

官方描述:

A few of quick commands to swtich between source files and header files quickly.

:A switches to the header file corresponding to the current file being edited (or vise versa)

:AS splits and switches

:AV vertical splits and switches

E.g. if you are editing foo.c and need to edit foo.h simply execute :A and you will be editting foo.h, to switch back to foo.c execute :A again.

滇狐评价: 第一眼看到这个东西时, 总觉得它功能太简单, 似乎没有什么用处。 用过之后, 才发现这项功能对于一个程序员来说是如何重要!

1.3 Win Manager

下载地址: 官方站点

官方描述: winmanager is a plugin which implements a classical windows type IDE in Vim-6.0. Basically, you have the directory tree and the buffer list as 2 windows which stay on the left and the editing is done in a seperate area on the left. People have already made excellent File and Buffer explorers seperately and I thought that it might be a cool idea to combine them both. winmanager.vim combines the standard File Explorer which ships with Vim 6.0 and a Buffer Explorer written by Jeff Lanzarotta into one package.

滇狐评价: 非常好用的东西, 在屏幕上打开一个文件浏览器, 这样就可以方便地选择要编辑的文件了。

默认情况下, winmanager 依赖于 bufexplorer, 到这 里下载。 如果你不喜欢 bufexplorer 插件的话 可以在你的 .vimrc 中添加这条命令禁用它:

let g:winManagerWindowLayout = “FileExplorer”

这样就不需要下载该插件了。

滇狐为 winfileexplorer.vim 加了一个补丁, 提供了使用系统默认打开方式打开选中文件的功能, 只要把光标放在想要打开的文件上, 然后按“S”就可以了 (注意是大写)。 这样以后就可以直接在 gvim 里打开 Noatun 或别的播放器, 不用再切换出来找 konqueror 了。

1.4 echofunc

下载地址: 官方站点

官方描述: When you type ‘(‘ after a function name in insert mode, the function declaration will be displayed in the command line automatically. Then use Alt+-, Alt+= to cycle between function declarations (if exists).

滇狐评价: 一个非常好用的插件, 虽然很小巧, 功能也很简单, 但非常实用, 强烈推荐。 除此之外, 安装了这个插件后, 当鼠标移到一个标志符之上时, 还会出现一个气球显示该标志符的定义, 如图:

vim_echofunc

安装注意事项: 该插件需要安装 EXUBERANT CTAGS, 不支持古老版本的标准 ctags。 建议创建一个这样的脚本:

#!/bin/sh
# Filename: omnictags

ctags –c++-kinds=+p –fields=+iaS –extra=+q $@

然后使用 omnictags 来运行 ctags 生成 tags 文件, 保证 tags 文件中含有所需的信息。

1.5 omnicppcomplete

下载地址: 官方站点

官方描述: This script is for vim 7.0 or higher it provides an omnifunc cppcomplete function. You can use the omni completion (intellisense) in c++ files.

This is a full vim script and you only need a ctags database.

滇狐评价: 虽然滇狐几乎不依赖 IDE 的自动完成, 因此也很少使用这个插件, 但总的说来, 这仍然是个很棒的插件。

安装注意事项: 该插件需要安装 EXUBERANT CTAGS, 不支持古老版本的标准 ctags。 建议创建一个和前面的 echofunc 中给出个脚本, 使用那个脚本来生成 tags 文件。

1.6 clewn

下载地址: 官方站点

官方描述: Clewn implements full gdb support in the vim editor: breakpoints, watch variables, gdb command completion, assembly windows, etc.

滇狐评价: Vim 从一开始的设计哲学就是要保持简单, 不要把太多的东西整合在 Vim 中。 Clewn 在保持了 Vim 简单的原则下, 将集成调试所需的一部分功能引入到了 GVim 中, 支持设置断点、 查看变量的值等许多操作, 非常方便。

1.7 jad

下载地址: 无。 自己将代码复制粘贴回去, 保存为 $HOME/.vim/plugins/jad.vim:

augr class
au!
au bufreadpost,filereadpost *.class %!jad -noctor -ff -i -p %
au bufreadpost,filereadpost *.class set readonly
au bufreadpost,filereadpost *.class set ft=java
au bufreadpost,filereadpost *.class normal gg=G
au bufreadpost,filereadpost *.class set nomodified
au bufreadpost,filereadpost *.class set nomodifiable
augr END

官方描述: (无)

滇狐评价: 挺好玩的插件, 不过似乎也只是好玩而已。 安装了之后可以直接双击打开 .class 文件, VIM 会自动调用 jad 把文件反编译了。

安装注意事项:需要先安装一份 jad

1.8 cscope_maps

下载地址: 官方站点

官方描述: Cscope is a very handy tool, but it’s even better when you don’t ever have to leave the comfort of your favorite editor (i.e. Vim) to use it. Fortunately, Cscope support has been built into Vim.

滇狐评价: 滇狐目前 cscope 用得不如 ctags 多, 许多功能都不大熟。 不过既然大家都说好, 那还是装着玩玩吧。

安装注意事项: 需要安装 cscope

1.9 project

下载地址: 官方站点

官方描述: You can use this plugin’s basic functionality to set up a list of frequently-accessed files for easy navigation. The list of files will be displayed in a window on the left side of the Vim window, and you can press <Return> or double-click on filenames in the list to open the files. This is similar to how some IDEs I’ve used work. I find this easier to use than having to navigate a directory hierarchy with the file-explorer. It also obviates the need for a buffer explorer because you have your list of files on the left of the Vim Window.

滇狐评价: 食之无肉,弃之有味。

安装注意事项: 几乎没怎么用过, 所以暂时没有发现需要注意的地方。

2 文档编写

2.1 fencview

下载地址: 官方站点

官方描述: View a multi-byte encoded file in different encodings.

滇狐评价: 对于亚洲用户, 尤其是中国用户而言, 这是一个非常重要的插件! 它能自动识别文本文件的编码, 给需要编辑各种不同编码的人员提供了极大方便。

2.2 VIM LaTeX Suite

下载地址: 官方站点

官方描述:

Vim is undoubtedly one of the best editors ever made. LaTeX is an extremely powerful, intelligent typesetter. Vim-LaTeX aims at bringing together the best of both these worlds.

We attempt to provide a comprehensive set of tools to view, edit and compile LaTeX documents without needing to ever quit Vim. Together, they provide tools starting from macros to speed up editing LaTeX documents to compiling tex files to forward searching .dvi documents.

See the features page for a brief tour of the various features in LaTeX-suite. All these features can be tuned extensively using the included texrc file. The screenshots page shows you how a typical working session with LaTeX-suite might progress.

LaTeX-suite is made for Vim versions 6.0 and above. Installation instructions are given in the download page.

滇狐评价: 实在是非常非常非常非常好的一个插件! 用 VIM 写 LaTeX 的朋友无论如何都要试一试, 不用 VIM 写 LaTeX 的朋友也要试一试, 说不定你会改变你的主意, 改用 VIM 写 LaTeX。

安装注意事项: 如果使用 gvim 的话, 需要注意 scim 可能会和 LaTeX Suite 有冲突。 解决方法是要么把 scim 的 on the spot 功能去掉, 或者把 gtk_im_module 设为 scim。 (较新版本 scim 建议第二种方案)。

另外, 为了提高工作效率, 强烈建议配置 VIM 的LaTeX 正向、反向搜索功能。

2.3 sketch

下载地址: 官方站点

官方描述: Sketch.vim – Line drawing/painting using the mouse. Based on an idea by Morris.

滇狐评价: 很好玩, 虽然用到的时候不多, 但真一旦用到了, 还是会觉得这个东西很有用的。

安装注意事项: 建议在 .vimrc 中把 call ToggleSketch() 映射为命令,方便一些:

command -nargs=0 ToggleSketch call ToggleSketch()

3 日常生活

3.1 Calendar

下载地址: 官方站点

官方描述: This script create calender window. This don’t use the external program (cal).

滇狐评价: 安装完毕后使用 :Calendar 命令打开一个垂直的日历窗口, 使用 :CalendarH 命令打开水平的日历窗口。 应该还是比较有用的。

安装注意事项: 滇狐个人喜欢把日记的扩展名改成 .txt, 默认的是 .cal。 在 calendar.vim 里面查找替换一下就可以了。 另外, 可以在 .vimrc 里面修改日记所在的路径, 默认是 ~/diary。

let g:calendar_diary=<PATH>

3.2 vimtips

下载地址: 官方站点

官方描述:

Whenever you start Vim (but no more than daily) the script will open a help window with a Vim tip. You must download the tips separately, from 官方站点

After installation, you can get the next tip with

:TipOfTheDay

滇狐评价: 每天看一条,慢慢就变成 VIM 牛了。

安装注意事项: 暂时没发现。

3.3 vimball

下载地址: 官方站点

官方描述: The vimball plugin facilitates creating, extracting , and listing the contents of “vimball” archives (*.vba).

滇狐评价:

非常棒的一个插件, 专门用来安装其它插件的。 Vimball 格式的插件安装方便, 只需用 Vim 打开, 执行一下 :so % 即可, 无须用户自己满世界找插件的安装路径, 更无须整天想着更新 helptags。 滇狐已经决定将所有自己编写或修改的插件改为 Vimball 格式了, 而且目前有越来越多的插件使用 Vimball 的格式发布, 因此大家手头上一定要备有一份 Vimball 插件! 虽然 Vim 内置了一份 Vimball 插件, 但版本太低, 许多 Vimball 无法通过它正常安装, 因此还是建议大家到 Vim 网站上下载一份最新版的 Vimball 插件。

3.4 GetLatestScript

下载地址: 官方站点

官方描述: GetLatestVimScripts is a plugin that automates retrieval of the latest versions of the scripts that you yourself use!

滇狐评价:

非常有用的一个插件, 有了它, 滇狐就可以时刻使用上最新鲜的插件, 而不用不停地到 Vim 主页上去看插件的更新情况了。

安装注意事项:

安装完毕后, 创建文件 ~/.vim/GetLatest/GetLatestVimScripts.dat, 按照这样的格式编写你的自动下载配置文件:

ScriptID SourceID Filename
————————–
<插件 id> 0 [:AutoInstall:] <插件文件名>
<插件 id> 0 [:AutoInstall:] <插件文件名>

每行写一个插件的下载信息。 插件 id 就是在 Vim 主页下载插件时 URL 中的 script_id= 后面的那个数字。 第二个参数是前一次成功下载到的插件文件编号, 第一次使用的时候该参数写 0, 成功使用一次后会自动被修改为该插件最新版本的文件编号。 第三个参数是该插件下载成功后是否自动安装, 如果要自动安装的话就写上 :AutoInstall:。 滇狐不建议使用自动安装, 因此第三个参数建议省略不要写。 第四个参数是插件的名称, 一般和下载到的插件的文件名相同, 当然即使不同也不会造成太大影响, 这个参数主要用于防止某些插件自动将自己加入到这张列表, 并非用于指定插件的下载文件名, 更详细情况请参看该插件的文档。 以下是滇狐自己的 GetLatestVimScripts.dat, 供大家参考:

ScriptID SourceID Filename
————————–
1066 0 cecutil.vba
1066 0 cecutil.vim
1066 7618 cecutil.vba.gz
1075 0 netrw.vba
1075 0 netrw.vim
1075 9816 netrw.vba.gz
1440 7151 winmanager.vba.gz
1502 8743 vimball.vim
1520 7722 omnicppcomplete-0.41.zip
1708 9649 fencview.vim
1735 10501 echofunc.vim
1863 0 tlib.vim
1863 10035 tlib.vba.gz
1926 9111 bbs.vba.gz
2037 0 hookcursormoved.vim
2037 8926 hookcursormoved.vba.gz
273 7701 taglist_45.zip
31 7218 a.vim
42 9524 bufexplorer.zip
642 0 GetLatestVimScripts.vim
642 0 getscript.vim
642 8136 getscript.vba.gz
705 2667 sketch.zip
861 0 viki.vim
861 10254 Viki.vba.gz

编写好 GetLatestVimScripts.dat 后, 打开 Vim, 运行 :GetLatestVimScripts, 即可自动下载最新的插件。 插件下载后存放在 ~/.vim/GetLatest/ 中, 可以到那里找到后安装, 安装完毕后安装文件可以删除。

3.5 ViKi

你现在看到的这张网页就是使用 ViKi 制作的。 也许它不漂亮, 但是很清秀, 而且添加信息非常方便。 是 ViKi 将滇狐从繁重的 Html 编辑工作中解放出来, 使滇狐有足够的勇气重新开始制作个人主页。

1 ViKi 简介

所谓 ViKi, 就是 VIM WiKi 的缩写。 WiKi 是一种非常方便快捷地组织信息的方式, 而 ViKi 作为一种“Personal WiKi”, 能够非常快捷地完成个人主页的制作, 将滇狐从 HTML 噩梦中解救出来。

为了表达对 ViKi 的喜爱, 滇狐编写了这份 ViKi 简介。 为了更好地组织这份教程, 滇狐还编写了这份目录, 希望能方便大家的查阅。

2 安装说明

下载和安装 ViKi 与 ViKi 的编译软件 deplate 的详细步骤请看这里

3 ViKi 快速入门

ViKi 可以支持许多很复杂, 功能很强大的语法, 详细情况请参看 deplate 附带的用户手册。 但作为日常编译, 用到的语法只是很少的一个子集。 滇狐将自己常用的语法整理出来放在这里, 作为一篇简单的入门速查手册, 方便同样喜欢 ViKi 的朋友查阅。

4 编写 ViKi

ViKi 默认的模板并不好看, 滇狐参考了一些别人的模板, 听取了一些同学与朋友的建议, 重新编写了模板, 用来编写自己的 ViKi。 虽然也谈不上很好看, 但也还是放到这里吧。

为了更方便地编写 ViKi, 滇狐使用了一些小工具, 希望能够给大家提供一些方便。

5 待解决问题

在使用 ViKi 与 deplate 的时候, 滇狐碰到了一些有些不愉快的小问题, 把它们列在这里。 虽然存在这些 Bugs, 但是, 瑕不掩玉, ViKi 与 deplate 仍然是一套很棒的工具。

25
May
stored in: 程序相关 and tagged:

一、注入攻击工具

1、啊D注入工具破解版
http://www.uushare.com/user/hackerxfiles/file/959569
2、Domain3.5干净版本
http://www.uushare.com/user/hackerxfiles/file/959573
3、GetWebshellah56bug大众版
http://www.uushare.com/user/hackerxfiles/file/959574
4、HDSI2.5
http://www.uushare.com/user/hackerxfiles/file/959576
5、HDSI3.0
http://www.uushare.com/user/hackerxfiles/file/959578
6、jsp暴源代码工具
http://www.uushare.com/user/hackerxfiles/file/959582
7、cookie注入工具
http://www.uushare.com/user/hackerxfiles/file/959571
8、ASPX暴绝对路径的工具
http://www.uushare.com/user/hackerxfiles/file/959570
9、Oracle 专用注射器 [线程版]
http://www.uushare.com/user/hackerxfiles/file/959583
10、PHP-Mysql注射分析器
http://www.uushare.com/user/hackerxfiles/file/959584
11、php注入辅助工具phpsend7z
http://www.uushare.com/user/hackerxfiles/file/959585
12、国外超级注射工具
http://www.uushare.com/user/hackerxfiles/file/959562
13、明小子的php注入工具ISAC
http://www.uushare.com/user/hackerxfiles/file/959561
14、旁注 – 网站小助手
http://www.uushare.com/user/hackerxfiles/file/959559
15、网站猎手2
http://www.uushare.com/user/hackerxfiles/file/959557
16、支持GET、POST、Cookie注入扫描和注入工具
http://www.uushare.com/user/hackerxfiles/file/959553
17、注入工具
http://www.uushare.com/user/hackerxfiles/file/959552
18、注入攻击综合软件包
http://www.uushare.com/user/hackerxfiles/file/959549
二、入侵权限提升工具
1、ASP版Serv-U提权工具[Goldsun]
http://www.uushare.com/user/hackerxfiles/file/959592
2、L.Z网络小组vip专用提权工具集
http://www.uushare.com/user/hackerxfiles/file/959594
3、langouster_udf.dll 专用网马.php
http://www.uushare.com/user/hackerxfiles/file/959595
4、NC
http://www.uushare.com/user/hackerxfiles/file/959596
5、PcanywhereReader For Lake2-EVAL
http://www.uushare.com/user/hackerxfiles/file/959597
6、pcAnywhere看密码工具
http://www.uushare.com/user/hackerxfiles/file/959598
7、Radmin本地提权exp
http://www.uushare.com/user/hackerxfiles/file/959599
8、Serv-U 6.X 版本Exp
http://www.uushare.com/user/hackerxfiles/file/959603
9、Serv-U 6.X 提权脚本.vbs
http://www.uushare.com/user/hackerxfiles/file/959604
10、Serv-U提权综合工具
http://www.uushare.com/user/hackerxfiles/file/959605
11、serv-u中添加帐号
http://www.uushare.com/user/hackerxfiles/file/959606
12、shift后门2
http://www.uushare.com/user/hackerxfiles/file/959607
13、SHIFT后门功能版源码
http://www.uushare.com/user/hackerxfiles/file/959608
14、SU提权程序ASPX
http://www.uushare.com/user/hackerxfiles/file/959609
15、WinlogonHack
http://www.uushare.com/user/hackerxfiles/file/959610
16、Winlogon劫持记录3389密码小工具(开源代码)
http://www.uushare.com/user/hackerxfiles/file/959611
17、本地提权之Sys.exe黑客手册专用版
http://www.uushare.com/user/hackerxfiles/file/959612
18、桂林老兵Asp.dll权限提升的工具
http://www.uushare.com/user/hackerxfiles/file/959613
19、海盗webshell提权工具包
http://www.uushare.com/user/hackerxfiles/file/959614
20、开3389+非net创建管理用户+Shift后门+自删除脚本
http://www.uushare.com/user/hackerxfiles/file/959616
21、万能开3389+克隆Guest集合工具
http://www.uushare.com/user/hackerxfiles/file/959619
三、小马大马
1、ASP木马集合
http://www.uushare.com/user/hackerxfiles/file/959665
2、ASP万能溶剂
http://www.uushare.com/user/hackerxfiles/file/959664
3、lake2的eval最小马发送端
http://www.uushare.com/user/hackerxfiles/file/959663
4、nohackasp木马生成器
http://www.uushare.com/user/hackerxfiles/file/959662
5、PHP4cpv2.0微型大马版
http://www.uushare.com/user/hackerxfiles/file/960506
6、PhpFile测试版2.0
http://www.uushare.com/user/hackerxfiles/file/960508
7、PHP木马修改增强版
http://www.uushare.com/user/hackerxfiles/file/960505
8、PHP批量挂马脚本
http://www.uushare.com/user/hackerxfiles/file/960504
9.SqlRootkit
http://www.uushare.com/user/hackerxfiles/file/959661
10、webshell生成器
http://www.uushare.com/user/hackerxfiles/file/960511
11、Xall.php-批量查询插入一句话.php
http://www.uushare.com/user/hackerxfiles/file/960509
12、xixiWebShell大马生成器
http://www.uushare.com/user/hackerxfiles/file/960512
13、ZV新型PHP一句话木马客户端GUI版(Include利用方式)
http://www.uushare.com/user/hackerxfiles/file/960507
14、冰狐浪子ASP后门v2.0
http://www.uushare.com/user/hackerxfiles/file/959660
15、多功能脚本木马生成器[火狐版]
http://www.uushare.com/user/hackerxfiles/file/960513
16、海阳顶端asp木马2006eval版
http://www.uushare.com/user/hackerxfiles/file/959659
17、海阳顶端网ASP木马2006+正式版
http://www.uushare.com/user/hackerxfiles/file/959656
18、黑眼睛Webshell2.0免杀版
http://www.uushare.com/user/hackerxfiles/file/960514
19、火狐asp木马生成器
http://www.uushare.com/user/hackerxfiles/file/960515
20、雷客图ASP站长安全助手
http://www.uushare.com/user/hackerxfiles/file/959657
21、一句话木马服务端
http://www.uushare.com/user/hackerxfiles/file/959658
四、SQL系列入侵工具
1、MSSQL上传利用工具
http://www.uushare.com/user/hackerxfiles/file/960576
2、Mysqlexec & Mssqlexec
http://www.uushare.com/user/hackerxfiles/file/960592
3、SqlExec
http://www.uushare.com/user/hackerxfiles/file/960591
4、SQLExplorer
http://www.uushare.com/user/hackerxfiles/file/960589
5、SQLTools
http://www.uushare.com/user/hackerxfiles/file/960588
6、SQL版低权限CMD命令执行工具
http://www.uushare.com/user/hackerxfiles/file/960587
7、SQL查询分析器休闲山庄专用版
http://www.uushare.com/user/hackerxfiles/file/960584
8、备份数据库利用工具
http://www.uushare.com/user/hackerxfiles/file/960583
9、蝉之刃 1.5
http://www.uushare.com/user/hackerxfiles/file/960582
10、辅臣数据库浏览器
http://www.uushare.com/user/hackerxfiles/file/960581
11、极速MSSQL弱口令扫描修正
http://www.uushare.com/user/hackerxfiles/file/960579
12、数据库管理助手
http://www.uushare.com/user/hackerxfiles/file/960577
五、DDOS拒绝服务攻击
1、ASPX傀儡木乃伊(ASPX SYN DDOS)
http://www.uushare.com/user/hackerxfiles/file/959631
2、NB网络僵尸
http://www.uushare.com/user/hackerxfiles/file/959632
3、NetBotAtt14En
http://www.uushare.com/user/hackerxfiles/file/959633
4、TB暗夜精灵汉化版
http://www.uushare.com/user/hackerxfiles/file/959634
5、幻影DDOS僵尸
http://www.uushare.com/user/hackerxfiles/file/959635
6、金装特南DDoS
http://www.uushare.com/user/hackerxfiles/file/959636
7、傀儡僵尸1.4VIP会员完美本地验证
http://www.uushare.com/user/hackerxfiles/file/959637
8、盘古VIP[破解]
http://www.uushare.com/user/hackerxfiles/file/959640
9、上兴网络僵尸2007
http://www.uushare.com/user/hackerxfiles/file/959641
10、世纪力天攻击器
http://www.uushare.com/user/hackerxfiles/file/959642
11、蜥蜴Vip
http://www.uushare.com/user/hackerxfiles/file/959644
12、小鱼压力测试
http://www.uushare.com/user/hackerxfiles/file/959645
13、英武工作室傀儡僵尸VIP1.4
http://www.uushare.com/user/hackerxfiles/file/959648
14、中国制造网络僵尸2008商业测试版
http://www.uushare.com/user/hackerxfiles/file/959646
六、踩点扫描工具
1、135端口扫描优化版
http://www.uushare.com/user/hackerxfiles/file/960520
2、IIS写权限扫描工具
http://www.uushare.com/user/hackerxfiles/file/960521
3、mysql弱口令扫描器
http://www.uushare.com/user/hackerxfiles/file/960523
4、尖刀超级端口扫描器V2.0
http://www.uushare.com/user/hackerxfiles/file/960524
七、代理工具
1、getproxy2
http://www.uushare.com/user/hackerxfiles/file/960544
2、I-Faker Desktop Pro(国外的CC)
http://www.uushare.com/user/hackerxfiles/file/960546
3、代理超人
http://www.uushare.com/user/hackerxfiles/file/960552
4、代理跳板Proxifierv2.7
http://www.uushare.com/user/hackerxfiles/file/960558
5、proxyfire烈火代理
http://www.uushare.com/user/hackerxfiles/file/960548
6、WinEggDrop写的代理跳板程序
http://www.uushare.com/user/hackerxfiles/file/960549
7、变异CC攻击器
http://www.uushare.com/user/hackerxfiles/file/960551
8、代理跳板Proxifierv2.7
http://www.uushare.com/user/hackerxfiles/file/960558
9、花刺代理验证
http://www.uushare.com/user/hackerxfiles/file/960561
八、痕迹清除
1、CleanIISLog
http://www.uushare.com/user/hackerxfiles/file/960533
2、clear3389
http://www.uushare.com/user/hackerxfiles/file/960534
3、清除IIS日志logcleaner1.0
http://www.uushare.com/user/hackerxfiles/file/960535
4、日志清除器
http://www.uushare.com/user/hackerxfiles/file/960536
5、组策略清除工具1.1
http://www.uushare.com/user/hackerxfiles/file/960537
九、密码字典生成器
1、N.C.P.H社会工程学字典生成器
http://www.uushare.com/user/hackerxfiles/file/960597
2、疯狂字典1.0
http://www.uushare.com/user/hackerxfiles/file/960598
3、黑客字典II
http://www.uushare.com/user/hackerxfiles/file/960599
4、万能密码生成字典
http://www.uushare.com/user/hackerxfiles/file/960600
5、易优字典
http://www.uushare.com/user/hackerxfiles/file/960602
6、专业密码生成器V2.6破解版
http://www.uushare.com/user/hackerxfiles/file/960603
十、密码破解 (包含压缩包,office系列,MD5,邮箱等密码破解工具)
1、DeMD5暴力破解
http://www.uushare.com/user/hackerxfiles/file/960612
2、Edward’s WPS2000 Password Recovery V1.0
http://www.uushare.com/user/hackerxfiles/file/960617
3、Intelore RAR Password Recovery
http://www.uushare.com/user/hackerxfiles/file/960619
4、MailCrack
http://www.uushare.com/user/hackerxfiles/file/960632
5、MD5SHA高级解密器 V2.55
http://www.uushare.com/user/hackerxfiles/file/960613
6、MD5破解工具包
http://www.uushare.com/user/hackerxfiles/file/960615
7、MS Word文档保护破解器
http://www.uushare.com/user/hackerxfiles/file/960621
8、office解密工具
http://www.uushare.com/user/hackerxfiles/file/960622
9、PasswordZillaSetup
http://www.uushare.com/user/hackerxfiles/file/960616
10、PDF Password Remover v2.5
http://www.uushare.com/user/hackerxfiles/file/960623
11、WinRAR 密码破解工具
http://www.uushare.com/user/hackerxfiles/file/960624
12、Word Password Recovery Master v1.0.0.6
http://www.uushare.com/user/hackerxfiles/file/960626
13、WORD密码破解工具
http://www.uushare.com/user/hackerxfiles/file/960628
14、密码xxx v2.3
http://www.uushare.com/user/hackerxfiles/file/960633
15、溯雪7
http://www.uushare.com/user/hackerxfiles/file/960634
16、压缩文件密码恢复工具
http://www.uushare.com/user/hackerxfiles/file/960630
十一、数据嗅探工具
1、Cain & Abel v4.9
http://www.uushare.com/user/hackerxfiles/file/959668
2、sniffdoor
http://www.uushare.com/user/hackerxfiles/file/959670
3、WinArpSpoofer
http://www.uushare.com/user/hackerxfiles/file/959671
4、xsniff
http://www.uushare.com/user/hackerxfiles/file/959673
5、X-Spoof工具
http://www.uushare.com/user/hackerxfiles/file/959674
6、超级嗅探工具Dsniffforwin
http://www.uushare.com/user/hackerxfiles/file/959675
7、网络抓包器V1.3
http://www.uushare.com/user/hackerxfiles/file/959680
8、哑巴嗅探器2.86
http://www.uushare.com/user/hackerxfiles/file/959681
9、幽灵网络嗅探器
http://www.uushare.com/user/hackerxfiles/file/959683
十二、刷流量工具
1、3倍进V1.0刷网站
http://www.uushare.com/user/hackerxfiles/file/960636
2、CCv2b
http://www.uushare.com/user/hackerxfiles/file/960637
3、牛牛Alexa排名三开刷初级体验版
http://www.uushare.com/user/hackerxfiles/file/960638
4、刷网站工具
http://www.uushare.com/user/hackerxfiles/file/960641
十三、破解工具
1、ODV1.10正式汉化修改版
http://www.uushare.com/user/hackerxfiles/file/961033
2、PEid 0.94
http://www.uushare.com/user/hackerxfiles/file/961037
3、LordPE V1.4自动脱壳
http://www.uushare.com/user/hackerxfiles/file/961038
4、Import Fix 1.6修复工具
http://www.uushare.com/user/hackerxfiles/file/9610389
注:入侵是违法行为,请大家本着学习的态度去使用
切不要做任何触犯法律的行为!

25
May

vim的帮助很详细,但若不了解有时的确不知道应该如何输入关键词,所以总结一下:

—————————————————————————–
条 目                              前缀                         例子
—————————————————————————–
Normal 模式命令                      无                        :h k
CTRL控制字符                        CTRL-                     :h CTRL-r
Visual视图模式                      v                         :h v_u
Insert插入模式命令                  i                         :h i_CTRL-o
ex-模式命令                         :                         :h :set
Command-line命令行编辑              c                         :h c_<BS>
命令参数                            -                         :h -m
选项                                ’                         :h ‘winminwidth’
——————————————————————————

哦, 还有一些关键词是用尖括号<>括起来的,如
:h <Left>
:h <CR>
:h <Up>
:helpg[rep] {pattern}  搜索所有的帮助文本并给出一个匹配 {pattern} 行的列表。

另 外,在输入关键词的时候,可以按Tab键补全,ctrl-d列出与光标前面的关键词所匹配的名字,ctrl-a列出全部模式

希望有所帮助

————————————————————————————————————

****************************************************************
******* 版友推荐插件列表(用搜索快速定位到该插件描述部分)*******
****************************************************************

————————————————————————-
BufExplorer   Taglist   latex-suite     word_complete   Sketch
DrawIt        Mark      SearchComplete  CmdlineComplete vcscommand
switchtags    ccal.rb   viki            NERD_tree       fencview
matrix        taglis    Tetris          BlockComment
————————————————————————-

(1) [ 插件的名称 ]

BufExplorer

(2) [ 插件的功能 ]

方便切换 buffer,切换 buffer 后列表自动关闭。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=42

(4) [ 备注或特别提醒 ]

装完后 Normal mode 下输入 \be 即可打开这个列表,
光标放在某一个文件上按 回车可以打开这个文件。

(5) [ 推荐人id ]

Dieken

—————————————————————————

(1) [ 插件的名称 ]

Taglist

(2) [ 插件的功能 ]

实现类或者函数列表功能,支 持 C/C++, Java, Perl, Python,
TCL, SQL, PHP 等语言,它可以在VIM中创建一个窗口,列出编辑
的 源文件中的类、函数、变量定义列表,而且更方便的是这个列表
也插入在了右键菜单中,分类存放,访问非常方便。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=273

(4) [ 备注或特别提醒 ]

依赖于 Exuberant Ctags,可以在 http://ctags.sourceforge.net 下载。

(5) [ 推荐人id ]

Dieken

——————————————————————————

(1) [ 插件的名称 ]

word_complete

(2) [ 插件的功能 ]

Insert模 式下在输入的时候自动补全单词,如果补全正确
可以按Tab键接受,否则可以不管它继续输入或者按Ctrl-n,
Ctrl-p切换 补全。 注意是输入三个字符后才开始补全。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=73

(4) [ 备注或特别提醒 ]

在 工具 菜单中选择 Word completion 开启这个功能。

(5) [ 推荐人id ]

Dieken

——————————————————————————

(1) [ 插件的名称 ]

Sketch

(2) [ 插件的功能 ]

在 VIM 里头画 ASCII 图,支持填充,剪切,拷贝等,非常有创意。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=705

(4) [ 备注或特别提醒 ]

Draw with mouse: boxes, arrows, lines, fills.
Transparent/opaque drag and drop.

(5) [ 推荐人id ]

Dieken

—————————————————————————-

(1) [ 插件的名称 ]

DrawIt

(2) [ 插件的功能 ]

方便的画连线图。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=40

(4) [ 备注或特别提醒 ]

(5) [ 推荐人id ]

Dieken

————————————————————————–

(1) [ 插件的名称 ]

Mark

(2) [ 插件的功能 ]

同时高亮显示多次搜索结果,这个特 性非常有利于显示代码
中某些变量或函数的调用位置。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=1238

(4) [ 备注或特别提醒 ]

类似的还有:
MultipleSearch
http://www.vim.org/scripts/script.php?script_id=479

MultipleSearch2
http://www.vim.org/scripts/script.php?script_id=1183

otf
http://www.vim.org/scripts/script.php?script_id=634

(5) [ 推荐人id ]

Dieken

————————————————————————

(1) [ 插件的名称 ]

SearchComplete

(2) [ 插件的功能 ]

用 / 或者 ? 搜索时按 tab 补全要搜索的单词。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=474

(4) [ 备注或特别提醒 ]

(5) [ 推荐人id ]

Dieken

————————————————————————

(1) [ 插件的名称 ]

CmdlineComplete

(2) [ 插件的功能 ]

在命令行状 态下,按 Ctrl-P 或 Ctrl-N 补全光标前面的词,候选词来源于当前buffer

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=2222

(4) [ 备注或特别提醒 ]

(5) [ 推荐人id ]

thinelephant(作者)

————————————————————————

————————————————————————

(1) [ 插件的名称 ]

vcscommand

(2) [ 插件的功能 ]

集成 cvs 和 svn 到 vim 中,可以在 vim 中看 log,diff,
annotate,commit 等等。需要安装 cvs 和 svn 的命令行版本。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=90

(4) [ 备注或特别提醒 ]

(5) [ 推荐人id ]

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=90

(4) [ 备注或特别提醒 ]

(5) [ 推荐人id ]

Dieken

———————————————————————–

(1) [ 插件的名称 ]

switchtags

(2) [ 插件的功能 ]

根据当前编辑文件的全 路径名切换 tags 选项,这样就可以
在 vim 中同时查看多个项目的代码时 Ctrl-] 不会互相串。

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=1344

(4) [ 备注或特别提醒 ]

老早以前写的,也许有点用,推荐一下。
需要Perl 插件支持(官方提供的 gvim70.exe 包含这个)。

(5) [ 推荐人id ]

Dieken

————————————————————————-

(1) [ 插件的名称 ]

ccal.rb

(2) [ 插件的功能 ]

Add Chinese lunar calender functionality to calendar.vim

(3) [ 插件的下载地址 ]

本 版文章号:8906(若有变,请搜索版面)

(4) [Appendix]
* Feature
Support 200 years(1900-2100) lunar calendar calculation

* Requirements:
vim-ruby interface (For WinXP, if you do not wish to install Ruby, just put
msvcrt-ruby18.dll in PATH)

* Usage:
a) put ccal.rb in $VIM/vimfiles/plugin dir
b) Add following lines in .vimrc
c) Open calendar window via :Calendar or :CalendarH, place cursor on a date,
press ‘gc’

“————————————————————
” Lunar calendar function for calendar.vim plugin
“————————————————————
function! s:GetLunarDate(day, month, year, week, dir)
ruby << EOF
$:.unshift(VIM::evaluate(“expand(‘$VIM/vimfiles/plugin’)”))
require ‘ccal’
d, m, y = VIM::evaluate(“a:day”).to_i, VIM::evaluate(“a:month”).to_i,
VIM::evaluate(“a:year”).to_i
cc = Calendar::ChineseCalendar.new(y, m, d)
# print the pretty date text
season_color = case m
when 12, 1, 2: ‘AliceBlue’          # winter white
when 3..5:     ‘MediumSpringGreen’  # spring green
when 6..8:     ‘DeepSkyBlue1′       # summer night
when 9..11:    ’#eec080′            # autumn gold
end

VIM::command(“highlight DateColor gui=none guifg=#{season_color}”)
VIM::command(“echohl DateColor | echo ‘#{cc.chinese_format}’ | echohl None”)
EOF
endfunction

“————————————————————
” customize calendar action
“————————————————————
function! s:CalendarDoCustom(action)
let l:tmpvar = g:calendar_action
let g:calendar_action = a:action
exe “normal \<CR>”
let g:calendar_action = l:tmpvar
endfunction

” Use the following format to map new calendar actions
autocmd BufNewFile __Calendar nmap <buffer><silent>gc :call <SID>
CalendarDoCustom(“<SID>GetLunarDate”)<CR>

* Screenshot
附件

* Only tested on WinXP

————————————————————————-

(1) [ 插件的名称 ]

Viki/Deplate

(2) [ 插件的功能 ]

This plugin adds wiki-like hypertext capabilities to Vim.
You can use viki as a “minor” mode (i.e., as an add-on to any other mode)
or as a full-fledged wiki mode. There is also an add-on plugin for ”

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=861

————————————————————————–

(1) [ 插件的名称 ]

NERD_tree

(2) [ 插件的功能 ]

The NERD tree allows you to explore your filesystem and to open files
and directories. It presents the filesystem to you in the form of a tree
which you manipulate with the keyboard and/or mouse.

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=1658

(4) [ 备注或特别提醒 ]

The following features and functionality are provided by the NERD tree:
* Files and directories are displayed in a hierarchical tree structure
* Different highlighting is provided for the following types of nodes:
* files
* directories
* sym-links
* windows .lnk files
* read-only files

(5) [ 推荐人id ]

runsnake

————————————————————————

(1) [ 插件的名称 ]

fencview.vim

(2) [ 插件的功能 ]

我就来推荐一下我 自己的插件^_^新版本完善以后就会更新到vim.org
FencView.vim : View a multi-byte encoded file in different encodings.

script karma  Rating 30/12, Downloaded by 139

created by
Ming Bai

script type
utility

description
Install:
Copy FencView.vim to your plugin directory.
Usage:
Select a encoding from the Tools/Encoding menu just like what you did in
Firefox/IE or you can use “:FencView”  command to open the encoding
list window and “Enter” key to select the encoding under cursor to
reload the file.
ScreenShot:
http://mbbill.googlepages.com/fenc.png

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=1708

(4) [ 备注或特别提醒 ]

(5) [ 推荐人id ]

mbbill

————————————————————————-

(1) [ 插件的名称 ]

matrix

(2) [ 插件的功能 ]

是的,说的就是电影 Matrix!Vim 的脚本并不是都干“正经事”的

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=1189

(4) [ 备注或特别提醒 ]

想看一下电影里那些酷酷的字符在 Vim 的窗口里翻滚吗?
发一个命令“:Matrix”即可 按任意键退出

(5) [ 推荐人id ]

runsnake

—————————————————————————

(1) [ 插件的名称 ]

taglist

(2) [ 插件的功能 ]

程序员必备插件

(3) [ 插件的下载地址 ]

本版文章号:8911(若有变动,请搜索本版)

(4) [ 备注或特别提醒 ]

附 件taglist跟原版taglist几乎一模一样,不过允许用户自定义一个filter,
把要显示的tag name修改一下。filter的原形是FilterName(filetype, tagname),
返回值作为显示在taglist窗口 中的标签。起因是我在用taglist查看Java native
函数时,由于Java native函数名是Java_packagename_ClassName_methodName的形式,
名称太长,在taglist窗口 里看不到实际的函数名,于是就做了点手脚,把tag名字处
理了一下。

* 示例:
前述的filter可以定义 为如下,放在vimrc中:

function! TagNameFilter(ft, tag)
let l:newtag = a:tag
” Filter the Java native method names, remove package qualification.
” (change Java_some_package_ClassName_methodName to ClassName_methodName)
if a:ft == ‘c’ && a:tag =~ ‘Java_\(\w\+_\)\+’
let l:reserve_classname = 1  ” indicate we need class name
let l:pad = matchstr(a:tag, ‘^\s*’) ” leading space is required by taglist
let l:idx = strridx(a:tag, ‘_’)
if l:reserve_classname
let l:idx = strridx(a:tag, ‘_’, l:idx – 1)
endif

let l:newtag = l:pad . strpart(a:tag, l:idx + 1)
endif

return l:newtag
endfunction

” if g:tag_name_filter is not set, fall back to default filter
let g:tag_name_filter = “TagNameFilter”

——————————————————————————

(1) [ 插件的名称 ]

Tetris

(2) [ 插件的功能 ]

俄罗斯方块游戏

(3) [ 插件的下载地址 ]

http://www.vim.org/scripts/script.php?script_id=172

(4) [ 备注或特别提醒 ]

呵呵,玩到100分就算很不错了。\te开始游戏,尽量不要在gui模式下玩

(5) [ 推荐人id ]

vimmer

—————————————————————————-

(1) [ 插件的名称 ]

BlockComment

(2) [ 插件的功能 ]

块注释插件,几 乎是原插件的重写

(3) [ 插件的下载地址 ]

本版文章号:8914(若有变动,请搜索本版)

(4) [ 备注或特别提醒 ]
* Usage
\c  Comment (linewise/blockwise)
\v  UnComment (linewise/blockwise)
\b  UnCommentBlock (Uncomment the whole commented block)
\d  DeleteComment (Delete whole commented block)
\j  Javadoc style Comment (No command to uncomment it yet)

It is easy to add new comment type, see CommentStr function in
BlockComment.vim

* Example
The \v command allows user uncomment part of a commented block:
/*———                                  /*———
* line1                                      * line1
* line2         place cursor on line2, =>    *———*/
* line3         press \v line2 uncommented   line2
*———*/                                 /*———
* line3
*———*/

HTML


下载HTML.zip

解压HTML.zip,然后将里面的所有文件copy到C:\Program Files\Vim\vimfiles目录下
首先,你应该把“ filetype plugin on ”写入你的vimrc。
重启vim。
新建一个test.html文件。用gvim打开按 “;html”看看会有什么结果!注意”;html”是英文的分号(;)

css

似乎很久没有关注 Vim 的动向了,在 Vim 脚本列表中找到个非常好的 CSS 颜色显示插件

这个插件可以很直观的显示 CSS 文件中定义的颜色,如下图所示。这样我们就不用一边用 Vim 写 CSS ,一边查那该死的色表了。

http://files.gracecode.com/2009_11_05/327435209e1d.jpg

安装这个插件非常简单,只要将这个文件拷贝到

$VIMRUNTIME/after/syntax/

目录下就可以了(没有的话新建一个)。这样说可能不怎么直观,那么 Windows 用户拷贝到

C:\Program Files\Vim\vimfiles\after\syntax\

这个目录下(如果你是默认安装 Vim 的话);而 *ix 系统用户则拷贝到

$HOME/.vim/after/syntax/

这里目录下就可以了。

Javascript


如果你喜欢vim, 平时也写写javascript,那么这篇文章就是为你而写的:)如果你喜欢javascript, 但是还没有找到合适的编辑器,那么请give vim a try

以下假定你对vim已经有所了解,另外所有插件在gnome-terminal中都测试 过,在其他终端中应该不会有太大问题。

  1. 语法高亮-javascript.vim
    http://www.vim.org/scripts/script.php?script_id=1491
    该插件安装在~/.vim/syntax/目录下。下载后需要修改一个地方,一般javascript编程,折叠层数不需要太深,我自己设置为1,即:
    setlocal foldlevel=1。
    需要在.vimrc中加入

    1. ” 打开javascript折叠
    2. let b:javascript_fold=1
    3. ” 打开javascript对dom、html和css的支持
    4. let javascript_enable_domhtmlcss=1

    截屏(点击可查看大图)

  2. 变量标记和检查-mark.vim
  3. http://www.vim.org/scripts/script.php?script_id=1238
    该插件安装到~/.vim/plugin/目录。在对变量进行检查和跟踪的时候会很有 用,同时还可以防止变量名拼写错误。打开/关闭变量标记的默认快捷键是m。也可以使用v选中一段进行标记。
    截屏(点击可查看大图)

    字典补全-javascript.dict

    http://lazy-people.org/browser/project/dotfiles/users/dann/.vim/dict/javascript.dict?rev=122
    该字典可以放在任意目录,我一般放在~/.vim/dict/目录中。使用字典补全需 要在插入模式下,快捷键是Ctrl+X,然后Ctrl+K。有些javascript内置函数 名超长,经常记不住,这时候字典就比较有用。字典其实就是一个普通文件,里面是关键词的列表,一行一个,所以你也可以加入一些你在项目中经常使用的函数。
    另外需要在.vimrc中加入

    1. “设置字典 ~/.vim/dict/javascript.dict是字典文件的路径
    2. autocmd FileType javascript set dictionary=~/.vim/dict/javascript.dict

    截屏(点击可查看大图)

    YUI自动补全

    待续…

  4. 运行代码片段-spidermonkey
  5. http://www.mozilla.org/js/spidermonkey/
    有时想测试一个小东西,没有必要写一个html然后到浏览器去运行,spidermonkey能帮你忙,而且spidermonkey还能作一些很 geek的事情。ubuntu系统安装很简单,sudo apt-get install spidermonkey-bin,其他系统请参考网站的文档。安装完毕后,输入js,则会进入一个js shell,和python类似。输入help()回车,会看到一个简单的帮助。
    在vim编写javascript 代码后,输入!js %即可执行当前文件的代码。也可以选中一段代码然后执行:’<,’>!js,这样会插入执行结果到当前文件。
    截屏(点击可查看大图)

    语法检查和快速调试-javascriptlint

    http://www.javascriptlint.com/
    这个工具的代码基于Douglas Crockford’sjslint,在代码检查方面很强大,可以说非常苛刻。如果从头开始写代码,建 议经常用它来检查代码,能明显提高代码的质量。下载时不要从代码库check out最新版本,而是下载稳定的0.3.0版本。
    $ cd jsl-0.3.0/src/ #这里的jsl-0.3.0是解压缩目录
    $ make -f Makefile.ref all
    $ cd Linux_All_DBG.OBJ/
    $ cp jsl jscpucfg /home/xp/bin/js/ #/home/xp/bin/js/要拷贝到的目录,可以任意位置
    $ cd /home/xp/bin/js/
    $ jsl -help:conf > jsl.conf #生成默认配置文件
    另外需要在.vimrc中加入

    1. “设置 javascriptlint
    2. autocmd FileType javascript set makeprg=/home/xp/bin/js/jsl -nologo -nofilelisting -nosummary -nocontext -conf ‘/home/xp/bin/js/jsl.conf’ -process %
    3. autocmd FileType javascript set errorformat=%f(%l): %m
    4. autocmd FileType javascript inoremap <silent> <F9> <C-O>:make<CR>
    5. autocmd FileType javascript map <silent> <F9> :make<CR>

    使用时使用:make命令即可,或者使用F9快捷键。还需要理解的是quickfix,输入命令help quickfix看以下文档,主要涉及的命令有:cw :cn :cp等。
    截屏(点击可查看大图)

    其他常用插件

  6. 虽然我不怎么用,但是可能对你有一些帮助
    winmanager 类似资源管理器,如果从editplus或者其他图形编辑器转过来的朋友,这个可能很有用。
    截屏(点击可查看大图)
  7. minibufexplorer 类似标签页,管理当前打开的文件
    Tlist可 以显示代码结构

Videos, Slideshows and Podcasts by Cincopa Wordpress Plugin