[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 ()
- [elpa] externals/ergoemacs-mode bc28407 019/325: Remove icicles tests, (continued)
- [elpa] externals/ergoemacs-mode bc28407 019/325: Remove icicles tests, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 706e35e 024/325: Remove dead code, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode c3e7830 023/325: Remove option to bind C-c and C-x as copy/cut, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 25f5be8 022/325: Merge branch 'ctl-x-c', Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 0935e87 020/325: Remove timeout for ctl-x-c, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode b62f068 030/325: Remove more package stuff, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 46c76c0 036/325: Remove a little modal, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode c88308e 026/325: Make ergoemacs-test-keep-ctl-s work, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode d97731c 266/325: Add tab indent region when active again, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 21624e9 269/325: Bug fix for calculate bindings and update for the modes modified, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 3edd1e1 268/325: Save and restore keymaps on startup,
Stefan Monnier <=
- [elpa] externals/ergoemacs-mode 8cfa471 270/325: Use nadvice, as requested by Stephan Monnier, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode c9d4c1b 015/325: Remove ergoemacs-package, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode b2a8bb7 099/325: Make 'compile' the default make target, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 18b3859 121/325: Simplify split-window binding, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode b378df1 105/325: Reindent, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode c973446 124/325: Remove redundant fixed-newline, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode cbfa5a9 115/325: Remove some now obsolete <apps> tests, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 1bd971e 137/325: Remove iswitchb bindings and misc cleanup, Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode 377d498 107/325: Set variables properly. Lots of duplication., Stefan Monnier, 2021/10/23
- [elpa] externals/ergoemacs-mode c09952e 125/325: Remove all C-h help bindings except ergoemacs-describe-current-theme, Stefan Monnier, 2021/10/23