暗无天日

=============>DarkSun的个人博客

Emacs buffer 导出:五种方案对比

想从 Emacs 里导出一段代码或者文档分享出去,有好几种路子。这篇文章从实际使用出发,比较五种常见做法。

方案一:buffer-to-pdf(所见即所得的 PDF)

这是 Protesilaos 在 2026 年 5 月新发布的包。思路很直接:你在 Emacs 里看到什么样,导出的 PDF 就是什么样,字体大小、主题配色、语法高亮原样保留。

安装配置:

(use-package buffer-to-pdf
  :ensure nil
  :init
  (unless (package-installed-p 'buffer-to-pdf)
    (package-vc-install "https://github.com/protesilaos/buffer-to-pdf.git"))
  :config
  (setq buffer-to-pdf-directory (expand-file-name "~/")))

使用方法:

在任意 buffer 中执行 =M-x buffer-to-pdf=,会提示选择纸张方向(portrait 或 landscape),然后自动生成 PDF。

原理和限制:

buffer-to-pdf 的底层用的是 Emacs 内置的 x-export-frames 函数。这个函数需要 Emacs 编译时带 Cairo 支持(在 Linux 上通常是 --with-cairo 编译选项)。如果你的 Emacs 没有 Cairo 支持,这个包就没法用。

它的做法是:临时创建一个干净的 frame(去掉菜单栏、工具栏、滚动条),把当前 buffer 放进去,用 x-export-frames 导出为 PDF,最后删掉临时 frame。源码里还处理了一些细节,比如隐藏光标、关闭行号和拼写检查。

适用场景: 需要保留完整视觉效果的文档分享,比如学术演示、带配色的代码截图。

局限: 必须有 Cairo 构建的 Emacs,而且只能在图形界面下使用(需要实际的 frame),终端模式下不行。

方案二:htmlize(代码片段变网页)

htmlize 是个老牌包,功能就一个:把 buffer 的语法高亮转成 HTML。font-lock 颜色、字体样式都会照搬到 HTML 里。

安装:

htmlize 在 MELPA 上,直接 M-x package-install RET htmlize RET 即可。

使用方法:

M-x htmlize-buffer      ;; 导出整个 buffer
M-x htmlize-region      ;; 导出选中区域
M-x htmlize-file        ;; 导出文件

生成的 HTML 自带内联 CSS,浏览器打开就能看到和 Emacs 里一样的配色。

优势: 不需要 Cairo,不需要图形界面,终端模式下也能用。输出是 HTML,通用性强,直接粘贴到博客、邮件、网页里都行。

局限: 输出是 HTML 不是 PDF,一定要 PDF 的话得额外转换(浏览器的打印功能就行)。另外 htmlize 只转文本内容和语法高亮,不会包含 mode line 之类的界面元素。

方案三:ps-print(Emacs 内置的打印方案)

ps-print 是 Emacs 自带的功能,不需要装任何包。它把 buffer 内容转为 PostScript,保留字体、颜色和下划线。

使用方法:

M-x ps-print-buffer-with-faces    ;; 导出整个 buffer(保留样式)
M-x ps-print-region-with-faces    ;; 导出选中区域(保留样式)

-with-faces 后缀的命令会保留语法高亮颜色,不带后缀的版本只输出纯黑白。

ps-print 输出的是 PostScript 文件,可以用 ps2pdf 转成 PDF。这个工具随 ghostscript 一起安装(Debian/Ubuntu 上 =sudo apt install ghostscript=):

ps2pdf output.ps output.pdf

优势: Emacs 内置,零依赖,终端和图形界面都能用。输出是矢量格式,打印效果好。

局限: PostScript 不常见,得额外转换一步。另外 ps-print 的中文支持需要额外配置:

(setq ps-multibyte-buffer 'non-latin-printer)

设完这个变量 ps-print 才能正确处理中文字符,但实际效果取决于系统字体和 ghostscript 版本,中文可能仍然乱码或缺字。如果中文输出有问题,建议直接换 htmlize 或 buffer-to-pdf。

方案四:org-export(Org 文档的专业导出)

如果你的内容本身就是 Org 格式的,org-export 可以直接导出为 PDF(通过 LaTeX)、HTML、ODT 等格式。

使用方法:

在 Org 文件中按 C-c C-e 打开导出菜单,然后选择:

C-c C-e l p    ;; 导出为 LaTeX 再转 PDF
C-c C-e h h    ;; 导出为 HTML

PDF 导出需要系统装 LaTeX 工具链(texlive 等)。

优势: 支持目录、交叉引用、脚注、数学公式等复杂文档结构,适合正式文档和报告。

局限: 只适用于 Org 文件,不是"所见即所得"。导出的 PDF 样式取决于 LaTeX 模板,和你在 Emacs 里看到的样子可能差很远。而且依赖 LaTeX 工具链,安装体积不小。

方案五:系统截图工具

最简单粗暴:直接用系统截图工具截 Emacs 窗口。Linux 上常用的有 flameshot、scrot、grim(Wayland)等。

## flameshot(交互式截图)
flameshot gui

## scrot(命令行截图)
scrot -s screenshot.png

优势: 零配置,不需要任何 Emacs 包,截什么是什么。

局限: 输出是位图,分辨率固定,放大就糊。内容太长的话得截多张再拼接,而且截图会带上 Emacs 的窗口装饰和桌面背景,不够干净。

怎么选

场景 推荐方案 理由
分享一小段带语法高亮的代码 htmlize 输出 HTML,通用性强,不依赖图形界面
生成漂亮的代码截图用于演示 buffer-to-pdf 所见即所得,保留主题配色,输出矢量格式
打印正式文档 org-export 支持目录、脚注、数学公式等专业排版
快速截个图发群里 系统截图 最快最直接
没有 Cairo 的环境需要 PDF ps-print + ps2pdf 内置功能,不挑环境

有 Cairo 支持的 Emacs,buffer-to-pdf 是最方便的一键导出方案。经常分享代码片段的话,htmlize 更实用。Org 重度用户用 org-export 就够了,大部分需求都能覆盖。

Emacs之怒