红联Linux门户
Linux帮助

别碰我,VIM

发布时间:2009-08-30 09:34:59来源:红联作者:troonv
来源:cnbeta.com

大家都说用VIM的是高手,我说不对,随便看一下程序图片,简直就是绝世高手用的编辑器。我折腾了半夜,反而被它给折腾了,因此为了朋友们的幸福着想,我不再一一列举它的用法。其实最大的原因是:不好意思,我也没能学会传说中的绝世武功。

据说,VIM(编辑器)+GCC(编译器)+GDB(调试器)是Linux下最常用的开发工具链。自小被VS2005浸染的我,不习惯VIM,不习 惯GCC,不习惯GDB,叫我怎么敢跑到Linux下写程序。高手们似乎很喜欢用VIM加上一大堆插件来写程序,根据我看到的做法,要想有VS那样的智能 补全功能,VIM首先要Ctags(这是要输入一长串命令的),接着输入几个字母再按一下Tab键(需要SuperTab插件),才能出现智能提示。

这还不是最紧要的,在VIM里面,删除一行字,请按d两下,删除一个字,请按一下x。以及一长串的需要记忆的命令列表,例如gg是跑到文章的最前 面,shift+4是跑到行首,等等。我不自觉地想起了小学五年级那个暑假学的WPS,要输入一大堆的指令才能输出一篇格式整齐的文档,在别人眼里看起来 绝对是很牛的事情。现在会用Office2007的,也不止你我他吧?至于那个时候所学的一大堆WPS控制指令,还有五笔字型,到现在全忘了。

我肯定不是个记忆强的人才。帅哥拿起个Ubuntu,手中熟练地敲打着一堆我看不懂的指令,看得我眼花缭乱。用Linux,我最头疼的事情是干什么 事情我都要先敲入一个命令,然后-help找帮助来看,否则绝不会记得那个命令是怎样用的。一开始还说这是学习阶段要好好熬,尝试多了以后就会觉得这事真 的很折腾。

你说,好好一个软件为何就不写个gui界面,非得让我敲命令去记忆每个参数什么意思,好好一个配置为何就不写个gui界面,非得让我把整个配置文件研究完才知道我该去哪里修改配置参数。

