作者:陈斌(redguardtoo)
版本:20141104
更新时间:
原创时间:
版权:本文採用下面协议进行授权,自由转载 - 非商用 - 非衍生 - 保持署名 | Creative Commons BY-NC-ND 3.0,转载请注明作者及出处.
成为高手非常easy.刚開始我在Vi阵营,偶尔用Emacs还忘记"退出"的快捷键,但一年后我跨入高手行列.
非常多文章都是强调 Emacs 有多牛,以激发你的兴趣.最有名是王垠的Emacs 是一种信仰!世界最强编辑器介绍.
但关于"怎样做"则语焉不详,即使涉及到"怎样做",谈细节多而方法论少,所以本文就是側重方法论.
全文结构例如以下:
简单谈谈,由于我本文的重点是"怎么做",而不是"为什么".
一旦你尝过最好的,你自然了解好的编辑器应该有哪些功能.
比方一个内嵌的插件管理器是最主要的.
又比方下载了第三方插件,假设发觉其有问题,能够在不碰该插件原始代码的情况下修复.
假设下载第三方插件的server的关闭了,应该能够在自带的U盘上高速建立镜像server.
眼下流行的编辑器如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,须要远程编辑在美国server上的代码,网速也快.Emacs 的优势就体现出来了.
我没说一年内必须什么事都不干专门学 Emacs, 我最反对没有短期回报的悬梁刺股式学习方法.
我利用一年中通勤时间就取得了非常大进步,自信到能够写下本文.
最重要是保持头脑开放,不要先入为主.
以我为例,
在開始教程前,我须要解释后文将会用到的命名惯例,
下面是我的建议,
这个阶段的目的是:
打开 Emacs 后,同一时候按下 Alt 和 X 健,输入 help-with-tutorial(后文中,类似快捷键以简写 `M-x help-with-tutorial` 取代),回车.
仅需半小时.关于 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的建议另当别论.
<Writing GNU Emacs Extensions by Bob Glickstein是Emacs Lisp编程书籍中最好的.生动,样例丰富.作者用心安排了书的结构.比如,他非常早就介绍了 defadvice 的使用方法.我非常认同这点,defadvice 是 Emacs Lisp 语言的精华.
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 的server上,这样资料就同步到我的智能手机和我的平板电脑上,我能够充分利用空暇时间学习.
请 点击这里注冊 dropbox 帐号.注意,dropbox client全然能够在国内使用,尽管訪问其首页可能有点问题.
我还写了很多博客文章.这些文章都存在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 server | 不知道 |
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.
这是最佳的,我已试用过*全部*可选项.
请启动 Emacs 后,执行 `M-x package-refresh-contents` 以从server更新最新的软件索引,然后重新启动 Emacs 就可以.
假设你没有使用 Emacs 24,而且没有全然拷贝高手的配置 (这是本文的中心思想),那么你须要安装配置 package.el,细节请參考 这里.
Emacs 下载软件包 (package) 是通过 http 方式,所以假设网络出问题的话你须要用 http 代理server,详细操作见后文.
在命令行中启动 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 是种非常easy的学的语言,比 VB easy多了,一旦你适应其语法后,就会发觉它事实上对程序猿蛮友好的,至少少打非常多字.
不是必需,Lisp足够了.
关键是你打算用 Emacs 这个强大的瑞士军刀做什么.
我在前文中已经强调过以兴趣和解决实际问题作为切入点.
再举一些我自己的样例说明:
Org-mode简明手冊 是不错的中文教程.
我觉得最好的英文新手教程是Carsten Dominik(org-mode发明者)在google tech talks上的演讲.其要点为org-mode本质是一个文本文件,你仅仅要记住按TAB展开或者缩进条目就能够了.其它高级特性能够慢慢学.
我非常赞赏这个理念.可是不要走火入魔.Emacs本质是个平台,给Geek们提供了无限的可能性.
从有用角度讲,Emacs和其它工具结合有时能更快完毕工作(只是菜鸟在没有一年的修炼之前千万不要猜Emacs*不能*做什么).
下面是我觉得不一定Emacs可以吃独食的地方:
重点是头脑灵活,坚信Emacs无所不能的同一时候也要适当变通一下.
这是我的 Twitter 和 Google Plus 以及 微博,也能够通过我的 email<chenbin DOT sh AT GMAIL DOT COM>联系我.我也在新浪 weibo.com 上开通账号 emacsguru.
我的主力博客为 http://blog.binchen.org.
我不会回答配置的详细问题,由于假设你通读本文,应该知道哪里找答案更好.
在本文结束时,我再强调一下本文最重要的观点.
要点是:
关键是你以严肃的态度把其当作专业技能学习.
非常多人之所以不赞同我的核心观点,是由于在他们的内心深处还是有把Emacs用来炫耀"我有多酷"的意识.
Emacs当然非常强大,能够作为一种另类娱乐工具来博眼球.可是它的本质是为专业人士使用的神器.
让我打个例如,职业杀手对于杀人的刀仅仅关心两件事:
刀的装饰是否美丽或者用刀技巧是否是自己原创的对职业杀手并不重要.
Emacs就是那把刀.
本文已放在 GitHub 上,网址为 https://github.com/redguardtoo/mastering-emacs-in-one-year-guide.
假设有不论什么疑问,请在以上网址报 bug.这比 Email 要快.因GitHub会以邮件通知我,GitHub 邮件永远归类至我的最优先目录下.
假设直接给我发 Email,就会淹没于垃圾邮件中.
Emacs 本质上是一个社区和平台,不断有新的有趣的人和技术出现.我会定期更新本文.
假设你仅仅是拷贝粘帖全文,会使你自己和他人错过更新.
我建议你最好分享本文的链接,