我眼中的vim

  前一段时间,很多同事一直在被我骚扰,因为我在尝试推销vim有多么的好用。他们觉得我似乎不做销售,真心是浪费人才。在公司的很多事情重复程度很高。能够在大脑和编译器之间建立一个优良的通道对于我来说还是十分有意义的。因为节省下来的时间可以做好很多必要的事情,比如分析需求和设计代码架构。每当生产工具发生改变的时候,生产方式以及管理者对于生产的理解随之发生改变。这句话听着好像来自于教科书。确实如此,不过这是百分百的事实,如果你买过车( 电瓶车也算! )就很容易理解,当在开车而不是骑自行车的时候,你对于自己能去哪儿的看法完全不同。编程亦是如此。鉴于思考和写作都要独立,我就不写怎么用和怎么学了吧,想知道的同学可以移步coolshell和 learn vim script the hard way。那里有非常优秀的教程。

  基本行为的抽象

  编码的过程可以被抽象为移动和操作两个部分。也就是把光标移动到某个位置,然后或者输入,或者修改,或者删除一些东西。对于普通的IDE来说( 比如visual stdio ),能做的事情非常的朴素,基本包括四个方向键,page up , upage down, Home,end和鼠标。所以当我们从一个函数的第一个参数移动到第二个参数的时候,只能不停的按下方向键。这样做很累也很无聊,我们自然很希望编辑器能够为我们提供个快捷键,让我们能在参数之间,飞来飞去。类似的,很多时候你想从当前位置删除到行尾或者删除到行首,普通IDE所能提供的帮助也几乎为0( 这也就是为什么vs被叫做高级记事本的原因 )。看到这里你就不难明白为啥vim有那么多的快捷键了。其实这个跟计算机的系统架构以及操作系统架构的原理是一致的。cpu所支持的基本操作说破天也只有四个,load (取数据),save( 存数据 ) ,jump(代码跳转) , op( 计算).但是如果只用这四个命令进行编程,保证累死你。vim和计算机系统架构所做的事情就是把最常用的部分打包装好,以供上层使用。对于程序员来说,我们对于代码的修改并不是一个字母一个字母的,而是一个单词一个单词或者一个代码块和一个代码块甚至是一批文件一批文件的。用适当的方式对最常用的操作和移动进行抽象,你就看到了那个好像很吓人的vim快捷键速查表。而习惯于用快捷键进行进行编程之后,我眼中的代码,不再是一行一行的,而是一块一块的。原先一个字母一个字母的添加和修改,现在l变成了逐个单词,逐个语句以及逐个代码块之间的添加和修改。这非常有意义。因为代码在我的眼中,逐渐由原先的零散的电子原件,变成了可以随意组装和配置的集成电路。读代码的时候我会进一步关注,模块的作用和模块之间的关系,而不是各个电子原件的连接。写代码的时候,我也会尝试让自己代码更具模块化,而这不就是oo神马的一直所倡导的抽象么。

  自定义的魅力

  什么叫做自定义呢?传说有一帮人觉得vi不够好,然后他们开发了vim....如果说vi向你提供了最好用的系统调用( 当然是vi开发者们认为最好用的 ),那么vim就向你提供了设计自己的系统库的机会。系统的设计是为了满足大多数人的基本需要。那么作为某一个系统的使用者,肯定要想尽办法让系统满足自己的需要。用枪对着比尔大爷( vi 他写的! )的脑袋然后要求他按照你的习惯专门做一个版本出来,绝对不是一个好主意。且不说你能不能找到比尔大爷他们家的门朝哪儿开,就是人家愿意给你做, 也得再组个团队分析你的按键记录,思考方式以及代码习惯。等真正做出来了,估计你家经理已经把你炒掉了。而且,别人再牛,最了解你的人还是你自己。用自己写的系统库,肯定是最舒服的事情( 这里跑题下,除了自己之外,最了解你的人是你家bf/gf,所以需要什么贴心建议的时候,找他们最好 )使用vim入门之后,如何让其更加的贴合自己的习惯是我等user的头等大事。 大多数IDE也支持自定义,比如你可以定义tab的大小,自动保存的时间以及高亮匹配括号。不过根据我的经验,除了你不能让vim把自己卸载了。。。你几乎想定义什么就定义什么,比如从一个文件夹中读取最新的log到临时文件中,并且将不可显示的字符替换成空格这个过程。如果是IDE,我需要首先打开文件夹,然后用时间和后缀把所有的文件排序,然后将log文件复制粘贴并且重命名为tmp.log.然后用IDE打开这个文件并且google下如何对不可读代码如何进行替换( 我真的不知道怎么用vs把替换成 空格.... )。好吧,这个过程看上去是可以接受的。。( 因为我也这么做了好久),但是在持续coding若干小时之后还需要反复如此....那真是的不敢想象。但如果是vim,我可以在闲暇的时候花二十分钟自定义好这个过程,然后在写程序的时候用一个命令直接搞定。所谓程序员幸福的日子,就是这么来的。这是一个相对复杂的例子,在日常使用过程中,只需自定义某些基本操作就可以轻松体会到其中的魅力。

  自动化意味着什么?

  所谓自动化,就是让机器负责机器能做的事情,人负责机器不能做的事情。 而自动化的一大优点是让机械的行为失误率为0.作为一个要和各种失误斗争的程序员,让能够自动化的事情自动化可谓是提高效率不二法宝。比如在文件创建的时候自动添加到svn,比如在创建cpp文件的时候自动创建对应头文件,或者每次调用new创建内存的时候自动在当前函数下添加对应的delete。 vim会帮助你这么做( 嗯,除了帮你在关闭vim之后自动把自己卸载掉 )。就好比你开锁成功之后,钥匙会自动回到兜里一样。( 相信每个人都有着急找不到钥匙的时候 )当然,我们也可以养成把钥匙及时放回口袋的习惯。不过,既然是人就有犯错的时候,而程序员犯错的机会又格外的多。特别是回家之后累个半死又急着上厕所和看电视的时候,每月有那么几天找不到钥匙就很正常了。而编程过程中自动化和vim自定义是分不开的,因为当不能自定义关闭文件的时候让编辑器帮我做点什么的时候,鬼才去想让整个流程自动化起来。所以vim可以像一个贴心的仆人,让你在每次回家的时候帮你把要是收好,然后在你离开家的时候再递给你。


  嗯,大概想到了这么几点就略微聊下,不过我没有用过emacs和subline,如果有伤害到其fans的话,我在此向他们表示歉意,因为我真的木有用过其他高级编辑器。下次写点什么呢?写写我看linux system programming的感受吧。

原文地址:https://www.cnblogs.com/jsxgblcxp/p/4116453.html