hugoとorg-modeの融合

Page content

Hugo 0.55.6 の場合の話。

Hugoの記事をemacs org-modeで記述したい場合、ox-hugo なるemacsのパッケージを使うケースがよく紹介されている。

https://ox-hugo.scripter.co

しかし、ox-hugo を使ってMarkdownに変換しなくても、hugoが自動的にorgファイルを解釈してくれていることが分かった。 つまり、contents ディレクトリ以下に拡張子 .org でファイルを作成しておくと、markdownの場合と同様にページを生成してくれる。

https://gohugo.io/content-management/formats

easy-hugo を使う場合

easy-hugo を使う場合は、以下の設定を init.el に入れておく。

(setq easy-hugo-org-header t)
(setq easy-hugo-default-ext ".org")

これで n (New blog post)で新規ファイルを作成するときに、拡張子は最初から .org となっており、org-mode形式のヘッダが設定された状態となっている。

タイトルと日付は自動的に生成されるが、それ以外は固定のようだ。

 #+TITLE: test
 #+DATE: 2019-07-22T13:06:21+09:00
 #+PUBLISHDATE: 2019-07-22T13:06:21+09:00
 #+DRAFT: nil
 #+TAGS: nil, nil
 #+DESCRIPTION: Short description

フォルトのヘッダを変更

このデフォルトのヘッダの一部を修正したいので、以下を init.el に追加した。

(defun my/easy-hugo--org-headers (file)
  "Return a draft org mode header string for a new article as FILE."
  (let ((datetimezone
         (concat
          (format-time-string "%Y-%m-%dT%T")
          (easy-hugo--orgtime-format (format-time-string "%z")))))
    (concat
     "#+TITLE: " file
     "\n#+DATE: " datetimezone
     "\n#+PUBLISHDATE: " datetimezone
     "\n#+categories: uncategorized"
     "\n#+DRAFT: nil"
     "\n#+TAGS: nil"
     "\n#+author: tounosumura302"
     "\n\n")))

(advice-add 'easy-hugo--org-headers :override 'my/easy-hugo--org-headers)

easy-hugo の関数 easy-hugo--org-headers がヘッダを作る関数。 これを元に内容を修正した別関数 my/easy-hugo--org-headers を用意し、adviceで関数をオーバーライドしている。

archetypes/default.org のようなファイルを読んで設定するようにすると、より気が利いたものになりそうだが、 今の所はこれで事足りているのでよし。

なお、advice についてはこちらを参考にさせていただいた。 http://emacs.rubikitch.com/nadvice/