16.9 加载文件

GNU Emacs 社区中有很多人为其编写扩展。随着时间推移,这些扩展常常被纳入新版本发布。例如日历、日记工具包以及 Calc 现在都是标准 GNU Emacs 的一部分。

你可以使用 load 命令对整个文件求值,从而将文件中的所有函数和变量安装到 Emacs 中。例如:

(load "~/emacs/slowsplit")

这会加载并求值主目录下 emacs 子目录中的 slowsplit.el 文件,若存在更快的字节编译版本 slowsplit.elc 则优先加载。该文件包含 John Robinson 在 1989 年编写的 split-window-quietly 函数。

split-window-quietly 函数分割窗口时会最小化重绘。我在 1989 年安装它,因为当时使用的 1200 波特慢速终端效果很好。如今很少遇到这么慢的连接,但我仍在使用这个函数,因为它会把缓冲区下半部分留在新窗口下方、上半部分留在上方。

要替换默认 split-window-vertically 的按键绑定,需要将按键绑定到 split-window-quietly,如下:

(keymap-global-set "C-x 2" 'split-window-quietly)

如果你像我一样加载很多扩展,可以不必像上面那样指定文件完整路径,而是将该目录加入 Emacs 的 load-path。之后 Emacs 加载文件时,会同时搜索该目录和默认目录列表。(默认列表在编译 Emacs 时由 paths.h 指定。)

下面命令将 ~/emacs 目录添加到现有加载路径:

;;; Emacs 加载路径
(setq load-path (cons "~/emacs" load-path))

顺便一提,load-libraryload 函数的交互式接口。完整函数如下:

(defun load-library (library)
  "加载名为 LIBRARY 的 Emacs Lisp 库。
本函数是 `load' 的接口。会在 `load-path' 中
搜索 LIBRARY,尝试添加与不添加 `load-suffixes'
(以及 `load-file-rep-suffixes')的文件名。

详见 Info 节点 `(emacs)Lisp Libraries'。
`load-file' 是 `load' 的另一种接口。"
  (interactive
   (list (completing-read "Load library: "
                          (apply-partially 'locate-file-completion-table
                                           load-path
                                           (get-load-suffixes)))))
  (load library))

函数名 load-library 来自习惯上将 “库(library)” 作为 “文件(file)” 的同义词。load-library 命令的源码位于 files.el 库中。

另一个功能略有不同的交互式命令是 load-file。 See Libraries of Lisp Code for Emacs in The GNU Emacs Manual,了解 load-library 与该命令的区别。