在前面的文章中,我介绍了如何利用 org mode 实践 GTD 理念。实际上,org mode 与其他工具的结合,可以打造出一个功能强大且高度可定制的个人笔记系统。
嵌入 PlantUML 实现文本绘图
作为一名程序员,对 uml 图自然不陌生。时至今日,虽然UML显得有些“传统”,但它依然是我理清思路、设计架构时不可或缺的工具。而 plantuml 的最大优势在于,它能将纯文本描述转化为直观的图表。
要使用它,首先需要完成环境配置。你可以在 plantuml 入门 找到详细的安装步骤。对于我使用的 Archlinux 系统,首先需要确保 Java 环境已就绪。
sudo pacman -S jdk21-openjdk
根据 PlantUML 官方说明,Java 8 版本即可运行,但我倾向于安装较新的版本以获得更好的性能支持。
此外,PlantUML 生成某些类型的图表(如类图、组件图)需要依赖 graphviz 进行布局渲染,因此我们也需要一并安装它。
sudo pacman -S graphviz
基础环境搭建好后,就可以下载 PlantUML 的主程序 jar 包了。这个 jar 包可以放置在任何位置。既然是配合 Emacs 使用,我选择将它放在 ~/.emacs.d/lib 目录下,作为编辑器的功能依赖库。
为了验证安装是否成功,我们可以使用官网的经典示例进行测试。
@startuml
Alice -> Bob: test
@enduml
将上述文本保存为 test.txt,然后在终端执行命令 java -jar plantuml.jar test.txt。命令执行后,默认会在当前目录生成一个名为 test.png 的图片。如果能看到生成的简单序列图,说明环境配置正确。
接下来就是让 Emacs 与之联动了。根据 官方 文档,针对 Emacs 提供了名为 plantuml-mode 的扩展插件。通过以下配置,我们不仅可以高亮编辑 .puml 文件,还能让 org-mode 的代码块直接执行 PlantUML 并内嵌结果图。
(use-package plantuml-mode
:ensure t
:mode ("\\.puml\\'" "\\.plantuml\\'")
:config
(setq plantuml-default-exec-mode 'jar)
(setq plantuml-jar-path (expand-file-name "~/.emacs.d/lib/plantuml.jar")) ;; 设置plantuml jar包的位置
;; 让org代码块能识别plantuml语法
(add-to-list 'org-src-lang-modes '("plantuml" . "plantuml"))
(org-babel-do-load-languages
'org-babel-load-languages
'((plantuml . t)))
(setq org-plantuml-jar-path plantuml-jar-path)
)
配置完成后,就可以在 org 文件中愉快地“写”图了。依然是使用那个简单的例子:
#+begin_src plantuml :file demo.png
@startuml
Alice -> Bob: test
@enduml
#+end_src
这里必须通过 :file 参数来指定生成图片的链接和名称。执行该代码块(通常是 C-c C-c),就会在当前目录生成 demo.png,并在编辑器中预览链接。

为了方便快速启动绘图,你还可以为 PlantUML 代码块创建专属的 yasnippet 模板。关于更高级的绘图技巧和配置细节,你可以在许多优秀的技术文档和社区分享中找到灵感。
使用 org-roam 构建网状笔记系统
在笔记方法上,我个人更偏爱双链笔记(Zettelkasten)的理念。简单来说,它类似于维基百科,允许你在笔记之间随意建立链接,最终形成一个相互关联的知识网络。
传统的树状结构笔记(例如许多笔记本软件采用的文件夹层级)要求你在记录之初就做出明确的分类,这有时很困难。我们学习新知识往往是零散、发散的,很难立即将其纳入一个严密的体系。而且,跨学科的知识点可能同时属于多个领域,就像查理·芒格推崇的“多元思维模型”所强调的,我们很难将某个概念仅仅归入单一类别。
双链笔记则没有严格的层级限制,它天生就是网络结构。任何一条笔记都可以自由引用其他笔记,这更符合我们大脑的认知习惯:先记下闪念和碎片,随着积累和思考的深入,再通过链接自然地将它们组织成体系。
在 Emacs 生态中,org-roam 插件是实现这一理念的绝佳工具。
(use-package org-roam
:ensure t
:after org
:init
(setq org-roam-v2-ack t)
:config
(org-roam-setup)
:custom
(org-roam-directory "~/org/roam/")
:bind
(("C-c n f" . org-roam-node-find)
(:map
(("C-c n i" . org-roam-node-insert)
("C-c n o" . org-id-get-create)
("C-c n t" . org-roam-tag-add)
("C-c n a" . org-roam-alias-add)
("C-c n l" . org-roam-buffer-toggle)))))
在 org-roam 的体系里,每一个 org 文件就是一个独立的笔记节点。通过快捷键 C-c n f (org-roam-node-find) 可以快速查找或创建一个新节点,新建的文件会自动保存到预设的 org-roam-directory 目录中。
在编写笔记时,若需要关联到另一个已有的知识点,只需使用 C-c n i (org-roam-node-insert) 即可在光标处插入一个指向该笔记的链接。当你对某个主题的理解逐渐深入,可以通过 C-c n t (org-roam-tag-add) 为其添加标签,便于后期的聚合与检索。
另外,有时我们需要在一个主笔记下细化几个子观点,这些子观点会以子标题的形式存在。如果希望从其他笔记直接链接到某个特定子标题,可以在该子标题上执行 C-c n o (org-id-get-create) 为其创建一个唯一的 ID。请记住,org-roam 的链接本质上是基于 ID 的,使用 org-roam-node-find 创建新节点时,这个 ID 其实已经自动生成了。
为了让笔记间的关联网络可视化,我们可以启用 org-roam-ui。
(use-package org-roam-ui
:vc (:url "https://github.com/org-roam/org-roam-ui"
:rev :newest)
:after org-roam
:config
(setq org-roam-ui-sync-theme t
org-roam-ui-follow t
org-roam-ui-update-on-save t
org-roam-ui-open-on-start t))
从 Emacs 29 开始,内置了从 Git 仓库直接安装包的功能。由于 MELPA 仓库未收录 org-roam-ui,上述配置使用 :vc 关键字直接从其 GitHub 仓库安装。
安装完成后,通过命令启动 org-roam-ui-mode,它会自动在本地启动一个 Web 服务,并打开浏览器访问 http://127.0.0.1:35901/。在那里,你可以看到所有笔记节点及其链接关系构成的动态图谱,直观地展示你的知识网络。具体功能和配置,请参考其官方文档。
小结与展望
至此,Emacs 对我来说已经成为一个集代码编辑、笔记管理和日程规划于一体的高效工作环境。因此,这个系列的“折腾”将暂告一段落。但这并不意味着终结,后续如果遇到更好的配置方案、有趣的插件或有了新的实践心得,我依然会继续更新。
我必须承认,自己对 Emacs 和 Elisp 的理解仍很浅显,当前的配置也仅停留在“够用、好用”的阶段。在撰写这个系列的过程中,我得到了许多读者的反馈与鼓励,也遇到了高手为我指正错误、解答疑惑,在此一并感谢。
从一个对 Emacs 一知半解的新手,到拥有了一套顺手的个性化配置,这个过程本身充满了探索的乐趣。下一步,我计划沉下心来,认真阅读 Elisp reference manual,希望能更深入地理解这门强大的扩展语言,从而更好地驾驭这个“编辑器的操作系统”。
最后,列举一些在本系列文章中对我启发巨大的教程与资源,它们是我学习路上的重要路标:
当然,还有更多未曾记录但同样给予我帮助的博客文章与社区讨论。整个探索过程让我深刻体会到,一个活跃的开源实战社区对于个人成长是多么重要。如果你也在构建自己的数字工作流,不妨到 云栈社区 看看,那里有许多关于工具、效率和计算机基础的深度讨论,或许能给你带来新的灵感。