diff --git a/modules/lib/defuns-org.el b/modules/lib/defuns-org.el index 512b4515b..c97dab8f9 100644 --- a/modules/lib/defuns-org.el +++ b/modules/lib/defuns-org.el @@ -29,13 +29,6 @@ (line-beginning-position) t)) (org-in-item-p))) -;;;###autoload -(defun narf/project-org-filename (cat) - (interactive (list (completing-read "Choose category:" - (mapcar 'f-filename (f-directories org-project-directory))))) - (expand-file-name (concat (file-name-nondirectory (directory-file-name (narf/project-root))) ".org") - (expand-file-name cat org-project-directory))) - ;;;###autoload (defun narf/org-insert-item-after () "Inserts a new heading or item, depending on the context." @@ -120,5 +113,102 @@ (ido-find-file-in-dir org-directory) (call-interactively 'helm-org-agenda-files-headings))) +;;;###autoload +(defun narf:org-list-attachments () + "Find files in org-attachment directory" + (interactive) + (let* ((enable-recursive-minibuffers t) + (files (find-lisp-find-files org-attach-directory ".")) + (file-assoc-list + (mapcar (lambda (x) + (cons (file-name-nondirectory x) + x)) + files)) + (filename-list + (remove-duplicates (mapcar #'car file-assoc-list) + :test #'string=)) + (filename (ido-completing-read "Org attachments: " filename-list nil t)) + (longname (cdr (assoc filename file-assoc-list)))) + (ido-set-current-directory + (if (file-directory-p longname) + longname + (file-name-directory longname))) + (setq ido-exit 'refresh + ido-text-init ido-text + ido-rotate-temp t) + (exit-minibuffer))) + +;;;###autoload +(defun narf/org-word-count (beg end &optional count-footnotes?) + "Report the number of words in the Org mode buffer or selected region. +Ignores: +- comments +- tables +- source code blocks (#+BEGIN_SRC ... #+END_SRC, and inline blocks) +- hyperlinks (but does count words in hyperlink descriptions) +- tags, priorities, and TODO keywords in headers +- sections tagged as 'not for export'. + +The text of footnote definitions is ignored, unless the optional argument +COUNT-FOOTNOTES? is non-nil." + (interactive "r") + (unless mark-active + (setf beg (point-min) + end (point-max))) + (let ((wc 0)) + (save-excursion + (goto-char beg) + (while (< (point) end) + (cond + ;; Ignore comments. + ((or (org-at-comment-p) (org-at-table-p)) + nil) + ;; Ignore hyperlinks. But if link has a description, count + ;; the words within the description. + ((looking-at org-bracket-link-analytic-regexp) + (when (match-string-no-properties 5) + (let ((desc (match-string-no-properties 5))) + (save-match-data + (incf wc (length (remove "" (org-split-string + desc "\\W"))))))) + (goto-char (match-end 0))) + ((looking-at org-any-link-re) + (goto-char (match-end 0))) + ;; Ignore source code blocks. + ((org-between-regexps-p "^#\\+BEGIN_SRC\\W" "^#\\+END_SRC\\W") + nil) + ;; Ignore inline source blocks, counting them as 1 word. + ((save-excursion + (backward-char) + (looking-at org-babel-inline-src-block-regexp)) + (goto-char (match-end 0)) + (setf wc (+ 2 wc))) + ;; Ignore footnotes. + ((and (not count-footnotes?) + (or (org-footnote-at-definition-p) + (org-footnote-at-reference-p))) + nil) + (t + (let ((contexts (org-context))) + (cond + ;; Ignore tags and TODO keywords, etc. + ((or (assoc :todo-keyword contexts) + (assoc :priority contexts) + (assoc :keyword contexts) + (assoc :checkbox contexts)) + nil) + ;; Ignore sections marked with tags that are + ;; excluded from export. + ((assoc :tags contexts) + (if (intersection (org-get-tags-at) org-export-exclude-tags + :test 'equal) + (org-forward-same-level 1) + nil)) + (t + (incf wc)))))) + (re-search-forward "\\w+\\W*"))) + (message (format "%d words in %s." wc + (if mark-active "region" "buffer"))))) + (provide 'defuns-org) ;;; defuns-org.el ends here diff --git a/modules/module-org.el b/modules/module-org.el index 653feef62..951892ed6 100644 --- a/modules/module-org.el +++ b/modules/module-org.el @@ -1,7 +1,5 @@ ;;; module-org.el -(defvar org-directory "~/Dropbox/notes/") - (define-minor-mode evil-org-mode "Evil-mode bindings for org-mode." :init-value nil @@ -9,201 +7,280 @@ :keymap (make-sparse-keymap) ; defines evil-org-mode-map :group 'evil-org) -(use-package org - :functions (org-bookmark-jump-unhide outline-next-heading org-end-of-subtree - outline-flag-region org-remove-inline-images org-display-inline-images - org-at-item-checkbox-p org-toggle-checkbox org-entry-is-todo-p org-todo - org-format-outline-path org-get-outline-path) - :commands (org-capture org-capture-string) - :mode (("\\.org$" . org-mode) - ("\\.opml$" . org-mode)) - :init - (add-hook! org-mode (hl-line-mode -1)) - (add-hook! org-mode '(narf|enable-tab-width-2 - narf|enable-hard-wrap - org-indent-mode - evil-org-mode)) - (add-hook! org-load 'narf-init-org) +(defvar org-directory "~/Dropbox/notes/") +(associate! org-mode :match "/Dropbox/notes/.+$") - (defun narf--org-all-files (path) - (and (f-ext? path "org") (not (f-same? path (f-expand "inbox.org" org-directory))))) +(add-hook! org-load 'narf|org-init) +(add-hook! org-mode 'evil-org-mode) +(add-hook! org-mode '(narf|enable-tab-width-2 narf|enable-hard-wrap)) - (defun narf-init-org () - (after! org-indent (diminish 'org-indent-mode)) - (after! iimage (diminish 'iimage-mode)) +;; Fixes when saveplace places the point in a folded position +(defun narf|org-restore-point () + (when (outline-invisible-p) + (ignore-errors + (save-excursion + (outline-previous-visible-heading 1) + (org-show-subtree))))) +(add-hook! org-mode 'narf|org-restore-point) - (setq org-project-directory (! (concat org-directory "projects")) ; not an org var - org-default-notes-file (! (concat org-directory "notes.org")) - org-agenda-files (f-entries org-directory 'narf--org-all-files t) - org-archive-location (! (concat org-directory "/archive/%s::")) - org-confirm-babel-evaluate nil - org-src-tab-acts-natively t - org-image-actual-width 250 - org-startup-with-inline-images t - org-completion-use-ido t - org-hidden-keywords '(title) - org-special-ctrl-a/e t - org-hide-leading-stars t - org-hierarchical-todo-statistics t - org-checkbox-hierarchical-statistics t - org-tags-column -87 - org-log-done t - org-confirm-elisp-link-function nil - org-startup-folded 'content - org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") - (sequence "DOING(s)" "PENDING(p)") - (sequence "|" "CANCELLED(c)")) - org-mobile-directory "~/Dropbox/Apps/MobileOrg" - org-mobile-inbox-for-pull (! (expand-file-name "mobile.org" org-directory)) - org-src-fontify-natively t - org-blank-before-new-entry '((heading . auto) (plain-list-item . auto)) - org-export-backends '(ascii html latex md opml)) +;; Realign tables and tags on save +(defun narf|org-realign () + (org-table-map-tables 'org-table-align 'quietly) + (org-align-all-tags)) +(defun narf|org-update () + (org-update-checkbox-count-maybe t)) +(add-hook! org-mode + (add-hook 'before-save-hook 'narf|org-realign nil t) + (add-hook 'before-save-hook 'narf|org-update nil t)) - (add-to-list 'org-link-frame-setup '(file . find-file)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (setq org-tag-alist '(("@home" . ?h) - ("@daily" . ?d) - ("@invoices" . ?i) - ("@personal" . ?p) - ("@learning" . ?l) - ("@dev" . ?v) - ("@writing" . ?w) - ("@projects" . ?r))) +(defun narf@org-vars () + (setq org-default-notes-file (concat org-directory "notes.org") + org-agenda-files + (eval-when-compile + (f-entries org-directory + (lambda (path) + (and (f-ext? path "org") + (not (f-same? path (f-expand "inbox.org" org-directory))))) + t)) - (setq org-capture-templates - '(("t" "TODO" entry (file+headline "~/Dropbox/notes/todo.org" "Inbox") "* TODO %? %u\n%i") - ("T" "Project TODO" entry (file+headline (narf/project-org-filename) "Tasks") "** TODO %?\n%i" :prepend t) - ("N" "Project Note" entry (file+headline (narf/project-org-filename) "Notes") "** %u %?\n%i") - ("c" "Changelog" entry (file+datetree (narf/project-org-filename)) "** %<%H:%M>: %? :unsorted:\n%i" :prepend t) - ("n" "Note" entry (file+datetree org-default-notes-file) "** %<%H:%M>: %?\n%i" :prepend t) - ("j" "Journal" entry (file+datetree "~/Dropbox/notes/journal.org") "** %?%^g\nAdded: %U\n%i") - ("a" "Trivia" entry (file "~/Dropbox/notes/trivia.org") "* %u %?\n%i" :prepend t) - ("s" "Writing Scraps" entry (file "~/Dropbox/notes/writing.org") "* %u %?\n%i" :prepend t) - ("v" "Vocab" entry (file "~/Dropbox/notes/vocab.org") "* %?\n%i" :prepend t) - ("e" "Excerpt" entry (file "~/Dropbox/notes/excerpts.org") "* %u %?\n%i" :prepend t))) + org-archive-location (concat org-directory "/archive/%s::") - (setq iimage-mode-image-regex-alist - '(("\\(`?file://\\|\\[\\[\\|<\\|`\\)?\\([-+./_0-9a-zA-Z]+\\.\\(GIF\\|JP\\(?:E?G\\)\\|P\\(?:BM\\|GM\\|N[GM]\\|PM\\)\\|SVG\\|TIFF?\\|X\\(?:[BP]M\\)\\|gif\\|jp\\(?:e?g\\)\\|p\\(?:bm\\|gm\\|n[gm]\\|pm\\)\\|svg\\|tiff?\\|x\\(?:[bp]m\\)\\)\\)\\(\\]\\]\\|>\\|'\\)?" . 2) - ("<\\(http://.+\\.\\(GIF\\|JP\\(?:E?G\\)\\|P\\(?:BM\\|GM\\|N[GM]\\|PM\\)\\|SVG\\|TIFF?\\|X\\(?:[BP]M\\)\\|gif\\|jp\\(?:e?g\\)\\|p\\(?:bm\\|gm\\|n[gm]\\|pm\\)\\|svg\\|tiff?\\|x\\(?:[bp]m\\)\\)\\)>" . 1))) + org-confirm-elisp-link-function nil + org-completion-use-ido t + org-hidden-keywords '(title) + org-special-ctrl-a/e t + org-hierarchical-todo-statistics t + org-checkbox-hierarchical-statistics t + org-tags-column -87 + org-log-done t + org-startup-folded t + org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d)") + (sequence "DOING(s)" "PENDING(p)") + (sequence "|" "CANCELLED(c)")) + org-blank-before-new-entry '((heading . auto) (plain-list-item . auto)) + org-export-backends '(ascii html latex md opml) - (org-babel-do-load-languages 'org-babel-load-languages - '((python . t) - (ruby . t) - (sh . t) - (emacs-lisp . t) - (matlab . t) - (latex . t))) + org-tag-alist '(("@home" . ?h) + ("@daily" . ?d) + ("@projects" . ?r)) - (advice-add 'evil-force-normal-state :before 'org-remove-occur-highlights) - ;; (advice-add 'org-cycle-hide-drawers :override 'narf/org-cycle-hide-drawers) + org-capture-templates + '(("t" "TODO" entry (file+headline "~/Dropbox/notes/todo.org" "Inbox") "* TODO %? %u\n%i") + ("T" "Project TODO" entry (file+headline (narf/project-org-filename) "Tasks") "** TODO %?\n%i" :prepend t) + ("N" "Project Note" entry (file+headline (narf/project-org-filename) "Notes") "** %u %?\n%i") + ("c" "Changelog" entry (file+datetree (narf/project-org-filename)) "** %<%H:%M>: %? :unsorted:\n%i" :prepend t) + ("n" "Note" entry (file+datetree org-default-notes-file) "** %<%H:%M>: %?\n%i" :prepend t) + ("j" "Journal" entry (file+datetree "~/Dropbox/notes/journal.org") "** %?%^g\nAdded: %U\n%i") + ("a" "Trivia" entry (file "~/Dropbox/notes/trivia.org") "* %u %?\n%i" :prepend t) + ("s" "Writing Scraps" entry (file "~/Dropbox/notes/writing.org") "* %u %?\n%i" :prepend t) + ("v" "Vocab" entry (file "~/Dropbox/notes/vocab.org") "* %?\n%i" :prepend t) + ("e" "Excerpt" entry (file "~/Dropbox/notes/excerpts.org") "* %u %?\n%i" :prepend t))) - (use-package org-agenda - :config - (setq org-agenda-restore-windows-after-quit t - org-agenda-custom-commands - '(("x" agenda) - ("y" agenda*) - ("w" todo "WAITING") - ("W" todo-tree "WAITING") - ("to" todo) - ("tp" tags "+Projects") - ("tg" tags-todo "+gamedev") - ("tw" tags-tree "+webdev")))) + (add-to-list 'org-link-frame-setup '(file . find-file))) - (bind! (:map org-mode-map - "RET" nil - "C-j" nil - "C-k" nil +(defun narf@org-ex () + (exmap! "edit" 'org-edit-special) + (exmap! "refile" 'org-refile) + (exmap! "archive" 'org-archive-subtree) + (exmap! "agenda" 'org-agenda) + (exmap! "todo" 'org-show-todo-tree) + (exmap! "link" 'org-link) + (exmap! "wc" 'narf/org-word-count)) - :i [remap narf/inflate-space-maybe] 'org-self-insert-command - :i "RET" 'org-return-indent) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (:map evil-org-mode-map - :ni "A-l" 'org-metaright ; M-j - :ni "A-h" 'org-metaleft ; M-h - :ni "A-k" 'org-metaup ; M-k - :ni "A-j" 'org-metadown ; M-j - :ni "A-l" 'org-shiftmetaright ; M-L - :ni "A-h" 'org-shiftmetaleft ; M-H - :ni "A-k" 'org-shiftmetaup ; M-K - :ni "A-j" 'org-shiftmetadown ; M-J +(defun narf@org-babel () + (setq org-confirm-babel-evaluate nil ; you don't need my permission + org-src-fontify-natively t ; make code pretty + org-src-tab-acts-natively t) - :ni "" 'org-beginning-of-line - :ni "" 'org-end-of-line - :ni "" 'org-up-element - :ni "" 'org-down-element + (org-babel-do-load-languages + 'org-babel-load-languages + '((python . t) (ruby . t) (sh . t) (js . t) (css . t) + (plantuml . t) (emacs-lisp . t) (matlab . t) + (latex . t) (calc . t))) - :n ",;" 'helm-org-in-buffer-headings - :n ",l" 'org-insert-link - :ni "M-a" 'mark-whole-buffer + (add-to-list 'org-src-lang-modes '("puml" . puml)) + (add-to-list 'org-src-lang-modes '("plantuml" . puml))) - :i "C-e" 'org-end-of-line - :i "C-a" 'org-beginning-of-line - ;; Add new header line before this line - :i "" 'narf/org-insert-item-before - ;; Add new header line after this line - :i "" 'narf/org-insert-item-after +(defun narf@org-latex () + (setq-default + org-latex-preview-ltxpng-directory (concat narf-temp-dir "ltxpng/") + org-latex-create-formula-image-program 'dvipng + org-startup-with-latex-preview t + org-highlight-latex-and-related '(latex)) + (plist-put org-format-latex-options :scale 1.5)) - :i "M-b" (λ (narf/org-surround "*")) ; bold - :i "M-u" (λ (narf/org-surround "_")) ; underline - :i "M-i" (λ (narf/org-surround "/")) ; italics - :i "M-`" (λ (narf/org-surround "+")) ; strikethrough +(defun narf@org-looks () + (setq org-image-actual-width nil + org-startup-with-inline-images t + org-pretty-entities t + org-fontify-whole-heading-line t + org-hide-emphasis-markers t) + (after! iimage (diminish 'iimage-mode)) + ;; (setq iimage-mode-image-regex-alist + ;; '(("\\(`?file://\\|\\[\\[\\|<\\|`\\)?\\([-+./_0-9a-zA-Z]+\\.\\(GIF\\|JP\\(?:E?G\\)\\|P\\(?:BM\\|GM\\|N[GM]\\|PM\\)\\|SVG\\|TIFF?\\|X\\(?:[BP]M\\)\\|gif\\|jp\\(?:e?g\\)\\|p\\(?:bm\\|gm\\|n[gm]\\|pm\\)\\|svg\\|tiff?\\|x\\(?:[bp]m\\)\\)\\)\\(\\]\\]\\|>\\|'\\)?" . 2) + ;; ("<\\(http://.+\\.\\(GIF\\|JP\\(?:E?G\\)\\|P\\(?:BM\\|GM\\|N[GM]\\|PM\\)\\|SVG\\|TIFF?\\|X\\(?:[BP]M\\)\\|gif\\|jp\\(?:e?g\\)\\|p\\(?:bm\\|gm\\|n[gm]\\|pm\\)\\|svg\\|tiff?\\|x\\(?:[bp]m\\)\\)\\)>" . 1))) + (when IS-MAC + ;; Display images with quicklook on OSX + (add-to-list 'org-file-apps '("\\.\\(jpe?g\\|png\\|gif\\|pdf\\)\\'" . "qlmanage -p %s"))) - :v "M-b" "S*" - :v "M-u" "S_" - :v "M-i" "S/" - :v "M-`" "S+" + (setq org-hide-leading-stars t) + (after! org-indent (diminish 'org-indent-mode)) + ;; (add-hook! org-mode 'org-indent-mode) + (add-hook! org-mode (setq line-spacing '0.2)) - :n ",=" 'org-align-all-tags - :n ",/" 'org-sparse-tree - :n ",?" 'org-tags-view - :n ",a" 'org-attach - :n ",D" 'org-time-stamp-inactive - :n ",T" 'org-show-todo-tree - :n ",d" 'org-time-stamp - :n ",r" 'org-refile - :n ",s" 'org-schedule - :n ",t" 'org-todo - :n ",SPC" 'narf/org-toggle-checkbox - :n "," 'org-archive-subtree + (require 'org-bullets) + (setq org-bullets-bullet-list '("▪" "◇" "•" "◦" )) + (add-hook! org-mode 'org-bullets-mode)) - :n "gr" 'org-babel-execute-src-block-maybe - :m "gh" 'outline-up-heading - :m "gj" 'org-forward-heading-same-level - :m "gk" 'org-backward-heading-same-level - :m "gl" 'outline-next-visible-heading - :n "go" 'org-open-at-point - :n "gO" 'org-attach-open - :n "gC-o" 'org-attach-reveal - :n "gI" (λ (if (> (length org-inline-image-overlays) 0) - (org-remove-inline-images) - (org-display-inline-images nil t (line-beginning-position) (line-end-position)))) - :n "gQ" 'org-fill-paragraph - :n "ga" 'org-attach - :n "gA" 'org-agenda - :n "gt" 'org-show-todo-tree - :m "]l" 'org-next-link - :m "[l" 'org-previous-link - :m "$" 'org-end-of-line - :m "^" 'org-beginning-of-line - :n "<" 'org-metaleft - :n ">" 'org-metaright - :n "-" 'org-cycle-list-bullet - :n "" 'narf/org-insert-item-before - :n "" 'narf/org-insert-item-after - :n "RET" (λ (cond ((org-at-item-checkbox-p) - (org-toggle-checkbox)) - ((org-entry-is-todo-p) - (org-todo 'done)))) - :n [tab] 'org-cycle) +(defun narf@org-plantuml () + (setq org-plantuml-jar-path puml-plantuml-jar-path) + (when (file-exists-p "~/.plantuml") + (add-to-list 'org-babel-default-header-args:plantuml + '(:cmdline . "-config ~/.plantuml")))) - (:after org-agenda - (:map org-agenda-mode-map - :e "" 'org-agenda-Quit - :e "C-j" 'org-agenda-next-item - :e "C-k" 'org-agenda-previous-item - :e "C-n" 'org-agenda-next-item - :e "C-p" 'org-agenda-previous-item))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun narf|org-init () + (advice-add 'evil-force-normal-state :before 'org-remove-occur-highlights) + + (narf@org-vars) + (narf@org-babel) + (narf@org-latex) + (narf@org-looks) + (narf@org-plantuml) + (add-hook! org-mode 'narf@org-ex) + + (require 'org-agenda) + (setq org-agenda-restore-windows-after-quit t + org-agenda-custom-commands + '(("x" agenda) + ("y" agenda*) + ("w" todo "WAITING") + ("W" todo-tree "WAITING") + ("to" todo) + ("tp" tags "+Projects") + ("tg" tags-todo "+gamedev") + ("tw" tags-tree "+webdev"))) + + ;; Custom link types + (org-add-link-type "trello" 'narf-org-link-trello) + (org-add-link-type "contact" 'narf-org-link-contact) + (org-add-link-type "invoice" 'narf-org-link-invoice) + + (defun narf-org-link-trello (url) + "Open a trello url" + (browse-url (format "https://trello.com/%s" (url-encode-url url)))) + (defun narf-org-link-contact (id) + (org-open-file (format "%scontacts.org" org-directory) t nil (format "#%s" id))) + (defun narf-org-link-invoice (id)) + + (defun narf-project-org-filename (cat) + (interactive (list (completing-read "Choose category:" + (mapcar 'f-filename (f-directories org-project-directory))))) + (expand-file-name (concat (file-name-nondirectory (directory-file-name (narf/project-root))) ".org") + (expand-file-name cat org-project-directory))) + + (bind! (:map org-mode-map + "RET" nil + "C-j" nil + "C-k" nil + + :i [remap narf/inflate-space-maybe] 'org-self-insert-command + :i "RET" 'org-return-indent) + + (:map evil-org-mode-map + :ni "A-l" 'org-metaright ; M-j + :ni "A-h" 'org-metaleft ; M-h + :ni "A-k" 'org-metaup ; M-k + :ni "A-j" 'org-metadown ; M-j + :ni "A-l" 'org-shiftmetaright ; M-L + :ni "A-h" 'org-shiftmetaleft ; M-H + :ni "A-k" 'org-shiftmetaup ; M-K + :ni "A-j" 'org-shiftmetadown ; M-J + + :ni "" 'org-beginning-of-line + :ni "" 'org-end-of-line + :ni "" 'org-up-element + :ni "" 'org-down-element + + :ni "M-a" 'mark-whole-buffer + + :n "gr" 'org-babel-execute-src-block-maybe + + :i "C-e" 'org-end-of-line + :i "C-a" 'org-beginning-of-line + ;; Add new header line before this line + :i "" 'narf/org-insert-item-before + ;; Add new header line after this line + :i "" 'narf/org-insert-item-after + + :i "M-b" (λ (narf/org-surround "*")) ; bold + :i "M-u" (λ (narf/org-surround "_")) ; underline + :i "M-i" (λ (narf/org-surround "/")) ; italics + :i "M-`" (λ (narf/org-surround "+")) ; strikethrough + + :v "M-b" "S*" + :v "M-u" "S_" + :v "M-i" "S/" + :v "M-`" "S+" + + :n ",;" 'helm-org-in-buffer-headings + :nv ",l" 'org-insert-link + :n ",=" 'org-align-all-tags + :n ",/" 'org-sparse-tree + :n ",?" 'org-tags-view + :n ",a" 'org-attach + :n ",D" 'org-time-stamp-inactive + :n ",T" 'org-show-todo-tree + :n ",d" 'org-time-stamp + :n ",r" 'org-refile + :n ",s" 'org-schedule + :n ",t" 'org-todo + :n ",SPC" 'narf/org-toggle-checkbox + :n "," 'org-archive-subtree + + :n "gr" 'org-babel-execute-src-block-maybe + :m "gh" 'outline-up-heading + :m "gj" (λ (hide-subtree) (call-interactively 'org-forward-heading-same-level) (show-children)) + :m "gk" (λ (hide-subtree) (call-interactively 'org-backward-heading-same-level) (show-children)) + ;; :m "gk" 'org-backward-heading-same-level + :m "gl" (λ (call-interactively 'outline-next-visible-heading) (show-children)) + :n "go" 'org-open-at-point + :n "gO" 'org-attach-open + :n "gC-o" 'org-attach-reveal + :n "gI" (λ (if (> (length org-inline-image-overlays) 0) + (org-remove-inline-images) + (org-display-inline-images nil t (line-beginning-position) (line-end-position)))) + :n "gQ" 'org-fill-paragraph + :n "ga" 'org-attach + :n "gA" 'org-agenda + :n "gt" 'org-show-todo-tree + :m "]l" 'org-next-link + :m "[l" 'org-previous-link + :m "$" 'org-end-of-line + :m "^" 'org-beginning-of-line + :nv "<" 'org-metaleft + :nv ">" 'org-metaright + :n "-" 'org-cycle-list-bullet + :n "" 'narf/org-insert-item-before + :n "" 'narf/org-insert-item-after + :n "RET" (λ (cond ((org-at-item-checkbox-p) + (org-toggle-checkbox)) + ((org-entry-is-todo-p) + (org-todo 'done)))) + :n [tab] 'org-cycle) + + (:after org-agenda + (:map org-agenda-mode-map + :e "" 'org-agenda-Quit + :e "C-j" 'org-agenda-next-item + :e "C-k" 'org-agenda-previous-item + :e "C-n" 'org-agenda-next-item + :e "C-p" 'org-agenda-previous-item)))) (provide 'module-org) ;;; module-org.el ends here