From d9cae60fa5048abd3528f96a285109329639fda6 Mon Sep 17 00:00:00 2001 From: Kyle Meyer Date: Fri, 23 Jan 2015 23:23:05 -0500 Subject: Improve organization and consistency of files - Add pages and more headings for large files. - Try to use consistent order for file (or page) structure. * Loading * Settings * Hooks * Any mode activation or function calls * My functions * Key bindings --- lisp/init-org.el | 391 +++++++++++++++++++++++++++++-------------------------- 1 file changed, 206 insertions(+), 185 deletions(-) (limited to 'lisp/init-org.el') diff --git a/lisp/init-org.el b/lisp/init-org.el index cc43e1c..a674610 100644 --- a/lisp/init-org.el +++ b/lisp/init-org.el @@ -2,112 +2,32 @@ (add-to-list 'load-path "~/src/emacs/org-mode/contrib/lisp/" t) (add-to-list 'Info-directory-list "~/src/emacs/org-mode/doc/") -(setq org-modules '(org-bibtex org-gnus org-info) - org-log-done t - org-todo-keywords '((sequence "TODO(t)" "STARTED(s)" "WAITING(w@)" - "|" "DONE(d)" "NA(n@)")) +(setq org-modules '(org-bibtex org-gnus org-info)) + +(setq org-log-done t org-log-into-drawer t org-clock-into-drawer t - org-use-speed-commands t - org-use-extra-keys t - org-fast-tag-selection-single-key 'expert - org-catch-invisible-edits 'error - org-goto-interface 'outline-path-completionp - org-src-fontify-natively t + org-todo-keywords '((sequence "TODO(t)" "STARTED(s)" "WAITING(w@)" + "|" "DONE(d)" "NA(n@)"))) + +(setq org-catch-invisible-edits 'error org-special-ctrl-k t - org-outline-path-complete-in-steps nil - org-completion-use-ido t - org-reverse-note-order t - org-link-search-must-match-exact-headline nil org-insert-heading-respect-content t org-M-RET-may-split-line nil org-blank-before-new-entry '((heading . t) (plain-list-item . auto))) -(setq org-capture-templates - '(("t" "task" entry (file+headline "~/notes/tasks.org" "Inbox") - "* TODO %?\n%i") - ("d" "date" entry (file+headline "~/notes/calendar.org" "Inbox") - "* %?\n%i") - ("m" "misc" entry (file+headline "~/notes/misc.org" "Inbox") - "* %?\n%i") - ;; Link counterparts - ("T" "task link" entry (file+headline "~/notes/tasks.org" "Inbox") - "* TODO %?\n%i\nLink: %a") - ("D" "date link" entry (file+headline "~/notes/calendar.org" "Inbox") - "* %?\n%i\nLink: %a") - ("M" "misc link" entry (file+headline "~/notes/misc.org" "Inbox") - "* %?\n%i\nLink: %a") - ;; Clipboard - ("x" "task clipboard" entry (file+headline "~/notes/tasks.org" "Inbox") - "* TODO %?\n%x") - ("X" "misc clipboard" entry (file+headline "~/notes/misc.org" "Inbox") - "* %?\n%x"))) -(key-chord-define-global ",t" 'org-capture) - -(defadvice org-open-file (after km/org-open-add-to-recentf activate) - (recentf-add-file path)) - -(defun km/org-open-file-at-point () - "Open file at point with `org-open-file'." - (interactive) - (let ((file (thing-at-point 'filename))) - (if (and file (file-exists-p file)) - (org-open-file file) - (user-error "No file at point")))) - -(defun km/org-open-file () - "Interactive version of `org-open-file'." - (interactive) - (org-open-file (read-file-name "Open file: " nil nil t))) +(setq org-link-search-must-match-exact-headline nil) -(defun km/org-open-annex-file () - "Open a git annex file with `org-open-file'." - (interactive) - (--if-let (magit-annex-present-files) - (org-open-file (magit-completing-read "Open annex file" it nil t)) - (message "No annex files found"))) - -(defun km/org-open-recent-file () - "Open a file from `recentf-list' with `org-open-file'." - (interactive) - (org-open-file (km/read-recent-file))) - -(autoload 'magit-annex-present-files "magit-annex") - -(after 'init-buffile - (define-key km/file-map "a" 'km/org-open-annex-file) - (define-key km/file-map "o" 'km/org-open-file) - (define-key km/file-map "p" 'km/org-open-file-at-point) - (define-key km/file-map "r" 'km/org-open-recent-file)) - -(define-prefix-command 'km/global-org-map) -(global-set-key (kbd "C-c o") 'km/global-org-map) - -(defvar km/org-store-link-hook nil - "Hook run before by `km/org-store-link-hook'. -These are run within a `save-window-excursion' block.") - -(defun km/org-store-link () - "Run `km/org-store-link-hook' before `org-store-link'. -The hook functions and `org-store-link' are called within a -`save-window-excursion' block." - (interactive) - (save-window-excursion - (run-hooks 'km/org-store-link-hook) - (call-interactively 'org-store-link))) +(setq org-use-speed-commands t + org-use-extra-keys t + org-fast-tag-selection-single-key 'expert) -(define-key km/global-org-map "l" 'km/org-store-link) -(define-key km/global-org-map "o" 'org-open-at-point-global) -(define-key km/global-org-map "a" 'org-agenda) -(define-key km/global-org-map "j" 'km/org-goto-agenda-heading) -(define-key km/global-org-map "b" 'org-iswitchb) -(define-key km/global-org-map "s" 'org-save-all-org-buffers) -(define-key km/global-org-map "w" 'org-refile-goto-last-stored) -(define-key km/global-org-map "p" 'poporg-dwim) -(key-chord-define-global ",a" 'org-agenda) +(setq org-completion-use-ido t + org-outline-path-complete-in-steps nil + org-goto-interface 'outline-path-completionp + org-goto-max-level 3) -(after 'poporg - (define-key poporg-mode-map (kbd "C-c C-c") 'poporg-edit-exit)) +(put 'org-goto-max-level 'safe-local-variable #'integerp) (setq org-structure-template-alist '(("p" "#+property: " "") @@ -137,36 +57,20 @@ The hook functions and `org-store-link' are called within a ("i" "#+index: ?" "#+index: ?") ("I" "#+include: %file ?" ""))) -(define-prefix-command 'km/org-prefix-map) -(define-key km/org-prefix-map "w" 'km/org-refile-to-other-org-buffer) -(define-key km/org-prefix-map "s" 'km/org-sort-parent) -(define-key km/org-prefix-map "l" 'km/org-remove-title-leader) - -(after 'org - (define-key org-mode-map (kbd "C-c C-x B") - 'km/org-tree-to-indirect-buffer-current-window) - (define-key org-mode-map [remap org-tree-to-indirect-buffer] - 'km/org-tree-to-indirect-buffer) - (define-key org-mode-map (kbd "C-c m") 'km/org-prefix-map) - ;; Override global `imenu' binding. - (define-key org-mode-map (kbd "C-c j") 'org-goto) - ;; Don't let `org-cycle-agenda-files' binding override custom - ;; `backward-kill-word' binding (`org-cycle-agenda-files' is still bound - ;; to C-,). - (define-key org-mode-map (kbd "C-'") nil) - ;; Rebind `org-insert-drawer' to so that `org-metadown' has the - ;; expected "C-c C-x" keybinding. - (define-key org-mode-map (kbd "C-c C-x d") 'org-metadown) - (define-key org-mode-map (kbd "C-c C-x w") 'org-insert-drawer) - ;; Avoid conflict when amsmath is loaded. - (setcar (rassoc '("wasysym" t) org-latex-default-packages-alist) - "nointegrals") - (add-to-list 'org-latex-packages-alist '("" "amsmath" t))) - (add-to-list 'auto-mode-alist '("\\.org.txt\\'" . org-mode)) -(setq org-goto-max-level 3) -(put 'org-goto-max-level 'safe-local-variable #'integerp) +(defvar km/org-store-link-hook nil + "Hook run before by `km/org-store-link-hook'. +These are run within a `save-window-excursion' block.") + +(defun km/org-store-link () + "Run `km/org-store-link-hook' before `org-store-link'. +The hook functions and `org-store-link' are called within a +`save-window-excursion' block." + (interactive) + (save-window-excursion + (run-hooks 'km/org-store-link-hook) + (call-interactively 'org-store-link))) (defun km/org-tree-to-indirect-buffer (&optional arg) "Run `org-tree-to-indirect-buffer', keeping previous buffer. @@ -296,24 +200,111 @@ to (km/reduce-to-single-spaces) (km/org-add-blank-before-heading)) +(defun km/org-switch-to-buffer-other-window (&optional arg) + (interactive "P") + (noflet ((org-pop-to-buffer-same-window (&optional buffer-or-name norecord label) + (funcall 'pop-to-buffer buffer-or-name nil norecord))) + (org-switchb arg))) + +(after 'org + (define-key org-mode-map (kbd "C-c C-x B") + 'km/org-tree-to-indirect-buffer-current-window) + (define-key org-mode-map [remap org-tree-to-indirect-buffer] + 'km/org-tree-to-indirect-buffer) + + ;; Rebind `org-insert-drawer' to so that `org-metadown' has the + ;; expected "C-c C-x" keybinding. + (define-key org-mode-map (kbd "C-c C-x d") 'org-metadown) + (define-key org-mode-map (kbd "C-c C-x w") 'org-insert-drawer) + + ;; Override global `imenu' binding. + (define-key org-mode-map (kbd "C-c j") 'org-goto) + ;; Don't let `org-cycle-agenda-files' binding override custom + ;; `backward-kill-word' binding (`org-cycle-agenda-files' is still bound + ;; to C-,). + (define-key org-mode-map (kbd "C-'") nil) + + (define-key org-mode-map (kbd "C-c m") 'km/org-prefix-map)) + +(define-prefix-command 'km/org-prefix-map) +(define-key km/org-prefix-map "l" 'km/org-remove-title-leader) (define-key km/org-prefix-map "n" 'km/org-normalize-spaces) +(define-key km/org-prefix-map "s" 'km/org-sort-parent) -;;; Org in other modes -(defun km/load-orgstruct () - (turn-on-orgstruct++) - (turn-on-orgtbl)) +(define-prefix-command 'km/global-org-map) +(global-set-key (kbd "C-c o") 'km/global-org-map) -(add-hook 'message-mode-hook 'km/load-orgstruct) +(define-key km/global-org-map "a" 'org-agenda) +(define-key km/global-org-map "b" 'org-iswitchb) +(define-key km/global-org-map "l" 'km/org-store-link) +(define-key km/global-org-map "o" 'org-open-at-point-global) +(define-key km/global-org-map "s" 'org-save-all-org-buffers) -(after 'git-commit - (add-hook 'git-commit-setup-hook 'km/load-orgstruct)) +(define-key ctl-x-4-map "o" 'km/org-switch-to-buffer-other-window) -(add-hook 'next-error-hook (lambda () - (when (eq major-mode 'org-mode) - (org-show-context)))) + +;;; Org capture + +(setq org-capture-templates + '(("t" "task" entry (file+headline "~/notes/tasks.org" "Inbox") + "* TODO %?\n%i") + ("d" "date" entry (file+headline "~/notes/calendar.org" "Inbox") + "* %?\n%i") + ("m" "misc" entry (file+headline "~/notes/misc.org" "Inbox") + "* %?\n%i") + ;; Link counterparts + ("T" "task link" entry (file+headline "~/notes/tasks.org" "Inbox") + "* TODO %?\n%i\nLink: %a") + ("D" "date link" entry (file+headline "~/notes/calendar.org" "Inbox") + "* %?\n%i\nLink: %a") + ("M" "misc link" entry (file+headline "~/notes/misc.org" "Inbox") + "* %?\n%i\nLink: %a") + ;; Clipboard + ("x" "task clipboard" entry (file+headline "~/notes/tasks.org" "Inbox") + "* TODO %?\n%x") + ("X" "misc clipboard" entry (file+headline "~/notes/misc.org" "Inbox") + "* %?\n%x"))) + +(key-chord-define-global ",t" 'org-capture) + ;;; Agenda +(setq org-default-notes-file "~/notes/agenda/tasks.org") +(defvar km/org-agenda-file-directory "~/notes/agenda/") +(setq org-agenda-files (list km/org-agenda-file-directory)) +(setq org-agenda-text-search-extra-files + (file-expand-wildcards "~/notes/extra/*.org")) + +(setq org-agenda-restore-windows-after-quit t + org-agenda-sticky nil) + +(setq org-agenda-dim-blocked-tasks nil + org-agenda-show-all-dates t + org-agenda-skip-deadline-if-done t + org-agenda-skip-scheduled-if-done t + org-agenda-start-on-weekday nil + org-agenda-use-time-grid nil) + +(setq org-agenda-sorting-strategy + '((agenda time-up deadline-up scheduled-up priority-down category-keep) + (todo priority-down category-keep) + (tags priority-down category-keep) + (search category-keep))) + +(setq org-agenda-custom-commands + '(("d" todo "DONE" nil) + ("u" "Unschedule TODO entries" alltodo "" + ((org-agenda-skip-function + (lambda nil + (org-agenda-skip-entry-if 'scheduled 'deadline + 'regexp "\n]+>"))) + (org-agenda-overriding-header "Unscheduled TODO entries: "))) + ("p" "Past timestamps" tags "TIMESTAMP<=\"\""))) + +(add-hook 'org-agenda-mode-hook 'km/org-agenda-cd-and-read-dir-locals) +(add-hook 'org-agenda-finalize-hook 'km/org-agenda-store-current-span) + (after 'org-agenda (defadvice org-agenda-list (around org-agenda-fullscreen activate) "Start agenda in fullscreen. @@ -330,19 +321,6 @@ be restored properly." (setq default-directory "~/notes/") (hack-local-variables)) -(add-hook 'org-agenda-mode-hook 'km/org-agenda-cd-and-read-dir-locals) - -(setq org-agenda-restore-windows-after-quit t - org-agenda-sticky nil) - -(setq org-default-notes-file "~/notes/agenda/tasks.org" - org-agenda-show-all-dates t - org-agenda-skip-deadline-if-done t - org-agenda-skip-scheduled-if-done t - org-agenda-dim-blocked-tasks nil - org-agenda-use-time-grid nil - org-agenda-start-on-weekday nil) - (defun km/org-agenda-store-current-span () "Store the current span value in `org-agenda-span'. This allows the view to persist when the agenda buffer is @@ -350,19 +328,6 @@ killed." (when org-agenda-current-span (setq org-agenda-span org-agenda-current-span))) -(add-hook 'org-agenda-finalize-hook 'km/org-agenda-store-current-span) - -(setq org-agenda-sorting-strategy - '((agenda time-up deadline-up scheduled-up priority-down category-keep) - (todo priority-down category-keep) - (tags priority-down category-keep) - (search category-keep))) - -(defvar km/org-agenda-file-directory "~/notes/agenda/") -(setq org-agenda-files (list km/org-agenda-file-directory)) -(setq org-agenda-text-search-extra-files - (file-expand-wildcards "~/notes/extra/*.org")) - (defun km/org-agenda-add-or-remove-file (file) "Add or remove link to FILE in `km/org-agenda-file-directory'. If a link for FILE does not exist, create it. Otherwise, remove @@ -384,8 +349,6 @@ displayed in the agenda." (when (called-interactively-p) (message "Adding %s" agenda-file)) (make-symbolic-link file agenda-file)))) -(define-key km/global-org-map "n" 'km/org-agenda-add-or-remove-file) - (defun km/org-open-default-notes-file-inbox () "Open \"Inbox\" heading of `org-default-notes-file'." (interactive) @@ -394,18 +357,6 @@ displayed in the agenda." (recenter-top-bottom 0) (show-children)) -(define-key km/global-org-map "m" 'km/org-open-default-notes-file-inbox) - -(setq org-agenda-custom-commands - '(("d" todo "DONE" nil) - ("u" "Unschedule TODO entries" alltodo "" - ((org-agenda-skip-function - (lambda nil - (org-agenda-skip-entry-if 'scheduled 'deadline - 'regexp "\n]+>"))) - (org-agenda-overriding-header "Unscheduled TODO entries: "))) - ("p" "Past timestamps" tags "TIMESTAMP<=\"\""))) - (defun km/org-goto-agenda-heading () "Jump to heading in agenda files." (interactive) @@ -414,11 +365,18 @@ displayed in the agenda." (org-agenda-text-search-extra-files :maxlevel . 3)))) (org-refile '(4)))) +(key-chord-define-global ",a" 'org-agenda) + +(define-key km/global-org-map "j" 'km/org-goto-agenda-heading) +(define-key km/global-org-map "m" 'km/org-open-default-notes-file-inbox) +(define-key km/global-org-map "n" 'km/org-agenda-add-or-remove-file) + + ;;; Refiling -(defun km/verify-refile-target () - "Exclude DONE state from refile targets." - (not (member (nth 2 (org-heading-components)) org-done-keywords))) +(setq org-reverse-note-order t) + +(setq org-refile-target-verify-function 'km/org-refile-verify-target) (setq org-refile-targets '((nil :maxlevel . 2)) org-refile-cache nil) @@ -431,7 +389,9 @@ displayed in the agenda." (add-to-list 'safe-local-variable-values (cons 'org-refile-targets km/org-agenda-refile-targets)) -(setq org-refile-target-verify-function 'km/verify-refile-target) +(defun km/org-refile-verify-target () + "Exclude DONE state from refile targets." + (not (member (nth 2 (org-heading-components)) org-done-keywords))) (defadvice org-refile (around km/org-refile-dwim activate) "Rebind `org-refile-targets' if next window is an Org buffer. @@ -491,16 +451,18 @@ global value. A numeric prefix sets MAXLEVEL (defaults to 2)." (set (make-local-variable 'org-refile-targets) `((,buffer-file :maxlevel . ,maxlevel)))))) -(defun km/org-switch-to-buffer-other-window (&optional arg) - (interactive "P") - (noflet ((org-pop-to-buffer-same-window (&optional buffer-or-name norecord label) - (funcall 'pop-to-buffer buffer-or-name nil norecord))) - (org-switchb arg))) - -(define-key ctl-x-4-map "o" 'km/org-switch-to-buffer-other-window) +(define-key km/global-org-map "w" 'org-refile-goto-last-stored) +(define-key km/org-prefix-map "w" 'km/org-refile-to-other-org-buffer) + ;;; Export +(after 'org + ;; Avoid conflict when amsmath is loaded. + (setcar (rassoc '("wasysym" t) org-latex-default-packages-alist) + "nointegrals") + (add-to-list 'org-latex-packages-alist '("" "amsmath" t))) + (after 'ox-latex (add-to-list 'org-latex-classes '("short" @@ -511,4 +473,63 @@ global value. A numeric prefix sets MAXLEVEL (defaults to 2)." ("\\paragraph{%s}" . "\\paragraph*{%s}") ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))) + +;;; Org in other modes + +(after 'git-commit + (add-hook 'git-commit-setup-hook 'km/load-orgstruct)) + +(add-hook 'next-error-hook (lambda () + (when (eq major-mode 'org-mode) + (org-show-context)))) + +(add-hook 'message-mode-hook 'km/load-orgstruct) + +(defun km/load-orgstruct () + (turn-on-orgstruct++) + (turn-on-orgtbl)) + +(after 'poporg + (define-key poporg-mode-map (kbd "C-c C-c") 'poporg-edit-exit)) + +(define-key km/global-org-map "p" 'poporg-dwim) + + +;;; Org open file + +(defadvice org-open-file (after km/org-open-add-to-recentf activate) + (recentf-add-file path)) + +(defun km/org-open-file-at-point () + "Open file at point with `org-open-file'." + (interactive) + (let ((file (thing-at-point 'filename))) + (if (and file (file-exists-p file)) + (org-open-file file) + (user-error "No file at point")))) + +(defun km/org-open-file () + "Interactive version of `org-open-file'." + (interactive) + (org-open-file (read-file-name "Open file: " nil nil t))) + +(autoload 'magit-annex-present-files "magit-annex") +(defun km/org-open-annex-file () + "Open a git annex file with `org-open-file'." + (interactive) + (--if-let (magit-annex-present-files) + (org-open-file (magit-completing-read "Open annex file" it nil t)) + (message "No annex files found"))) + +(defun km/org-open-recent-file () + "Open a file from `recentf-list' with `org-open-file'." + (interactive) + (org-open-file (km/read-recent-file))) + +(after 'init-buffile + (define-key km/file-map "a" 'km/org-open-annex-file) + (define-key km/file-map "o" 'km/org-open-file) + (define-key km/file-map "p" 'km/org-open-file-at-point) + (define-key km/file-map "r" 'km/org-open-recent-file)) + (provide 'init-org) -- cgit v1.2.3