用 ox-hugo 写博客
写在前面
ox-hugo 的功能是打通 org-mode -> hugo 的发布渠道,并且提供一个基于 org-mode 的博文管理方式,因此本文的目标读者是日常使用 emacs 写作的人群。
对于正在使用 org-mode 写 hugo 博客但还不了解 ox-hugo 的读者,这里简要介绍一下 ox-hugo 具体解决了什么痛点:
- 你并不需要修改你的博客,ox-hugo 完全兼容原有模式
- ox-hugo 会将 org 文档自动转换成 markdown 格式。这样的好处是可以正常显示表格了(hugo 目前并不支持 org 表格)。
- ox-hugo 能自动将 org 文档中的图片保存到 hugo 的相应路径,你可以不用在手动移动图片文件了。比如我想要在博文中插入截屏图片就只需要执行
M-x org-screenshot-take
就可以了, ox-hugo 会帮我完成剩下的事情 - 你可以像管理 org-mode tree 一样管理博客。比如用 TODO 关键字表示草稿、DONE 表示正式发布,它还会自动更新博客的创建时间和修改时间,非常方便
用一张图看看使用 ox-hugo 之后的写作方式:
从截图中你可以了解到 ox-hugo 的写作特点:
- 你可以将所有博文放在一个 org 文件中。在右侧的编辑器中,你可以看到除了本篇博客之外,还有其他几篇用
TODO
关键词标识的博客,它们目前都是草稿,而只要切换到DONE
它们就会正式发布 - ox-hugo 使用
properties
来指定 hugo 配置,比如博客发布的路径、标题以及文章摘要等等 - ox-hugo 会转换 org-mode
TAG
和 emacs 生态完美结合 - ox-hugo 提供了一个名为
org-hugo-auto-export-mode
,当你修改文章之后会自动发布到 hugo 中
如何使用 ox-hugo
安装
官方文档上有如何安装的说明,如果和我一样用的是 doom emacs
, 那么安装也很简单,首先在 package.el
文件中添加:
(package! ox-hugo)
然后在 config.el
文件中启用即可:
(use-package! ox-hugo
:ensure t
:after ox)
快速上手
在将 org 文件导入到 hugo 目录前,还需要配置 Hugo 博客的目录,在 org 文件头中添加如下配置:
#+HUGO_BASE_DIR: ~/Blog/
#+hugo_front_matter_format: yaml
#+hugo_auto_set_lastmod: t
#+HUGO_SECTION: post
指明目录之后执行 M-x org-hugo-export-to-md
, 然后就会在 ~/Blog/content/posts/
目录下生成一个 markdown 文件。
这里简要介绍一下这些配置的意义:
HUGO_BASE_DIR
指定了 hugo 博客文件夹的位置hugo_front_matter_format
指定了 front matter 的格式hugo_auto_set_lastmode
会让 ox-hugo 自动更新博客的修改时间HUGO_SECTION
指定了这篇博客会发布到的目录,比如 post 或者 posts
ox-hugo 提供了两种博客发布方式:基于文件,基于 subtree 。 前者将整个 org 文件转换成一个 markdown 文件,而后者可以从一个 org 文件中提取出多个文章。和官方一样我推荐用 subtree 的方式,因为后者功能更为强大,为了简明起见,这里我只介绍后一种。
可能有人会嫌我啰嗦,更愿意从例子中学习,这里我就把这篇博客的原始文件贴上来:
+title: Blog
#+HUGO_BASE_DIR: ~/Blog/
#+hugo_front_matter_format: yaml
#+hugo_auto_set_lastmod: t
#+HUGO_SECTION: post
* TODO 用 ox-hugo 写博客 :emacs:hugo:
:PROPERTIES:
:EXPORT_FILE_NAME: index
:EXPORT_DESCRIPTION: Whole hugo blog in plain text!
:EXPORT_HUGO_BUNDLE: 2021/04/21/how-to-use-ox-hugo
:END:
** 写在前面
.....
[[file:./images/screenshot-27.png]]
....
** 如何使用 ox-hugo
*** 安装
...
*** 快速上手
...
使用 M-x org-hugo-export-to-md
之后会在 <HUGO_BASE_DIR>/content/<HUGO_SECTION>/<EXPORT_HUGO_BUNDLE>
目录下创建 <EXPORT_FILE_NAME>.md
文件。
如果参考我的例子,你应该就已经学会如何使用 ox-hugo 写博客了。但如果你并不熟悉 hugo bundle, 或者好奇 ox-hugo 会如何处理你的图片,那么请接着看以下的补充说明。
关于 hugo bundle
hugo 官方的文档写得并不是很清晰,反正我看了一头雾水,但经过这么多天的使用,我有了自己的看法,先别问它是什么:
-
它能做什么? 如果你不使用 bundle 那么我相信你会把所有文章放到 post 目录下面,这样时间久了,这个目录下面就会有大量的 md 文件,不便管理。
-
而 bundle 提供了层级目录的功能,你可以像我一样将文章按照年月日的划分放到子文件夹里。
-
不仅如此,你还可以将所有文章相关的资源放到同一个目录下面。比如在以前,文章的图片必须放到
/static/images/
目录下面,而使用了 bundle 之后,它们就可以放到文章所在的目录下面。
-
-
如何使用?
-
还是以我自身情况作为例子,我会先将一篇博客按照年月日划分,然后再加上标题;比如这篇文章是:
/2021/04/21/how-to-use-ox-hugo/
-
有了目录之后,再在这个目录下面放置一个
index.md
文件,里面就是博客的正文
-
希望我上面的说明能够增进你对 hugo bundle 的理解,如果你还是搞不明白它是怎么作用的,可以先按照我的样子进行实验,经过实践想必你会有更好的认识。
关于图片处理
如果不使用 bundle ,那么 hugo 会将图片放到 static/images/
目录下面,反之,它会将图片放到文章所在的目录下面。
比如,我这篇文章的截图的原始文件路径是 ./images/screenshot-27.png
, ox-hugo 进行转换之后会把它放到 post/2021/04/21/how-to-use-ox-hugo/images/screenshot-27.png
中。
自动发布
每次保存然后手动执行 M-x org-hugo-export-to-md
发布实在太麻烦了,你可以启动 org-hugo-auto-export-mode
来实现自动发布。
目前的体验
一个月前创建了这篇文章,然而直到今天才完成,懒癌发作真是要命啊;不过经过这一个多月的使用体验,我推荐 ox-hugo 也更有底气了,因为它确实方便了博客写作(你甚至可以用 org-agenda 来规划博客写作,设置 Deadline ,任何一个 emacser 都无法抗拒这种诱惑吧 hh)