Happy Mashing Keyboard Life

Org ModeでWeblog(など)を書くことの利点とか

このWeblogはEmacsのOrg Modeで書き, ox-hugoでCommonMarkに, HugoでStatic HTMLに変換し, CloudflareとCloudinaryに面倒なところを丸投げさせていただいて配信している.

Org ModeでWeblog(やWeb日記)を書くことについて個人的に利点と思っているところ:

  • 当然ながらEmacs及びOrg Modeの強力な機能をフル活用できる.
  • one post per org subtreeの形で単一のファイルでサイト全体を管理でき, .org ファイルそれ自体がCMSとして機能する.
  • Quoting HTML tagsを使えば(力技で)大抵の厳密的な/妥当性の高いマークアップをカバーでき, HTML/セマンティックのオタクに(他のLight Weight Markup Languageと比較して, かなり)優しい.
    • Quoting HTMLは前後にスペースが不要なので, 日本語文で strongem を使いたいときに自然な形のまま書けるというのもある.

このWeblogの設定

参考程度に載せておく.

#+title: Happy Mashing Keyboard Life
#+hugo_base_dir: ../
#+hugo_section: posts
#+startup: show3levels
#+link: in-article https://res.cloudinary.com/sumadoratyper/t_in-article/
#+setupfile: tags.setup
  • show3levelsで各記事が一覧されるようにしている.
  • 画像用のリンクはエイリアスを使って書いてる. 別サービスに移行したいとき, ID/ファイル名さえ保持されていればエイリアスを修正するだけで済むので楽.
  • タグの一覧・階層はファイルを分けて読み込んでる(邪魔なので).
(leaf weblog.sumadoratyper.net
  :if (file-exists-p (expand-file-name "weblog.sumadoratyper.net/org/weblog.org" my:d:github))
  :config
  (defun my:org-hugo-weblog-capture-template ()
    (let* ((title (read-from-minibuffer "Post Title: "))
           (fname (sha1 (shell-command-to-string "head -c 1k /dev/urandom"))))
      (mapconcat #'identity
                 `(,(concat "* TODO " title " %(org-set-tags-command)")
                   ":PROPERTIES:"
                   ,(concat ":EXPORT_FILE_NAME: " fname)
                   ":END:"
                   "\n%?")
                 "\n")))

  (add-to-list 'org-capture-templates
               `("w" "weblog.sumadoratyper.net" entry
                 (file+datetree ,(expand-file-name "weblog.sumadoratyper.net/org/weblog.org" my:d:github))
                 (function my:org-hugo-weblog-capture-template)
                 :tree-type month :immediate-finish t :jump-to-captured t)))
  • ファイル名/URLは雑にsha1を渡して何も考えないでいいようにしている(どう考えてもやりすぎだけど).
  • 多分そんなに高頻度で書くことはないので :tree-type month としている.
  • Org Capture上でモノを書こうとすると C-c C-corg-capture-finalize に取られてて他の機能が使えなくなって困るので, :immediate-finish t :jump-to-capture t で直接ファイルを開いて編集するようにしている. どうせ書き終えた後にmagitでcommit/push等する必要あるからファイル開いた方が都合いいというのもある.

Tag Hierarchy

ox-hugoにはTag Hierarchyが実装されていて, これを使うと容易にDAGなタグが実装できる. こんな感じ:

# -*- mode: org; -*-
#+tags: meta hugo
#+tags: bjd mahoiku bluearchive
#+tags: [ typing : typewell etyping monkeytype ]
#+tags: [ otoge : bms ez2on djmax ]
#+tags: [ bms : lr2 beatoraja ]
#+tags: [ keyboard : qmk zmk ]
#+tags: [ emacs : orgmode elisp ]
#+tags: [ linux : archlinux ]
#+tags: [ programming : elisp ]

この場合, 例えば elisp のタグを付けた場合は emacs, programming の2つのancestorも自動で付与される. こういうのは単純な木構造の実装だとできないんだよな.

yasnippet

「HTML直書き」をする上で本当に直書きするのは怠いのでyasnippetを利用して入力している. こんな感じ:

# -*- mode: snippet -*-
# name : abbr
# key  : abbr
# --
@@html:<abbr title="$1">$2</abbr>@@$0
# -*- mode: snippet -*-
# name : ruby
# key  : ruby
# --
@@html:<ruby>$1<rt>$2</rt></ruby>@@$0

日本語の場合, 基本的にスペースを挟むことがない都合, Tabyas-expand できないので, yas-insert-snippetC-c i s にバインドして使うことにした. というかこっちの方が便利かも.

以前はOrg ModeのMacro Replacementを使って {{{ruby(天使の自動書記,ラブリーゴーストライター)}}} みたいな感じでHTML要素を書いていたこともあったが, 見た目的になんかキモかったのと柔軟性がない(属性が必要な場合に書き足せないとかそういうこと)のが理由でやめた.