ブログのタグ付けを 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-buffer が
my: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-hook に
ac1965--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 フロントマターになる |
補足として、複数の投稿で表記揺れ(例: emacs と Emacs)が起きると
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-Image・Literate-Programming・Claude-APIs・
Native-Compilation・COVID-19・Org-Mode と、ハイフン入りが7種あり
ました。
幸い ox-hugo 側に対応機構があり、org-hugo-prefer-hyphen-in-tags(既定
t)により インラインタグの単一アンダースコアは書き出し時に自動でハイ
フンへ復元されます(Ox_Hugo → Ox-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 見出しの存在は、次回の掃除タスクとして覚えておきたい。



