成为高手很容易.刚开始我在Vi阵营,偶尔用Emacs还忘记"退出"的快捷键,但一年后我跨入高手行列.
很多文章都是强调 Emacs 有多牛,以激发你的兴趣.最有名是王垠的Emacs 是一种信仰!世界最强编辑器介绍.
但关于"如何做"则语焉不详,即使涉及到"如何做",谈细节多而方法论少,所以本文就是侧重方法论.
全文结构如下:
简单谈谈,因为我本文的重点是"怎么做",而不是"为什么".
一旦你尝过最好的,你自然了解好的编辑器应该有哪些功能.
比如一个内嵌的插件管理器是最基本的.
又比如下载了第三方插件,如果发觉其有问题,可以在不碰该插件原始代码的情况下修复.
如果下载第三方插件的服务器的关闭了,应该可以在自带的U盘上快速建立镜像服务器.
目前流行的编辑器如Sublime Text还做不到以上几点.
Emacs 用 Lisp 开发,Lisp 的不同寻常的语法决定了其开发者都是资深开发者,掌握了多门语言.
Lisp 并不能给你带来任何好处,这就决定了其社区成员都是纯粹的技术人员,投机取巧的功利主义者对其没有兴趣.
IDE通常针对特定语言或框架优化,而Emacs完成通用任务更有效率.
例如,我做开发时碰到难题,需要实时上 IRC 请教国外高手 (工作流包括粘贴我的代码到http://gist.github.com,在 irc 提问,看网页,将解决方案粘贴回来),Emacs 集成了 IRC 工具和浏览器 (w3m),操作就很方便.
我使用 Visual Studio 多年了,Firefox 使用我也是高手,相信我,大多数情况下还是 Emacs 更快.
当然口说无凭,请看高手操作的 youtube 视频, Emacs Power: Can your editor do THIS!
顺便说一下,很多初学者关心的代码自动完成,我可以几门主流语言支持都很不错(包括java).
个人会丧失开发兴趣,公司会倒闭.但是自由软件基金会将一直存在下去.Emacs 作为其招牌软件也会一直维护下去,我的投资永不会贬值.
软件是开源的,配置是纯文本,而且软件的资源消耗较小,安装包很小 (命令行版本的安装包 30M 左右),所以在任何环境下我都可以用 Emacs 开始工作.
这在大项目中特别明显,例如,某项目我需要同时编辑 perl、java、C、bash、SQL,需要远程编辑在美国服务器上的代码,网速也快.Emacs 的优势就体现出来了.
我没说一年内必须什么事都不干专门学 Emacs, 我最反对没有短期回报的悬梁刺股式学习方法.
我利用一年中通勤时间就取得了很大进步,自信到可以写下本文.
最重要是保持头脑开放,不要先入为主.
以我为例,
在开始教程前,我需要解释后文将会用到的命名惯例,
以下是我的建议,
这个阶段的目的是:
打开 Emacs 后,同时按下 Alt 和 X 健,输入 help-with-tutorial(后文中,类似快捷键以简写 `M-x help-with-tutorial` 代替),回车.
仅需半小时.关于 Emacs 的多难学的谬论可以休矣,因为半小时的代价微不足道.想想你去年有多少小时白白虚度了吧.
这步是必须的,不要跳过!
最起码要知道以下命令,
如果微小的努力能得到巨大回报,你会越学越有乐趣,进入一个感情上的正反馈.
长期来说,在任何领域要成为高手,兴趣是最重要的.
以我为例,我急需 GTD 的工具,而 Emacs 的 org-mode 是世界上最好的(没有之一). 用 org-mode 大大节省了时间后,我对于 Emacs 爱屋及乌,兴趣高涨了 100 倍.
反面例子是很多人以啃Lisp教程开始他们的Emacs之旅,坚持下来的人寥寥无几.
这方面过去的我是个负面榜样.一开始我还是抱着玩的心态,到处找有趣的配置粘贴到我的 .emacs 中去.
这是浪费时间!
我应一开始就照抄 世界级大师 Steve Purcell 的Emacs 配置.
警告,Purcell 总爱试用最新的 Web 开发的新技术,对他而言稳定性不是第一位的,如果你有足够的热情和能力,愿意和他一起折腾,那么你的 Emacs 水平会提高得很快
这个如果是很重要的前提,当我上了 Purcell 的贼船时,我已有 10 年开发经验,精通多种开发语言.
如果你不愿意过于折腾,那么你至少不要重复我的错误,你不要质疑,你不要创新,你要跟着高手做.比如 Eric Schulte 的 Emacs-starter-kit 很适合初学者.Bozhidar Batsov 的配置 也不错 (不一定适合初学者).也可以用我的配置.
直说了把,你是初学者,开始阶段应以学习模仿为主.这点怎么强调也不过分!
为了加深印象,让我再举一个例子.有人向我反映,Emacs 快捷键太多,背起来压力很大.我的建议是,拿高手配置来用,而不是强加给自己背快捷键这样无聊的任务.你会发觉高手已安装了名为smex 的插件,使得直接输入命令比用快捷键还快.
如果你还没有信服的话,请再考虑一下我的理由:
要像武侠小说里那样拜高手为师是白日做梦.唯一能让高手指点你的办法是先付出.最可靠的付出就是给高手报bug.
我就是这样学到一些高级Lisp编程技巧的.
不要有报告bug低级的想法.很多高手都是乐于而且善于报告bug的.到是菜鸟喜欢重新发明轮子.
帮助高手,你的起点就高,还有得到高手指点的好处.
前提是起点要高,要在高手已有的工作上继续改善.即使是微小的改善,如果坚持一段时间,就是巨大的进步了,然后你可以在这一点上笑傲江湖.
然后找出另一点高手需要改善的地方,使用同样的方法.
例如,默认的Emacs移动子窗口焦点不是很方便.你需要按"C-x O"多次.我找到了emacs插件switch-window,只要按"C-x O"一次,会有提示子窗口编号,接下来只要输入子窗口编号就可以了.但是还是有改善空间,我又找到了window-number.el,只要按"M-NUM"就可以了.
window-number.el已很完美,但是我又想到了Alt键还是有点慢,我结合evil和evil-leader,我可以按逗号和数字就可以切换子窗口了.
如果要充分利用社区,最重要的是专一.
例如在Quora.com上有很多有趣的话题.我会克制自己的兴趣,不去定阅和Emacs无关的话题.
Google Plus 的 Emacs 社区 在此时Geek 的气场非常强,讨论的贴子质量非常高.我上过很多大众和小众的 Emacs 社区,这是我的经验之谈.例如,我加入了 Linkedin 和 Facebook 的 Emacs 社区,目前都退出了.并不是这些社区不够专业,只是 Google Plus 讨论问题的技术层次比较高.
如果你只能加入一个网络社区的话,那么就是 Google Plus 了.
GitHub 的版本控制服务很好.现在它的社区化倾向越来越强了,我喜欢.
例如,可以看一下 https://github.com/search?p=1&q=stars%3A%3E20+extension%3Ael+language%3Aelisp&ref=searchresults&type=Repositories 上最酷的 Emacs 插件.
最好的是Planet Emacsen,多个Emacs博客的集合.
我偏爱的是"列举Emacs中最有用的命令"之类的具体问题.很多回答拓宽了我的眼界.即使我已相当精通Emacs.
那种"如何掌握Emacs"的问题,人人都能插上一脚.即使有些高水平的的回答,也淹没在众多平庸的回答中.
即使你的问题是比较泛泛而谈的,从一个能够测量的水准的具体问题入手找到高手,然后看高手是如何回答那些比较泛泛而谈的问题的.
twitter 人多,更新结果快.之所以加上":en"是因为有很多日文内容,我不懂日文.
google "emacs-related-keywords site:stackoverflow.com"
我会定期搜索,同样的帖子反复精读.因为 stackoverflow 上的讨论质量很高.
例如,我就是看了 Google Tech Talks 上这个 Org-mode 作者的介绍 而爱上 org-mode.
注意,Youtube 搜索的结果是最佳匹配的.问题是关于 Emacs 的视频并不太多,如果按照 Youtube 的算法,我每次搜索看到的总是那几个录像.所以如果关注重点是看看 Emacs 社区有些什么新东西的话,默认搜索结果应以时间排序.
EmacsWiki 是一个社区维护的 Emacs 文档,可以认为是最酷插件和最佳实践的集合点.
有人抱怨EmacsWiki文档太乱了,质量也参差不齐.对于前者我也有同感.对于后者我不赞同.EmacsWiki的文档质量相当高,因其是唯一由社区维护的半官方的文档.耐心忍受其乱中有序的现状吧.
读EmacsWiki的最佳方法是,选定一个特定主题,从头读到尾.这样你对特定主题的最新进展都了解了.是否要采用EmacsWiki的建议另当别论.
Xah Lee 提供 付费 Emacs Lisp 教程 也相当不错.
他的Emergency Elisp不错,很简洁.我特别喜欢"Statements"一章.
不要低估长期管理的累积效应.
正面例子参考Steve Purcell的配置. 2000年开始14年的维护! 8年github记录! 1000多颗星星的配置决不是浪得虚名.
我经常看到有人在网上悲伤地抱怨说因为重装电脑,几年积攒的emacs配置都丢失了.也有人自豪地宣称把自己的.emacs主动干掉,为的是弄一个组织的更好的配置.
你的技巧是成指数增长的,知识积累的越多,这些知识之间的联系就会越多.这些联系增长的速度是以指数的方式增长的.把你emacs配置从头来过,意味着你的积累的知识书面记录丢失了.损失是很大的.
所以我建议决不要丢弃你的Emacs配置.
这也是后文我谈到的为什么要用工具保存emacs配置和相关知识.
我的配置见 https://github.com/redguardtoo/emacs.d.
版本控制可以是认为一个集中式的知识管理,任何时刻任何地点对 Emacs 配置的修改都要及时上传和合并 (merge).这点对于个人能力的长期积累很重要.
共享Emacs实际也是一种利己的行为,有很多人使用我的配置,等于帮我测试.
我将所有 Emacs 相关资讯都放在 dropbox 的服务器上,这样资料就同步到我的智能手机和我的平板电脑上,我可以充分利用空闲时间学习.
请 点击这里注册 dropbox 帐号.注意,dropbox 客户端完全可以在国内使用,虽然访问其首页可能有点问题.
我还写了许多博客文章.这些文章都存在org格式的文件中.最后发布的静态博客也纳入版本控制,参见http://github.com/redguardtoo/blog.binchen.org.
Emacs第三方插件很多.初学者的问题是装了太多插件,插件的管理成了问题.
我建议一开始选择插件的原则应该少而精,被最优秀的插件培养出了品味后,可自由挑选适合的插件.
我推荐插件标准如下:
所有插件都可以通过Emacs的包管理器下载.
以下是插件清单:
名称 | 说明 | 同类插件 |
---|---|---|
Evil | 将 Emacs 变为 vi | viper |
org | org-mode,全能的 note 工具 | 没有 |
company-mode | 自动完成输入,支持各种语言和后端 | auto-complete |
expand-region | 按快捷键选中当前文本,可以将选择区域扩展或者收缩 | 不知道 |
smex | 让输入 M-x command 变得飞快 | 没有 |
yasnippet | 强大的文本模板输入工具 | 不知道 |
flymake-xxxx | 以 flymake 开头的所有包,针对不同语言做语法检查 | flycheck |
helm | 选择和自动完成的框架,在其上有很多插件完成具体功能 | ido |
ido | 和 helm 类似,我是 helm 和 ido 同时用 | helm |
js2-mode | javascript 的 major-mode,自带 javascript 语法解释器 | js-mode |
w3m | Emacs 的网络浏览器(需安装命令行工具w3m) | Eww |
elnode | elisp 写的 Web 服务器 | 不知道 |
smartparens | 自动输入需要成对输入的字符如右括号之类的字符 | autopair |
window-numbering.el | 跳转到不同的子窗口 | switch-window.el |
web-mode | 支持各种 HTML 文件 | nxml-mode, html-mode |
意思是说,Emacs牛人其他方面也很牛.你如能举一反三,收获会很多.
例如,Sacha Chua 就是这样一个有牛人气质的女孩,这是她的Youtube 录像. 她学习 Emacs 的方式是让 Emacs 自动将手册语音合成,这样她在房间里走来走去的时候也可以听文档了.
我现在有意识地整理高手名单,观察高手*除了Emacs外*用什么工具.
例如, js2-mode 的维护者Masafumi Oyamada(网名mooz)也开发了keysnail和percol. 特别使percol,使我命令行操作效率提高了10倍.
这个阶段可以称之为心中有剑,手中无剑.是否使用Emacs不重要了,我可以随心所欲使用合适的工具.例如,很多人争论哪个编辑器自带的文件管理较好.我从mooz那样的高手学到终级方案后,对这些争论就跳出五行外,不在三界中了.
到https://github.com/redguardtoo/emacs.d 参考"Install stable version in easiest way"一节.
你只要知道会点击下载两个zip文件就可以了,不需要git的任何知识.
除了 README 外没有,我主要是通过看 EmacsWiki 和源代码来了解.一个窍门是通常主源代码文件的头部有使用指南.
那么你可以用 我的配置:
注意,Purcell 是顶尖的 Web 开发者,他会试用各种最新的 Web 开发技术,如果你用了我的配置,Web 开发插件更新会滞后一段时间.另外我的开发工具链和 Purcell 的不完全一致.你自己权衡了.
目前的最新的稳定版是Emacs 24.3.1,建议不要实用高于这个版本的Emacs.通常你不用担心版本号的问题.主流的Linux发行版会帮你处理这个问题.
嘿嘿,我也是 Vi 精通后转到 Emacs 的.我转换阵营的原因就是因为 Emacs 的强大 (例如和 gdb 的完美结合) 以及其脚本语言是 lisp.
当然 Vi 的多模式编辑和快捷键比 Emacs 要高效得多,所以最佳方案是 Vi 的快捷键加上 Emacs 的强大.
目前我在用 Evil, 在 Emacs 下模拟 Vim 操作,结合了两者的优点.简单地说,现在我的运行模式"神用编辑器之神 ".
警告,Steve Purcell 和我默认都启用了 Vim 的快捷键,如果你不习惯的话,可以打开 ~/.emacs.d/init.el,将其中相应的一行注释掉,具体注释哪一行请参考 README.
Emacs 的快捷键是经过几十年考验相当高效的,我建议你在未成为高手前还是学习 Emacs 的默认快捷键.
如果一定要在 Emacs 下用 Windows 快捷键的,可以考虑 ergoemacs.
没有必要记,我也只记住常用的十几个快捷键.顺其自然,常用的自然会记住,不用了会忘掉,这很正常.
目前很多高手在用 Smex,可以飞快输入命令,快捷键实际上不需要了.
不要改! 参考上文 站在巨人的肩膀上 一章,你觉得奇怪可能是因为缺乏经验,把某些特性误认为是 bug.请坚持至少一年.
例如,有人向我反映,在编辑任何文本的时候,会发觉右边约第 80 列处总有一竖线,希望能去掉.这实际上是一特性,提醒你每一行不要宽度不要超过第 80 列.这里是每行不要超过 80 列的原因.
我建议你学习 Emacs 的第一年的原则应是,理解而不判断.
删除 home 目录下的 .emacs、~/.emacs.d/init.el 就是取代原来的 .emacs.
例如,问:在 .emacs.d 中的 init.el 文件起什么作用?答:google "emacswiki init.el".
首先确认你已装上了 你需要的 第三方命令行工具,这些工具是可选的,清单见 我的.emacs.d的README.
如果排除了以上原因. 重新启动 emacs,带上 "–debug-init" 参数,然后将显示的错误信息及环境报告到你所用的.emacs.d对应的开发者# .
报告 bug 应该给出细节.例如很多读者给我的 bug 都是由于第三方插件版本较新引起的,我拿到版本号后,才能下载特定版本的插件以重现 bug.否则只能靠猜,来回邮件会浪费读者很多时间.
那么你就是走我后悔莫及的老路,一个人在黑暗中摸索.开头兴致很高,但现实是残酷的,碰到复杂问题解决不了.于是逃避,借口Emacs太复杂,放弃了.
我最终醒悟过来,走上光明大道,很多走上岐路的人恐怕就没这个觉悟和毅力了.
希望自己掌控坦率地说是一个非技术问题,因为没有自信心,所以有一种补偿心态. 希望通过一种错误的方式来证明自己.结局无非是恶性循环.
正确地方法是放下身段至少一年 (我已反复强调这一点),打好基本功,读书,虚心地向高手学习.
Emacs 是个开放平台,其众多插件 release 之前并不一定有严格的测试.所以插件之间可能有冲突.
这也是我为什么建议初学者直接使用牛人配置的原因,因为牛人已经解决了众多兼容性的问题,你只要直接享受他的服务就行了.
即使你发觉了牛人尚未来得及处理的 bug,最有效的方法是提交 bug 报告给牛人,而不是自己去钻研 elisp.
需要对基本的命令行操作有一定的熟悉.关键知识点有两个:
如果你不知道如何在 Windows 下添加修改环境变量,不知道如何安装第三方工具,建议还是先用 cygwin 中的 Emacs,因为 cygwin 已自带某些工具,没有的话,安装也和方便.且在 cygwin 下环境变量 HOME 默认已有.
第三方命令行工具清单请参考上文 我的.emacs.d 中的 README(Steve Purcell 没有列出这些工具,因他只用 OS X).
这个差距说到底是后端语法解析引擎的问题.坦率地说通常人们问我这个问题都是以微软的 Visual Studio 和 Eclipse 作为参照对象的.
就 C++ 来说目前有使用苹果公司的 clang 的方案,效果还不错.就 Java 来说,有使用 eclipse 做为后端引擎的方案.具体使用什么 Emacs 插件来调用这些引擎有很多选择,不展开了.
实战中,我通常就是使用ctags作为后端引擎,因其所有语言通吃. 虽然解析效果差一点,但是通过恰当的命名规范,对效率没有什么影响.
如果ctags已不能满足你的需求,你可以考虑用Gnu Global (gtags).
以上讨论的都是后端引擎.
就前端界面来说,做的比较好的是company-mode,维护也很活跃,你可以就特定语言如何配置company-mode咨询其开发者.
强烈建议使用Keysnail.
这是最佳的,我已试用过*所有*可选项.
我用Gnus.但是有很多其他方案.
如你必须访问Microsoft Exchange Servers, 用Davmail.
用了Davmail后, 还可以用Popfile 来分捡邮件. Davmail+Popfile让我生活在天堂,如果你在那种每天要收到几百电邮的公司工作,你就懂我的意思了.
请启动 Emacs 后,运行 `M-x package-refresh-contents` 以从服务器更新最新的软件索引,然后重启 Emacs 即可.
如果你没有使用 Emacs 24,并且没有完全拷贝高手的配置 (这是本文的中心思想),那么你需要安装配置 package.el,细节请参考 这里.
Emacs 下载软件包 (package) 是通过 http 方式,所以如果网络出问题的话你需要用 http 代理服务器,具体操作见后文.
在命令行中启动 Emacs 时加上 "http_proxy=your-proxy-server-ip:port" 前缀.
例如,
http_proxy=http://127.0.0.1:8000 emacs -nw
那么就只能使用我的Emacs配置.
和我的配置配套的是我建立的独立的第三方包服务,请参考其主页上的README设置.
否,只会起阻碍作用!
Lisp语法和通常的语言不同,除非有相当编程经验(至少10年),一般人都会对其有语法有一点点负面情绪(当然是毫无道理的偏见).我的意见是学习任何新东西,长期来说兴趣是最重要的.一开始应避免任何负面情绪.
Emacs Lisp又是一种只用于Emacs的语言,有大量的Emacs相关的术语需要掌握.如"Buffer","Yank","font face",这些术语只有资深用户才能理解.
所以在Emacs没有相当基础前学习Emacs Lisp是浪费时间.
参考前文关于找到切入点的一节,我推荐的学习 Lisp 的顺序是,先使用优秀的配置享受到好处,有了兴趣后学习 Emacs Lisp 就水到渠成了.
否.但 Emacs Lisp 是很强大的语言,其特点是一切皆可修改.当我说"一切"的时候,我就是指字面意义上的"一切",并不是修辞上的夸张.
我用过许多编辑器,除了 Emacs 外,没有一个能做到"一切都可修改"这点 .vi 也不行.
所以学点 Lisp 对于你提高 Emacs 的使用水平没什么坏处.另外 Lisp 是种不错的语言,如果你的职业是 IT 的话,Lisp 值得一学.
顺便说一下,Lisp 是种很容易的学的语言,比 VB 容易多了,一旦你适应其语法后,就会发觉它其实对程序员蛮友好的,至少少打很多字.
没必要,Lisp足够了.
关键是你打算用 Emacs 这个强大的瑞士军刀做什么.
我在前文中已经强调过以兴趣和解决实际问题作为切入点.
再举一些我自己的例子说明:
Org-mode简明手册 是不错的中文教程.
我认为最好的英文入门教程是Carsten Dominik(org-mode发明者)在google tech talks上的演讲.其要点为org-mode本质是一个文本文件,你只要记住按TAB展开或者缩进条目就可以了.其他高级特性可以慢慢学.
我很欣赏这个理念.但是不要走火入魔.Emacs本质是个平台,给Geek们提供了无限的可能性.
从实用角度讲,Emacs和其他工具结合有时能更快完成工作(不过菜鸟在没有一年的修炼之前千万不要猜Emacs*不能*做什么).
以下是我认为不一定Emacs能够吃独食的地方:
重点是头脑灵活,坚信Emacs无所不能的同时也要适当变通一下.
这是我的 Twitter 和 Google Plus 以及 微博,也可以通过我的 email
我的主力博客为 http://blog.binchen.org.
我不会回答配置的具体问题,因为如果你通读本文,应该知道哪里找答案更好.
在本文结束时,我再强调一下本文最重要的观点.
要点是:
关键是你以严肃的态度把其当作专业技能学习.
很多人之所以不赞同我的核心观点,是因为在他们的内心深处还是有把Emacs用来炫耀"我有多酷"的意识.
Emacs当然很强大,可以作为一种另类娱乐工具来博眼球.但是它的本质是为专业人士使用的神器.
让我打个比方,职业杀手对于杀人的刀只关心两件事:
刀的装饰是否漂亮或者用刀技巧是否是自己原创的对职业杀手并不重要.
Emacs就是那把刀.
本文已放在 GitHub 上,网址为 https://github.com/redguardtoo/mastering-emacs-in-one-year-guide.
如果有任何疑问,请在以上网址报 bug.这比 Email 要快.因GitHub会以邮件通知我,GitHub 邮件永远归类至我的最优先文件夹下.
如果直接给我发 Email,就会淹没于垃圾邮件中.
Emacs 本质上是一个社区和平台,不断有新的有趣的人和技术出现.我会定期更新本文.
如果你只是拷贝粘帖全文,会使你自己和他人错过更新.
我建议你最好分享本文的链接,