Refactor org-mode
This commit is contained in:
parent
e334815395
commit
f7388fa359
2 changed files with 350 additions and 183 deletions
|
@ -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
|
||||
|
|
|
@ -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,68 +7,66 @@
|
|||
: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
|
||||
;; 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))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(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))
|
||||
|
||||
org-archive-location (concat org-directory "/archive/%s::")
|
||||
|
||||
org-confirm-elisp-link-function nil
|
||||
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-startup-folded t
|
||||
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))
|
||||
org-export-backends '(ascii html latex md opml)
|
||||
|
||||
(add-to-list 'org-link-frame-setup '(file . find-file))
|
||||
|
||||
(setq org-tag-alist '(("@home" . ?h)
|
||||
org-tag-alist '(("@home" . ?h)
|
||||
("@daily" . ?d)
|
||||
("@invoices" . ?i)
|
||||
("@personal" . ?p)
|
||||
("@learning" . ?l)
|
||||
("@dev" . ?v)
|
||||
("@writing" . ?w)
|
||||
("@projects" . ?r)))
|
||||
("@projects" . ?r))
|
||||
|
||||
(setq org-capture-templates
|
||||
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")
|
||||
|
@ -82,23 +78,83 @@
|
|||
("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)))
|
||||
|
||||
(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)))
|
||||
(add-to-list 'org-link-frame-setup '(file . find-file)))
|
||||
|
||||
(org-babel-do-load-languages 'org-babel-load-languages
|
||||
'((python . t)
|
||||
(ruby . t)
|
||||
(sh . t)
|
||||
(emacs-lisp . t)
|
||||
(matlab . t)
|
||||
(latex . t)))
|
||||
(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))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(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)
|
||||
|
||||
(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)))
|
||||
|
||||
(add-to-list 'org-src-lang-modes '("puml" . puml))
|
||||
(add-to-list 'org-src-lang-modes '("plantuml" . puml)))
|
||||
|
||||
(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))
|
||||
|
||||
(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")))
|
||||
|
||||
(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))
|
||||
|
||||
(require 'org-bullets)
|
||||
(setq org-bullets-bullet-list '("▪" "◇" "•" "◦" ))
|
||||
(add-hook! org-mode 'org-bullets-mode))
|
||||
|
||||
(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"))))
|
||||
|
||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||
|
||||
(defun narf|org-init ()
|
||||
(advice-add 'evil-force-normal-state :before 'org-remove-occur-highlights)
|
||||
;; (advice-add 'org-cycle-hide-drawers :override 'narf/org-cycle-hide-drawers)
|
||||
|
||||
(use-package org-agenda
|
||||
:config
|
||||
(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)
|
||||
|
@ -108,7 +164,25 @@
|
|||
("to" todo)
|
||||
("tp" tags "+Projects")
|
||||
("tg" tags-todo "+gamedev")
|
||||
("tw" tags-tree "+webdev"))))
|
||||
("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
|
||||
|
@ -133,10 +207,10 @@
|
|||
:ni "<M-up>" 'org-up-element
|
||||
:ni "<M-down>" 'org-down-element
|
||||
|
||||
:n ",;" 'helm-org-in-buffer-headings
|
||||
:n ",l" 'org-insert-link
|
||||
: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
|
||||
|
@ -154,6 +228,8 @@
|
|||
: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
|
||||
|
@ -169,9 +245,10 @@
|
|||
|
||||
: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
|
||||
: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
|
||||
|
@ -186,8 +263,8 @@
|
|||
:m "[l" 'org-previous-link
|
||||
:m "$" 'org-end-of-line
|
||||
:m "^" 'org-beginning-of-line
|
||||
:n "<" 'org-metaleft
|
||||
:n ">" 'org-metaright
|
||||
:nv "<" 'org-metaleft
|
||||
:nv ">" 'org-metaright
|
||||
:n "-" 'org-cycle-list-bullet
|
||||
:n "<S-M-return>" 'narf/org-insert-item-before
|
||||
:n "<M-return>" 'narf/org-insert-item-after
|
||||
|
@ -203,7 +280,7 @@
|
|||
: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)))))
|
||||
:e "C-p" 'org-agenda-previous-item))))
|
||||
|
||||
(provide 'module-org)
|
||||
;;; module-org.el ends here
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue