mlf176f2 pushed a commit to branch externals/ergoemacs-mode in repository elpa.
commit 61b2cd88b15e26efe1a1f63a15a07fed3f0c0cfd Author: Matthew L. Fidler <[email protected]> Date: Mon Jun 23 14:56:24 2014 -0500 Allow hooks in themes; save settings on exit (Issue #234) --- ergoemacs-functions.el | 14 ++++++++++++++ ergoemacs-macros.el | 7 +++++++ ergoemacs-theme-engine.el | 25 ++++++++++++++++++++++--- ergoemacs-themes.el | 10 ++++++++-- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/ergoemacs-functions.el b/ergoemacs-functions.el index a4fd3fa..4b3278b 100644 --- a/ergoemacs-functions.el +++ b/ergoemacs-functions.el @@ -105,6 +105,20 @@ nil))) t))) +(defun ergoemacs-exit-customize-save-customized () + "Call `customize-save-customized' on exit emacs. + +If an error occurs, display the error, and sit for 2 seconds before exiting" + (cond + ((not (or custom-file user-init-file)) + (message "Not saving; \"emacs -q\" would overwrite customizations") + (sit-for 1)) + ((and (null custom-file) init-file-had-error) + (message "Cannot save customizations; init file was not fully loaded") + (sit-for 1)) + (t + (customize-save-customized)))) + (defun ergoemacs-ctl-c (&optional arg) "Ergoemacs C-c key." (interactive "P") diff --git a/ergoemacs-macros.el b/ergoemacs-macros.el index 03ef001..c1d8d06 100644 --- a/ergoemacs-macros.el +++ b/ergoemacs-macros.el @@ -141,6 +141,7 @@ Uses `ergoemacs-theme-component--parse-keys-and-body' and - `global-unset-key' is converted to `ergoemacs-define-key' with keymap equal to `global-map' and function definition is `nil' - `global-reset-key' is converted `ergoemacs-define-key' - `setq' and `set' is converted to `ergoemacs-set' +- `add-hook' and `remove-hook' is converted to `ergoemacs-set' - Mode initialization like (delete-selection-mode 1) or (delete-selection) is converted to `ergoemacs-set' @@ -167,6 +168,12 @@ Uses `ergoemacs-theme-component--parse-keys-and-body' and ((ignore-errors (eq (nth 0 elt) 'set)) ;; Currently doesn't support (setq a b c d ), but it should. `(ergoemacs-set ,(nth 1 elt) '(lambda() ,(nth 2 elt)))) + ((ignore-errors (eq (nth 0 elt) 'add-hook)) + `(ergoemacs-set ,(nth 1 elt) ,(nth 2 elt) + (list t ,(nth 3 elt) ,(nth 4 elt)))) + ((ignore-errors (eq (nth 0 elt) 'remove-hook)) + `(ergoemacs-set ,(nth 1 elt) ,(nth 2 elt) + (list nil nil ,(nth 3 elt)))) ((ignore-errors (eq (nth 0 elt) 'setq)) (let ((tmp-elt elt) (ret '())) diff --git a/ergoemacs-theme-engine.el b/ergoemacs-theme-engine.el index cba8d7e..94b743b 100644 --- a/ergoemacs-theme-engine.el +++ b/ergoemacs-theme-engine.el @@ -1099,6 +1099,17 @@ ergoemacs-get-keymaps-for-hook OBJ HOOK") ((assq (nth 0 init) ergoemacs-applied-inits) ;; Already applied, Do nothing for now. ) + ((nth 2 init) + ;; Hook + (let ((add-hook-p (nth 0 (nth 2 init))) + (append-p (nth 1 (nth 2 init))) + (local-p (nth 2 (nth 2 init)))) + (if add-hook-p + (funcall 'add-hook (nth 0 init) (nth 1 init) append-p local-p) + (funcall 'remove-hook (nth 0 init) (nth 1 init) local-p)) + (push (list (nth 0 init) (nth 1 init) + (list (not add-hook-p) append-p local-p)) + ergoemacs-applied-inits))) ((and (string-match-p "-mode$" (symbol-name (nth 0 init))) (ignore-errors (commandp (nth 0 init) t))) (push (list (nth 0 init) (if (symbol-value (nth 0 init)) 1 -1)) @@ -1116,8 +1127,16 @@ ergoemacs-get-keymaps-for-hook OBJ HOOK") This assumes the variables are stored in `ergoemacs-applied-inits'" (dolist (init ergoemacs-applied-inits) (let ((var (nth 0 init)) - (val (nth 1 init))) + (val (nth 1 init)) + (hook (nth 2 init))) (cond + (hook + (let ((add-hook-p (nth 0 hook)) + (append-p (nth 1 hook)) + (local-p (nth 2 hook))) + (if add-hook-p + (funcall 'add-hook (nth 0 init) (nth 1 init) append-p local-p) + (funcall 'remove-hook (nth 0 init) (nth 1 init) local-p)))) ((and (string-match-p "-mode$" (symbol-name var)) (ignore-errors (commandp var t))) (funcall var val)) @@ -1565,12 +1584,12 @@ The actual keymap changes are included in `ergoemacs-emulation-mode-map-alist'." ergoemacs-theme-component-maps--curr-component map key def)))) -(defun ergoemacs-set (symbol newval) +(defun ergoemacs-set (symbol newval &optional hook) (if (not (ergoemacs-theme-component-maps-p ergoemacs-theme-component-maps--curr-component)) (warn "`ergoemacs-set' is meant to be called in a theme definition.") ;; ergoemacs-set definition. (with-slots (init) ergoemacs-theme-component-maps--curr-component - (push (list symbol newval) init) + (push (list symbol newval hook) init) (oset ergoemacs-theme-component-maps--curr-component init init)))) diff --git a/ergoemacs-themes.el b/ergoemacs-themes.el index 6ddd5b8..c1782c2 100644 --- a/ergoemacs-themes.el +++ b/ergoemacs-themes.el @@ -72,6 +72,10 @@ ;; (cua-mode . ,cua-global-keymap)))) ) +(ergoemacs-theme-component save-options-on-exit () + "Save emacs options on exit" + (add-hook 'kill-emacs-hook 'ergoemacs-exit-customize-save-customized)) + ;;; Fixed components (ergoemacs-theme-component standard-fixed () "Standard Fixed Shortcuts" @@ -984,7 +988,8 @@ helm-remaps multiple-cursors-remaps quit - apps-swap) + apps-swap + save-options-on-exit) :optional-off '(guru no-backspace search-reg ergoemacs-banish-shift) :options-menu '(("Menu/Apps Key" (apps apps-apps apps-punctuation)) @@ -1029,7 +1034,8 @@ helm-remaps multiple-cursors-remaps quit - apps-swap) + apps-swap + save-options-on-exit) :optional-off '(guru no-backspace search-reg ergoemacs-banish-shift) :options-menu '(("Menu/Apps Key" (apps apps-apps apps-punctuation))
