[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: `define-key' in `defadvice' takes effect only after second invocatio
From: |
Alexander Shukaev |
Subject: |
Re: `define-key' in `defadvice' takes effect only after second invocation |
Date: |
Wed, 2 Sep 2015 22:45:58 +0200 |
> (require 'devil-common)
> (require 'devil-core)
> (require 'devil-states)
> ;;
> (defgroup devil-repeat-motion
> nil
> "Devil repeat motion."
> :group 'devil
> :prefix 'devil-repeat-motion)
> ;;
> (defcustom devil-repeat-motion-key
> (kbd "SPC")
> "Key used to repeat (last) motion."
> :group 'devil-repeat-motion
> :type 'key-sequence)
> ;;
> (defcustom devil-repeat-motion-key-reverse
> (kbd "S-SPC")
> "Key used to repeat (last) motion in reverse direction."
> :group 'devil-repeat-motion
> :type 'key-sequence)
> ;;
> ;;;###autoload
> (defun devil-repeat-motion
> (key-or-command
> key-or-command-next
> key-or-command-previous
> &optional keymap)
> "\
> Make KEY-OR-COMMAND repeatable."
> (setq keymap (or keymap evil-motion-state-map))
> (let ((command (devil-key-command key-or-command keymap))
> (command-next (devil-key-command key-or-command-next keymap))
> (command-previous (devil-key-command key-or-command-previous keymap)))
> (eval
> `(defadvice ,command
> (before
> ,(intern (format "devil-repeat-motion--%s" (symbol-name command)))
> activate)
> ,(format "\
> Make `%s' repeatable.
> Repeatable with `%s'.
> Repeatable with `%s' in reverse direction."
> command
> command-next
> command-previous)
> (unless (eq last-command #',command)
> (evil-define-key 'motion devil-repeat-motion-mode-map
> ,devil-repeat-motion-key #',command-next
> ,devil-repeat-motion-key-reverse #',command-previous))))
> (list command
> command-next
> command-previous)))
> ;;
> ;;;###autoload
> (defmacro devil-repeat-motions
> (&rest ...)
> "Apply `devil-repeat-motion' to each three consecutive arguments.
> Return list of results where each element is the return value of the
> corresponding `devil-repeat-motion' application."
> (declare (debug t)
> (indent defun))
> (let (body)
> (while ...
> (push `(devil-repeat-motion ,(pop ...) ,(pop ...) ,(pop ...)) body))
> (setq body (nreverse body))
> `(list ,@body)))
> ;;
> ;;;###autoload
> (define-minor-mode devil-repeat-motion-mode
> "\
> Devil repeat motion mode."
> :global t
> :group 'devil-repeat-motion
> :keymap (make-sparse-keymap)
> :lighter " DRM")
> ;;
> (provide 'devil-repeat-motion)
Right, I found the problem. Indeed, Evil needs the commit of key
bindings with `evil-normalize-keymaps'. Hence, had to add the
following:
(define-minor-mode devil-repeat-motion-mode
"\
Devil repeat motion mode."
:global t
:group 'devil-repeat-motion
:keymap (make-sparse-keymap)
:lighter " DRM"
(evil-normalize-keymaps)) ;; <<<
and
(unless (eq last-command #',command)
(evil-define-key 'motion devil-repeat-motion-mode-map
,devil-repeat-motion-key #',command-next
,devil-repeat-motion-key-reverse #',command-previous)
(evil-normalize-keymaps)))) ;; <<<
Works as expected now. Sorry, for the noise.