evilify: simplify implementation and fix tests

This commit is contained in:
syl20bnr 2015-09-26 00:11:34 -04:00
parent 5d654767ea
commit d237d56c23
2 changed files with 159 additions and 161 deletions

View File

@ -56,7 +56,7 @@ Each pair KEYn FUNCTIONn is defined in MAP after the evilification of it."
(eval-after-load (plist-get props :eval-after-load))
(bindings (spacemacs/mplist-get props :bindings))
(defkey (when bindings `(evil-define-key 'evilified ,map ,@bindings)))
(body
(body
`(progn
(let ((sorted-map (spacemacs//evilify-sort-keymap
(or ,evilified-map evil-evilified-state-map)))
@ -65,6 +65,8 @@ Each pair KEYn FUNCTIONn is defined in MAP after the evilification of it."
(unless (member (car map-entry) processed)
(setq processed (spacemacs//evilify-event
,map ',map
(or ,evilified-map
evil-evilified-state-map)
(car map-entry) (cdr map-entry)))))
sorted-map))
(unless ,(null defkey)
@ -82,115 +84,35 @@ Each pair KEYn FUNCTIONn is defined in MAP after the evilification of it."
(delq mode evil-emacs-state-modes)
(add-to-list 'evil-evilified-state-modes mode)))
(defun spacemacs//evilify-event (map map-symbol event evil-value
(defun spacemacs//evilify-event (map map-symbol evil-map event evil-value
&optional processed pending-funcs)
"Evilify EVENT in MAP and return a list of PROCESSED events."
(if (and event (or evil-value pending-funcs))
(let* ((kbd-event (kbd (single-key-description event)))
(map-value (lookup-key map kbd-event)))
(unless (and (symbolp map-value)
(string-match-p "--evilified" (symbol-name map-value)))
(unless evil-value
(setq evil-value (lookup-key evil-evilified-state-map kbd-event)))
(when (or map-value pending-funcs)
(let* ((pending-func (unless evil-value (pop pending-funcs)))
(evil-event (unless evil-value (cdr pending-func)))
(evil-value (or evil-value (car pending-func)))
(wrapper (spacemacs//evilify-wrapper map map-symbol
map-value event
evil-value evil-event)))
(evil-define-key 'evilified map kbd-event wrapper)))
(when map-value
(add-to-list 'pending-funcs (cons map-value event) 'append))
(push event processed)
(setq processed (spacemacs//evilify-event
map map-symbol
(spacemacs//evilify-find-new-event event) nil
processed pending-funcs))))
(map-value (lookup-key map kbd-event))
(evil-value (or evil-value
(lookup-key evil-map kbd-event)
(car (pop pending-funcs)))))
(when evil-value
(evil-define-key 'evilified map kbd-event evil-value))
(when map-value
(add-to-list 'pending-funcs (cons map-value event) 'append))
(push event processed)
(setq processed (spacemacs//evilify-event
map map-symbol evil-map
(spacemacs//evilify-find-new-event event) nil
processed pending-funcs)))
(when pending-funcs
(spacemacs-buffer/warning
(concat (format (concat "Auto-evilication could not remap these "
"functions in map `%s':\n")
map-symbol)
(mapconcat (lambda (x)
(format " - `%s' originally mapped on `%s''"
(format " - `%s' originally mapped on `%s'"
(car x) (single-key-description (cdr x))))
pending-funcs "\n")))))
processed)
(defun spacemacs//evilify-wrapper-name (map-symbol map-value event
evil-value evil-event)
"Return a name for the wrapper function."
(intern (if map-value
(format "%s-or-%s--evilified-%s-%s"
(spacemacs//evilify-wrapper-value-symbol map-value event)
(spacemacs//evilify-wrapper-value-symbol evil-value
evil-event)
map-symbol (single-key-description event))
(format "%s--evilified-%s-%s"
(spacemacs//evilify-wrapper-value-symbol evil-value
evil-event)
map-symbol (single-key-description event)))))
(defun spacemacs//evilify-wrapper-documentation (map-value
event evil-value evil-event)
"Return a docstring for the wrapper function."
(let ((map-string (spacemacs//evilify-wrapper-value-string map-value event))
(evil-string (spacemacs//evilify-wrapper-value-string evil-value
evil-event)))
(if map-value
(format (concat "Wrap %s and %s.\n"
"In evilified state %s is executed. Whereas "
"in other states (i.e. emacs state) the stock "
"%s is executed.")
map-string evil-string
evil-string map-string)
(format (concat "Wrap %s.\n"
"This function is a dummy wrapper which only "
"executes the %s.")
evil-string evil-string))))
(defun spacemacs//evilify-wrapper-value-symbol (value event)
"Return a symbol string given VALUE type and EVENT."
(if (keymapp value)
(format "keymap-%s" (single-key-description event))
value))
(defun spacemacs//evilify-wrapper-value-string (value event)
"Return a string given VALUE type and EVENT."
(if (keymapp value)
(format "keymap on key `%s'" (single-key-description event))
(format "function `%s'" value)))
(defun spacemacs//evilify-call (value event)
"Call VALUE depending on its type (symbol or keymap)."
`(if ,(keymapp value)
(progn
(message "%s-" ,(single-key-description event))
(,(if (version< emacs-version "24.4")
'set-temporary-overlay-map
'set-transient-map)
',value))
(unless ,(null value)
(call-interactively ',value))))
(defun spacemacs//evilify-wrapper (map map-symbol map-value event
evil-value evil-event)
"Define a wrapper for the passed event."
(eval `(evil-define-command ,(spacemacs//evilify-wrapper-name
map-symbol map-value event evil-value evil-event) ()
,(spacemacs//evilify-wrapper-documentation
map-value event evil-value evil-event)
:keep-visual t
(interactive)
(if (memq evil-state '(evilified visual))
;; evilified state
,(if evil-value
(spacemacs//evilify-call evil-value event)
(spacemacs//evilify-call map-value event))
;; other states (i.e. emacs)
,(spacemacs//evilify-call map-value event)))))
(defun spacemacs//evilify-find-new-event (event)
"Return a new event for the evilified EVENT."
(when event

View File

@ -31,8 +31,11 @@
(input-map (make-sparse-keymap)))
(define-key input-map "s" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func-or-evil-func--evilified-input-map-s)
(83 . func--evilified-input-map-S))
(should (equal '((115 . func)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(83 . func)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-2-evilified ()
@ -43,9 +46,12 @@
(input-map (make-sparse-keymap)))
(define-key input-map "s" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func-or-evil-func--evilified-input-map-s)
(83 . evil-func2--evilified-input-map-S)
(19 . func--evilified-input-map-C-s))
(should (equal '((115 . func)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 . func)
(83 . evil-func2)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S ()
@ -56,9 +62,13 @@
(define-key input-map "s" 'func1)
(define-key input-map "S" 'func2)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func--evilified-input-map-s)
(83 . func2-or-func1--evilified-input-map-S)
(19 . func2--evilified-input-map-C-s))
(should (equal '((115 . func1)
(83 . func2)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 . func2)
(83 . func1)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-reversed-order ()
@ -69,9 +79,13 @@
(define-key input-map "S" 'func2)
(define-key input-map "s" 'func1)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func--evilified-input-map-s)
(83 . func2-or-func1--evilified-input-map-S)
(19 . func2--evilified-input-map-C-s))
(should (equal '((115 . func1)
(83 . func2)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 . func2)
(83 . func1)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-2-evilified ()
@ -83,10 +97,14 @@
(define-key input-map "s" 'func1)
(define-key input-map "S" 'func2)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func1--evilified-input-map-s)
(83 . func2-or-evil-func2--evilified-input-map-S)
(19 . func1--evilified-input-map-C-s)
(33554451 . func2--evilified-input-map-C-S-s))
(should (equal '((115 . func1)
(83 . func2)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 . func2)
(19 . func1)
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-2-evilified-reversed-order ()
@ -98,10 +116,14 @@
(define-key input-map "S" 'func2)
(define-key input-map "s" 'func1)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func1--evilified-input-map-s)
(83 . func2-or-evil-func2--evilified-input-map-S)
(19 . func1--evilified-input-map-C-s)
(33554451 . func2--evilified-input-map-C-S-s))
(should (equal '((115 . func1)
(83 . func2)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 . func2)
(19 . func1)
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-C-s ()
@ -113,10 +135,15 @@
(define-key input-map "S" 'func2)
(define-key input-map (kbd "C-s") 'func3)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func--evilified-input-map-s)
(83 . func2-or-func1--evilified-input-map-S)
(19 . func3-or-func2--evilified-input-map-C-s)
(33554451 . func3--evilified-input-map-C-S-s))
(should (equal '((115 . func1)
(83 . func2)
(19 . func3)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 . func3)
(19 . func2)
(83 . func1)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-C-s-shuffled ()
@ -128,10 +155,15 @@
(define-key input-map (kbd "C-s") 'func3)
(define-key input-map "S" 'func2)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func--evilified-input-map-s)
(83 . func2-or-func1--evilified-input-map-S)
(19 . func3-or-func2--evilified-input-map-C-s)
(33554451 . func3--evilified-input-map-C-S-s))
(should (equal '((115 . func1)
(83 . func2)
(19 . func3)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 . func3)
(19 . func2)
(83 . func1)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-C-s-2-evilified ()
@ -148,10 +180,15 @@
((:record-cls 'mocker-stub-record
:output nil :occur 1))))
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func1--evilified-input-map-s)
(83 . func2-or-evil-func2--evilified-input-map-S)
(19 . func3-or-func1--evilified-input-map-C-s)
(33554451 . func2--evilified-input-map-C-S-s))
(should (equal '((115 . func1)
(83 . func2)
(19 . func3)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 . func2)
(19 . func1)
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map))))))
(ert-deftest test-evilify-map--s-C-s-S-2-evilified-shuffled ()
@ -168,10 +205,15 @@
((:record-cls 'mocker-stub-record
:output nil :occur 1))))
(spacemacs|evilify-map input-map)
(should (equal '((115 . func1-or-evil-func1--evilified-input-map-s)
(83 . func2-or-evil-func2--evilified-input-map-S)
(19 . func3-or-func1--evilified-input-map-C-s)
(33554451 . func2--evilified-input-map-C-S-s))
(should (equal '((115 . func1)
(83 . func2)
(19 . func3)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 . func2)
(19 . func1)
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map))))))
;; keymaps
@ -185,8 +227,11 @@
(define-key input-map "s" submap)
(define-key submap "t" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . keymap-s-or-evil-func--evilified-input-map-s)
(83 . keymap-s--evilified-input-map-S))
(should (equal '((115 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(83 keymap (116 . func))
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-keymap-2-evilified ()
@ -199,9 +244,12 @@
(define-key input-map "s" submap)
(define-key submap "t" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . keymap-s-or-evil-func1--evilified-input-map-s)
(83 . evil-func2--evilified-input-map-S)
(19 . keymap-s--evilified-input-map-C-s))
(should (equal '((115 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 keymap (116 . func))
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-keymaps ()
@ -214,9 +262,13 @@
(define-key input-map "S" submap)
(define-key submap "t" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . keymap-s-or-evil-func--evilified-input-map-s)
(83 . keymap-S-or-keymap-s--evilified-input-map-S)
(19 . keymap-S--evilified-input-map-C-s))
(should (equal '((115 keymap (116 . func))
(83 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 keymap (116 . func))
(83 keymap (116 . func))
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-keymaps-2-evilified ()
@ -230,10 +282,14 @@
(define-key input-map "S" submap)
(define-key submap "t" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . keymap-s-or-evil-func1--evilified-input-map-s)
(83 . keymap-S-or-evil-func2--evilified-input-map-S)
(19 . keymap-s--evilified-input-map-C-s)
(33554451 . keymap-S--evilified-input-map-C-S-s))
(should (equal '((115 keymap (116 . func))
(83 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 keymap (116 . func))
(19 keymap (116 . func))
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-C-s-keymaps ()
@ -247,10 +303,15 @@
(define-key input-map (kbd "C-s") submap)
(define-key submap "t" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . keymap-s-or-evil-func--evilified-input-map-s)
(83 . keymap-S-or-keymap-s--evilified-input-map-S)
(19 . keymap-C-s-or-keymap-S--evilified-input-map-C-s)
(33554451 . keymap-C-s--evilified-input-map-C-S-s))
(should (equal '((115 keymap (116 . func))
(83 keymap (116 . func))
(19 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 keymap (116 . func))
(19 keymap (116 . func))
(83 keymap (116 . func))
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--s-S-C-s-keymaps-2-evilified ()
@ -269,10 +330,15 @@
((:record-cls 'mocker-stub-record
:output nil :occur 1))))
(spacemacs|evilify-map input-map)
(should (equal '((115 . keymap-s-or-evil-func1--evilified-input-map-s)
(83 . keymap-S-or-evil-func2--evilified-input-map-S)
(19 . keymap-C-s-or-keymap-s--evilified-input-map-C-s)
(33554451 . keymap-S--evilified-input-map-C-S-s))
(should (equal '((115 keymap (116 . func))
(83 keymap (116 . func))
(19 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(33554451 keymap (116 . func))
(19 keymap (116 . func))
(83 . evil-func2)
(115 . evil-func1)))
(spacemacs//evilify-sort-keymap input-map))))))
;; commands and keymaps
@ -287,9 +353,13 @@
(define-key input-map "S" submap)
(define-key submap "t" 'func)
(spacemacs|evilify-map input-map)
(should (equal '((115 . func-or-evil-func--evilified-input-map-s)
(83 . keymap-S-or-func--evilified-input-map-S)
(19 . keymap-S--evilified-input-map-C-s))
(should (equal '((115 . func)
(83 keymap (116 . func))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 keymap (116 . func))
(83 . func)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
;; idem-potency
@ -307,11 +377,15 @@
(define-key submap "t" 'func)
(dotimes (_ 10)
(spacemacs|evilify-map input-map))
(should (equal '((115 . func2-or-evil-func--evilified-input-map-s)
(should (equal '((115 . func2)
(101 . func1)
(83 . keymap-S-or-func2--evilified-input-map-S)
(19 . keymap-S--evilified-input-map-C-s)
(3 . (keymap (24 . func3))))
(83 keymap (116 . func))
(3 keymap (24 . func3))
(evilified-state
keymap "Auxiliary keymap for evilified state"
(19 keymap (116 . func))
(83 . func2)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
;; eval-after-load
@ -324,11 +398,13 @@
(define-key input-map "s" 'func)
;; pass a feature already loaded at the time of calling
(spacemacs|evilify-map input-map :eval-after-load core-funcs)
(should (equal '((115 . func-or-evil-func--evilified-input-map-s)
(83 . func--evilified-input-map-S))
(should (equal '((115 . func)
(evilified-state
keymap "Auxiliary keymap for evilified state"
(83 . func)
(115 . evil-func)))
(spacemacs//evilify-sort-keymap input-map)))))
(ert-deftest test-evilify-map--eval-after-load-not-loaded ()
(let ((evil-evilified-state-map (let ((evil-map (make-sparse-keymap)))
(define-key evil-map "s" 'evil-func)