Agenda 関係の設定

概要

org-mode の素晴らしい機能の1つに Agenda というものがある。

これは色々な org ファイルに散らばった情報を1つのビューに表示するための機能で、使いこなすとファイルがバラけていてもいい感じに情報が抽出できて便利なやつ。

まあ麦汁さんはまだ使いこなせてないけど。

それでもいくつか Agenda 用の View を用意したりして日常業務に役立てている。

org-super-agenda のインストール

org-mode のデフォルトの agenda だと表示周りが物足りなかったので org-super-agenda を導入している。

(el-get-bundle org-super-agenda)

週の始まりを日曜日に設定

麦汁さんは週のスタートを日曜日とする派なので org-agenda の週の始まりも日曜日に設定している

(custom-set-variables
 '(org-agenda-start-on-weekday 0))

1日単位をデフォルト表示に設定

1週間表示よりも「今日って何するんだっけ」みたいな使い方が多いので 1日を表示単位としている。

(custom-set-variables
 '(org-agenda-span 'day))

週単位で何をするかについては今のところ記憶力で対応している。

あと、基本的にカスタムビューを使ってるのでこれの影響は受けてるかどうか微妙。

agenda の対象ファイルを指定

org-agenda を使う時に抽出対象とする org ファイルを指定している。

(custom-set-variables
 '(org-agenda-files '("~/Documents/org/gcals/mugijiru.org" "~/Documents/org/tasks/")))

agenda の表示周りの設定

agenda に時間の区切りを入れない

org-agenda-use-time-grid を t にしていると 10:00 とかのキリがいいところに区切り線を表示してくれるのだが日報提出時には邪魔だし、普段使いでもその区切り線はあっても邪魔っぽいので nil にして表示しないようにしている。

(custom-set-variables
 '(org-agenda-use-time-grid nil))

ブロック間の区切り表示

ブロックとブロックの区切りをハイフン繋ぎの文字列で指定している。

文字列を指定することで固定の長さの区切り文字になるが実は ?- とか指定して長さが無限に伸びるようにしてもいいかもしれない。と思いつつ、多分 zoom-mode とかでバッファの幅が切り替わる時に邪魔になるから固定でいいか。

(custom-set-variables
 '(org-agenda-block-separator "------------------------------"))

org-super-agnda-mode の有効化

なんでここで有効化しているのかね。インストールのやつと近付けた方がいい気がする。

とりあえず有効化して使えるようにしている。

(org-super-agenda-mode 1)

agenda で使う変数の初期化

my/org-agenda-calendar-files という変数でカレンダーの情報を取り込んで agenda を表示できるようにしている。けど今はカレンダー連携をしていないので空で初期化している。

(setq my/org-agenda-calendar-files '())

カスタムビュー

色々なカスタムビューを定義している。かといって全部使ってるわけではないし、つまり使いこなせているかというと微妙。

そして記述が長くなったので分割して記述していく

変数定義開始

(custom-set-variables
 '(org-agenda-custom-commands

習慣用 agenda

習慣用の agenda custom view もいくつか用意している。というわけで h を第一段階の選択に使っている。

   '(("h" . "Habits")
  • 平日業務開始時用 agenda

    平日業務開始時にやる作業にタグを設定しているのでそれを抽出するためのカスタムビューの定義。出勤打刻とか直近の TODO の整理だとかをここでやっている。

    まあ実は業務前にやっとくような TODO も混じってるんだけど業務開始時に「これはやったから DONE」みたいにしている。

         ("hs" "Weekday Start"
          ((tags "Weekday&Start|Daily"
                 ((org-agenda-prefix-format "  ")
                  (org-super-agenda-groups '((:name "予定が過ぎてる作業" :scheduled past)
                                             (:name "今日の作業" :scheduled today)
                                             (:discard (:anything t))))))))
    
  • 平日業務終了時用 agenda

    こちらは業務終了時に使うカスタムビュー。「退勤打刻」とか「日報を書く」というようなやつが入っている。ちゃんと TODO 管理しないと忘れちゃうからさ、退勤打刻。

         ("hf" "Weekday Finish"
          ((tags "Weekday&Finish"
                 ((org-agenda-prefix-format "  ")
                  (org-super-agenda-groups '((:name "予定が過ぎてる作業" :scheduled past)
                                             (:name "今日の作業" :scheduled today)
                                             (:discard (:anything t))))))))
    
  • 週次作業用 agenda

    定例 MTG 用の準備とかのタスクを管理しているカスタムビュー。なのだけど、最近は特に使ってない

         ("hw" "Weekly"
          ((tags "Weekly"
                 ((org-agenda-prefix-format "  ")
                  (org-super-agenda-groups '((:name "予定が過ぎてる作業" :scheduled past)
                                             (:name "今週の作業" :scheduled today)
                                             (:discard (:anything t))))))))
    
  • 休日の定例用 agenda

    休日にやるルーチンワークってあるよね。それ用。

         ("hh" "Holiday"
          ((tags "Weekend|Holiday|Daily"
                 ((org-agenda-prefix-format "  ")
                  (org-super-agenda-groups '((:name "予定が過ぎてる作業" :scheduled past)
                                             (:name "今日の作業" :scheduled today)
                                             (:discard (:anything t))))))))
    

