emacs-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]