前言

是什么

GNU Emacs(为了简化,后面用Emacs指代GNU Emacs。)的官方对其定义是这样的:

An extensible, customizable, free/libre text editor — and more.
At its core is an interpreter for Emacs Lisp, a dialect of the Lisp programming language with extensions to support text editing.

几个关键词是可扩展、可定制、自由、文本编辑器、Emacs Lisp。

  • 可扩展、可定制
    这表示你可以根据自己的需要,而不必拘泥于现存的定义来满足自己的需求。对于已有的功能可以进行修改,对于没有的功能可以自己做出扩展。
    Emacs被称为“神的编辑器”,其中所蕴含的意义之一就是它提供了足够强大的扩展能力,使用者越强,它就能提供更大的支撑。想要见识神器的威力吗?那么你自己要先成神^_^。
  • 自由
    代码开源,权利自由。你几乎可以根据自己的任意需求对它进行处理。真正的自由。实际上,Emacs是GNU软件的代表性作品;相对于现在流行的版权(Copyright),GNU提出了Copyleft
  • 文本编辑器
    Emacs是个文本编辑器,但用的多了你却会发现,它更像一个操作系统。所以拿Emacs跟Vim比在某种程度上来说是不适合的,因为Vim充其量只是Emacs的一部分。用过evil(Emacs中用于模仿vim指法的插件)的人绝对不会纠结这件事。
    《Writing Gnu Emacs Extensions》的前言中说:“这个关于编辑器的定义几乎涵盖了所有交互程序的范畴,而这绝非偶然。交互程序总是用来处理某种数据的编辑器。因此可以说,Emacs在广义上,是一种交互程序的生成器。”可以这么说,只要是数据处理相关的功能,用Emacs都能做出一个高效率的实现出来。比如邮件(Gnus、mu4e、mew等等),git(magit),浏览器(w3m、eww等),shell(eshell)等等,都有良好的表现。
  • Emacs Lisp
    elisp是Emacs的扩展脚本,除了最底层的c代码,整个Emacs都是用elisp搭成的,不管是emacs的基础功能模块还是hackers们实现的各种各样的第三方插件。下面会有章节专门讲这门语言。
    Emacs是文本编辑器,所以理论上只要是有文本编辑需求的人都可以用它;但是要想真正的触碰到它的强大的扩展能力就需要用户理解elisp。也就是说,它实际上是面向程序员的编辑器。否则,用户就会毫无疑问的缠绕在琐碎的、不知所谓的快捷键记忆、奇奇怪怪的古老功能设定里;这样的话,与其花时间在这上面还不如去用现在市面上流行的付费软件去。

不是什么

Emacs虽然很强大,但是也不要对它抱有不切实际的期望。

  1. Emacs对网络编程的支持不怎么样。它缺少一个好的支持javascript的浏览器。当然目前看起来,是不为也,非不能也
  2. Emacs毕竟本质上是一个文本编辑器,它对于图像的支持很差。
  3. elisp的效率比较差,所以不要试图用它做出什么高效率的应用。实际上,在很多实际问题的解决中,elisp编写的插件本身只是作为一个与用户交互的前端出现,而实际的功能都是由其他语言编写的后端提供。例如语言的补全插件company就是这种类型插件的代表。

当然了,一个文本编辑器有这些缺点也不是什么丢脸的事,毕竟这已经超出一个编辑器应有的本分了^_^。

为什么

虽然Emacs很强大,但是如果花费了很多时间(实际上也确实需要花费很多时间调教它),最终得到的回报跟用别的IDE、编辑器比并差不了多少,那不是很赔的一件事吗?所以我们必须要解决为什么的问题。

稳定高效

一年成为Emacs高手(像神一样使用编辑器)这篇文章里,作者打了这么一个比方:
“打个比方,职业杀手对于刀只关心两件事:
高效地杀人
任何环境下都可靠
刀的装饰是否漂亮或技巧是否自己原创对他并不重要.
Emacs就是那把刀.”

