最新版のOrg-mode (8.0 preview)をOctopressと連携させる

Tagged as old-blog , octopress
Written on

たぶんこれでいけた。.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-deprake 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入門かな…。