平日用 agenda

平日仕事する時に眺めるために用意した agenda なんだけど実際そんなに見てないので見直しが必要かも。

とりあえず Google Calendar に登録されている予定を一番上に表示している。

2番目には、その日の journal ファイルやレビュー対象の PR を載せているファイルのタスクを抽出している。今のところ TODO をネストさせているとそれも全部表示されるのが気に入らないけどそれはまだ直していない。あと良く見ると意味もなく habits.org を参照しているのでそれは後で消しておきたいですね。

3番目には、とりあえずタスクを放り込んでおく projects.org から予定や締切を設定している仕事用のタスクを抽出している。仕事用のタスクというのは agenda-group で指定している。締切とか予定が過ぎているのを上の方に出したり、その日予定のものをだけをまとめていたり、今後1週間の予定に入っているものを並べたりとちょっと工夫している。

4番目には毎日やってるルーチンワークを並べている。出勤打刻とかね。ほら TODO リストにないと結構忘れちゃうので……。

最後に、特に予定や締切を設定していない仕事用のタスクを並べている。いつかやりたいね〜系のものがここに並ぶ感じ。大体ローカルの環境設定をより良い感じにしたいとかが入って来る

     ("d" "Today"
      ((agenda "会議など"
               ((org-agenda-span 'day)
                (org-agenda-files my/org-agenda-calendar-files)))
       (tags-todo "-Weekday-Daily-Holiday-Weekly-Weekend"
                  ((org-agenda-prefix-format " ")
                   (org-agenda-overriding-header "今日の作業")
                   (org-habit-show-habits nil)
                   (org-agenda-span 'day)
                   (org-agenda-prefix-format "%l%c: ")
                   (org-agenda-files `("~/Documents/org/tasks/habits.org"
                                       ,(org-journal--get-entry-path)
                                       "~/Documents/org/tasks/reviews.org"))
                   (org-super-agenda-groups '((:name "仕掛かり中" :todo "DOING" :property ("agenda-group" "journal-task"))
                                              (:name "TODO" :and (:todo "TODO" :property ("agenda-group" "journal-task")))
                                              (:name "レビュー中" :todo "DOING" :category "レビュー")
                                              (:name "レビュー待ち" :todo "WAIT" :property ("agenda-group" "journal-task"))
                                              (:name "修正待ち" :todo "WAIT" :category "レビュー")
                                              (:discard (:anything t))))))
       (alltodo ""
                ((org-agenda-prefix-format " ")
                 (org-agenda-overriding-header "予定業務")
                 (org-habit-show-habits nil)
                 (org-agenda-span 'day)
                 (org-agenda-prefix-format "  %c: ")
                 (org-agenda-files '("~/Documents/org/tasks/projects.org"))
                 (org-super-agenda-groups `((:name "〆切が過ぎてる作業" :and (:deadline past   :property ("agenda-group" "1. Work")))
                                            (:name "予定が過ぎてる作業" :and (:scheduled past  :property ("agenda-group" "1. Work")))
                                            (:name "今日〆切の作業"     :and (:deadline today  :property ("agenda-group" "1. Work")))
                                            (:name "今日予定の作業"     :and (:scheduled today :property ("agenda-group" "1. Work")))
                                            (:name "今後1週間の作業"    :and (:and
                                                                              (:scheduled (before ,(format-time-string "%Y-%m-%d" (time-add (current-time) (days-to-time 7))))
                                                                                          :scheduled (after ,(format-time-string "%Y-%m-%d" (current-time))))
                                                                              :property ("agenda-group" "1. Work")))
                                            (:discard (:anything t))))))
       (tags-todo "Weekday-Finish|Daily"
                  ((org-agenda-overriding-header "習慣")
                   (org-agenda-prefix-format "  ")
                   (org-habit-show-habits t)
                   (org-agenda-files '("~/Documents/org/tasks/habits.org"))
                   (org-super-agenda-groups '((:name "予定が過ぎてる作業" :scheduled past)
                                              (:name "今日予定" :scheduled today)
                                              (:discard (:anything t))))))

       (tags-todo "LEVEL=2"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"))
                   (org-agenda-overriding-header "予定なし")
                   (org-super-agenda-groups '((:and (:property ("agenda-group" "1. Work") :scheduled nil :deadline nil))
                                              (:discard (:anything t))))))))

