記事を作成する際、下準備があってなかなか本題に入れなかったりする。
それが障壁になって記事を作成するのが億劫になってしまったりする。
書く気になったときに書けるよう、環境を整えたい。

悩み

  • (前提条件)ox-hugoを使ってサブツリー形式で記事を書いている。
  • フロントマターを毎回入力するのは面倒なので、ベースとなる記事からコピペしてタイトルやファイル名を書き直さないといけない。
  • もっと記事の内容に集中したい。

解決方法

思い立ったときにすぐにメモを取れるorg-capture。
org-caputureでox-hugo用のテンプレートを作ることですぐに記事作成できるようにする。

Emacsの設定ファイルに以下を追加。

  (with-eval-after-load 'org-capture
  (defun org-hugo-new-subtree-post-capture-template ()
    "Returns `org-capture' template string for new Hugo post.
See `org-capture-templates' for more information."
    (let* ((title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
           (fname (org-hugo-slug title)))
      (mapconcat #'identity
                 `(
                   ,(concat "* TODO " title)
                   ":PROPERTIES:"
                   ,(concat ":EXPORT_FILE_NAME: " fname)
                   ":END:"
                   "%?\n")          ;Place the cursor here finally
                 "\n")))

  (add-to-list 'org-capture-templates
               '("h"                ;`org-capture' binding + h
                 "Hugo post"
                 entry
                 (file+olp "~/myorgdir/subtree.org" "Emacs")
                 (function org-hugo-new-subtree-post-capture-template))))

org-captureをC-c cに割り当てていない場合は以下も設定ファイルに追加しておこう。

(global-set-key (kbd "C-c l") #'org-store-link)
(global-set-key (kbd "C-c a") #'org-agenda)
(global-set-key (kbd "C-c c") #'org-capture)

C-c cを押すとorg-captureが起動し、メニューが出てくるので今回新しく追加した h(Hugo post)を選択する。
ミニバッファに Post Title: と聞かれるので試しに テスト と入力する。
するとsubtree.org(Emacsの見出しはあらかじめ作成しておく必要がある)に次のように追加される。

* Emacs                                                              :@Emacs:

** 記事1...
** 記事2...
** TODO テスト
:PROPERTIES:
:EXPORT_FILE_NAME: テスト
:END:

これはこれで便利だが、ファイル名は英語で書きたいとか、フロントマターを書いてしまうとox-hugoが自動でmdファイルをエクスポートする設定にしているので任意のタイミングでフロントマターを書きたい場合もある。
org-captureの良さはEmacsで何の作業をしていてもC-c cで指定ファイルの指定場所に書き込めるところだ。
org-captureでは最低限 TODO タイトル名 を追記するにとどめておき、その後は定型文入力用のパッケージであるyasnippetを使ってフロントマターを入力したい。

Emacsの設定ファイルで、さきほど追記したところで不要部分をコメントアウト。もちろん削除してもいい。

  (with-eval-after-load 'org-capture
  (defun org-hugo-new-subtree-post-capture-template ()
    "Returns `org-capture' template string for new Hugo post.
See `org-capture-templates' for more information."
    (let* ((title (read-from-minibuffer "Post Title: ")) ;Prompt to enter the post title
           (fname (org-hugo-slug title)))
      (mapconcat #'identity
                 `(
                   ,(concat "* TODO " title)
;                   ":PROPERTIES:"
;                   ,(concat ":EXPORT_FILE_NAME: " fname)
;                   ":END:"
                   "%?\n")          ;Place the cursor here finally
                 "\n")))

  (add-to-list 'org-capture-templates
               '("h"                ;`org-capture' binding + h
                 "Hugo post"
                 entry
                 (file+olp "~/myorgdir/subtree.org" "Emacs")
                 (function org-hugo-new-subtree-post-capture-template))))

そして新規にスニペット(定型文)を登録する。
M-x yas-new-snippet すると以下の画面になる。org-mode時がおすすめ。

# -*- mode: snippet -*-
# name: 
# key: 
# --

例えば以下の通り入力する。

# -*- mode: snippet -*-
# name: ox-hugo front matter
# key: fm
# --
:PROPERTIES:
:EXPORT_FILE_NAME: ${1:filename}
:EXPORT_HUGO_CUSTOM_FRONT_MATTER: :url "/${1}/"
:EXPORT_HUGO_CUSTOM_FRONT_MATTER+: :cover '((image .  "/img/${1}.png"))
:END:
$0

keyはfmとした。この場合、 fm と入力してTABキーを押すと下のものに置換される。

EXPORT_FILE_NAMEで入力したものがurlやcoverでも再利用される。
保存するときにorg-modeフォルダに保存しよう( ~/.emacs.d/snippets/org-mode/)
org-mode時に M-x yas-new-snippet していればデフォルトの保存先としてorg-modeフォルダになっているはずだ。

これでいつでも記事を作成したいときには以下の手順でできるようになった。

  1. C-c c h で記事のタイトルを入力
  2. fm TAB でファイル名を入力
  3. 内容を記載

参考

ox-hugo - Org Capture Setup
orgmode 10.1.3 Capture templates

確認環境

Ubuntu 24.04
Emacs 30.2
Org mode version 9.7.11
ox-hugo 0.12.2
yasnippet 20250602.1342