2014年2月10日月曜日

org-mode で blog 編集

Blogger の HTML 編集はとてもブラウザ上では厳しいので、Emacs 上で編集するための 仕組みを考えた。Emacs に付属の org-mode はアウトライン記述したテキストデータから HTML を出力する機能を備えているのでこれを利用する。

*.org のようなファイルに適当に文章を書いて、C-c C-e を実行すると他のテキスト形式 に変換することができる。例えば b を押すと HTML に変換されたテキストがブラウザ上 にプレビューされる。

ただし、このままでは目次や著者情報がそのまま表示されてしまうので、 以下の設定をテキストにあらかじめ記述しておく。

#+TITLE: org-mode で blog 編集
#+OPTIONS: title:nil toc:nil \n:nil num:nil author:nil creator:nil f:nil
#+TAGS: Emacs

最後の f:nil はテキスト中の数字を含むブラケット([])が footnote として 解釈されてしまうことを防ぐために指定している。 例えば配列のインデックスを書いたつもりで proc[1] と書いても [1] が footnote として解釈されてしまう。 (実はこの方法がわからず解決までかなり時間がかかってしまった、というのは内緒。 Emacs のディレクトリにある lisp/org/org-ext.el の org-export-with-footnotes というカスタム変数の定義にあるコメントを偶然見つけて気づいた・・・。)

以下に示すように、HTML への変換から Blogger に張り付ける部分のコピーまでを 自動的に行うための Emacs Lisp を書いた。

;; コードブロックをモードと同じ色でハイライト
(setq org-src-fontify-natively t)
;; "*" の h4 にする(Blogger の設定の都合)
(setq org-export-html-toplevel-hlevel 4)
(require 'noflet)
(require 'smartparens)
(defun export-html ()
  "Publish HTML file and copy it into clipboard."
  (interactive)
  (let ((buf (buffer-name)))
    ;; org-export の中で read-char-exclusive が ?H を返すように一時的に動的束縛
    ;; 新規ウィンドウが作成されないように switch-to-buffer-other-window を動的束縛
    (noflet ((read-char-exclusive () ?H)
             (switch-to-buffer-other-window (arg) (switch-to-buffer arg)))
      (org-export))
    (switch-to-buffer buf))
  ;; *Org HTML Export* バッファから Blogger に張る部分の HTML をコピーする
  ;; HTML のパースには smartparens を使用
  (with-current-buffer "*Org HTML Export*"
    (search-forward "<div id=\"content\">")
    (search-backward "<")
    (sp-kill-sexp nil 'yank)))
;; 適当なキーに割り当てる
(org-defkey org-mode-map "\C-ce" 'export-html))

まあ、この方法でも先頭に <h1 class="title"> タグが挿入されてしまうのだけれど、 タイトル欄にカット & ペーストするためにそのままでもよいかなと思っている。 一度タイトル欄に入力した後は、微修正のために毎回 publish する度に、 手作業で削除する羽目になるのだけれど。

一応、先日の howm と org-mode の連携方法を利用して Emacs 上でブログの執筆から 管理までを行えるようになった。howm 化することで一覧表示や検索が容易になるのが うれしい。

2014年2月9日日曜日

howm と org-mode の連携

howm のメモを org-mode でアウトライン的にするための tips など。 howm は 1.4.2、org-mode は Emacs 24.3 を使用した。

(require 's)
(require 'f)
;; howm を展開した場所(任意)に load-path を通す
(add-to-list 'load-path 
             (f-expand (s-concat user-emacs-directory "site-lisp/howm-1.4.2")))
;; *.org を開いたら howm-mode も起動する
(add-hook 'org-mode-hook 'howm-mode)
;; メニューの言語設定
(setq howm-menu-lang 'ja)
;; howm のメモを置くディレクトリ(任意)
(setq howm-directory (f-expand (s-concat user-emacs-directory "howm")))
;; howm ファイル名を設定する。org-mode を起動するため拡張子は .org にする。
(setq howm-file-name-format "%Y/%m/%Y-%m-%d-%H%M%S.org")
(require 'howm)

C-c , c で howm-create を実行すると自動的に org-mode になっているので、 org-mode のメモをアウトライン表記で記入するのみ。