記事の Org file にリンクを貼る
せっかく ox-hugo で記事を書いているので、Hugo記事のソースとなる orgfile を明示したい。
毎度手動でそのリンクを生成するのは面倒なので、マクロで実現してみる。
まず、マクロから呼び出す関数を書く。
(defun org-hugo-get-link-to-orgfile (uri alt)
"Return a formatted link to the original Org file in GitHub."
(let ((line (save-excursion
(save-restriction
(unless (org-at-heading-p)
(org-previous-visible-heading 1))
(line-number-at-pos)))))
(concat "[[" uri (file-name-nondirectory (buffer-file-name))
"#L" (format "%d" line) "][" alt "]]")))
で、これを、編集中の orgfile の #+macro
で使う。こんな感じ。
#+macro: srclink (eval (org-hugo-get-link-to-orgfile "https://github.com/takaxp/blog/blame/master/entries/" "see Orgfile"))
第一引数を、ソースを配置するサイトのURI。ファイル名の直前までを指定する。スラッシュを忘れずに。
第二引数に、HTML上で表示されるリンク名を指定する。
そして、記事の執筆時に、以下を埋め込めば、対応するソース(行単位)に転送してくれるリンクがエクスポート時に勝手に埋め込まれる。
{{{srclink}}}
しばらくこれで運用してみる。
Updated (2018-09-04@00:44)
このアプローチだと不十分とわかった。同じファイルの別箇所を編集したときに、headingの行がズレるが、このマクロが含まれているすべての subtree を更新しなければそのズレを反映させられない。クマッタ…
Updated (2018-10-09@01:05)
基本的に新しい記事は当該文書の末尾に追加される。したがって、通常の運用であれば、 srclink
の値は変更する必要がない。新規記事の追加以外で行番号の更新がある場合は、全記事を再出力すればよい。
しかし、 org-hugo-auto-set-lastmod
が有効な場合は、全記事の最終更新日が更新されることになる。これを防ぐために、このオプションは nil
にしてから、 C-c C-e H A
を実行すればよい。
それでも非効率な方法なので、継続改善が必要。