Emacs 折腾之旅起航

Emacs的作者就是大名鼎鼎的 Richard Stallman, 教主一生强调使用软件的自由, 所以Emacs默认有很多反人类的配置让众多用户撞墙, 加上Emacs社区的黑客开发节奏非常快, 真正要把Emacs用爽还是要大量修改默认配置和添加新的插件。

Emacs应该是Linux社区折腾最凶的自由软件了, 甚至折腾力度远远超过众多Linux发行版, 大多数Emacs用户之所有放弃Emacs是因为在网上拷贝了一段自己都不懂的Elisp代码然后扔到 ~/.emacs 里面后导致Emacs启动不了, 自己又不知道错误原因也看不懂天书一般的Elisp代码, 所以在我们真正玩 Emacs 之前要先了解一些 Emacs 的基本知识和排错技巧, 一旦掌握了这些技巧以后, 折腾 Emacs 将不再痛苦, 而是非常过瘾的探险之旅。

Emacs 的启动顺序

Emacs 读取配置文件的地方有两个:

  1. /usr/share/emacs/common/share/emacs/site-lisp/site-start.el
  2. ~/.emacs

Emacs 在启动的时候会从系统目录读取 site-start.el 的配置, 然后再读取 ~/.emacs 文件的配置。
一般来说系统级别的 site-start.el 是用于定制 Emacs 的版本用的(比如我为 Deepin 团队定制的 deepin-emacs) 防止受到用户级别的 ~/.emacs 的配置文件干扰。
一般来说玩 Emacs 只用把个人的配置文件丢到 ~/.emacs 就可以了

玩新配置和新插件的正确姿势

我看到很多Emacs新手喜欢从网上搜索各种帖子的 Elisp 代码, 不管是否理解还是这段代码是否有用, 一股脑全部扔到 ~/.emacs , 当某段配置文件有错误时导致 Emacs 启动不了以后, 他也不知道到底哪段代码出现问题了, 然后就在 ~/.emacs 中胡乱改, 越改越挂, 最后失去耐心放弃了。

我自己玩 300+ 的插件, 很多插件经常代码都是互相影响, 所以自己写了下面一段代码用于加载制定目录的 Elisp 插件, 平常新加的配置和插件代码都按照目录方式分类存放, 一旦真的出错或者自己都搞不定, 就先删除出问题的插件子目录, 避免新的配置影响现有配置导致没法使用 Emacs:

(defun add-subdirs-to-load-path (dir)
  "Recursive add directories to 'load-path'."
  (let ((default-directory (file-name-as-directory dir)))
    (add-to-list 'load-path dir)
   (normal-top-level-add-subdirs-to-load-path)))
(add-subdirs-to-load-path "/home/user/.emacs-config")

在折腾Emacs之前, 你先把上面代码拷贝到你的 ~/.emacs 文件中保存, 把 /home/user/.emacs-config 中的 user 换成你的用户名, 然后在主目录新建 .emacs-config 目录。
以后有新的插件就在 ~/.emacs-config 目录下新建子目录, 然后把配置文件扔进去, 一旦发生错误就直接子目录就可以快速恢复到上次正常的状态。

比如今天我在网络上看到 auto-complete 这个插件很牛逼, 我直接在 ~/.emacs-config 目录下新建一个 auto-complete 子目录, 然后把网上拷贝的配置文件全部都到 auto-complete 子目录下。
下次 Emacs 重启的时候就会递归的扫描 ~/.emacs-config 所有文件并进行加载, 如果 auto-complete 插件有任何配置不对的地方, 直接删除 ~/.emacs-config/auto-complete 目录即可继续折腾了。

注意这个方法并不是保证你在网络上拷贝的任何插件不会出问题, 也不会降低哪怕一分的折腾工作, 他只是提供一种良好的习惯, 让你在折腾插件的过程中通过删除有问题插件的目录来快速恢复上次正常状态, 避免初学者被打击够失去耐心。

Emacs 出错信息打印

插件出错以后, 好一点的是 Emacs 会什么都不显示, 但是就是没法正常工作, 运气差一点的Emacs会在启动过程中快速崩溃消失。

所以在折腾任何Emacs插件时, 首先要得到 Emacs 的出错信息, 只有得到出错信心才能快速的去寻找解决方案,这个技能很简单, 就是在 Emacs 启动的时候加一个 --debug-init 参数, 比如像下面这样启动Emacs:

emacs --debug-init

这样Emacs在加载配置文件的时候就会启用调试器, 一旦发生错误后, Emacs不会崩溃一闪而过, 而是在调试器中告诉你在加载配置文件的哪一个函数出现了的具体问题信息, 然后我们就可以拿着问题的信息去研究修复了。

因为很多初学者对Emacs不是非常熟悉, 经常不知道 Emacs 默认的行为是什么, 甚至无从判断问题是 Emacs 本身就有问题还是自己添加的配置有问题, 其实只用在启动的时候添加 -Q 参数就可以了, 像这样:

emacs -Q

这样Emacs就不会加载任何配置文件, 你可以对比Emacs默认的行为来判断是否真的是因为配置文件引起的问题。

善用 EmacsWiki、Google 、邮件列表和IRC

上面我们已经可以通过 --debug-init 选项可以定位到配置出错的问题, 国内很多用户粘贴了几屏的出错信息, 然后扔到论坛, 一句跪求的帖子, 也不说自己原来干了什么, 折腾的过程, 直接就是错误信息就期待高手马上出来帮他解决问题, 这种方法不但在国内, 即使在世界上所有地方都是不欢迎的。

一般我们得到错误信息以后, 我们要把最上面一行出错信息拷贝出来, 先在 EmacsWiki 和 Google 上搜索一下是否有其他问题也有相同的问题? 如果有相同的问题, 一般都已经有解决方案了, 如果能够自己搜索、理解和解决问题就不要当伸手党, 这是学习提高的必备过程, 也是折腾的乐趣之一。

如果实在找不到解决方案, 就把出错信息最上面一行开始往下拷贝20行左右的上下文, 然后把自己折腾插件的过程(从什么地方下载的插件、怎么加载配置文件的、遇到的错误信息、自己尝试解决方案的思路, 比如已经在 EmacsWiki 和 Google 搜索过了)粘贴到 Emacs 邮件列表 和 Emacs IRC频道 (#emacs 6667 irc.freenode.net)( IRC频道历来规矩就是避免粘贴大段文字到频道中, IRC 频道建议先粘贴到 paste2.org 这种粘贴分享网站, 再把分享地址粘贴到 IRC 频道, 以尊重 IRC 频道其他人), 然后等待社区高手的帮助, 只要你自己是动脑筋, 即使你的能力差一点很多热心的高手都愿意帮助, 千万千万不要做一个大爷姿态的伸手党, 尤其你面对的是全世界的顶尖高手。

Enjoy

只要你掌握上面的基本要点, 再加上持之以恒, 你总有一天会变成一位非常厉害的编程高手的...

更多 Emacs hacking 技巧请见下回分晓.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 教程存档Github 序|Preface 先来一篇有趣的简介:Emacs和Vim:神的编辑器和编辑器之神 - 51...
    北魏企鹅阅读 137,612评论 18 224
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,442评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 在上海读大二的时候,有机会去国外做交换生。那个时候很努力的准备了一段时间,学校组织了一场类似于雅思的考试。按照考试...
    one_alone阅读 279评论 0 3
  • 自9月加入简书起,发现里面有不少文章是写关于理财方面的知识,自己在这块一直处于空白之地,想着希望女儿这方面可不能一...
    走向阳光的自己阅读 394评论 3 4