From 17fae46f8babb9eaba168d5a10a1a9b93e996feb Mon Sep 17 00:00:00 2001 From: syl20bnr Date: Mon, 14 Dec 2015 00:00:25 -0500 Subject: [PATCH] evilified state: fix visual state bindings Clear the normal state keymap when in visual state --- .../evil-evilified-state.el | 58 ++++++++++++++----- 1 file changed, 44 insertions(+), 14 deletions(-) diff --git a/layers/+distribution/spacemacs-base/local/evil-evilified-state/evil-evilified-state.el b/layers/+distribution/spacemacs-base/local/evil-evilified-state/evil-evilified-state.el index b3feccf11..ff5700233 100644 --- a/layers/+distribution/spacemacs-base/local/evil-evilified-state/evil-evilified-state.el +++ b/layers/+distribution/spacemacs-base/local/evil-evilified-state/evil-evilified-state.el @@ -38,13 +38,14 @@ (defvar evilified-state--modes nil "List of all evilified modes.") -(defvar evilified-state--visual-state-map evil-visual-state-map - "Evil visual state map backup.") - (defvar evilified-state--evil-surround nil "Evil surround mode variable backup.") (make-variable-buffer-local 'evilified-state--evil-surround) +(defvar evilified-state--normal-state-map nil + "Local backup of normal state keymap.") +(make-variable-buffer-local 'evilified-state--normal-state-map) + (evil-define-state evilified "Evilified state. Hybrid `emacs state' with carrefully selected Vim key bindings. @@ -72,9 +73,31 @@ Needed to bypass keymaps set as text properties." (lookup-key evilified-map (this-command-keys))))) (when command (setq this-command command)))))) +(defun evilified-state--setup-normal-state-keymap () + "Setup the normal state keymap." + (unless evilified-state--normal-state-map + (setq-local evilified-state--normal-state-map + (copy-keymap evil-normal-state-map))) + (setq-local evil-normal-state-map + (copy-keymap evilified-state--normal-state-map)) + (define-key evil-normal-state-map [escape] 'evil-evilified-state)) + +(defun evilified-state--restore-normal-state-keymap () + "Restore the normal state keymap." + (setq-local evil-normal-state-map evilified-state--normal-state-map)) + +(defun evilified-state--clear-normal-state-keymap () + "Clear the normal state keymap." + (setq-local evil-normal-state-map (cons 'keymap nil))) + +(defun evilified-state--setup-visual-state-keymap () + "Setup the normal state keymap." + (setq-local evil-visual-state-map + (cons 'keymap (list (cons ?y 'evil-yank) + (cons 'escape 'evil-exit-visual-state))))) + (defun evilified-state--evilified-state-on-entry () "Setup evilified state." - (add-hook 'pre-command-hook 'evilified-state--pre-command-hook nil 'local) (when (derived-mode-p 'magit-mode) ;; Courtesy of evil-magit package ;; without this set-mark-command activates visual-state which is just @@ -83,11 +106,13 @@ Needed to bypass keymaps set as text properties." (when (bound-and-true-p evil-surround-mode) (make-local-variable 'evil-surround-mode) (evil-surround-mode -1)) - (setq-local evil-normal-state-map (copy-keymap evil-normal-state-map)) - (define-key evil-normal-state-map [escape] 'evil-evilified-state) - (setq-local evil-visual-state-map - (cons 'keymap (list (cons ?y 'evil-yank) - (cons 'escape 'evil-exit-visual-state))))) + (evilified-state--setup-normal-state-keymap) + (evilified-state--setup-visual-state-keymap) + (add-hook 'pre-command-hook 'evilified-state--pre-command-hook nil 'local) + (add-hook 'evil-visual-state-entry-hook + 'evilified-state--visual-state-on-entry nil 'local) + (add-hook 'evil-visual-state-exit-hook + 'evilified-state--visual-state-on-exit nil 'local)) (defun evilified-state--evilified-state-on-exit () "Clean evilified state" @@ -95,17 +120,22 @@ Needed to bypass keymaps set as text properties." (defun evilified-state--visual-state-on-entry () "Setup visual state." + ;; we need to clear temporarily the normal state keymap in order to reach + ;; the mode keymap + (when (eq 'evilified evil-previous-state) + (evilified-state--clear-normal-state-keymap)) (add-hook 'pre-command-hook 'evilified-state--pre-command-hook nil 'local)) (defun evilified-state--visual-state-on-exit () "Clean visual state" + (when (eq 'evilified evil-previous-state) + (evilified-state--restore-normal-state-keymap)) (remove-hook 'pre-command-hook 'evilified-state--pre-command-hook 'local)) -(add-hook 'evil-evilified-state-entry-hook 'evilified-state--evilified-state-on-entry) -(add-hook 'evil-evilified-state-exit-hook 'evilified-state--evilified-state-on-exit) - -(add-hook 'evil-visual-state-entry-hook 'evilified-state--visual-state-on-entry) -(add-hook 'evil-visual-state-exit-hook 'evilified-state--visual-state-on-exit) +(add-hook 'evil-evilified-state-entry-hook + 'evilified-state--evilified-state-on-entry) +(add-hook 'evil-evilified-state-exit-hook + 'evilified-state--evilified-state-on-exit) ;; default key bindings for all evilified buffers (define-key evil-evilified-state-map "/" 'evil-search-forward)