最新版のOrg-mode (8.0 preview)をOctopressと連携させる
たぶんこれでいけた。.emacsを編集して、かつRakefileをちょこっと変更する
だけ。基本方針は、File local variables を使って、ファイルを保存すると同
時にorg-modeからmarkdownに変換する。orgのファイルは
$octopress-root$/org/ に入れる。そしたら
$octopress-root$/source/_posts にmdファイルが移る。
Octopressでのブログ生成をEmacsからコマンド一発( M-x octopost など)でやれ
るようになっている。いちいちシェルを開くのもめんどくさい。正直、この程
度だとrakeの必要性がないというか、Emacs Lispとやれることが被ってるんだ
よね。依存関係とか無いし。しかも rake new_post[title] は作ったファイ
ル名を返してくれない。結局、作ったファイルを自動で開くようにするのは面
倒くさくてやらなかった。ただ、一応、フォルダを開くことにはしておいた。
また、 rake preview コマンドをバックグラウンドで自動で起動してくれる。
ただし、起動したバッファを自分で消さないとだめ。
最後に(ここまでする必要あるか?)、 M-x gen-dep で rake gen_deploy 相
当のものができる。
(defvar octopress-repo "~/repos/octopress/") ;; このアドレスは自由に変更可能
(defvar posts "source/_posts/")
(defvar org-source "org/")
(defvar octopress-export-org-to-md-enabled nil)
(defun org-md-try-to-export-to-markdown ()
  (interactive)
  (when octopress-export-org-to-md-enabled
    (let ((md (org-md-export-to-markdown)))
      (shell-command 
       (format "mv -f %s %s" 
               md (concatenate 'string octopress-repo posts))))))
(defun octopost (title)
  (interactive "sInput the new post title: ")
  (shell-command
   (format "cd %s;rake new_post[\"%s\"]" octopress-repo title))
  (octo-preview)
  (find-file (concatenate 'string octopress-repo org-source)))
(defun octopage (title)
  (interactive "sInput the new page title: ")
  (shell-command
   (format "cd %s;rake new_page[\"%s\"]" octopress-repo title))
  (octo-preview)
  (find-file (concatenate 'string octopress-repo org-source)))
(defun octo-preview ()
  (interactive)
  (shell-command
     (format "cd %s;rake preview &" octopress-repo)))
(defun gen-dep ()
  (interactive)
  (shell-command
   (format "cd %s;rake gen_deploy &" octopress-repo)
   (get-buffer-create "*Async Shell Command*"))
  (sleep-for 5)
  (kill-buffer "*Async Shell Command*"))
(add-hook 'after-save-hook #'org-md-try-to-export-to-markdown)
それで、それぞれのファイルの先頭に以下のように書く。
# -*- octopress-export-org-to-md-enabled : t -*-
もちろんそれは面倒臭い。なので、Rakefileで指定する。 変更点はざっとこんな感じ。 一部は Introducing Octopress Blogging for Org-Mode を参考にした。
diff --git a/Rakefile b/Rakefile
index d3a1cb0..827ebfe 100644
--- a/Rakefile
+++ b/Rakefile
@@ -23,8 +23,9 @@ deploy_dir      = "_deploy"   # deploy directory (for Github pages deployment)
 stash_dir       = "_stash"    # directory to stash posts for speedy generation
 posts_dir       = "_posts"    # directory for blog files
 themes_dir      = ".themes"   # directory for blog files
-new_post_ext    = "markdown"  # default new post file extension when using the new_post task
-new_page_ext    = "markdown"  # default new page file extension when using the new_page task
+org_posts_dir   = "org"
+new_post_ext    = "org"  # default new post file extension when using the new_post task
+new_page_ext    = "org"  # default new page file extension when using the new_page task
 server_port     = "4000"      # port for preview server eg. localhost:4000
@@ -98,13 +99,17 @@ task :new_post, :title do |t, args|
     title = get_stdin("Enter a title for your post: ")
   end
   raise "### You haven't set anything up yet. First run `rake install` to set up an Octopress theme." unless File.directory?(source_dir)
-  mkdir_p "#{source_dir}/#{posts_dir}"
-  filename = "#{source_dir}/#{posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}"
+  mkdir_p "#{org_posts_dir}"
+  filename = "#{org_posts_dir}/#{Time.now.strftime('%Y-%m-%d')}-#{title.to_url}.#{new_post_ext}"
   if File.exist?(filename)
     abort("rake aborted!") if ask("#{filename} already exists. Do you want to overwrite?", ['y', 'n']) == 'n'
   end
   puts "Creating new post: #{filename}"
   open(filename, 'w') do |post|
+    post.puts "# -*- octopress-export-org-to-md-enabled : t -*-"
+    post.puts "#+title: #{title.gsub(/&/,'&')}"
+    post.puts "#+date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
+    post.puts "#+begin_MD"
     post.puts "---"
     post.puts ""
     post.puts "title: \"#{title.gsub(/&/,'&')}\""
@@ -112,6 +117,7 @@ task :new_post, :title do |t, args|
     post.puts ""
     post.puts ""
     post.puts "---"
+    post.puts "#+end_MD"
   end
 end
@@ -140,6 +146,9 @@ task :new_page, :filename do |t, args|
     end
     puts "Creating new page: #{file}"
     open(file, 'w') do |page|
+      page.puts "#+title: #{title}"
+      page.puts "#+date: #{Time.now.strftime('%Y-%m-%d %H:%M')}"
+      page.puts "#+begin_MD"
       page.puts "---"
       page.puts "layout: page"
       page.puts "title: \"#{title}\""
@@ -148,6 +157,7 @@ task :new_page, :filename do |t, args|
       page.puts "sharing: true"
       page.puts "footer: true"
       page.puts "---"
+      page.puts "#+end_MD"
     end
とにかく動けばいいやって感じのhackだけど、まあこれでいいでしょ。快適だ し、わざわざファイル名を変えたりコピーしなくていいし。
注意点。org-modeはgitで取得した最新版(8.0-pre)。旧来のexporterが使えな
くなっているので注意。exportのメニュー画面がだいぶ変更されている。雑然
としていたいままでのexport画面が改良されているのはいい感じだな。
そもそも、今回のこれをやり始めたきっかけは、 org-mode を新しくしたら
 orgmode-markdown が使えなくなっていたこと。その主な理由は、
orgmode-markdown の依存している org-export-generic が、最新版では
消去されているから。どうやら、一度oldextフォルダに移されて、しばらくし
たらその全体が消されたようだ。
さて、次の記事は卒論からポートしてきた CL-RRT か、それとも Yet
Another オレオレLisp入門かな…。