记录从零开始的 Emacs. 目标是熟练地使用 Org-roam 编辑个人维基!

前言

因缘巧合, 今日我在搜索转化$\rm\LaTeX$到MathML的解决方案时, 偶然看到了Org-roam项目. 它的个人知识库构建和展示方式引起了我很大的兴趣.

Org-roam 基于 Emacs 的 Org-mode, 后者是 Emacs 中纯文本笔记管理+GTD+写作系统. “Org” 指代 organize, “roam” 则取自Roam Research. Org-roam 采纳了 Zettelkasten笔记法的思想.[1] 这种方法认为知识不是层级化的而是扁平化的, 重要的是知识之间的关联. 这种关联通过笔记中用[[...]]包围的关键词建立. Org-roam能对这种连接进行可视化.

Graph view, from Org-roam GitHub site
Graph view, from Org-roam GitHub site

相比较其他 Zettelkasten 实现, Org-roam 的特点是

  1. 完全免费开源, 数据库本地存储而不是封存托管在企业云端数据库.
  2. 基于 Org-mode 纯文本系统, 可利用 Emacs 生态扩展.
  3. 配置复杂, 学习曲线陡峭.

一直以来也接触过挺多笔记记录的方式, Agenda, Bear, OneNote, Notion, 甚至是本地文件夹, 但总是觉得不得劲. 现在又多了这样一种选择, 自然还是想试一下. 然而作为 Vim 用户, 第一个应该跨过的关卡应该是 Emacs 的基本使用. 现在就说道说道吧.

安装

Doom Emacs

从安装开始. 为免去 Emacs 基本设置, 在Matt Williams的推荐下安装 emacs-plusDoom Emacs. 通过 Homebrew 安装 Emacs

brew tap d12frosted/emacs-plus
# 若出现403错误, 在前面加上all_proxy=socks5://127.0.0.1:1086
brew install [email protected] --with-modern-icon-cg433n
ln -s /usr/local/opt/emacs-plus/Emacs.app /Applications/Emacs.app

完成后再从 GitHub 安装 Doom Emacs

git clone --depth 1 https://github.com/hlissner/doom-emacs ~/.emacs.d
~/.emacs.d/bin/doom install

此时命令行打开 Emacs, 可以看到下面这样十分炫酷的界面. 这跟我印象里面一个大白框UI迥然不同.

Doom Emacs UI
Doom Emacs UI

Doom Emacs 安装完后, 编辑 ~/.doom.d/init.el 文件, 打开或关闭一些 Doom 模块. 一些模块包含可选功能, 需要通过 + 指定, 例如打开 Org-mode 的可选功能

(doom! :lang
(org +brain
+dragdrop
+gnuplot
+jupyter) ; organize your plain life in plain text
)

~/.doom.d/packages.el 下用 package! 命令指定安装 ELPA/MELPA 上的插件包,[2] 例如

;; 安装ELPA或者MELPA上的包
(package! markdown-mode)
;; 从GitHub仓库安装最新版markdown-mode
(package! markdown-mode
:recipe (:host github :repo jrblevin/markdown-mode))

设置完后运行

~/.emacs.d/bin/doom sync

以应用两个文件的变化. 如果遇到安装问题, 可在 packages.el 中注释掉对应代码, 命令行执行

doom purge

卸载程序包, 再反注释掉, 重新安装即可.

Org-roam

Org-roam 的安装可以采用 + 方式安装 (slack讨论)

(doom! :lang
(org +roam)
)

也可以在 packags.el 中加入

(package! org-roam)
(package! company-org-roam) ;org-roam相关的代码补全

安装. 随后在 config.el 中用 use-package! 函数配置

