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 的结合上来。
基本上,我有两个需求:
- 使用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
如此便完成了自定义变量的添加。
- 导出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
。