spacemacs/layers/+emacs/org/packages.el
syl20bnr 1c4f685b13 core: refactor layer system
TL;DR Should get 20~25% speed improvement on startup, should get a big
improvement when using ivy or helm SPC h SPC. Users with layers.el files
in their layers must use `configuration-layer/declare-used-layer`
instead of `configuration-layer/declare-layer`

The implementation of the layer system made heavy use of `object-assoc`
and `object-assoc-list` functions which are not efficient. This PR
mainly replaces those object lists with hash maps in order to index the
objects by their name and achieve an O(1) access time.

The old object lists `configuration-layer--layers` and
`configuration-layer--packages` have been each by two variables each:
- `configuration-layer--indexed-layers` which is a hash-map of all the
layer objects and `configuration-layer--used-layers` which is a list of
all _used_ layers symbols,
- symmetrically `configuration-layer--indexed-packages` which is a
hash-map of all the package objects and
`configuration-layer--used-packages` which is a list of all _used_
packages symbols.

The hash map `configuration-layer--layer-paths` is gone, now we create
directly layer objects when discovering the layers and set the :dir
property. Note that previously the layer paths were the parent directory
of the layer, now :dir is the layer path.

The function `configuration-layer//make-layer` is now similar to its
counterpart `configuration-layer//make-package` in the sense that it
takes an optional `obj` to be able to override its properties.

The functions `configuration-layer/declare-layer` and
`configuration-layer/declare-layers` now takes an optional parameter
`usedp` in order to declare used or not used layers. For convenience
new functions have been added: `configuration-layer/declare-used-layer`
and `configuration-layer/declare-used-layers`, users _must_ update all
occurrences of `configuration-layer/declare-layer` by
`configuration-layer/declare-used-layers` in their `layers.el` files.

`helm-spacemacs-help` and `ivy-spacemacs-help` are updated to match the
changes in `core-configuration-layer.el`.

Rename some variables to make them more explicit:
`configuration-layer-no-layer` -> `configuration-layer-exclude-all-layers`
`configuration-layer-distribution` -> `configuration-layer-force-distribution`
2016-07-28 23:26:54 -04:00

536 lines
20 KiB
EmacsLisp
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

