在Emacs中预览Markdown

需求

配置好Emacs的markdown模式后,就可以通过快捷键预览markdown文本对应的网页,配置和使用方法可参考Markdown Mode for Emacs

但前提是,系统中要有将markdown文本转化为HTML文本的命令。否则,按下预览网页的快捷键后,Emacs将提示/bin/bash: markdown: command not found。我找到了两种办法来解决这个问题。

markdown_py

Python有将markdown转化为HTML的命令,只不过它的名字不叫markdown。我通过locate命令找到了它:

1
2
3
4
$ sudo updatedb
$ locate markdown | grep bin
/usr/bin/markdown_py
/usr/bin/markdown_py-2.7

随便找个markdown文件,尝试下markdown_py命令的效果:

1
$ markdown_py file.md > result

打开result文件,发现它就是一个HTML文本,所以这就是符合我们要求的命令。查看一下文件的信息:

1
2
3
$ ll /usr/bin | grep markdown
lrwxrwxrwx. 1 root root 15 Mar 22 18:06 markdown_py -> markdown_py-2.7
-rwxr-xr-x. 1 root root 1013 Feb 9 2012 markdown_py-2.7

原来markdown_py就是markdown_py-2.7的一个软链接。所以,我们再建立一个名为markdown的软链接指向markdown_py-2.7就可以解决问题了:

1
2
$ cd /usr/bin
$ sudo ln -s markdown_py-2.7 markdown

敲下C-c C-c p快捷键看效果,发现网页是乱码的。如果markdown的内容是中文,那么转换出来的HTML在浏览器中打开就无法自动识别编码。这个时候,我们可以借助markdown对HTML标记的支持,在markdown文件开头中加入编码信息:

1
$ sed -i '1i\<meta http-equiv="content-type" content="text/html; charset=UTF-8">' *.md

我最开始使用的就是这个方法,虽然奏效了,但是每个markdown文本中都要加这行代码,大煞风景。有没有更优雅的解决办法呢?于是,我找到了pandoc工具。

pandoc

pandoc支持多种输出格式,我们现在只关注HTML格式。pandoc将Markdown转化为HTML并将结果定向到标准输出:

1
$ pandoc -f markdown -t html file.md

为了防止中文乱码,要加上--ascii选项。pandoc还支持语法高亮和LaTeX数学公式。加上--highlight-stype pygments 选项使用pygments支持语法高亮,加上--mathjax选项以支持LaTeX数学公式。得到的最终形式是:

1
$ pandoc -f markdown -t html -s --mathjax --highlight-style pygments file.md

但是,如何让Emacs调用这个带很多选项的命令呢?这时候就要用到shell的知识了。在shell中,$1代表第一个命令行参数,我们将上述语句中最后的文件名替换成$1,然后把它封装成一个名为markdown的文本:

1
pandoc -f markdown -t html -s --mathjax --highlight-style pygments $1

为了直接在命令行中调用它,可将它移动到命令目录中,并增加可执行权限。现在,执行markdown file.md语句的效果与执行

1
$ pandoc -f markdown -t html -s --mathjax --highlight-style pygments file.md

的效果是一样的,目的达到,最终的预览效果也非常好。