为什么要用 Emacs/Vim,而不是任何其他编辑器
其实就是一句话:程序式编辑。
如果你没明白这个我自造的词组的话,那听我慢慢解释。另外我只用过 Vim,但我相信 Emacs 必然也是如此,下文所有的“其他编辑器”都是指“Emacs/Vim之外的所有其他编辑器”
曾经有一个朋友,属于微软系的,入选过微软中国区 MVP,有一次他问我,Vim 到底是个什么样的东西。我对 Vim 一直是三脚猫的水平(到现在也是),我说,这玩意的学习曲线几乎是垂直的,非常难上手,但是很强大,把常见操作都“宏”化了,比方说 dd 是删除一行,fa 是光标挪到下一个字母 a 的位置,而 dfa 就是删掉从当前光标到下一个字母 a 之间的所有内容。他“哦”了一下。但我自己也没法更好的解释 Vim 到底好在哪里了。
前些日子,看到一篇文章《程序员?还是小丑?》,里面第一个段子是,打印 10 个 hello,结果小丑写了 10 行 print "hello"。有人在回复里打趣
或许第一个小丑用的是Vim,我相信任何编程语言的for循环都不会简单过vim的yy10p的。
或者是 Y10p
确实,在那些回复里看到的唯一一个更短的是 Python 的 print “hello ” * 10
但同时我意识到,这是一个 Vim 跟其他编辑器最主要的差别。如果是更复杂的操作,你可以在任何编辑器里录制一个宏,然后重复,但是对于这么一个简单的操作,其他编辑器里很难用同样如此简洁的输入来达到同样的效果。比方说你可以复制当前行然后粘帖10遍,但是,在Vim里,“10”这个数字是作为参数来输入的,而 Y 和 p 组合后就类似于 PHP 里的 str_repeat 函数。
所谓“程序式编辑”,就是把 Vim 的编辑方式看成是一种语言,把每个操作都看成函数或者关键词,所有操作合在一起看成是一段用来生成程序的程序。这就是 Vim 跟其他编辑器的根本差别。
这同时也解释了为什么 Vim 难学:作为成生程序的程序,就需要尽可能的简短(如果命名都用 Java 的方式,那必然生成用的程序会比成生后的程序更长,那还不如直接书写最终程序本身了),所以函数都使用一两个字母来命名……这就必然导致了难学难记:这门语言需要你记住几十个函数,每个函数都只用一两个字母命名,而所有操作组合起来就像一段被混淆过的代码,你很难通过读混淆过的代码来学习程序(也就是看别人用 Vim 的方式),所以几乎是唯一的出路就只有硬背函数名,并尝试自己组合运用这些函数。这还不包括 Vim 的配置文件本身也用的是图灵完备的语言。
我之前最大的问题就是没搞明白这个本质性的差别,所以在 UltraEdit 上耽误了这么多年,2011 快过去了,今年最大的收获就是开始入门 Vim 和 Git,同时也有点悔,如果早两年这样就好了。
这个世界上有大量的编辑器,常见的、拥有大量用户的也不下十余种,我之前接触的论调都是说 Vim 或者 Emacs 具有无限扩展的能力,其实编辑器发展到今天,差不多该有的功能都有了,别说什么代码高亮文件跟踪自动完成正则替换,就算插件啊宏啊内置脚本语言啊,也都有,差也差不到哪去。而且很多都有独门的绝活,像下图中 Sublime Text 可以显示整篇代码的缩略图,就必须是原生 GUI 才能实现的功能,内置语言再高级也没用。
但唯独这编辑方式,是刻在骨子里的。如果不是见识了 Vim 的极致的高效,我也无法理解不单是纯键盘输入,连方向键都要用字母键代替。对待这个基本问题,要么是像 Vim 用模式来区分,要么像 Emacs 一样用组合键来区分,再无更好的方法。其他功能都只是锦上添花。
所以这个世界上编辑器只有三种,Emacs、Vim,和其他。或者说,编辑程序的方式有两种,程序式编辑程序,和文本式编辑程序。
建议继续学习:
- vim几个小技巧(批量替换,列编辑) (阅读:35894)
- 简明Vim练级攻略 (阅读:20698)
- Vim下的代码自动补全和代码跳转阅读 (阅读:14335)
- 在vim(gvim)中运行终端(对,你没有看错,我也没有写反) (阅读:9334)
- Emacs配置C/C++-mode的代码智能提示和自动补全 (阅读:9216)
- vim入门,进阶与折腾 (阅读:9149)
- 让vim在终端下的配色亮起来! (阅读:8559)
- Emacs安装配置 (阅读:7292)
- 最近总结的一些技巧(vim,python,svn,fiddler等) (阅读:7029)
- vim的复制粘贴小结 (阅读:6465)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:zhengkai@gmail.com (郑凯) 来源: Soulogic 灵魂逻辑
- 标签: Emacs Vim
- 发布时间:2012-01-15 00:08:01
- [67] Go Reflect 性能
- [67] Oracle MTS模式下 进程地址与会话信
- [67] 如何拿下简短的域名
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [60] 图书馆的世界纪录
- [59] 【社会化设计】自我(self)部分――欢迎区
- [58] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [49] 给自己的字体课(一)——英文字体基础
- [47] 界面设计速成