ox-hugo用のorg-captureテンプレートについて

Intro

下記のブログの記事で考えて、ようやく記事を新規作成するために必要な情報が整いました。

org-captureはいつも設定しておきながら、設定したことを忘れているのですが、ox-hugoを使うにあたってきちんと入門したいと思います。

org-capture

org-captureはEmacsのどこにいてもorgでメモを取るためのフロントエンドです。

org-captureのユーザーはたくさんおり、設定例も溢れていますが、 「自分でグローバルバインドを設定しなければならない」という点が性に合わず、結局使わずじまいでした。

少し本題からずれますが、そもそも C-c につづくアルファベット、修飾キー付きのアルファベット、プレフィックスを自由に設定できるとして、覚えられる気がしません。

私のglobal-mapはtransient-dwimだけを設定しており、他のバインドはマイナーモード、メジャーモードのキーマップのみです。 transient-dwimはtransientを利用したキーバインド管理パッケージです。

transient-dwimを M-= に設定している場合、org-captureは M-= M-o M-o で起動できます。

ox-hugoの設定

ファイル名をUUIDで自動生成するテスト - IMADENELE」と「最終変更日の手動設定 - IMADENELE」を参考にテンプレートを調整しました。

(leaf ox-hugo
  :doc "Hugo Markdown Back-End for Org Export Engine"
  :req "emacs-24.4" "org-9.0"
  :tag "docs" "markdown" "org" "emacs>=24.4"
  :added "2020-05-05"
  :url "https://ox-hugo.scripter.co"
  :emacs>= 24.4
  :ensure t
  :after org
  :require t
  :defun (org-set-property)
  :custom ((org-hugo-front-matter-format . "yaml"))
  :config
  (defun c/ox-hugo-add-lastmod nil
    "Add `lastmod' property with the current time."
    (interactive)
    (org-set-property "EXPORT_HUGO_LASTMOD"
                      (format-time-string "[%Y-%m-%d %a %H:%M]")))

  (leaf *ox-hugo--capture
    :require org-capture
    :defvar (org-capture-templates)
    :config
    (add-to-list 'org-capture-templates
                 '("b" "Create new blog post" entry
                   (file+headline "~/dev/repos/netlify-src/org/conao3.org" "blog")
                   "** TODO %?
:PROPERTIES:
:EXPORT_FILE_NAME: %(apply #'format \"%s-%s-%s\"
        (format-time-string \"%Y\")
        (let ((sha1 (sha1 (shell-command-to-string \"head -c 1k /dev/urandom\"))))
          (cl-loop for (a b c d) on (cdr (split-string sha1 \"\")) by #'cddddr repeat 2 collect (concat a b c d))))
:EXPORT_HUGO_TAGS:
:EXPORT_HUGO_LASTMOD:
:END:
"))
    (add-to-list 'org-capture-templates
                 '("p" "Create new package post" entry
                   (file+headline "~/dev/repos/netlify-src/org/conao3.org" "emacs")
                   "** TODO %?
:PROPERTIES:
:EXPORT_FILE_NAME:
:EXPORT_HUGO_TAGS: emacs
:EXPORT_HUGO_LASTMOD:
:END:
"))))

p はパッケージの紹介用で emacs ツリー以下に展開されます。

b は簡単なブログ用で :EXPORT_FILE_NAME は「誕生日のパラドックスから考察する、個人ブログURLに必要なランダムビット数」をもとに8桁の16進数を使って自動生成します。

8桁の16進数は /dev/urandom から1KB読んで、それのsha1の先頭8桁のみを取ることにしました。 この乱数は衝突するときわめて面倒なことになるので、できるだけ均質なランダム値を得る必要があります。 この仕組みを作った後は衝突しないことをもう祈るしかない。。(もし衝突すると単に新しい記事で古い記事が上書きされて、特に警告は出ない。。)

まとめ

org-captureの設定をすることによってブログ記事を書くハードルがとても下がりました。

これから情報発信に努めていきたいと思います!