休日用 agenda

休日にやることは平日とは異なるので別の agenda custom command を用意している。

まず最初に表示するのは journal ファイルに登録されている仕事以外のタスクの抽出。まあここで制御しなくても、仕事のタスクは休日の journal ファイルから projects.org に追い出すんだけどね。見たくないし。

2番目に projects.org から仕事以外の予定タスクをバーッと並べる。まあこれは平日のやつと同じだね。ただ、休日にやりたいことは仕事のやつよりも滅茶苦茶溜まりやすい上にスケジュールぶっちするのでちょっと困ってたりはする。

3番目はルーチンワーク。掃除とかが入って来るやつ。実はこれも数が多い割に気力は足りてないので消化し切れていない。生きるのつらい。

4番目はプライベートタスク。何か誰かと約束しているやつはここに突っ込まれたりするし、とりあえずプライベートでやりたいけど他の分類に仕分けられないやつはここに突っ込む。ここは優先度 C は非表示にしている。優先度が低いのは見えない方が精神衛生に良い。

5番目は Emacs 関係のタスク。ほら休日にやることと言えば Emacs の設定を良い感じにしていくことじゃないですか。大事じゃないですか。これも優先度 C 以下は非表示にしている。けど B とかにしたまま放置しているのが沢山あるのもここだったり

6番目はその他の環境設定用タスク。 Emacs 以外も設定を弄りたいのはいっぱいあるからね。i3wm とか tmux とか。

