用 Muse 记笔记
时间:2009-05-22 来源:wnsfzf
Contents
简介 输出格式定制 编辑技巧 结构化显示 缩写词功能 TAB 键跳转 引进 org-mode 的舒服的地方 标题的显示 TAB 键行使 outline 操作简介
引用 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 来让他只显示框架是很不错的一个选择:
<STYLE type=text/css></STYLE>(add-hook 'muse-mode-hook '(lambda () (setq outline-regexp "\\*+ ") (outline-minor-mode) (hide-body)))
缩写词功能
另外,在编辑 Muse 文档的时候经常要输入类似 [[Emacs]] 这类的东西,有时候很麻烦,可以使用缩写词功能来解决这个问题。
如果平时在使用缩写词功能,那么只要定义 muse-mode 里面的缩写词,并保存到文件,启动的时候加载就行了。如果平时并没有使用什么缩写词功能,只是在 muse-mode 里面才使用的话,也可以在 ~/.emacs 里面加入定义缩写词的语句:
<STYLE type=text/css></STYLE>(define-abbrev-table 'muse-mode-abbrev-table '(("Emacs" "[[Emacs]] " nil 0) ("Debian" "[[Debian]] " nil 0) ("CL" "[[CommonLisp][Common Lisp]] " nil 0))) ;; 禁用自动保存缩写词 (setq save-abbrevs nil)
并在 muse-mode 的 hook 里面打开 abbrev-mode 就可以了。
当然,直接使用 msf-abbrev.el 更方便了。需要注意一点的是,muse 绑定了 <tab> 键,而 msf-abbrev.el 是绑定的 TAB 键,在 X 下面的话就无法使用 TAB 在各个域之间切换了2,这个时候可以使用 C-i 。
TAB 键跳转
默认情况下 TAB 键会在各个链接之间跳转,我觉得这没有什么用处,而且很烦人,我更喜欢让 TAB 键帮我缩进到正确的位置,于是我做了下面的绑定:
<STYLE type=text/css></STYLE>(define-key muse-mode-map [tab] 'indent-for-tab-command)
或者,使用更舒服的 org-cycle 的绑定。
引进 org-mode 的舒服的地方
org-mode 和 muse-mode 有很多相似的地方,但是,可以说,他们的起源不同: muse-mode 主要是来源于 emacs-wiki-mode ,主要侧重于发布,因此在支持的发布格式以及发布格式的可定制性方面远胜于 org-mode ;而 org-mode 最初设置的目的是用于记事、维护 TODO 列表以及制作日程、计划等,侧重于编辑和交互,因此 org-mode 在交互(例如方便的 TAB 键行使 outline 操作)和编辑(例如方便强大的表格编辑功能)方面比 muse-mode 要舒服很多。
现在有一些人也在考虑融合两者之间的优点,只是还没有什么明显的进展。我在这里介绍一些我自己的一些经验。
标题的显示
muse-mode 默认是把标题按照比例放大来显示的,我更喜欢 org-mode 那种(其实是来源于最初的 outline-mode )不放大字体,而以不同的颜色来显示的方式。其实 Muse 已经有这个选项了:
<STYLE type=text/css></STYLE>(setq muse-colors-autogen-headings 'outline)
TAB 键行使 outline 操作
muse-mode 里面 TAB 键默认被绑定到了 muse-next-reference 上,我基本上从来没有用过这个功能,而且还经常按错。因此我一般是把他绑定到缩进的命令上。后来我发现 org-mode 里面的 TAB 说绑定的 org-cycle 命令不在 org-mode 里面也可以使用。于是便绑定了过来:
<STYLE type=text/css></STYLE>(require 'org) (define-key muse-mode-map (kdb "<tab>") 'org-cycle) (define-key muse-mode-map (kbd "<S-iso-lefttab>") 'org-shifttab)
org-mode 的这个 org-cycle 命令非常方便,在标题的地方会执行相应的 outline 操作,其他地方则是相应的缩进操作。当然,也需要在 muse-mode 里面打开 outline-mode ,否则 Muse 自己的一些颜色显示等有时候会混乱起来。
Footnote
1. 通常,如果你想要保证自己的 Muse 代码是可以通用地转换到任何格式,那么在里面使用某一种输出格式专有的语句通常是不被推荐的。
2. 在 ASCII 码里面, C-i 和 TAB 是相同的字符。如果终端能够把两者区分开(如果在 X 窗口下运行,通常是可以区分开的),Emacs 将两者分别解释作整数 9 和 symbol `tab' 。通常情况下,区分这两者并没有什么用处,因此默认情况下 function-key-map 被设置为把 `tab' 映射到 9 上。这里 muse 重新绑定了 `tab' ,不再映射到 9 上,所以再这里无效了。但是可以直接使用 C-i (即 ASCII 码的 9)。