;; from jwiegley ;; https://github.com/jwiegley/dot-emacs/blob/master/init.el (setq message-log-max 16384) (defconst emacs-start-time (current-time)) (defconst user-home-directory (expand-file-name (concat user-emacs-directory "../")) "User home directory (~/).") (defconst contrib-config-directory (expand-file-name (concat user-emacs-directory "contrib/")) "Contribution layers base directory.") (defvar user-dropbox-directory (expand-file-name (concat user-home-directory "Dropbox/")) "Dropbox directory.") ;; if you have a dropbox, then ~/Dropbox/emacs is added to load path (add-to-list 'load-path (concat user-dropbox-directory "emacs/")) ;; User configuration file for Spacemacs: ~/.spacemacs (load (concat user-home-directory ".spacemacs")) (dotspacemacs/init) ;; --------------------------------------------------------------------------- ;; Init Macros and Functions ;; --------------------------------------------------------------------------- (defmacro spacemacs/declare-layer (name &optional contrib) "Declare a layer with name NAME. If CONTRIB is non nil then the layer is a contribution layer." (let ((layer-dir-sym (intern (concat name "-config-directory"))) (base-dir (if contrib contrib-config-directory user-emacs-directory))) `(progn (defconst ,layer-dir-sym (expand-file-name (concat ,base-dir (concat ,name "/"))) ,(concat name " layer directory.")) (defconst ,(intern (concat name "-extensions-directory")) (concat ,layer-dir-sym "extensions/") ,(concat name " layer extensions directory.")) (defconst ,(intern (concat name "-init-extension-directory")) (concat ,layer-dir-sym "init-extension/") ,(concat name " layer extension initialization directory.")) (defconst ,(intern (concat name "-init-package-directory")) (concat ,layer-dir-sym "init-package/") ,(concat name " layer package initialization directory.")) (defconst ,(intern (concat name "-contribp")) ,contrib)))) (defmacro spacemacs/initialize-layer (name) "Initialize the given Spacemacs configuration layer. NAME is the configuration layer name." (declare (indent 1)) (let ((base-dir (intern (concat name "-config-directory")))) `(progn (load (concat ,base-dir "funcs.el")) (load (concat ,base-dir "macros.el")) (load (concat ,base-dir "extensions.el")) (load (concat ,base-dir "packages.el")) ;; pre-extensions (spacemacs/load-and-initialize-extensions ,(intern (concat name "-pre-extensions")) ,(intern (concat name "-extensions-directory")) ,(intern (concat name "-init-extension-directory"))) ;; packages (spacemacs/install-missing-packages ,(intern (concat name "-packages"))) (spacemacs/initialize-packages ,(intern (concat name "-init-package-directory"))) ;; post extensions (spacemacs/load-and-initialize-extensions ,(intern (concat name "-post-extensions")) ,(intern (concat name "-extensions-directory")) ,(intern (concat name "-init-extension-directory"))) ;; key bindings (load (concat ,base-dir "keybindings.el")) ;; emacs config (load (concat ,base-dir "config.el"))))) (defun spacemacs/install-missing-packages (pkg-list) "Install the missing package from given PKG-LIST" (interactive) (let ((not-installed (remove-if 'package-installed-p pkg-list))) (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 (package pkg-list) (when (not (package-installed-p package)) (package-install package)))))))) (defun spacemacs/initialize-packages (init-dir) "Load init-xxx for each xxx packages listed in spacemacs-packages." (interactive) (dolist (package spacemacs-packages) (let* ((initfile (concat init-dir (format "init-%s.el" package)))) (if (and (package-installed-p package) (file-exists-p initfile)) (load initfile))))) (defun spacemacs/load-and-initialize-extensions (ext-list ext-dir init-dir) "Load init-xxx for each xxx extensions in EXT-LIST" (dolist (ext ext-list) (add-to-list 'load-path (format "%s%s/" ext-dir ext)) (let* ((initfile (concat init-dir (format "init-%s.el" ext)))) (if (file-exists-p initfile) (load initfile))))) ;; --------------------------------------------------------------------------- ;; Configuration Layers ;; --------------------------------------------------------------------------- (spacemacs/declare-layer "spacemacs") (spacemacs/initialize-layer "spacemacs") ;; for now hardcoded contrib config layers (spacemacs/declare-layer "syl20bnr" t) (spacemacs/initialize-layer "syl20bnr") ;; Last configuration decisions are given to the user who can defined them ;; in ~/.spacemacs (dotspacemacs/config) ;; --------------------------------------------------------------------------- ;; Post initialization ;; --------------------------------------------------------------------------- ;; from jwiegley ;; https://github.com/jwiegley/dot-emacs/blob/master/init.el ;; Display load times after init.el and after all buffers has been loaded (when window-system (let ((elapsed (float-time (time-subtract (current-time) emacs-start-time)))) (message "Loading %s...done (%.3fs)" load-file-name elapsed)) (add-hook 'after-init-hook `(lambda () (let ((elapsed (float-time (time-subtract (current-time) emacs-start-time)))) (message "Loading %s...done (%.3fs) [after-init]" ,load-file-name elapsed))) t))