Muse

简介

引用 EmacsWiki 上的一句话来说:

Emacs Muse is an authoring and publishing environment for Emacs. It simplifies the process of writing documents and publishing them to various output formats (HTML, PDF, DocBook, LaTeX, and more).

用 Muse 来写笔记是非常方便的,简易方便又实用的语法规则,并且在 Emacs 里 面能够达到一定的``所见即所得''的效果,可以输出为 TeX 、 pdf 、 html 等 多种格式。固然,他的简易的语法不能像 html 那样的灵活性,也不会有LaTeX 那么强大,但是关键的地方是他的易用性,对于日常的笔记工作,不会有太多的 复杂的要求,用 Muse 来完成是最合适不过的了!而且,Muse 还提供了一个 <literal> 标签,里面的东西是不归 Muse 来解释,而由输出后的文档格式来解 释。例如,现在 Muse 对表格的支持还很有限,你可以通过在 <literal> 标签里 面插入 html 表格的办法来产生复杂的表格,你也可以在 <literal> 标签里面输 入 TeX 格式的数学公式,这样产生的 TeX 或者 pdf 文档也是可以有漂亮的数学 公式的。

总之, Muse 为你省去了平日重复输入繁琐的 html 标签或者 LaTeX 命令的工 作,为你提供了一个清爽的环境,同时又不失灵活性,可以在必要的时候使用输 出格式所专有的语法1。它甚至有一个 <lisp> 标签可以嵌入 Elisp 执行的结 果!

输出格式定制

我一般是把自己的笔记输出为 html 格式,这样就得弄一些漂亮的 css 属性, 于是在学习 css 的过程中我慢慢收集了一些实用的小技巧,以把自己的笔记妆 点得漂亮一点。 :)

不过 Muse 由于支持多种格式,所以目前很多功能还不如 emacs-wiki ,比如 fancy table 功能,以及格式化源代码的功能。我模仿 emacs-wiki 里面的扩展 弄了一个 src-tag 功能,使用就像 emacs-wiki 里面那样方便,不过这只是针 对 html 一类的输出格式有用而已。

另外,Muse 还借鉴了 latex2png.el 在 html 输出格式中可以嵌入 latex 的公 式。在这里有介绍和我的配置。

编辑技巧

结构化显示

如果是一个比较大的 Muse 文档的话,结构会越来越不清楚,定位也会有困难, 这个时候可以打开 outline-minor-mode ,可以只显示一个骨干结构或者是只显 示某个部分,结构非常清晰,编辑也非常方便。在把 TAB绑定到 org-cycle 就更加方便了。

另外,默认在 muse-mode 里面识别 outline 标题的正则表达式是 "\\*+" ,这 有时候会识别错误,因为在 Muse 里面 * 还可以用于表示强调,如果强调的那个 词刚好在行首的话就会识别错误了。事实上,如果是标题的话, * 后面应该至少 还要有一个空格,所以这里可以修改一下这个正则表达式。这是一个buffer 局部 变量,所以可以在 muse-mode 的 hook 里面修改而不用担心影响到全局的值。另 外,打开文档的时候就使用 hide-body 来让他只显示框架是很不错的一个选择:

缩写词功能

另外,在编辑 Muse 文档的时候经常要输入类似 [[Emacs]] 这类的东西,有时 候很麻烦,可以使用缩写词功能来解决这个问题。

如果平时在使用缩写词功能,那么只要定义 muse-mode 里面的缩写词,并保存 到文件,启动的时候加载就行了。如果平时并没有使用什么缩写词功能,只是在 muse-mode 里面才使用的话,也可以在 ~/.emacs 里面加入定义缩写词的语句:

并在 muse-mode 的 hook 里面打开 abbrev-mode 就可以了。

当然,直接使用 msf-abbrev.el 更方便了。需要注意一点的是,muse 绑定了 <tab> 键,而 msf-abbrev.el 是绑定的 TAB 键,在 X 下面的话就无法使用 TAB 在各个域之间切换了2,这个时候可以使用 C-i

TAB 键跳转

默认情况下 TAB 键会在各个链接之间跳转,我觉得这没有什么用处,而且很烦 人,我更喜欢让 TAB 键帮我缩进到正确的位置,于是我做了下面的绑定:

或者,使用更舒服的 org-cycle 的绑定。

引进 org-mode 的舒服的地方

org-modemuse-mode 有很多相似的地方,但是,可以说,他们的起源不同: muse-mode 主要是来源于 emacs-wiki-mode ,主要侧重于发布,因此在支持的 发布格式以及发布格式的可定制性方面远胜于 org-mode ;而 org-mode 最初设 置的目的是用于记事、维护 TODO 列表以及制作日程、计划等,侧重于编辑和交 互,因此 org-mode 在交互(例如方便的 TAB 键行使 outline 操作)和编辑(例 如方便强大的表格编辑功能)方面比 muse-mode 要舒服很多。

现在有一些人也在考虑融合两者之间的优点,只是还没有什么明显的进展。我在 这里介绍一些我自己的一些经验。

标题的显示

muse-mode 默认是把标题按照比例放大来显示的,我更喜欢 org-mode 那种(其 实是来源于最初的 outline-mode )不放大字体,而以不同的颜色来显示的方式。 其实 Muse 已经有这个选项了:

TAB 键行使 outline 操作

muse-mode 里面 TAB 键默认被绑定到了 muse-next-reference 上,我基本上从 来没有用过这个功能,而且还经常按错。因此我一般是把他绑定到缩进的命令上。 后来我发现 org-mode 里面的 TAB 说绑定的 org-cycle 命令不在 org-mode 里 面也可以使用。于是便绑定了过来:

org-mode 的这个 org-cycle 命令非常方便,在标题的地方会执行相应的 outline 操作,其他地方则是相应的缩进操作。当然,也需要在 muse-mode 里 面打开 outline-mode ,否则 Muse 自己的一些颜色显示等有时候会混乱起来。

Footnote

1. 通常,如果你想要保证自己的 Muse 代码是可以通用地转换到任何格式,那 么在里面使用某一种输出格式专有的语句通常是不被推荐的。

2. 在 ASCII 码里面, C-iTAB 是相同的字符。如果终端能够把两者区分 开(如果在 X 窗口下运行,通常是可以区分开的),Emacs 将两者分别解释 作整数 9 和 symbol `tab' 。通常情况下,区分这两者并没有什么用处, 因此默认情况下 function-key-map 被设置为把 `tab' 映射到 9 上。这里 muse 重新绑定了 `tab' ,不再映射到 9 上,所以再这里无效了。但是可 以直接使用 C-i (即 ASCII 码的 9)。