跳转到内容

Doom Emacs — 极简风 Emacs 配置框架

是什么

Doom Emacs 是一个为有经验的 Emacs 用户量身设计的配置框架,让你在原生 Emacs 基础上一键获得模块化配置、< 1 秒启动、vim 键绑定和声明式包管理。

日常类比:就像一台出厂已调好的赛车底盘——你不必从头拧螺丝,但每颗螺丝仍在你够得到的地方,随时可以替换或去掉。

Doom 与 Spacemacs 是 Emacs 两大主流发行版,但哲学不同:Spacemacs 追求”开箱即用、隐藏细节”,Doom 追求”合理默认、接近原生”。Doom 的设计口号是”给从 Vim 叛逃来的人”——它内置 evil-mode,让你用 hjkl 和 SPC 键驱动整个编辑器,同时不牺牲 Emacs 的可扩展性。

Terminal window
# 安装只需两条命令
git clone --depth 1 https://github.com/doomemacs/doomemacs ~/.config/emacs
~/.config/emacs/bin/doom install

为什么重要

不理解 Doom Emacs,下面这些事都没法解释:

  • 为什么许多 Emacs 老手放弃手写 init.el,转投 Doom 后启动时间从 10 秒降到 0.5 秒
  • 为什么 Vim 用户能在不放弃 hjkl 的前提下无缝迁移到 Emacs 生态(org-mode、Magit、LSP)
  • 为什么”Emacs 破产”(Emacs bankruptcy:配置腐烂到无法维护)能被模块化架构系统性解决
  • 为什么声明式包管理 + doom sync 能让 Emacs 配置像 Nix 一样可重现、可回滚

核心要点

Doom 的架构可以拆成 三层

  1. 模块系统(Modules):Doom 提供 ~150 个可选模块,在 init.el 里用关键字开关::editor evil(vim 仿真)、:tools lsp(LSP)、:lang python(Python 支持)。每个模块封装了包安装、键绑定、hook 配置,互相隔离。类比:像乐高积木——你在 init.el 里声明要哪些块,Doom 负责拼装和连线。

  2. 延迟加载(Lazy Loading):Doom 大量使用 use-package:defer 和自定义 autoload 机制,让包只在第一次用到时才加载。这是启动速度 < 1 秒的核心秘密。类比:机场候机厅——航班不出发时,乘客(包)安静待在休息区,不堵大厅(启动时间)。

  3. CLI 运维体系(bin/doom)doom sync(同步配置)、doom upgrade(升级 Doom + 包)、doom doctor(诊断环境)、doom env(快照 shell 环境变量)。这四条命令构成了 Doom 的”包管理 + 运维”闭环,解决了原生 Emacs 包管理的不确定性。

实践案例

案例 1:Vim 用户迁移到 Emacs 生态

你是 Neovim 重度用户,想用 org-mode 做知识管理但不想重学键位。

~/.doom.d/init.el 里保留 :editor evil,这会装 evil-mode 并配好所有 Vim 兼容层:

;; ~/.doom.d/init.el 片段
(doom! :editor
(evil +everywhere) ; 所有 buffer 都用 vim 键位
:lang
(org +roam2) ; org-mode + org-roam 双链笔记
:tools
magit ; Git TUI,Vim 里没有这么好的对等物
)

运行 doom sync 后,你得到:SPC 作 Leader、SPC g g 打开 Magit、SPC n r f 打开 org-roam 笔记——全部 vim 风格操作,零额外配置。

案例 2:多语言 LSP 开发环境

你需要在同一个 Emacs 里调试 Python 服务端和 TypeScript 前端,同时要代码补全和诊断。

;; init.el
(doom! :tools
lsp ; 启用 lsp-mode(或 :tools (lsp +eglot) 用 eglot)
:lang
(python +lsp +pyright)
(javascript +lsp)
(typescript +lsp)
)
Terminal window
doom sync # 安装 lsp-mode, pyright, typescript-language-server 等
doom doctor # 检查 node/python/pyright 是否在 PATH

打开 .py 文件时 LSP 自动启动,gd(go to definition)、K(hover doc)、SPC c a(code action)全部就位,与 Neovim + nvim-lspconfig 体验对等。

案例 3:org-mode 知识管理 + GTD 工作流

用 Doom 打造”第二大脑”:双链笔记 + 任务管理 + 日程视图。

;; init.el
(doom! :lang
(org +roam2 +pretty +present)
:tools
deft ; 全文搜索笔记
)
;; ~/.doom.d/config.el
(setq org-directory "~/org/"
org-roam-directory "~/org/roam/")
;; GTD capture template
(setq org-capture-templates
'(("t" "Task" entry (file+headline "inbox.org" "Tasks")
"* TODO %?\n %U\n %a")))

SPC n r f(打开/创建 roam 笔记)、SPC X(快速 capture)、SPC o a(org-agenda)三键驱动整个工作流,笔记文件纯文本、Git 可追踪。

