记录从零开始的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. 配置复杂, 学习曲线陡峭.
  4. Emacs与Vim水火不容

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

安装

Doom Emacs

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

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

完成后再从GitHub安装Doom Emacs

1
2
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的可选功能 (Q如何检查一个包有哪些可选功能?)

1
2
3
4
5
6
(doom! :lang
(org +brain
+dragdrop
+gnuplot
+jupyter) ; organize your plain life in plain text
)

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

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

设置完后运行

1
~/.emacs.d/bin/doom sync

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

1
doom purge

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

Org-roam

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

1
2
3
(doom! :lang
(org +roam)
)

也可以在packags.el中加入

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
(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中加入

1
2
3
4
;; 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.

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

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

1
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的情况, 主要错误信息是

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

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

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

然后在packages.el中加入

1
(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