Skip to main content
  1. Posts/

Org インラインタグへの移行と Ox-Hugo 検証

·2560 words·6 mins

ブログのタグ付けを EXPORT_HUGO_TAGS プロパティではなく Org のインラ インタグに寄せたい、という話を Claude に相談した。アップロードした README.org を見てもらったところ、実は personal/ac1965.el (tangle 先)側 にすでに実装済みだった。以下、その回答をそのまま引用する。

AIとの質疑応答:Ox-Hugo タグの仕組み

アップロードいただいた README.org を確認したところ、この件 はすでに personal/ac1965.el(tangle 先)内に実装済みの仕組みがあります。 該当箇所(11157–11234行目)に沿って整理します。

1. タグの記法そのもの

Org の見出し(エントリー)行では、タグは行末にコロン区切りで直接埋め込み ます。

* TODO 記事タイトル :emacs:org-mode:

これは Org のネイティブ構文で、EXPORT_HUGO_TAGS のような PROPERTIES ドロワーへの記述とは別物です。ox-hugo はこの見出しのインラインタグを、 :EXPORT_HUGO_TAGS: プロパティが未設定の場合に限りそのまま Hugo の TOML フロントマターの tags に変換します。あなたの設定ではまさにこ の経路を使うために、“b”(Blog post)テンプレートから :EXPORT_HUGO_TAGS: %^{Tags} の入力欄を意図的に外しています(二重入力を避けるため、 11201–11232行目のコメント参照)。

2. 既存タグ補完付きで設定するコマンド

手で :tag: を打つ代わりに、ac1965/org-hugo-set-tags を使います。

ac1965--org-hugo-tag-alist-from-buffermy:f:capture-blog-file(= all-posts.org)を org-map-entries で走査し、 過去に使われた全インラインタグを収集それを org-tag-alist として束縛した状態で org-set-tags-command を呼ぶ結果、C-c C-c 相当の対話操作で、 既存タグの補完候補付きにタグ付けできる

キーバインドは M-SPC o g(ui-leader-o-map"g")に割り当て済みで す。

3. 新規記事キャプチャ時の自動化

org-capture-before-finalize-hookac1965--org-capture-set-blog-tags が登録されており、テンプレートキー が "b" のキャプチャを確定する直前に自動で ac1965/org-hugo-set-tags が呼ばれます。before-finalize(after-finalize ではなく)である点がポ イントで、これによりタグ付けが完了した状態で orgx-auto-hugo の自動エ クスポートが走り、ox-hugo が正しくタグを front matter に反映します。

まとめ

| 操作 | 方法 | —|—|既存記事に手動でタグ追加 | 見出し行末で M-SPC |o g(補完付き) |素朴な Org 標準コマンド | org-set-tags-command(補完 |対象は現バッファの見出しのみ) |新規ブログ投稿キャプチャ時 | 確定前に |自動でタグ入力プロンプトが出る(フック経由) | ox-hugo への反映 | |EXPORT_HUGO_TAGS は未設定のまま、見出しのインラインタグがそのまま |tags フロントマターになる |

補足として、複数の投稿で表記揺れ(例: emacsEmacs)が起きると ac1965--org-hugo-tag-alist-from-buffer の補完候補が分岐して増殖する ため、タグの命名規約(小文字統一・ハイフン区切りなど)を all-posts.org の先頭にコメントで残しておくと運用が安定します。

仕組みが分かったところで、実際に既存記事のタグを移行する作業も Claude 側にやってもらった。全81種のユニークタグがそのまま Org のタグ構文を通 るかどうかを機械的に検証してもらい、52記事あった EXPORT_HUGO_TAGS の うち51件をインラインタグへ移す、という内容だ。実機検証の結果は以下の通 り。

AIによる移行・検証レポート

Org のタグ構文で全81種のユニークタグが実際に通るか、Emacs で機械的に検 証します。冒頭の投稿生成テンプレート指示も、新しい方式に合わせて更新し ます。52記事あった EXPORT_HUGO_TAGS プロパティのうち51件をインライン タグへ移行しました。実際に Emacs 29.3 + Org 9.6.15 をコンテナ内にイン ストールし、変換ロジックを実機検証した上での結果です。

移行前に判明した制約(実機検証)

Org のインラインタグはハイフンを許容しません(Org 公式マニュアル: タグ に使えるのは英数字・_@#% のみ)。既存タグには Ox-Hugo(5 件)・ISO-ImageLiterate-ProgrammingClaude-APIsNative-CompilationCOVID-19Org-Mode と、ハイフン入りが7種あり ました。

幸い ox-hugo 側に対応機構があり、org-hugo-prefer-hyphen-in-tags(既定 t)により インラインタグの単一アンダースコアは書き出し時に自動でハイ フンへ復元されます(Ox_HugoOx-Hugo)。ox-hugo 本体のソースから該 当関数を取り出し、全81種のユニークタグで「ハイフン→アンダースコア変換 → Org タグとしてparse → ox-hugo変換関数で復元」のラウンドトリップを 検証し、1件を除き完全一致を確認しています。

例外1件: そのまま残した記事

『中尾幸世 四季・ユートピアノ』のタグ行のみ、「・」(U+30FB)が Org タグ 構文で使えず inline化できないため、:EXPORT_HUGO_TAGS: プロパティのま ま残し、直前に理由をコメントで残しました。

その他の変更

  • Org-mode / Org-Mode の表記揺れ(3箇所)→ Org-Mode に統一冒頭の
  • AI投稿生成プロンプト(#+begin_quote 内のテンプレート)を、
  • EXPORT_HUGO_TAGS を書く旧方式からインラインタグ方式に更新(今後の新
  • 規記事もこの方式で生成されるように) EXPORT_HUGO_CATEGORIES は今回
  • のスコープ外として一切変更していません

検証

  • 移行後ファイルを Org として全走査(250見出し)してエラー0件
  • EXPORT_HUGO_BUNDLE(UUID)をキーに新旧52記事のタグ内容を突き合わせ、
  • 不一致0件

気づいた点(今回のタスクとは別件)

ファイル末尾に本文もタグもない空の TODO aa 見出し (EXPORT_HUGO_BUNDLE: 85E1DE12-...)があります。今回の移行対象外として 触れていませんが、意図しない下書きの可能性があるため、必要であれば削除 をご検討ください。

次のステップの提案

M-SPC o g(ac1965/org-hugo-set-tags)の補完候補は今後この inline タ グから正しく拾えるようになります。実際にコミットする前に、C-c C-e H A(:all-subtrees)で再エクスポートし、生成される Markdown の front matter が移行前と同じ tags = [...] になっているか(特に Ox-Hugo な ど元ハイフン付きタグ)を一度実機で確認されることをお勧めします。

というわけで、タグ付けの仕組みそのものは README.org 側にすでに書いてあっ たが、実際に81種のタグでラウンドトリップ検証までやってもらったのは今回 が初めてだ。「・」が唯一の例外として残った点と、末尾に放置された空の TODO aa 見出しの存在は、次回の掃除タスクとして覚えておきたい。

Related