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