简单的配置结构
真如前文 (凉凉) 所说, 我们的配置放在 ~/.emacs.d 的文件夹中, 一个比较推荐的做法是使用 git 的 submodule 的方式去管理从网络上下载的库 (更多请参考 emacs-china 的这个帖子). 我现在想要尝试的就是学习 lazycat-emacs 的配置来进行一个简单的配置.
这里我将把 init.el 作为入口去载入其他的配置; 将下载的插件保存在 extension 目录下用 git-submodule 进行管理; 一般性的配置在 config 中; 然后本机专用的, 一些比较隐私的设置 (密码等) 放在 private 中:
差不多是这么个感觉:
├── init.el
└── lisp
├── config
├── extensions
└── private
Tips: 你完全可以有自己的配置结构, 比如把所有的配置都写在 init.el 中也不是不行.
于是我们可以在 init.el 的开头加上一个自动索引目录下代码的函数 (来自 lazycat-emacs/site-start.el):
;; Copied from lazy-emacs/site-start.el
;; see https://github.com/manateelazycat/lazycat-emacs/blob/master/site-start.el
(require 'cl-lib)
(defun add-subdirs-to-load-path (search-dir)
(interactive)
(let* ((dir (file-name-as-directory search-dir)))
(dolist (subdir
;; 过滤出不必要的目录,提升Emacs启动速度
(cl-remove-if
#'(lambda (subdir)
(or
;; 不是目录的文件都移除
(not (file-directory-p (concat dir subdir)))
;; 父目录、 语言相关和版本控制目录都移除
(member subdir '("." ".."
"dist" "node_modules" "__pycache__"
"RCS" "CVS" "rcs" "cvs" ".git" ".github"))))
(directory-files dir)))
(let ((subdir-path (concat dir (file-name-as-directory subdir))))
;; 目录下有 .el .so .dll 文件的路径才添加到 `load-path' 中,提升Emacs启动速度
(when (cl-some #'(lambda (subdir-file)
(and (file-regular-p (concat subdir-path subdir-file))
;; .so .dll 文件指非Elisp语言编写的Emacs动态库
(member (file-name-extension subdir-file) '("el" "so" "dll"))))
(directory-files subdir-path))
;; 注意:`add-to-list' 函数的第三个参数必须为 t ,表示加到列表末尾
;; 这样Emacs会从父目录到子目录的顺序搜索Elisp插件,顺序反过来会导致Emacs无法正常启动
(add-to-list 'load-path subdir-path t))
;; 继续递归搜索子目录
(add-subdirs-to-load-path subdir-path)))))
然后在 init.el 中, 将 lisp 目录 (以及其子目录) 载入到 load-path 这个变量中:
;; ~/.emacs.d/lisp/... for the elisp files
(add-subdirs-to-load-path (expand-file-name "lisp" user-emacs-directory))
注: 这里你完全可以不必了解任何 Elisp 相关的东西, 仅仅只需要复制粘贴即可, 具体的内容会在之后再慢慢介绍.
这里在 config 文件夹下, 举一个例子, 我们可以创建一个叫作 init-ui.el 的文件:
;;; init-ui.el --- Set up Emacs UI
(provide 'init-ui)
;;; init-ui.el ends here
一个最简单的形式大概如上, 然后在 init.el 中使用 (require 'init-ui) 即可载入 init-ui.el 中的配置.