Thanks Driven Life

日々是感謝

Emacs Lisp で TOML Parser 書いてみた

gongo/emacs-toml · GitHub

だいたい json.el っぽく。 escape sequence の所とか特にそれっぽいですね。インスパイヤ

  • TravisCI の設定は tkf/emacs-plugin-template · GitHub を参考にしました
  • MELPA には 申請済み
    • 9/4追記 承認されました。 M-x package-install emacs-toml でインストールできます
  • TOML 本家の README にも 記載申請済み 。他の PR も溜まってるっぽいのであまり期待できず
    • 9/23追記 マージされた。README に載った!!

とりあえず (toml:read) (toml:read-from-string) (toml:read-from-file) でどうにかできます

(toml:read-from-string "\
# This is a TOML document. Boom.

title = \"TOML Example\"

\[owner\]
name = \"Tom Preston-Werner\"
organization = \"GitHub\"
bio = \"GitHub Cofounder & CEO\\nLikes tater tots and beer.\"
dob = 1979-05-27T07:32:00Z # First class dates? Why not?

\[database\]
server = \"192.168.1.1\"
ports = \[ 8001, 8001, 8002 \]
connection_max = 5000
enabled = true

\[servers\]

  # You can indent as you please. Tabs or spaces. TOML don't care.
  \[servers.alpha\]
  ip = \"10.0.0.1\"
  dc = \"eqdc10\"

  \[servers.beta\]
  ip = \"10.0.0.2\"
  dc = \"eqdc10\"

\[clients\]
data = \[ \[\"gamma\", \"delta\"\], \[1, 2\] \]

# Line breaks are OK when inside arrays
hosts = \[
  \"alpha\",
  \"omega\"
\]")

;; =>  '(
;;        ("clients"
;;          ("hosts" "alpha" "omega")
;;          ("data" ("gamma" "delta") (1 2)))
;;        ("servers"
;;          ("beta" ("dc" . "eqdc10") ("ip" . "10.0.0.2"))
;;          ("alpha" ("dc" . "eqdc10") ("ip" . "10.0.0.1")))
;;        ("database"
;;          ("enabled" . t)
;;          ("connection_max" . 5000)
;;          ("ports" 8001 8001 8002)
;;          ("server" . "192.168.1.1"))
;;        ("owner"
;;          ("dob" 0 32 7 27 5 1979)
;;          ("bio" . "GitHub Cofounder & CEO\\nLikes tater tots and beer.")
;;          ("organization" . "GitHub")
;;          ("name" . "Tom Preston-Werner"))
;;        ("title" . "TOML Example"))

generator もやろうと思ったんですが、もう parser で燃え尽きた。Parser めんどくさい。

ちなみに何で作ったのかと言うと、職場の開発チームで serverspec とか puppet の設定ファイルに TOML ファイルを使っていて、それで TOML ファイルの存在を知ったのですが 「emacs の設定ファイル toml で書くとどうだろう」って思いついてまずは!ってことで パーサー書いてみたんですが、Emacs だったら普通に S 式で書けよって思いました。