Emacs毫无疑问具有稳定可靠的特性,至少我的Emacs从来没有自己crash过;而Emacs的跨平台特性,让它在几乎所有流行的平台下(linux/MacOS/Windows/Android,GUI桌面系统以及控制台下)都表现稳定。Emacs当得起“重剑无锋,大巧不工”几个字。
而且,Emacs作为开源软件将会一直流传下去(1975年至今),而其他商用软件则有可能停止维护。从这方面说Emacs也比其他商用软件具有优势。

自由

可以说,Emacs是我用过的最自由的一个软件了。它跟大多数现行的软件的设计理念完全不同。现在的软件追求的是量产化,即全部用户的用户体验是相似的,这样才能量产,才能传播开来。为了达到这个目的,就产生了一些产品经理之类的职位,他们会去学习一些用户体验之类的知识,以求达到更好的用户体验之类的目标。比如各种语言的IDE,你需要去学习某个公司设计的IDE相关的各种跳转、重构之类的工具,所以最终的结果与其说人驯化了工具,不如说工具驯化了人(当然这也不一定是坏事;毕竟设计这个工具的人一般都是领域的专业人员,学习他们的操作习惯也不是一件坏事)。用户一般最大的自由就是自定义有限的一些快捷键,仅此而已。
Emacs的准则则不同。每个人的Emacs都可以是不同的。用户掌握着自由修改定制软件的权力,按照自己的意愿,没有任何强迫的存在。如果你自己做出了一个好用的轮子,那么可以把它贡献出来;别的用户如果觉得它好用,那么可以自由的拿这个轮子来做车,任意修改,几乎没有任何限制。这种自由是我喜欢Emacs的原因之一。
上面曾经说过,Emacs对于杀手来说就是一把稳定高效的刀;但以我看来,它与用户的关系更像是魔法师与法杖。在SICP中,两位老师曾经说过“计算机科学这个词并不能准确描述我们所从事的学科,因为这门学科既不是关于计算机制造、使用,也不是一门科学,事实上,它更多的是一门工程学或者艺术,并且更多的类似于我们所认知的魔法。”如果把程序员比作魔法师,编码比作魔法咒语的话,那么毫无疑问的Emacs就是那根法杖–只是更幸运的是,这根法杖具有能够进化的能力。法师随着自身的需求去改进法杖,而法杖反过来又使法师更加的强大。最终,每个法师的法杖实际上成了自己的一部分,并且是独一无二的。也许你会发现别人的法杖跟你的有点像,但是两把法杖与主人的契合度是完全不同的。很难想到这个世界上还有其他职业的人也有这种幸运。

1 + 1 > 2

Emacs有着令人惊叹的学习曲线。你需要花费很多很多时间去打磨它,因此假如与其他IDE等编程环境作对比的话,那么在一开始的一段时间,Emacs是完败的。但是假如用户需要编写多种语言,包括写文章、写博客这些文本处理,那么随着时间的延长,Emacs会逐渐赶上来然后超越。为什么呢?因为随着时间的前进,用户与编辑器的契合度越来越高;当有新的编写需求的时候,用户会以之前的操作习惯去添加新的配置。因此,不管编写的对象如何变,最后的操作习惯却是自己习惯的那一套。可以说,越早学之后的受益就越大。而假如不用Emacs,而是每编写一门新语言就用一个新的IDE的话,那么学习成本一直不会下降;而且如果这些IDE的开发公司还不是一个的话,那么用户还要因为操作习惯的不同而更加难过。
而且不止如此。当所有的工具都在同一个环境里的时候,工具之间的合作会极大的提高效率。比如在编写python脚本的时候,Emacs内置的eshell会使代码的编写和调试变得无缝;比如在用org mode写文章的时候,可以方便的对文件系统里的文件进行引用。能用Emacs完成的事情越多,切出Emacs的次数越少,这种切换成本的节省就越来越大。

除此之外

