2014-09-03 06:25:27 +00:00
|
|
|
;; Spacemacs Contribution System
|
|
|
|
|
|
|
|
(load (concat user-emacs-directory "ht.el"))
|
|
|
|
|
|
|
|
(defvar spacemacs-config-layers '()
|
|
|
|
"Alist of configuration layers with the form (symbol . plist) where
|
|
|
|
SYMBOL is the name of the layer and PLIST is a property list with the following
|
|
|
|
keys:
|
|
|
|
:contrib if t then the layer is a contribution layer.
|
|
|
|
:dir the absolute path to the base directory of the layer.
|
|
|
|
:ext-dir the absolute path to the directory containing the extensions.
|
|
|
|
")
|
|
|
|
(defvar spacemacs-all-packages #s(hash-table size 200 data ())
|
|
|
|
"Hash table of all declared packages in all layers where the key is a package
|
|
|
|
symbol and the value is the layer symbol where to initialize the package. ")
|
|
|
|
(defvar spacemacs-all-pre-extensions #s(hash-table size 64 data ())
|
|
|
|
"Hash table of all declared pre-extensions in all layers where the key is a
|
|
|
|
extension symbol and the value is the layer symbol where to load and
|
|
|
|
initialize the extension. ")
|
|
|
|
(defvar spacemacs-all-post-extensions #s(hash-table size 64 data ())
|
|
|
|
"Hash table of all declared post-extensions in all layers where the key is a
|
|
|
|
extension symbol and the value is the layer symbol where to load and
|
|
|
|
initialize the extension. ")
|
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/declare-layer (sym &optional contrib)
|
2014-09-03 06:25:27 +00:00
|
|
|
"Declare a layer with SYM name (symbol). If CONTRIB is non nil then the layer
|
|
|
|
is a contribution layer."
|
|
|
|
(let* ((sym-name (symbol-name sym))
|
|
|
|
(base-dir (if contrib contrib-config-directory user-emacs-directory))
|
|
|
|
(dir (format "%s%s/" base-dir sym-name))
|
2014-09-04 07:24:20 +00:00
|
|
|
(ext-dir (format "%sextensions/" dir)))
|
|
|
|
(push (cons sym (list :contrib contrib :dir dir :ext-dir ext-dir))
|
|
|
|
spacemacs-config-layers)))
|
2014-09-03 06:25:27 +00:00
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/load-layers ()
|
2014-09-03 06:25:27 +00:00
|
|
|
"Load all declared layers."
|
2014-09-06 08:54:07 +00:00
|
|
|
(contribsys/load-layer-files '("funcs.el" "macros.el" "config.el"))
|
2014-09-05 04:09:03 +00:00
|
|
|
(contribsys/read-packages-and-extensions)
|
|
|
|
(contribsys/initialize-extensions spacemacs-all-pre-extensions)
|
|
|
|
(contribsys/install-packages)
|
|
|
|
(contribsys/initialize-packages)
|
|
|
|
(contribsys/initialize-extensions spacemacs-all-post-extensions)
|
2014-09-06 08:54:07 +00:00
|
|
|
(contribsys/load-layer-files '("keybindings.el")))
|
2014-09-03 06:25:27 +00:00
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/load-layer-files (files)
|
2014-09-03 06:25:27 +00:00
|
|
|
"Load the files of list FILES from all declared layers."
|
|
|
|
(dolist (layer (reverse spacemacs-config-layers))
|
|
|
|
(let* ((sym (car layer))
|
|
|
|
(dir (plist-get (cdr layer) :dir)))
|
|
|
|
(dolist (file files)
|
|
|
|
(load (concat dir file))))))
|
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/read-packages-and-extensions ()
|
2014-09-03 06:25:27 +00:00
|
|
|
"Load all packages and extensions declared in all layers and fill the
|
|
|
|
corresponding hash tables:
|
|
|
|
spacemacs-all-packages
|
|
|
|
spacemacs-all-pre-extensions
|
|
|
|
spacemacs-all-post-extensions
|
|
|
|
By using a hash table we ensure that *only one layer* is responsible for the
|
|
|
|
initialization of a package or extensions (as well as the loading in case of
|
|
|
|
extension), the winner layer is the last layer to declare the package or
|
|
|
|
extension.
|
|
|
|
"
|
|
|
|
(dolist (layer (reverse spacemacs-config-layers))
|
|
|
|
(let* ((sym (car layer))
|
|
|
|
(dir (plist-get (cdr layer) :dir))
|
|
|
|
(pkg-file (concat dir "packages.el"))
|
|
|
|
(ext-file (concat dir "extensions.el")))
|
|
|
|
(progn
|
|
|
|
;; packages
|
|
|
|
(load pkg-file)
|
|
|
|
(dolist (pkg (eval (intern (format "%s-packages" (symbol-name sym)))))
|
|
|
|
(puthash pkg sym spacemacs-all-packages))
|
|
|
|
;; extensions
|
|
|
|
(load ext-file)
|
|
|
|
(dolist (pkg (eval (intern (format "%s-pre-extensions"
|
|
|
|
(symbol-name sym)))))
|
|
|
|
(puthash pkg sym spacemacs-all-pre-extensions))
|
|
|
|
(dolist (pkg (eval (intern (format "%s-post-extensions"
|
|
|
|
(symbol-name sym)))))
|
|
|
|
(puthash pkg sym spacemacs-all-post-extensions))))))
|
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/install-packages ()
|
2014-09-03 06:25:27 +00:00
|
|
|
"Install the packages all the packages if there are not currently installed."
|
|
|
|
(interactive)
|
2014-09-04 03:39:33 +00:00
|
|
|
(let* ((pkg-list (ht-keys spacemacs-all-packages))
|
|
|
|
(not-installed (remove-if 'package-installed-p pkg-list)))
|
2014-09-03 06:25:27 +00:00
|
|
|
;; installation
|
|
|
|
(if not-installed
|
|
|
|
(if (y-or-n-p (format
|
|
|
|
"there are %d packages to be installed. install them? "
|
|
|
|
(length not-installed)))
|
|
|
|
(progn (package-refresh-contents)
|
|
|
|
(dolist (pkg pkg-list)
|
|
|
|
(when (not (package-installed-p pkg))
|
|
|
|
(package-install pkg))))))))
|
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/initialize-packages ()
|
2014-09-03 06:25:27 +00:00
|
|
|
"Initialize all the declared packages."
|
2014-09-05 04:09:03 +00:00
|
|
|
(ht-each 'contribsys/initialize-package spacemacs-all-packages))
|
2014-09-03 06:25:27 +00:00
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/initialize-package (pkg lsym)
|
2014-09-03 06:25:27 +00:00
|
|
|
"Initialize the package PKG from the configuration layer LSYM."
|
|
|
|
(let* ((layer (assq lsym spacemacs-config-layers))
|
2014-09-04 07:24:20 +00:00
|
|
|
(init-func (intern (format "%s/init-%s" (symbol-name lsym) pkg))))
|
|
|
|
(if (and (package-installed-p pkg) (fboundp init-func))
|
|
|
|
(funcall init-func))))
|
2014-09-03 06:25:27 +00:00
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/initialize-extensions (ext-list)
|
2014-09-04 04:46:53 +00:00
|
|
|
"Initialize all the declared extensions in EXT-LIST hash table."
|
2014-09-05 04:09:03 +00:00
|
|
|
(ht-each 'contribsys/initialize-extension ext-list))
|
2014-09-03 06:25:27 +00:00
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/initialize-extension (ext lsym)
|
2014-09-03 06:25:27 +00:00
|
|
|
"Initialize the extension EXT from the configuration layer LSYM."
|
|
|
|
(let* ((layer (assq lsym spacemacs-config-layers))
|
|
|
|
(ext-dir (plist-get (cdr layer) :ext-dir))
|
2014-09-04 04:46:53 +00:00
|
|
|
(init-func (intern (format "%s/init-%s" (symbol-name lsym) ext))))
|
|
|
|
(add-to-list 'load-path (format "%s%s/" ext-dir ext))
|
2014-09-04 07:24:20 +00:00
|
|
|
(if (fboundp init-func) (funcall init-func))))
|
2014-09-05 03:43:50 +00:00
|
|
|
|
2014-09-05 04:09:03 +00:00
|
|
|
(defun contribsys/declare-configuration-layers ()
|
2014-09-05 03:43:50 +00:00
|
|
|
"Declare the configuration layer in order of appearance in list
|
|
|
|
dotspacemacs-configuration-layers defined in ~/.spacemacs."
|
|
|
|
(if (boundp 'dotspacemacs-configuration-layers)
|
|
|
|
(dolist (layer dotspacemacs-configuration-layers)
|
2014-09-05 04:09:03 +00:00
|
|
|
(contribsys/declare-layer layer t))))
|