他们说:Unix哲学是:一个程序只做一件事,并做好。但是不知道为什么,Linux下的软件作者似乎就是懒得写个gui,或者他们认为他们只需把 软件的逻辑做好就可以了,至于gui方面,根据简单原则,应该由其他有兴趣的人去做。其实我觉得原因有二,一则是没有强大的开发工具(要像C#那样拖个控 件就可以写gui),二则程序员也懒。

为什么没有强大的开发工具呢,为什么Linux下没有VS这样的重磅武器?我再从VIM+GCC+GDB说起吧。VIM的难刚才说过了,GCC的 话,要是有几个文件你非得自己手动写一个makefile不可,GDB我基本没试过,据说也有些图形界面的调试工具,可以像VS那样按一下快捷键就能调试 (这个肯定也是要配置N久的),我看过一份GDB的使用手册,又要记忆很多调试指令,我觉得我快要崩溃了。

上面所说的“一个程序只做一件事,并做好”现在已经造成了许多弊端,最可见的是依赖性。

相信在Linux下稍微深入过进行开发的知道,GCC的版本号是件很痛苦的事情,有些程序要A版本的GCC编译,有些程序要B版本的GCC编译,高 点低点版本号都不行。再加上相应的头文件库文件版本号,你是不是有种抓狂的感觉。悄悄地,我再告诉你,Linux现在发展很快,版本号一直在不停地变,你 可以去发疯了。

譬如,A作者维护一份A程序,B作者维护一份B程序,两个程序之间是有依赖的(可能的情况是B程序是A程序的gui),突然B作者想去周游世界不继 续开发B程序了,A作者继续开发下去,接口变了,那B程序基本就没用了。作为使用者的你,要么只能怨天尤人,要么改行帮B继续开发。

开源模式无疑是有很多长处的,但是其短处一直没有被正视。开源意味着源代码开放,人人都可以修改提交,可是就实际情况而言,更多的是做横向的,而不 是做纵向的。我所说的横向是指开发配套软件,纵向是指对软件进行更深入的开发。因为横向的容易,只需要知道要配套的接口就可以了,而做纵向则需要将源码读 懂。

继续说为什么Linux下不可能出现VS这样的重量级应用。VIM+GCC+GDB一样可以实现VS的功能,可以进行编码,编译以及调试,但为什么它们合起来就不是VS?因为没有架构。

现在开源的开发模式说到底还是陈旧的开发模式。软件工程的概念已经提出来好几十年了,可是当你想深入了解某个开源软件,接着去下载其源代码的时候,会很悲哀地发现:你找不到任何对应的开发文档。所有能帮助你理解源代码的只是程序源代码中的注释。

假如你很牛,想要做一个Linux下比VS还强的IDE,要用到VIM、GCC和GDB,你要做哪方面的工作呢?以进行一次小小的开发为例吧。先不 管VIM中代码智能提示是怎么来的(至今我还不知道如何写好函数名后提示我参数列表),辛辛苦苦写好代码后,要编译是吧?假设编译出错了,GCC会提示你 哪里错了,还显示出一个行号提示是哪里的错误,错误是什么。想快速定位到错误的地方吗?不好意思,GCC说我是编译器这事不归我管,VIM是个编辑器,这 事归它管。可我总得知道是哪里错吧?谁给我这个定位的参数?GCC只能输出信息,它意识不到VIM的存在。这时候你得写个适配接口,将GCC的输出信息转 换一下,然后提交给VIM,VIM再跳转到出错的地方。当然这个VIM插件是有的,叫做quickfix。

诸如此类的问题很多,VIM、GCC和GDB是基本没什么关系的软件,要想使它们可以通信,你必须写一大堆的适配程序,写适配程序还得考虑VIM的 接口是怎样的,GCC的接口是怎样的,GDB的接口又是怎样的,这些你又得去学习。而在VS中,这是一个设计好了的架构,不同模块之间的接口是已经定义好 了的,它们之间传输的数据也是定义好了的,想要通信是吧?简简单单在内存传送一个变量过来就可以了。而在VIM+GCC+GDB的通信中,数据的传送是很麻烦的事情,有时候还要通过写入读出硬盘,很神奇吧?

由于没有架构,所以要写一大堆的适配器才能将它们集成起来,还有些是适配器做不了或者做得不够好的功能,譬如刚才所说的代码智能提示,的确是有 VIM插件可以做,但是如果你看过写C#时候VS的行云流水,就知道那些插件做得远远不够。这不是插件的问题,而是VIM+GCC+GDB们在该内聚的时 候没有内聚。当然这也不是它们的分内事,它们本来就不是打算做IDE的。这时候你还会觉得“一个程序只做一件事,并做好”是绝对好事吗?

知道了没有架构之后,你可能会想,要是有了架构,是不是就可以做出VS那样的IDE了?这还得考虑开源开发者的软件工程水平。就我看来,还是有许许 多多的开源开发者基本是没有软件工程概念的。在现实中,你可以要求一个开发者按照你的思路你的文档去开发,因为你掌握着他的薪酬。而在网络中,一则没有软 件工程开发观念,二则他们也不会去学习新的一门学科,各种各样的软件工程开发模式,咱做开源只是兴趣而已,此处不留爷,自有留爷处。你拿什么来管理这些不 想被束缚的开发者们呢?

除非,有架构,而且VIM和GCC和GDB按照架构去做,否则绝不会做出VS那样的IDE。可是几乎在一盘散沙各自为政的开源界,有可能吗?所以我断言,开源界不可能出现VS那样的重量级应用。
文章评论

共有 10 条评论

  1. witchcraft 于 2009-09-19 17:02:46发表:

    听着提神,看来vim还是比较强大的,嘿嘿~~~~~~~~~

  2. freeice 于 2009-09-05 17:18:53发表:

    非常支持者!!!!

  3. freeice 于 2009-09-04 17:48:24发表:

    真得还不错啦!!

  4. luciffer 于 2009-09-04 17:24:18发表:

    楼主是只知其一不知其二个,如果有的地方不能用vS又怎么办呢?既然做开发,什么样的情况都会遇上的,如果是编译器不在你的的主机上,而在服务器上,要telnet上去进行的话,vs可能就不行了,那你怎么办呢?说句公道 话,我没有用过vs啊,但是我用个source insight,他的速度都比不上vim+cscope,不知vs比起source insight怎么样啊

  5. wang7131984 于 2009-09-03 21:01:09发表:

    那些NBHH的IDE能做的事对VIM来说只不过是小儿科,可笑还有人拿它当宝

  6. wang7131984 于 2009-09-03 21:00:00发表:

    这种弱智的文章就不要转载了.....连Makefile都不会写的人还有脸叫程序员?别恶心我了。VS那种弱智的智能补全有什么了不起,我的vim可以对各种语言进行snippet和载入大量的模板,别说是对C,C++这种程序语言进行自动不全,就是latex,mpost这种描述性的语言照样补全,甚至可以说,我可以对自然语言如英语,汉语进行自动不全,VS能做到嘛。再说了VS有正则表达式吗?同上,一个正则表达式都不会的人还有脸叫程序员。

  7. xiazhouquan 于 2009-09-03 15:54:30发表:

    我就喜欢用VIM+GCC+GDB,这个东西长见识,很强大。熟悉后就觉得有时比IDE强大,信不?

  8. rgwan 于 2009-09-01 03:59:41发表:

    同意LS!

  9. hantu 于 2009-08-30 14:10:09发表:

    vi/vim就象DOS中的edit那样,是最最基础的编辑器,在小系统和预运行环境中(通常也就是内核加个busybox而已),系统中就仅仅有一些最最基础的命令,此时通常也就只vi一个编辑器可用,它的重要是不容置疑的,对于系统管理员来讲,使用vi几乎是必须的。

    桌面用户完全可以使用全图形界面的开发环境,Linux下一样有许多可用的优秀的IDE,比如Kdevelop、Eclipse、Netbeans、anjuta,它们都不会比VC差,没有人强迫你去用VIM+GCC+GDB的,但能用VIM+GCC+GDB写出好软件的当然会是高手,就象是你在win下只用记事本写代码然后在命令行下编译就能写出好软件一样。楼主显然对Linux下的开发了解不深,有些观点太可笑了。

  10. Guboae 于 2009-08-30 10:24:55发表:

    说不碰就要碰