]> git.donarmstrong.com Git - lib.git/blob - emacs_el/configuration/org-mode-configuration.el
switch around default column format
[lib.git] / emacs_el / configuration / org-mode-configuration.el
1 (require 'org-id)
2 (require 'reftex)
3 (require 'gnus)
4
5 ;; The following lines are always needed. Choose your own keys.
6 (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
7 (require 'org)
8 (global-set-key "\C-cl" 'org-store-link)
9 (global-set-key "\C-ca" 'org-agenda)
10 (global-set-key "\C-cb" 'org-iswitchb)
11 (setq-default org-log-done 'time)
12 (setq-default org-agenda-ndays 5)
13
14 ;; agenda configuration
15 ;; Do not dim blocked tasks
16 (setq org-agenda-dim-blocked-tasks nil)
17
18 ;; Compact the block agenda view
19 (setq org-agenda-compact-blocks t)
20
21 ;; Custom agenda command definitions
22 (setq org-agenda-custom-commands
23       (quote (("N" "Notes" tags "NOTE"
24                ((org-agenda-overriding-header "Notes")
25                 (org-tags-match-list-sublevels t)))
26               ("h" "Habits" tags-todo "STYLE=\"habit\""
27                ((org-agenda-overriding-header "Habits")
28                 (org-agenda-sorting-strategy
29                  '(todo-state-down effort-up category-keep))))
30               (" " "Agenda"
31                ((agenda "" nil)
32                 (tags "REFILE"
33                       ((org-agenda-overriding-header "Tasks to Refile")
34                        (org-tags-match-list-sublevels nil)))
35                 (tags-todo "-CANCELLED/!"
36                            ((org-agenda-overriding-header "Stuck Projects")
37                             (org-agenda-skip-function 'bh/skip-non-stuck-projects)
38                             (org-agenda-sorting-strategy
39                              '(category-keep))))
40                 (tags-todo "-HOLD-CANCELLED/!"
41                            ((org-agenda-overriding-header "Projects")
42                             (org-agenda-skip-function 'bh/skip-non-projects)
43                             (org-tags-match-list-sublevels 'indented)
44                             (org-agenda-sorting-strategy
45                              '(category-keep))))
46                 (tags-todo "-CANCELLED/!NEXT"
47                            ((org-agenda-overriding-header (concat "Project Next Tasks"
48                                                                   (if bh/hide-scheduled-and-waiting-next-tasks
49                                                                       ""
50                                                                     " (including WAITING and SCHEDULED tasks)")))
51                             (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
52                             (org-tags-match-list-sublevels t)
53                             (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
54                             (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
55                             (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
56                             (org-agenda-sorting-strategy
57                              '(todo-state-down effort-up category-keep))))
58                 (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
59                            ((org-agenda-overriding-header (concat "Project Subtasks"
60                                                                   (if bh/hide-scheduled-and-waiting-next-tasks
61                                                                       ""
62                                                                     " (including WAITING and SCHEDULED tasks)")))
63                             (org-agenda-skip-function 'bh/skip-non-project-tasks)
64                             (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
65                             (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
66                             (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
67                             (org-agenda-sorting-strategy
68                              '(category-keep))))
69                 (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
70                            ((org-agenda-overriding-header (concat "Standalone Tasks"
71                                                                   (if bh/hide-scheduled-and-waiting-next-tasks
72                                                                       ""
73                                                                     " (including WAITING and SCHEDULED tasks)")))
74                             (org-agenda-skip-function 'bh/skip-project-tasks)
75                             (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
76                             (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
77                             (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
78                             (org-agenda-sorting-strategy
79                              '(category-keep))))
80                 (tags-todo "-CANCELLED+WAITING|HOLD/!"
81                            ((org-agenda-overriding-header "Waiting and Postponed Tasks")
82                             (org-agenda-skip-function 'bh/skip-stuck-projects)
83                             (org-tags-match-list-sublevels nil)
84                             (org-agenda-todo-ignore-scheduled t)
85                             (org-agenda-todo-ignore-deadlines t)))
86                 (tags "-REFILE/"
87                       ((org-agenda-overriding-header "Tasks to Archive")
88                        (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
89                        (org-tags-match-list-sublevels nil))))
90                nil))))
91
92 ; org mode agenda files
93 (setq org-agenda-files
94       (quote ("~/projects/debbugs/debbugs.org"
95               "~/projects/notes/notes.org"
96               "~/projects/notes/refile.org"
97               "~/projects/notes/diary.org"
98               "~/projects/origins_of_life/ool.org"
99               "~/projects/sysadmin/sndservers/sndservers.org"
100               "~/projects/chaim/chaim.org"
101               "~/projects/chaim/papers/gwas_paper_2012/gwas_paper.org"
102           "~/projects/reviews/reviews.org"
103               "~/projects/fh/fh.org")))
104
105 (setq org-global-properties '(("Effort_ALL 0 0:10 0:30 1:00 2:00 3:00 4:00 5:00 6:00 7:00")))
106 (setq org-columns-default-format "%40ITEM(Task) %6Effort{:} %CLOCKSUM %PRIORITY %TODO %13SCHEDULED %13DEADLINE %TAGS")
107
108 (setq org-default-notes-file "~/projects/notes/notes.org")
109 (setq org-capture-templates  ;; mail-specific note template, identified by "m"
110       '(("m" "Mail" entry (file+headline "~/projects/notes/refile.org" "Mail")
111          "* %?\n\n  Source: %u, %c\n  %i")
112         ("t" "todo" entry (file "~/projects/notes/refile.org")
113          "* TODO %?\n%U\n%a\n" :clock-in t :clock-resume t)
114         ("r" "respond" entry (file "~/projects/notes/refile.org")
115          "* NEXT Respond to %:from on %:subject\nSCHEDULED: %t\n%U\n%a\n" :clock-in t :clock-resume t :immediate-finish t)
116         ("n" "note" entry (file "~/projects/notes/refile.org")
117          "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t)
118         ("s" "schedule" entry (file "~/projects/notes/refile.org")
119          "* %? \n%^{scheduled:}t\n%U\n%a\n" :clock-in t :clock-resume t)
120         ("j" "Journal" entry (file+datetree "~/projects/notes/diary.org")
121          "* %?\n%U\n" :clock-in t :clock-resume t)
122         ("w" "org-protocol" entry (file "~/projects/notes/refile.org")
123          "* TODO Review %c\n%U\n" :immediate-finish t)
124         ("m" "Meeting" entry (file "~/projects/notes/refile.org")
125          "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t)
126         ("p" "Phone call" entry (file "~/projects/notes/refile.org")
127          "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t)
128         ("h" "Habit" entry (file "~/projects/notes/refile.org")
129          "* NEXT %?\n%U\n%a\nSCHEDULED: %(format-time-string \"<%Y-%m-%d %a .+1d/3d>\")\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n")
130         )
131       )
132
133 ;; Remove empty LOGBOOK drawers on clock out
134 (defun bh/remove-empty-drawer-on-clock-out ()
135   (interactive)
136   (save-excursion
137     (beginning-of-line 0)
138     (org-remove-empty-drawer-at "LOGBOOK" (point))))
139
140 (defun my/org-add-id ()
141   (interactive)
142   (save-excursion
143     (if (org-current-level)
144         ()
145       (forward-char 1)
146       )
147     (org-id-get-create)
148     )
149 )
150
151 ; org mode configuration from http://doc.norang.ca/org-mode.html
152 ;; Custom Key Bindings
153 (global-set-key (kbd "<f12>") 'org-agenda)
154 (global-set-key (kbd "<f5>") 'bh/org-todo)
155 (global-set-key (kbd "<S-f5>") 'bh/widen)
156 (global-set-key (kbd "<f7>") 'bh/set-truncate-lines)
157 (global-set-key (kbd "<f8>") 'org-cycle-agenda-files)
158 (global-set-key (kbd "<f9> <f9>") 'bh/show-org-agenda)
159 (global-set-key (kbd "<f9> b") 'bbdb)
160 (global-set-key (kbd "<f9> c") 'calendar)
161 (global-set-key (kbd "<f9> f") 'boxquote-insert-file)
162 (global-set-key (kbd "<f9> h") 'bh/hide-other)
163 (global-set-key (kbd "<f9> n") 'bh/toggle-next-task-display)
164 (global-set-key (kbd "<f9> w") 'widen)
165
166 (global-set-key (kbd "<f9> I") 'bh/punch-in)
167 (global-set-key (kbd "<f9> O") 'bh/punch-out)
168
169 (global-set-key (kbd "<f9> o") 'bh/make-org-scratch)
170
171 (global-set-key (kbd "<f9> r") 'boxquote-region)
172 (global-set-key (kbd "<f9> s") 'bh/switch-to-scratch)
173
174 (global-set-key (kbd "<f9> t") 'bh/insert-inactive-timestamp)
175 (global-set-key (kbd "<f9> T") 'bh/toggle-insert-inactive-timestamp)
176
177 (global-set-key (kbd "<f9> v") 'visible-mode)
178 (global-set-key (kbd "<f9> l") 'org-toggle-link-display)
179 (global-set-key (kbd "<f9> SPC") 'bh/clock-in-last-task)
180 (global-set-key (kbd "C-<f9>") 'previous-buffer)
181 (global-set-key (kbd "M-<f9>") 'org-toggle-inline-images)
182 (global-set-key (kbd "C-x n r") 'narrow-to-region)
183 (global-set-key (kbd "C-<f10>") 'next-buffer)
184 (global-set-key (kbd "<f11>") 'org-clock-goto)
185 (global-set-key (kbd "C-<f11>") 'org-clock-in)
186 (global-set-key (kbd "C-s-<f12>") 'bh/save-then-publish)
187 (global-set-key (kbd "C-c c") 'org-capture)
188
189 (defun bh/hide-other ()
190   (interactive)
191   (save-excursion
192     (org-back-to-heading 'invisible-ok)
193     (hide-other)
194     (org-cycle)
195     (org-cycle)
196     (org-cycle)))
197
198 (defun bh/set-truncate-lines ()
199   "Toggle value of truncate-lines and refresh window display."
200   (interactive)
201   (setq truncate-lines (not truncate-lines))
202   ;; now refresh window display (an idiom from simple.el):
203   (save-excursion
204     (set-window-start (selected-window)
205                       (window-start (selected-window)))))
206
207 (defun bh/make-org-scratch ()
208   (interactive)
209   (find-file "/tmp/publish/scratch.org")
210   (gnus-make-directory "/tmp/publish"))
211
212 (defun bh/switch-to-scratch ()
213   (interactive)
214   (switch-to-buffer "*scratch*"))
215
216 (setq org-use-fast-todo-selection t)
217 (setq org-treat-S-cursor-todo-selection-as-state-change nil)
218
219 (setq org-todo-keywords
220       (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
221               (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
222
223 (setq org-todo-keyword-faces
224       (quote (("TODO" :foreground "red" :weight bold)
225               ("NEXT" :foreground "blue" :weight bold)
226               ("DONE" :foreground "forest green" :weight bold)
227               ("WAITING" :foreground "orange" :weight bold)
228               ("HOLD" :foreground "magenta" :weight bold)
229               ("CANCELLED" :foreground "forest green" :weight bold)
230               ("MEETING" :foreground "forest green" :weight bold)
231               ("PHONE" :foreground "forest green" :weight bold))))
232
233 (setq org-todo-state-tags-triggers
234       (quote (("CANCELLED" ("CANCELLED" . t))
235               ("WAITING" ("WAITING" . t))
236               ("HOLD" ("WAITING") ("HOLD" . t))
237               (done ("WAITING") ("HOLD"))
238               ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
239               ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
240               ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
241
242
243
244 (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
245 ; add ids on creation of nodes
246 (add-hook 'org-capture-prepare-finalize-hook 'my/org-add-id)
247 ; create function to create headlines in file. This comes from
248 ; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode
249 (defun my/org-add-ids-to-headlines-in-file ()
250   "Add ID properties to all headlines in the current file which
251 do not already have one."
252   (interactive)
253   (org-map-entries 'org-id-get-create))
254 ; if we wanted to do this to every buffer, do the following:
255 ; (add-hook 'org-mode-hook
256 ;           (lambda ()
257 ;             (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
258
259
260 ; resolve clocks after 10 minutes of idle; use xprintidle
261 ; (setq org-clock-idle-time 10)
262 ; (setq org-clock-x11idle-program-name "xprintidle")
263
264 ; this is from http://doc.norang.ca/org-mode.html#Capture
265 ; use C-M-r for org mode capture
266 (global-set-key (kbd "C-M-r") 'org-capture)
267
268 ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
269 (setq org-refile-targets (quote ((nil :maxlevel . 9)
270                                  (org-agenda-files :maxlevel . 9))))
271
272 ; Use full outline paths for refile targets - we file directly with IDO
273 (setq org-refile-use-outline-path t)
274
275 ; Targets complete directly with IDO
276 (setq org-outline-path-complete-in-steps nil)
277
278 ; Allow refile to create parent tasks with confirmation
279 (setq org-refile-allow-creating-parent-nodes (quote confirm))
280
281 ; Use IDO for both buffer and file completion and ido-everywhere to t
282 (setq org-completion-use-ido t)
283 (setq ido-everywhere t)
284 (setq ido-max-directory-size 100000)
285 (ido-mode (quote both))
286 ; Use the current window when visiting files and buffers with ido
287 (setq ido-default-file-method 'selected-window)
288 (setq ido-default-buffer-method 'selected-window)
289 ; Use the current window for indirect buffer display
290 (setq org-indirect-buffer-display 'current-window)
291
292
293 ;;;; Refile settings
294 ; Exclude DONE state tasks from refile targets
295 (defun bh/verify-refile-target ()
296   "Exclude todo keywords with a done state from refile targets"
297   (not (member (nth 2 (org-heading-components)) org-done-keywords)))
298
299 (setq org-refile-target-verify-function 'bh/verify-refile-target)
300
301 ;; ensure that emacsclient will show just the note to be edited when invoked
302 ;; from Mutt, and that it will shut down emacsclient once finished;
303 ;; fallback to legacy behavior when not invoked via org-protocol.
304 (require 'org-protocol)
305 (add-hook 'org-capture-mode-hook 'delete-other-windows)
306 (setq my-org-protocol-flag nil)
307 (defadvice org-capture-finalize (after delete-frame-at-end activate)
308   "Delete frame at remember finalization"
309   (progn (if my-org-protocol-flag (delete-frame))
310          (setq my-org-protocol-flag nil)))
311 (defadvice org-capture-refile (around delete-frame-after-refile activate)
312   "Delete frame at remember refile"
313   (if my-org-protocol-flag
314       (progn
315         (setq my-org-protocol-flag nil)
316         ad-do-it
317         (delete-frame))
318     ad-do-it)
319   )
320 (defadvice org-capture-kill (after delete-frame-at-end activate)
321   "Delete frame at remember abort"
322   (progn (if my-org-protocol-flag (delete-frame))
323          (setq my-org-protocol-flag nil)))
324 (defadvice org-protocol-capture (before set-org-protocol-flag activate)
325   (setq my-org-protocol-flag t))
326
327 (defadvice org-insert-todo-heading (after dla/create-id activate)
328   (org-id-get-create)
329   )
330
331 ;; org modules
332 (add-to-list 'org-modules 'org-habit)
333
334 ; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/
335 (defun open-mail-in-mutt (message)
336   "Open a mail message in Mutt, using an external terminal.
337
338 Message can be specified either by a path pointing inside a
339 Maildir, or by Message-ID."
340   (interactive "MPath or Message-ID: ")
341   (shell-command
342    (format "faf xterm -e \"%s %s\""
343        (substitute-in-file-name "$HOME/bin/mutt_open") message)))
344
345 ;; add support for "mutt:ID" links
346 (org-add-link-type "mutt" 'open-mail-in-mutt)
347
348 (defun my-org-mode-setup ()
349   (load-library "reftex")
350   (and (buffer-file-name)
351        (file-exists-p (buffer-file-name))
352        (progn
353          (reftex-parse-all)
354          (reftex-set-cite-format
355           '((?b . "[[bib:%l][%l-bib]]")
356             (?n . "[[notes:%l][%l-notes]]")
357             (?c . "\\cite{%l}")
358             (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l paper]]")))
359          ))
360   (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
361   (define-key org-mode-map (kbd "C-c [") 'reftex-citation)
362   (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search)
363   (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref)
364   )
365 (add-hook 'org-mode-hook 'my-org-mode-setup)
366
367 (defun org-mode-reftex-search ()
368   (interactive)
369   (org-open-link-from-string (format "[[notes:%s]]" (first (reftex-citation t)))))
370
371 (defun open-research-paper (bibtexkey)
372   "Open a paper by bibtex key"
373   (interactive "bibtex key: ")
374   (shell-command
375    (format "%s %s"
376        (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
377 (org-add-link-type "papers" 'open-research-paper)
378
379 (add-to-list 'org-link-abbrev-alist
380              '("notes" .
381                "~/projects/research/paper_notes.org::#%s"))
382
383 ; I pretty much always want hiearchical checkboxes
384 (setq org-hierachical-checkbox-statistics nil)
385  
386 ;; stolen from
387 ;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/
388 (defun my-rtcite-export-handler (path desc format)
389   (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format)
390   (let* ((search (when (string-match "::#?\\(.+\\)\\'" path)
391                    (match-string 1 path)))
392          (path (substring path 0 (match-beginning 0))))
393     (cond ((eq format 'latex)
394            (if (or (not desc) 
395                    (equal 0 (search "rtcite:" desc)))
396                (format "\\cite{%s}" search)
397              (format "\\cite[%s]{%s}" desc search))))))
398
399 (org-add-link-type "rtcite" 
400                    'org-bibtex-open
401                    'my-rtcite-export-handler)
402
403
404 (setq-default org-mobile-directory "/rzlab.ucr.edu:/sites/dav.donarmstrong.com/root/org/")
405 (setq-default org-directory "/home/don/org-mode/")
406 (setq-default org-mobile-inbox-for-pull "/home/don/org-mode/from-mobile.org")
407
408 ;; org mode ical export
409 (setq org-icalendar-timezone "America/Los_Angeles")
410 (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
411 ;; we already add the id manually
412 ;; (setq org-icalendar-store-UID t)
413
414 ;; org babel support
415 (org-babel-do-load-languages
416  'org-babel-load-languages
417  '((emacs-lisp . t )
418    (R . t)
419    (latex . t)))
420 ;; org-babel-by-backend
421 (defmacro org-babel-by-backend (&rest body)
422    `(case (if (boundp 'backend) 
423               (org-export-backend-name backend)
424             nil) ,@body))
425
426
427
428 ;; org latex
429 ;; stolen from http://kieranhealy.org/esk/kjhealy.html
430 (require 'org-latex)   
431 ;; Choose either listings or minted for exporting source code blocks.
432 ;; Using minted (as here) requires pygments be installed. To use the
433 ;; default listings package instead, use
434 ;; (setq org-latex-listings t)
435 ;; and change references to "minted" below to "listings"
436 ; (setq org-latex-listings 'minted)
437
438 ;; default settings for minted code blocks
439 (setq org-latex-minted-options
440       '(;("frame" "single")
441         ("bgcolor" "bg") ; bg will need to be defined in the preamble of your document. It's defined in org-preamble-pdflatex.sty and org-preamble-xelatex.sty below.
442         ("fontsize" "\\small")
443         ))
444 ;; turn off the default toc behavior; deal with it properly in headers to files.
445 (defun org-latex-no-toc (depth)  
446   (when depth
447     (format "%% Org-mode is exporting headings to %s levels.\n"
448             depth)))
449 (setq org-latex-format-toc-function 'org-latex-no-toc)
450
451 (require 'ox-latex)
452 (add-to-list 'org-latex-classes
453              '("memarticle"
454                "\\documentclass[11pt,oneside,article]{memoir}\n"
455                ("\\section{%s}" . "\\section*{%s}")
456                ("\\subsection{%s}" . "\\subsection*{%s}")
457                ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
458                ("\\paragraph{%s}" . "\\paragraph*{%s}")
459                ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
460
461 (add-to-list 'org-latex-classes
462              '("membook"
463                "\\documentclass[11pt,oneside]{memoir}\n"
464                ("\\chapter{%s}" . "\\chapter*{%s}")
465                ("\\section{%s}" . "\\section*{%s}")
466                ("\\subsection{%s}" . "\\subsection*{%s}")
467                ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
468
469 (add-to-list 'org-latex-classes
470              '("letter"
471                "\\documentclass[11pt]{letter}
472 [NO-DEFAULT-PACKAGES]
473 [PACKAGES]
474 [EXTRA]"
475        ("\\section{%s}" . "\\section*{%s}")
476                ("\\subsection{%s}" . "\\subsection*{%s}")
477                ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
478                ("\\paragraph{%s}" . "\\paragraph*{%s}")
479                ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
480
481 ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
482 ;; but adapted to use latexmk 4.22 or higher.  
483 (setq org-latex-pdf-process '("latexmk -pdflatex=xelatex -bibtex -use-make -pdf %f"))
484
485 ;; Default packages included in /every/ tex file, latex, pdflatex or xelatex
486 (setq org-latex-default-packages-alist
487       '())
488 (setq org-latex-packages-alist
489       '(("" "graphicx" t)
490         ("" "fontspec" t)
491         ("" "xunicode" t)
492         ("" "hyperref" t)
493         ("" "url" t)
494         ("" "rotating" t)
495         ("" "longtable" nil)
496         ("" "float" )))
497
498 (defun org-create-formula--latex-header ()
499   "Return LaTeX header appropriate for previewing a LaTeX snippet."
500   (let ((info (org-combine-plists (org-export--get-global-options
501                                    (org-export-get-backend 'latex))
502                                   (org-export--get-inbuffer-options
503                                    (org-export-get-backend 'latex)))))
504     (org-latex-guess-babel-language
505      (org-latex-guess-inputenc
506       (org-splice-latex-header
507        org-format-latex-header
508        org-latex-default-packages-alist
509        nil t
510        (plist-get info :latex-header)))
511      info)))
512
513
514 ; support ignoring headers in org mode export to latex
515 ; from http://article.gmane.org/gmane.emacs.orgmode/67692
516 (defadvice org-latex-headline (around my-latex-skip-headlines
517                                       (headline contents info) activate)
518   (if (member "ignoreheading" (org-element-property :tags headline))
519       (setq ad-return-value contents)
520     ad-do-it))
521
522
523 ;; helper functions
524 (defun bh/is-project-p ()
525   "Any task with a todo keyword subtask"
526   (save-restriction
527     (widen)
528     (let ((has-subtask)
529           (subtree-end (save-excursion (org-end-of-subtree t)))
530           (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
531       (save-excursion
532         (forward-line 1)
533         (while (and (not has-subtask)
534                     (< (point) subtree-end)
535                     (re-search-forward "^\*+ " subtree-end t))
536           (when (member (org-get-todo-state) org-todo-keywords-1)
537             (setq has-subtask t))))
538       (and is-a-task has-subtask))))
539
540 (defun bh/is-project-subtree-p ()
541   "Any task with a todo keyword that is in a project subtree.
542 Callers of this function already widen the buffer view."
543   (let ((task (save-excursion (org-back-to-heading 'invisible-ok)
544                               (point))))
545     (save-excursion
546       (bh/find-project-task)
547       (if (equal (point) task)
548           nil
549         t))))
550
551 (defun bh/is-task-p ()
552   "Any task with a todo keyword and no subtask"
553   (save-restriction
554     (widen)
555     (let ((has-subtask)
556           (subtree-end (save-excursion (org-end-of-subtree t)))
557           (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
558       (save-excursion
559         (forward-line 1)
560         (while (and (not has-subtask)
561                     (< (point) subtree-end)
562                     (re-search-forward "^\*+ " subtree-end t))
563           (when (member (org-get-todo-state) org-todo-keywords-1)
564             (setq has-subtask t))))
565       (and is-a-task (not has-subtask)))))
566
567 (defun bh/is-subproject-p ()
568   "Any task which is a subtask of another project"
569   (let ((is-subproject)
570         (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
571     (save-excursion
572       (while (and (not is-subproject) (org-up-heading-safe))
573         (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
574           (setq is-subproject t))))
575     (and is-a-task is-subproject)))
576
577 (defun bh/list-sublevels-for-projects-indented ()
578   "Set org-tags-match-list-sublevels so when restricted to a subtree we list all subtasks.
579   This is normally used by skipping functions where this variable is already local to the agenda."
580   (if (marker-buffer org-agenda-restrict-begin)
581       (setq org-tags-match-list-sublevels 'indented)
582     (setq org-tags-match-list-sublevels nil))
583   nil)
584
585 (defun bh/list-sublevels-for-projects ()
586   "Set org-tags-match-list-sublevels so when restricted to a subtree we list all subtasks.
587   This is normally used by skipping functions where this variable is already local to the agenda."
588   (if (marker-buffer org-agenda-restrict-begin)
589       (setq org-tags-match-list-sublevels t)
590     (setq org-tags-match-list-sublevels nil))
591   nil)
592
593 (defvar bh/hide-scheduled-and-waiting-next-tasks t)
594
595 (defun bh/toggle-next-task-display ()
596   (interactive)
597   (setq bh/hide-scheduled-and-waiting-next-tasks (not bh/hide-scheduled-and-waiting-next-tasks))
598   (when  (equal major-mode 'org-agenda-mode)
599     (org-agenda-redo))
600   (message "%s WAITING and SCHEDULED NEXT Tasks" (if bh/hide-scheduled-and-waiting-next-tasks "Hide" "Show")))
601
602 (defun bh/skip-stuck-projects ()
603   "Skip trees that are not stuck projects"
604   (save-restriction
605     (widen)
606     (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
607       (if (bh/is-project-p)
608           (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
609                  (has-next ))
610             (save-excursion
611               (forward-line 1)
612               (while (and (not has-next) (< (point) subtree-end) (re-search-forward "^\\*+ NEXT " subtree-end t))
613                 (unless (member "WAITING" (org-get-tags-at))
614                   (setq has-next t))))
615             (if has-next
616                 nil
617               next-headline)) ; a stuck project, has subtasks but no next task
618         nil))))
619
620 (defun bh/skip-non-stuck-projects ()
621   "Skip trees that are not stuck projects"
622   ;; (bh/list-sublevels-for-projects-indented)
623   (save-restriction
624     (widen)
625     (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
626       (if (bh/is-project-p)
627           (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
628                  (has-next ))
629             (save-excursion
630               (forward-line 1)
631               (while (and (not has-next) (< (point) subtree-end) (re-search-forward "^\\*+ NEXT " subtree-end t))
632                 (unless (member "WAITING" (org-get-tags-at))
633                   (setq has-next t))))
634             (if has-next
635                 next-headline
636               nil)) ; a stuck project, has subtasks but no next task
637         next-headline))))
638
639 (defun bh/skip-non-projects ()
640   "Skip trees that are not projects"
641   ;; (bh/list-sublevels-for-projects-indented)
642   (if (save-excursion (bh/skip-non-stuck-projects))
643       (save-restriction
644         (widen)
645         (let ((subtree-end (save-excursion (org-end-of-subtree t))))
646           (cond
647            ((bh/is-project-p)
648             nil)
649            ((and (bh/is-project-subtree-p) (not (bh/is-task-p)))
650             nil)
651            (t
652             subtree-end))))
653     (save-excursion (org-end-of-subtree t))))
654
655 (defun bh/skip-project-trees-and-habits ()
656   "Skip trees that are projects"
657   (save-restriction
658     (widen)
659     (let ((subtree-end (save-excursion (org-end-of-subtree t))))
660       (cond
661        ((bh/is-project-p)
662         subtree-end)
663        ((org-is-habit-p)
664         subtree-end)
665        (t
666         nil)))))
667
668 (defun bh/skip-projects-and-habits-and-single-tasks ()
669   "Skip trees that are projects, tasks that are habits, single non-project tasks"
670   (save-restriction
671     (widen)
672     (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
673       (cond
674        ((org-is-habit-p)
675         next-headline)
676        ((and bh/hide-scheduled-and-waiting-next-tasks
677              (member "WAITING" (org-get-tags-at)))
678         next-headline)
679        ((bh/is-project-p)
680         next-headline)
681        ((and (bh/is-task-p) (not (bh/is-project-subtree-p)))
682         next-headline)
683        (t
684         nil)))))
685
686 (defun bh/skip-project-tasks-maybe ()
687   "Show tasks related to the current restriction.
688 When restricted to a project, skip project and sub project tasks, habits, NEXT tasks, and loose tasks.
689 When not restricted, skip project and sub-project tasks, habits, and project related tasks."
690   (save-restriction
691     (widen)
692     (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
693            (next-headline (save-excursion (or (outline-next-heading) (point-max))))
694            (limit-to-project (marker-buffer org-agenda-restrict-begin)))
695       (cond
696        ((bh/is-project-p)
697         next-headline)
698        ((org-is-habit-p)
699         subtree-end)
700        ((and (not limit-to-project)
701              (bh/is-project-subtree-p))
702         subtree-end)
703        ((and limit-to-project
704              (bh/is-project-subtree-p)
705              (member (org-get-todo-state) (list "NEXT")))
706         subtree-end)
707        (t
708         nil)))))
709
710 (defun bh/skip-project-tasks ()
711   "Show non-project tasks.
712 Skip project and sub-project tasks, habits, and project related tasks."
713   (save-restriction
714     (widen)
715     (let* ((subtree-end (save-excursion (org-end-of-subtree t))))
716       (cond
717        ((bh/is-project-p)
718         subtree-end)
719        ((org-is-habit-p)
720         subtree-end)
721        ((bh/is-project-subtree-p)
722         subtree-end)
723        (t
724         nil)))))
725
726 (defun bh/skip-non-project-tasks ()
727   "Show project tasks.
728 Skip project and sub-project tasks, habits, and loose non-project tasks."
729   (save-restriction
730     (widen)
731     (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
732            (next-headline (save-excursion (or (outline-next-heading) (point-max)))))
733       (cond
734        ((bh/is-project-p)
735         next-headline)
736        ((org-is-habit-p)
737         subtree-end)
738        ((and (bh/is-project-subtree-p)
739              (member (org-get-todo-state) (list "NEXT")))
740         subtree-end)
741        ((not (bh/is-project-subtree-p))
742         subtree-end)
743        (t
744         nil)))))
745
746 (defun bh/skip-projects-and-habits ()
747   "Skip trees that are projects and tasks that are habits"
748   (save-restriction
749     (widen)
750     (let ((subtree-end (save-excursion (org-end-of-subtree t))))
751       (cond
752        ((bh/is-project-p)
753         subtree-end)
754        ((org-is-habit-p)
755         subtree-end)
756        (t
757         nil)))))
758
759 (defun bh/skip-non-subprojects ()
760   "Skip trees that are not projects"
761   (let ((next-headline (save-excursion (outline-next-heading))))
762     (if (bh/is-subproject-p)
763         nil
764       next-headline)))
765 ;
766 ;; Resume clocking task when emacs is restarted
767 (org-clock-persistence-insinuate)
768 ;;
769 ;; Show lot of clocking history so it's easy to pick items off the C-F11 list
770 (setq org-clock-history-length 23)
771 ;; Resume clocking task on clock-in if the clock is open
772 (setq org-clock-in-resume t)
773 ;; Change tasks to NEXT when clocking in
774 (setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
775 ;; Separate drawers for clocking and logs
776 (setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
777 ;; Save clock data and state changes and notes in the LOGBOOK drawer
778 (setq org-clock-into-drawer t)
779 (setq org-log-into-drawer t)
780 ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
781 (setq org-clock-out-remove-zero-time-clocks t)
782 ;; Clock out when moving task to a done state
783 (setq org-clock-out-when-done t)
784 ;; Save the running clock and all clock history when exiting Emacs, load it on startup
785 (setq org-clock-persist t)
786 ;; Do not prompt to resume an active clock
787 (setq org-clock-persist-query-resume nil)
788 ;; Enable auto clock resolution for finding open clocks
789 (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
790 ;; Include current clocking task in clock reports
791 (setq org-clock-report-include-clocking-task t)
792
793
794 (defvar bh/keep-clock-running nil)
795
796 (defun bh/clock-in-to-next (kw)
797   "Switch a task from TODO to NEXT when clocking in.
798 Skips capture tasks, projects, and subprojects.
799 Switch projects and subprojects from NEXT back to TODO"
800   (when (not (and (boundp 'org-capture-mode) org-capture-mode))
801     (cond
802      ((and (member (org-get-todo-state) (list "TODO"))
803            (bh/is-task-p))
804       "NEXT")
805      ((and (member (org-get-todo-state) (list "NEXT"))
806            (bh/is-project-p))
807       "TODO"))))
808
809 (defun bh/find-project-task ()
810   "Move point to the parent (project) task if any"
811   (save-restriction
812     (widen)
813     (let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point))))
814       (while (org-up-heading-safe)
815         (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
816           (setq parent-task (point))))
817       (goto-char parent-task)
818       parent-task)))
819
820 (defun bh/punch-in (arg)
821   "Start continuous clocking and set the default task to the
822 selected task.  If no task is selected set the Organization task
823 as the default task."
824   (interactive "p")
825   (setq bh/keep-clock-running t)
826   (if (equal major-mode 'org-agenda-mode)
827       ;;
828       ;; We're in the agenda
829       ;;
830       (let* ((marker (org-get-at-bol 'org-hd-marker))
831              (tags (org-with-point-at marker (org-get-tags-at))))
832         (if (and (eq arg 4) tags)
833             (org-agenda-clock-in '(16))
834           (bh/clock-in-organization-task-as-default)))
835     ;;
836     ;; We are not in the agenda
837     ;;
838     (save-restriction
839       (widen)
840       ; Find the tags on the current task
841       (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
842           (org-clock-in '(16))
843         (bh/clock-in-organization-task-as-default)))))
844
845 (defun bh/punch-out ()
846   (interactive)
847   (setq bh/keep-clock-running nil)
848   (when (org-clock-is-active)
849     (org-clock-out))
850   (org-agenda-remove-restriction-lock))
851
852 (defun bh/clock-in-default-task ()
853   (save-excursion
854     (org-with-point-at org-clock-default-task
855       (org-clock-in))))
856
857 (defun bh/clock-in-parent-task ()
858   "Move point to the parent (project) task if any and clock in"
859   (let ((parent-task))
860     (save-excursion
861       (save-restriction
862         (widen)
863         (while (and (not parent-task) (org-up-heading-safe))
864           (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
865             (setq parent-task (point))))
866         (if parent-task
867             (org-with-point-at parent-task
868               (org-clock-in))
869           (when bh/keep-clock-running
870             (bh/clock-in-default-task)))))))
871
872 (defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4")
873
874 (defun bh/clock-in-organization-task-as-default ()
875   (interactive)
876   (org-with-point-at (org-id-find bh/organization-task-id 'marker)
877     (org-clock-in '(16))))
878
879 (defun bh/clock-out-maybe ()
880   (when (and bh/keep-clock-running
881              (not org-clock-clocking-in)
882              (marker-buffer org-clock-default-task)
883              (not org-clock-resolving-clocks-due-to-idleness))
884     (bh/clock-in-parent-task)))
885
886 (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
887
888 (require 'org-id)
889 (defun bh/clock-in-task-by-id (id)
890   "Clock in a task by id"
891   (org-with-point-at (org-id-find id 'marker)
892     (org-clock-in nil)))
893
894 (defun bh/clock-in-last-task (arg)
895   "Clock in the interrupted task if there is one
896 Skip the default task and get the next one.
897 A prefix arg forces clock in of the default task."
898   (interactive "p")
899   (let ((clock-in-to-task
900          (cond
901           ((eq arg 4) org-clock-default-task)
902           ((and (org-clock-is-active)
903                 (equal org-clock-default-task (cadr org-clock-history)))
904            (caddr org-clock-history))
905           ((org-clock-is-active) (cadr org-clock-history))
906           ((equal org-clock-default-task (car org-clock-history)) (cadr org-clock-history))
907           (t (car org-clock-history)))))
908     (widen)
909     (org-with-point-at clock-in-to-task
910       (org-clock-in nil))))
911