毫无疑问,使用 emacs 自带的 elpa 包管理器下载和管理插件是最便捷的方法
emacs 24之后的版本内置了 elpa 包管理功能,下面我来介绍如何使用 elpa 的包管理功能来方便的安装插件。
有一点得提前说明:我使用的基本上是 陈斌的配置,所以以下也是在其原有结构上实现的。
我们打开 emacs 后使用 M-x list-packages
函数就可以列出所有可以安装的第三方包了。
然后我们可以使用 C-s
来搜索我们想要的插件。这里我以 org-download
为例,该插件是一个方便 org-mode
插入图片的插件,有了它我们就可以很方便的在编辑过程中将图片加入到我们的 org文件 中了。
如果没有找到我们想要的插件,可以在 init-elpa.el
中的 melpa-include-packages
变量中添加。
具体下载过程不是本文重点,不再赘述。
下载完插件后,我们可以在 ~/.emacs.d/elpa 目录下找到我们刚刚下载好的插件 org-download
。当然,只是这样还是不够的,我们还要继续做一些更加具体的配置才能让 emacs 启动时加载该插件。
init-org-download.el
新建的 init-*.el 根据下载插件的名字决定,这里我下载的是 org-download,因此叫 init-org-download.el
我们需要在 ~/.emacs.d/lisp 下新建一个叫做 init-org-download.el
的文件,然后在里面写上:
(require 'org-download)
(provide 'init-org-download)
至于第一句 (require 'org-download)
这句是要根据插件本身提供的接口来写:
Cygwin
来提供 Unxi/Linux 的命令。所以我在该文件夹下打开命令窗口使用 grep -nr "provide"
看看有提供什么接口。org-download.el
这个文件给我们提供了一个叫做 org-download
的接口,所以我们才写了那个第一句。~\.emacs.d\lisp\init-elpa.el
(可省略)然后,我们需要在打开的 init-elpa.el
中的 (provide 'init-elpa)
前面加上 (require-package 'org-download)
这里 require-package
的作用是 Ask elpa to install given PACKAGE.(是个自定义函数,功能可以自己去查看)
为什么要这样做呢?
我们看 陈斌在 github 上的配置 可以发现他 github 上的配置是没有 ~/elpa 这个文件夹的,因此我们 git clone 后在这个配置下第一次打开 emacs 的时候,init-elpa.el
里的一大堆 require-package
就负责下载这些指定的 package 到我们本地的 elpa 目录下。如果我们不加这一句,那么以后换另一台设备使用自己原来的配置的话,得重新手动下载那些没有 require-package 的包了。
最后,我们还需要在 ~/.emacs.d/init.el 文件中添加一行 (require 'init-org-download)
。1
这里是根据我们刚才 (provide 'init-org-download)
这里写的。个人感觉类似 provide 定义了一个函数,require 来调用这个函数。
对于为什么这么样划分,我在 EmacsWiki 上看到的解释是:
It’s often better to break up a lengthy init file into a number of EmacsLisp libraries and a small, top-level init file that loads those libraries, especially if you define commands and other functions. Some of the init files posted on EmacsWiki are organized in this way, as a set of library files.
子龙山人在其 21 天里也给出了解释:第三天:配置文件模块化(上)
由于自己对 git 还不是太了解,我现在有个问题是如何保证能同步更新陈斌的配置的同时保留自己的配置,希望有热心网友能指点一下。
上面那个同步问题可以参考 issue 737
有一些作者写的插件没有提交到 ELPA 上。比如 manateelazycat 就不喜欢这样做,原因见 我为什么不想把自己的 Emacs 插件放到 MELPA 上?
这个时候就需要我们来自己下载配置了,下面我以一个不能在 ELPA 上找到的 beancount.el 为例来说明如何配置。
因为我们并不是从 ELPA 上下载的这个插件,所以我在 ~/emacs.d 下新建了一个叫做 individual
的目录来单独管理这些插件。
这一步很简单,在 individual 目录下新建一个 beancount 目录用来存储 beancount.el
和 ELPA 配置一样,在 ~/.emacs.d/lisp 目录下新建一个叫 init-beancount.el
的文件负责配置 beancount
init-beancount.el 里和原来类似,填写2
(add-to-list 'load-path "~/.emacs.d/individual/beancount")
(require 'beancount)
(provide 'init-beancount)
在 ~/.emacs.d/init.el 中追加 (require 'init-beancount)
来加载配置。
我们看到这里的第四步比原来多了一行 add-to-list,这是为什么呢?LoadPath 给出了解释
If you install an Emacs package using the package manager (see InstallingPackages), it automatically configures
‘load-path’
to handle the packages you install that way. But if you download Emacs Lisp files yourself or you write local Lisp files, just add the directories containing those files to‘load-path’
.
本文对 https://blog.csdn.net/vv_vv_vv/article/details/52992985 这篇文章进行了补充和改进。
如果觉得每次更改 init.el 过于麻烦的话,可以将自己的配置专门放到一个文件。 ↩︎
下面的代码是简化过后的,如果要使用,更具体得去看文档。 ↩︎