org.el 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. ;; --------
  2. ;; Org mode
  3. ;; --------
  4. (require 'org)
  5. (require 'org-id)
  6. (require 'org-install)
  7. ; Load stuff from http://doc.norang.ca/org-mode.html
  8. (load-file "~/.emacs.d/emacs/modes/org-norang.el")
  9. (global-set-key "\C-ca" 'org-agenda)
  10. (setq org-export-html-toplevel-hlevel 2)
  11. (setq org-export-babel-evaluate nil)
  12. (setq org-agenda-files "~/Documentos/org/orgfiles.txt")
  13. (setq org-id-track-globally nil)
  14. (setq org-link-to-org-use-id nil)
  15. ;(setq org-id-locations-file "~/Documentos/org/org-id-locations.txt")
  16. ;(setq org-agenda-include-diary t)
  17. (setq org-agenda-timegrid-use-ampm t)
  18. (setq org-agenda-include-diary nil)
  19. (setq org-hide-leading-stars t)
  20. (setq org-log-done 'time)
  21. (setq org-agenda-skip-scheduled-if-deadline-is-shown t)
  22. (setq org-todo-keywords
  23. '((sequence "TODO" "DONE")
  24. (sequence "NEXT" "DONE")
  25. (sequence "WAITING" "|" "DONE")
  26. (sequence "|" "CANCELED")
  27. ; We don't always want this... only if we don't mostly care to
  28. ; pay attention to it. Sometimes WAITING is better.
  29. (sequence "|" "PASSED-OFF")
  30. (sequence "|" "DONE-NOT-ME")
  31. (sequence "PAYMENT-WAITING" "|" "PAID")))
  32. (setq org-todo-keyword-faces
  33. '(("CANCELED" . (:foreground "orange" :weight bold))
  34. ("NEXT" . (:foreground "DeepPink2" :weight bold))
  35. ("DONE-NOT-ME" . (:foreground "SpringGreen4" :weight bold))
  36. ("PASSED-OFF" . (:foreground "peru" :weight bold))
  37. ("CAL-CANCEL" . (:foreground "orange" :weight bold))
  38. ("WAITING" . (:foreground "dodger blue" :weight bold))
  39. ("PAYMENT-WAITING" . (:foreground "orchid" :weight bold))
  40. ("PAID" . (:foreground "sea green" :weight bold))
  41. ("FOODLIST-OUT" . (:foreground "#4e9a06" :weight bold))
  42. ))
  43. ; Complete with org-complete (does a fallback to hippie-expand automatically)
  44. ;(define-key org-mode-map "\M-/" 'org-complete)
  45. ; Priorities??
  46. (setq org-priority-faces
  47. '((?A . "#f01a0f")
  48. (?B . "#f0640f")
  49. (?C . "light sea green")
  50. (?D . "slate blue")))
  51. (setq org-default-priority ?C)
  52. (setq org-lowest-priority ?D)
  53. (require 'org-habit)
  54. (add-to-list 'org-modules 'org-habit)
  55. (setq org-habit-graph-column 60)
  56. (setq org-habit-show-done-always-green t)
  57. (define-key global-map "\C-cor" 'org-capture)
  58. ;(define-key global-map "\C-coc" 'org-capture)
  59. (define-key global-map "\C-col" 'org-store-link)
  60. (define-key global-map "\C-coj" 'org-clock-goto)
  61. (define-key global-map "\C-cod" 'org-diet-hacky-jump-to-today)
  62. ;(define-key global-map "\C-cob" 'org-iswitchb)
  63. (setq org-remember-delete-empty-lines-at-end nil)
  64. (setq org-remember-templates
  65. '(("Todo" ?t "* TODO %?\n %i\n %a" "~/org/life.org" "Various Tasks")
  66. ("Event" ?e "* %^{Event} %^t\n %a\n\n%?" "~/org/life.org" "Events")
  67. ("Journal" ?j "* %U %?\n\n %i\n %a" "~/org/journal.org")
  68. ("Weigh-in" ?w "* CAL-IN Diet for day %t
  69. %^{Weight}p
  70. | Food / Exercise | Calories | Quantity | Total |
  71. |-----------------+----------+----------+-------|
  72. | %?%& | | | |
  73. |-----------------+----------+----------+-------|
  74. | Total | | | |
  75. #+TBLFM: $4=$2*$3::$LR4=vsum(@2$4..@-I$4)
  76. " "~/org/diet.org" "Daily Logs")
  77. ("Note" ?n "* %^{Title}\n :PROPERTIES:\n :CreationTime: %U\n :END:\n %a"
  78. "~/org/notes.org" "General Notes")
  79. ("Idea" ?i "* %^{Title}\n %i\n %a" "~/org/ideas.org")))
  80. (setq org-capture-templates
  81. '(("t" "Todo" entry
  82. (file+headline "~/org/life.org" "Various Tasks")
  83. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  84. ("e" "Event" entry
  85. (file+headline "~/org/life.org" "Events")
  86. "* %^{Event}\n %^t\n %i\n %a\n\n%?" :prepend t :empty-lines 1)
  87. ("j" "Journal" entry
  88. (file+headline "~/org/journal.org" "")
  89. "* %U %?\n\n %i\n %a" :prepend t :empty-lines 1)
  90. ("w" "Weigh-in" entry
  91. (file+headline "~/org/diet.org" "Daily Logs")
  92. "* CAL-IN Diet for day %t\n%^{Weight}p\n| Food / Exercise | Calories | Quantity | Total |\n|-----------------+----------+----------+-------|\n| %? | | | |\n|-----------------+----------+----------+-------|\n| Total | | | |\n#+TBLFM: $4=$2*$3;%.0f::$LR4=vsum(@2$4..@-I$4)\n\n"
  93. :prepend t :empty-lines 1)
  94. ("b" "Blood pressure" table-line
  95. (file+headline "~/org/bpressure.org" "Blood pressure table")
  96. "| %U | %^{systolic} | %^{diastolic} | %^{pulse} | %^{note} |")
  97. ("n" "Note" entry
  98. (file+headline "~/org/notes.org" "General Notes")
  99. "* %^{Title}\n :PROPERTIES:\n :CreationTime: %U\n :END:\n\n %i\n\n %a"
  100. :prepend t :empty-lines 1)
  101. ("i" "Idea" entry
  102. (file+headline "~/org/ideas.org" "")
  103. "* %^{Title}\n %i\n %a" :prepend t :empty-lines 1)
  104. ("p" "Purchase wishlist" entry
  105. (file+headline "~/org/consumerism.org" "Stuff to buy")
  106. "* TODO %^{Title}\n\n%?\n" :prepend t :empty-lines 1)
  107. ("c" "CC work-related items")
  108. ("ct" "CC Todo" entry
  109. (file+headline "~/org/ccommons.org" "Various Tasks")
  110. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  111. ("ce" "CC Event" entry
  112. (file+headline "~/org/ccommons.org" "Events")
  113. "* %^{Event}\n %^t\n %i\n %a\n\n%?" :prepend t :empty-lines 1)
  114. ("cn" "CC Note" entry
  115. (file+headline "~/org/ccommons.org" "Various Notes")
  116. "* %^{Title}\n :PROPERTIES:\n :CreationTime: %U\n :END:\n\n %i\n\n %a"
  117. :prepend t :empty-lines 1)
  118. ("cb" "CC Billable" entry
  119. (file+headline "~/org/ccommons.org" "Billable Stuff")
  120. "* %^{Title}\n :PROPERTIES:\n :CreationTime: %U\n :END:\n\n %i\n\n %a"
  121. :prepend t :empty-lines 1)
  122. ("m" "MediaGoblin items")
  123. ("mt" "MediaGoblin TODO")
  124. ("mth" "MediaGoblin Todo: Hacking" entry
  125. (file+headline "~/org/mediagoblin.org" "Hacking Tasks")
  126. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  127. ("mtc" "MediaGoblin Todo: Community" entry
  128. (file+headline "~/org/mediagoblin.org" "Community Tasks")
  129. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  130. ("mta" "MediaGoblin Todo: Administration" entry
  131. (file+headline "~/org/mediagoblin.org" "Administrative Tasks")
  132. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  133. ("mtv" "MediaGoblin Todo: Various" entry
  134. (file+headline "~/org/mediagoblin.org" "Various Tasks")
  135. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  136. ("mtr" "MediaGoblin Todo: Review Queue" entry
  137. (file+headline "~/org/mediagoblin.org" "Review Queue")
  138. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  139. ("me" "MediaGoblin Event" entry
  140. (file+headline "~/org/mediagoblin.org" "Events")
  141. "* %^{Event}\n %^t\n %i\n %a\n\n%?" :prepend t :empty-lines 1)
  142. ("mn" "MediaGoblin Note" entry
  143. (file+headline "~/org/mediagoblin.org" "General Notes")
  144. "* %^{Title}\n :PROPERTIES:\n :CreationTime: %U\n :END:\n\n %i\n\n %a"
  145. :prepend t :empty-lines 1)
  146. ;; ("ml" "MediaGoblin Ledger" plain
  147. ;; (file "~/records/mgllc_accounts/mediagoblin.ldgr")
  148. ;; "%(org-read-date) %^{Payee}
  149. ;; Expenses:%^{Account} %^{Amount}
  150. ;; Assets:Banking:Checking
  151. ;; ")
  152. ("C" "Contact" entry
  153. (file+headline "~/org/contacts.org" "General")
  154. "* %(org-contacts-template-name)
  155. :PROPERTIES:
  156. :EMAIL: %^{Email}
  157. :CreationTime: %U
  158. :END:
  159. %?")
  160. ("l" "Ledger entries")
  161. ("le" "Expense (checking)" plain
  162. (file "~/org/finances.ldgr")
  163. "%(org-read-date) %^{Payee}
  164. Expenses:%^{Account} %^{Amount}
  165. Assets:Banking:Checking
  166. ")
  167. ("lc" "Cash expense" plain
  168. (file "~/org/finances.ldgr")
  169. "%(org-read-date) %^{Payee}
  170. Expenses:%^{Account} %^{Amount}
  171. Expenses:Cash
  172. ")
  173. ("x" "XUDD")
  174. ("xt" "XUDD Todo" plain
  175. (file+headline "~/org/xudd.org" "Tasks")
  176. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  177. ("xn" "XUDD Note" plain
  178. (file+headline "~/org/xudd.org" "Notes")
  179. "* TODO %?\n %i\n %a" :prepend t :empty-lines 1)
  180. ))
  181. (setq org-columns-default-format "%30ITEM %TODO %DEADLINE %TAGS")
  182. ; Always file things at the start of a tree rather than at the end
  183. (setq org-reverse-note-order t)
  184. (setq org-log-state-notes-into-drawer t)
  185. (setq org-refile-targets '((org-agenda-files . (:maxlevel . 8))))
  186. (setq org-refile-use-outline-path 'file)
  187. ; Force task blocking (ie, block marking as done with subtasks open)
  188. (setq org-enforce-todo-dependencies t)
  189. ; ... but don't grey it out
  190. (setq org-agenda-dim-blocked-tasks nil)
  191. (defun cwebber/skip-unless-habit ()
  192. "Checks to see if the style at point is \"habit\""
  193. (if (not (equal (org-entry-get (point) "STYLE") "habit"))
  194. ; Skip till the next heading
  195. (progn (outline-next-heading) (1- (point)))))
  196. (setq org-agenda-custom-commands
  197. '(("N" todo "NEXT")
  198. ("h" "Habits"
  199. ((agenda
  200. ""
  201. ((org-habit-show-all-today t)
  202. (org-agenda-skip-function 'cwebber/skip-unless-habit)))))
  203. ("a" "Agenda plus plus"
  204. ((todo "NEXT")
  205. (agenda "" nil)))))
  206. ; Make sure we don't block repeating tasks
  207. (defadvice org-block-todo-from-children-or-siblings-or-parent
  208. (around cwebber/dont-block-if-repeating)
  209. "Never block if this is a repeating task"
  210. (let ((org-enforce-todo-dependencies
  211. (not (org-get-repeat))))
  212. ad-do-it))
  213. (ad-activate 'org-block-todo-from-children-or-siblings-or-parent)
  214. ; It's just too hard to deal with daily repeating tasks (octavia)
  215. ; if you see them every day in the future
  216. ; I am not confident this is the right option though.
  217. (setq org-agenda-repeating-timestamp-show-all nil)
  218. ; Start weekly view from present day
  219. (setq org-agenda-start-on-weekday nil)
  220. ;; Useful functions
  221. (defun cwebber-org-update-roundup ()
  222. (with-current-buffer (or (find-buffer-visiting "~/org/ccommons.org")
  223. (find-file-noselect "~/org/ccommons.org"))
  224. (save-excursion
  225. (beginning-of-buffer)
  226. (search-forward "\n* Roundup")
  227. (outline-next-heading)
  228. (backward-char)
  229. (let* ((roundup-entries
  230. (remove ""
  231. (split-string
  232. (shell-command-to-string
  233. "python ~/org/scripts/read_roundup_csv.py") "\n")))
  234. (roundup-header-marker (point-marker))
  235. (filed-roundup-ids
  236. (remove nil (org-map-entries
  237. '(org-entry-get (point) "ROUNDUPID")
  238. nil 'tree))))
  239. (dolist (csvline roundup-entries)
  240. (let* ((split-entry (split-string csvline))
  241. (entry-id (car split-entry))
  242. (entry-title (combine-and-quote-strings (cdr split-entry))))
  243. (if (not (member entry-id filed-roundup-ids))
  244. (progn
  245. (insert "\n\n")
  246. (backward-char)
  247. (org-insert-subheading t)
  248. (insert (format "TODO [[roundup:%s]] %s" entry-id entry-title))
  249. (org-entry-put (point) "ROUNDUPID" entry-id)
  250. (hide-subtree)
  251. (goto-char (marker-position roundup-header-marker))))))))))
  252. (defun cwebber-org-pull-up-agenda (&optional open-same-window)
  253. "Switch to the org agenda, or prompt for new one if one does not exist"
  254. (interactive "P")
  255. (let ((agenda-buffer (get-buffer "*Org Agenda*")))
  256. (if agenda-buffer
  257. (if open-same-window
  258. (switch-to-buffer agenda-buffer)
  259. (switch-to-buffer-other-window agenda-buffer))
  260. (org-agenda))))
  261. (define-key global-map "\C-coa" 'cwebber-org-pull-up-agenda)
  262. (define-key global-map [XF86Favorites] 'cwebber-org-pull-up-agenda)
  263. (define-key global-map [f5] 'cwebber-org-pull-up-agenda)
  264. ;; NEXT tag on TODO magic
  265. (defun cwebber/org-possibly-toggle-next-tag-based-on-todo-kewyord ()
  266. (save-excursion
  267. (org-back-to-heading)
  268. (let ((todo-is-next (equal (org-get-todo-state) "NEXT"))
  269. (next-in-tags (member "NEXT" (org-get-tags))))
  270. (if (or (and todo-is-next (not next-in-tags))
  271. (and (not todo-is-next) next-in-tags))
  272. (org-toggle-tag "NEXT")))))
  273. (add-hook 'org-after-todo-state-change-hook
  274. 'cwebber/org-possibly-toggle-next-tag-based-on-todo-kewyord)
  275. ;; VOODOO MAGIC
  276. (setq cwebber/org-currently-in-NEXT-setting nil)
  277. (defun cwebber/org-repeating-tasks-with-NEXT ()
  278. "Repeating entries set to NEXT should switch back to their old state when done
  279. When first setting to NEXT, it sets a property, ORIG-TODO-STATE
  280. If set to NEXT and it's being run again, it sets it back
  281. This uses DARK VOODOO MAGIC but it works"
  282. (let ((is-repeater (org-get-repeat))
  283. (orig-todo-state (org-entry-get (point) "ORIG_TODO_STATE")))
  284. (if is-repeater
  285. (cond (cwebber/org-currently-in-NEXT-setting nil) ; don't recurse :)
  286. ;; New state is NEXT, old state was something else
  287. ((and (equal org-state "NEXT")
  288. (not orig-todo-state))
  289. (org-entry-put (point) "ORIG_TODO_STATE" org-last-state))
  290. ((and (equal org-state "NEXT")
  291. orig-todo-state)
  292. (progn
  293. (org-entry-delete (point) "ORIG_TODO_STATE")
  294. (let ((cwebber/org-currently-in-NEXT-setting t))
  295. (org-todo orig-todo-state))))))))
  296. (add-hook 'org-after-todo-state-change-hook
  297. 'cwebber/org-repeating-tasks-with-NEXT)
  298. ;; -----------------
  299. ;; Appointment stuff
  300. ;; -----------------
  301. (defun cwebber/org-reset-appts ()
  302. "For use on grumps only... this also reverts all files, but it does update the appt list"
  303. (interactive)
  304. (setq appt-time-msg-list nil)
  305. (flet ((yes-or-no-p (x) t))
  306. (org-revert-all-org-buffers))
  307. (org-agenda-to-appt))
  308. (appt-activate)
  309. (org-agenda-to-appt)
  310. (require 'midnight)
  311. (setq midnight-mode t)
  312. (remove-hook 'midnight-hook 'clean-buffer-list)
  313. (add-hook 'midnight-hook 'org-agenda-to-appt)
  314. ;; ; This one is kinda annoying...
  315. ;; (add-hook 'org-finalize-agenda-hook 'org-agenda-to-appt)
  316. ;(setq org-clock-idle-time 15)
  317. (setq org-clock-idle-time nil)
  318. (setq org-src-fontify-natively t)
  319. (setq org-src-tab-acts-natively t)
  320. ;; -----------
  321. ;; Babel stuff
  322. ;; -----------
  323. (require 'ob-python)
  324. (require 'ob-sh)
  325. (require 'ob-gnuplot)
  326. (require 'ob-calc)
  327. ; Don't prompt me all the time about evaluating code blocks
  328. (setq org-confirm-babel-evaluate nil)
  329. (setq org-src-preserve-indentation nil)
  330. ;; -----------
  331. ;; Other stuff
  332. ;; -----------
  333. ;; Make windmove work in org-mode:
  334. (add-hook 'org-shiftup-final-hook 'windmove-up)
  335. (add-hook 'org-shiftleft-final-hook 'windmove-left)
  336. (add-hook 'org-shiftdown-final-hook 'windmove-down)
  337. (add-hook 'org-shiftright-final-hook 'windmove-right)
  338. (defun cwebber/set-back-open-line ()
  339. (define-key org-mode-map (kbd "C-o") 'open-line))
  340. (add-hook 'org-mode-hook 'cwebber/set-back-open-line)
  341. ; More desparate
  342. (defun org-open-line (n)
  343. (interactive "*p")
  344. (open-line n))
  345. ; hacky diet stuff
  346. (defun org-diet-hacky-jump-to-today ()
  347. "Really hacky function to jump to today based on the assumption
  348. that we can find the first Total line"
  349. (interactive)
  350. (switch-to-buffer (get-file-buffer "~/org/diet.org"))
  351. (beginning-of-buffer)
  352. (search-forward-regexp "^| Total")
  353. (beginning-of-line)
  354. (previous-line))
  355. ; Open files with the programs I want.
  356. (setq org-file-apps
  357. '((auto-mode . emacs)
  358. ("\\.mm\\'" . default)
  359. ("\\.x?html?\\'" . "firefox %s")
  360. ("\\.pdf\\'" . "evince %s")))
  361. ; pretty latex source blocks!
  362. ; hm, what to do in the new exporter?
  363. ;; (setq org-export-latex-listings 'minted)
  364. ;; (setq org-latex-to-pdf-process
  365. ;; '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
  366. ;; "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
  367. ;; "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
  368. ;; (add-to-list 'org-export-latex-packages-alist
  369. ;; '("" "minted"))
  370. ;; (add-to-list 'org-export-latex-packages-alist
  371. ;; '("" "hyperref"))
  372. ; Also in latex, @alert@
  373. ;;; Not working... why?
  374. ;; (add-to-list 'org-export-latex-emphasis-alist
  375. ;; '("@" "\\alert{%s}" nil))
  376. ; Make org the default scratch
  377. (setq initial-major-mode 'org-mode)
  378. (with-current-buffer "*scratch*"
  379. (if (not (eq major-mode initial-major-mode))
  380. (funcall initial-major-mode)))
  381. (setq initial-scratch-message
  382. (purecopy "\
  383. # Scratch!
  384. # --------
  385. # This buffer is for notes you don't want to save, etc.
  386. # Visit that file with C-x C-f.
  387. "))
  388. (defun cwebber/org-tree-to-indirect-buffer-renamed (subname)
  389. "Like org-tree-to-indirect-buffer, with the option to give a \"subname\""
  390. (interactive "sNew buffer subname?: ")
  391. (let ((orig-buffer-name (buffer-name (current-buffer))))
  392. (org-tree-to-indirect-buffer)
  393. (other-window 1)
  394. (if (not (equal subname ""))
  395. (rename-buffer (format "%s(%s)" orig-buffer-name subname)))))
  396. (define-key org-mode-map (kbd "C-c C-x b") 'cwebber/org-tree-to-indirect-buffer-renamed)
  397. ;; --------------------
  398. ;; Appointment property
  399. ;; --------------------
  400. (defun cwebber-org-add-appointment ()
  401. (interactive)
  402. (org-set-property
  403. "APPOINTMENT"
  404. (concat "<" (org-read-date t) ">")))
  405. ;; ------------
  406. ;; org-contacts
  407. ;; ------------
  408. ;(require 'org-contacts)
  409. ;(setq org-contacts-files '("~/org/contacts.org"))
  410. ;(org-contacts-gnus-insinuate)
  411. ;; -----------------
  412. ;; Smarter archiving
  413. ;; -----------------
  414. (setq org-archive-default-command 'org-archive-subtree)
  415. (defun cwebber/org-archive-subtree-depending-on-property ()
  416. "Conditionally archive the subtree to a file or archive sibling
  417. If the parent subtree has an ARCHIVE property, archive to a file.
  418. Otherwise, archive to an archive sibling."
  419. (interactive)
  420. (let* ((current-level (org-current-level))
  421. (parent-archive-property
  422. (if current-level
  423. (save-excursion
  424. (org-up-heading-safe)
  425. (org-entry-get (point) "ARCHIVE")))))
  426. (cond
  427. ; If there is no current level, do nothing
  428. ((not current-level) nil)
  429. ; If we're at the first level, subtree archive it
  430. ((or (eq current-level 1)
  431. (not parent-archive-property))
  432. (let ((org-archive-default-command 'org-archive-to-archive-sibling))
  433. (org-archive-subtree-default-with-confirmation)))
  434. ; Otherwise, archive to a file
  435. (t
  436. (let ((org-archive-default-command 'org-archive-subtree))
  437. (org-archive-subtree-default-with-confirmation))))))
  438. (define-key org-mode-map "\C-c\C-xA" 'cwebber/org-archive-subtree-depending-on-property)
  439. (define-key org-mode-map "\C-c\C-xa" 'cwebber/org-archive-subtree-depending-on-property)
  440. (define-key org-mode-map "\C-c\C-x\C-a" 'cwebber/org-archive-subtree-depending-on-property)
  441. (define-key org-mode-map "\C-c\C-x\C-s" 'cwebber/org-archive-subtree-depending-on-property)
  442. (define-key org-mode-map "\C-c$" 'cwebber/org-archive-subtree-depending-on-property)