From 461e0720da0f09df9d667b774534d49beded2a16 Mon Sep 17 00:00:00 2001 From: Benson Chu Date: Fri, 10 May 2019 12:43:48 -0500 Subject: [PATCH] New org mode setup --- agenda-files.el | 2 +- config-org-new.org | 1349 ++++++++++++++++++++++++++++++++++++++++++++ config.org | 1303 +----------------------------------------- custom.el | 72 ++- 4 files changed, 1426 insertions(+), 1300 deletions(-) create mode 100644 config-org-new.org diff --git a/agenda-files.el b/agenda-files.el index c85d07e..56f7229 100644 --- a/agenda-files.el +++ b/agenda-files.el @@ -1,2 +1,2 @@ -(quote ("~/MEGA/org/agenda/ContView.org" "~/MEGA/org/agenda/UHNW.org" "~/MEGA/org/agenda/read.org" "~/MEGA/org/agenda/agenda.org" "~/MEGA/org/agenda/reference.org" "~/MEGA/org/agenda/refile.org")) +(quote ("~/MEGA/org/agenda/research.org" "~/MEGA/org/agenda/long_term.org" "~/MEGA/org/agenda/ContView.org" "~/MEGA/org/agenda/UHNW.org" "~/MEGA/org/agenda/read.org" "~/MEGA/org/agenda/agenda.org" "~/MEGA/org/agenda/reference.org" "~/MEGA/org/agenda/refile.org")) diff --git a/config-org-new.org b/config-org-new.org new file mode 100644 index 0000000..75b8273 --- /dev/null +++ b/config-org-new.org @@ -0,0 +1,1349 @@ + +* My org traversal functions + #+begin_src emacs-lisp + (defun get-variables (l) + (cond ((null l) nil) + ((consp (car l)) + (append (extract-variables (car l)) + (get-variables (cdr l)))) + (t (cons (car l) + (get-variables (cdr l)))))) + + (defun extract-variables (l) + (if (not (consp l)) + l + (get-variables (cdr l)))) + + ;; Descendants + (defmacro org-loop/descendants (&rest body) + (declare (indent defun)) + (let ((subtree-symbol (make-symbol "subtree-end"))) + `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t)))) + (while (and (outline-next-heading) + (< (point) ,subtree-symbol)) + + (defmacro orgc-loop/descendants (condition &rest body) + (declare (indent defun)) + (let ((subtree-symbol (make-symbol "subtree-end"))) + `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t))) + (,condition nil)) + (while (and (not ,condition) + (outline-next-heading) + (< (point) ,subtree-symbol)) + ,@body) + ,condition))) + + (defmacro orgb-loop/descendants (condition &rest body) + (declare (indent defun)) + (let ((subtree-symbol (make-symbol "subtree-end")) + (vars (extract-variables condition))) + `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t))) + ,@vars) + (while (and ,condition + (outline-next-heading) + (< (point) ,subtree-symbol)) + ,@body) + ,condition))) + ,@body)))) + + (defmacro orgc-loop/todo-descendants (condition &rest body) + (declare (indent defun)) + (let ((todo-state (make-symbol "todo-state")) + (tags (make-symbol "tags"))) + `(orgc-loop/descendants ,condition + (let ((,todo-state (org-get-todo-state)) + (,tags (org-get-tags (point)))) + (when ,todo-state + (if (member "ARCHIVE" ,tags) + (org-end-of-subtree t) + ,@body)))))) + + (defmacro org-loop/todo-children (&rest body) + (declare (indent defun)) + (let ((todo-state (make-symbol "todo-state")) + (tags (make-symbol "tags"))) + `(org-loop/children + (let ((,todo-state (org-get-todo-state)) + (,tags (org-get-tags (point)))) + (when ,todo-state + (if (member "ARCHIVE" ,tags) + (org-end-of-subtree t) + ,@body)))))) + + (defmacro org-loop/children (&rest body) + (declare (indent defun)) + (let ((level-symbol (make-symbol "level"))) + `(progn + (let ((,level-symbol (org-current-level))) + (outline-next-heading) + (when (< ,level-symbol (org-current-level)) + (while (progn + ,@body + (outline-get-next-sibling)))))))) + + (defmacro orgc-loop/children (condition &rest body) + (declare (indent defun)) + (let ((level-symbol (make-symbol "level"))) + `(let ((,condition nil) + (,level-symbol (org-current-level))) + (outline-next-heading) + (when (< ,level-symbol (org-current-level)) + (while (progn + ,@body + (and (not ,condition) + (org-get-next-sibling)))) + ,condition)))) + + (defmacro orgc-loop/todo-children (condition &rest body) + (declare (indent defun)) + (let ((todo-state (make-symbol "todo-state")) + (tags (make-symbol "tags"))) + `(orgc-loop/children ,condition + (let ((,todo-state (org-get-todo-state)) + (,tags (org-get-tags (point)))) + (when ,todo-state + (if (member "ARCHIVE" ,tags) + (org-end-of-subtree t) + ,@body)))))) + + (defmacro orgc-loop/children-cat (condition &rest body) + (declare (indent defun)) + (let ((level-symbol (make-symbol "level"))) + `(let ((,condition nil) + (,level-symbol (org-current-level))) + (outline-next-heading) + (when (< ,level-symbol (org-current-level)) + (while (progn + (while (string= (org-get-todo-state) "CAT") + (outline-next-heading)) + ,@body + (and (not ,condition) + (or (org-get-next-sibling) + (and (not (eobp)) + (< ,level-symbol (org-current-level))))))) + ,condition)))) + + (defmacro orgc-loop/todo-children-cat (condition &rest body) + (declare (indent defun)) + (let ((todo-state (make-symbol "todo-state")) + (tags (make-symbol "tags"))) + `(orgc-loop/children-cat ,condition + (let ((,todo-state (org-get-todo-state)) + (,tags (org-get-tags (point)))) + (when ,todo-state + (if (member "ARCHIVE" ,tags) + (org-end-of-subtree t) + ,@body)))))) + + (defmacro orgb-loop/todo-children (condition &rest body) + (declare (indent defun)) + (let ((todo-state (make-symbol "todo-state")) + (tags (make-symbol "tags"))) + `(orgb-loop/children ,condition + (let ((,todo-state (org-get-todo-state)) + (,tags (org-get-tags (point)))) + (when ,todo-state + (if (member "ARCHIVE" ,tags) + (org-end-of-subtree t) + ,@body)))))) + + (defmacro org-loop/todo-children (condition &rest body) + (declare (indent defun)) + (let ((todo-state (make-symbol "todo-state")) + (tags (make-symbol "tags"))) + `(org-loop/children + (let ((,todo-state (org-get-todo-state)) + (,tags (org-get-tags (point)))) + (when (and ,todo-state + (not (member "ARCHIVE") ,tags)) + ,@body))))) + + + (defmacro traverse-org-headlines (headline &rest body) + (declare (indent defun)) + (let ((buffer-symbol (make-symbol "buffer"))) + `(let (,buffer-symbol) + (org-check-agenda-file ,(cadr headline)) + (setq ,buffer-symbol (if (file-exists-p ,(cadr headline)) + (org-get-agenda-file-buffer ,(cadr headline)) + (error "No such file %s" ,(cadr headline)))) + (with-current-buffer ,buffer-symbol + (while (and (not (eobp)) + (outline-next-heading)) + ,@body))))) + + (defmacro traverse-org-files (files &rest body) + (declare (indent defun)) + (let ((file-symbol (make-symbol "file"))) + `(dolist (,file-symbol ,(cadr files)) + (traverse-org-headlines (,(car files) ,file-symbol) + ,@body)))) + + + + #+end_src +* Keybindings + #+begin_src emacs-lisp + (use-package org) + (require 'org-agenda) + + (global-set-key "\C-cl" 'org-store-link) + (global-set-key "\C-cc" 'org-capture) + (global-set-key (kbd "") 'org-agenda) + (global-set-key (kbd "C-x C-o") 'org-agenda) + (define-key org-agenda-mode-map (kbd "a") 'org-agenda) + (define-key org-agenda-mode-map (kbd "H") 'org-agenda-follow-mode) + + (setq org-src-window-setup 'current-window) + + (setq org-list-allow-alphabetical t) + + ;; This is for safety + (define-key org-mode-map (kbd "C-S-") + (lambda (arg) + (interactive "P") + (if (string= "yes" (completing-read "Are you sure you want to use that keybinding? " '("yes" "no"))) + (kill-whole-line arg) + (org-cut-subtree)))) + #+end_src + +* My Template + #+BEGIN_SRC emacs-lisp + (add-to-list 'org-structure-template-alist + '("sv" . "src :results value")) + (add-to-list 'org-structure-template-alist + '("so" . "src :results output")) + #+END_SRC +* Face + #+BEGIN_SRC emacs-lisp + (when (not (eq system-type 'windows-nt)) + (setq org-ellipsis " ")) + #+END_SRC +* Variables + #+begin_src emacs-lisp + (setq org-log-done 'time) + (setq org-agenda-window-setup 'current-window) + (setq org-agenda-restore-windows-after-quit t) + + (setq org-agenda-sticky t) + + ;;(org-agenda-load-file-list) + + ;; Targets include this file and any file contributing to the agenda - up to 9 levels deep + (setq org-refile-targets `((nil :maxlevel . 9) + (org-agenda-files :maxlevel . 9) + ("~/MEGA/org/entries/panic.org" :maxlevel . 9))) + + (setq org-refile-use-cache t) + + (setq org-refile-target-verify-function + (lambda () + (let ((tags (org-get-tags-at))) + (and (not (member "ARCHIVE" tags)) + (not (equal "DONE" (org-get-todo-state))))))) + + (setq org-agenda-show-future-repeats nil) + + ;; Use full outline paths for refile targets - we file directly with IDO + (setq org-refile-use-outline-path 'file) + + ;; Targets complete directly with IDO + (setq org-outline-path-complete-in-steps nil) + + ;; Allow refile to create parent tasks with confirmation + (setq org-refile-allow-creating-parent-nodes (quote confirm)) + + ;; Use the current window for indirect buffer display + (setq org-indirect-buffer-display 'current-window) + + ;; Do not dim blocked tasks + (setq org-agenda-dim-blocked-tasks nil) + + (setq org-agenda-compact-blocks t) + + #+end_src +* Tag hierarchy + #+begin_src emacs-lisp + (setq org-tag-alist + '((:startgrouptag) + ("all") + (:grouptags) + ("time") + ("nontime") + (:endgrouptag) + (:startgrouptag) + ("time") + (:grouptags) + ("prod") + (:endgrouptag) + (:startgrouptag) + ("nontime") + (:grouptags) + ("sandbox") + (:endgrouptag) + (:startgrouptag) + ("sandbox") + (:grouptags) + ("dev") + (:endgrouptag))) + + + (setq org-agenda-hide-tags-regexp "time\\|nontime\\|prod\\|dev\\|sandbox") + #+end_src +* org-todo-keywords + #+begin_src emacs-lisp + (setq org-use-fast-todo-selection t) + + (setq org-todo-keywords + '((sequence "STUFF(s)" "FUTURE(f)" "INACT(i)" "CLOCK(C)" "DEPEND(D)" "|") + (sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)") + (sequence "CAT(>)" "ONE(o)" "META(m)" "SEQ(S)" "EMPTY(e)" "ETERNAL(E)" "SPEC(:)" "|" "COMPLETE(c)") + (sequence "WAIT(w@/!)" "HOLD(h)" "TICKLER(T)" "|" "ABANDON(a@/!)") + (sequence "TTTT" "|"))) + + (setq org-todo-keyword-faces + '(("ONE" :foreground "royal blue" :weight bold) + ("STUFF" :foreground "goldenrod" :weight bold) + ("NEXT" :foreground "cyan" :weight bold) + ("WAIT" :foreground "yellow" :weight bold) + ("HOLD" :foreground "red" :weight bold) + ("META" :foreground "white" :weight bold) + ("SEQ" :foreground "white" :weight bold) + ("EMPTY" :foreground "white" :weight bold) + ("ABANDON" :foreground "dark gray" :weight bold) + ("TOP" :foreground "royal blue" :weight bold) + ("INACT" :foreground "dark gray" :weight bold) + ("FUTURE" :foreground "medium spring green" :weight bold))) + + ;; (setq org-todo-state-tags-triggers + ;; (quote (("HOLD" ("HOLD" . t)) + ;; ("WAIT" ("WAITING" . t)) + ;; (todo ("HOLD") ("WAITING"))))) + #+end_src +* Project code 2.0 +** Primitives + #+begin_src emacs-lisp + ;; Task definitions + (defconst not-tasks-tag "NOT_TASKS") + (defconst these-are-not-tasks '("TTTT" "INACT" "CLOCK" "FUTURE" "DEPEND" "CAT")) + + (defun my/is-done-task () + (member (org-get-todo-state) org-done-keywords)) + + (defun my/is-non-task () + (member (org-get-todo-state) these-are-not-tasks)) + + (defun my/is-todo-task () + (pcase (org-get-todo-state) + ("TODO" (my/no-children)) + ("ONE" (my/no-todo-children)) + ("NEXT" t))) + + ;; Standalone tasks + (defun my/is-part-of-subtree () + (save-excursion + (and (not (= 1 (org-current-level))) + (let (has-parent-project) + (while (and (not has-parent-project) + (org-up-heading-safe)) + (when (org-get-todo-state) + (setq has-parent-project t))) + has-parent-project)))) + + (defun my/is-standalone-task () + (and (my/is-todo-task) + (not (my/is-part-of-subtree)))) + + ;; Task predicates + (defun my/no-children () + "Check if there are NO tasks that are TODO or DONE" + (save-excursion + (not (orgc-loop/todo-children has-children + (setq has-children t))))) + + (defun my/has-children () + "Check if there are tasks that are TODO or DONE" + (save-excursion + (orgc-loop/todo-children has-children + (setq has-children t)))) + + (defun my/has-todo-child () + "Check if there are any tasks that are TODO" + (save-excursion + (orgc-loop/todo-children has-children + (when (my/is-todo-task) + (setq has-children t))))) + + (defun my/no-todo-children () + "Check if there are NO tasks that are TODO" + (save-excursion + (not (orgc-loop/todo-children has-children + (when (my/is-todo-task) + (setq has-children t)))))) + + + ;; Project Stuff + (defconst my/project-keywords '("PROJECT" "META" "SEQ" "EMPTY" "ETERNAL" "SPEC" "HOLD")) + + (defun my/is-a-project () + (save-excursion + (let ((todo (org-get-todo-state))) + (when todo + (or (member todo my/project-keywords) + (and (equal todo "ONE") + (my/has-todo-child)) + (and (member todo '("TODO")) + (my/has-children))))))) + + (defun my/get-project-type () + ) + #+end_src +** Old primitives + #+begin_src emacs-lisp + (defun my/is-unactionable-task () + (or (member "NOT_TASKS" (org-get-tags (point))) + (member (org-get-todo-state) (cons "INACT" org-done-keywords)))) + + (defun my/is-non-done-task () + (and (not (my/is-unactionable-task)) + (not (member (org-get-todo-state) + org-done-keywords)))) + + (defun my/has-non-done-task () + (save-excursion + (orgc-loop/todo-children has-non-done-task + (when (my/is-non-done-task) + (setq has-non-done-task t))))) + + (defun my/is-a-task () + (save-excursion + (and (not (member "NOT_TASKS" (org-get-tags (point)))) + (or (and (equal "ONE" (org-get-todo-state)) + (not (my/has-non-done-task))) + (and (org-get-todo-state) + (not (member (org-get-todo-state) '("PROJECT" "SOMEDAY" "WAIT" "HOLD"))) + (my/no-children)))))) + + (defun my/has-next-task () + (save-excursion + (orgc-loop/todo-children has-next-task + (when (my/is-next-task) + (setq has-next-task t))))) + + (defun my/is-next-task () + (let ((todo (org-get-todo-state))) + (or (equal todo "NEXT") + (and (member todo '("TODO" "ONE" "NEXT")) + (or (org-get-scheduled-time (point)) + (org-get-deadline-time (point))))))) + #+end_src +** Old meta project code + #+begin_src emacs-lisp + (defun my/greedy-active-project (file point) + (save-excursion + (let ((subtree-end (save-excursion (org-end-of-subtree t))) + has-next-task has-active-project) + (outline-next-heading) + (while (and (not (and has-next-task + has-active-project)) + (< (point) subtree-end)) + (while (string= "CAT" (org-get-todo-state)) + (outline-next-heading)) + (cond ((and (my/is-a-task) + (my/is-next-task)) + (setq has-next-task t)) + ((and (my/is-a-project) + (eq (my/get-project-type file (point) nil) + 'active)) + (setq has-active-project t))) + (org-end-of-subtree t t)) + (or has-next-task + has-active-project)))) + + (defun my/active-sequential-project (file point) + (save-excursion + (let ((subtree-end (save-excursion (org-end-of-subtree t))) + has-next-task has-active-project) + (outline-next-heading) + (while (and (not (or has-next-task + has-active-project)) + (< (point) subtree-end)) + (cond ((and (my/is-a-task) + (my/is-next-task)) + (setq has-next-task t)) + ((and (my/is-a-project) + (eq (my/get-project-type file (point) nil) + 'active)) + (setq has-active-project t))) + (org-end-of-subtree t t)) + (or has-next-task + has-active-project)))) + + (defun my/generous-active-project (file point) + (save-excursion + (let (has-task has-next-task has-project has-stuck-project) + (orgc-loop/todo-children-cat custom-condition + (if (and has-next-task has-stuck-project) + (setq custom-condition t) + (cond ((my/is-a-project) + (setq has-project t) + (when (eq (my/get-project-type file (point) t) + 'stuck) + (setq has-stuck-project t))) + ((my/is-non-done-task) + (setq has-task t) + (when (or (my/is-next-task) + (equal (org-get-todo-state) "WAIT")) ;; Ew + (setq has-next-task t)))))) + (or (and has-next-task + (not has-stuck-project)) + (and (not has-task) + has-project + (not has-stuck-project)))))) + #+end_src +** Project show + #+begin_src emacs-lisp + (defun my/show-empty () + (my/has-todo-child)) + + (defun my/show-meta (ambiguous-to-stuck) + (not (if ambiguous-to-stuck + (my/generous-active-project file point) + (my/greedy-active-project file point)))) + + (defun my/show-seq (file point) + (my/active-sequential-project file point)) + + (defun my/get-project-type (file point &optional ambiguous-to-stuck) + (save-excursion + (when (my/is-a-project) + (let ((todo (org-get-todo-state))) + (if (and (org-time> (org-entry-get (point) "SCHEDULED") + (org-matcher-time "")) + (or (member todo '("META" "EMPTY" "SEQ")) + (member todo '("ONE" "TODO")))) + 'delayed + (pcase todo + ("ETERNAL" 'eternal) + ("FUTURE" 'someday) + ("HOLD" 'hold) + ("SEQ" + (if (my/show-seq file point) + 'stuck 'active)) + ("EMPTY" + (when (my/show-empty) + 'stuck)) + ("META" + (if (my/show-meta ambiguous-to-stuck) + 'stuck 'active)))))))) + #+end_src +* More alternative views + #+begin_src emacs-lisp + (defun cfw:open-org-calendar-no-projects (&args) + "Open an org schedule calendar in the new buffer." + (interactive) + (save-excursion + (let ((buf (get-buffer "*cfw-calendar*"))) + (if buf + (switch-to-buffer buf) + (let* ((org-agenda-skip-function 'my/agenda-custom-skip) + (source1 (cfw:org-create-source)) + (curr-keymap (if cfw:org-overwrite-default-keybinding cfw:org-custom-map cfw:org-schedule-map)) + (cp (cfw:create-calendar-component-buffer + :view 'two-weeks + :contents-sources (list source1) + :custom-map curr-keymap + :sorter 'cfw:org-schedule-sorter))) + (switch-to-buffer (cfw:cp-get-buffer cp)) + (set (make-variable-buffer-local 'org-agenda-skip-function) + 'my/agenda-custom-skip) + (when (not org-todo-keywords-for-agenda) + (message "Warn : open org-agenda buffer first."))) + )))) + #+end_src +** My own agenda renderer :FIX: + #+BEGIN_SRC emacs-lisp + (add-to-list 'load-path + "~/.emacs.d/custom/org-ql") + (require 'org-ql) + (require 'org-ql-agenda) + (require 'org-habit) + + ;; (org-ql-agenda '("~/MEGA/org/agenda/agenda.org") (or (and (todo "HABIT") (deadline <= today)) (todo "WAIT")) :super-groups ((:name "Tasks in other courts" :todo "WAIT") (:name "Incomplete Habits" :todo "HABIT"))) + + (defun org-ql-agenda-function (ignore) + (org-agenda-prepare "org-ql") + (insert + (save-window-excursion + (org-ql-agenda org-agenda-files + (or (and (todo "HABIT") + (deadline <= today)) + (todo "WAIT") + ;; (and (todo "TODO") + ;; (tags "REWARD") + ;; (priority = "A")) + ) + :super-groups ((:name "Waiting tasks" :todo "WAIT") + (:name "Incomplete Habits" :todo "HABIT") + ;; (:name "Rewards" :tag "REWARD") + )) + (switch-to-buffer "*Org Agenda NG*") + (let ((res (buffer-string))) + (kill-buffer) + res)) + "\n\n") + (org-agenda-finalize)) + + (defvar my/org-agenda-types nil) + + (defun test (throwaway) + (if (null my/org-agenda-types) + (error "Need to specify my/org-agenda-types") + (org-agenda-prepare "This is a test") + (org-agenda--insert-overriding-header + ;; This string will be inserted if there is no overriding header + "This is a test") + (insert throwaway "\n") + (org-agenda-finalize)) + ;; (setq buffer-read-only t) + ) + + (add-to-list 'org-agenda-custom-commands + '("E" "Experimental stuff" + ((tags-todo "-REFILE/!" + ((org-agenda-overriding-header "Stuck Projects") + (org-tags-match-list-sublevels 'indented) + (org-agenda-skip-function 'my/show-stuck-projects) + (org-agenda-sorting-strategy + '(category-keep)))) + (test "Hello" + ((org-agenda-overriding-header "Hello World") + (my/org-agenda-types t))) + (org-ql-agenda-function "")))) + + ;; Helper function + ;; (setq org-agenda-custom-commands (remove-if (lambda (a) (string= (car a) "E")) org-agenda-custom-commands)) + #+END_SRC +* Agenda Project Filtering + #+begin_src emacs-lisp + (defun my/show-active-projects () + "Only show subtrees that are stuck projects" + (save-restriction + (widen) + (let ((subtree-end (save-excursion (org-end-of-subtree t)))) + (unless (member (my/get-project-type buffer-file-name (point) nil) + '(active)) + subtree-end)))) + + (defun my/dev-show-active-projects () + "Only show subtrees that are stuck projects" + (save-restriction + (widen) + (let ((subtree-end (save-excursion (org-end-of-subtree t)))) + (unless (or (and (my/is-todo-task) + (my/is-standalone-task) + (or (string= (org-get-todo-state) "NEXT") + (org-get-scheduled-time (point)) + (org-get-deadline-time (point)))) + (member (my/get-project-type buffer-file-name (point) nil) + '(active))) + subtree-end)))) + + (defun my/show-stuck-projects () + "Only show subtrees that are stuck projects" + (save-restriction + (widen) + (let ((subtree-end (save-excursion (org-end-of-subtree t))) + (next-heading (save-excursion (outline-next-heading)))) + ;; (setq debug-p (point) + ;; debuf-f (buffer-file-name)) + (if (org-get-todo-state) + (unless (or (and (my/is-a-task) + (my/is-standalone-task) + (not (org-get-scheduled-time (point))) + (not (org-get-deadline-time (point)))) + (eq (my/get-project-type buffer-file-name (point) t) + 'stuck)) + subtree-end) + next-heading)))) + + (defun my/dev-show-stuck-projects () + "Only show subtrees that are stuck projects" + (save-restriction + (widen) + (let ((subtree-end (save-excursion (org-end-of-subtree t))) + (next-heading (save-excursion (outline-next-heading)))) + (if (org-get-todo-state) + (unless (eq (my/get-project-type buffer-file-name (point) t) + 'stuck) + subtree-end) + next-heading)))) + + (defun my/show-delayed-projects () + (save-restriction + (widen) + (let ((subtree-end (save-excursion (org-end-of-subtree t)))) + (unless (eq (my/get-project-type buffer-file-name (point)) + 'delayed) + subtree-end)))) + + (defun my/agenda-custom-skip () + (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))) + (current (point)) + display) + (save-restriction + (widen) + (save-excursion + (when (or (my/is-a-project) + (member (org-get-todo-state) '("FUTURE" "WAIT" "HABIT" nil))) + next-headline))))) + + (defun my/show-next-tasks-and-standalone-tasks () + (let ((next-headline (save-excursion (or (outline-next-heading) (point-max))))) + (unless (and (my/is-a-task) + (or + (my/is-next-task) + (my/is-standalone-task))) + next-headline))) + + + (defun my/has-next-todo () + (save-excursion + (let ((end-of-subtree (save-excursion (org-end-of-subtree t))) + flag) + (while (and (not flag) + (outline-next-heading) + (< (point) next-headline)) + (when (string= (org-get-todo-state) "NEXT") + (setq flag (point)))) + flag))) + + (defun my/show-leaf-tasks () + (let ((next-headline (save-excursion (org-end-of-subtree t)))) + (unless (or (string= "NEXT" (org-get-todo-state)) + (my/has-next-todo)) + next-headline))) + + (defun my/skip-standalone-tasks () + (when (my/is-standalone-task) + (org-end-of-subtree t t))) + + + (defvar my/done-projects-flag nil) + + (defun my/show-done-projects-and-tasks () + "Show top level leaf of these todos: DONE|CANCELLED|COMPLETE" + (save-restriction + (widen) + (let ((subtree-end (save-excursion (org-end-of-subtree t))) + (next-headline (save-excursion (or (outline-next-heading) (point-max))))) + (if my/done-projects-flag + (let ((ov my/done-projects-flag)) + (setq my/done-projects-flag nil) + ov) + (if (member (org-get-todo-state) org-done-keywords) + (progn (setq my/done-projects-flag subtree-end) + nil) + next-headline))))) + #+end_src +* Stuff :FIX: + #+begin_src emacs-lisp# + (setq org-agenda-tags-todo-honor-ignore-options t) + + (defun bh/org-auto-exclude-function (tag) + "Automatic task exclusion in the agenda with / RET" + (when (string= tag "online") + (concat "-" tag))) + + (org-defkey org-agenda-mode-map + "A" + 'org-agenda) + + (setq org-agenda-auto-exclude-function 'bh/org-auto-exclude-function) + (setq org-agenda-skip-deadline-prewarning-if-scheduled 'pre-scheduled) + (setq org-agenda-skip-scheduled-if-deadline-is-shown nil) + (setq org-agenda-log-mode-items '(clock closed)) + + (defun org-agenda-delete-empty-compact-blocks () + "Function removes empty compact blocks. + If two lines next to each other have the + org-agenda-structure face, then delete the + previous block." + (unless org-agenda-compact-blocks + (user-error "Compact blocks must be on")) + (setq buffer-read-only nil) + (save-excursion + (goto-char (point-min)) + (let ((start-pos (point)) + (previous t)) + (while (and (forward-line) + (not (eobp))) + (cond + ((let ((face (get-char-property (point) 'face))) + (or (eq face 'org-agenda-structure) + (eq face 'org-agenda-date-today))) + (if previous + (delete-region start-pos + (point)) + (setq start-pos (point))) + (setq previous t)) + (t (setq previous nil))))))) + + (add-hook 'org-agenda-finalize-hook #'org-agenda-delete-empty-compact-blocks) + + (defun org-agenda-add-separater-between-project () + (setq buffer-read-only nil) + (save-excursion + (goto-char (point-min)) + (let ((start-pos (point)) + (previous t)) + (re-search-forward " +agenda: +[^\\. ]" nil t) + (while (re-search-forward " +agenda: +[^\\. ]" nil t) + (beginning-of-line) + (insert "=============================================\n") + (forward-line))))) + + ;; I don't think this code is necessary + ;; (add-to-list 'org-agenda-entry-types :deadlines*) + + (setq org-agenda-hide-tags-regexp "NOT_TASKS\\|PROJECT") + + (use-package org-super-agenda) + (use-package htmlize) + (org-super-agenda-mode) + (setq org-super-agenda-header-separator "") + #+end_src +* memoization attempt + #+begin_src emacs-lisp + + + ;; (defmacro measure-time (&rest body) + ;; "Measure the time it takes to evaluate BODY." + ;; `(let ((time (current-time))) + ;; ,@body + ;; (message "%.06f" (float-time (time-since time))))) + + ;; (require 'memoize) + ;; (defun reset-memo-for-projects () + ;; (interactive) + ;; (ignore-errors + ;; (memoize-restore 'my/get-project-type)) + ;; (memoize 'my/get-project-type)) + ;; (add-hook 'org-agenda-finalize-hook + ;; #'reset-memo-for-projects) + + ;; (defvar my/stuck-projects-flag nil) + + ;; (defvar my/stuck-projects-file nil) + + ;; (defun my/show-stuck-projects () + ;; "Only show subtrees that are stuck projects" + ;; (setq stuck-here t) + ;; (save-restriction + ;; (widen) + ;; (let ((subtree-end (save-excursion (org-end-of-subtree t)))) + ;; (if (and my/stuck-projects-flag + ;; (string= my/stuck-projects-file + ;; (buffer-file-name)) + ;; (< (point) my/stuck-projects-flag)) + ;; (if (or (my/is-next-task) + ;; (my/is-unactionable-task) + ;; (and (not (my/is-a-task)) + ;; (not (eq (my/get-project-type buffer-file-name (point) t) + ;; 'stuck)))) + ;; subtree-end + ;; nil) + ;; (setq my/stuck-projects-flag nil + ;; my/stuck-projects-file nil) + ;; (cond ((and (my/is-a-task) + ;; (my/is-standalone-task) + ;; (not (org-get-scheduled-time (point))) + ;; (not (org-get-deadline-time (point)))) + ;; nil) + ;; ((eq (my/get-project-type buffer-file-name + ;; (point) t) + ;; 'stuck) + ;; (setq my/stuck-projects-flag subtree-end) + ;; (setq my/stuck-projects-file (buffer-file-name)) + ;; nil) + ;; (t subtree-end)))))) + + ;; (defvar my/done-projects-flag nil) + ;; (defvar my/next-task-flag nil) + + ;; (defun my/org-agenda-reset-vars () + ;; (interactive) + ;; (setq my/stuck-projects-flag nil + ;; my/done-projects-flag nil + ;; my/next-task-flag nil)) + + ;; (add-to-list 'org-agenda-finalize-hook + ;; #'my/org-agenda-reset-vars) + #+end_src +* Agenda custom commands + #+begin_src emacs-lisp + (defun org-agenda-add-separater-between-project () + (setq buffer-read-only nil) + (save-excursion + (goto-char (point-min)) + (let ((start-pos (point)) + (previous t)) + (re-search-forward " +agenda: +[^\\. ]" nil t) + (while (re-search-forward " +agenda: +[^\\. ]" nil t) + (beginning-of-line) + (insert "=============================================\n") + (forward-line))))) + + (defun production-agenda (tag) + `((tags-todo (concat ,tag "&TODO=\"STUFF\"") + ((org-agenda-overriding-header "Refile tasks"))) + (tags-todo ,tag + ((org-agenda-overriding-header "Stuck Projects") + (org-agenda-skip-function 'my/show-stuck-projects) + (org-tags-match-list-sublevels 'indented))) + (tags-todo ,(concat tag "&TODO=\"WAIT\"") + ((org-agenda-overriding-header "Tasks in other courts"))) + (tags-todo ,(concat tag "&TODO=\"NEXT\"") + ((org-agenda-overriding-header "Things to do") + )) + (agenda "" + ((org-agenda-skip-function 'my/agenda-custom-skip) + (org-agenda-span 'day) + (org-agenda-tag-filter-preset (quote (,tag))) + (org-agenda-skip-deadline-if-done t) + (org-agenda-skip-scheduled-if-done t) + (org-super-agenda-groups '((:name "Overdue" :and (:deadline past :log nil)) + (:name "Upcoming" :deadline future) + (:name "Should do" :and (:scheduled past :log nil)) + (:name "Today" :time-grid t + :and (:not (:and (:not (:scheduled today) + :not (:deadline today))))))))))) + + (let* ((prod-tag "+time") + (dev-tag "+dev") + (sandbox-tag "+sandbox")) + (setq org-agenda-custom-commands + `(("P" "Project View" + ((tags-todo ,sandbox-tag + ((org-agenda-overriding-header "Active Projects") + (org-agenda-skip-function 'my/show-active-projects) + (org-tags-match-list-sublevels 'indented))) + (tags-todo ,sandbox-tag + ((org-agenda-overriding-header "Stuck Projects") + (org-tags-match-list-sublevels 'indented) + (org-agenda-skip-function 'my/show-stuck-projects) + (org-agenda-sorting-strategy + '(category-keep)))) + (tags-todo ,sandbox-tag + ((org-agenda-overriding-header "Delayed projects") + (org-agenda-skip-function 'my/show-delayed-projects))) + (tags-todo ,(concat sandbox-tag "-PEOPLE/!HOLD") + ((org-agenda-overriding-header "Projects on hold"))) + (tags-todo ,(concat sandbox-tag "+PEOPLE/!HOLD") + ((org-agenda-overriding-header "People on hold"))) + (tags-todo ,(concat sandbox-tag "/!FUTURE") + ((org-agenda-overriding-header "Someday projects") + (org-agenda-sorting-strategy '(tag-up)))) + (tags-todo ,(concat sandbox-tag "/!ETERNAL") + ((org-agenda-overriding-header "Eternal Projects"))))) + ("p" . "Prod") + ("pa" "All" ,(production-agenda prod-tag)) + ("pw" "work" ,(production-agenda "+work")) + ("ps" "school" ,(production-agenda "+school")) + ("d" "dev" + ((tags-todo (concat ,dev-tag "&TODO=\"STUFF\"") + ((org-agenda-overriding-header "Refile tasks"))) + (tags-todo (concat ,dev-tag "") + ((org-agenda-overriding-header "Stuck Projects") + (org-agenda-skip-function 'my/dev-show-stuck-projects) + (org-tags-match-list-sublevels 'indented))) + (tags-todo (concat ,dev-tag "-short-PEOPLE") + ((org-agenda-overriding-header "Active Projects") + (org-agenda-skip-function 'my/dev-show-active-projects) + (org-tags-match-list-sublevels 'indented))) + (tags-todo ,(concat dev-tag "&TODO=\"NEXT\"") + ((org-agenda-overriding-header "Things to do"))) + (agenda "" + ((org-agenda-skip-function 'my/agenda-custom-skip) + (org-agenda-span 'day) + (org-agenda-tag-filter-preset (quote (,dev-tag))) + (org-agenda-skip-deadline-if-done t) + (org-agenda-skip-scheduled-if-done t) + (org-super-agenda-groups '((:name "Overdue" :and (:deadline past :log nil)) + (:name "Upcoming" :deadline future) + (:name "Should do" :and (:scheduled past :log nil)) + (:name "Today" :time-grid t + :and (:not (:and (:not (:scheduled today) + :not (:deadline today))))))))))) + ;; ("t" "Todo" tags-todo ,dev-tag + ;; ((org-agenda-overriding-header "Stuck Projects") + ;; (org-agenda-skip-function 'my/dev-show-stuck-projects) + ;; (org-tags-match-list-sublevels 'indented))) + ;; ("t" "Test "tags-todo (concat ,dev-tag "-PEOPLE") + ;; ((org-agenda-overriding-header "Active Projects") + ;; (org-agenda-skip-function 'my/dev-show-active-projects) + ;; (org-tags-match-list-sublevels 'indented))) + ("t" "Test" tags-todo ,(concat dev-tag "&TODO=\"NEXT\"") + ((org-agenda-overriding-header "Things to do"))) + ("g" "General View" + ((tags-todo "+sandbox+TODO=\"STUFF\"" + ((org-agenda-overriding-header "Refile tasks"))) + (tags-todo "+sandbox" + ((org-agenda-overriding-header "Stuck Projects") + (org-tags-match-list-sublevels 'indented) + (org-agenda-skip-function 'my/show-stuck-projects) + (org-agenda-sorting-strategy + '(category-keep)))) + (tags-todo "-REFILE-HOLD+TODO+sandbox=\"WAIT\"" + (;(org-agenda-skip-function 'my/only-next-projects-and-tasks) + (org-agenda-overriding-header "Tasks in other courts") + (org-tags-match-list-sublevels t))) + ;;(org-ql-agenda-function "") + (agenda "" + ((org-agenda-skip-function 'my/agenda-custom-skip) + (org-agenda-span 'day) + (org-agenda-tag-filter-preset (quote ("+sandbox"))) + (org-agenda-skip-deadline-if-done t) + (org-agenda-skip-scheduled-if-done t) + (org-super-agenda-groups '((:name "Overdue" :and (:deadline past :log nil )) + (:name "Upcoming" :deadline future) + (:name "Should do" :and (:scheduled past :log nil )) + (:name "Today" :time-grid t + :and (:not (:and (:not (:scheduled today) + :not (:deadline today))))))))))) + ("D" "Done Tasks" todo "DONE|CANCELLED|COMPLETE|ABANDON" + ((org-agenda-overriding-header "Done Tasks") + (org-agenda-skip-function 'my/show-done-projects-and-tasks))) + ("n" "Next Tasks List" tags-todo "-REFILE-HOLD-WAIT" + ((org-agenda-skip-function 'my/show-next-tasks-and-standalone-tasks) + (org-agenda-overriding-header "Next Tasks list") + (org-tags-match-list-sublevels t) + (org-agenda-sorting-strategy '(deadline-up)))) + ("L" "Leaf Task List" tags-todo "-REFILE-HOLD-WAIT" + ((org-agenda-skip-function 'my/show-leaf-tasks) + (org-tags-match-list-sublevels 'indented) + (org-agenda-overriding-header "Next Tasks list") + (org-agenda-finalize-hook '(org-agenda-add-separater-between-project)))) + ("c" "Look at clocking" agenda "" + ((org-agenda-skip-function 'my/agenda-custom-skip) + (org-agenda-span 'day) + (org-agenda-start-with-log-mode '(closed clock)) + (org-agenda-clockreport-mode t)))))) + + #+end_src +* Checkbox + #+BEGIN_SRC emacs-lisp + (defun my/org-checkbox-todo () + "Switch header TODO state to DONE when all checkboxes are ticked, to TODO otherwise" + (let ((todo-state (org-get-todo-state)) beg end) + (unless (not todo-state) + (save-excursion + (org-back-to-heading t) + (setq beg (point)) + (end-of-line) + (setq end (point)) + (goto-char beg) + (if (re-search-forward "\\[\\([0-9]*%\\)\\]\\|\\[\\([0-9]*\\)/\\([0-9]*\\)\\]" + end t) + (if (match-end 1) + (if (equal (match-string 1) "100%") + (unless (string-equal todo-state "DONE") + (org-todo 'done)) + (unless (string-equal todo-state "TODO") + (org-todo 'todo))) + (if (and (> (match-end 2) (match-beginning 2)) + (equal (match-string 2) (match-string 3))) + (unless (string-equal todo-state "DONE") + (org-todo 'done)) + (unless (string-equal todo-state "TODO") + (org-todo 'todo))))))))) + + (add-hook 'org-checkbox-statistics-hook 'my/org-checkbox-todo) + #+END_SRC +* Plugins +** fstree + #+BEGIN_SRC emacs-lisp + (add-to-list 'load-path + "~/.emacs.d/custom/org-fstree") + (require 'org-fstree) + #+END_SRC +** org-bullets +#+BEGIN_SRC emacs-lisp +(use-package org-bullets) +(when (not (eq system-type 'windows-nt)) +(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) +#+END_SRC +** calfw-org + #+BEGIN_SRC emacs-lisp + (use-package calfw) + (use-package calfw-ical) + (use-package calfw-gcal) + (use-package calfw-org) + (global-set-key (kbd "C-c A") 'cfw:open-org-calendar) + (setq cfw:org-overwrite-default-keybinding t) + #+END_SRC +** sync with google calendar + #+BEGIN_SRC emacs-lisp + (require 'url-http) + (use-package org-caldav) + (use-package oauth2) + (setq epa-pinentry-mode 'loopback) + (setq plstore-cache-passphrase-for-symmetric-encryption t) + + (save-excursion + (let ((filename "~/.emacs.d/google-calendar-secret.el")) + (when (file-exists-p filename) + (set-buffer (find-file-noselect filename)) + (let ((var (eval (read (buffer-string))))) + (setq org-caldav-oauth2-client-id (car var) + org-caldav-oauth2-client-secret (cadr var))) + (kill-buffer)))) + + ;; (setq org-caldav-url 'google + ;; org-caldav-calendar-id "jqeua8pamjrclakq3bg8mpnlis@group.calendar.google.com" + ;; org-caldav-inbox "~/MEGA/org/agenda/test.org" + ;; org-caldav-files '("~/MEGA/org/agenda/agenda.org") + ;; org-icalendar-include-todo nil + ;; org-icalendar-include-sexps t + ;; org-icalendar-categories '(all-tags category) + ;; org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due) + ;; org-icalendar-use-scheduled '(event-if-todo event-if-not-todo todo-start) + ;; org-icalendar-with-timestamps nil + ;; org-caldav-delete-org-entries 'never) + + (setq org-caldav-url "https://99.57.234.31/remote.php/dav/calendars/bchu" + org-caldav-calendar-id "orgmode" + org-caldav-inbox "~/MEGA/org/agenda/test.org" + org-caldav-files '("~/MEGA/org/agenda/agenda.org" "~/MEGA/org/agenda/classes_caldav_workaround.org")) + + (setq org-icalendar-alarm-time 30 + org-icalendar-include-todo nil + org-icalendar-include-sexps t + org-icalendar-categories '(all-tags category) + org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due) + org-icalendar-use-scheduled '(todo-start event-if-todo) + org-icalendar-with-timestamps nil + org-caldav-delete-org-entries 'never) + + (setq org-caldav-skip-conditions '(nottodo ("TODO" "NEXT")) + org-caldav-exclude-tags '("ARCHIVE" "ONLYEMACS")) + #+END_SRC +** Reveal.js + #+BEGIN_SRC emacs-lisp + (use-package ox-reveal) + (setq org-reveal-root "file:///home/benson/reveal.js") + (setq org-structure-template-alist (remove-if (lambda (c) (string= (car c) "n")) org-structure-template-alist)) + #+END_SRC +** org-protocol + #+BEGIN_SRC emacs-lisp + (require 'org-protocol) + #+END_SRC +** org-timeline + #+BEGIN_SRC emacs-lisp + (use-package org-timeline) + (remove-hook 'org-agenda-finalize-hook 'org-timeline-insert-timeline) + + #+END_SRC +** Code-blocks + #+BEGIN_SRC emacs-lisp + (require 'ob-core) + (require 'ob-clojure) + (require 'ob-plantuml) + (use-package plantuml-mode) + + (setq org-babel-clojure-backend 'cider) + (org-babel-do-load-languages + 'org-babel-load-languages + '((clojure . t) + (plantuml . t))) + + (defun my-org-confirm-babel-evaluate (lang body) + (not (member lang '("plantuml")))) + + (setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate) + (setq org-plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar") + #+END_SRC +** org-super-agenda + #+begin_src emacs-lisp + (use-package org-super-agenda) + (org-super-agenda-mode) + #+end_src +* View org files +#+BEGIN_SRC emacs-lisp +(defun make-org-file (filename) + "Make an org buffer in folder for all new incoming org files" + (interactive "MName: ") + (switch-to-buffer (find-file-noselect (concat "~/MEGA/org/random/" filename ".org")))) + +(defun make-encrypted-org-file (filename) + (interactive "MName: ") + (switch-to-buffer (find-file-noselect (concat "~/MEGA/org/random/" filename ".gpg"))) + (insert "# -*- mode:org; epa-file-encrypt-to: (\"bensonchu457@gmail.com\") -*-\n\n") + (org-mode)) + + +(defun view-org-files () + "Convenient way for openning up org folder in dired" + (interactive) + (dired "~/MEGA/org/")) +#+END_SRC +* Capture templates + #+begin_src emacs-lisp + (setq org-capture-templates + '(("t" "Todo" entry (file+olp "~/MEGA/org/2019-05-agenda/dev.org" "stuff") + "* STUFF %?\n :PROPERTIES:\n :CREATED: %U\n :VIEWING: %a\n :END:") + ("r" "Review" entry (file+function "~/MEGA/org/entries/reviews.gpg" setup-automatic-review) + (file "~/MEGA/org/templates/review-interactive-entry.org")) + ("rt" "Review Task" entry (file+headline "~/MEGA/org/entries/reviews.gpg" "Tasks") + "* TODO %?") + ("d" "Dream" entry (file+olp+datetree "~/MEGA/org/entries/dream.org") + "* %?") + ("D" "Distracted" entry (file+olp "~/MEGA/org/2019-05-agenda/sandbox.org" "stuff") + "* TODO %?" :clock-in t :clock-resume t) + ("T" "New Task" entry (file+olp "~/MEGA/org/2019-05-agenda/sandbox.org" "stuff") + "* TODO %?" :clock-in t :clock-keep t) + ("m" "Money" plain (file "~/MEGA/org/entries/finances/ledger.ledger") + (file "~/MEGA/org/templates/basic.ledger") :unnarrowed t :empty-lines 1) + ("c" "Record Comms Message" entry (file+olp+datetree "~/MEGA/org/entries/comms.org") + "* TODO %?") + ("j" "Journal") + ("je" "Journal Entry" entry (file+olp+datetree "~/MEGA/org/entries/journal.gpg") + "* %<%R> %?\n%U\n\n") + ("jp" "Plan your day" entry (file+olp+datetree "~/MEGA/org/entries/journal.gpg") + (file "~/MEGA/org/templates/daily-plan.org")) + ("C" "Create checklist") + ("Cc" "Conference Via Bus" entry (file+olp "~/MEGA/org/2019-05-agenda/sandbox.org" "stuff") + (file "~/MEGA/org/checklists/conference.org") + :conference/airplane nil) + ("Cm" "Morning routine" entry (file "~/MEGA/org/entries/routines.org") + (file "~/MEGA/org/checklists/mornings.org")) + ("Cn" "Nightly routine" entry (file "~/MEGA/org/entries/routines.org") + (file "~/MEGA/org/checklists/nights.org")) + ;; ("y" "Elfeed YouTube" entry (file+olp "~/MEGA/org/2019-05-agenda/dev.org" "rewards" "Videos") + ;; "* TODO %(identity elfeed-link-org-capture)") + ("p" "Protocol" entry (file+olp "~/MEGA/org/2019-05-agenda/dev.org" "stuff") + "* STUFF %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?") + ("L" "Protocol Link" entry (file+olp "~/MEGA/org/2019-05-agenda/dev.org" "stuff") + "* STUFF %? [[%:link][%:description]] \nCaptured On: %U"))) + #+end_src +* Custom Journal +** Attempt 3 +#+BEGIN_SRC emacs-lisp + (defvar yearly-theme "Thought") + + (defun completed-tags-search (start-date end-date) + (let ((org-agenda-overriding-header "* Log") + (tag-search (concat (format "TODO=\"DONE\"&CLOSED>=\"<%s>\"&CLOSED<=\"<%s>\"" + start-date + end-date)))) + (org-tags-view nil tag-search))) + + (defun get-tasks-from (start-date end-date) + (let (string) + (save-window-excursion + (completed-tags-search start-date end-date) + (setq string (mapconcat 'identity + (mapcar (lambda (a) + (concat "***" a)) + (butlast (cdr (split-string (buffer-string) "\n")) 1)) + "\n")) + (kill-buffer)) + string)) + + (defun get-journal-entries-from (start-date end-date) + (let ((string "") + match) + (save-window-excursion + (switch-to-buffer (find-file "~/MEGA/org/entries/journal.gpg")) + (goto-char (point-min)) + (while (setq match + (re-search-forward + "^\\*\\*\\* \\(2[0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\) \\w+$" nil t)) + (let ((date (match-string 1))) + (when (and (org-time< start-date date) + (or (not end-date) (org-time< date end-date))) + (org-narrow-to-subtree) + (setq string (concat string "\n" (buffer-string))) + (widen)))) + (not-modified) + (kill-buffer)) + string)) + + (defun weekly-review-file () + (set-buffer + (org-capture-target-buffer (format "~/MEGA/org/entries/review/%s/Year of %s, Week %s.org" + (format-time-string "%Y") + yearly-theme + (format-time-string "%V"))))) + + (defun make-up-review-file () + (let* ((date (org-read-date)) + (week (number-to-string + (org-days-to-iso-week + (org-time-string-to-absolute date))))) + (org-capture-put :start-date date) + (org-capture-put :start-week week) + (set-buffer + (org-capture-target-buffer + (format "~/MEGA/org/entries/review/%s/Year of %s, Week %s-%s.org" + (format-time-string "%Y") + yearly-theme + week + (format-time-string "%V")))))) + + (defun output-date () + (when my/review-date-old + (save-window-excursion + (switch-to-buffer (find-file "~/.emacs.d/last-review.el")) + (erase-buffer) + (insert (org-read-date nil nil "")) + (save-buffer) + (kill-buffer) + "") + ) + (setq my/review-date-old nil)) + (add-hook 'org-capture-before-finalize-hook 'output-date) + + (defun get-last-review-date () + (save-window-excursion + (set-buffer (find-file "~/.emacs.d/last-review.el")) + (let ((res (buffer-string))) + (kill-buffer) + res))) + + (defun setup-make-up-review () + (let* ((date (org-read-date)) + (week (number-to-string + (org-days-to-iso-week + (org-time-string-to-absolute date))))) + (org-capture-put :start-date date) + (org-capture-put :start-week week))) + + + (defvar my/review-date-old nil) + (defun setup-automatic-review () + (let* ((date (org-read-date nil nil (get-last-review-date))) + (week (format "%02d" + (org-days-to-iso-week + (org-time-string-to-absolute date))))) + (setq my/review-date-old date) + (setq my/review-visibility-level 6) + (org-capture-put :start-date date) + (org-capture-put :start-week week) + (goto-char (point-min)) + (re-search-forward "Reviews"))) + + (defvar my/review-visibility-level nil) + + (defun my/review-set-visibility () + (when my/review-visibility-level + (outline-hide-sublevels my/review-visibility-level) + (org-show-entry) + (setq my/review-visibility-level nil))) + + (add-hook 'org-capture-mode-hook + 'my/review-set-visibility) + + +#+END_SRC +* Parallel org-tags-views diff --git a/config.org b/config.org index 7653cb8..acbe0c9 100644 --- a/config.org +++ b/config.org @@ -1282,6 +1282,12 @@ (global-set-key (kbd "M-F") 'forward-word) #+end_src * Tools +** org-mode + #+begin_src emacs-lisp + (org-babel-load-file + (expand-file-name "config-org-new.org" + user-emacs-directory)) + #+end_src ** Encryption #+BEGIN_SRC emacs-lisp (require 'epa-file) @@ -1300,1303 +1306,6 @@ ;; (advice-remove 'epg--start :around #'always-use-loopback) #+END_SRC -** Org Mode -*** Keybindings and customization -#+BEGIN_SRC emacs-lisp - (use-package org) - (require 'org-agenda) - (global-set-key (kbd "M-–") (lambda () (interactive) (org-agenda "" "p"))) - (global-set-key (kbd "M-•") (lambda () (interactive) (org-agenda "" "n"))) - (global-set-key "\C-cl" 'org-store-link) - (global-set-key "\C-ca" 'org-agenda) - (global-set-key (kbd "M-∀") 'org-agenda) - (global-set-key "\C-cc" 'org-capture) - (global-set-key "\C-cb" 'org-iswitchb) - (global-set-key (kbd "") 'org-agenda) - (global-set-key (kbd "") (lambda () (interactive) (org-agenda "" "p"))) - (global-set-key (kbd "") 'org-capture) - (global-set-key (kbd "") (lambda () (interactive) (org-agenda "" "n"))) - (global-set-key (kbd "C-x C-o") 'org-agenda) - (define-key org-mode-map (kbd "C-c SPC") nil) - (define-key org-agenda-mode-map (kbd "a") 'org-agenda) - (define-key org-agenda-mode-map (kbd "H") 'org-agenda-follow-mode) - (setq org-src-window-setup 'current-window) - - (add-hook 'org-mode-hook (lambda () (visual-line-mode 1))) - - (setq org-list-allow-alphabetical t) - - ;; This is for safety - (define-key org-mode-map (kbd "C-S-") - (lambda (arg) - (interactive "P") - (if (string= "yes" (completing-read "Are you sure you want to use that keybinding? " '("yes" "no"))) - (kill-whole-line arg) - (org-cut-subtree)))) -#+END_SRC -**** Face - #+BEGIN_SRC emacs-lisp - (when (not (eq system-type 'windows-nt)) - (setq org-ellipsis " ")) - #+END_SRC -**** My Template :BROKEN: - #+BEGIN_SRC emacs-lisp - ;; (add-to-list 'org-structure-template-alist - ;; '("sv" . "#+BEGIN_SRC ? :results value\n\n#+END_SRC")) - ;; (add-to-list 'org-structure-template-alist - ;; '("so" . "#+BEGIN_SRC ? :results output\n\n#+END_SRC")) - #+END_SRC -*** Capture templates -#+BEGIN_SRC emacs-lisp - (setq org-default-notes-file "~/MEGA/org-old/notes.org") - (setq org-capture-templates - '(("t" "Todo" entry (file "~/MEGA/org/agenda/refile.org") - "* STUFF %?\n :PROPERTIES:\n :CREATED: %U\n :VIEWING: %a\n :END:") - ("r" "Review" entry (file+function "~/MEGA/org/entries/reviews.gpg" setup-automatic-review) - (file "~/MEGA/org/templates/review-interactive-entry.org")) - ("rt" "Review Task" entry (file+headline "~/MEGA/org/entries/reviews.gpg" "Tasks") - "* TODO %?") - ("d" "Dream" entry (file+olp+datetree "~/MEGA/org/entries/dream.org") - "* %?") - ("D" "Distracted" entry (file "~/MEGA/org/agenda/refile.org") - "* TODO %?" :clock-in t :clock-resume t) - ("T" "New Task" entry (file "~/MEGA/org/agenda/refile.org") - "* TODO %?" :clock-in t :clock-keep t) - ("m" "Money" plain (file "~/MEGA/org/entries/finances/ledger.ledger") - (file "~/MEGA/org/templates/basic.ledger") :unnarrowed t :empty-lines 1) - ("c" "Record Comms Message" entry (file+olp+datetree "~/MEGA/org/entries/comms.org") - "* TODO %?") - ("j" "Journal") - ("je" "Journal Entry" entry (file+olp+datetree "~/MEGA/org/entries/journal.gpg") - "* %<%R> %?\n%U\n\n") - ("jp" "Plan your day" entry (file+olp+datetree "~/MEGA/org/entries/journal.gpg") - (file "~/MEGA/org/templates/daily-plan.org")) - ("C" "Create checklist") - ("Cc" "Conference Via Bus" entry (file "~/MEGA/org/agenda/refile.org") - (file "~/MEGA/org/checklists/conference.org") - :conference/airplane nil) - ("Cm" "Morning routine" entry (file "~/MEGA/org/entries/routines.org") - (file "~/MEGA/org/checklists/mornings.org")) - ("Cn" "Nightly routine" entry (file "~/MEGA/org/entries/routines.org") - (file "~/MEGA/org/checklists/nights.org")) - ("y" "Elfeed YouTube" entry (file+olp "~/MEGA/org/agenda/agenda.org" "rewards" "Videos") - "* TODO %(identity elfeed-link-org-capture)") - ("p" "Protocol" entry (file "~/MEGA/org/agenda/refile.org") - "* STUFF %^{Title}\nSource: %u, %c\n #+BEGIN_QUOTE\n%i\n#+END_QUOTE\n\n\n%?") - ("L" "Protocol Link" entry (file "~/MEGA/org/agenda/refile.org") - "* STUFF %? [[%:link][%:description]] \nCaptured On: %U"))) -#+END_SRC -**** disabled - #+BEGIN_SRC emacs-lisp# - (setq org-capture-templates - '(("w" "Web" entry (file "~/MEGA/org/agenda/refile.org") - "* TODO [[%^{URL}][%^{Title}]]\n :PROPERTIES:\n :CREATED: %U\n :END:") - ("f" "Reference" entry (file "~/MEGA/org/agenda/reference.org") - "* %?\n%i%U") - ("rm" "Make-up Weekly Review" plain (function make-up-review-file) - (file "~/MEGA/org/templates/review-interactive.org")) - ("rw" "Weekly Review" plain (function weekly-review-file) - (file "~/MEGA/org/templates/weekly-review-template.org")) - ("i" "Important information" entry (file "~/MEGA/org/entries/important.gpg") - "* %?") - ("e" "Entries") - ("ee" "Exercise" table-line (file "~/MEGA/org/entries/exercise.org") - "| %u | %^{Push-ups} | %^{Leg-lifts} | %^{Squats}") - ("l" "Later") - ("lr" "Read Later" entry (file+headline "~/MEGA/org/agenda/lists.org" "Things to read") - "* TODO %?\n%U\n") - ("ll" "Links for life" entry (file "~/MEGA/org/entries/links.org") - "* %?") - ("w" "Weekly Thoughts" entry (function org-capture-function) - "** %<%R> %?"))) - #+END_SRC -*** Custom Journal -**** Attempt 3 -#+BEGIN_SRC emacs-lisp - (defvar yearly-theme "Thought") - - (defun completed-tags-search (start-date end-date) - (let ((org-agenda-overriding-header "* Log") - (tag-search (concat (format "TODO=\"DONE\"&CLOSED>=\"<%s>\"&CLOSED<=\"<%s>\"" - start-date - end-date)))) - (org-tags-view nil tag-search))) - - (defun get-tasks-from (start-date end-date) - (let (string) - (save-window-excursion - (completed-tags-search start-date end-date) - (setq string (mapconcat 'identity - (mapcar (lambda (a) - (concat "***" a)) - (butlast (cdr (split-string (buffer-string) "\n")) 1)) - "\n")) - (kill-buffer)) - string)) - - (defun get-journal-entries-from (start-date end-date) - (let ((string "") - match) - (save-window-excursion - (switch-to-buffer (find-file "~/MEGA/org/entries/journal.gpg")) - (goto-char (point-min)) - (while (setq match - (re-search-forward - "^\\*\\*\\* \\(2[0-9]\\{3\\}-[0-9]\\{2\\}-[0-9]\\{2\\}\\) \\w+$" nil t)) - (let ((date (match-string 1))) - (when (and (org-time< start-date date) - (or (not end-date) (org-time< date end-date))) - (org-narrow-to-subtree) - (setq string (concat string "\n" (buffer-string))) - (widen)))) - (not-modified) - (kill-buffer)) - string)) - - (defun weekly-review-file () - (set-buffer - (org-capture-target-buffer (format "~/MEGA/org/entries/review/%s/Year of %s, Week %s.org" - (format-time-string "%Y") - yearly-theme - (format-time-string "%V"))))) - - (defun make-up-review-file () - (let* ((date (org-read-date)) - (week (number-to-string - (org-days-to-iso-week - (org-time-string-to-absolute date))))) - (org-capture-put :start-date date) - (org-capture-put :start-week week) - (set-buffer - (org-capture-target-buffer - (format "~/MEGA/org/entries/review/%s/Year of %s, Week %s-%s.org" - (format-time-string "%Y") - yearly-theme - week - (format-time-string "%V")))))) - - (defun output-date () - (when my/review-date-old - (save-window-excursion - (switch-to-buffer (find-file "~/.emacs.d/last-review.el")) - (erase-buffer) - (insert (org-read-date nil nil "")) - (save-buffer) - (kill-buffer) - "") - ) - (setq my/review-date-old nil)) - (add-hook 'org-capture-before-finalize-hook 'output-date) - - (defun get-last-review-date () - (save-window-excursion - (set-buffer (find-file "~/.emacs.d/last-review.el")) - (let ((res (buffer-string))) - (kill-buffer) - res))) - - (defun setup-make-up-review () - (let* ((date (org-read-date)) - (week (number-to-string - (org-days-to-iso-week - (org-time-string-to-absolute date))))) - (org-capture-put :start-date date) - (org-capture-put :start-week week))) - - - (defvar my/review-date-old nil) - (defun setup-automatic-review () - (let* ((date (org-read-date nil nil (get-last-review-date))) - (week (format "%02d" - (org-days-to-iso-week - (org-time-string-to-absolute date))))) - (setq my/review-date-old date) - (setq my/review-visibility-level 6) - (org-capture-put :start-date date) - (org-capture-put :start-week week) - (goto-char (point-min)) - (re-search-forward "Reviews"))) - - (defvar my/review-visibility-level nil) - - (defun my/review-set-visibility () - (when my/review-visibility-level - (outline-hide-sublevels my/review-visibility-level) - (org-show-entry) - (setq my/review-visibility-level nil))) - - (add-hook 'org-capture-mode-hook - 'my/review-set-visibility) - - -#+END_SRC -*** org-agenda -**** Agenda Files - #+BEGIN_SRC emacs-lisp - (defvar org-agenda-files-list - "~/.emacs.d/agenda-files.el" - "Path to save org-agenda-files list") - - (defun save-org-agenda-files () - "" - (interactive) - (save-excursion - (let ((buf (find-file-noselect org-agenda-files-list))) - (set-buffer buf) - (erase-buffer) - (print (list 'quote org-agenda-files) buf) - (save-buffer) - (kill-buffer) - (message "org-agenda file list saved to: %s" org-agenda-files-list)))) - - (defun org-agenda-load-file-list () - "" - (interactive) - (save-excursion - (let ((buf (find-file-noselect org-agenda-files-list))) - (set-buffer buf) - (setq org-agenda-files (eval (read (buffer-string)))) - (kill-buffer) - (message "org-agenda-files-list loaded from: %s" org-agenda-files-list)))) - - #+END_SRC -**** General config -#+BEGIN_SRC emacs-lisp - (setq org-log-done 'time) - (setq org-agenda-window-setup 'current-window) - (setq org-agenda-restore-windows-after-quit t) - - (setq org-agenda-sticky t) - - (setq org-todo-keywords - '((sequence "STUFF(s)" "SOMEDAY(P)" "INACT(i)" "|") - (sequence "TODO(t)" "GOAL(g)" "ONE(o)" "NEXT(n)" "HABIT(H)" "|" "DONE(d!)") - (sequence "PROJECT(p)" "SEQUENTIAL(S)" "ETERNAL(e)" "|" "COMPLETE(c)") - (sequence "WAIT(w@/!)" "HOLD(h)" "TICKLER())" "FORGOTTEN(f)" "|" "ABANDON(a@/!)") - (sequence "TOP" "|"))) - - (setq org-todo-keyword-faces - '(("ONE" :foreground "royal blue" :weight bold) - ("STUFF" :foreground "goldenrod" :weight bold) - ("NEXT" :foreground "cyan" :weight bold) - ("WAIT" :foreground "yellow" :weight bold) - ("HOLD" :foreground "red" :weight bold) - ("PROJECT" :foreground "white" :weight bold) - ("SEQUENTIAL" :foreground "white" :weight bold) - ("ABANDON" :foreground "dark gray" :weight bold) - ("FORGOTTEN" :foreground "dark gray" :weight bold) - ("TOP" :foreground "royal blue" :weight bold) - ("INACT" :foreground "dark gray" :weight bold))) - - (setq org-todo-state-tags-triggers - (quote (("HOLD" ("HOLD" . t)) - ("WAIT" ("WAITING" . t)) - (todo ("HOLD") ("WAITING"))))) - - (setq org-use-fast-todo-selection t) - - ;(setq org-agenda-files (quote ("~/MEGA/org/agenda/dallas.org"))) - (org-agenda-load-file-list) - - ; Targets include this file and any file contributing to the agenda - up to 9 levels deep - (setq org-refile-targets `((nil :maxlevel . 9) - (org-agenda-files :maxlevel . 9) - ("~/MEGA/org/entries/panic.org" :maxlevel . 9))) - - (setq org-refile-use-cache t) - - (setq org-refile-target-verify-function - (lambda () - (let ((tags (org-get-tags-at))) - (and (not (member "ARCHIVE" tags)) - (not (equal "DONE" (org-get-todo-state))))))) - - (setq org-agenda-show-future-repeats nil) - - ; Use full outline paths for refile targets - we file directly with IDO - (setq org-refile-use-outline-path 'file) - - ; Targets complete directly with IDO - (setq org-outline-path-complete-in-steps nil) - - ; Allow refile to create parent tasks with confirmation - (setq org-refile-allow-creating-parent-nodes (quote confirm)) - - ; Use the current window for indirect buffer display - (setq org-indirect-buffer-display 'current-window) - - ;; Do not dim blocked tasks - (setq org-agenda-dim-blocked-tasks nil) - - (setq org-agenda-compact-blocks t) -#+END_SRC -**** My org traversal functions - #+begin_src emacs-lisp - (defun get-variables (l) - (cond ((null l) nil) - ((consp (car l)) - (append (extract-variables (car l)) - (get-variables (cdr l)))) - (t (cons (car l) - (get-variables (cdr l)))))) - - (defun extract-variables (l) - (if (not (consp l)) - l - (get-variables (cdr l)))) - - (defmacro org-loop/descendants (&rest body) - (declare (indent defun)) - (let ((subtree-symbol (make-symbol "subtree-end"))) - `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t)))) - (while (and (outline-next-heading) - (< (point) ,subtree-symbol)) - ,@body)))) - - (defmacro org-loop/children (&rest body) - (declare (indent defun)) - `(progn - (outline-next-heading) - (while (outline-get-next-sibling) - ,@body))) - - (defmacro orgc-loop/descendants (condition &rest body) - (declare (indent defun)) - (let ((subtree-symbol (make-symbol "subtree-end"))) - `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t))) - (,condition nil)) - (while (and (not ,condition) - (outline-next-heading) - (< (point) ,subtree-symbol)) - ,@body) - ,condition))) - - (defmacro orgb-loop/descendants (condition &rest body) - (declare (indent defun)) - (let ((subtree-symbol (make-symbol "subtree-end")) - (vars (extract-variables condition))) - `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t))) - ,@vars) - (while (and ,condition - (outline-next-heading) - (< (point) ,subtree-symbol)) - ,@body) - ,condition))) - - ;; (orgb-loop/descendants (and not-stuff stuff) - ;; (+ 1 2)) - - (defmacro orgc-loop/children (condition &rest body) - (declare (indent defun)) - (let ((subtree-symbol (make-symbol "subtree-end"))) - `(let ((,subtree-symbol (save-excursion (org-end-of-subtree t))) - (,condition nil)) - (outline-next-heading) - (while (and (not ,condition) - (< (point) ,subtree-symbol)) - ,@body - (org-end-of-subtree t t)) - ,condition))) - - (defmacro orgc-loop/todo-descendants (condition &rest body) - (declare (indent defun)) - (let ((todo-state (make-symbol "todo-state")) - (tags (make-symbol "tags"))) - `(orgc-loop/descendants ,condition - (let ((,todo-state (org-get-todo-state)) - (,tags (org-get-tags (point)))) - (when ,todo-state - (if (member "ARCHIVE" ,tags) - (org-end-of-subtree t) - ,@body)))))) - - (defmacro orgc-loop/todo-children (condition &rest body) - (declare (indent defun)) - (let ((todo-state (make-symbol "todo-state")) - (tags (make-symbol "tags"))) - `(orgc-loop/children ,condition - (let ((,todo-state (org-get-todo-state)) - (,tags (org-get-tags (point)))) - (when ,todo-state - (if (member "ARCHIVE" ,tags) - (org-end-of-subtree t) - ,@body)))))) - - (defmacro orgb-loop/todo-children (condition &rest body) - (declare (indent defun)) - (let ((todo-state (make-symbol "todo-state")) - (tags (make-symbol "tags"))) - `(orgb-loop/children ,condition - (let ((,todo-state (org-get-todo-state)) - (,tags (org-get-tags (point)))) - (when ,todo-state - (if (member "ARCHIVE" ,tags) - (org-end-of-subtree t) - ,@body)))))) - - ;; (insert (format "\n%s" (macroexpand-all - ;; '(orgc-loop/todo-children todo - ;; (setq todo t))))) - - (defmacro org-loop/todo-descendants (&rest body) - (declare (indent defun)) - (let ((todo-state (make-symbol "todo-state")) - (tags (make-symbol "tags"))) - `(org-loop/descendants - (let ((,todo-state (org-get-todo-state)) - (,tags (org-get-tags (point)))) - (when ,todo-state - (if (member "ARCHIVE" ,tags) - (org-end-of-subtree t) - ,@body)))))) - - (defmacro org-loop/todo-children (condition &rest body) - (declare (indent defun)) - (let ((todo-state (make-symbol "todo-state")) - (tags (make-symbol "tags"))) - `(org-loop/children - (let ((,todo-state (org-get-todo-state)) - (,tags (org-get-tags (point)))) - (when (and ,todo-state - (not (member "ARCHIVE") ,tags)) - ,@body))))) - - - (defmacro traverse-org-headlines (headline &rest body) - (declare (indent defun)) - (let ((buffer-symbol (make-symbol "buffer"))) - `(let (,buffer-symbol) - (org-check-agenda-file ,(cadr headline)) - (setq ,buffer-symbol (if (file-exists-p ,(cadr headline)) - (org-get-agenda-file-buffer ,(cadr headline)) - (error "No such file %s" ,(cadr headline)))) - (with-current-buffer ,buffer-symbol - (while (and (not (eobp)) - (outline-next-heading)) - ,@body))))) - - (defmacro traverse-org-files (files &rest body) - (declare (indent defun)) - (let ((file-symbol (make-symbol "file"))) - `(dolist (,file-symbol ,(cadr files)) - (traverse-org-headlines (,(car files) ,file-symbol) - ,@body)))) - - - ;; (insert (format "%s" (macroexpand-all - ;; ' (traverse-org-files (a org-agenda-files) - ;; (+ 1 2))))) - #+end_src -**** My Project code - #+BEGIN_SRC emacs-lisp - (defun my/is-part-of-subtree () - (save-excursion - (and (not (= 1 (org-current-level))) - (let (has-parent-project) - (while (and (not has-parent-project) - (org-up-heading-safe)) - (when (org-get-todo-state) - (setq has-parent-project t))) - has-parent-project)))) - - - (defun my/is-standalone-task () - (and (not (member (org-get-todo-state) '("HOLD" "PROJECT" "SOMEDAY" "TICKLER" "SEQUENTIAL"))) - (not (member "ARCHIVE" (org-get-tags (point)))) - (not (my/is-part-of-subtree)) - (not (my/is-a-project)))) - - (defun my/no-children () - "t if heading has one subheading with a todo keyword" - (save-excursion - (not (orgc-loop/todo-children has-children - (setq has-children t))))) - - (defun my/is-unactionable-task () - (or (member "NOT_TASKS" (org-get-tags (point))) - (member (org-get-todo-state) (cons "INACT" org-done-keywords)))) - - (defun my/is-non-done-task () - (and (not (my/is-unactionable-task)) - (not (member (org-get-todo-state) - org-done-keywords)))) - - (defun my/has-non-done-task () - (save-excursion - (orgc-loop/todo-children has-non-done-task - (when (my/is-non-done-task) - (setq has-non-done-task t))))) - - (defun my/is-a-task () - (save-excursion - (and (not (member "NOT_TASKS" (org-get-tags (point)))) - (or (and (equal "ONE" (org-get-todo-state)) - (not (my/has-non-done-task))) - (and (org-get-todo-state) - (not (member (org-get-todo-state) '("PROJECT" "SOMEDAY" "WAIT" "HOLD"))) - (my/no-children)))))) - - (defun my/has-subtask () - (save-excursion - (orgc-loop/todo-children has-subtask - (when (org-get-todo-state) - (setq has-subtask t))))) - - (defun my/has-next-task () - (save-excursion - (orgc-loop/todo-children has-next-task - (when (my/is-next-task) - (setq has-next-task t))))) - - (defun my/is-next-task () - (let ((todo (org-get-todo-state))) - (or ;;(equal todo "NEXT") - (and (member todo '("TODO" "ONE" "NEXT")) - (or (org-get-scheduled-time (point)) - (org-get-deadline-time (point))))))) - - (defun my/is-a-project () - (save-excursion - (let ((todo (org-get-todo-state))) - (when todo - (or (member todo '("PROJECT" "ETERNAL" "HOLD" "SEQUENTIAL")) - (and (equal todo "ONE") - (my/has-non-done-task)) - (and (member todo '("TODO")) - (my/has-subtask))))))) - - (defvar my/ambiguous-projects-default-to-stuck t) - - (defun my/greedy-active-project (file point) - (save-excursion - (let ((subtree-end (save-excursion (org-end-of-subtree t))) - has-next-task has-active-project) - (outline-next-heading) - (while (and (not (and has-next-task - has-active-project)) - (< (point) subtree-end)) - (cond ((and (my/is-a-task) - (my/is-next-task)) - (setq has-next-task t)) - ((and (my/is-a-project) - (eq (my/get-project-type file (point) nil) - 'active)) - (setq has-active-project t))) - (org-end-of-subtree t t)) - (or has-next-task - has-active-project)))) - - (defun my/active-sequential-project (file point) - (save-excursion - (let ((subtree-end (save-excursion (org-end-of-subtree t))) - has-next-task has-active-project) - (outline-next-heading) - (while (and (not (or has-next-task - has-active-project)) - (< (point) subtree-end)) - (cond ((and (my/is-a-task) - (my/is-next-task)) - (setq has-next-task t)) - ((and (my/is-a-project) - (eq (my/get-project-type file (point) nil) - 'active)) - (setq has-active-project t))) - (org-end-of-subtree t t)) - (or has-next-task - has-active-project)))) - - (defun my/generous-active-project (file point) - (save-excursion - (let (has-task has-next-task has-project has-stuck-project) - (orgc-loop/todo-children custom-condition - (if (and has-next-task has-stuck-project) - (setq custom-condition t) - (cond ((my/is-a-project) - (setq has-project t) - (when (eq (my/get-project-type file (point) t) - 'stuck) - (setq has-stuck-project t))) - ((my/is-non-done-task) - (setq has-task t) - (when (or (my/is-next-task) - (equal (org-get-todo-state) "WAIT")) ;; Ew - (setq has-next-task t)))))) - (or (and has-next-task - (not has-stuck-project)) - (and (not has-task) - has-project - (not has-stuck-project)))))) - - (defun my/get-project-type (file point &optional ambiguous-to-stuck) - (save-excursion - (when (my/is-a-project) - (let ((todo (org-get-todo-state))) - (cond ((equal todo "ETERNAL") 'eternal) - ((equal todo "SOMEDAY") 'someday) - ((equal todo "HOLD") 'hold) - ((equal todo "WAIT") 'wait) - ((org-time> (org-entry-get (point) "SCHEDULED") (org-matcher-time "")) 'delayed) - ;;((my/is-a-task) nil) - ((equal "SEQUENTIAL" (org-get-todo-state)) - (if (my/active-sequential-project file point) - 'active - 'stuck)) - (ambiguous-to-stuck - (if (my/generous-active-project file point) - 'active - 'stuck)) - ((not ambiguous-to-stuck) - (if (my/greedy-active-project file point) - 'active - 'stuck))))))) - - ;; (defmacro measure-time (&rest body) - ;; "Measure the time it takes to evaluate BODY." - ;; `(let ((time (current-time))) - ;; ,@body - ;; (message "%.06f" (float-time (time-since time))))) - - ;; (require 'memoize) - ;; (defun reset-memo-for-projects () - ;; (interactive) - ;; (ignore-errors - ;; (memoize-restore 'my/get-project-type)) - ;; (memoize 'my/get-project-type)) - ;; (add-hook 'org-agenda-finalize-hook - ;; #'reset-memo-for-projects) - - (defun my/show-stuck-projects () - "Only show subtrees that are stuck projects" - (save-restriction - (widen) - (let ((subtree-end (save-excursion (org-end-of-subtree t))) - (next-heading (save-excursion (outline-next-heading)))) - ;; (setq debug-p (point) - ;; debuf-f (buffer-file-name)) - (if (org-get-todo-state) - (unless (or (and (my/is-a-task) - (my/is-standalone-task) - (not (org-get-scheduled-time (point))) - (not (org-get-deadline-time (point)))) - (eq (my/get-project-type buffer-file-name (point) t) - 'stuck)) - subtree-end) - next-heading)))) - - ;; (defvar my/stuck-projects-flag nil) - - ;; (defvar my/stuck-projects-file nil) - - ;; (defun my/show-stuck-projects () - ;; "Only show subtrees that are stuck projects" - ;; (setq stuck-here t) - ;; (save-restriction - ;; (widen) - ;; (let ((subtree-end (save-excursion (org-end-of-subtree t)))) - ;; (if (and my/stuck-projects-flag - ;; (string= my/stuck-projects-file - ;; (buffer-file-name)) - ;; (< (point) my/stuck-projects-flag)) - ;; (if (or (my/is-next-task) - ;; (my/is-unactionable-task) - ;; (and (not (my/is-a-task)) - ;; (not (eq (my/get-project-type buffer-file-name (point) t) - ;; 'stuck)))) - ;; subtree-end - ;; nil) - ;; (setq my/stuck-projects-flag nil - ;; my/stuck-projects-file nil) - ;; (cond ((and (my/is-a-task) - ;; (my/is-standalone-task) - ;; (not (org-get-scheduled-time (point))) - ;; (not (org-get-deadline-time (point)))) - ;; nil) - ;; ((eq (my/get-project-type buffer-file-name - ;; (point) t) - ;; 'stuck) - ;; (setq my/stuck-projects-flag subtree-end) - ;; (setq my/stuck-projects-file (buffer-file-name)) - ;; nil) - ;; (t subtree-end)))))) - - (defvar my/done-projects-flag nil) - - (defun my/show-done-projects-and-tasks () - "Show top level leaf of these todos: DONE|CANCELLED|COMPLETE" - (save-restriction - (widen) - (let ((subtree-end (save-excursion (org-end-of-subtree t))) - (next-headline (save-excursion (or (outline-next-heading) (point-max))))) - (if my/done-projects-flag - (let ((ov my/done-projects-flag)) - (setq my/done-projects-flag nil) - ov) - (if (member (org-get-todo-state) org-done-keywords) - (progn (setq my/done-projects-flag subtree-end) - nil) - next-headline))))) - - (defun my/org-agenda-reset-vars () - (interactive) - (setq my/stuck-projects-flag nil - my/done-projects-flag nil - my/next-task-flag nil)) - - (add-to-list 'org-agenda-finalize-hook - #'my/org-agenda-reset-vars) - - (defun my/show-active-projects () - "Only show subtrees that are stuck projects" - (save-restriction - (widen) - (let ((subtree-end (save-excursion (org-end-of-subtree t)))) - (unless (member (my/get-project-type buffer-file-name (point) nil) - '(active)) - subtree-end)))) - - (defun my/show-hold-projects () - "Only show subtrees that are stuck projects" - (save-restriction - (widen) - (let ((subtree-end (save-excursion (org-end-of-subtree t)))) - (unless (eq (my/get-project-type buffer-file-name (point)) - 'hold) - subtree-end)))) - - (defun my/show-delayed-projects () - (save-restriction - (widen) - (let ((subtree-end (save-excursion (org-end-of-subtree t)))) - (unless (eq (my/get-project-type buffer-file-name (point)) - 'delayed) - subtree-end)))) - - (defun my/show-next-tasks-and-standalone-tasks () - (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))) - (current (point)) - display) - (save-restriction - (widen) - (save-excursion - (while (and (not (eobp)) - (not display)) - (if (or (and (my/is-a-task) - (my/is-next-task)) - (my/is-standalone-task)) - (setq display (point)) - (let ((project-type (my/get-project-type buffer-file-name (point) nil))) - (if (and project-type - (not (eq project-type 'active))) - (goto-char (save-excursion (org-end-of-subtree t))) - (outline-next-heading))))) - (cond ((eobp) - (point-max)) - ((not (= display current)) - display)))))) - - (defun my/show-next-tasks-and-standalone-tasks () - (let ((next-headline (save-excursion (or (outline-next-heading) (point-max))))) - (unless (and (my/is-a-task) - (or - (my/is-next-task) - (my/is-standalone-task))) - next-headline))) - - (defun my/not-scheduled () - (let ((next-headline (save-excursion (or (outline-next-heading) (point-max))))) - (when (org-get-scheduled-time) - next-headline))) - - ;; (defun my/agenda-custom-skip () - ;; (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))) - ;; (current (point)) - ;; display) - ;; (save-restriction - ;; (widen) - ;; (save-excursion - ;; (when (or (my/get-project-type "" "") - ;; (member (org-get-todo-state) '("SOMEDAY" "WAIT" "HABIT" nil))) - ;; next-headline))))) - - (defun my/agenda-custom-skip () - (let ((next-headline (save-excursion (or (outline-next-heading) (point-max)))) - (current (point)) - display) - (save-restriction - (widen) - (save-excursion - (when (or (my/is-a-project) - (member (org-get-todo-state) '("SOMEDAY" "WAIT" "HABIT" nil))) - next-headline))))) - - (defvar my/next-task-flag nil) - ;; (setq my/next-task-flag nil) - - (defun my/has-next-todo () - (save-excursion - (let ((end-of-subtree (save-excursion (org-end-of-subtree t))) - flag) - (while (and (not flag) - (outline-next-heading) - (< (point) next-headline)) - (when (string= (org-get-todo-state) "NEXT") - (setq flag (point)))) - flag))) - - (defun my/show-leaf-tasks () - (let ((next-headline (save-excursion (org-end-of-subtree t)))) - (unless (or (string= "NEXT" (org-get-todo-state)) - (my/has-next-todo)) - next-headline))) - #+END_SRC -**** Views - #+BEGIN_SRC emacs-lisp - - (setq org-agenda-tags-todo-honor-ignore-options t) - - (defun bh/org-auto-exclude-function (tag) - "Automatic task exclusion in the agenda with / RET" - (when (string= tag "online") - (concat "-" tag))) - - (org-defkey org-agenda-mode-map - "A" - 'org-agenda) - - (setq org-agenda-auto-exclude-function 'bh/org-auto-exclude-function) - (setq org-agenda-skip-deadline-prewarning-if-scheduled 'pre-scheduled) - (setq org-agenda-skip-scheduled-if-deadline-is-shown nil) - (setq org-agenda-log-mode-items '(clock closed)) - - (defun org-agenda-delete-empty-compact-blocks () - "Function removes empty compact blocks. - If two lines next to each other have the - org-agenda-structure face, then delete the - previous block." - (unless org-agenda-compact-blocks - (user-error "Compact blocks must be on")) - (setq buffer-read-only nil) - (save-excursion - (goto-char (point-min)) - (let ((start-pos (point)) - (previous t)) - (while (and (forward-line) - (not (eobp))) - (cond - ((let ((face (get-char-property (point) 'face))) - (or (eq face 'org-agenda-structure) - (eq face 'org-agenda-date-today))) - (if previous - (delete-region start-pos - (point)) - (setq start-pos (point))) - (setq previous t)) - (t (setq previous nil))))))) - - (add-hook 'org-agenda-finalize-hook #'org-agenda-delete-empty-compact-blocks) - - (defun org-agenda-add-separater-between-project () - (setq buffer-read-only nil) - (save-excursion - (goto-char (point-min)) - (let ((start-pos (point)) - (previous t)) - (re-search-forward " +agenda: +[^\\. ]" nil t) - (while (re-search-forward " +agenda: +[^\\. ]" nil t) - (beginning-of-line) - (insert "=============================================\n") - (forward-line))))) - - ;; I don't think this code is necessary - ;; (add-to-list 'org-agenda-entry-types :deadlines*) - - (setq org-agenda-hide-tags-regexp "NOT_TASKS\\|PROJECT") - - (use-package org-super-agenda) - (use-package htmlize) - (org-super-agenda-mode) - (setq org-super-agenda-header-separator "") - - (let* ((stuck-projects-view '(tags-todo "-REFILE/!" - ((org-agenda-overriding-header "Stuck Projects") - (org-tags-match-list-sublevels 'indented) - (org-agenda-skip-function 'my/show-stuck-projects) - (org-agenda-sorting-strategy - '(category-keep)))))) - (setq org-agenda-custom-commands - `(("p" "Project View" - ((tags-todo "-REFILE-HOLD/!" - ((org-agenda-overriding-header "Active Projects") - (org-agenda-skip-function 'my/show-active-projects) - (org-tags-match-list-sublevels 'indented) - (org-super-agenda-groups '((:name "Work" :tag "WORK") - (:name "School" :tag "SCHOOL"))))) - ,stuck-projects-view - (tags-todo "-REFILE/!" - ((org-agenda-overriding-header "Delayed projects") - (org-agenda-skip-function 'my/show-delayed-projects))) - (tags-todo "-PEOPLE/!HOLD" - ((org-agenda-overriding-header "Projects on hold"))) - (tags-todo "+PEOPLE/!HOLD" - ((org-agenda-overriding-header "People on hold"))) - (todo "SOMEDAY" - ((org-agenda-overriding-header "Someday projects") - (org-agenda-sorting-strategy '(tag-up)))) - (todo "ETERNAL" - ((org-agenda-overriding-header "Eternal Projects"))))) - ("g" "General View" - (;; (tags-todo "+PLAN" - ;; ((org-agenda-files '("~/MEGA/org/entries/journal.gpg")) - ;; (org-agenda-overriding-header "Today's plan"))) - (tags-todo "+REFILE|TODO=\"STUFF\"" - ((org-agenda-overriding-header "Refile tasks"))) - ,stuck-projects-view - ;; (tags-todo "-REFILE-HOLD+TODO=\"WAIT\"" - ;; (;(org-agenda-skip-function 'my/only-next-projects-and-tasks) - ;; (org-agenda-overriding-header "Tasks in other courts") - ;; (org-tags-match-list-sublevels t))) - ;; (tags-todo "+DEADLINE<\"\"-SCHEDULED>\"\"/!HABIT" - ;; ((org-agenda-overriding-header "Incomplete Habits"))) - ;; This is an inline replacement - (org-ql-agenda-function "") - (agenda "" - ((org-agenda-skip-function 'my/agenda-custom-skip) - (org-agenda-span 'day) - ;(org-agenda-show-log t) - (org-agenda-skip-deadline-if-done t) - (org-agenda-skip-scheduled-if-done t) - (org-super-agenda-groups '((:name "Overdue" :and (:deadline past :log nil :not (:tag "Work"))) - (:name "Upcoming" :and (:deadline future :not (:tag "Work"))) - (:name "Work Related" :tag "WORK") - (:name "Should do" :and (:scheduled past :log nil :not (:tag "Work"))) - (:name "Today" :time-grid t - :and (:not (:tag "Work") - :not (:and (:not (:scheduled today) - :not (:deadline today))))) - )))))) - ("c" "Access Comms" tags-todo "+COMMS/!TODO" - ((org-agenda-files '("~/MEGA/org/agenda/agenda.org" "~/MEGA/org/entries/comms.org")))) - ("P" "Time to panic" - ((tags-todo "+MOTIVATION/!TOP" - ((org-agenda-overriding-header "Remember your motivation") - (org-agenda-files '("~/MEGA/org/entries/motivation.org")))) - (tags-todo "+PANIC" - ((org-agenda-overriding-header "TIME TO PANIC") - (org-use-tag-inheritance nil))))) - ("n" "Next Tasks List" tags-todo "-REFILE-HOLD-WAIT" - ((org-agenda-skip-function 'my/show-next-tasks-and-standalone-tasks) - (org-agenda-overriding-header "Next Tasks list") - (org-tags-match-list-sublevels t) - (org-agenda-sorting-strategy '(deadline-up)))) - ("L" "Leaf Task List" tags-todo "-REFILE-HOLD-WAIT" - ((org-agenda-skip-function 'my/show-leaf-tasks) - (org-tags-match-list-sublevels 'indented) - (org-agenda-overriding-header "Next Tasks list") - (org-agenda-finalize-hook '(org-agenda-add-separater-between-project)))) - ("r" "Review Tasks" - ((todo "TODO" - ((org-agenda-files '("~/MEGA/org/entries/reviews.gpg")) - (org-agenda-overriding-header "Active") - (org-agenda-skip-function '(org-agenda-skip-entry-if 'notscheduled)))) - (todo "TODO" - ((org-agenda-files '("~/MEGA/org/entries/reviews.gpg")) - (org-agenda-overriding-header "Inactive"))))) - ("l" . "Leisure") - ("la" "Articles" tags-todo "READ/!TODO") - ("lv" "Videos" - ((tags-todo "+VIDEO+LEARN/!TODO" ((org-agenda-overriding-header "Longer"))) - (tags-todo "+VIDEO-LEARN/!TODO" ((org-agenda-overriding-header "Shorter"))))) - ("f" "Calfw" - cfw:open-org-calendar-no-projects) - ("w" "Work" - ((tags-todo "+WORK/!" - ((org-tags-match-list-sublevels 'indented))))) - ("W" "Next week" - ((tags-todo "-REFILE/!" - ((org-agenda-overriding-header "Stuck Projects") - (org-tags-match-list-sublevels 'indented) - (org-agenda-skip-function 'my/show-stuck-projects) - (org-agenda-sorting-strategy - '(category-keep)))) - (agenda "" - ((org-agenda-skip-function 'my/show-next-tasks-and-standalone-tasks) - (org-agenda-start-on-weekday 5))))) - ("h" "Projects on hold" todo "HOLD" ((org-tags-match-list-sublevels 'indented))) - ("t" "Today" agenda "" - ((org-agenda-skip-function 'my/agenda-custom-skip) - (org-agenda-span 'day) - (org-agenda-start-with-log-mode '(closed clock)) - (org-agenda-clockreport-mode t))) - ("C" . "Categories") - ("Cb" "Bus tasks" tags-todo "BUS") - ("Cr" "Articles to read" tags-todo "READ") - ;; ("D" "Old done tasks" todo "DONE|CANCELLED|COMPLETE") - ("d" "Done Tasks" todo "DONE|CANCELLED|COMPLETE|ABANDON" - ((org-agenda-overriding-header "Done Tasks") - (org-agenda-skip-function 'my/show-done-projects-and-tasks)))))) - - - (defun cfw:open-org-calendar-no-projects (&args) - "Open an org schedule calendar in the new buffer." - (interactive) - (save-excursion - (let ((buf (get-buffer "*cfw-calendar*"))) - (if buf - (switch-to-buffer buf) - (let* ((org-agenda-skip-function 'my/agenda-custom-skip) - (source1 (cfw:org-create-source)) - (curr-keymap (if cfw:org-overwrite-default-keybinding cfw:org-custom-map cfw:org-schedule-map)) - (cp (cfw:create-calendar-component-buffer - :view 'two-weeks - :contents-sources (list source1) - :custom-map curr-keymap - :sorter 'cfw:org-schedule-sorter))) - (switch-to-buffer (cfw:cp-get-buffer cp)) - (set (make-variable-buffer-local 'org-agenda-skip-function) - 'my/agenda-custom-skip) - (when (not org-todo-keywords-for-agenda) - (message "Warn : open org-agenda buffer first."))) - )))) - - ;; (defun cfw:open-org-calendar-no-projects (&args) - ;; (interactive) - ;; (let ((buf (get-buffer "*cfw-calendar*"))) - ;; (if buf - ;; (switch-to-buffer buf) - ;; (progn - ;; (let ((org-agenda-skip-function 'my/agenda-custom-skip)) - ;; (cfw:open-org-calendar)) - ;; (set (make-variable-buffer-local 'org-agenda-skip-function) - ;; 'my/agenda-custom-skip))))) - - ;; (remove-hook 'org-agenda-mode-hook - ;; 'org-store-agenda-views) - - #+END_SRC -**** Face - #+BEGIN_SRC emacs-lisp - (custom-set-faces - '(org-agenda-date-today ((t (:inherit org-agenda-date :foreground "cyan" :slant italic :weight bold :height 1.1)))) - '(org-agenda-structure ((t (:foreground "LightSkyBlue" :box (:line-width 1 :color "grey75" :style released-button)))))) - #+END_SRC -**** My own agenda renderer - #+BEGIN_SRC emacs-lisp - (add-to-list 'load-path - "~/.emacs.d/custom/org-ql") - (require 'org-ql) - (require 'org-ql-agenda) - (require 'org-habit) - - ;; (org-ql-agenda '("~/MEGA/org/agenda/agenda.org") (or (and (todo "HABIT") (deadline <= today)) (todo "WAIT")) :super-groups ((:name "Tasks in other courts" :todo "WAIT") (:name "Incomplete Habits" :todo "HABIT"))) - - (defun org-ql-agenda-function (ignore) - (org-agenda-prepare "org-ql") - (insert - (save-window-excursion - (org-ql-agenda org-agenda-files - (or (and (todo "HABIT") - (deadline <= today)) - (todo "WAIT") - ;; (and (todo "TODO") - ;; (tags "REWARD") - ;; (priority = "A")) - ) - :super-groups ((:name "Waiting tasks" :todo "WAIT") - (:name "Incomplete Habits" :todo "HABIT") - ;; (:name "Rewards" :tag "REWARD") - )) - (switch-to-buffer "*Org Agenda NG*") - (let ((res (buffer-string))) - (kill-buffer) - res)) - "\n\n" - ) - (org-agenda-finalize)) - - (defvar my/org-agenda-types nil) - - (defun test (throwaway) - (if (null my/org-agenda-types) - (error "Need to specify my/org-agenda-types") - (org-agenda-prepare "This is a test") - (org-agenda--insert-overriding-header - ;; This string will be inserted if there is no overriding header - "This is a test") - (insert throwaway "\n") - (org-agenda-finalize)) - ;; (setq buffer-read-only t) - ) - - (add-to-list 'org-agenda-custom-commands - '("E" "Experimental stuff" - ((tags-todo "-REFILE/!" - ((org-agenda-overriding-header "Stuck Projects") - (org-tags-match-list-sublevels 'indented) - (org-agenda-skip-function 'my/show-stuck-projects) - (org-agenda-sorting-strategy - '(category-keep)))) - (test "Hello" - ((org-agenda-overriding-header "Hello World") - (my/org-agenda-types t))) - (org-ql-agenda-function "")))) - - ;; Helper function - ;; (setq org-agenda-custom-commands (remove-if (lambda (a) (string= (car a) "E")) org-agenda-custom-commands)) - #+END_SRC -*** Checkbox - #+BEGIN_SRC emacs-lisp - (defun my/org-checkbox-todo () - "Switch header TODO state to DONE when all checkboxes are ticked, to TODO otherwise" - (let ((todo-state (org-get-todo-state)) beg end) - (unless (not todo-state) - (save-excursion - (org-back-to-heading t) - (setq beg (point)) - (end-of-line) - (setq end (point)) - (goto-char beg) - (if (re-search-forward "\\[\\([0-9]*%\\)\\]\\|\\[\\([0-9]*\\)/\\([0-9]*\\)\\]" - end t) - (if (match-end 1) - (if (equal (match-string 1) "100%") - (unless (string-equal todo-state "DONE") - (org-todo 'done)) - (unless (string-equal todo-state "TODO") - (org-todo 'todo))) - (if (and (> (match-end 2) (match-beginning 2)) - (equal (match-string 2) (match-string 3))) - (unless (string-equal todo-state "DONE") - (org-todo 'done)) - (unless (string-equal todo-state "TODO") - (org-todo 'todo))))))))) - - (add-hook 'org-checkbox-statistics-hook 'my/org-checkbox-todo) - #+END_SRC -*** Plugins -**** fstree - #+BEGIN_SRC emacs-lisp - (add-to-list 'load-path - "~/.emacs.d/custom/org-fstree") - (require 'org-fstree) - #+END_SRC -**** org-bullets -#+BEGIN_SRC emacs-lisp -(use-package org-bullets) -(when (not (eq system-type 'windows-nt)) -(add-hook 'org-mode-hook (lambda () (org-bullets-mode 1)))) -#+END_SRC -**** calfw-org - #+BEGIN_SRC emacs-lisp - (use-package calfw) - (use-package calfw-ical) - (use-package calfw-gcal) - (use-package calfw-org) - (global-set-key (kbd "C-c A") 'cfw:open-org-calendar) - (setq cfw:org-overwrite-default-keybinding t) - #+END_SRC -**** sync with google calendar - #+BEGIN_SRC emacs-lisp - (require 'url-http) - (use-package org-caldav) - (use-package oauth2) - (setq epa-pinentry-mode 'loopback) - (setq plstore-cache-passphrase-for-symmetric-encryption t) - - (save-excursion - (let ((filename "~/.emacs.d/google-calendar-secret.el")) - (when (file-exists-p filename) - (set-buffer (find-file-noselect filename)) - (let ((var (eval (read (buffer-string))))) - (setq org-caldav-oauth2-client-id (car var) - org-caldav-oauth2-client-secret (cadr var))) - (kill-buffer)))) - - ;; (setq org-caldav-url 'google - ;; org-caldav-calendar-id "jqeua8pamjrclakq3bg8mpnlis@group.calendar.google.com" - ;; org-caldav-inbox "~/MEGA/org/agenda/test.org" - ;; org-caldav-files '("~/MEGA/org/agenda/agenda.org") - ;; org-icalendar-include-todo nil - ;; org-icalendar-include-sexps t - ;; org-icalendar-categories '(all-tags category) - ;; org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due) - ;; org-icalendar-use-scheduled '(event-if-todo event-if-not-todo todo-start) - ;; org-icalendar-with-timestamps nil - ;; org-caldav-delete-org-entries 'never) - - (setq org-caldav-url "https://99.57.234.31/remote.php/dav/calendars/bchu" - org-caldav-calendar-id "orgmode" - org-caldav-inbox "~/MEGA/org/agenda/test.org" - org-caldav-files '("~/MEGA/org/agenda/agenda.org" "~/MEGA/org/agenda/classes_caldav_workaround.org")) - - (setq org-icalendar-alarm-time 30 - org-icalendar-include-todo nil - org-icalendar-include-sexps t - org-icalendar-categories '(all-tags category) - org-icalendar-use-deadline '(event-if-todo event-if-not-todo todo-due) - org-icalendar-use-scheduled '(todo-start event-if-todo) - org-icalendar-with-timestamps nil - org-caldav-delete-org-entries 'never) - - (setq org-caldav-skip-conditions '(nottodo ("TODO" "NEXT")) - org-caldav-exclude-tags '("ARCHIVE" "ONLYEMACS")) - #+END_SRC -**** Reveal.js - #+BEGIN_SRC emacs-lisp - (use-package ox-reveal) - (setq org-reveal-root "file:///home/benson/reveal.js") - #+END_SRC -**** org-protocol - #+BEGIN_SRC emacs-lisp - (require 'org-protocol) - #+END_SRC -**** org-timeline - #+BEGIN_SRC emacs-lisp - (use-package org-timeline) - (remove-hook 'org-agenda-finalize-hook 'org-timeline-insert-timeline) - - #+END_SRC -**** Code-blocks - #+BEGIN_SRC emacs-lisp - (require 'ob-core) - (require 'ob-clojure) - (require 'ob-plantuml) - (use-package plantuml-mode) - - (setq org-babel-clojure-backend 'cider) - (org-babel-do-load-languages - 'org-babel-load-languages - '((clojure . t) - (plantuml . t))) - - (defun my-org-confirm-babel-evaluate (lang body) - (not (member lang '("plantuml")))) - - (setq org-confirm-babel-evaluate 'my-org-confirm-babel-evaluate) - (setq org-plantuml-jar-path "/usr/share/java/plantuml/plantuml.jar") - #+END_SRC -*** View org files - #+BEGIN_SRC emacs-lisp - (defun make-org-file (filename) - "Make an org buffer in folder for all new incoming org files" - (interactive "MName: ") - (switch-to-buffer (find-file-noselect (concat "~/MEGA/org/random/" filename ".org")))) - - (defun make-encrypted-org-file (filename) - (interactive "MName: ") - (switch-to-buffer (find-file-noselect (concat "~/MEGA/org/random/" filename ".gpg"))) - (insert "# -*- mode:org; epa-file-encrypt-to: (\"bensonchu457@gmail.com\") -*-\n\n") - (org-mode)) - - - (defun view-org-files () - "Convenient way for openning up org folder in dired" - (interactive) - (dired "~/MEGA/org/")) - #+END_SRC -*** Remove faulty template from org-reveal - #+begin_src emacs-lisp - (setq org-structure-template-alist (remove-if (lambda (a) (string= (car a) "n")) org-structure-template-alist)) - #+end_src ** Elfeed *** Setup feeds #+BEGIN_SRC emacs-lisp diff --git a/custom.el b/custom.el index 90f36e6..0aeec08 100644 --- a/custom.el +++ b/custom.el @@ -12,10 +12,78 @@ '(display-time-mode t) '(org-agenda-files (quote - ("~/MEGA/org/agenda/research.org" "~/MEGA/org/agenda/long_term.org" "~/MEGA/org/agenda/ContView.org" "~/MEGA/org/agenda/UHNW.org" "~/MEGA/org/agenda/read.org" "~/MEGA/org/agenda/agenda.org" "~/MEGA/org/agenda/reference.org" "~/MEGA/org/agenda/refile.org"))) + ("~/MEGA/org/2019-05-agenda/sandbox.org" "~/MEGA/org/2019-05-agenda/reference.org" "~/MEGA/org/2019-05-agenda/dev.org" "~/MEGA/org/2019-05-agenda/prod.org"))) '(package-selected-packages (quote - (names ctable c-c-combo doom-themes helpful helm-org-rifle all-the-icons speed-type proof-general webpaste erc-hl-nick java-snippets mvn pass ivy-hydra erc-hl-nicks erc-colorize bbdb- bbdb-ext erc gnorb bbdb window-purpose tide company-flow tern-auto-complete tern dotnet dotnet-mode elisp-def auto-highlight-symbol ccls xcscope ggtags indium cargo gradle-mode kdeconnect hy-mode hacker-typer csv-mode switch-buffer-functions org-bookmark-heading system-packages org-projectile treemacs-projectile expand-region org-wunderlist lua-mode treemacs-icons-dired memoize skeletor 0xc lsp-rust smart-mode-line-powerline-theme hyperbole eclim alert gscholar-bibtex org-noter pdf-tools md4rd arch-packer interleave sx desktop-environment org-journal-list indent-guide org-board org-brain org-edna org-clock-csv org-clock-convenience org-mru-clock lsp-ui dap-mode lsp-python lsp-java lsp-ruby lsp-mode smart-jump scrollkeeper elfeed-org elfeed rg ag dumb-jump rainbow-delimiters org-super-agenda htmlize exwm-x keyfreq org-jira eyebrowse omnisharp omnisharp-emacs typescript-mode csharp-mode restclient rjsx-mode go-mode go treemacs org-timeline plantuml-mode pkgbuild-mode airline-themes powerline magit-svn ein emacs-ipython-notebook processing-mode web-mode ledger-mode elpy skewer-mode js2-mode dired-narrow yaml-mode clj-refactor paredit geiser magit ensime yasnippet irony company dired-du ox-reveal oauth2 org-caldav calfw-org calfw-gcal calfw-ical calfw org-bullets ace-jump-mode switch-window counsel smex ivy helm counsel-projectile helm-projectile projectile slime pulseaudio-control evil undo-tree multi-term swiper color-theme-modern org org-plus-contrib use-package exwm))) + (flymd telephone-line cnfonts names ctable c-c-combo doom-themes helpful helm-org-rifle all-the-icons speed-type proof-general webpaste erc-hl-nick java-snippets mvn pass ivy-hydra erc-hl-nicks erc-colorize bbdb- bbdb-ext erc gnorb bbdb window-purpose tide company-flow tern-auto-complete tern dotnet dotnet-mode elisp-def auto-highlight-symbol ccls xcscope ggtags indium cargo gradle-mode kdeconnect hy-mode hacker-typer csv-mode switch-buffer-functions org-bookmark-heading system-packages org-projectile treemacs-projectile expand-region org-wunderlist lua-mode treemacs-icons-dired memoize skeletor 0xc lsp-rust smart-mode-line-powerline-theme hyperbole eclim alert gscholar-bibtex org-noter pdf-tools md4rd arch-packer interleave sx desktop-environment org-journal-list indent-guide org-board org-brain org-edna org-clock-csv org-clock-convenience org-mru-clock lsp-ui dap-mode lsp-python lsp-java lsp-ruby lsp-mode smart-jump scrollkeeper elfeed-org elfeed rg ag dumb-jump rainbow-delimiters org-super-agenda htmlize exwm-x keyfreq org-jira eyebrowse omnisharp omnisharp-emacs typescript-mode csharp-mode restclient rjsx-mode go-mode go treemacs org-timeline plantuml-mode pkgbuild-mode airline-themes powerline magit-svn ein emacs-ipython-notebook processing-mode web-mode ledger-mode elpy skewer-mode js2-mode dired-narrow yaml-mode clj-refactor paredit geiser magit ensime yasnippet irony company dired-du ox-reveal oauth2 org-caldav calfw-org calfw-gcal calfw-ical calfw org-bullets ace-jump-mode switch-window counsel smex ivy helm counsel-projectile helm-projectile projectile slime pulseaudio-control evil undo-tree multi-term swiper color-theme-modern org org-plus-contrib use-package exwm))) + '(sml/mode-width + (if + (eq + (powerline-current-separator) + (quote arrow)) + (quote right) + (quote full))) + '(sml/pos-id-separator + (quote + ("" + (:propertize " " face powerline-active1) + (:eval + (propertize " " + (quote display) + (funcall + (intern + (format "powerline-%s-%s" + (powerline-current-separator) + (car powerline-default-separator-dir))) + (quote powerline-active1) + (quote powerline-active2)))) + (:propertize " " face powerline-active2)))) + '(sml/pos-minor-modes-separator + (quote + ("" + (:propertize " " face powerline-active1) + (:eval + (propertize " " + (quote display) + (funcall + (intern + (format "powerline-%s-%s" + (powerline-current-separator) + (cdr powerline-default-separator-dir))) + (quote powerline-active1) + (quote sml/global)))) + (:propertize " " face sml/global)))) + '(sml/pre-id-separator + (quote + ("" + (:propertize " " face sml/global) + (:eval + (propertize " " + (quote display) + (funcall + (intern + (format "powerline-%s-%s" + (powerline-current-separator) + (car powerline-default-separator-dir))) + (quote sml/global) + (quote powerline-active1)))) + (:propertize " " face powerline-active1)))) + '(sml/pre-minor-modes-separator + (quote + ("" + (:propertize " " face powerline-active2) + (:eval + (propertize " " + (quote display) + (funcall + (intern + (format "powerline-%s-%s" + (powerline-current-separator) + (cdr powerline-default-separator-dir))) + (quote powerline-active2) + (quote powerline-active1)))) + (:propertize " " face powerline-active1)))) + '(sml/pre-modes-separator (propertize " " (quote face) (quote sml/modes))) '(wtf-custom-alist (quote (("AES" . "Advanced Encryption Standard")