Emacs 联合 org-hugo 撰写博客

目录

1 ox-hugo

ox-hugo 补充了org的输出后台,其可以把org输出为hugo支持的markdown格式文档(Blackfriday) ,从而在Hugo的静态网页中显示。其github仓库地址在此 ,其主页在此

其官网甚至提供了一个创建新文章的 org-capture-templates 。对此稍加修改便可以为我所用。

 1: (with-eval-after-load 'org-capture
 2:   (defun org-hugo-new-subtree-post-capture-template ()
 3:     "Returns `org-capture' template string for new Hugo post.
 4: See `org-capture-templates' for more information."
 5:     (let* (;; http://www.holgerschurig.de/en/emacs-blog-from-org-to-hugo/
 6:            (date (format-time-string (org-time-stamp-format :long :inactive) (org-current-time)))
 7:            (title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
 8:            (fname (org-hugo-slug title)))
 9:       (mapconcat #'identity
10:                  `(
11:                    ,(concat "* TODO " title)
12:                    ":PROPERTIES:"
13:                    ,(concat ":EXPORT_FILE_NAME: " fname)
14:                    ,(concat ":EXPORT_DATE: " date) ;Enter current date and time
15:                    ":END:"
16:                    "%?\n")          ;Place the cursor here finally
17:                  "\n")))
18: 
19:   (add-to-list 'org-capture-templates
20:                '("h" "Hugo post"
21:                  entry (file+olp "all-posts.org" "Blog Ideas")
22:                  (function org-hugo-new-subtree-post-capture-template)))
23:   )

基于官方给出的 org-capture-templates 稍作修改:

1: ("h" "Hugo post")
2: ("hr" "Reading"
3:  entry (file+olp "~/zorg/readingbar/content_org/all-posts.org" "Reading")
4:  (function org-hugo-new-subtree-post-capture-template) :clock-in t :clock-resume t)
5: 
6: ("hm" "movie"
7:  entry (file+olp "~/zorg/readingbar/content_org/all-posts.org" "movie")
8:  (function org-hugo-new-subtree-post-capture-template) :clock-in t :clock-resume t)

通过这个设置,使用 h r 可以快速发布与 Reading 相关的博文,使用 h m 可以快速发布与 movie 相关的博文。

更多细节可以阅读其官方文档。

因为我使用的hugo主题是 hugo-tranquilpeak-theme ,这个主题中发布的文章markdown模板中有 ox-hugo 默认不支持的参数。因此需要修改 ox-hugo 的默认输出模板使其输出的markdown文档符合 hugo-tranquilpeak-theme 主题的需求。

虽然我的修改只针对Hugo 的 hugo-tranquilpeak-theme ,但是接下来的技巧却适合所有的 Hugo 主题。这主要得益于 ox-hugo 的高度可定制性。

2 我的需求与配置

目前我在使用hugo-tranquilpeak-theme 来装点我的soft life。

岔开几句介绍一下我的这个博客。这个博客存在于一个隐秘的地址(你当然看不到了),记录了我的soft life。 之所以说是soft life,是为了区别 hard life 。这里的 soft 不是指软饭生活 :D ; 这里的 hard 也不是指困难的生活。

容我岔开几句,简单的介绍一下 soft life 这个名字的来历。

在通信领域对于解调器的输出有两种判决操作:一种判决叫做硬判决,一种叫做软判决。硬判决直接对解调输出做0-1处理,大于零就判为1,小于零就判为0,没有中间态;这种操作丢掉了信道的可靠度信息,会导致译码器译码性能下降大约2-3dB。而软判决则保留了信道的信息,其输出为实数,这个实数表示编码比特是1或者0的可靠度。比如很大的正实数和很小的正实数在硬判决的时候无差别的做1处理,但是在软判决的时候这个实数被作为解调结果送给译码器,告诉译码器虽然这两个数都是正的,但是其大小是不一样的。即:在硬判决中判决为1的事件,在软判决中有无数可能的存在。

生活亦是如此,正确应该有多种方式。生活中大多数没有非对即错的道理。即使现在是错的,假以时日,剧情反转也有可能。对于一件事情,很多种处理方式都是正确的。正所谓,条条道路通罗马。方法总比问题多。soft life记录了我对问题的看法和感悟,可能和你的角度不同,但是在我的世界里确实有血有肉的丰满。

好了,回到ox-hugo与hugo-tranquilpeak-theme 的结合上来。

基本上,我有两个需求:

  1. 使用ox-hugo就能导出带有 thumbnailImage , coverImage 以及 thumbnailImagePosition 参数的markdown。 而类似 thumbnailImage 这类的参数在 ox-hugo里是没有定义的,属于custom范畴。通过阅读ox-hugo的github中的样例,我发现可以在每一个headline的 PROPERTY 抽屉里添加:
:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :thumbnailImage thumbnailImage.jpg
:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :coverImage coverImage.png
:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :thumbnailImagePosition left

如此便完成了自定义变量的添加。

  1. 导出markdown时自动设置好标签和分类(tags and category)。这个需求可以通过设置标签来完成 :tags:@category 很简单。在headline中的没有携带 @ 前缀的标签都会归类为 tags,携带了 @category 的标签都会归类为 category

3 ox-hugo 技巧收集

3.1 摘要

通过添加

#+HUGO: more

可以分开摘要和正文。这个语句在markdown里会被转化为:

<!--more-->

3.2 更多变量

如下所示:

comments: false
showTags: true
showPagination: true
showSocial: true
showDate: true

根据变量名可以猜个大概。

3.3 img的位置

在hugo-tranquilpeak-theme主题中,所有的图片路径都是相对于static的路径。比如:

:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :thumbnailImage /img/gone-with-the-wind.png
:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :coverImage /img/gone-with-the-wind-cover.png

其中 /img/gone-with-the-wind.png 的绝对路径是 /static/img/gone-with-the-wind.png