Add evil-collection-translate-minor-mode-key (#498)
This commit is contained in:
parent
ceac1a9681
commit
b1c37b8ad0
|
@ -582,6 +582,73 @@ modes in the current buffer."
|
||||||
nil "^[^.]")))))
|
nil "^[^.]")))))
|
||||||
(find-file (evil-collection--mode-file mode "README.org")))
|
(find-file (evil-collection--mode-file mode "README.org")))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(cl-defun evil-collection-translate-minor-mode-key (states modes
|
||||||
|
&rest translations
|
||||||
|
&key destructive
|
||||||
|
&allow-other-keys)
|
||||||
|
"Similar to `evil-collection-translate-key' but for minor modes."
|
||||||
|
|
||||||
|
"Translate keys in the keymap(s) corresponding to STATES and MODES.
|
||||||
|
STATES should be the name of an evil state, a list of states, or nil. MODES
|
||||||
|
should be a symbol corresponding to minor-mode to make the translations in or a
|
||||||
|
list of minor-mode symbols. TRANSLATIONS corresponds to a list of
|
||||||
|
key replacement pairs. For example, specifying \"a\" \"b\" will bind \"a\" to
|
||||||
|
\"b\"'s definition in the keymap. Specifying nil as a replacement will unbind a
|
||||||
|
key. If DESTRUCTIVE is nil, a backup of the keymap will be stored on the initial
|
||||||
|
invocation, and future invocations will always look up keys in the backup
|
||||||
|
keymap. When no TRANSLATIONS are given, this function will only create the
|
||||||
|
backup keymap without making any translations. On the other hand, if DESTRUCTIVE
|
||||||
|
is non-nil, the keymap will be destructively altered without creating a backup.
|
||||||
|
For example, calling this function multiple times with \"a\" \"b\" \"b\" \"a\"
|
||||||
|
would continue to swap and unswap the definitions of these keys. This means that
|
||||||
|
when DESTRUCTIVE is non-nil, all related swaps/cycles should be done in the same
|
||||||
|
invocation."
|
||||||
|
(declare (indent defun))
|
||||||
|
(unless (listp modes)
|
||||||
|
(setq modes (list modes)))
|
||||||
|
(unless (and (listp states)
|
||||||
|
(not (null states)))
|
||||||
|
(setq states (list states)))
|
||||||
|
(dolist (mode-symbol modes)
|
||||||
|
(dolist (state states)
|
||||||
|
(evil-collection--translate-minor-mode-key
|
||||||
|
state mode-symbol translations destructive))))
|
||||||
|
|
||||||
|
(defun evil-collection--translate-minor-mode-key (state
|
||||||
|
mode-symbol
|
||||||
|
translations
|
||||||
|
destructive)
|
||||||
|
"Helper function for `evil-collection-translate-minor-mode-key'.
|
||||||
|
In the minor mode keymap corresponding to STATE and MODE-SYMBOL, make the key
|
||||||
|
TRANSLATIONS. When DESTRUCTIVE is non-nil, make the TRANSLATIONS destructively
|
||||||
|
without creating/referencing a backup keymap."
|
||||||
|
(let* ((keymap-symbol (intern (format "%S-map" mode-symbol)))
|
||||||
|
(backup-keymap-symbol (intern (format "evil-collection-%s%s-backup-map"
|
||||||
|
mode-symbol
|
||||||
|
(if state
|
||||||
|
(format "-%s-state" state)
|
||||||
|
""))))
|
||||||
|
(keymap (symbol-value keymap-symbol))
|
||||||
|
(lookup-keymap (if (and (not destructive)
|
||||||
|
(boundp backup-keymap-symbol))
|
||||||
|
(symbol-value backup-keymap-symbol)
|
||||||
|
(copy-keymap
|
||||||
|
(if state
|
||||||
|
(evil-get-minor-mode-keymap state mode-symbol)
|
||||||
|
;; (evil-get-auxiliary-keymap keymap state t t)
|
||||||
|
keymap))))
|
||||||
|
(maps (cl-loop for (key replacement) on translations by 'cddr
|
||||||
|
;; :destructive can be in TRANSLATIONS
|
||||||
|
unless (keywordp key)
|
||||||
|
collect key
|
||||||
|
and collect (when replacement
|
||||||
|
(lookup-key lookup-keymap replacement)))))
|
||||||
|
(unless (or destructive
|
||||||
|
(boundp backup-keymap-symbol))
|
||||||
|
(set backup-keymap-symbol lookup-keymap))
|
||||||
|
(apply #'evil-define-minor-mode-key state mode-symbol maps)))
|
||||||
|
|
||||||
(defun evil-collection--translate-key (state keymap-symbol
|
(defun evil-collection--translate-key (state keymap-symbol
|
||||||
translations
|
translations
|
||||||
destructive)
|
destructive)
|
||||||
|
@ -665,6 +732,21 @@ should consist of key swaps (e.g. \"a\" \"b\" is equivalent to \"a\" \"b\" \"b\"
|
||||||
collect replacement and collect key))
|
collect replacement and collect key))
|
||||||
`(evil-collection-translate-key ,states ,keymaps ,@args))
|
`(evil-collection-translate-key ,states ,keymaps ,@args))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defmacro evil-collection-swap-minor-mode-key (states modes &rest args)
|
||||||
|
"Wrapper around `evil-collection-translate-minor-mode-key' for swapping keys.
|
||||||
|
STATES, MODES, and ARGS are passed to
|
||||||
|
`evil-collection-translate-minor-mode-key'. ARGS should consist of key swaps
|
||||||
|
(e.g. \"a\" \"b\" is equivalent to \"a\" \"b\" \"b\" \"a\"
|
||||||
|
with `evil-collection-translate-minor-mode-key') and optionally keyword
|
||||||
|
arguments for `evil-collection-translate-minor-mode-key'."
|
||||||
|
(declare (indent defun))
|
||||||
|
(setq args (cl-loop for (key replacement) on args by 'cddr
|
||||||
|
collect key and collect replacement
|
||||||
|
and unless (keywordp key)
|
||||||
|
collect replacement and collect key))
|
||||||
|
`(evil-collection-translate-minor-mode-key ,states ,modes ,@args))
|
||||||
|
|
||||||
;;;###autoload
|
;;;###autoload
|
||||||
(defun evil-collection-require (mode &optional noerror)
|
(defun evil-collection-require (mode &optional noerror)
|
||||||
"Require the evil-collection-MODE file, but do not activate it.
|
"Require the evil-collection-MODE file, but do not activate it.
|
||||||
|
|
22
readme.org
22
readme.org
|
@ -567,6 +567,28 @@ more.
|
||||||
":" ";")
|
":" ";")
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
|
In some cases, keys are bound through `evil-define-minor-mode-key` and may
|
||||||
|
need to be translated using ~evil-collection-translate-minor-mode-key~ and/or
|
||||||
|
~evil-collection-swap-minor-mode-key~.
|
||||||
|
|
||||||
|
#+begin_src emacs-lisp
|
||||||
|
(evil-collection-swap-minor-mode-key '(normal motion)
|
||||||
|
'(evil-snipe-local-mode evil-snipe-override-local-mode)
|
||||||
|
"k" "s"
|
||||||
|
;; Set this to t to make this swap the keys everytime
|
||||||
|
;; this expression is evaluated.
|
||||||
|
:destructive nil)
|
||||||
|
|
||||||
|
(evil-collection-translate-minor-mode-key
|
||||||
|
'(normal motion)
|
||||||
|
'(evil-snipe-local-mode evil-snipe-override-local-mode)
|
||||||
|
"k" "s"
|
||||||
|
"s" "k"
|
||||||
|
;; Set this to t to make this swap the keys everytime
|
||||||
|
;; this expression is evaluated.
|
||||||
|
:destructive nil)
|
||||||
|
#+end_src
|
||||||
|
|
||||||
** Third-party packages
|
** Third-party packages
|
||||||
|
|
||||||
Third-party packages are provided by several parties:
|
Third-party packages are provided by several parties:
|
||||||
|
|
Loading…
Reference in New Issue