emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/ergoemacs-mode 3edd1e1 268/325: Save and restore keymap


From: Stefan Monnier
Subject: [elpa] externals/ergoemacs-mode 3edd1e1 268/325: Save and restore keymaps on startup
Date: Sat, 23 Oct 2021 18:49:08 -0400 (EDT)

branch: externals/ergoemacs-mode
commit 3edd1e1d90abd54036cb19f96f129a9ffbbf446b
Author: Matthew Fidler <514778+mattfidler@users.noreply.github.com>
Commit: Matthew Fidler <514778+mattfidler@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 ()



reply via email to

[Prev in Thread] Current Thread [Next in Thread]