踩过的坑

  1. 忘跑 doom sync:修改 init.elpackages.el(添加/禁用模块、固定包版本)后,必须运行 doom sync,否则新包不安装、孤立包不清除,配置与实际状态脱节。这是新手最高频的困惑来源。

  2. 系统依赖漏装:Doom 不自动安装 ripgrep、fd、node、python 等 CLI 工具,但它的很多功能依赖它们。装完 Doom 第一件事:跑 doom doctor,它会列出所有缺失的依赖和修复建议。

  3. 使用不稳定 Emacs 版本:Emacs 版本号末尾是 .50/.60/.9X 的是预发布版,Doom 官方警告避免使用。推荐 Emacs 30.2(目前最新稳定);macOS 用户建议 brew install emacs-plus@30

  4. 直接修改 Doom 核心目录:用户配置应放在 ~/.doom.d(或 ~/.config/doom),绝对不要改 ~/.config/emacs(Doom 源码目录)。doom upgrade 会覆盖核心目录,你在那里的改动会丢失。

适用 vs 不适用场景

适用

  • 从 Vim/Neovim 迁移,想保留 vim 键位但探索 Emacs 生态(org-mode、Magit、TRAMP)
  • 受够了手写 init.el 腐烂,想要模块化、可重现的配置基础
  • 需要多语言 LSP 支持,又不想为每种语言手动配置 lsp-mode
  • macOS/Linux 桌面开发,把 Emacs 当 IDE + 笔记 + Git TUI 的一体化工作站

不适用

  • 刚接触 Emacs 的零基础新手——Doom 假设你理解 Emacs 基础概念(buffer、window、major-mode)
  • 只需轻量级编辑器,不想学 Emacs 生态——用 Helix 或 Neovim 更省力
  • 需要极度定制化配置,不想受任何框架约束——直接用手写 init.el(Crafted Emacs 等更薄的框架)
  • Windows 主力用户——Doom 在 Windows 上可用但体验明显不如 Linux/macOS

历史小故事(可跳过)

  • 2014 年:Henrik Lissner 从 Vim 叛逃到 Emacs,写下第一版私人配置,放在 GitHub。同年,Spacemacs 诞生,走的是另一条路:更重的 Layers 框架 + 更强的开箱即用。
  • 2016–2018 年:Doom 逐渐从个人配置进化为可供他人使用的框架,引入模块系统和 bin/doom CLI。
  • 2019 年:Doom v3 重写,架构更稳定,社区从零星贡献者发展到数千 Discord 成员。
  • 2023–2026 年:~22k stars,支持 Emacs 27.1–30.2,与 Spacemacs 并列 Emacs 生态最具影响力的发行版;hlissner 本人仍是主要维护者,项目由社区 PR 维持活跃度。

学到什么

  1. 框架 vs 原生的本质取舍:Doom 选择”合理默认 + 暴露接口”而非”隐藏一切”,让你能 debug 自己的配置,而不是绕过框架的黑盒。
  2. 延迟加载是性能银弹:在 Lisp 解释器环境里,懒加载比任何”优化包”更有效——只加载当前真正用到的代码。
  3. CLI 运维降低维护焦虑doom sync/upgrade/doctor 把”Emacs 破产”的风险从不可控变成可管理,声明式配置 + 可回滚是现代包管理的核心范式(参见 nix)。
  4. 从现有工具生态迁移要保留肌肉记忆:evil-mode 的成功证明——工具迁移的最大摩擦不是功能缺失,而是键位记忆;保留键位,新功能才有机会被探索。

延伸阅读

  • 官方文档:Doom Emacs Getting Started(安装、配置、常见问题一站式)
  • 视频:System Crafters — Doom Emacs 入门系列(YouTube,逐模块讲解,适合边看边配)
  • 对比:spacemacs —— 同为 Emacs 发行版,理解 Doom vs Spacemacs 设计哲学差异
  • 相关工具:ripgrep —— Doom 内置项目搜索依赖 ripgrep,理解它能更好排查性能问题
  • 编辑器谱系:neovim —— 理解 Doom 吸引 Vim 用户的原因需要了解 Neovim 生态的边界

关联

  • spacemacs —— Emacs 另一大发行版,与 Doom 同年诞生,Layers 体系 vs Modules 体系的不同取舍
  • neovim —— Doom 吸引的主要目标用户群,evil-mode 让两者键位兼容
  • vim —— evil-mode 的模仿对象,Doom 的 vim 兼容层从 vim 汲取大量设计
  • emacs —— Doom 的基础运行时,理解 Emacs 核心概念(buffer/window/major-mode)是使用 Doom 的前提
  • nix —— 声明式包管理理念的另一实践者,与 doom sync 的哲学高度相似
  • ripgrep —— Doom 项目搜索(SPC s p)的底层引擎,也是 Doom 安装的硬依赖
  • helix —— 现代模态编辑器,Doom 的轻量级替代者,适合不想学 Emacs 生态的用户

反向链接

  • emacs —— GNU Emacs — Lisp 自文档编辑器
  • nix —— Nix — 函数式声明式包管理与可重复构建
  • nvchad —— NvChad — 极致美观的 Neovim 配置框架
  • ripgrep —— ripgrep — Rust 写的现代 grep
  • spacemacs —— Spacemacs — Space 键统一 Vim 与 Emacs
  • vim —— Vim — 模态编辑器之父