org-mode 厨のみなさん、こんにちは。
るびきちです。

予定表TODO管理org-agenda を使っていますか?

Emacs標準機能でありながら、超高機能でやばいです。

複数のorgファイルの情報を1つのバッファにまとめてくれるから、
いろんなファイルにTODOを書いていても見逃さなくなります。

これはこれで嬉しいのですが、たった一つの大きな欠点がります。

めちゃくちゃ動作がトロイ!!!

所詮インターフェース記述言語のEmacs Lispで
処理されているから仕方ないとはいえ、
高々テキスト処理にCore i7で1秒以上待たされるのはたまりません。

原因はorg-agendaをqで終了するときに
バッファを削除してしまうので
毎回再生成していることです。

そこで、*Org Agenda*バッファを保持(キャッシュ)することで
一瞬でagendaを表示させます。

実用上agendaは毎回更新する必要はなく、
たいていの場合はほぼ同じ内容です。

ここで定義する M-x org-agenda-cache は前回のagendaを表示します。

C-u M-x org-agenda-cacheで再生成して表示します。

あるいは、agenda上でgを押して更新することもできます。

org-agendaは元々は org-agenda-custom-commands 変数で
複数の設定を使い分けるように意図されていますが、
M-x org-agenda-cacheを使うことで、予定関係の情報すべてを
すべて表示させる運用方法が可能になります。

Happy org life!!

設定 141129034417.org-agenda-cache.el(以下のコードと同一)

(require 'org-agenda)
(setq org-agenda-custom-commands
      '(("a" "Agenda and all TODO's"
         (;; 2週間の予定
          (agenda "" ((org-agenda-span 14)
                      (org-agenda-show-log nil)
                      (org-agenda-clockreport-mode nil)))
          ;; 今日の予定・行動記録
          (agenda "" ((org-agenda-span 1)
                      (org-agenda-show-log 'clockcheck)
                      (org-agenda-clockreport-mode t)))
          (alltodo "")))))
(defun org-agenda-cache (&optional regenerate)
  "agendaを更新せずに表示する。"
  (interactive "P")
  (when (or regenerate (null (get-buffer "*Org Agenda*")))
    ;; "a" は org-agenda-custom-commands で常用する文字
    (setq current-prefix-arg nil)
    (org-agenda nil "a"))
  (switch-to-buffer "*Org Agenda*")
  (delete-other-windows))
;;; そもそもqで*Org Agenda*を殺しているのが悪い!
(define-key org-agenda-mode-map (kbd "q") 'quit-window)

実行方法

$ wget http://rubikitch.com/f/141129034417.org-agenda-cache.el
$ emacs -Q -f package-initialize -l 141129034417.org-agenda-cache.el

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。