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