Juri Linkov writes: I'm still seeing some bindings displayed incorrectly: Source Code: https://github.com/tvraman/emacspeak/blob/master/lisp/emacspeak-m-player.el#L320 Example of problem: In the below extract from the help buffer for describe-repeat-maps, note that some keys are not printed, e.g.M-; I'll annotate the problem lines with "#" where is what should have been displayed. ‘emacspeak-m-player-mode-map’ keymap is repeatable by these commands: ‘emacspeak-eww-play-media-at-point’ (bound to ) # ‘emacspeak-m-player-add-autopan’ (bound to a) ‘emacspeak-m-player-add-autosat’ (bound to z) ‘emacspeak-m-player-add-equalizer’ (bound to E) ‘emacspeak-m-player-add-filter’ (bound to f) ‘emacspeak-m-player-amark-add’ (bound to A) ‘emacspeak-m-player-amark-jump’ (bound to j) ‘emacspeak-m-player-amark-save’ (bound to S) ‘emacspeak-m-player-apply-reverb-preset’ (bound to P) ‘emacspeak-m-player-backward-10min’ (bound to ) ‘emacspeak-m-player-backward-10s’ (bound to , ,) ‘emacspeak-m-player-backward-1min’ (bound to , <) ‘emacspeak-m-player-beginning-of-track’ (bound to ) ‘emacspeak-m-player-clear-filters’ (bound to C) ‘emacspeak-m-player-customize-options’ (bound to o) ‘emacspeak-m-player-delete-filter’ (bound to d) ‘emacspeak-m-player-display-metadata’ (bound to M) ‘emacspeak-m-player-display-percent’ (bound to %) ‘emacspeak-m-player-display-position’ (bound to ?) ‘emacspeak-m-player-double-speed’ (bound to }) ‘emacspeak-m-player-edit-reverb’ (bound to R) ‘emacspeak-m-player-end-of-track’ (bound to ) ‘emacspeak-m-player-equalizer-preset’ (bound to e) ‘emacspeak-m-player-faster’ (bound to ]) ‘emacspeak-m-player-forward-10min’ (bound to ) ‘emacspeak-m-player-forward-10s’ (bound to , .) ‘emacspeak-m-player-forward-1min’ (bound to >, ) ‘emacspeak-m-player-from-history’ (bound to h) ‘emacspeak-m-player-get-length’ (bound to L) ‘emacspeak-m-player-half-speed’ (bound to {) ‘emacspeak-m-player-left-channel’ (bound to () ‘emacspeak-m-player-load’ (bound to RET) ‘emacspeak-m-player-loop’ (bound to )# ‘emacspeak-m-player-mode-line’ (bound to m) ‘emacspeak-m-player-next-track’ (bound to n) ‘emacspeak-m-player-pan’ (bound to x) ‘emacspeak-m-player-pause’ (bound to SPC) ‘emacspeak-m-player-persist-process’ (bound to \) ‘emacspeak-m-player-play-tracks-jump’ (bound to t) ‘emacspeak-m-player-pop-to-player’ (bound to ;) ‘emacspeak-m-player-previous-track’ (bound to p) ‘emacspeak-m-player-reset-options’ (bound to O) ‘emacspeak-m-player-reset-speed’ (bound to DEL) ‘emacspeak-m-player-restore-process’ (bound to /) ‘emacspeak-m-player-right-channel’ (bound to )) ‘emacspeak-m-player-run-jump’ (bound to J) ‘emacspeak-m-player-scale-speed’ (bound to s) ‘emacspeak-m-player-seek-absolute’ (bound to g) ‘emacspeak-m-player-seek-percentage’ (bound to G) ‘emacspeak-m-player-seek-relative’ (bound to r) ‘emacspeak-m-player-shuffle’ (bound to ) #<:> ‘emacspeak-m-player-slave-command’ (bound to c) ‘emacspeak-m-player-slower’ (bound to [) ‘emacspeak-m-player-store-link’ (bound to l) ‘emacspeak-m-player-stream-info’ (bound to i) ‘emacspeak-m-player-url’ (bound to u) ‘emacspeak-m-player-using-openal’ (bound to ) #<:> ‘emacspeak-m-player-volume-change’ (bound to v) ‘emacspeak-m-player-volume-down’ (bound to -) ‘emacspeak-m-player-volume-set’ (bound to 9, 8, 7, 6, 5, 4, 3, 2, 1) ‘emacspeak-m-player-volume-up’ (bound to =, +) ‘emacspeak-m-player-write-clip’ (bound to w) ‘emacspeak-m-player-youtube-live’ (bound to ) # ‘emacspeak-media-38-dc-books’ (bound to ) ‘emacspeak-media-brain-sync’ (bound to ) # ‘emacspeak-media-classical’ (bound to ) # ‘emacspeak-media-devotional’ (bound to ) ‘emacspeak-media-indian’ (bound to ) ‘emacspeak-media-mp3’ (bound to ) ‘emacspeak-media-pop’ (bound to ) ‘emacspeak-multimedia’ (bound to ) >> Thanks, this reference helped to understand that >> emacspeak-m-player-bind-accelerator binds only global keys, >> not keys in the repeat map. Here is a short test case >> that confirms this: >> >> (repeat-mode 1) >> (keymap-set global-map "C-; 1" (defun test-repeat-next-line () (interactive) (next-line))) >> (defvar-keymap test-repeat-map) >> (put 'test-repeat-next-line 'repeat-map 'test-repeat-map) >> >> And indeed 'describe-repeat-maps' outputs empty "(bound to )". >> This is because the keys in the global map used to enter the >> repeatable sequence currently are not handled by 'describe-repeat-maps'. >> This should be fixed before the next release. > > Here is a patch that uses outlines, and outputs the commands > that enter and exit the repeat-map. For example, > > * ‘buffer-navigation-repeat-map’ > > Entered with: ‘test-enter-next-line’ > Exited with: ‘test-exit-next-line’ > > Key Binding > previous-buffer > next-buffer > > These two lines from the patch show the difference between the > commands that enter and exit the repeat-map: > > (setq commands-enter (seq-difference repeat-commands map-commands)) > (setq commands-exit (seq-difference map-commands repeat-commands)) > > where 'repeat-commands' are commands with the symbol property 'repeat-map', > and 'map-commands' are commands existing in the map. > > diff --git a/lisp/repeat.el b/lisp/repeat.el > index 0ae68d6024d..5f19479a1e8 100644 > --- a/lisp/repeat.el > +++ b/lisp/repeat.el > @@ -588,21 +588,32 @@ describe-repeat-maps > (when (and (symbolp (car a)) > (symbolp (car b))) > (string-lessp (car a) (car b)))))) > - (insert (format-message > - "`%s' keymap is repeatable by these commands:\n" > - (car keymap))) > - (dolist (command (sort (cdr keymap) #'string-lessp)) > - (let* ((info (help-fns--analyze-function command)) > - (map (list (if (symbolp (car keymap)) > - (symbol-value (car keymap)) > - (car keymap)))) > - (desc (mapconcat (lambda (key) > - (propertize (key-description key) > - 'face 'help-key-binding)) > - (or (where-is-internal command map) > - (where-is-internal (nth 3 info) map)) > - ", "))) > - (insert (format-message " `%s' (bound to %s)\n" command desc)))) > + (insert (format-message "* `%s'\n" (car keymap))) > + > + (let* ((map (if (symbolp (car keymap)) > + (symbol-value (car keymap)) > + (car keymap))) > + (repeat-commands (cdr keymap)) > + map-commands commands-enter commands-exit) > + (map-keymap (lambda (_key cmd) (when (symbolp cmd) (push cmd map-commands))) map) > + (setq map-commands (seq-uniq map-commands)) > + (setq commands-enter (seq-difference repeat-commands map-commands)) > + (setq commands-exit (seq-difference map-commands repeat-commands)) > + > + (when (or commands-enter commands-exit) (insert "\n")) > + (when commands-enter > + (insert (concat "Entered with: " > + (mapconcat (lambda (cmd) (format-message "`%s'" cmd)) > + commands-enter ", ") > + "\n"))) > + (when commands-exit > + (insert (concat "Exited with: " > + (mapconcat (lambda (cmd) (format-message "`%s'" cmd)) > + commands-exit ", ") > + "\n")))) > + > + (when (symbolp (car keymap)) > + (insert (substitute-command-keys (format-message "\\{%s}" (car keymap))))) > (insert "\n"))))))) > > (provide 'repeat) > > >> Also it was suggested to allow specifying the keys that enter >> the repeatable sequence and exit it, by an additional keyword >> in defvar-keymap, or by adding a new macro defvar-repeat-keymap. >> This could be implemented as well. > > This is implemented now in a separate patch. > -- Thanks, --Raman(I Search, I Find, I Misplace, I Research) ♈ Id: kg:/m/0285kf1 🦮