作者: 陈斌(redguardtoo)
版本号: 20130801
更新时间:
原创时间:
版权:本文采用以下协议进行授权, 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0,转载请注明作者及出处.
本文已放在github上,网址为https://github.com/redguardtoo/mastering-emacs-in-one-year-guide.
如果有任何疑问,请直接在以上网址给我报bug.这比发Email要快得多.因为你报的任何bug我都会自动收到github的Email,github的Email永远会归类至我的最优先文件夹下.
如果直接给我发Email,就会淹没于垃圾邮件中.
我会长期维护本文.因为Emacs本质上是一个社区和平台,不断有新的有趣的人和技术出现.我会根据社区的最新情况更新本文.
很容易.一年前我还在Vi阵营,偶尔使用Emacs还总是忘记"退出"的快捷键,但是一年后我跨入高手行列.
现在网上很多中文文章都是和你强调Emacs有多牛,以激发你的兴趣.最有名的大概是王垠的Emacs是一种信仰!世界最强编辑器介绍.
这些好文章让你激动,你因此定下来一个伟大崇高的目标(掌握神一样的编辑器Emacs),接下来就是执行了(如何高效地学习Emacs).
国内关于"如何做"的文章不多,那些涉及到"如何做"的文章,涉及细节比较多,而谈一般方法论的较少,所以本文的重点就是谈谈一般方法.
简单谈谈,因为我本文的重点是"怎么做",而不是"为什么".
这里的更多并不是和IDE比支持某编程语言的特性更多,而是指Emacs内可完成的通用任务比较多更快捷.
例如,我做开发时碰到难题,需要实时上IRC请教国外高手(工作流包括粘贴我的代码到pastebin或者gist,在irc内提问,看网页,将解决方案粘贴回来),emacs集成了IRC工具和浏览器(w3m),操作就很方便.
我使用Visual Studio多年了,Firefox使用我也是高手,相信我,大多数情况下还是Emacs更快.
当然口说无凭,请看以下两段高手操作的youtube视频:
个人会丧失开发软件的兴趣,公司会倒闭而停止维护软件.但是自由软件基金会会一直存在下去.Emacs作为其招牌软件也会一直被维护下去,我在该软件上投资的时间和精力也永远不会贬值.
软件是开源的,配置是纯文本,而且软件的资源消耗较小,安装包很小(命令行版本的安装包30M左右),所以在任何环境下我都可以用Emacs开始工作,overhead很小.
这在大项目中特别明显,例如,某项目我需要同时编辑perl,java,C,bash,SQL,需要远程编辑在美国服务器上的代码,网速也不是很快.Emacs的优势就体现出来了.
我没说一年内必须什么事也不干专门学Emacs,悬梁刺股没有短期利益回报的学习方法是我最反对的.
我赞成的方法是,开始阶段花极少的时间得到巨大的回报(如下文谈到的Org-mode),以兴趣做导向.
每天花多少时间取决于个人需要和如何管理,以我为例,每天八小时上班时间中有很多零碎时间可以利用,上下班通勤时间有一个小时可以利用.
长期来说你能取得的成就是由态度决定的.
优秀人士的两个特点:
打开Emacs后,同时按下Alt和X健,输入help-with-tutorial(后文中,类似快捷键以简写`M-x help-with-tutorial`代替),回车.
仅需半小时.关于Emacs的多难学的谬论可以休矣,因为半小时的代价微不足道.想想你去年有多少小时白白虚度了吧.
这步是必须的,不要跳过!
例如,我发觉很多读者的问题是不知道如何查看变量函数的文档,这在官方教程中都有说明.
因为如果微小的努力能得到巨大的回报,你就会越学越有乐趣,进入一个感情上的正反馈.
长期来说,在任何领域要成为高手,兴趣是最重要的.
以我为例,我急需GTD的工具,emacs的而org-mode是世界上最好的GTD工具(没有之一).在使用org-mode大大节省了时间后,对于emacs爱屋及乌,兴趣高涨了100倍.
这方面我是个负面榜样.开始阶段我还是抱着玩的心态,喜欢到处找有趣的配置粘贴到我的.emacs中去.
这是浪费时间!
我应该一开始就照抄大师Steve Purcell的emacs配置(Purcell的af5ca840版本支持Emacs23.1及更高版本,在Linux/OSX/Cygwin下测试过,更高版本只保证支持emacs24,因purcell只在mac下用emacs24版本,如果一定要使用emacs23,可考虑我的版本,网址见后文).
我请求你不要重复我的错误,不要质疑,不要创新,跟着Steve Purcell这样的高手做.
直说了把,你是初学者,开始阶段应以学习模仿为主.这点怎么强调也不过分!
为了加深印象,让我再举一个例子.一些读者向我反映,Emacs快捷键太多,背起来压力很大.实际上这是初学者先入为主的偏见.对高手来说,有了恰当的工具后,快捷键很多情况下并不需要.盲目地去背快捷键只会延迟你成为高手那一刻的到来.如果你只是复制了高手的配置开始使用而不是纠结于完成被快捷键这个无聊的任务,你会发觉高手以安装了名为smex的插件,使得你直接输入命令比用快捷键还快.所以背快捷键也不需要了.
顺便说一下,Steve Purcell的配置需要git才能更新,这意味着你需要安装git和cygwin(限于windows平台).这是买一送二,我又给你介绍了两个高手必备的世界级工具.
考虑到我的热情会被认为是传销,而我的严密逻辑和事实论证可能被忽视,我有必要简单明了地说明推崇Steve Purcell原因:
以上事实在我给出的网址中稍作调查即可得知.
注意:Steve Purcell更新插件比较频繁,不是很稳定,初学者可以考虑用Eric Schulte的Emacs Starter Kit代替.
Google Plus的Emacs社区在此时(
)Geek的气场非常强,讨论的贴子质量非常高.我上过很多大众和小众的Emacs社区,这是我的经验之谈.例如,我加入了Linkedin和Facebook的Emacs社区,目前打算都退出.并不是这些社区不够专业,只是Google Plus讨论问题的技术层次比较高.如果你只能加入一个网络社区的话,那么就是Google plus了.
另外,著名Emacs用户Xah Lee(个人网站为李杀网, 其账号名为ErgoEmacs)每周二会在Google Plus上组织一次Emacs问答.
reddit上有时候一些讨论挺有新意,深度上不及Google+.
由于prism事件暴光,,所以一些Emacs高手为了抗议google泄漏隐私给美国政府的NSA,离开了google+社区,他们可能以后会把主要精力投入reddit的社区,所以reddit可能会在geek的氛围上有所增强.
github的版本控制服务很好.现在它的社区化倾向越来越强了,我喜欢.
例如,可以看一下https://github.com/languages/Emacs%20Lisp上最酷的Emacs插件.
最好的是Planet Emacsen,是多个Emacs博客的集合.
twitter人多,更新结果快.
google "emacs-related-keywords site:stackoverflow.com"
我会定期搜索,同样的帖子反复精读.因为stackoverflow上的讨论质量很高.
每周一次给我邮箱发一次摘要,仅限最佳结果.这样的话信息质量可以得到保证.
例如,我就是看了Google Tech Talks上这个Org-mode作者的介绍而爱上org-mode.
注意,Youtube搜索的结果是最佳匹配的.问题是关于Emacs的视频并不太多,如果按照Youtube的算法,我每次搜索看到的总是那几个录像.所以如果关注重点是看看Emacs社区有些什么新东西的话,默认搜索结果应以时间排序.
我将emacs配置纳入github的版本控制,见https://github.com/redguardtoo/emacs.d.
版本控制可以是认为一个集中式的知识管理,任何时刻任何地点对Emacs配置的修改都要及时上传和合并(merge).这点对于个人能力的长期积累很重要.
我将我收集的所有Emacs相关资讯都放在dropbox的服务器上,然后用dropbox的软件同步资料到我的智能手机和我的IPad上,这样我可以充分利用空闲时间学习.
请点击这里注册dropbox帐号.注意,dropbox客户端完全可以在国内使用,虽然访问其首页可能有点问题.
EmacsWiki是一个社区维护的Emacs文档,可以认为是最酷插件和最佳实践的集合点
关于Emacs Lisp (elisp)书籍,我已读完
我正在读
Xah Lee提供付费Emacs Lisp教程也相当不错.
如果你照着我以上的做法做,就可以认识到Emacs牛人其他也很牛.Emacs实际上体现了牛人的一种生活方式.
像那些牛人一样思考,像那些牛人一样做事,不要怀疑,不要犹豫,很快你就会发觉自己也开始有些牛人的气质了.
例如,Sacha Chua就是这样一个有牛人气质的女孩,这是她的Youtube录像. 她学习Emacs的方式是让Emacs自动将手册语音合成, 这样她在房间里走来走去的时候也可以听文档了.
想想看, 这些用Emacs的人都是什么样的Geek啊!所以,我认为Emacs不仅仅是一种工具,它是个社区,一种文化.
对我而言,加入Emacs社区让我学会了谦卑.当我明白了Emacs的其朴素的设计思想和其强大的可拓展性后,我的感觉是敬畏,因为我做不出这样的软件.
我既没有能力把一个编辑器设计成一个人工智能语言Lisp的平台,也不可能花30多年的时间对一个软件精益求精.
我推荐插件标准如下:
所有插件都可以通过Emacs自带的package manager下载.
以下是插件清单:
名称 | 说明 | 同类插件 |
---|---|---|
evil | 将Emacs变为vi | viper |
org | org-mode,全能的note工具 | 不知道 |
org2blog | 给wordpress写博客 | 不知道 |
company-mode | 自动完成输入,支持各种语言和后端 | cedet, 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语法解释器 | javascript-mode,js-mode,js3-mode |
w3m | Emacs的网络浏览器 | w3 |
elnode | elisp写的Web服务器 | 不知道 |
smartparens | 自动输入需要成对输入的字符如右括号之类的字符 | autopair |
看到这里你应该很清楚了,我的方法就是以兴趣作为切入点,以天才作为榜样,大量阅读,大量练习.
如果你想获得真才实学,想变得更强,变得更优秀,这就是唯一的方法,唯一的捷径.
这个方法不是我发明的,古往今来的杰出人士都是这么做的,如果你需要一点"更科学的"论证,请参考一万小时天才理论.
这是我的twitter和google plus以及微博,也可以通过我的email
我的主力博客为http://blog.binchen.org.
我不会回答Emacs配置的具体问题,因为如果你通读本文,应该知道哪里找答案更好.
除了README外没有,我主要是通过看EmacsWiki和源代码来了解.一个窍门是通常主源代码文件的头部有使用指南.
那么你可以用我的配置:
注意,Purcell是顶尖的Web开发者,他会试用各种最新的Web开发技术,如果你用了我的配置,Web开发插件更新会滞后一段时间.另外我的开发工具链和Purcell的不完全一致.你自己权衡了.
嘿嘿,我也是Vi精通后转到Emacs的.我转换阵营的原因就是因为Emacs的强大(例如和gdb的完美结合)以及其脚本语言是lisp.
当然Vi的多模式编辑和快捷键比Emacs要高效得多,所以最佳方案是Vi的快捷键加上Emacs的强大.
目前我在用evil-mode,在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".
首先确认你已装上了*你需要的*第三方命令行工具,这些工具是可选的,清单见我的README.
如果排除了以上原因.重新启动emacs,带上"–debug-init"参数,然后将显示的错误信息及环境报告牛人,给我也行.报告bug的方式最好是用github的bug跟踪系统.
报告bug应该给出所有细节.例如很多读者给我的bug都是由于第三方插件版本较新引起的,我拿到版本号后,才能下载特定版本的插件以重现bug.否则基本是无从下手,只能靠猜,来回邮件会浪费你很多时间.
那么你就是走我后悔莫及的老路,一个人在黑暗中摸索.开头兴致很高,但现实是残酷的,碰到复杂问题解决不了.于是选择逃避,最好的借口是Emacs太复杂,放弃Emacs.
我最终醒悟过来,走上了光明大道,很多走上岐路的人恐怕就没有这个觉悟和毅力了.
希望自己掌控坦率地说是一个非技术问题,因为没有自信心,所以有一种补偿心里.希望通过一种错误的方式来证明自己.结局无非是恶性循环.
正确地方法是放下身段至少一年(我已反复强调这一点),打好基本功,读书,虚心地向高手学习.
让我举一个例子说明:有一个读者向我反映他用了purcell的配置,但是Lisp的环境花了三天时间也搞不定.虽然我对除Elisp以外的其他Lisp方言毫无经验,还是花了15分钟帮他解决了这个问题.解决方法很简单,就是指定一下用哪个Lisp解释器.
解决该问题需要的基本功很简单:
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或者etags作为后端引擎,因其所有语言通吃.虽然解析效果差一点,但是通过我遵循恰当的命名规范,对编程效率没有什么影响.
使用ctags或者etags还可以帮助菜鸟程序员改掉一个很严重的毛病.菜鸟因为缺乏自信心和经验,所以变量和函数名的命名通常都过于通用,给自己是架构师在写一个大型的通用Framework的幻觉.这对于真实的产品研发来说是一个很严重的问题,想象你要修改某个接口的所有调用,定义,文档和测试案例,并且这个接口在多个语言中都有使用.这个接口如果有一个通用的名字如list,是会把维护人员气死的(我曾经碰到过一朵奇葩,他还有喜把变量名和函数名叫完全一样名字的"好习惯").叫ListMySpecificService则好的多.使用ctags/etags这类比较弱的解析引擎就会逼你起一个不那么普通的名字.
请启动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 Lisp是很强大的语言,其特点是一切皆可修改.当我说"一切"的时候,我就是指字面意义上的"一切",并不是修辞上的夸张.
我用过许多编辑器,除了Emacs外,没有一个能做到"一切都可修改"这点.vi也不行.
所以学点Lisp对于你提高Emacs的使用水平没什么坏处.另外Lisp是种不错的语言,如果你的职业是IT的话,Lisp值得一学.
顺便说一下,Lisp是中很容易的学的语言,比VB容易多了,一旦你适应其语法后,就会发觉它其实对程序员蛮友好的,至少少打很多字.
否,只会起阻碍作用!
即使你只对Lisp语言本身感兴趣,熟练掌握Emacs也有很大帮助.在Emacs没有相当基础前学习Emacs Lisp是在浪费时间.
关键是你打算用Emacs这个强大的瑞士军刀做什么.
我在前文中已经强调过以兴趣和解决实际问题作为切入点.
再举一些我自己的例子说明: