前言

最近把我的 emacs 配置转移到了 doom emacs 下,简单的读了下 doom emacs 的源码。

core

core.el

定义变量

  • 定义 doom 相关变量
  • 设置默认编码为 utf-8
  • 设置默认的全局变量,如自动保存,自动备份等
  • 设置一些文件的保存路径
  • 载入 custom.el
  • 定义两个 hook 变量,doom-init-hook, doom-post-init-hook

初始化

  • 设置垃圾回收相关变量,减少启动时间
  • 载入 core 的各种设置
  • 定义几个 hook 函数
  • 优化 emacs 的默认行为

core-packages.el

  • 这个是 doom-emacs 的 package 管理系统,它会读取每个 Moudle 下的 packages.el 文件(其中一个在 core 目录下),packages.el 文件中的 package!声明了需要 安装的 package。
  • 定义 Bootstrap API,Moudle API
  • 定义 Moudle 配置宏
  • 定义 Moudle package 宏
  • 定义一些交互命令

core-lib.el

定义一些 doom 使用的函数和宏

core-os.el

操作系统相关的设置,如剪切板,Mac 系统的一些变量设置

core-ui.el

ui 相关的设置

  • 设置了很多 ui 相关的变量
  • 定义几个设置 modeline 的宏
  • 定义几个 ui 相关的插件:all-the-icons,fringe-helper,rainbow-delimiters 等
  • 设置内置 package 的一些变量
  • 自定义一些 ui 相关的 hook
  • 行号设置
  • 主题和字体设置
  • 初始化 ui

core-editor.el

编辑相关的设置

  • 一些默认变量的设置。
  • ediff 的设置
  • 大文件的检查,以特殊的方法打开,避免影响性能
  • 内置功能的设置,如:auto-revert,recentf
  • editconfig pakcage 的设置
  • smartparens package 的设置
  • undo-tree package 的设置
  • 其他的 package 的设置:expand-region,avy, helpful 等

core-projects.el

project 相关设置

  • projectile package 的设置
  • 定义一些 API
  • 定义一些 Project 相关的宏

core-keybinds.el

定义 keybinds

  • leader key 为 “SPC”
  • 定义一个 escape hook,C-g 会触发
  • whick-key package 的设置
  • hydra package 的设置
  • 定义 map!宏用于键绑定

test/*

定义一些测试相关的东西

autoload/*

定义许多延迟加载的函数。

init.el

  1. 加载 core 中的内容
  2. 加载各个模块

moudle

各个模块的代码。模块分为几种类型:

  • :feature 带来更好的 emacs 功能,如:popup,evil
  • :completing 补全相关,如:company,ivy
  • :ui ui 相关,如:doom-modeline
  • :tools 一些小工具,如:dired,neotree
  • :lang 各种语言支持,如:Java,Python
  • :app emacs 的其他功能,如:RSS,email
  • :config emacs 配置模块,如:binds 提供键绑定
  • :private 自定义的模块

组成

config.el

Moudle 的核心,moudle 激活时就会加载

init.el

在 doom core 初始化时载入

packages.el

Moudle 需要的所有 package

autoload.el (or autoload/*)

模块所有延迟加载的函数

+*.el

额外的配置文件,不会自动载入

test/*.el

模块的单元测试