2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Org モードの #+ から始まるキーワードの値の取り出し方

Last updated at Posted at 2020-11-05

はじめに

.org ファイルを HTML ファイルにエクスポートしたりする時に、#+TITLE: ...#+TOC: ... みたいな記述をすると、エクスポートされる HTML のファイルのタイトルを設定できたり、目次を挿入できたりする機能があります。

Jekyll の Markdown ファイルの Front Matter みたいな感じで、この機能を使って自分で勝手に作ったキーワードで、エクスポート時の挙動をカスタマイズできたりすると良いなと思い、ox.el を中心にソースを読みました。読んだ結果、キーワードの取り出し方がわかったので備忘録として記事にしておきます。

#+KEYWORD:

#+ から始まる文字列は、ソースを読む限りキーワードと命名されているっぽいです。なので、読み方わかってませんでしたが、#+TITLE: はタイトルキーワードと読めばいいんですね。余談でした。

org-element

ox.el のソースを読んでいたら、org-element.el の機能を使っている箇所が多々あり、キーワードを処理している部分も org-element.el にあるっぽい感じでした。

org-element.el は Org モードのパーサらしくて、Org 文書をパースするコマンドの他、Org Element API という形でバース後のオブジェクトの操作をいろいろ提供しているようです。(とは言え、パースされてできるオブジェクトはS式なので、なんとでも触れる)

ググったらドキュメントも見つかりました。

Org モードでいろんなことができるようになりそうなので、これは覚えておこうと思いました。

自分で適当に作ったキーワードの値を取りだす

下記のような感じの .org ファイル( /tmp/test.org )があったとします。

#+TITLE: Org モードの #+ から始まるキーワードの値の取り出し方
#+MYKEYWORD: 私のキーワード

* 私のキーワードのテスト
  取れるかな? 

以下のようなコードを書くと、("私のキーワード") という値が取得できます。

(with-current-buffer (find-file-noselect "/tmp/test.org")
  (org-element-map (org-element-parse-buffer) 'keyword
    (lambda (kwd)
      (when (equal (org-element-property :key kwd) "MYKEYWORD")
        (org-element-property :value kwd)))))

まとめ

この仕組みを使えば、Front Matter 的なことは実現できそうです。

副産物として org-element というパッケージの存在を知れたのですが、こちらの方が実りがあった気がします。
Org モードの AST(S式)と AST の操作ができるようになるので、Emacs と真面目に付き合うなら色々捗りそうです。

以上。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?