branch: externals/ergoemacs-mode commit 3edd1e1d90abd54036cb19f96f129a9ffbbf446b Author: Matthew Fidler <514778+mattfid...@users.noreply.github.com> Commit: Matthew Fidler <514778+mattfid...@users.noreply.github.com>
Save and restore keymaps on startup --- ergoemacs-macros.el | 6 +++ ergoemacs-mode.el | 48 +++++++++++++++--- ergoemacs-themes.el | 138 +++++++++++++++++++++++++++++----------------------- 3 files changed, 123 insertions(+), 69 deletions(-) diff --git a/ergoemacs-macros.el b/ergoemacs-macros.el index c12015f..4176609 100644 --- a/ergoemacs-macros.el +++ b/ergoemacs-macros.el @@ -365,6 +365,12 @@ When :type is :replace that replaces a function (like `define-key')" `(push ',function ergoemacs-advice--temp-replace-functions)))))))) +(defmacro ergoemacs-save-key-state (keymap-symbol &rest body) + "Save keys in KEYMAP-SYMBOL, eval BODY." + `(progn + (ergoemacs-mode--save-map ,keymap-symbol) + ,@body + (ergoemacs-mode--save-map ,keymap-symbol t))) (provide 'ergoemacs-macros) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/ergoemacs-mode.el b/ergoemacs-mode.el index 326ef48..2451438 100644 --- a/ergoemacs-mode.el +++ b/ergoemacs-mode.el @@ -189,8 +189,45 @@ variable `ergoemacs-after-load-functions'." (defvar ergoemacs-mode--default-frame-alist nil "List that saves default frame parameters.") -(defvar isearch-mode-map-ergoemacs nil - "This variable saves the variable `isearch-mode-map'.") +(defvar ergoemacs-mode--save-keymaps-list '() + "List of emacs saved to restore if needed.") + +(defvar ergoemacs-mode--save-keymaps (make-hash-table) + "Saved keymaps for `ergoemacs-mode'") + + +(defun ergoemacs-mode--save-map (symbol-map &optional is-ergoemacs) + "Save the keymap SYMBOL-MAP in the hash `ergoemacs-mode--save-keymaps'. + +IS-ERGOEMACS is true when the `ergoemacs-mode' keybindings are installed." + (let (hash-symbol + (map (symbol-value symbol-map))) + (if is-ergoemacs + (setq hash-symbol (concat (symbol-name symbol-map) "-ergoemacs")) + (add-to-list 'ergoemacs-mode--save-keymaps-list symbol-map) + (setq hash-symbol (symbol-name symbol-map))) + (setq hash-symbol (intern hash-symbol)) + (unless (gethash hash-symbol ergoemacs-mode--save-keymaps) + (puthash hash-symbol (copy-keymap map) + ergoemacs-mode--save-keymaps)))) + + + +(defun ergoemacs-mode--get-map (symbol-map &optional is-ergoemacs) + "Get the keymap SYMBOL-MAP in the hash `ergoemacs-mode--save-keymaps'. + +IS-ERGOEMACS is true when the `ergoemacs-mode' keybindings are installed." + (let (hash-symbol) + (if is-ergoemacs + (setq hash-symbol (concat (symbol-name symbol-map) "-ergoemacs")) + (setq hash-symbol (symbol-name symbol-map))) + (setq hash-symbol (intern hash-symbol)) + (gethash hash-symbol ergoemacs-mode--save-keymaps))) + +(defun ergoemacs-mode--restore-maps (&optional is-ergoemacs) + "Restore normal or ergoemacs keymaps (when IS-ERGOEMACS is non-nil)." + (dolist (k ergoemacs-mode--save-keymaps-list) + (set k (ergoemacs-mode--get-map k is-ergoemacs)))) ;; ErgoEmacs minor mode ;;;###autoload @@ -213,8 +250,6 @@ The `execute-extended-command' is now \\[execute-extended-command]. (setq ergoemacs-mode--start-p t) (if ergoemacs-mode (progn - (unless isearch-mode-map-ergoemacs - (setq isearch-mode-map-ergoemacs (copy-keymap isearch-mode-map))) ;; Save frame parameters (run-hooks 'ergoemacs-mode-startup-hook) (add-hook 'pre-command-hook #'ergoemacs-pre-command-hook) @@ -224,7 +259,7 @@ The `execute-extended-command' is now \\[execute-extended-command]. (setq ergoemacs-mode--default-frame-alist nil) (dolist (elt (reverse default-frame-alist)) (push elt ergoemacs-mode--default-frame-alist)) - + (ergoemacs-mode--restore-maps t) ;; Setup the global keys that can be overriden (cond ((string-equal ergoemacs-theme "reduction") @@ -259,8 +294,7 @@ The `execute-extended-command' is now \\[execute-extended-command]. (remove-hook 'after-load-functions #'ergoemacs-after-load-functions) (when ergoemacs-mode-turn-on-cua-mode (cua-mode 0)) - (when isearch-mode-map-ergoemacs - (setq isearch-mode-map isearch-mode-map-ergoemacs)) + (ergoemacs-mode--restore-maps) (message "Ergoemacs-mode turned OFF."))) (defvar ergoemacs-translate--event-hash (make-hash-table) diff --git a/ergoemacs-themes.el b/ergoemacs-themes.el index 59b6402..af6b3ce 100644 --- a/ergoemacs-themes.el +++ b/ergoemacs-themes.el @@ -1229,47 +1229,51 @@ In a terminal, this can be either arrow keys (e.g. meta+O A == <up>) or regular (defun ergoemacs-install-isearch-mode () "Installs keys for isearch mode." - (ergoemacs-unset-keys-in-map isearch-mode-map) - (define-key isearch-mode-map (kbd "C-x C-q") 'isearch-edit-string) - (define-key isearch-mode-map (kbd "<f2>") 'isearch-edit-string) - ;; Mode specific changes - (if (string-equal ergoemacs-theme "reduction") - (progn - (ergoemacs-define-key isearch-mode-map (kbd "C-M-:") 'isearch-occur) - (ergoemacs-define-key isearch-mode-map (kbd "M-d") 'isearch-delete-char) - (ergoemacs-define-key isearch-mode-map (kbd "DEL") 'isearch-delete-char) - (ergoemacs-define-key isearch-mode-map (kbd "<menu> v") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "M-v") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "C-v") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "<S-insert>") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "M-V") 'isearch-yank-pop) - (ergoemacs-define-key isearch-mode-map (kbd "C-S-v") 'isearch-yank-pop) - (ergoemacs-define-key isearch-mode-map (kbd "<menu> 5") 'isearch-query-replace) - (ergoemacs-define-key isearch-mode-map (kbd "M-5") 'isearch-query-replace) - (ergoemacs-define-key isearch-mode-map (kbd "M-h") 'isearch-repeat-forward) - (ergoemacs-define-key isearch-mode-map (kbd "C-e") 'isearch-repeat-forward) - (ergoemacs-define-key isearch-mode-map (kbd "C-M-d") 'isearch-repeat-forward) - (ergoemacs-define-key isearch-mode-map (kbd "M-y") 'isearch-repeat-backward) - (ergoemacs-define-key isearch-mode-map (kbd "C-M-s") 'isearch-repeat-backward) - (ergoemacs-define-key isearch-mode-map (kbd "M-t") 'isearch-complete)) - (ergoemacs-define-key isearch-mode-map (kbd "M-n") 'isearch-beginning-oef-buffer) - (ergoemacs-define-key isearch-mode-map (kbd "M-N") 'isearch-end-of-buffer) - (ergoemacs-define-key isearch-mode-map (kbd "C-M-:") 'isearch-occur) - (ergoemacs-define-key isearch-mode-map (kbd "M-d") 'isearch-delete-char) - (ergoemacs-define-key isearch-mode-map (kbd "DEL") 'isearch-delete-char) - (ergoemacs-define-key isearch-mode-map (kbd "M-v") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "C-v") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "<S-insert>") 'isearch-yank-kill) - (ergoemacs-define-key isearch-mode-map (kbd "M-V") 'isearch-yank-pop) - (ergoemacs-define-key isearch-mode-map (kbd "C-S-v") 'isearch-yank-pop) - (ergoemacs-define-key isearch-mode-map (kbd "M-5") 'isearch-query-replace) - (ergoemacs-define-key isearch-mode-map (kbd "M-;") 'isearch-repeat-forward) - (ergoemacs-define-key isearch-mode-map (kbd "C-e") 'isearch-repeat-forward) - (ergoemacs-define-key isearch-mode-map (kbd "C-M-d") 'isearch-repeat-forward) - (ergoemacs-define-key isearch-mode-map (kbd "C-M-s") 'isearch-repeat-backward) - (ergoemacs-define-key isearch-mode-map (kbd "M-t") 'isearch-complete)) - (define-key minibuffer-local-isearch-map [remap isearch-forward] 'isearch-forward-exit-minibuffer) - (define-key minibuffer-local-isearch-map [remap isearch-backward] 'isearch-reverse-exit-minibuffer)) + (ergoemacs-save-key-state + 'isearch-mode-map + (ergoemacs-unset-keys-in-map isearch-mode-map) + (define-key isearch-mode-map (kbd "C-x C-q") 'isearch-edit-string) + (define-key isearch-mode-map (kbd "<f2>") 'isearch-edit-string) + ;; Mode specific changes + (if (string-equal ergoemacs-theme "reduction") + (progn + (ergoemacs-define-key isearch-mode-map (kbd "C-M-:") 'isearch-occur) + (ergoemacs-define-key isearch-mode-map (kbd "M-d") 'isearch-delete-char) + (ergoemacs-define-key isearch-mode-map (kbd "DEL") 'isearch-delete-char) + (ergoemacs-define-key isearch-mode-map (kbd "<menu> v") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "M-v") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "C-v") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "<S-insert>") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "M-V") 'isearch-yank-pop) + (ergoemacs-define-key isearch-mode-map (kbd "C-S-v") 'isearch-yank-pop) + (ergoemacs-define-key isearch-mode-map (kbd "<menu> 5") 'isearch-query-replace) + (ergoemacs-define-key isearch-mode-map (kbd "M-5") 'isearch-query-replace) + (ergoemacs-define-key isearch-mode-map (kbd "M-h") 'isearch-repeat-forward) + (ergoemacs-define-key isearch-mode-map (kbd "C-e") 'isearch-repeat-forward) + (ergoemacs-define-key isearch-mode-map (kbd "C-M-d") 'isearch-repeat-forward) + (ergoemacs-define-key isearch-mode-map (kbd "M-y") 'isearch-repeat-backward) + (ergoemacs-define-key isearch-mode-map (kbd "C-M-s") 'isearch-repeat-backward) + (ergoemacs-define-key isearch-mode-map (kbd "M-t") 'isearch-complete)) + (ergoemacs-define-key isearch-mode-map (kbd "M-n") 'isearch-beginning-oef-buffer) + (ergoemacs-define-key isearch-mode-map (kbd "M-N") 'isearch-end-of-buffer) + (ergoemacs-define-key isearch-mode-map (kbd "C-M-:") 'isearch-occur) + (ergoemacs-define-key isearch-mode-map (kbd "M-d") 'isearch-delete-char) + (ergoemacs-define-key isearch-mode-map (kbd "DEL") 'isearch-delete-char) + (ergoemacs-define-key isearch-mode-map (kbd "M-v") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "C-v") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "<S-insert>") 'isearch-yank-kill) + (ergoemacs-define-key isearch-mode-map (kbd "M-V") 'isearch-yank-pop) + (ergoemacs-define-key isearch-mode-map (kbd "C-S-v") 'isearch-yank-pop) + (ergoemacs-define-key isearch-mode-map (kbd "M-5") 'isearch-query-replace) + (ergoemacs-define-key isearch-mode-map (kbd "M-;") 'isearch-repeat-forward) + (ergoemacs-define-key isearch-mode-map (kbd "C-e") 'isearch-repeat-forward) + (ergoemacs-define-key isearch-mode-map (kbd "C-M-d") 'isearch-repeat-forward) + (ergoemacs-define-key isearch-mode-map (kbd "C-M-s") 'isearch-repeat-backward) + (ergoemacs-define-key isearch-mode-map (kbd "M-t") 'isearch-complete))) + (ergoemacs-save-key-state + 'minibuffer-local-isearch-map + (define-key minibuffer-local-isearch-map [remap isearch-forward] 'isearch-forward-exit-minibuffer) + (define-key minibuffer-local-isearch-map [remap isearch-backward] 'isearch-reverse-exit-minibuffer))) (defun ergoemacs-install-reduction-theme () @@ -1347,42 +1351,50 @@ In a terminal, this can be either arrow keys (e.g. meta+O A == <up>) or regular (defvar org-mode-map ) (defun ergoemacs-install-org-bindings () "Install the `org-mode' bindings." - (define-key org-mode-map (kbd "<C-return>") 'ergoemacs-org-insert-heading-respect-content) - (define-key org-mode-map (kbd "<M-down>") 'ergoemacs-org-metadown) - (define-key org-mode-map (kbd "<M-up>") 'ergoemacs-org-metaup) - (define-key org-mode-map (kbd "<M-left>") 'ergoemacs-org-metaleft) - (define-key org-mode-map (kbd "<M-right>") 'ergoemacs-org-metaright) - (define-key org-mode-map (kbd "<M-RET>") 'org-insert-item) - - ;; How to do bold and italic? I do not like using Control keys - ;; C-i is TAB... This seems to cause issues? - ;; (define-key org-mode-map (kbd "C-b") 'ergoemacs-org-bold) - ;; (define-key org-mode-map (kbd "C-i") 'ergoemacs-org-italic) - - (define-key org-mode-map [remap beginning-of-line] 'org-beginning-of-line) - (define-key org-mode-map [remap end-of-line] 'org-end-of-line) - (define-key org-mode-map [remap forward-paragraph] 'org-forward-paragraph) - (define-key org-mode-map [remap backward-paragraph] 'org-backward-paragraph) - (define-key org-mode-map [remap ergoemacs-paste] 'ergoemacs-org-yank)) + (ergoemacs-save-key-state + 'org-mode-map + (define-key org-mode-map (kbd "<C-return>") 'ergoemacs-org-insert-heading-respect-content) + (define-key org-mode-map (kbd "<M-down>") 'ergoemacs-org-metadown) + (define-key org-mode-map (kbd "<M-up>") 'ergoemacs-org-metaup) + (define-key org-mode-map (kbd "<M-left>") 'ergoemacs-org-metaleft) + (define-key org-mode-map (kbd "<M-right>") 'ergoemacs-org-metaright) + (define-key org-mode-map (kbd "<M-RET>") 'org-insert-item) + + ;; How to do bold and italic? I do not like using Control keys + ;; C-i is TAB... This seems to cause issues? + ;; (define-key org-mode-map (kbd "C-b") 'ergoemacs-org-bold) + ;; (define-key org-mode-map (kbd "C-i") 'ergoemacs-org-italic) + + (define-key org-mode-map [remap beginning-of-line] 'org-beginning-of-line) + (define-key org-mode-map [remap end-of-line] 'org-end-of-line) + (define-key org-mode-map [remap forward-paragraph] 'org-forward-paragraph) + (define-key org-mode-map [remap backward-paragraph] 'org-backward-paragraph) + (define-key org-mode-map [remap ergoemacs-paste] 'ergoemacs-org-yank))) (add-hook 'org-load-hook #'ergoemacs-install-org-bindings) (defvar log-edit-mode-map) (defun ergoemacs-install-log-edit-bindings () "Install `log-edit' key bindings." - (define-key log-edit-mode-map [remap save-buffer] 'log-edit-done)) + (ergoemacs-save-key-state + 'log-edit-mode-map + (define-key log-edit-mode-map [remap save-buffer] 'log-edit-done))) (with-eval-after-load 'log-edit (ergoemacs-install-log-edit-bindings)) (defvar eshell-mode-map) (defun ergoemacs-install-eshell-bindings () "Install `eshell' bindings." - (define-key eshell-mode-map [remap move-beginning-of-line] 'eshell-bol)) + (ergoemacs-save-key-state + 'eshell-mode-map + (define-key eshell-mode-map [remap move-beginning-of-line] 'eshell-bol))) (add-hook 'eshell-post-command-hook #'ergoemacs-install-eshell-bindings) (defun ergoemacs-install-comint-bindings () "Install comint key bindings." - (define-key comint-mode-map [remap move-beginning-of-line] 'comint-bol)) + (ergoemacs-save-key-state + 'comint-mode-map + (define-key comint-mode-map [remap move-beginning-of-line] 'comint-bol))) (with-eval-after-load 'comint (ergoemacs-install-comint-bindings)) @@ -1395,7 +1407,9 @@ In a terminal, this can be either arrow keys (e.g. meta+O A == <up>) or regular (defvar calc-mode-map) (defun ergoemacs-install-calc-bindings () "Install `calc-mode' bindings." - (define-key calc-mode-map [remap ergoemacs-undo] 'calc-undo)) + (ergoemacs-save-key-state + 'comint-mode-map + (define-key calc-mode-map [remap ergoemacs-undo] 'calc-undo))) (add-hook 'calc-load-hook #'ergoemacs-install-calc-bindings) (ergoemacs-translation normal ()