我曾一直是一个 Emacs 的信徒,认为虽然这世上还有 VIM 这样可以和 Emacs 匹敌的存在,但却没有能够超越 Emacs 的东西。用 Emacs 近两年半,我现在觉得可能自己之前还是颇有些无知与盲目的。狂热与崇拜遮蔽了了外面的世界。即使看到了外头,也会被内心找出理由挑出刺来。 所以容我在这里大言不惭说说 Emacs 的一些是非。
Emacs 的图形前端很不现代,可能和 Emacs 不会放弃对终端的支持有关。
也许是我孤陋寡闻,反正就我所知,Emacs 中一个简单的 popup 都需要靠 overlay-put
来实现,然而依靠这种机制,经常产生冲突,要是可以引入一种图层机制倒是不错。至少提供更多的默认控件之类的东西,插件写起来也轻松一些。要是能有浏览器引擎来做前端就更好了。CSS就排版来说,其实很伟大。
再说说 Emacs 对语言的支持。写 Lisp 尤其是 Emacs-Lisp 体验非常棒,结合 ParEdit、el-doc 等插件,加上原生的函数文档查询,写起来非常舒服。(顺带一提,LightTable 是支持 Paredit 的)写 Javascript 也不错,js2-mode/js3-mode 用起来非常顺手。但 Emacs 对语言的支持在大多数情况下,好像都只是文本层面的支持,是不会去做 AST 解析的。说穿了,其实也就是不够智能。好多自动补全,都只是填文本而已,其实连 Emacs 自己都不知道自己在做的是什么,有时候自动补全出来的东西也不是很妥当。
Emacs-Lisp 自身也很慢。以及好后来才有了词法作用域。但是好多包用的都是动态作用域。其实有时候想,要是 Emacs 用的是 Scheme 就好了。还有久久未能解决的多线程问题,开个 ELPA 整个 Emacs 就直接卡死了。Tramp 也很慢。当然这个其实和 Emacs 试图包容一切有关系吧。要是减少使用 Emacs-Lisp 写的部分,而引入更多 C/C++ 成分,然后用异步的话(就像 Node.JS的网络那样)不说解决,我觉得至少这些问题都会大大缓解吧。
然后 Emacs 的包相当零散,很多时候都需要自己再好好组一组,磨一磨才能够足够好用。整体虽然有 Emacs 自身的哲学在,但是缺少一种强有力的约束、规范使得各个包的体验足够一致。这一点上似乎 IDE 会做的很好一些。
在过去很长的一段时间里,我一直在黑 Windows、黑 Java、黑很多东西。
有时候其实是缺少自信,需要通过黑其他东西,告诉别人,其实是告诉自己,让自己相信自己的选择是正确的。但我对它们的了解其实还是远远不够,很多时候,只是在人云亦云,只是在引述所谓权威之言。曾在网上看到一个判断黑东西是否客观的方法,大意如下:是先黑一样东西,然后再补上理由,还是先发现一些东西不妥,然后再黑。
使用 Emacs 让我学到了许多东西,我不会为我花再它上面的时间而感到后悔,但我希望我能看到更广阔的世界。没了偏见,才能看到更多吧。缩在一个小地方,其实是看不见整个世界的。