本当は他にも載せたいんだけど、今あるこれらも全然消化できてないので、それ以外はちょっとこの agenda への掲載を見送っているのが現状。

     ("D" "Holiday"
      ((tags-todo "-Weekday-Daily-Holiday-Weekly-Weekend&LEVEL=3"
                  ((org-agenda-prefix-format " ")
                   (org-agenda-overriding-header "休日の作業")
                   (org-habit-show-habits nil)
                   (org-agenda-prefix-format "  %c: ")
                   (org-agenda-span 'day)
                   (org-agenda-files `(,(org-journal--get-entry-path)))
                   (org-super-agenda-groups '((:name "仕掛かり中" :and (:todo "DOING" :not (:property ("agenda-group" "1. Work"))))
                                              (:name "TODO"       :and (:todo "TODO"  :not (:property ("agenda-group" "1. Work"))))
                                              (:name "待ち"       :and (:todo "WAIT"  :not (:property ("agenda-group" "1. Work"))))
                                              (:discard (:anything t))))))
       (alltodo ""
                ((org-agenda-prefix-format " ")
                 (org-agenda-overriding-header "予定作業")
                 (org-habit-show-habits nil)
                 (org-agenda-prefix-format "  %c: ")
                 (org-agenda-span 'day)
                 (org-agenda-files '("~/Documents/org/tasks/projects.org" "~/Documents/org/tasks/inbox.org"))
                 (org-super-agenda-groups `((:name "〆切が過ぎてる作業" :and (:deadline past   :not (:property ("agenda-group" "1. Work"))))
                                            (:name "予定が過ぎてる作業" :and (:scheduled past  :not (:property ("agenda-group" "1. Work"))))
                                            (:name "今日〆切の作業"     :and (:deadline today  :not (:property ("agenda-group" "1. Work"))))
                                            (:name "今日予定の作業"     :and (:scheduled today :not (:property ("agenda-group" "1. Work"))))
                                            (:name "今後1週間の作業"    :and (:and
                                                                              (:scheduled (before ,(format-time-string "%Y-%m-%d" (time-add (current-time) (days-to-time 7))))
                                                                                          :scheduled (after ,(format-time-string "%Y-%m-%d" (current-time))))
                                                                              :not (:property ("agenda-group" "1. Work"))))
                                            (:discard (:anything t))))))
       (tags-todo "Holiday|Weekend|Daily"
                  ((org-agenda-overriding-header "習慣")
                   (org-agenda-prefix-format "  ")
                   (org-agenda-files '("~/Documents/org/tasks/habits.org"))
                   (org-super-agenda-groups '((:name "予定が過ぎてる作業" :scheduled past)
                                              (:name "今日予定の作業" :scheduled today)
                                              (:discard (:anything t))))))
       (tags-todo "LEVEL=2"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"))
                   (org-agenda-overriding-header "Private")
                   (org-super-agenda-groups '((:name "Priority >= B" :and (:priority>= "B" :property ("agenda-group" "7. Private")))
                                              (:name "no priority" :and (:not (:priority>= "C") :property ("agenda-group" "7. Private")))
                                              (:discard (:anything t))))))
       (tags-todo "Emacs&LEVEL=2"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"))
                   (org-agenda-overriding-header "Emacs")
                   (org-super-agenda-groups '((:priority>= "B")
                                              (:name "no priority" :not (:priority>= "C"))
                                              (:discard (:anything t))))))
       (tags-todo "Env&LEVEL=2"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"))
                   (org-agenda-overriding-header "Env")
                   (org-super-agenda-groups '((:priority>= "B")
                                              (:name "no priority" :not (:priority>= "C"))
                                              (:discard (:anything t))))))))

その他

