2012年10月7日日曜日

howm+org(日記)

 howmで文書管理していてひとつ、こまったことがあった。
 1メモ1ファイルなのは基本、問題ないのだが、中には1日1ファイルにしたい場合があったのだ。たとえば、日記のような文書。どちらかを選ぶことはできるのだが、混在というのはできないようだった。もしかしたら最新版のバージョンではできるのかもしれないが。
 とりあえず、1日1ファイルのものだけ、Org-modeにしてagendaに登録したい、という思いもあったので、C-c , dのキーを次のようにアサインした。
(require 'howm)
(require 'skk)
(require 'cl)
(require 'org)
(require 'calendar)

(global-set-key
 "\C-c,d"
 '(lambda ()
    (interactive)
    (let* ((howm-file-name-format "%Y/%Y-%m-%d.org" )
       (file-target (concat howm-directory (howm-file-name))))
      (if (file-exists-p file-target)
      (find-file file-target)
    (progn
      (howm-create-file-with-title
       (concat "Diary:" (skk-current-date)))
      (save-excursion
        (goto-char (point-min))
        (insert-string "-*- mode:org; mode:iimage -*-\n")
        (insert-string "#+TAGS: DVD(d) BOOK(b) HOME(h) NET(n) COMPUTER(c) IDEA(i) MEMO(m) SHOP(s)\n")
        (insert-string "#+STARTUP: hidestars\n#+STARTUP: showall\n")
        (org-mode)
        (org-agenda-file-to-front))))
      (toggle-truncate-lines)
      (goto-char (point-max)))))
  これで、C-c , dとすると、その日の日記文書が自動的に開く、というわけ。
 予定とか、TODOをちょこちょこいれていくと、自動的にagendaに登録されているので、Org-modeのagendaを開くと参照できる。まぁ、日替わりのremenberファイルみたいなものか。
 agendaはorg-export-icalendar-combine-agenda-filesで出力してDropbox->Calendar for iPadで同期しているのでiPadで見ることもできる。もちろんMobileOrgにも同期している。
 唯一の問題は1年間に300以上のファイルがagendaに登録されてしまうので重くなってしまう、ということだろう。これについては一応、スィーププログラムをつくって対処している。

(require 'cl)
(require 'org)

(defun y-org-agenda-remove-file ()
  "org-agenda-filelistの中でorgが有効になっていないものを除外する"
  (interactive)
  (loop for filename in (copy-list org-agenda-files)
    collect (save-window-excursion
          (let ((buf (find-file filename)))
            (when (not (y-exits-string-buf buf "^\*"))
              (with-current-buffer buf
            (org-remove-file)))))))

(defun y-exits-string-buf (buffername string)
  "バッファの中にstringが存在するか"
  (with-current-buffer buffername
    (goto-char (point-min))
    (search-forward-regexp string nil t nil)))