[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Suggestion for improving ergonomics of repeat-maps: define-repeat-map
From: |
acdw |
Subject: |
Suggestion for improving ergonomics of repeat-maps: define-repeat-map |
Date: |
Wed, 08 Sep 2021 03:22:15 +0000 |
User-agent: |
Cyrus-JMAP/3.5.0-alpha0-1215-g0d2d495392-fm-20210907.001-g0d2d4953 |
Hi Emacs maintainers!
I've written a package[1] for my own ease of use in defining repeat-maps for
Emacs 28, and a few people have told me I should see about adding it to Emacs
proper. So here we are.
The elevator pitch:
The new functionality defined in repeat.el in Emacs 28 is very useful, but
usually requires a large amount of configuration, to wit:
~~~
(defalias 'forward-word-with-case 'forward-word
"Alias for `forward-word' for use in `case-repeat-map'.")
(defalias 'backward-word-with-case 'backward-word
"Alias for `backward-word for use in `case-repeat-map'.")
(defvar case-repeat-map
(let ((map (make-sparse-keymap)))
(define-key map "c" #'capitalize-word)
(define-key map "u" #'upcase-word)
(define-key map "l" #'downcase-word)
;; movement
(define-key map "f" #'forward-word-with-case)
(define-key map "b" #'backward-word-with-case)
map)
"A map to repeat word-casing commands. For use with `repeat-mode'.")
(dolist (command '(capitalize-word
capitalize-dwim
upcase-word
upcase-dwim
downcase-word
downcase-dwim
forward-word-with-case
backward-word-with-case))
(put command 'repeat-map 'case-repeat-map))
~~~
I wrote the macro `define-repeat-map' to alleviate this large amount of
configuration. Using this macro, the above turns into this:
~~~
(define-repeat-map case
("c" capitalize-word
"u" upcase-word
"l" downcase-word)
(:continue "f" forward-word
"b" backward-word)
(:enter downcase-dwim
upcase-dwim
capitalize-dwim))
~~~
As you can see, `define-repeat-map' makes it easier to not only define
repeating keys for commands, but to define commands that can enter the keymap,
keys that are in the keymap and can continue the binds, but not enter the map,
and commands that will exit the map when they're pressed. I was inspired by
the repeaters[2] package on GitHub, but wrote my own because I wanted better
(to me) ergonomics.
Please let me know what you think about this macro and package. I've written
some elisp for my own enjoyment but never submitted a package to Emacs, or
looked into including it in core. I'm open to any and all suggestions,
including simply adding this package to GNU ELPA.
Thanks for all you do!
[1]: https://tildegit.org/acdw/define-repeat-map.el/
--
~ acdw (Case Duckworth)
https://www.acdw.net | https://breadpunk.club/~breadw