吃鸡蛋的战争our histories of six thousand moons make no mention of any other regions than the two great empires of Lilliput and Blefuscu. Which two mighty powers have, as I was going to tell you, been engaged in a most obstinate war for six and thirty moons past. It began upon the following occasion. It is allowed on all hands, that the primitive way of breaking eggs, before we eat them,was upon the larger end; but his present majesty's grandfather, while he was a boy, going to eat an egg, and breaking it according to the ancient practice, happened to cut one of his fingers. Whereupon the emperor his father published an edict, commanding all his subjects, upon great penalties, to break the smaller end of their eggs. The people so highly resented this law, that our histories tell us, there have been six rebellions raised on that account; wherein one emperor lost his life, and another his crown.
我们六千个月以来的历史除了利立浦特和不来夫斯库两大帝国外,也从来没有提到过其他什么地方。我下面要告诉你的是,这两大强国在过去三十六个月里一直在苦战。战端的发生是由于以下的原因:我们大家都认为,吃鸡蛋前,原始的方法是打破鸡蛋较大的一端。可是当今皇帝的祖父小时候吃鸡蛋,一次按古法打鸡蛋时碰巧将一个手指弄破了,因此他的父亲,当时的皇帝,就下了一道敕令,命令全体臣民吃鸡蛋时打破鸡蛋较小的一端,违令者重罚。老百姓们对这项命令十分痛恨。历史告诉我们,由此曾发生过六次叛乱,一个皇帝送了命,还有一个皇帝失去了王位。VIM vs. Emacs
这两款编辑器都诞生于1976年,其作者也分别是计算机界举足轻重的人物,Bill Joy (Sun的共同创始人和首席科学家),和Richard Stallman (GNU的创立者和自由软件的教父)。这两种编辑器代表了不同的设计哲学,自其诞生起,关于它们孰优孰劣的争论便无日无之,伴随着它们的成长,直到现在。 在Wiki上有专门一个词条,叫做"Editor War",它描述了这场延续了超过30年依然没有尽头的“战争”。
在Editor War中,VIM的粉丝这样嘲笑Emacs:Emacs Makes Any Computer Slow
Emacs Manuals Always Cause Senility
Exceptionally Mediocre Algorithm for Computer Scientists
也只有VIM的advocate能想出这样搞笑而技术性的讽刺。(想想我在"VIM哲思二"里介绍的VIM递规特性吧!)VIM是编辑器之神,emacs是神之编辑器
(又是不见血的讽刺)
至于 emacs 这个毫无疑问比 vim 更强大的工具没有被冠以The Editor如此称号,是因为他被称作:一个有编辑功能的操作系统,而不是一个编辑器。(a great operating system, lacking only a decent editor)在Emacs里面,你除了编写各种格式的 文件之外,可以构建和运行程序,收发邮件,以文本方式浏览网页,还可以玩游戏,聊天,听音乐,看电影甚至煮咖啡(恐怖吧?)。在某种程度上,Emacs俨然是一种信仰和生活方式。
对此,Eris.S.Raymond在"The Art of Unix Programming"中对此的解释是:write a big program only when it is clear by demonstration that nothing else will do.
无奈啊无奈!
2009-05-11
VIM哲思(三)
"Gulliver's Travels" -Jonathan Swift
《格列佛游记》-乔纳森.斯威夫特
During the course of these troubles, the emperors of Blefusca did frequently expostulate by their ambassadors, accusing us of making a schism in religion, by offending against a fundamental doctrine of our great prophet Lustrog, in the fifty-fourth chapter of the Blundecral (which is their Alcoran). This, however, is thought to be a mere strain upon the text; for the words are these: 'that alltrue believers break their eggs at the convenient end.'
"Gulliver's Travels" -Jonathan Swift
在这一切麻烦纷乱的过程中,不来夫斯库的帝王们经常派大使来向我们提出抗议,责备我们在宗教上分立门户,违背了伟大的先知拉斯特洛格在《布兰德克拉尔》(即他们的《古兰经》)第五十四章中的一条基本教义。不过我们认为这只是对经文的一种歪曲,因为原文是:“一切真正的信徒都要在他们觉得方便的一端打破鸡蛋。”
《格列佛游记》-乔纳森.斯威夫特
2009-05-04
VIM哲思(二)
模式,模式
有一件众所公认的事实:VIM的学习曲线是众多文本编辑器中最陡峭的!
陡峭的原因在于决定使用VIM之前,不得不了解模式的概念,否则连一个字母也别想输入!
VIM共有六种基本模式(Basic Mode) [1]
- 普通模式(Normal Mode)
- 插入模式(Insert Mode)
- 末行模式(Command-line Mode)
- 可视模式(Visual Mode)
- 选择模式(Select Mode)
- Ex模式(Ex Mode)
这六种模式可以精简为普通模式和插入模式两种,其他的四种模式可以看作普通模式的特例。普通模式操作指令,插入模式操作数据。而操作方式的表象是一致的:输入字符序列,甚至是相同的字符,以得到不同的结果。
这种高度的抽象仿佛Lisp语言的灵魂附体:
- 指令即数据,数据即指令。
- 字符和字符组合之于VIM就好像原子和列表之于Lisp。
- 而指令的互相组合,就好像高阶函数Lambda[2],是一种更高层次的过程抽象。
纸上得来终觉浅,绝知此事要躬行:
把整篇文章全部小写ggguG
去掉所有的行尾空格:s/\s\+$//
去掉所有的空白行::%s/\(\s*\n\)\+/\r/
a12345678b12345678c12345678d12345678e12345678f12345678g12345678h12345678i123456781、将上面内容中所有的45换成de:%s/45/de/g2、去掉每行开头第一个字母gg Ctrl+v Gd
是不是瞠目结舌,叹为观止?这些神秘的字符组合蕴藏着不为人知的能量。
统一之美
- 世界是一切实况之所是。
- 实况之所是,即事实,是由原子事实组成的。
- 原子事实是对象(物项、事物)的一种结合。
——维特根斯坦《逻辑哲学论》
字符在VIM里即是原子事实(Sachverhalt),而其本身是"命令模式指令意义"与"插入模式字面意义"的一种结合。字符原子组成了实况之所是(was der Fall ist),进而建立了整个表象的世界图像。
语言就是世界的逻辑形式。——维特根斯坦《逻辑哲学论》
这种近乎偏执的抽象传达了这样一种理想:完美的东西就应该是广泛适用的。不断地结构再重构认知的元素对象,统一各种命题,无疑是对完美的追求。
实际在UNIX系统中,以文件为原子事实的概念就根深蒂固,以至于各种硬件设备都被统一抽象成文件。
在Lisp中,明确提出了原子这个术语,其递归式的元编程(MetaProgramming)思想更是指出了描绘世界的逻辑形式的可能。
名称意谓对象。对象是它的意谓 。——维特根斯坦《逻辑哲学论》
因此,是简单对象的存在保证了意义的确定性。名称若无指称,则包含此名称的命题无意义。名称代表对象,而非描述对象,因此名称不是对象的图象,名称也无所谓真假。只有命题才是图象。同样的原子字符,不同模式下是不同的,如果混淆了,根据维特根斯坦的图像理论,就是没分清名称、命题、对象的关系。因为“只有命题具有意义,只有在命题的叙述关系中一个名称才有指谓”,而这种叙述关系在VIM里就是模式。这实际上表达了一种更深层次的本体论。
VIM是哲学,也是艺术。
2009-05-03
VIM哲思(一)
世界各地散落着关于VIM各式各样的传说。在那些只言片语的海洋里,她既古老又年轻,既守旧又创新,既高不可攀又平易近人,既独善其身,又俯瞰众生。她神秘的容貌总是被薄而不透的面纱模糊,只有在轻风拂过的时候才似有还无地展露略显苍白的肤色和自信而莫测的微笑。
编辑器之神
世界上有三种编辑器,VIM,Emacs及其它。
这"其它"里就包括我们日常认知范围内所谓的编辑器概念:记事本、写字板、notepad++、UltraEditor32甚至MS WORD。我们坐井观天地认为这些就是编辑器的全部,它们能帮助我们解决编辑文本时所遇到的一切问题:输入、删除、剪切、复制;它们替我们想到了我们所有的要求:缩进、下沉、编码、打印;它们给我们提供了每一个操作对应的所有按钮和菜单——看看WORD臃肿的身躯吧——这才是编辑器之神吧?
归真返璞,编辑器的本质是对文本内容进行编辑并输出。就这个定义看来,上面所列举的所有编辑器都能做到,WORD甚至还能做得更多。但WORD做得太多,在还没有成为一个优秀的编辑器的时候就渴望成为优秀的排版器。这是我们一直混淆的概念,编辑与排版,是彻彻底底的两件事情。如果你用过VIM+LaTeX去完成WORD的任务,你会惊叹于WYSIWYM(所见即所想 What You See Is What You Get)理念带来的高效与惊喜。在编辑器的定义下,评判优劣的标准不外乎两点:功能与效率。
如果把VIM的上百个命令全部做成按钮放到任务栏,每个人都会惊叹与这是怎样的一个怪物!当然,它并没有这么做。
试着打开并编辑一个体积在100M以上的文本文件,你会明白什么叫做效率。这在分析系统日志的时候经常遇到。
也许只有理解了VIM平淡外表遮盖下的深邃内涵,才能去品味这个被称为"The Editor"的编辑器之神,品味那些神性的美。
简洁即美
令所有人意想不到的是,VIM的界面简单到你根本意识不到她已经出现在你的眼前。它没有标题栏、菜单栏、工具栏、状态栏,甚至连输入区域都寄生在SHELL里面!没错,这就是传说中的VIM.VIM的设计符合UNIX哲学中最重要的一条——"KISS"(Keep It Simple, Stupid)。错综复杂的美妙设计,常常使我们的设计能力超出排错能力,结果是代价高昂的废品。
不仅仅是界面,VIM的基本操作命令没有超过2个字母的,这极大的提高了工作效率,相比那些被归为"其它"的编辑器,VIM不需要晃动鼠标进行慢悠悠的定位,也不需要打开一大堆菜单和对话框寻找特定的功能,一切的操作双手都无需离开键盘,从头至尾。不是亲眼所见,你也许永远无法想象熟练使用VIM的高手双手在键盘上翻飞5分钟就能完成其它编辑器50分钟才能修改完成的编辑量。
懒惰改变世界
懒人推动世界进步。从古代发明到工业革命,再到信息革命,懒惰是背后一脉相承的主题。让机器去完成人类重复性的劳动,从而把自己解脱出来抽烟喝咖啡,这是科学家式的思维!VIM的设计哲学正是基于懒惰,这也正是其伟大之处。编辑性的工作往往繁杂而重复,为此,VIM被设计成总可以帮你找到更少的按键方式来实现相同的目标。VIM还设计了多种模式,常见的模式包括命令模式,编辑模式,命令模式等,这个也是和其他编辑器一个很不相同的地方,下面会介绍到。可能有些已经有其他编辑器习惯的人有点不太习惯的地方,但是如果将模式熟悉了就可以发现在不同的模式之间切换是很平常的事情,而且带来的好处是更少的按键和更快的输入。
有时候,懒惰是件好事。
Tools,no policy!
UNIX程序设计的思想是提供给用户“工具”,而不限制用户制定“策略”(Tools,no policy!)。这是一个重要的尊重用户的作法,同时也是极其智慧的选择。
Unix工具箱哲学:“把任务分解成一小块一小块完成,工具专注于各自的领域,并可以组合使用。”
前面提到了用VIM+LaTeX的组合:使用VIM编辑LaTeX的源文件,然后用LaTeX进行排版。VIM在编辑器里是最好的,但是它不提供排版的功能,而LaTeX除了排版什么也干不了,神奇就神奇在它们居然能无缝连接,互相调用,各司其职。同样,Unix下的程序员也都是一套组合行头:VIM+GCC+GDB.
这样的设计思想恰恰契合了老子的哲学:道生一,一生二,二生三,三生万物!
订阅:
博文 (Atom)