;;; packages.el --- Org Layer packages File for Spacemacs
;;
;; Copyright (c) 2012-2016 Sylvain Benner & Contributors
;;
;; Author: Sylvain Benner <sylvain.benner@gmail.com>
;; URL: https://github.com/syl20bnr/spacemacs
;;
;; This file is not part of GNU Emacs.
;;
;;; License: GPLv3
(setq org-packages
'(
company
company-emoji
emoji-cheat-sheet-plus
(evil-org :location local)
evil-surround
gnuplot
htmlize
mu4e
;; ob, org and org-agenda are installed by `org-plus-contrib'
(ob :location built-in)
(org :location built-in)
(org-agenda :location built-in)
org-download
;; org-mime is installed by `org-plus-contrib'
(org-mime :location built-in)
org-pomodoro
org-present
(org-projectile :toggle (configuration-layer/package-usedp 'projectile))
;; use a for of ox-gfm to fix index generation
(ox-gfm :location (recipe :fetcher github :repo "syl20bnr/ox-gfm")
:toggle org-enable-github-support)
(ox-reveal :toggle org-enable-reveal-js-support)
persp-mode
))
(defun org/post-init-company ()
(spacemacs|add-company-hook org-mode)
(push 'company-capf company-backends-org-mode))
(defun org/post-init-company-emoji ()
(push 'company-emoji company-backends-org-mode))
(defun org/post-init-emoji-cheat-sheet-plus ()
(add-hook 'org-mode-hook 'spacemacs/delay-emoji-cheat-sheet-hook))
(defun org/init-evil-org ()
(use-package evil-org
:commands (evil-org-mode evil-org-recompute-clocks)
:init (add-hook 'org-mode-hook 'evil-org-mode)
:config
(progn
(evil-define-key 'normal evil-org-mode-map
"O" 'evil-open-above)
(spacemacs/set-leader-keys-for-major-mode 'org-mode
"C" 'evil-org-recompute-clocks)
(spacemacs|diminish evil-org-mode "" " e"))))
(defun org/post-init-evil-surround ()
(defun spacemacs/add-org-surrounds ()
(push '(?: . spacemacs//surround-drawer) evil-surround-pairs-alist)
(push '(?# . spacemacs//surround-code) evil-surround-pairs-alist))
(add-hook 'org-mode-hook 'spacemacs/add-org-surrounds))
(defun org/init-gnuplot ()
(use-package gnuplot
:defer t
:init (spacemacs/set-leader-keys-for-major-mode 'org-mode
"tp" 'org-plot/gnuplot)))
(defun org/init-htmlize ()
(use-package htmlize
:defer t))
(defun org/pre-init-mu4e ()
;; Load org-mu4e when mu4e is actually loaded
(spacemacs|use-package-add-hook mu4e
:post-config (require 'org-mu4e nil 'noerror)))
(defun org/init-ob ()
(use-package ob
:defer t
:init
(progn
(defun spacemacs//org-babel-do-load-languages ()
"Load all the languages declared in `org-babel-load-languages'."
(org-babel-do-load-languages 'org-babel-load-languages
org-babel-load-languages))
(add-hook 'org-mode-hook 'spacemacs//org-babel-do-load-languages)
;; Fix redisplay of inline images after a code block evaluation.
(add-hook 'org-babel-after-execute-hook 'spacemacs/ob-fix-inline-images))))
(defun org/init-org ()
(use-package org
:defer t
:commands (orgtbl-mode)
:init
(progn
(setq org-clock-persist-file (concat spacemacs-cache-directory
"org-clock-save.el")
org-id-locations-file (concat spacemacs-cache-directory
".org-id-locations")
org-publish-timestamp-directory (concat spacemacs-cache-directory
".org-timestamps/")
org-log-done t
org-startup-with-inline-images t
org-image-actual-width nil
org-src-fontify-natively t
;; this is consistent with the value of
;; `helm-org-headings-max-depth'.
org-imenu-depth 8)
(with-eval-after-load 'org-indent
(spacemacs|hide-lighter org-indent-mode))
(let ((dir (configuration-layer/get-layer-local-dir 'org)))
(setq org-export-async-init-file (concat dir "org-async-init.el")))
(defmacro spacemacs|org-emphasize (fname char)
"Make function for setting the emphasis in org mode"
`(defun ,fname () (interactive)
(org-emphasize ,char)))
;; Follow the confirm and abort conventions
(with-eval-after-load 'org-capture
(spacemacs/set-leader-keys-for-minor-mode 'org-capture-mode
dotspacemacs-major-mode-leader-key 'org-capture-finalize
"c" 'org-capture-finalize
"k" 'org-capture-kill
"a" 'org-capture-kill
"r" 'org-capture-refile))
(with-eval-after-load 'org-src
(spacemacs/set-leader-keys-for-minor-mode 'org-src-mode
"'" 'org-edit-src-exit
"c" 'org-edit-src-exit
"a" 'org-edit-src-abort
"k" 'org-edit-src-abort))
(let ((dir (configuration-layer/get-layer-local-dir 'org)))
(setq org-export-async-init-file (concat dir "org-async-init.el")))
(defmacro spacemacs|org-emphasize (fname char)
"Make function for setting the emphasis in org mode"
`(defun ,fname () (interactive)
(org-emphasize ,char)))
;; Insert key for org-mode and markdown a la C-h k
;; from SE endless http://emacs.stackexchange.com/questions/2206/i-want-to-have-the-kbd-tags-for-my-blog-written-in-org-mode/2208#2208
(defun spacemacs/insert-keybinding-org (key)
"Ask for a key then insert its description.
Will work on both org-mode and any mode that accepts plain html."
(interactive "kType key sequence: ")
(let* ((tag "@@html:<kbd>@@ %s @@html:</kbd>@@"))
(if (null (equal key "\r"))
(insert
(format tag (help-key-description key nil)))
(insert (format tag ""))
(forward-char -8))))
(dolist (prefix '(("mx" . "text")
("mh" . "headings")
("mi" . "insert")
("mS" . "subtrees")
("mt" . "tables")
("mtd" . "delete")
("mti" . "insert")
("mtt" . "toggle")))
(spacemacs/declare-prefix-for-mode 'org-mode (car prefix) (cdr prefix)))
(spacemacs/set-leader-keys-for-major-mode 'org-mode
"'" 'org-edit-special
"c" 'org-capture
"d" 'org-deadline
"D" 'org-insert-drawer
"e" 'org-export-dispatch
"f" 'org-set-effort
"P" 'org-set-property
":" 'org-set-tags
"a" 'org-agenda
"b" 'org-tree-to-indirect-buffer
"A" 'org-archive-subtree
"l" 'org-open-at-point
"T" 'org-show-todo-tree
"." 'org-time-stamp
"!" 'org-time-stamp-inactive
;; headings
"hi" 'org-insert-heading-after-current
"hI" 'org-insert-heading
"hs" 'org-insert-subheading
;; More cycling options (timestamps, headlines, items, properties)
"L" 'org-shiftright
"H" 'org-shiftleft
"J" 'org-shiftdown
"K" 'org-shiftup
;; Change between TODO sets
"C-S-l" 'org-shiftcontrolright
"C-S-h" 'org-shiftcontrolleft
"C-S-j" 'org-shiftcontroldown
"C-S-k" 'org-shiftcontrolup
;; Subtree editing
"Sl" 'org-demote-subtree
"Sh" 'org-promote-subtree
"Sj" 'org-move-subtree-down
"Sk" 'org-move-subtree-up
;; tables
"ta" 'org-table-align
"tb" 'org-table-blank-field
"tc" 'org-table-convert
"tdc" 'org-table-delete-column
"tdr" 'org-table-kill-row
"te" 'org-table-eval-formula
"tE" 'org-table-export
"th" 'org-table-previous-field
"tH" 'org-table-move-column-left
"tic" 'org-table-insert-column
"tih" 'org-table-insert-hline
"tiH" 'org-table-hline-and-move
"tir" 'org-table-insert-row
"tI" 'org-table-import
"tj" 'org-table-next-row
"tJ" 'org-table-move-row-down
"tK" 'org-table-move-row-up
"tl" 'org-table-next-field
"tL" 'org-table-move-column-right
"tn" 'org-table-create
"tN" 'org-table-create-with-table.el
"tr" 'org-table-recalculate
"ts" 'org-table-sort-lines
"ttf" 'org-table-toggle-formula-debugger
"tto" 'org-table-toggle-coordinate-overlays
"tw" 'org-table-wrap-region
;; Multi-purpose keys
(or dotspacemacs-major-mode-leader-key ",") 'org-ctrl-c-ctrl-c
"*" 'org-ctrl-c-star
"RET" 'org-ctrl-c-ret
"-" 'org-ctrl-c-minus
"^" 'org-sort
"/" 'org-sparse-tree
"I" 'org-clock-in
"n" 'org-narrow-to-subtree
"N" 'widen
"O" 'org-clock-out
"q" 'org-clock-cancel
"R" 'org-refile
"s" 'org-schedule
;; insertion of common elements
"il" 'org-insert-link
"if" 'org-footnote-new
"ik" 'spacemacs/insert-keybinding-org
;; images and other link types have no commands in org mode-line
;; could be inserted using yasnippet?
;; region manipulation
"xb" (spacemacs|org-emphasize spacemacs/org-bold ?*)
"xc" (spacemacs|org-emphasize spacemacs/org-code ?~)
"xi" (spacemacs|org-emphasize spacemacs/org-italic ?/)
"xr" (spacemacs|org-emphasize spacemacs/org-clear ? )
"xs" (spacemacs|org-emphasize spacemacs/org-strike-through ?+)
"xu" (spacemacs|org-emphasize spacemacs/org-underline ?_)
"xv" (spacemacs|org-emphasize spacemacs/org-verbose ?=))
;; Add global evil-leader mappings. Used to access org-agenda
;; functionalities and a few others commands from any other mode.
(spacemacs/declare-prefix "ao" "org")
(spacemacs/set-leader-keys
;; org-agenda
"ao#" 'org-agenda-list-stuck-projects
"ao/" 'org-occur-in-agenda-files
"aoa" 'org-agenda-list
"aoe" 'org-store-agenda-views
"aom" 'org-tags-view
"aoo" 'org-agenda
"aos" 'org-search-view
"aot" 'org-todo-list
;; other
"aoO" 'org-clock-out
"aoc" 'org-capture
"aol" 'org-store-link)
(define-key global-map "\C-cl" 'org-store-link)
(define-key global-map "\C-ca" 'org-agenda)
(define-key global-map "\C-cc" 'org-capture))
:config
(progn
(setq org-default-notes-file "notes.org")
;; We add this key mapping because an Emacs user can change
;; `dotspacemacs-major-mode-emacs-leader-key' to `C-c' and the key binding
;; C-c ' is shadowed by `spacemacs/default-pop-shell', effectively making
;; the Emacs user unable to exit src block editing.
(define-key org-src-mode-map
(kbd (concat dotspacemacs-major-mode-emacs-leader-key " '"))
'org-edit-src-exit)
(spacemacs/set-leader-keys "Cc" 'org-capture)
;; Evilify the calendar tool on C-c .
(unless (eq 'emacs dotspacemacs-editing-style)
(define-key org-read-date-minibuffer-local-map (kbd "M-h")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-backward-day 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-l")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-forward-day 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-k")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-backward-week 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-j")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-forward-week 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-H")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-backward-month 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-L")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-forward-month 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-K")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-backward-year 1))))
(define-key org-read-date-minibuffer-local-map (kbd "M-J")
(lambda () (interactive)
(org-eval-in-calendar '(calendar-forward-year 1))))))))
(defun org/init-org-agenda ()
(use-package org-agenda
:defer t
:init
(progn
(setq org-agenda-restore-windows-after-quit t)
(spacemacs/set-leader-keys-for-major-mode 'org-agenda-mode
":" 'org-agenda-set-tags
"a" 'org-agenda
"d" 'org-agenda-deadline
"f" 'org-agenda-set-effort
"I" 'org-agenda-clock-in
"O" 'org-agenda-clock-out
"P" 'org-agenda-set-property
"q" 'org-agenda-refile
"Q" 'org-agenda-clock-cancel
"s" 'org-agenda-schedule)
(spacemacs|define-transient-state org-agenda
:title "Org-agenda transient state"
:on-enter (setq which-key-inhibit t)
:on-exit (setq which-key-inhibit nil)
:foreign-keys run
:doc
"
Headline^^ Visit entry^^ Filter^^ Date^^ Toggle mode^^ View^^ Clock^^ Other^^
--------^^--------- -----------^^------------ ------^^----------------- ----^^------------- -----------^^------ ----^^--------- -----^^------ -----^^-----------
[_ht_] set status [_SPC_] in other window [_ft_] by tag [_ds_] schedule [_tf_] follow [_vd_] day [_ci_] in [_gr_] reload
[_hk_] kill [_TAB_] & go to location [_fr_] refine by tag [_dd_] set deadline [_tl_] log [_vw_] week [_co_] out [_._] go to today
[_hr_] refile [_RET_] & del other windows [_fc_] by category [_dt_] timestamp [_ta_] archive [_vt_] fortnight [_ck_] cancel [_gd_] go to date
[_hA_] archive [_o_] link [_fh_] by top headline [_+_] do later [_tr_] clock report [_vm_] month [_cj_] jump ^^
[_hT_] set tags ^^ [_fx_] by regexp [_-_] do earlier [_td_] diaries [_vy_] year ^^ ^^
[_hp_] set priority ^^ [_fd_] delete all filters ^^ ^^ [_vn_] next span ^^ ^^
^^ ^^ ^^ ^^ ^^ [_vp_] prev span ^^ ^^
^^ ^^ ^^ ^^ ^^ [_vr_] reset ^^ ^^
[_q_] quit
"
:bindings
;; Entry
("ht" org-agenda-todo)
("hk" org-agenda-kill)
("hr" org-agenda-refile)
("hA" org-agenda-archive-default)
("hT" org-agenda-set-tags)
("hp" org-agenda-priority)
;; Visit entry
("SPC" org-agenda-show-and-scroll-up)
("<tab>" org-agenda-goto :exit t)
("TAB" org-agenda-goto :exit t)
("RET" org-agenda-switch-to :exit t)
("o" link-hint-open-link :exit t)
;; Date
("ds" org-agenda-schedule)
("dd" org-agenda-deadline)
("dt" org-agenda-date-prompt)
("+" org-agenda-do-date-later)
("-" org-agenda-do-date-earlier)
;; View
("vd" org-agenda-day-view)
("vw" org-agenda-week-view)
("vt" org-agenda-fortnight-view)
("vm" org-agenda-month-view)
("vy" org-agenda-year-view)
("vn" org-agenda-later)
("vp" org-agenda-earlier)
("vr" org-agenda-reset-view)
;; Toggle mode
("tf" org-agenda-follow-mode)
("tl" org-agenda-log-mode)
("ta" org-agenda-archives-mode)
("tr" org-agenda-clockreport-mode)
("td" org-agenda-toggle-diary)
;; Filter
("ft" org-agenda-filter-by-tag)
("fr" org-agenda-filter-by-tag-refine)
("fc" org-agenda-filter-by-category)
("fh" org-agenda-filter-by-top-headline)
("fx" org-agenda-filter-by-regexp)
("fd" org-agenda-filter-remove-all)
;; Clock
("ci" org-agenda-clock-in :exit t)
("co" org-agenda-clock-out)
("ck" org-agenda-clock-cancel)
("cj" org-agenda-clock-goto :exit t)
;; Other
("q" nil :exit t)
("gr" org-agenda-redo)
("." org-agenda-goto-today)
("gd" org-agenda-goto-date)))
:config
(evilified-state-evilify-map org-agenda-mode-map
:mode org-agenda-mode
:bindings
"j" 'org-agenda-next-line
"k" 'org-agenda-previous-line
(kbd "M-j") 'org-agenda-next-item
(kbd "M-k") 'org-agenda-previous-item
(kbd "M-h") 'org-agenda-earlier
(kbd "M-l") 'org-agenda-later
(kbd "gd") 'org-agenda-toggle-time-grid
(kbd "gr") 'org-agenda-redo
(kbd "M-RET") 'org-agenda-show-and-scroll-up
(kbd "M-SPC") 'spacemacs/org-agenda-transient-state/body
(kbd "s-M-SPC") 'spacemacs/org-agenda-transient-state/body)))
(defun org/init-org-download ()
(use-package org-download
:commands (org-download-enable
org-download-yank
org-download-screenshot)
:init
(progn
(add-hook 'org-mode-hook 'org-download-enable)
(spacemacs/set-leader-keys-for-major-mode 'org-mode
"iy" 'org-download-yank
"is" 'org-download-screenshot))))
(defun org/init-org-mime ()
(use-package org-mime
:defer t
:commands (org-mime-htmlize org-mime-org-buffer-htmlize)
:init
(progn
(spacemacs/set-leader-keys-for-major-mode 'message-mode
"M" 'org-mime-htmlize)
(spacemacs/set-leader-keys-for-major-mode 'org-mode
"m" 'org-mime-org-buffer-htmlize))))
(defun org/init-org-pomodoro ()
(use-package org-pomodoro
:defer t
:init
(progn
(when (spacemacs/system-is-mac)
(setq org-pomodoro-audio-player "/usr/bin/afplay"))
(spacemacs/set-leader-keys-for-major-mode 'org-mode
"p" 'org-pomodoro)
(spacemacs/set-leader-keys-for-major-mode 'org-agenda-mode
"p" 'org-pomodoro))))
(defun org/init-org-present ()
(use-package org-present
:defer t
:init
(progn
(evilified-state-evilify nil org-present-mode-keymap
"h" 'org-present-prev
"l" 'org-present-next
"q" 'org-present-quit)
(defun spacemacs//org-present-start ()
"Initiate `org-present' mode"
(org-present-big)
(org-display-inline-images)
(org-present-hide-cursor)
(org-present-read-only)
(evil-evilified-state))
(defun spacemacs//org-present-end ()
"Terminate `org-present' mode"
(org-present-small)
(org-remove-inline-images)
(org-present-show-cursor)
(org-present-read-write)
(evil-normal-state))
(add-hook 'org-present-mode-hook 'spacemacs//org-present-start)
(add-hook 'org-present-mode-quit-hook 'spacemacs//org-present-end))))
(defun org/init-org-projectile ()
(use-package org-projectile
:commands (org-projectile:location-for-project)
:init
(progn
(spacemacs/set-leader-keys
"aop" 'org-projectile/capture
"aoP" 'org-projectile/goto-todos)
(with-eval-after-load 'org-capture
(require 'org-projectile)))
:config
(if (file-name-absolute-p org-projectile-file)
(progn
(setq org-projectile:projects-file org-projectile-file)
(push (org-projectile:project-todo-entry
nil nil nil :empty-lines 1)
org-capture-templates))
(org-projectile:per-repo)
(setq org-projectile:per-repo-filename org-projectile-file))))
(defun org/init-ox-gfm ()
(spacemacs|use-package-add-hook org :post-config (require 'ox-gfm)))
(defun org/init-ox-reveal ()
(spacemacs|use-package-add-hook org :post-config (require 'ox-reveal)))
(defun org/post-init-persp-mode ()
(spacemacs|define-custom-layout "@Org"
:binding "o"
:body
(find-file (first (org-agenda-files)))))