Things I Wish I Know When I Am Learning Emacs

当我在学习 Emacs 的时候,有一些事情,我希望有人能够提前告诉我。

这样的话,我便可以少走一些弯路。

一定要使用 Starter Kit

对于 Emacs 新手而言,一定要使用 Starter Kit!

虽然有很多人喜欢从零开始捣腾,但是,真的不要这样。一来浪费大量的时间不说,而且通常只有学习能力非常强而且毅力也非常好的人才能从零开始配置并坚持下来。

当然,如果你觉得 Starter Kit 满足不了你的需求,你是可以很轻松地进行扩展的。

好的 Starter Kit 通常都是 Emacs 社区里面的高手开发的,它们的模块化,加载时间,按键绑定都是经过精心优化的。向高手学习,在初学阶段是非常重要的。这一点,陈斌在他的《一年成为 Emacs 高手》中也提到了。

如果以前是 IDE 重度用户,推荐从bbatsov/prelude 开始入手。

如果你是 Vim 用户,推荐从 syl20bnr/spacemacs 入手。

这两个 starter kit 都有非常详细的文档,入手之前一定要认真阅读文档。在上手以后,还需要不断地反复阅读文档并动手实践。遇到问题可以去 Github 上面提 issue。

Package 管理和依赖

刚开始学习 Emacs 的时候一定要学会使用包管理器,能够从 melpa 下载包。

每一个 Package 要么定义了一堆功能函数,要么定义了一个 major mode 或者 minor mode。

不要一味地使用 require,这样的话会导致你的 Emacs 加载时间变长。 最好使用 jwiegley/use-package, 它不仅可以智能地引入 package。比如当你的 elpa 目录的一个 package 不存在的时候,直接使用 require 是会报错的。但是使用 use-package 的话就不会。

另外,use-package 还可以优雅地管理你的配置。比如有一些 mode 相关的变量,在 mode 还没有激活的时候,去设置它们没有用的。

这时你需要使用 eval-after-load,然后把相关的设置放进去。 而使用 use-package 的话,就可以非常方便地使用 :defer t 和 :config 了。

最后,有一些 Package 之间是存在依赖的,如果加载顺序不对也不行。这里推荐大家试试 edvorg/req-package

按键绑定

按键绑定,也叫"快捷键绑定",它本质上只是用一个 Hotkey 去调用一个交互式命令。

如下所示,我定义了 C-c C-1 快捷键,它可以在当前的 buffer 位置插入一个“Hello World”的字符串。

(defun print-hello-world ()
  (interactive)
  (insert "Hello World"))

(global-set-key (kbd "C-c C-1") 'print-hello-world)

这里需要注意的是,print-hello-world 函数必须是 interactive 的,否则是不可以绑定一个快捷键的。

一个函数被定义成 interactive 以后,我们就可以通过 M-x 来调用它,如果你发现此函数经常被调用,此时就可以通过定义一个快捷键来解决效率问题了。

上面所提到的快捷键绑定是 99%的 Emacs 党都知道的。

但是,有一些事情可能并不是所有人都清楚。

按键绑定的覆盖问题

有时候,我们定义了一堆快捷键,但是某一天安装完一个 Package 后,突然发现以前的快捷键失效了。通常这是由于某些 minor mode 的快捷键的优先级比你的高,所以被它覆盖了。这里强烈推荐大家看看 Mastering Key Bindings in Emacs - Mastering Emacs ,看完之后相信会对 Emacs 的按键绑定有更多的认识。

这里面有一些小技巧,可以保证你自己定义的快捷键不容易被覆盖。

对于正统 Emacs 用户,定义的快捷键默认最好以 C-c 开头,因为 C-c 是 Emacs 预留给用户使用的,当然某些 minor mode 也会使用 C-c 开头。此时,你可以通过定义一个 minor mode 并且让这个 minor mode 最后加载,然后把你所有的自定义快捷键都放在新定义的 minor mode 里面,这样你的快捷键就不会被覆盖了。

著名的 Emacs Starter Kit Prelude 就是使用的这个方式。

对于 Evil 用户,建议使用 evil/leader 来定义快捷键。更合理的方式是像 Spacemacs 一样,分组来定义。

最后,对于 Spacemacs 用户,建议使用 SPC o 来定义自己的快捷键。

快捷键太多,记不住怎么办?

很多初学者抱怨 Emacs 的按键太复杂,伤小拇指。或者抱怨 Emacs 的按键太多,记不住。

其实,你根本就不需要快捷键。

通过 smex + ido,你可以用交互式的方式来执行 Emacs 的命令。当然,你也可以使用 Helm 来搜索并执行命令。因为你日常经常用的命令不会太多,所以,其实是不推荐定义太多快捷键的。直接使用命令有时候会更快,因为你大脑的负担更轻。

其实你根本就不需要记忆。

你可以通过 abo-abo/hydrajustbur/emacs-which-key 来交互式地显示所有的按键绑定。

最后,Evil 也是一个极佳的方案。Vim 和 Emacs 专注在两个不同的领域,Vim 把编辑器操作发挥到了极致,而 Emacs 在与系统集成方面也做到了极致。

而 Spacemacs 让这一切更和谐。

有问题问 Emacs

在学习 Emacs 的过程中,一定要经常问 Emacs 一些问题。

比如这个函数是干什么用的?(C-h f) 这个按键对应的函数是什么?(C-h k)这个变量是干什么用的?(C-h v)

一定要学一点 elisp,Emacs 自带的《Introduction to Elisp》就很不错。

在使用 Starter Kit 的过程中,有事没事,读一读它们的源码。这样也有利于你在扩展自己的配置的时候,遵循的是此 Starter Kit 的最佳实践。

实在是搞不定了再问 Google,最后才去社区里面提问:

社区提问的优先级是:StackOverflow -> Reddit -> Google+ -> Github issue -> 最后才是 Q 群和微信群

Happy Hacking