以下はまだ分割対応ができてない

     ("p" . "Projects")
     ("pA" "Projects Priority A"
      ((tags-todo "LEVEL=2&PRIORITY=\"A\"" ((org-agenda-files '("~/Documents/org/tasks/projects.org"))))))
     ("pc" "Category"
      ((tags-todo "LEVEL=2&CATEGORY=\"Work\"" ((org-agenda-overriding-header "お仕事タスク")
                                               (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                               (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))
       (tags-todo "LEVEL=2&CATEGORY=\"Housework\"" ((org-agenda-overriding-header "家事")
                                                    (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                                    (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))
       (tags-todo "LEVEL=2&CATEGORY=\"Config\"" ((org-agenda-overriding-header "設定弄り")
                                                 (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                                 (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))
       (tags-todo "LEVEL=2&CATEGORY=\"Research\"" ((org-agenda-overriding-header "調査")
                                                   (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                                   (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))
       (tags-todo "LEVEL=2&CATEGORY=\"Indie hack\"" ((org-agenda-overriding-header "個人開発")
                                                     (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                                     (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))
       (tags-todo "LEVEL=2&CATEGORY=\"Hoby\"" ((org-agenda-overriding-header "趣味関係")
                                               (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                               (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))
       (tags-todo "LEVEL=2&CATEGORY=\"Private\"" ((org-agenda-overriding-header "Private タスク")
                                                  (org-agenda-overriding-columns-format "%25ITEM %TODO")
                                                  (org-agenda-files `(,(concat org-directory "tasks/projects.org")))))))

     ("pC" "Category auto"
      ((tags-todo "LEVEL=2" ((org-agenda-overriding-header "Categories")
                             (org-agenda-files `(,(concat org-directory "tasks/projects.org")))
                             (org-super-agenda-groups '((:auto-category t)))))))
     ("pg" "Agenda groups"
      ((tags-todo "LEVEL=2" ((org-agenda-overriding-header "Categories")
                             (org-agenda-files `(,(concat org-directory "tasks/projects.org")))
                             (org-super-agenda-groups '((:auto-group t)))))))
     ("pp" "Projects"
      ((tags-todo "LEVEL=2" ((org-agenda-prefix-format " ")
                             (org-agenda-overriding-header "今日のタスク")
                             (org-habit-show-habits nil)
                             (org-agenda-span 'day)
                             (org-agenda-todo-keyword-format "-")
                             (org-agenda-files `("~/Documents/org/tasks/habits.org" ,(org-journal--get-entry-path)))
                             (org-super-agenda-groups (append
                                                       (mapcar (lambda (key) `(:name ,key :and (:category ,key :todo ("DOING" "WAIT")))) (if (boundp 'my/nippou-categories) my/nippou-categories nil))
                                                       '((:name "その他" :scheduled nil)
                                                         (:discard (:anything t)))))))
       (tags-todo "LEVEL=2" ((org-agenda-prefix-format " ")
                             (org-agenda-overriding-header "予定に入ってる作業")
                             (org-habit-show-habits nil)
                             (org-agenda-span 'day)
                             (org-agenda-todo-keyword-format "-")
                             (org-agenda-files '("~/Documents/org/tasks/projects.org"))
                             (org-super-agenda-groups '((:name "〆切が過ぎてる作業" :deadline past)
                                                        (:name "予定が過ぎてる作業" :scheduled past)
                                                        (:name "今日〆切の作業" :deadline today)
                                                        (:name "今日予定の作業" :scheduled today)
                                                        (:discard (:anything t))))))
       (tags-todo "LEVEL=2" ((org-agenda-files '("~/Documents/org/tasks/projects.org"))
                             (org-super-agenda-groups '((:name "待ち" :todo "WAIT")
                                                        (:name "仕掛かり中" :todo "DOING")
                                                        (:name "TODO" :todo "TODO")
                                                        (:discard (:anything t))))))))
     ("pP" "Projects without Env"
      ((alltodo "" ((org-agenda-prefix-format " ")
                    (org-agenda-overriding-header "今日のタスク")
                    (org-habit-show-habits nil)
                    (org-agenda-span 'day)
                    (org-agenda-todo-keyword-format "-")
                    (org-agenda-files `("~/Documents/org/tasks/habits.org" ,(org-journal--get-entry-path)))
                    (org-super-agenda-groups (append
                                              (mapcar (lambda (key) `(:name ,key :and (:category ,key :todo ("DOING" "WAIT")))) (if (boundp 'my/nippou-categories) my/nippou-categories nil))
                                              '((:name "その他" :scheduled nil)
                                                (:discard (:anything t)))))))
       (alltodo "" ((org-agenda-prefix-format " ")
                    (org-agenda-overriding-header "予定に入ってる作業")
                    (org-habit-show-habits nil)
                    (org-agenda-span 'day)
                    (org-agenda-todo-keyword-format "-")
                    (org-agenda-files '("~/Documents/org/tasks/projects.org"))
                    (org-super-agenda-groups '((:name "〆切が過ぎてる作業" :deadline past)
                                               (:name "予定が過ぎてる作業" :scheduled past)
                                               (:name "今日〆切の作業" :deadline today)
                                               (:name "今日予定の作業" :scheduled today)
                                               (:discard (:anything t))))))
       (tags-todo "-Emacs-org-Env-Hugo&LEVEL=2" ((org-agenda-files '("~/Documents/org/tasks/projects.org"))))))
     ("pN" "No major tags"
      ((tags-todo "-Emacs-org-Env-Hugo-Kibela-Develop-ReviewLister-HouseWork-Private&LEVEL=2" ((org-agenda-files '("~/Documents/org/tasks/projects.org"))))))
     ("P" "Pointers"
      ((todo "DOING" ((org-agenda-files '("~/Documents/org/tasks/pointers.org"))))
       (todo "TODO"  ((org-agenda-files '("~/Documents/org/tasks/pointers.org"))))))
     ("X" "Finished"
      ((tags "LEVEL=2" ((org-agenda-files `("~/Documents/org/tasks/projects.org"
                                            "~/Documents/org/tasks/inbox.org"
                                            "~/Documents/org/tasks/reviews.org"
                                            ,(org-journal--get-entry-path)
                                            "~/Documents/org/tasks/habits.org"))
                        (org-super-agenda-groups '((:name "Finished" :todo "DONE")
                                                   (:name "Someday" :todo "SOMEDAY")
                                                   (:discard (:anything t))))))))

     ("z" "日報"
      ((agenda "" ((org-agenda-span 'day)
                   (org-agenda-overriding-header "")
                   (org-habit-show-habits nil)
                   (org-agenda-format-date "## %Y/%m/%d (%a) 日報")
                   (org-agenda-prefix-format " %?-12t")
                   (org-agenda-files my/org-agenda-calendar-files)
                   (org-super-agenda-groups
                    '((:name "会議など" :time-grid t)
                      (:discard (:anything t))))))
       (todo "DONE" ((org-agenda-prefix-format " ")
                     (org-agenda-overriding-header "対応済")
                     (org-habit-show-habits nil)
                     (org-agenda-span 'day)
                     (org-agenda-todo-keyword-format "-")
                     (org-columns-default-format-for-agenda "%25ITEM %TODO %3PRIORITY")
                     (org-agenda-files `("~/Documents/org/tasks/habits.org" ,(org-journal--get-entry-path)))
                     (org-super-agenda-groups (append
                                               (mapcar (lambda (key) `(:name ,key :and (:category ,key :todo ("DONE")))) (if (boundp 'my/nippou-categories) my/nippou-categories nil))
                                               '((:discard (:anything t :name "discard")))))))
       (alltodo "" ((org-agenda-prefix-format " ")
                    (org-agenda-overriding-header "仕掛かり中")
                    (org-habit-show-habits nil)
                    (org-agenda-span 'day)
                    (org-agenda-todo-keyword-format "-")
                    (org-agenda-files `("~/Documents/org/tasks/habits.org" ,(org-journal--get-entry-path)))
                    (org-super-agenda-groups (append
                                              (mapcar (lambda (key) `(:name ,key :and (:category ,key :todo ("DOING" "WAIT")))) (if (boundp 'my/nippou-categories) my/nippou-categories nil))
                                              '((:discard (:anything t :name "discard")))))))))

     ("H" "HouseWork" ((tags "HouseWork")))
     ("E" . "Env")
     ("EO" "org"
      ((tags-todo "+org"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"
                                       "~/Documents/org/tasks/inbox.org"))))))
     ("EE" "Emacs without org"
      ((tags-todo "+Emacs-org"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"
                                       "~/Documents/org/tasks/inbox.org"))))))
     ("Ee" "without Emacs"
      ((tags-todo "+Env-Emacs-org"
                  ((org-agenda-files '("~/Documents/org/tasks/projects.org"
                                       "~/Documents/org/tasks/inbox.org")))))))))