Emacs是一个强大的知识信息处理工具,写程序只是它的功能之一。即使有一天不做程序员了,不写代码了,只要还需要学习,还需要码字,Emacs就是一个可以陪伴终生的强力工具。org mode是我见过的对程序员最友好的文章编辑工具,编写文档、博客、读书笔记等全部在行。它简单、强大,支持各种文本格式的导出,而最重要的是,它的存储格式是纯文本。只有纯文本才是最健壮、最稳定的信息存储介质。眼花缭乱的工具只能在人与信息之间隔离太多的墙,而分层越多就越不稳定、越会使人远离本质。简单即是美。但简单不等于简陋,Emacs就是这么一个使人能接近信息本质的的强大工具。

如何

  1. 学好英语。其实不止是Emacs,其它的hack工具都需要程序员本身具有良好的阅读能力,毕竟大部分的技术文章都是英文的。
  2. 学好基础知识,任何知识的延伸都是建立在良好的基础之上的。如果想认真的学好Emacs,一定至少要把Emacs自带的文档的基础部分通读一遍。
  3. 在开始的时候,不要纠结于主题等细枝末节的东西,否则就是本末倒置;虽然Emacs可以做到很多很酷的操作,但是如果那些操作的使用频率很低,也不必在上面浪费时间。
  4. 除了一些基本快捷键之外,其它快捷键都不要记。Emacs传统的快捷键用起来需要脚踏板,而且小指会断。而且我个人推荐用vim的键位。vim作为Emacs里最好用的编辑器应该得到应有的尊重。
  5. 阅读一流用户的配置。任何知识都是在模仿前人的基础上前进的,Emacs也不例外。在能够理解其配置的情况下,再去做自己的配置。

目标

这个教程主要讲一下我用emacs过程中解决问题的方式,以此来为大家带来启发。我希望,在学完之后,读者能够:

  1. 读懂世界一流的配置,例如purcell的配置。
  2. 独力编写维护自己的配置。
  3. Finally, live in Emacs.

开始吧

曾经有人这么盛赞emacs:

当然,他们所有人都使用Emacs。靠,Eric Benson是XEmacs的作者之一。这个世界上所有伟大的工程师都在用Emacs。那种世界因你而不同级别的伟大。不是坐在你旁边的格子里的那哥们那种伟大。也不是Fred,走廊尽头那哥们。我说的是我们这个行业里最伟大的软件开发者,那些能改变这个工业的面貌的人。像James Gosling们(Java语言设计者),Donald Knuth们(这个人没有听说过的话赶紧改行吧,别搞计算机了),Paul Graham们,Jamie Zawinski们,Eric Benson们。真正的工程师用Emacs。你必须很有点聪明才能把Emacs用好,而如果你能成为一个Emacs大师的话它会给你难以置信的牛力。有机会的话你应该站到Paul Nordstrom的肩后看看他是怎么工作的,如果你不相信我的话。对那些一辈子都在用烂Visual .Net之类的集成开发环境的人来说,一定会大开眼界的。

Emacs是那种你可以用100年的编辑器。

我认为并不是特别夸张(实际上深表认同^_^)。实际上接触emacs可以让你接触到的圈子不一样,你会用高手的思维去面对这个程序世界,更加接触到编写代码的本质。最后,以Neal Stephenson的一句著名的话结束前言:

Emacs outshines all other editing software in approximately the same way that the noonday sun does the stars. It is not just bigger and brighter; it simply makes everything else vanish.

所以就像那句老话:“前途是光明的,道路是曲折的”。打好行囊,阔步前行吧。

章节简介

基础

Emacs的一些最基本的概念。

elisp

简单介绍一下elisp。

mode

描述emacs编辑行为的核心概念mode。

开始

配置代码组织以及一些常用的配置。

基础包

有些包是基础包,它们会极大的改变emacs默认的操作方式。

文件访问及管理

Emacs的强大特性之一就是对于文件的查找、操作、管理。

搜索与替换

在工程中搜索、替换是程序员的必要技能。

工作流

分享一下工作流。


License: CC BY-SA 4.0

Contact