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