标签:
作者: 陈斌(redguardtoo)
版本号: 20160125
更新时间:
原创时间:
版权: 本文采用以下协议进行授权,自由转载 - 非商用 - 非衍生 - 保持署名 | Creative Commons BY-NC-ND 3.0,转载请注明作者及出处.
成为高手很容易.当初我在Vi阵营,偶尔用Emacs还忘记"退出"的快捷键,一年后我跨入高手行列.
很多文章强调Emacs有多牛,但关于"如何做"则语焉不详.即使涉及到"如何做",谈细节多而方法论少,所以本文就 侧重方法论.
全文结构如下:
简单谈谈,因重点是"怎么做",不是"为什么".
一旦尝过最好的,你自然了解好的编辑器应该有哪些功能.
比如一个内嵌的插件管理器是最基本的.
如下载了第三方插件,如果发觉其有问题,可以在不碰该插件原始代码的情况下修复.
插件服务器关闭了,应可以在自带的U盘上快速建立镜像.
目前流行的编辑器如Sublime Text还做不到以上几点.
Emacs 用 Lisp 开发,Lisp 不同寻常的语法决定了其开发者都是资深开发者,掌握了多门语言.
Lisp 并不能给你带来任何好处,所以其社区成员都是纯粹的技术爱好者,投机取巧的功利主义者对其没有兴趣.
IDE针对特定语言或框架优化,而Emacs完成通用任务更有效.
例如,我碰到难题,需要上IRC请教国外高手(工作流是,粘贴代码到http://gist.github.com, 在irc提问,看网页,将解决方案粘贴回来),Emacs 集成了IRC工具和浏览器 (例如),操作就很方便.
我使用 Visual Studio 多年,Firefox 也是高手,相信我,大多数情况下 Emacs 更快.
口说无凭,请看高手操作的 youtube 视频, Emacs Power: Can your editor do THIS!
顺便说一下,很多初学者关心的代码自动完成,几门主流语言支持都不错(包括java).
个人开发者会丧失兴趣,公司会倒闭.但自由软件基金会将一直存在下去.
Emacs作为其招牌软件也会维护下去,我的投资永不会贬值.
软件开源,配置是纯文本,且资源消耗小,安装包很小 (命令行版本 30M 左右),任何环境下都可用.
这在大项目中特别有益,例如,某项目需同时编辑 Perl, Java,C, Bash, SQL, 要编辑远程服务器上的代码,网速不快. Emacs的优势就体现出来了.
重要的是头脑开放,不先入为主.
新手的问题是,根据之前习惯 盲目 设定了入门必知.有些必知还很费时间.
以我为例,
也要避免门户之见,比如用了Emacs就排斥Vim的快捷键.比如一定要Helm和Ido中二选一(我是同时用的).治疗就是重读武侠小说"笑傲江湖".
开始前,解释一下后文用到的命名惯例,
建议,
这步的目的是:
按以下步骤阅读教程:
仅需半小时.关于Emacs多难学的谬论可以休矣.半小时的代价微不足道.想想你去练了多少个半小时吧.
即使你不打算使用Emacs默认的快捷键,这步也是必须的,不要跳过!
最起码要知道以下命令,
关键在于理性地考虑你最迫切需要解决的一个问题.
以这个问题作为出发点,除此之外都可以妥协.
虽然Emacs无所不能,但是饭也要一口一口吃.有时候退一步进两步.
例如,我一直以为Emacs的中文显示很完美,所以搞不懂为什么有人会在字体配置上花那么多时间.在陆续接到反馈后,我才明白原来是因为我一直在终端下使用Emacs,终端软件可以完美显示中文字体,所以就没Emacs什么事了.需要配置字体的人用的是图形界面Emacs.
当初只在终端下使用Emacs是因为需连接到远程服务器.我认为这是重点.甚至为此放弃了漂亮的配色主题(后来发觉此牺牲毫无必要).
塞翁失马,由此也避免了图形界面版本的所有问题.
这方面我是个负面榜样.刚开始抱着玩的心态,到处找有趣的配置粘贴到我的配置中去.
这是浪费时间!
我应一开始就照抄世界级大师 Steve Purcell的Emacs 配置.
警告,Purcell 总爱试用最新的 Web 开发的新技术,对他而言稳定性不是第一位的,如果你有热情和能力,愿意一起折腾,那么水平会提高很快.
这个如果是很重要的前提,当我上了Purcell的船时,我已有10年开发经验,精通多种语言.
如你不愿折腾,那至少不要重复我的错误,不要质疑,不要创新,跟着高手做.直说了把,你是初学者,开始阶段应以模仿为主.这点怎么强调也不过分!
为了加深印象,让我再举一例.有人向我反映,Emacs 快捷键太多,背起来压力很大.我的建议是,拿高手配置来用,而不是强加给自己背快捷键这样无聊的任务.你会发觉高手已安装了名为smex 的插件,使直接输入命令比快捷键还快.
如果你还未信服,请再考虑一下我的理由:
好吧,你现在信服了.但是你是否 真正理解 了?
比如你是否马上推论到:即使不用高手的配置,也可在github上订阅(watch)高手配置,其更新通知等价于免费的维护服务.
像武侠小说那样拜高手为师是白日做梦.唯一能让高手指点的办法是先付出.最可靠的付出就是报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无关的话题.
Reddit是最好的.优点是一直能访问.
Google Plus 贴子质量高.例如,我加入了 Linkedin和Facebook的Emacs论坛,目前都退出了.不是它们不专业,只是Google Plus讨论技术层次较高.
目前人气不如reddit,原因在于Google.
GitHub 的版本控制服务很好.现在它的社区化倾向越来越强了,我喜欢.
例如,可以看一下 https://github.com/search?p=1&q=stars:>20+extension:el+language:elisp&ref=searchresults&type=Repositories 上最酷的 Emacs 插件.
最好的是Planet Emacsen,多个Emacs博客的集合.
我偏爱的是"列举最有用的命令"之类的具体问题.很多回答大开眼界.即使我已精通Emacs.
那种"如何入门"的问题,人人都能插上一脚.即使有高水平的回答,也淹没在众多平庸回答中.
如果你的问题就是比较泛泛而谈的,从一个能测量水准的具体问题入手找到高手,然后看高手是如何回答那些比较泛的问题的.
google "emacs-related-keywords site:stackoverflow.com"
我会定期搜索,同一帖子反复精读.因为讨论质量很高.
http://emacs.stackexchange.com 是Emacs专门的问答子社区.
例如,我就是看了 Google Tech Talks 上这个 Org-mode 作者的介绍 而爱上 org-mode.
不过Youtube搜索结果是最佳匹配的.由于相关视频并不多,如按照默认算法,每次总是那几个.所以如果关注最新进展,搜索应以时间排序.
EmacsWiki 是社区维护的文档,是最酷插件和最佳实践的集合点.
有人抱怨文档太乱,质量参差不齐.前者我有同感.后者不赞同.EmacsWiki文档质量相当高,因其是 唯一的 半官方文档.忍受其乱中有序的现状吧.
最佳阅读方法是,选定一特定主题,从头读到尾.这样对最新进展都了解了.是否要采用其建议另当别论.
Bob Glickstein的Writing GNU Emacs Extensions是最好的.
生动,例子丰富.作者用心安排了书的结构.例如,很早就介绍了defadvice的用法.defadvice 是Emacs Lisp的精华.
Xah Lee 提供付费Lisp教程也相当不错.
他的Emergency Elisp很简洁.我特别喜欢"Statements"一章.
不要低估长期管理的累积效应.
正面例子参考Steve Purcell的配置. 2000年开始14年的维护! 8年github记录! 1000多颗星的配置决非浪得虚名.
知识积累的越多,这些知识之间的联系就会越多.联系增长的速度是以指数的方式增长的.如从头来过,意味着积累的知识的书面记录丢失了.损失是很大的.基数已归零,增长的量又能有多少.
所以决不要重置配置!
这也是后文谈到为什么要用工具保存配置和知识的原因.
我的配置见 https://github.com/redguardtoo/emacs.d.
版本控制可以认为是一个集中式的知识管理,任何时刻任何地点对配置的修改都要及时上传合并 (merge).这是积累能力的关键.
共享实际也是一种利己行为,有很多人使用我的配置,等于帮我测试.
我将所有资讯都放在 dropbox 的服务器上,这样资料就同步到我的智能手机和我的平板电脑上,我可利用空闲时间学习.
请点击这里注册 dropbox 帐号.注意,dropbox 客户端完全可以在国内使用,虽然访问其首页可能有点问题.
我还写了许多博客文章.这些文章都存在org格式的文件中.最后发布的静态博客也纳入版本控制,参见http://github.com/redguardtoo/blog.binchen.org.
初学者的问题是装了太多插件,管理成了问题.
我建议的原则是少而精,被少数最优秀的插件培养出品味后,可自由挑选适合的.
标准如下:
所有插件都可通过包管理器下载.
以下是清单:
名称 | 说明 | 同类插件 |
---|---|---|
Evil | 将 Emacs变为Vim | 没有 |
Org | org-mode,全能的笔记工具 | 没有 |
company-mode | 自动完成输入,支持各种语言和后端 | auto-complete |
expand-region | 快捷键选中文本,可将选择区域伸缩 | 没有 |
smex | 让输入命令变得飞快 | 没有 |
yasnippet | 强大的文本模板输入工具 | 没有 |
flymake | 对不同语言做语法检查 | flycheck |
helm | 自动完成,在其上有插件完成具体功能 | ido |
ido | 和helm类似,helm和ido可同时用 | helm |
js2-mode | javascript的主模式,自带语法解释器 | js-mode |
w3m | 网络浏览器(需安装命令行工具w3m) | Eww |
simple-httpd | Lisp 写的 Web 服务器 | elnode |
smartparens | 自动输入需要成对输入的字符如括号 | autopair |
window-numbering.el | 跳转到不同的子窗口 | switch-window.el |
web-mode | 支持各种 HTML 文件 | nxml-mode |
magit | 玩转git | 没有 |
git-gutter.el | 标记版本控制的diff(支持subversion) | 没有 |
牛人其他方面也很牛.举一反三你收获会很多.
Sacha Chua 就是这样一个有牛人气质的女孩,这是她的Youtube 录像. 她学习的方式是让 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的任何知识.
高手的配置都是轻量级的,因为他们知道如何优化.
比如有种叫Autoload的技术. 只有用到模块的某一功能时那个模块才会被载入内存. 我推荐的高手都知道这类技巧.
可用 我的配置:
注意,Purcell作为顶尖Web开发者,会试用最新的Web技术,而我的配置Web类插件更新会滞后一段时间.另外我的工具链和Purcell不完全一致.你自己权衡了.
嘿嘿,我也是Vi精通后转到Emacs的.就是因为Emacs的强大(例如和 gdb 的完美结合)以及其脚本语言是Lisp.
当然Vi的多模式编辑和快捷键比Emacs要高效得多,所以最佳方案是Vi+Emacs.
目前我用Evil, 在Emacs下模拟Vim,结合两者优点.
现在我是 神用编辑器之神!
警告,我默认启用了Vim的快捷键,不习惯可打开~/.emacs.d/init.el,将其中一行代码注释掉,细节参考README.
没必要记,我也只记常用的十几个快捷键.顺其自然,多用记住,不用就忘,很正常.
目前很多高手在用 Smex,可飞快输入命令,快捷键实际上不需要了.
不要改! 参考上文站在巨人的肩膀上一章,你觉得奇怪是因为缺乏经验,把某些特性误认为是bug.请坚持至少一年.
例如,有人反映右边第80列处总有一竖线,希望能去掉.
实际上这是一特性,提醒用户一行宽度不要超过第80列. 这是 每行不要超过 80 列的原因.
我建议第一年应 尽量理解而不妄加判断.
例如,问:在 .emacs.d 中的 init.el 文件起什么作用?答:google "emacswiki init.el".
先确认已装上了 你需要的 第三方命令行工具,这些工具是可选的,清单见我的README.
如排除了以上原因,带上"–debug-init"参数重新启动,然后将错误信息及环境报告到对应的开发者.
报告时应给出细节.例如很多读者给我的bug都是由于第三方插件版本较新引起的,我拿到版本号后,才能下载特定版本已重现 bug.否则只能靠猜,来回邮件浪费很多时间.
那你就是走我后悔莫及的老路,一个人在黑暗中摸索.开头兴致很高,但现实是残酷的,碰到复杂问题解决不了.只能逃避,借口Emacs太复杂而放弃了.
我最终醒悟过来走上光明大道,很多走上岐路的人恐怕就没这个觉悟和毅力了.
希望自己掌控坦率地说是一个非技术问题,因为没有自信心,所以有补偿心态. 希望通过一种错误的方式来证明自己.结局无非是恶性循环.
正确地方法是放下身段至少一年 (我已反复强调这一点),打好基本功,读书,虚心向高手学习.
Emacs 是个开放平台,其众多插件发布前并不一定有严格的测试.所以插件之间可能有冲突.
这也是我为什么建议初学者直接使用牛人配置的原因,因为牛人已经解决了众多兼容性的问题,你只要直接享受他的服务就行了.
即使你发觉了牛人尚未来得及处理的bug,最有效方法是提交报告给牛人,而不是自己去钻研Lisp.
需对命令行操作熟悉.关键知识点有两个:
如你不知道如何在 Windows 下添加修改环境变量,不知道如何安装第三方工具,建议还是先用Cygwin中的Emacs,因它已自带工具,没有的话安装也方便.且在 Cygwin 下环境变量 HOME 默认已设.
第三方命令行工具清单请参考我的.emacs.d 中的 README.
这个差距说到底是后端语法解析引擎的问题.通常这个问题都是以微软的Visual Studio和IBM的Eclipse作参照.
就C++来说目前有用苹果公司的 clang 的方案,效果不错.具体用什么插件来调用这些引擎有很多选择,不展开了.
实战中,我通常就用ctags作为后端引擎,因其通吃所有语言. 虽然解析效果差一点,但是恰当的命名规范(尽量少重名)可以弥补.
如ctags不满意,可考虑用Gnu Global (gtags).
以上讨论的都是后端引擎.
就前端界面来说,做的比较好的是company-mode,维护很活跃,你可就特定语言如何配置咨询其开发者.
Java和C#语言的主力开发工具最好用IDE而不是Emacs.C#又比Java更难在Emacs中使用.原因你懂的.
强烈建议用Keysnail.
这是最佳的,我已试过 所有 可选项.
请启动 Emacs 后,运行 `M-x package-refresh-contents` 以从服务器更新软件索引,然后重启 Emacs 即可.
如果你没有用Emacs24,没有完全拷贝高手的配置 (这是本文的中心思想),那么你需要安装package.el,细节参考这里.
Emacs 下载软件包 (package) 是通过 http 方式,所以如果网络出问题的话你需要用 http 代理服务器,具体操作见后文.
在命令行中启动 Emacs 时加上 "http_proxy=your-proxy-server-ip:port" 前缀.
例如,
<span style="color:#F92672;">http_proxy</span>=http://127.0.0.1:8000 emacs -nw
那么就用我的Emacs配置.
和我的配置配套的是我建立的独立的第三方包服务,请参考其主页上的README.
否,只会起阻碍作用!
Lisp语法和通常的语言不同,除非有相当编程经验(至少10年),一般人都会对其有一点负面情绪(当然是毫无道理的偏见!).学习任何新东西,长期来说兴趣最重要.一开始应避免任何负面情绪.
Emacs Lisp又是只用于Emacs的语言,有大量术语需要掌握.如"Buffer","Yank","Font face",只有资深用户才能理解.
所以在软件使用没有相当基础前学习其拓展语言是浪费时间.
参考前文关于找到切入点的一节,我推荐的顺序是,先用优秀的配置享受到好处,有了兴趣后学习Lisp就水到渠成了.
有世界级高手(名字不点了)对我的建议不以为然,他说Lisp很强大很有趣,应该先学.
但是他的盲点在于,忘记了自己转向Emacs前在其他编辑器上已一览众山小了.他用Python拓展Sublime已熟到厌烦,Lisp的奇特语法反而刺激了兴趣.编辑器的常用术语也不在话下. 而本文针对的是大多数的凡人.
选择适合自己的路,一年以后天才也好,凡人也好, 达到的高度都是一样的.
否.但Lisp是很强大的语言,特点是一切皆可改.当我说"一切"的时候,我就是指字面意义上的"一切",不是修辞上的夸张.
我用过许多编辑器,除了Emacs没有一个能做到"一切可改"这点 .vim也不行.
所以学点Lisp对提高Emacs水平没坏处.另外Lisp语法不错,值得程序员一学.
顺便说一下,Lisp很简单,比VB容易多了,一旦你适应其语法,就会发觉它其实蛮友好的,至少少打很多字.
关键是你打算用这把瑞士军刀做什么.
前文已强调过以兴趣和解决实际问题作为切入点.
举一些我自己的例子说明:
Org-mode简明手册 是不错的中文教程.
最好的英文教程是Carsten Dominik(Org-mode发明者)在google tech talks上的演讲.其要点为org-mode本质是一个文本文件,只要记住按TAB展开或者缩进条目就可以了.其他特性可慢慢学.
不要走火入魔.Emacs本质是个平台,提供了无限可能性.
从实用角度讲,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就是那把刀.
本文官方网址为 https://github.com/redguardtoo/mastering-emacs-in-one-year-guide.
有任何疑问,请在以上网址报bug.这比Email快.因GitHub会以邮件通知我,GitHub邮件永远归类至我的最优先文件夹下.
如给我发Email,会淹没于垃圾邮件中.
Emacs 本质上是一个社区和平台,不断有新的有趣的人和技术出现.我会定期更新本文.
如果你拷贝粘帖全文,会使自己和他人错过更新.
我建议分享本文的链接,
标签:
原文地址:http://blog.csdn.net/jslink_l/article/details/51890421