blob: 4a7faaf6495bba8de2f3f3383370aa3e8dd78b95 (
plain) (
tree)
|
|
;;; my-org.el --- Configure org-mode -*- lexical-binding: t -*-
;;; Commentary:
;;; Code:
(require 'org)
(require 'org-agenda)
(require 'org-capture)
(require 'org-archive)
(require 'ox)
(require 'ox-md)
(require 'ol-notmuch)
(defvar my/org-directory
(if (memq window-system '(mac ns))
(expand-file-name "~/workspace/notebooks/")
(expand-file-name "~/documents/notes/")))
(add-hook 'org-mode-hook 'org-indent-mode)
(add-hook 'org-mode-hook 'org-hide-block-all)
(add-hook 'org-mode-hook 'visual-line-mode)
(add-hook 'org-capture-after-finalize-hook 'org-save-all-org-buffers)
(add-hook 'org-capture-prepare-finalize-hook 'org-save-all-org-buffers)
(global-set-key (kbd "C-c c") 'org-capture)
(global-set-key (kbd "C-c a") 'org-agenda)
(defvar load-language-list '((emacs-lisp . t)
(python . t)
(shell . t)))
(setq org-directory my/org-directory)
(setq org-hide-emphasis-markers t) ;; hide emphasis markup
(setq org-archive-subtree-add-inherited-tags t) ;; when archiving, inherit the tags from the parent
(setq org-pretty-entities t) ;; display unicode characters
(setq org-log-done 'time) ;; log the time of completion
(setq org-log-into-drawer t) ;; insert state change in the drawer
(setq org-cycle-separator-lines 0)
(setq org-startup-folded 'content)
(setq org-todo-keywords '((sequence "TODO" "STARTED" "WAITING" "|" "DONE" "CANCELED")
(sequence "TO-READ(r/!)" "READING(/!)" "|" "READ(R@)")))
(setq org-priority-start-cycle-with-default nil) ;; Start one over/under default value.
(setq org-highest-priority ?A)
(setq org-lowest-priority ?D)
(setq org-default-priority ?C) ;; Ensures unset tasks have low priority.
(setq org-refile-use-cache nil)
(setq org-refile-targets `((,(expand-file-name "tasks.org" org-directory) :maxlevel . 1)
(,(expand-file-name "notes.org" org-directory) :maxlevel . 1)
(,(expand-file-name "projects.org" org-directory) :tag . "project")))
(setq org-refile-use-outline-path 'file)
(setq org-outline-path-complete-in-steps nil)
(setq org-refile-allow-creating-parent-nodes 'confirm)
;; org babel related
(setq org-src-fontify-natively t)
(setq org-src-preserve-indentation t) ;; prevent the conversion of spaces into tabs (necessary for Python code exports)
(setq org-edit-src-content-indentation t)
(setq org-return-follows-link t) ;; I want to follow links on RET
;; some configurations for exporting document
(setq org-export-with-toc nil)
(setq org-export-with-section-numbers nil)
;; a few abbreviations I use regularly
(setq org-link-abbrev-alist
'(("src" . "~/workspace/%s")
("jira" . "https://jira.rbx.com/browse/%s")
("go" . "http://go/%s")))
(setq org-blank-before-new-entry (quote ((heading . nil) (plain-list-item . nil))))
(setq org-reverse-note-order t)
(setq org-agenda-files `(,(expand-file-name "inbox.org" org-directory)
,(expand-file-name "notes.org" org-directory)
,(expand-file-name "tasks.org" org-directory)
,(expand-file-name "habits.org" org-directory)
,(expand-file-name "projects.org" org-directory)
,(expand-file-name "bookmarks.org" org-directory)
,(expand-file-name "journal.org" org-directory)))
(setq org-agenda-show-all-dates t)
(setq calendar-week-start-day 1)
(setq org-agenda-custom-commands nil)
(setq org-agenda-start-on-weekday 1)
(add-to-list 'org-agenda-custom-commands
'("A" "Agenda for today"
((agenda "" ((org-agenda-span 'day)
(org-agenda-start-day (org-today))))
(todo "TODO"
((org-agenda-overriding-header "To Refile")
(org-agenda-files `(,(expand-file-name "inbox.org" org-directory)))))
(todo "STARTED"
((org-agenda-overriding-header "In Progress")))
(todo "WAITING"
((org-agenda-overriding-header "Blocked")))
(todo "TODO"
((org-agenda-overriding-header "Not yet started")
(org-agenda-skip-function '(org-agenda-skip-entry-if 'deadline 'scheduled)))))))
(setq org-capture-templates
`(("t" "tasks" entry (file "inbox.org")
"* TODO [#D] %?\n:PROPERTIES:\n:CREATED: %U\n:END:\n")
("n" "note" entry (file "notes.org")
"* %?\n:PROPERTIES:\n:CREATED: %T\n:END:\n")
("f" "feed" entry (file "inbox.org")
,(concat "* TO-READ %:elfeed-entry-title :feed:\n"
":PROPERTIES:\n:CREATED: %T\n:END:\n"
"%a\n"))
("m" "email note" entry (file "inbox.org")
,(concat "* TODO [#A] %:subject :mail:\n"
":PROPERTIES:\n:CREATED: %T\n:END:\n"
"%a\n%i%?"))
("j" "journal" entry
(file+olp+datetree "journal.org")
"* %?\n:PROPERTIES:\n:CREATED: %T\n:END:\n" :tree-type day)))
(setq org-capture-templates-contexts
;; only show the capture template for emails when in a notmuch
;; buffer
'(("m" ((in-mode . "notmuch-search-mode")
(in-mode . "notmuch-show-mode")
(in-mode . "notmuch-tree-mode")))))
;; elisp links to these functions are considered safe, I don't need a
;; prompt to confirm if that's what I want to execute.
(setq org-link-elisp-skip-confirm-regexp (rx (or "elfeed" "notmuch")))
;; https://stackoverflow.com/questions/20164918/how-to-untick-checkboxes-in-org-mode-for-the-next-cyclic-repetitive-task
(defun my/org-reset-checkbox-state-maybe ()
"Reset all checkboxes in an entry if the `RESET_CHECK_BOXES' property is set."
(interactive "*")
(if (org-entry-get (point) "RESET_CHECK_BOXES")
(org-reset-checkbox-state-subtree)))
(defun my/org-reset-checkbox-when-done ()
"Reset all checkboxes in an entry when the state is DONE."
(when (member org-state org-done-keywords) ;; org-state dynamically bound in org.el/org-todo
(my/org-reset-checkbox-state-maybe)))
(add-hook 'org-after-todo-state-change-hook 'my/org-reset-checkbox-when-done)
(provide 'my-org)
;;; my-org.el ends here
|