Emacsのorg-modeには多様な文書形式 (PDF, OpenDocument, markdown, ePubなどなど) に対応した豊富なエクスポート機能があります。エクスポート形式に合わせて出力を調整する必要がありますが、それらの設定はinit.elなどのEmacsの初期設定ファイルに記述するのは一般的です。しかし、エクスポート設定は文書ごとに設定し、文書と一緒に管理できたほうが便利だと思います。この記事では、エクスポート設定ファイルを出力元のorg文書と同じディレクトリにおく方法を示します。
エクスポート設定の課題
org-modeでのエクスポートでは、文書の種類や目的に応じて設定を調整する必要があります。通常、これらの設定はinit.elに記述しますが、多様なエクスポートに対応するうちにファイルが肥大化し、管理が煩雑になります。また、設定変更のたびにEmacsを再起動する必要があり、効率が悪いです。あまり長大になると起動時間にも影響しそうです。
org-export-async-init-file を使った非同期エクスポート
init.elの肥大化を防ぐ解決策が非同期エクスポートです。init.elとは別にエクスポート設定を記述したファイル (org-export-async-init-file) 用意して、バックグラウンドでエクスポートを行えます。これなら設定を変える度にEmacsを再起動してinit.elを再読み込みする必要もないし、エクスポート中に他の作業を進めることができる利点もあります。非同期エクスポートのためにはinit.elに以下の二つの変数を設定します。
(setq org-export-in-background t)
(setq org-export-async-init-file "/path/to/your/init/file")
async-init-fileを文書ごとに切り替えたい
しかし、エクスポート設定をinit.elから分離したとしても、org-export-async-init-fileも、多様なエクスポート設定を追加していくと結局はorg-export-async-init-fileが長くなり、管理が煩雑になってしまいます。それに、実際のエクスポートのプロセスでは、その長大な設定の中のたったひとつしか使わないのです。なのにすべての設定を含めたorg-export-async-init-fileを参照するのは無駄に思えます。
そもそも、org文書をどの文書タイプにどのようにエクスポートするかの設定は、中央管理するより、むしろ文書ごとに切り替えたいのが普通じゃないでしょうか。文書と一緒にエクスポート設定を同じディレクトリで管理できればとても便利です。
.dir-locals.elを使えば、それが可能です。.dir-locals.elは、特定のディレクトリ内のファイルに適用されるEmacsのローカル設定を定義するためのファイルです。このファイルに書かれた設定は、そのディレクトリ内のすべてのファイルを対象とし、個別のプロジェクトやフォルダごとに異なる設定を適用する際に便利です。ここに、次のように書くと、ディレクトリ直下の org-export-async-init.el というファイルが、同じディレクトリにあるorgファイルのエクスポート設定ファイルとして指定されます。
((org-mode
(org-export-in-background . t)
(eval . (setq org-export-async-init-file
(expand-file-name "org-export-async-init.el" (file-name-directory (or load-file-name buffer-file-name)))))))
こうしてエクスポート設定を文書と紐付けて管理すれば、その文書に対して不要な設定を書かずにすむので設定ファイルが短くなり、視認性が高まります。また、文書のポータビリティが増します。