8 ;; The following lines are always needed. Choose your own keys.
9 (add-to-list 'auto-mode-alist '("\\.\\(org\\|org_archive\\|txt\\)$" . org-mode))
12 (global-set-key "\C-cl" 'org-store-link)
13 (global-set-key "\C-ca" 'org-agenda)
14 (global-set-key "\C-cb" 'org-iswitchb)
15 (setq-default org-log-done 'time)
16 (setq-default org-agenda-ndays 5)
18 ;; agenda configuration
19 ;; Do not dim blocked tasks
20 (setq org-agenda-dim-blocked-tasks nil)
22 ;; Compact the block agenda view
23 (setq org-agenda-compact-blocks t)
25 ;; Custom agenda command definitions
26 (setq org-agenda-custom-commands
27 (quote (("N" "Notes" tags "NOTE"
28 ((org-agenda-overriding-header "Notes")
29 (org-tags-match-list-sublevels t)))
30 ("h" "Habits" tags-todo "STYLE=\"habit\""
31 ((org-agenda-overriding-header "Habits")
32 (org-agenda-sorting-strategy
33 '(todo-state-down effort-up category-keep))))
37 ((org-agenda-overriding-header "Tasks to Refile")
38 (org-tags-match-list-sublevels nil)))
39 (tags-todo "-CANCELLED/!"
40 ((org-agenda-overriding-header "Stuck Projects")
41 (org-agenda-skip-function 'bh/skip-non-stuck-projects)
42 (org-agenda-sorting-strategy
44 (tags-todo "-HOLD-CANCELLED/!"
45 ((org-agenda-overriding-header "Projects")
46 (org-agenda-skip-function 'bh/skip-non-projects)
47 (org-tags-match-list-sublevels 'indented)
48 (org-agenda-sorting-strategy
50 (tags-todo "-CANCELLED/!NEXT"
51 ((org-agenda-overriding-header (concat "Project Next Tasks"
52 (if bh/hide-scheduled-and-waiting-next-tasks
54 " (including WAITING and SCHEDULED tasks)")))
55 (org-agenda-skip-function 'bh/skip-projects-and-habits-and-single-tasks)
56 (org-tags-match-list-sublevels t)
57 (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
58 (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
59 (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
60 (org-agenda-sorting-strategy
61 '(todo-state-down effort-up category-keep))))
62 (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
63 ((org-agenda-overriding-header (concat "Project Subtasks"
64 (if bh/hide-scheduled-and-waiting-next-tasks
66 " (including WAITING and SCHEDULED tasks)")))
67 (org-agenda-skip-function 'bh/skip-non-project-tasks)
68 (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
69 (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
70 (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
71 (org-agenda-sorting-strategy
73 (tags-todo "-REFILE-CANCELLED-WAITING-HOLD/!"
74 ((org-agenda-overriding-header (concat "Standalone Tasks"
75 (if bh/hide-scheduled-and-waiting-next-tasks
77 " (including WAITING and SCHEDULED tasks)")))
78 (org-agenda-skip-function 'bh/skip-project-tasks)
79 (org-agenda-todo-ignore-scheduled bh/hide-scheduled-and-waiting-next-tasks)
80 (org-agenda-todo-ignore-deadlines bh/hide-scheduled-and-waiting-next-tasks)
81 (org-agenda-todo-ignore-with-date bh/hide-scheduled-and-waiting-next-tasks)
82 (org-agenda-sorting-strategy
84 (tags-todo "-CANCELLED+WAITING|HOLD/!"
85 ((org-agenda-overriding-header "Waiting and Postponed Tasks")
86 (org-agenda-skip-function 'bh/skip-stuck-projects)
87 (org-tags-match-list-sublevels nil)
88 (org-agenda-todo-ignore-scheduled t)
89 (org-agenda-todo-ignore-deadlines t)))
91 ((org-agenda-overriding-header "Tasks to Archive")
92 (org-agenda-skip-function 'bh/skip-non-archivable-tasks)
93 (org-tags-match-list-sublevels nil))))
96 ; org mode agenda files
97 (setq org-agenda-files
98 (quote ("~/projects/org-notes/debbugs.org"
99 "~/projects/org-notes/notes.org"
100 "~/projects/org-notes/refile.org"
101 "~/projects/org-notes/diary.org"
102 "~/projects/org-notes/ool.org"
103 "~/projects/org-notes/sndservers.org"
104 "~/projects/org-notes/chaim.org"
105 "~/projects/org-notes/wildman.org"
106 "~/projects/org-notes/uddin.org"
107 "~/projects/org-notes/reviews.org"
108 "~/projects/org-notes/hpcbio.org"
109 "~/org-mode/from-mobile.org"
110 "~/projects/org-notes/fh.org")))
112 (set-register ?n (cons 'file "~/projects/org-notes/notes.org"))
113 (set-register ?r (cons 'file "~/projects/org-notes/refile.org"))
114 (set-register ?o (cons 'file "~/projects/org-notes/ool.org"))
115 (set-register ?s (cons 'file "~/projects/org-notes/sndservers.org"))
116 (set-register ?c (cons 'file "~/projects/org-notes/chaim.org"))
117 (set-register ?w (cons 'file "~/projects/org-notes/wildman.org"))
118 (set-register ?u (cons 'file "~/projects/org-notes/uddin.org"))
119 (set-register ?R (cons 'file "~/projects/reviews/reviews.org"))
120 (set-register ?d (cons 'file "~/projects/org-notes/diary.org"))
122 (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")))
123 (setq org-columns-default-format "%40ITEM(Task) %6Effort{:} %CLOCKSUM %PRIORITY %TODO %13SCHEDULED %13DEADLINE %TAGS")
125 ;; add automatic reminders for appointments
126 (defadvice org-agenda-redo (after org-agenda-redo-add-appts)
127 "Pressing `r' on the agenda will also add appointments."
129 (setq appt-time-msg-list nil)
130 (org-agenda-to-appt)))
132 (setq org-default-notes-file "~/projects/org-notes/notes.org")
133 (setq org-id-link-to-org-use-id t)
134 (setq org-capture-templates ;; mail-specific note template, identified by "m"
135 '(("m" "Mail" entry (file+headline "~/projects/org-notes/refile.org" "Mail")
136 "* %?\n\n Source: %u, %c\n %i")
137 ("t" "todo" entry (file "~/projects/org-notes/refile.org")
138 "* TODO %?\n :PROPERTIES:\n :END:\n :LOGBOOK:\n :END:\n%U\n%a\n" :clock-in t :clock-resume t)
139 ("r" "respond" entry (file "~/projects/org-notes/refile.org")
140 "* NEXT Respond to %:from on %:subject\nSCHEDULED: %t\n%U\n%a\n" :clock-in t :clock-resume t :immediate-finish t)
141 ("n" "note" entry (file "~/projects/org-notes/refile.org")
142 "* %? :NOTE:\n%U\n%a\n" :clock-in t :clock-resume t)
143 ("s" "schedule" entry (file "~/projects/org-notes/refile.org")
144 "* %? :cal:\n%^{scheduled:}t\n%U\n%a\n" :clock-in t :clock-resume t)
145 ("j" "Journal" entry (file+datetree "~/projects/org-notes/diary.org")
146 "* %?\n%U\n" :clock-in t :clock-resume t)
147 ("w" "org-protocol" entry (file "~/projects/org-notes/refile.org")
148 "* TODO Review %c\n%U\n" :immediate-finish t)
149 ("M" "Meeting" entry (file "~/projects/org-notes/refile.org")
150 "* MEETING with %? :MEETING:\n%U" :clock-in t :clock-resume t)
151 ("S" "Seminar" entry (file "~/projects/org-notes/refile.org")
152 "* SEMINAR notes %? :SEMINAR:\n%U" :clock-in t :clock-resume t)
153 ("P" "Paper to read" entry (file+headline "~/projects/research/papers_to_read.org" "Refile")
154 "* TODO Get/Read %? \n%U" :clock-in t :clock-resume t)
155 ("p" "Phone call" entry (file "~/projects/org-notes/refile.org")
156 "* PHONE %? :PHONE:\n%U" :clock-in t :clock-resume t)
157 ("J" "job" entry (file "~/projects/org-notes/refile.org")
158 "* TODO Apply for %a%? :job:\nSCHEDULED: %(format-time-string \"<%Y-%m-%d 17:00-17:30>\")\n%U\n%a\n" :clock-in t :clock-resume t)
159 ("h" "Habit" entry (file "~/projects/org-notes/refile.org")
160 "* NEXT %?\n%U\n%a\nSCHEDULED: %(format-time-string \"<%Y-%m-%d .+1d/3d>\")\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n%a\n")
164 ;; Remove empty LOGBOOK drawers on clock out
165 (defun bh/remove-empty-drawer-on-clock-out ()
168 (beginning-of-line 0)
169 (org-remove-empty-drawer-at (point))))
171 (defun my/org-add-id ()
174 (if (org-current-level)
182 ; org mode configuration from http://doc.norang.ca/org-mode.html
183 ;; Custom Key Bindings
184 (global-set-key (kbd "<f12>") 'org-agenda)
185 (global-set-key (kbd "<f5>") 'bh/org-todo)
186 (global-set-key (kbd "<S-f5>") 'bh/widen)
187 (global-set-key (kbd "<f7>") 'bh/set-truncate-lines)
188 (global-set-key (kbd "<f8>") 'org-cycle-agenda-files)
189 (global-set-key (kbd "<f9> <f9>") 'bh/show-org-agenda)
190 (global-set-key (kbd "<f9> b") 'bbdb)
191 (global-set-key (kbd "<f9> c") 'calendar)
192 (global-set-key (kbd "<f9> f") 'boxquote-insert-file)
193 (global-set-key (kbd "<f9> h") 'bh/hide-other)
194 (global-set-key (kbd "<f9> n") 'bh/toggle-next-task-display)
195 (global-set-key (kbd "<f9> w") 'widen)
197 ; change the outline mode prefix from C-c @ to C-c C-2
198 (setq outline-minor-mode-prefix "C-c C-2")
199 ;(add-hook 'outline-minor-mode-hook
200 ; (lambda () (local-set-key (kbd "C-c C-2")
201 ; outline-mode-prefix-map)))
203 (global-set-key (kbd "<f9> I") 'bh/punch-in)
204 (global-set-key (kbd "<f9> O") 'bh/punch-out)
206 (global-set-key (kbd "<f9> o") 'bh/make-org-scratch)
208 (global-set-key (kbd "<f9> r") 'boxquote-region)
209 (global-set-key (kbd "<f9> s") 'bh/switch-to-scratch)
211 (global-set-key (kbd "<f9> t") 'bh/insert-inactive-timestamp)
212 (global-set-key (kbd "<f9> T") 'bh/toggle-insert-inactive-timestamp)
214 (global-set-key (kbd "<f9> v") 'visible-mode)
215 (global-set-key (kbd "<f9> l") 'org-toggle-link-display)
216 (global-set-key (kbd "<f9> SPC") 'bh/clock-in-last-task)
217 (global-set-key (kbd "C-<f9>") 'previous-buffer)
218 (global-set-key (kbd "M-<f9>") 'org-toggle-inline-images)
219 (global-set-key (kbd "C-x n r") 'narrow-to-region)
220 (global-set-key (kbd "C-<f10>") 'next-buffer)
221 (global-set-key (kbd "<f11>") 'org-clock-goto)
222 (global-set-key (kbd "C-<f11>") 'org-clock-in)
223 (global-set-key (kbd "C-s-<f12>") 'bh/save-then-publish)
224 (global-set-key (kbd "C-c c") 'org-capture)
226 (defun bh/hide-other ()
229 (org-back-to-heading 'invisible-ok)
235 (defun bh/set-truncate-lines ()
236 "Toggle value of truncate-lines and refresh window display."
238 (setq truncate-lines (not truncate-lines))
239 ;; now refresh window display (an idiom from simple.el):
241 (set-window-start (selected-window)
242 (window-start (selected-window)))))
244 (defun bh/make-org-scratch ()
246 (find-file "/tmp/publish/scratch.org")
247 (gnus-make-directory "/tmp/publish"))
249 (defun bh/switch-to-scratch ()
251 (switch-to-buffer "*scratch*"))
253 (setq org-use-fast-todo-selection t)
254 (setq org-treat-S-cursor-todo-selection-as-state-change nil)
256 (setq org-todo-keywords
257 (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)")
258 (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING"))))
260 (setq org-todo-keyword-faces
261 (quote (("TODO" :foreground "red" :weight bold)
262 ("NEXT" :foreground "blue" :weight bold)
263 ("DONE" :foreground "forest green" :weight bold)
264 ("WAITING" :foreground "orange" :weight bold)
265 ("HOLD" :foreground "magenta" :weight bold)
266 ("CANCELLED" :foreground "forest green" :weight bold)
267 ("MEETING" :foreground "forest green" :weight bold)
268 ("PHONE" :foreground "forest green" :weight bold))))
270 (setq org-todo-state-tags-triggers
271 (quote (("CANCELLED" ("CANCELLED" . t))
272 ("WAITING" ("WAITING" . t))
273 ("HOLD" ("WAITING") ("HOLD" . t))
274 (done ("WAITING") ("HOLD"))
275 ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
276 ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
277 ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
281 ; (add-hook 'org-clock-out-hook 'bh/remove-empty-drawer-on-clock-out 'append)
282 ; add ids on creation of nodes
283 (add-hook 'org-capture-prepare-finalize-hook 'my/org-add-id)
284 ; create function to create headlines in file. This comes from
285 ; http://stackoverflow.com/questions/13340616/assign-ids-to-every-entry-in-org-mode
286 (defun my/org-add-ids-to-headlines-in-file ()
287 "Add ID properties to all headlines in the current file which
288 do not already have one."
290 (org-map-entries 'org-id-get-create))
291 ; if we wanted to do this to every buffer, do the following:
292 ; (add-hook 'org-mode-hook
294 ; (add-hook 'before-save-hook 'my/org-add-ids-to-headlines-in-file nil 'local)))
297 ; resolve clocks after 10 minutes of idle; use xprintidle
298 ; (setq org-clock-idle-time 10)
299 ; (setq org-clock-x11idle-program-name "xprintidle")
301 ; this is from http://doc.norang.ca/org-mode.html#Capture
302 ; use C-M-r for org mode capture
303 (global-set-key (kbd "C-M-r") 'org-capture)
305 ; Targets include this file and any file contributing to the agenda - up to 9 levels deep
306 (setq org-refile-targets (quote ((nil :maxlevel . 9)
307 (org-agenda-files :maxlevel . 9))))
309 ; Use full outline paths for refile targets - we file directly with IDO
310 (setq org-refile-use-outline-path t)
312 ; Targets complete directly with IDO
313 (setq org-outline-path-complete-in-steps nil)
315 ; Allow refile to create parent tasks with confirmation
316 (setq org-refile-allow-creating-parent-nodes (quote confirm))
318 ; ; Use IDO for both buffer and file completion and ido-everywhere to t
319 ; (setq org-completion-use-ido t)
320 ; (setq ido-everywhere t)
321 ; (setq ido-max-directory-size 100000)
322 ; (ido-mode (quote both))
323 ; ; Use the current window when visiting files and buffers with ido
324 ; (setq ido-default-file-method 'selected-window)
325 ; (setq ido-default-buffer-method 'selected-window)
326 ; ; Use the current window for indirect buffer display
327 ; (setq org-indirect-buffer-display 'current-window)
331 ; Exclude DONE state tasks from refile targets
332 (defun bh/verify-refile-target ()
333 "Exclude todo keywords with a done state from refile targets"
334 (not (member (nth 2 (org-heading-components)) org-done-keywords)))
336 (setq org-refile-target-verify-function 'bh/verify-refile-target)
338 ;; ensure that emacsclient will show just the note to be edited when invoked
339 ;; from Mutt, and that it will shut down emacsclient once finished;
340 ;; fallback to legacy behavior when not invoked via org-protocol.
341 (require 'org-protocol)
342 ; (add-hook 'org-capture-mode-hook 'delete-other-windows)
343 (setq my-org-protocol-flag nil)
344 (defadvice org-capture-finalize (after delete-frame-at-end activate)
345 "Delete frame at remember finalization"
346 (progn (if my-org-protocol-flag (delete-frame))
347 (setq my-org-protocol-flag nil)))
348 (defadvice org-capture-refile (around delete-frame-after-refile activate)
349 "Delete frame at remember refile"
350 (if my-org-protocol-flag
352 (setq my-org-protocol-flag nil)
357 (defadvice org-capture-kill (after delete-frame-at-end activate)
358 "Delete frame at remember abort"
359 (progn (if my-org-protocol-flag (delete-frame))
360 (setq my-org-protocol-flag nil)))
361 (defadvice org-protocol-capture (before set-org-protocol-flag activate)
362 (setq my-org-protocol-flag t))
364 (defadvice org-insert-todo-heading (after dla/create-id activate)
369 (add-to-list 'org-modules 'org-habit)
371 ; this comes from http://upsilon.cc/~zack/blog/posts/2010/02/integrating_Mutt_with_Org-mode/
372 (defun open-mail-in-mutt (message)
373 "Open a mail message in Mutt, using an external terminal.
375 Message can be specified either by a path pointing inside a
376 Maildir, or by Message-ID."
377 (interactive "MPath or Message-ID: ")
379 (format "faf xterm -e \"%s %s\""
380 (substitute-in-file-name "$HOME/bin/mutt_open") message)))
382 ;; add support for "mutt:ID" links
383 (org-add-link-type "mutt" 'open-mail-in-mutt)
385 (defun my-org-mode-setup ()
386 (load-library "reftex")
387 (and (buffer-file-name)
388 (file-exists-p (buffer-file-name))
391 (reftex-set-cite-format
392 '((?b . "[[bib:%l][%l-bib]]")
393 (?n . "[[notes:%l][%l-notes]]")
395 (?h . "*** %t\n:PROPERTIES:\n:Custom_ID: %l\n:END:\n[[papers:%l][%l xoj]] [[papers-pdf:%l][pdf]]")))
397 (define-key org-mode-map (kbd "C-c )") 'reftex-citation)
398 (define-key org-mode-map (kbd "C-c [") 'reftex-citation)
399 (define-key org-mode-map (kbd "C-c (") 'org-mode-reftex-search)
400 (define-key org-mode-map (kbd "C-c 0") 'reftex-view-crossref)
402 (add-hook 'org-mode-hook 'my-org-mode-setup)
404 (defun org-mode-reftex-search ()
406 (org-open-link-from-string (format "[[notes:%s]]" (first (reftex-citation t)))))
408 (defun open-research-paper (bibtexkey)
409 "Open a paper by bibtex key"
410 (interactive "bibtex key: ")
413 (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
414 (org-add-link-type "papers" 'open-research-paper)
415 (defun open-research-paper-pdf (bibtexkey)
416 "Open a paper pdf by bibtex key"
417 (interactive "bibtex key: ")
419 (format "%s -p evince_annot %s"
420 (substitute-in-file-name "$HOME/bin/bibtex_to_paper") bibtexkey)))
421 (org-add-link-type "papers-pdf" 'open-research-paper-pdf)
423 (add-to-list 'org-link-abbrev-alist
425 "~/projects/research/paper_notes.org::#%s"))
427 ; I pretty much always want hiearchical checkboxes
428 (setq org-hierachical-checkbox-statistics nil)
430 ;; Add \begin{equation}\end{equation} templates to the org mode easy templates
431 (add-to-list 'org-structure-template-alist
432 '("E" "\\begin{equation}\n?\n\\end{equation}"))
435 ;; http://www-public.it-sudparis.eu/~berger_o/weblog/2012/03/23/how-to-manage-and-export-bibliographic-notesrefs-in-org-mode/
436 (defun my-rtcite-export-handler (path desc format)
437 (message "my-rtcite-export-handler is called : path = %s, desc = %s, format = %s" path desc format)
438 (let* ((search (when (string-match "::#?\\(.+\\)\\'" path)
439 (match-string 1 path)))
440 (path (substring path 0 (match-beginning 0))))
441 (cond ((eq format 'latex)
443 (equal 0 (search "rtcite:" desc)))
444 (format "\\cite{%s}" search)
445 (format "\\cite[%s]{%s}" desc search))))))
447 (org-add-link-type "rtcite"
449 'my-rtcite-export-handler)
452 (setq-default org-mobile-directory "/linnode.donarmstrong.com:/sites/dav.donarmstrong.com/root/org/")
453 (when (string= system-name "linnode.donarmstrong.com")
454 (setq-default org-mobile-directory "/sites/dav.donarmstrong.com/root/org/"))
455 (setq-default org-directory "/home/don/org-mode/")
456 (setq-default org-mobile-inbox-for-pull "/home/don/org-mode/from-mobile.org")
458 ;; org mode ical export
459 (setq org-icalendar-timezone "America/Los_Angeles")
460 (setq org-icalendar-use-scheduled '(todo-start event-if-todo))
461 ;; we already add the id manually
462 ;; (setq org-icalendar-store-UID t)
465 (org-babel-do-load-languages
466 'org-babel-load-languages
473 ;; use graphviz-dot for dot things
474 (add-to-list 'org-src-lang-modes '("dot" . graphviz-dot))
475 ;; org-babel-by-backend
476 (defmacro org-babel-by-backend (&rest body)
477 `(case (if (boundp 'backend)
478 (org-export-backend-name backend)
481 (defun my/fix-inline-images ()
482 (when org-inline-image-overlays
483 (org-redisplay-inline-images)))
485 (add-hook 'org-babel-after-execute-hook
486 'my/fix-inline-images)
489 ;; ;; stolen from http://kieranhealy.org/esk/kjhealy.html
490 ;; (require 'org-latex)
491 ;; ;; Choose either listings or minted for exporting source code blocks.
492 ;; ;; Using minted (as here) requires pygments be installed. To use the
493 ;; ;; default listings package instead, use
494 ;; ;; (setq org-latex-listings t)
495 ;; ;; and change references to "minted" below to "listings"
496 ;; ; (setq org-latex-listings 'minted)
498 ;; ;; default settings for minted code blocks
499 ;; (setq org-latex-minted-options
500 ;; '(;("frame" "single")
501 ;; ("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.
502 ;; ("fontsize" "\\small")
504 ;; ;; turn off the default toc behavior; deal with it properly in headers to files.
505 ;; (defun org-latex-no-toc (depth)
507 ;; (format "%% Org-mode is exporting headings to %s levels.\n"
509 ;; (setq org-latex-format-toc-function 'org-latex-no-toc)
512 (add-to-list 'org-latex-classes
514 "\\documentclass[11pt,oneside,article]{memoir}\n"
515 ("\\section{%s}" . "\\section*{%s}")
516 ("\\subsection{%s}" . "\\subsection*{%s}")
517 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
518 ("\\paragraph{%s}" . "\\paragraph*{%s}")
519 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
521 (setq org-beamer-outline-frame-options "")
523 (add-to-list 'org-latex-classes
525 "\\documentclass[ignorenonframetext]{beamer}
526 [NO-DEFAULT-PACKAGES]
529 ("\\section{%s}" . "\\section*{%s}")
530 ("\\subsection{%s}" . "\\subsection*{%s}")
531 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
532 ("\\paragraph{%s}" . "\\paragraph*{%s}")
533 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
535 (add-to-list 'org-latex-classes
537 "\\documentclass[11pt,oneside]{memoir}\n"
538 ("\\chapter{%s}" . "\\chapter*{%s}")
539 ("\\section{%s}" . "\\section*{%s}")
540 ("\\subsection{%s}" . "\\subsection*{%s}")
541 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")))
543 (add-to-list 'org-latex-classes
545 "\\documentclass[11pt]{letter}
546 [NO-DEFAULT-PACKAGES]
549 ("\\section{%s}" . "\\section*{%s}")
550 ("\\subsection{%s}" . "\\subsection*{%s}")
551 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
552 ("\\paragraph{%s}" . "\\paragraph*{%s}")
553 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
555 (add-to-list 'org-latex-classes
557 "\\documentclass{dlacv}
558 [NO-DEFAULT-PACKAGES]
561 ("\\section{%s}" . "\\section*{%s}")
562 ("\\subsection{%s}" . "\\subsection*{%s}")
563 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
564 ("\\paragraph{%s}" . "\\paragraph*{%s}")
565 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
568 (add-to-list 'org-latex-classes
570 "\\documentclass{dlaresume}
571 [NO-DEFAULT-PACKAGES]
574 ("\\section{%s}" . "\\section*{%s}")
575 ("\\subsection{%s}" . "\\subsection*{%s}")
576 ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
577 ("\\paragraph{%s}" . "\\paragraph*{%s}")
578 ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
581 ;; Originally taken from Bruno Tavernier: http://thread.gmane.org/gmane.emacs.orgmode/31150/focus=31432
582 ;; but adapted to use latexmk 4.22 or higher.
583 (setq org-latex-pdf-process '("latexmk -f -pdflatex=xelatex -bibtex -use-make -pdf %f"))
585 ;; Default packages included in /every/ tex file, latex, pdflatex or xelatex
586 (setq org-latex-default-packages-alist
588 ("" "unicode-math" t)
590 (setq org-latex-packages-alist
600 ;; make equations larger
601 (setq org-format-latex-options (plist-put org-format-latex-options :scale 2.0))
603 (defun org-create-formula--latex-header ()
604 "Return LaTeX header appropriate for previewing a LaTeX snippet."
605 (let ((info (org-combine-plists (org-export--get-global-options
606 (org-export-get-backend 'latex))
607 (org-export--get-inbuffer-options
608 (org-export-get-backend 'latex)))))
609 (org-latex-guess-babel-language
610 (org-latex-guess-inputenc
611 (org-splice-latex-header
612 org-format-latex-header
613 org-latex-default-packages-alist
615 (plist-get info :latex-header)))
619 ; support ignoring headers in org mode export to latex
620 ; from http://article.gmane.org/gmane.emacs.orgmode/67692
621 (defadvice org-latex-headline (around my-latex-skip-headlines
622 (headline contents info) activate)
623 (if (member "ignoreheading" (org-element-property :tags headline))
624 (setq ad-return-value contents)
627 ;; keep latex logfiles
629 (setq org-latex-remove-logfiles nil)
632 (defun bh/is-project-p ()
633 "Any task with a todo keyword subtask"
637 (subtree-end (save-excursion (org-end-of-subtree t)))
638 (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
641 (while (and (not has-subtask)
642 (< (point) subtree-end)
643 (re-search-forward "^\*+ " subtree-end t))
644 (when (member (org-get-todo-state) org-todo-keywords-1)
645 (setq has-subtask t))))
646 (and is-a-task has-subtask))))
648 (defun bh/is-project-subtree-p ()
649 "Any task with a todo keyword that is in a project subtree.
650 Callers of this function already widen the buffer view."
651 (let ((task (save-excursion (org-back-to-heading 'invisible-ok)
654 (bh/find-project-task)
655 (if (equal (point) task)
659 (defun bh/is-task-p ()
660 "Any task with a todo keyword and no subtask"
664 (subtree-end (save-excursion (org-end-of-subtree t)))
665 (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
668 (while (and (not has-subtask)
669 (< (point) subtree-end)
670 (re-search-forward "^\*+ " subtree-end t))
671 (when (member (org-get-todo-state) org-todo-keywords-1)
672 (setq has-subtask t))))
673 (and is-a-task (not has-subtask)))))
675 (defun bh/is-subproject-p ()
676 "Any task which is a subtask of another project"
677 (let ((is-subproject)
678 (is-a-task (member (nth 2 (org-heading-components)) org-todo-keywords-1)))
680 (while (and (not is-subproject) (org-up-heading-safe))
681 (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
682 (setq is-subproject t))))
683 (and is-a-task is-subproject)))
685 (defun bh/list-sublevels-for-projects-indented ()
686 "Set org-tags-match-list-sublevels so when restricted to a subtree we list all subtasks.
687 This is normally used by skipping functions where this variable is already local to the agenda."
688 (if (marker-buffer org-agenda-restrict-begin)
689 (setq org-tags-match-list-sublevels 'indented)
690 (setq org-tags-match-list-sublevels nil))
693 (defun bh/list-sublevels-for-projects ()
694 "Set org-tags-match-list-sublevels so when restricted to a subtree we list all subtasks.
695 This is normally used by skipping functions where this variable is already local to the agenda."
696 (if (marker-buffer org-agenda-restrict-begin)
697 (setq org-tags-match-list-sublevels t)
698 (setq org-tags-match-list-sublevels nil))
701 (defvar bh/hide-scheduled-and-waiting-next-tasks t)
703 (defun bh/toggle-next-task-display ()
705 (setq bh/hide-scheduled-and-waiting-next-tasks (not bh/hide-scheduled-and-waiting-next-tasks))
706 (when (equal major-mode 'org-agenda-mode)
708 (message "%s WAITING and SCHEDULED NEXT Tasks" (if bh/hide-scheduled-and-waiting-next-tasks "Hide" "Show")))
710 (defun bh/skip-stuck-projects ()
711 "Skip trees that are not stuck projects"
714 (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
715 (if (bh/is-project-p)
716 (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
720 (while (and (not has-next) (< (point) subtree-end) (re-search-forward "^\\*+ NEXT " subtree-end t))
721 (unless (member "WAITING" (org-get-tags-at))
725 next-headline)) ; a stuck project, has subtasks but no next task
728 (defun bh/skip-non-stuck-projects ()
729 "Skip trees that are not stuck projects"
730 ;; (bh/list-sublevels-for-projects-indented)
733 (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
734 (if (bh/is-project-p)
735 (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
739 (while (and (not has-next) (< (point) subtree-end) (re-search-forward "^\\*+ NEXT " subtree-end t))
740 (unless (member "WAITING" (org-get-tags-at))
744 nil)) ; a stuck project, has subtasks but no next task
747 (defun bh/skip-non-projects ()
748 "Skip trees that are not projects"
749 ;; (bh/list-sublevels-for-projects-indented)
750 (if (save-excursion (bh/skip-non-stuck-projects))
753 (let ((subtree-end (save-excursion (org-end-of-subtree t))))
757 ((and (bh/is-project-subtree-p) (not (bh/is-task-p)))
761 (save-excursion (org-end-of-subtree t))))
763 (defun bh/skip-project-trees-and-habits ()
764 "Skip trees that are projects"
767 (let ((subtree-end (save-excursion (org-end-of-subtree t))))
776 (defun bh/skip-projects-and-habits-and-single-tasks ()
777 "Skip trees that are projects, tasks that are habits, single non-project tasks"
780 (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))))
784 ((and bh/hide-scheduled-and-waiting-next-tasks
785 (member "WAITING" (org-get-tags-at)))
789 ((and (bh/is-task-p) (not (bh/is-project-subtree-p)))
794 (defun bh/skip-project-tasks-maybe ()
795 "Show tasks related to the current restriction.
796 When restricted to a project, skip project and sub project tasks, habits, NEXT tasks, and loose tasks.
797 When not restricted, skip project and sub-project tasks, habits, and project related tasks."
800 (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
801 (next-headline (save-excursion (or (outline-next-heading) (point-max))))
802 (limit-to-project (marker-buffer org-agenda-restrict-begin)))
808 ((and (not limit-to-project)
809 (bh/is-project-subtree-p))
811 ((and limit-to-project
812 (bh/is-project-subtree-p)
813 (member (org-get-todo-state) (list "NEXT")))
818 (defun bh/skip-project-tasks ()
819 "Show non-project tasks.
820 Skip project and sub-project tasks, habits, and project related tasks."
823 (let* ((subtree-end (save-excursion (org-end-of-subtree t))))
829 ((bh/is-project-subtree-p)
834 (defun bh/skip-non-project-tasks ()
836 Skip project and sub-project tasks, habits, and loose non-project tasks."
839 (let* ((subtree-end (save-excursion (org-end-of-subtree t)))
840 (next-headline (save-excursion (or (outline-next-heading) (point-max)))))
846 ((and (bh/is-project-subtree-p)
847 (member (org-get-todo-state) (list "NEXT")))
849 ((not (bh/is-project-subtree-p))
854 (defun bh/skip-projects-and-habits ()
855 "Skip trees that are projects and tasks that are habits"
858 (let ((subtree-end (save-excursion (org-end-of-subtree t))))
867 (defun bh/skip-non-subprojects ()
868 "Skip trees that are not projects"
869 (let ((next-headline (save-excursion (outline-next-heading))))
870 (if (bh/is-subproject-p)
874 ;; Resume clocking task when emacs is restarted
875 (org-clock-persistence-insinuate)
877 ;; Show lot of clocking history so it's easy to pick items off the C-F11 list
878 (setq org-clock-history-length 23)
879 ;; Resume clocking task on clock-in if the clock is open
880 (setq org-clock-in-resume t)
881 ;; Change tasks to NEXT when clocking in
882 (setq org-clock-in-switch-to-state 'bh/clock-in-to-next)
883 ;; (setq org-clock-in-switch-to-state "NEXT")
884 ;; Separate drawers for clocking and logs
885 (setq org-drawers (quote ("PROPERTIES" "LOGBOOK")))
886 ;; Save clock data and state changes and notes in the LOGBOOK drawer
887 (setq org-clock-into-drawer t)
888 (setq org-log-into-drawer t)
889 ;; Sometimes I change tasks I'm clocking quickly - this removes clocked tasks with 0:00 duration
890 (setq org-clock-out-remove-zero-time-clocks t)
891 ;; Clock out when moving task to a done state
892 (setq org-clock-out-when-done t)
893 ;; Save the running clock and all clock history when exiting Emacs, load it on startup
894 (setq org-clock-persist t)
895 ;; Do not prompt to resume an active clock
896 (setq org-clock-persist-query-resume nil)
897 ;; Enable auto clock resolution for finding open clocks
898 (setq org-clock-auto-clock-resolution (quote when-no-clock-is-running))
899 ;; Include current clocking task in clock reports
900 (setq org-clock-report-include-clocking-task t)
902 ;; the cache seems to be broken
903 (setq org-element-use-cache nil)
905 (defvar bh/keep-clock-running nil)
907 (defun bh/clock-in-to-next (kw)
908 "Switch a task from TODO to NEXT when clocking in.
909 Skips capture tasks, projects, and subprojects.
910 Switch projects and subprojects from NEXT back to TODO"
911 (when (not (and (boundp 'org-capture-mode) org-capture-mode))
913 ((and (member (org-get-todo-state) (list "TODO"))
916 ((and (member (org-get-todo-state) (list "NEXT"))
920 (defun bh/find-project-task ()
921 "Move point to the parent (project) task if any"
924 (let ((parent-task (save-excursion (org-back-to-heading 'invisible-ok) (point))))
925 (while (org-up-heading-safe)
926 (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
927 (setq parent-task (point))))
928 (goto-char parent-task)
931 (defun bh/punch-in (arg)
932 "Start continuous clocking and set the default task to the
933 selected task. If no task is selected set the Organization task
934 as the default task."
936 (setq bh/keep-clock-running t)
937 (if (equal major-mode 'org-agenda-mode)
939 ;; We're in the agenda
941 (let* ((marker (org-get-at-bol 'org-hd-marker))
942 (tags (org-with-point-at marker (org-get-tags-at))))
943 (if (and (eq arg 4) tags)
944 (org-agenda-clock-in '(16))
945 (bh/clock-in-organization-task-as-default)))
947 ;; We are not in the agenda
951 ; Find the tags on the current task
952 (if (and (equal major-mode 'org-mode) (not (org-before-first-heading-p)) (eq arg 4))
954 (bh/clock-in-organization-task-as-default)))))
956 (defun bh/punch-out ()
958 (setq bh/keep-clock-running nil)
959 (when (org-clock-is-active)
961 (org-agenda-remove-restriction-lock))
963 (defun bh/clock-in-default-task ()
965 (org-with-point-at org-clock-default-task
968 (defun bh/clock-in-parent-task ()
969 "Move point to the parent (project) task if any and clock in"
974 (while (and (not parent-task) (org-up-heading-safe))
975 (when (member (nth 2 (org-heading-components)) org-todo-keywords-1)
976 (setq parent-task (point))))
978 (org-with-point-at parent-task
980 (when bh/keep-clock-running
981 (bh/clock-in-default-task)))))))
983 (defvar bh/organization-task-id "e22cb8bf-07c7-408b-8f60-ff3aadac95e4")
985 (defun bh/clock-in-organization-task-as-default ()
987 (org-with-point-at (org-id-find bh/organization-task-id 'marker)
988 (org-clock-in '(16))))
990 (defun bh/clock-out-maybe ()
991 (when (and bh/keep-clock-running
992 (not org-clock-clocking-in)
993 (marker-buffer org-clock-default-task)
994 (not org-clock-resolving-clocks-due-to-idleness))
995 (bh/clock-in-parent-task)))
997 ; (add-hook 'org-clock-out-hook 'bh/clock-out-maybe 'append)
1000 (defun bh/clock-in-task-by-id (id)
1001 "Clock in a task by id"
1002 (org-with-point-at (org-id-find id 'marker)
1003 (org-clock-in nil)))
1005 (defun bh/clock-in-last-task (arg)
1006 "Clock in the interrupted task if there is one
1007 Skip the default task and get the next one.
1008 A prefix arg forces clock in of the default task."
1010 (let ((clock-in-to-task
1012 ((eq arg 4) org-clock-default-task)
1013 ((and (org-clock-is-active)
1014 (equal org-clock-default-task (cadr org-clock-history)))
1015 (caddr org-clock-history))
1016 ((org-clock-is-active) (cadr org-clock-history))
1017 ((equal org-clock-default-task (car org-clock-history)) (cadr org-clock-history))
1018 (t (car org-clock-history)))))
1020 (org-with-point-at clock-in-to-task
1021 (org-clock-in nil))))
1024 (defun org-export-to-ods ()
1026 (let ((csv-file "data.csv"))
1027 (org-table-export csv-file "orgtbl-to-csv")
1028 (org-odt-convert csv-file "ods" 'open)))
1030 ; allow for zero-width-space to be a break in regexp too
1031 ; (setcar org-emphasis-regexp-components " [:space:] \t('\"{")
1032 ; (setcar (nthcdr 1 org-emphasis-regexp-components) " [:space:]- \t.,:!?;'\")}\\")
1033 ; (org-set-emph-re 'org-emphasis-regexp-components org-emphasis-regexp-components)
1035 ;; support inserting screen shots
1036 (defun my/org-insert-screenshot ()
1037 "Take a screenshot into a time stamped unique-named file in the
1038 same directory as the org-buffer and insert a link to this file."
1040 (defvar my/org-insert-screenshot/filename)
1041 (setq my/org-insert-screenshot/filename
1043 "Screenshot to insert: "
1045 (concat (buffer-file-name) "_" (format-time-string "%Y%m%d_%H%M%S") ".png")
1048 (call-process "import" nil nil nil my/org-insert-screenshot/filename)
1049 (insert (concat "[[" my/org-insert-screenshot/filename "]]"))
1050 (org-display-inline-images))
1052 (defun my/fix-inline-images ()
1053 (when org-inline-image-overlays
1054 (org-redisplay-inline-images)))
1056 (add-hook 'org-babel-after-execute-hook 'my/fix-inline-images)
1058 ;; use xelatex to preview with imagemagick
1059 (add-to-list 'org-preview-latex-process-alist
1060 '(xelateximagemagick
1061 :programs ("xelatex" "convert")
1062 :description "pdf > png"
1063 :message "you need to install xelatex and imagemagick"
1065 :image-input-type "pdf"
1066 :image-output-type "png"
1067 :image-size-adjust (1.0 . 1.0)
1068 :latex-compiler ("xelatex -interaction nonstopmode -output-directory %o %f")
1069 :image-converter ("convert -density %D -trim -antialias %f -quality 100 %O"))
1071 ;; use xelatex by default
1072 (setq org-preview-latex-default-process 'xelateximagemagick)
1074 ; from http://orgmode.org/Changes.html
1075 (defun my/org-repair-property-drawers ()
1076 "Fix properties drawers in current buffer.
1077 Ignore non Org buffers."
1079 (when (eq major-mode 'org-mode)
1080 (org-with-wide-buffer
1081 (goto-char (point-min))
1082 (let ((case-fold-search t)
1083 (inline-re (and (featurep 'org-inlinetask)
1084 (concat (org-inlinetask-outline-regexp)
1088 (unless (and inline-re (org-looking-at-p inline-re))
1090 (let ((end (save-excursion (outline-next-heading) (point))))
1092 (when (org-looking-at-p org-planning-line-re) (forward-line))
1093 (when (and (< (point) end)
1094 (not (org-looking-at-p org-property-drawer-re))
1096 (and (re-search-forward org-property-drawer-re end t)
1097 (eq (org-element-type
1098 (save-match-data (org-element-at-point)))
1100 (insert (delete-and-extract-region
1102 (min (1+ (match-end 0)) end)))
1103 (unless (bolp) (insert "\n"))))))))))))
1105 ; from https://emacs.stackexchange.com/questions/909/how-can-i-have-an-agenda-timeline-view-of-multiple-files
1106 (defun org-agenda-timeline-all (&optional arg)
1109 (dolist (org-agenda-file org-agenda-files)
1110 (insert-file-contents org-agenda-file nil)
1113 (write-file "/tmp/timeline.org")
1114 (org-agenda arg "L")))
1115 (define-key org-mode-map (kbd "C-c t") 'org-agenda-timeline-all)
1117 (provide 'org-mode-configuration)