(use-package! org-roam
:commands (org-roam-insert org-roam-find-file org-roam)
:init
(setq org-roam-directory "~/Documents/SelfDevelopment/org-roam/")
(setq org-roam-graph-viewer "/usr/bin/open")
(map! :leader
:prefix "r"
:desc "Org-Roam-Insert" "i" #'org-roam-insert
:desc "Org-Roam-Find" "/" #'org-roam-find-file
:desc "Org-Roam-Buffer" "r" #'org-roam)
:config
(org-roam-mode +1))
(add-hook 'after-init-hook 'org-roam-mode)

随后打开 Emacs, M-x org-roam-find-fileSPC r /, 会检查 org-roam-directory 下的所有 org 文件. 输出文件名进行编辑或者新建

编辑完后 C-c C-c 保存. 对于 config 中不了解的函数, 可以输入 SPC(空格) h f 来查询.

更进一步的 Org-mode, Org-roam 配置和使用将会在今后的文章中记录. 在本文接下来部分中仅涉及 Emacs 编辑和指令的基本使用.

Emacs使用

Zaiste 制作了一系列非常好的 Youtube 视频介绍 Doom Emacs 和 Org-mode 的使用, 这里的记录基本上是练习他的 Doom 视频内容的整理.

文件操作

Dired 模式下可以对文件夹与文件进行操作.

Key 功能
-/RET 进入上层/子文件夹
+ 新建文件夹
d x 标记要删除的文件(夹), 执行删除
o 排序
M 修改文件权限
O 修改文件owner
m/u 选择/取消选择文件
U 取消所有选择
R 重命名/移动文件
C 复制文件
c 压缩选中文件

常用键位和命令

Key 功能
SPC . 打开或创建文件 (在文本编辑模式下直接回车, 相当于Vim的:q)
SPC f r 打开最近文件
SPC o i 在iTerm中打开当前文件夹
修饰键C Mac上为Ctrl键
修饰键M Mac上为Alt键 (在Doom中如果是第一个输入, CMD键也可以)
修饰键s Mac上为CMD键
M-x shell 在Emacs中打开shell(全屏)
SPC o T 在Emacs中打开vterm(全屏)
SPC o t 在Emacs中弹出vterm小窗

如果想将vterm的默认shell设为zsh需要在config.el中加入

;; set zsh to default shell of vterm
(use-package! vterm
:config
(setq vterm-shell "zsh"))

此时可以用 SPC o T 打开 vterm, 使用的是 zsh.

缓冲区和窗口操作

和 Vim 类似, 打开文件时, Emacs 会打开一个缓冲区 (buffer), 载入当前文件的所有内容. 所有编辑都在 buffer 中进行. 但 buffer 不必一定是文件, 它也可以是 shell, 或者 Dired 文件树等等.

Key 功能
SPC b NCMD-n 新建缓冲区
SPC b kCMD-k 杀死当前缓冲区
SPC b bSPC , 切换工作区缓冲区
SPC b BSPC < 切换全局缓冲区
C-w v 水平复制缓冲区到新窗口
C-w s 垂直复制缓冲区到新窗口
C-w w 转到下一个缓冲区窗口
C-w h/j/k/l Vi式窗口转移
C-w q 关闭窗口
C-w >/< 向右/左扩展窗口
C-w +/- 向上/下扩展窗口
C-w = 使所有窗口等宽等高

文本编辑命令

这里文本编辑想表达的是类似 Vim 中文本操作键位和 command mode 下的命令(:). 好在 Doom Emacs 将许多 Vim 与 Emacs 命令绑定在了一起, 省去了学习 Emacs原生编辑操作的麻烦. 同时 Domm Emacs 额外提供了许多方便的编辑命令

Key 功能
C-x k 关闭buffer但不保存, 类似Vim :q!. 如果直接输入:q将会关闭整个Emacs
g s SPC STR Avy搜索STR所在位置, 跳转
g s SPC STR x Avy搜索STR所在位置, 跳转并剪切
g s SPC STR i Avy搜索STR所在位置, 跳转并提供ispell修改意见

Markdown编辑和预览

Markdown 文件的文本渲染和快速编辑可以使用 markdown-mode. Markus Opitz 基于 simple-httpd 包实现了一个 HTTP 服务器实时预览的功能. 编辑命令可参考这个 Cheatsheet.

Troubleshooting

GitHub图标显示不正常

安装完后打开 Doom Emacs, 首页上的 GitHub 图标显示有可能不正常, 此时需要在 Emacs 下安装all-the-icons.

M-x all-the-icons-install-fonts

如果出现 403 错误, 可以用 proxychains-ng和 SS 解决

proxychains4 emacs

Package cl is deprecated 警告

在打开 Doom Emacs 后底部会出现这一警告. 原因是在 Emacs 24 后 cl 程序包已经被 cl-lib 取代, 而部分依赖于 cl 的包 (如 deft) 未相应更新. 目前除了等待源码更新外, 没有好的解决办法.

新建文档时安装 PDF-tools 出错

首次用 M-X org-roam-find-file 创建新文件, 会弹出 build epdfinfo 的请求, 确定后自动安装 pdf-tools. 此时出现了 build failed 的情况, 主要错误信息是

configure: error: cannot find necessary  poppler-private header (see README.org)
Build failed. ;o(

解决办法参考这个 issue comment, 从 Homebrew 安装 pdf-tools

brew tap dunn/homebrew-emacs
brew install --HEAD pdf-tools

然后在 packages.el 中加入

(package! pdf-tools)

重新打开 Emacs 新建文件, 不需要重新 build epdfinfo了.

参考资料

Master Emacs in 21 Days: http://book.emacs-china.org/

Emacs Key Bindings: https://caiorss.github.io/Emacs-Elisp-Programming/Keybindings.html

How can I customize Emacs to make things more convenient?

Using Emacs Series: https://cestlaz.github.io/stories/emacs/


  1. 1.Zettelkasten是一个德语词, 对应英语slip box, 类似于图书馆存放索引卡的盒子.
  2. 2.ELPA: 全称Emacs Lisp Package Archive, Emacs默认的软件包存储库. MELPA = Milkypostman ELPA

Comments