Intro
下記のブログの記事で考えて、ようやく記事を新規作成するために必要な情報が整いました。
- 「Netlify + Hugo + ox-hugoでブログを初める第一歩」
- 「個人ブログのパーマリンクに関する最適戦略について」
- 「誕生日のパラドックスから考察する、個人ブログURLに必要なランダムビット数」
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の設定をすることによってブログ記事を書くハードルがとても下がりました。
これから情報発信に努めていきたいと思います!