pp-eval-last-sexp
など、頭に"pp-"が付く関数を利用するとS式を分かりやすく表示できる("pp" は pretty print の略で、pp.el の中にいくつかの関数が定義されている)。
たとえば、Emacsの xml-parser を使ってこのブログのフィードXMLをS式に変換したとする。それを単純に表示すると、次のように一行に出力されてとても分かりにくい。
((feed ((xmlns . "http://www.w3.org/2005/Atom") (xmlns:openSearch . "http://a9.com/-/spec/opensearch/1.1/") (xmlns:georss . "http://www.georss.org/georss") (xmlns:thr . "http://purl.org/syndication/thread/1.0") (xmlns:gd . "http://schemas.google.com/g/2005") (xmlns:feedburner . "http://rssnamespace.org/feedburner/ext/1.0") (gd:etag . "W/\"DkQHRn8yfip7ImA9WhZRGUo.\"")) (id nil "tag:blogger.com,1999:blog-7510134520604525369") (updated nil "2011-04-17T02:18:57.196+09:00") (title nil "Technical Memorandum") (subtitle ((type . "html")) "備忘録") 以下略…
一方、 pp-* を使った場合には、次のように表示される。
((feed
((xmlns . "http://www.w3.org/2005/Atom")
(xmlns:openSearch . "http://a9.com/-/spec/opensearch/1.1/")
(xmlns:georss . "http://www.georss.org/georss")
(xmlns:thr . "http://purl.org/syndication/thread/1.0")
(xmlns:gd . "http://schemas.google.com/g/2005")
(xmlns:feedburner . "http://rssnamespace.org/feedburner/ext/1.0")
(gd:etag . "W/\"DkQHRn8yfip7ImA9WhZRGUo.\""))
(id nil "tag:blogger.com,1999:blog-7510134520604525369")
(updated nil "2011-04-17T02:18:57.196+09:00")
(title nil "Technical Memorandum")
(subtitle
((type . "html"))
"備忘録")
(link
((rel . "http://schemas.google.com/g/2005#feed")
(type . "application/atom+xml")
(href . "http://dminor11th.blogspot.com/feeds/posts/default")))
以下略…
だいぶ分かりやすくなりました。
上の例を作るために使用したプログラム
xml-parse-region
が返すオブジェクトを、pp-to-string
で整形。
;; wgetプロセスの番兵(process sentinel)を定義しておく
(defun wget-callback (process event)
(switch-to-buffer (process-buffer process))
(end-of-buffer)
(save-excursion
(insert (pp-to-string (xml-parse-region (point-min) (point-max))))))
=> wget-callback
;; 非同期プロセスとして wget を実行
;; バッファ *wget* に結果を出力
(let ((proc
(start-process
"wget"
"*wget*"
"/usr/local/bin/wget"
"-qO-"
"http://feeds.feedburner.com/TechnicalMemorandum?format=xml")))
(set-process-coding-system proc 'utf-8-dos 'utf-8-dos)
(set-process-sentinel proc 'wget-callback))
=> wget-callback
なお、外部プロセスとしてwgetを呼び出しているので、wgetがインストールされていない場合やパスが異なる場合は動かないと思われる。