unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* Get key-binding for a command and print key binding in kbd syntax
@ 2023-02-09  8:33 Tassilo Horn
  2023-02-09 10:28 ` Robert Pluim
  0 siblings, 1 reply; 10+ messages in thread
From: Tassilo Horn @ 2023-02-09  8:33 UTC (permalink / raw)
  To: help-gnu-emacs

Hi all,

someone asked on another list if mu4e could replace its main buffer's
content, parts of which looks like

  Maildirs

	* [ji] /Fastmail/GNU                                 0/1244
	* [ja] /Fastmail/Archive                             0/8976
	* [jb] /Fastmail/Drafts                              0/24

where j is the key bound to the mu4e-search-maildir command by default,
with the correct key bound in its mode's map.  I.e., right now, j is
hard-coded and conforms to the standard binding but is wrong when you
define-key it otherwise.

So the question is: how do you get the key(s) for a command?
`where-is-internal' looks promising giving ([106] [menu-bar mu4e Search\
maildir]) where 106 is the char ?j.  If that's the right way, is numeric
vector vs. vector of symbols the right way to distinguish key bindings
from menu items?

And the other question: how to I convert such a key binding vector to a
string in kbd syntax for display purposes?

Thanks,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09  8:33 Get key-binding for a command and print key binding in kbd syntax Tassilo Horn
@ 2023-02-09 10:28 ` Robert Pluim
  2023-02-09 10:50   ` Tassilo Horn
  0 siblings, 1 reply; 10+ messages in thread
From: Robert Pluim @ 2023-02-09 10:28 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: help-gnu-emacs

>>>>> On Thu, 09 Feb 2023 09:33:16 +0100, Tassilo Horn <tsdh@gnu.org> said:

    Tassilo> Hi all,
    Tassilo> someone asked on another list if mu4e could replace its main buffer's
    Tassilo> content, parts of which looks like

    Tassilo>   Maildirs

    Tassilo> 	* [ji] /Fastmail/GNU                                 0/1244
    Tassilo> 	* [ja] /Fastmail/Archive                             0/8976
    Tassilo> 	* [jb] /Fastmail/Drafts                              0/24

    Tassilo> where j is the key bound to the mu4e-search-maildir command by default,
    Tassilo> with the correct key bound in its mode's map.  I.e., right now, j is
    Tassilo> hard-coded and conforms to the standard binding but is wrong when you
    Tassilo> define-key it otherwise.

    Tassilo> So the question is: how do you get the key(s) for a command?
    Tassilo> `where-is-internal' looks promising giving ([106] [menu-bar mu4e Search\
    Tassilo> maildir]) where 106 is the char ?j.  If that's the right way, is numeric
    Tassilo> vector vs. vector of symbols the right way to distinguish key bindings
    Tassilo> from menu items?

`substitute-command-keys'

    Tassilo> And the other question: how to I convert such a key binding vector to a
    Tassilo> string in kbd syntax for display purposes?

`key-description'

Robert
-- 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 10:28 ` Robert Pluim
@ 2023-02-09 10:50   ` Tassilo Horn
  2023-02-09 11:09     ` Tassilo Horn
  0 siblings, 1 reply; 10+ messages in thread
From: Tassilo Horn @ 2023-02-09 10:50 UTC (permalink / raw)
  To: Robert Pluim; +Cc: help-gnu-emacs

Robert Pluim <rpluim@gmail.com> writes:

Hi Robert,

>     Tassilo> So the question is: how do you get the key(s) for a
>     Tassilo> command?  `where-is-internal' looks promising giving
>     Tassilo> ([106] [menu-bar mu4e Search\ maildir]) where 106 is the
>     Tassilo> char ?j.  If that's the right way, is numeric vector
>     Tassilo> vs. vector of symbols the right way to distinguish key
>     Tassilo> bindings from menu items?
>
> `substitute-command-keys'

Oh, yeah, I've forgotten about that one.  I think that will do
everything I need in one go.

Thanks a lot!

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 10:50   ` Tassilo Horn
@ 2023-02-09 11:09     ` Tassilo Horn
  2023-02-09 11:44       ` Robert Pluim
  0 siblings, 1 reply; 10+ messages in thread
From: Tassilo Horn @ 2023-02-09 11:09 UTC (permalink / raw)
  Cc: Robert Pluim, help-gnu-emacs

Tassilo Horn <tsdh@gnu.org> writes:

>>     Tassilo> So the question is: how do you get the key(s) for a
>>     Tassilo> command?  `where-is-internal' looks promising giving
>>     Tassilo> ([106] [menu-bar mu4e Search\ maildir]) where 106 is the
>>     Tassilo> char ?j.  If that's the right way, is numeric vector
>>     Tassilo> vs. vector of symbols the right way to distinguish key
>>     Tassilo> bindings from menu items?
>>
>> `substitute-command-keys'
>
> Oh, yeah, I've forgotten about that one.  I think that will do
> everything I need in one go.

Oh, not quite.  Right now, there's for example a "[C]ompose a new mail"
text where the C also has a keymap property which would invoke the
respective command on mouse-2 and RET.  `substitute-command-keys'
doesn't allow doing that out of the box.  So one would need to iterate
over occurrences of the help-key-binding face afterwards, translate back
to the command and add a keymap property.

How do I lookup a command for the printed key description?

  (keymap-lookup nil "C-c C-c")
  ;=> message-send-and-exit

works but is too new to be used for packages supporting older emacsen.
Is

  (lookup-key (current-local-map) (kbd "C-c C-c"))

the right incarnation?

Bye,
Tassilo  



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 11:09     ` Tassilo Horn
@ 2023-02-09 11:44       ` Robert Pluim
  2023-02-09 11:58         ` Tassilo Horn
  0 siblings, 1 reply; 10+ messages in thread
From: Robert Pluim @ 2023-02-09 11:44 UTC (permalink / raw)
  To: help-gnu-emacs

>>>>> On Thu, 09 Feb 2023 12:09:14 +0100, Tassilo Horn <tsdh@gnu.org> said:
    Tassilo> Oh, not quite.  Right now, there's for example a "[C]ompose a new mail"
    Tassilo> text where the C also has a keymap property which would invoke the
    Tassilo> respective command on mouse-2 and RET.  `substitute-command-keys'
    Tassilo> doesn't allow doing that out of the box.  So one would need to iterate
    Tassilo> over occurrences of the help-key-binding face afterwards, translate back
    Tassilo> to the command and add a keymap property.

    Tassilo> How do I lookup a command for the printed key description?

    Tassilo>   (keymap-lookup nil "C-c C-c")
    Tassilo>   ;=> message-send-and-exit

    Tassilo> works but is too new to be used for packages supporting
    Tassilo> older emacsen.

I think `keymap-lookup' will be in `compat' when emacs-29 comes out

    Tassilo> Is

    Tassilo>   (lookup-key (current-local-map) (kbd "C-c C-c"))

    Tassilo> the right incarnation?

For a 'keymap property? Probably

    (get-char-property (point) 'keymap)

is needed to get the right map. `current-local-map' is for the buffer.

Robert
-- 




^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 11:44       ` Robert Pluim
@ 2023-02-09 11:58         ` Tassilo Horn
  2023-02-09 12:20           ` Robert Pluim
  0 siblings, 1 reply; 10+ messages in thread
From: Tassilo Horn @ 2023-02-09 11:58 UTC (permalink / raw)
  To: help-gnu-emacs

Robert Pluim <rpluim@gmail.com> writes:

>     Tassilo> How do I lookup a command for the printed key description?
>
>     Tassilo>   (keymap-lookup nil "C-c C-c")
>     Tassilo>   ;=> message-send-and-exit
>
>     Tassilo> works but is too new to be used for packages supporting
>     Tassilo> older emacsen.
>
> I think `keymap-lookup' will be in `compat' when emacs-29 comes out

AFAIK, mu4e doesn't use the compat library (yet) since you cannot
install it from ELPA or some other archive anyhow given that it's
tightly coupled to mu mail indexer, i.e., the C++ and the elisp parts
must be compatible.

>     Tassilo> Is
>
>     Tassilo>   (lookup-key (current-local-map) (kbd "C-c C-c"))
>
>     Tassilo> the right incarnation?
>
> For a 'keymap property? Probably
>
>     (get-char-property (point) 'keymap)
>
> is needed to get the right map. `current-local-map' is for the buffer.

No, no.  I've meant that with substitute-command-keys I have the correct
key-descriptions in the buffer with help-key-binding face.  However, I
would also like to have them clickable so I think I need to "parse" the
buffer and add keymap properties to the text having the help-key-binding
face.

So for example, there is the text "[j]ump to some maildir" where the j
is a key-description (recognizable by its help-key-binding face), I need
to translate back the j to the command mu4e-search-maildir in order to
add a keymap where RET and mouse-2 are bound to that command.

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 11:58         ` Tassilo Horn
@ 2023-02-09 12:20           ` Robert Pluim
  2023-02-09 12:22             ` Tassilo Horn
  0 siblings, 1 reply; 10+ messages in thread
From: Robert Pluim @ 2023-02-09 12:20 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: help-gnu-emacs

>>>>> On Thu, 09 Feb 2023 12:58:37 +0100, Tassilo Horn <tsdh@gnu.org> said:

    Tassilo> No, no.  I've meant that with substitute-command-keys I have the correct
    Tassilo> key-descriptions in the buffer with help-key-binding face.  However, I
    Tassilo> would also like to have them clickable so I think I need to "parse" the
    Tassilo> buffer and add keymap properties to the text having the help-key-binding
    Tassilo> face.

    Tassilo> So for example, there is the text "[j]ump to some maildir" where the j
    Tassilo> is a key-description (recognizable by its help-key-binding face), I need
    Tassilo> to translate back the j to the command mu4e-search-maildir in order to
    Tassilo> add a keymap where RET and mouse-2 are bound to that command.

Iʼm not sure Iʼm getting it.

- You insert (substitute-command-keys "\\[mu4e-search-maildir]")
- At that point you can add a 'keymap property to the text youʼve just
  inserted, binding RET and mouse-2 to #'mu4e-search-maildir

Why do you need to lookup "j" in the local map at all?

(as an aside, clickable stuff is probably better done with buttons
than by inventing your own thing).

Robert
-- 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 12:20           ` Robert Pluim
@ 2023-02-09 12:22             ` Tassilo Horn
  2023-02-09 13:46               ` Robert Pluim
  0 siblings, 1 reply; 10+ messages in thread
From: Tassilo Horn @ 2023-02-09 12:22 UTC (permalink / raw)
  To: Robert Pluim; +Cc: help-gnu-emacs

Robert Pluim <rpluim@gmail.com> writes:

> Iʼm not sure Iʼm getting it.
>
> - You insert (substitute-command-keys "\\[mu4e-search-maildir]")
> - At that point you can add a 'keymap property to the text youʼve just
>   inserted, binding RET and mouse-2 to #'mu4e-search-maildir

Ah, yes, you are right.  I imagined I would compute a large string with
different \[foo] and \[bar] occurrences and then pass the whole thing
through substitute-command-keys.  If I do it in small parts, it
obviously becomes much easier.  Sometimes I don't see the forest for the
trees. :-)

> (as an aside, clickable stuff is probably better done with buttons
> than by inventing your own thing).

Well, maybe, but if possible I'd rather keep it the way it already is
UI-wise, just make it correct in the presence of non-default bindings.

Thanks again,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 12:22             ` Tassilo Horn
@ 2023-02-09 13:46               ` Robert Pluim
  2023-02-09 14:10                 ` Tassilo Horn
  0 siblings, 1 reply; 10+ messages in thread
From: Robert Pluim @ 2023-02-09 13:46 UTC (permalink / raw)
  To: Tassilo Horn; +Cc: help-gnu-emacs

>>>>> On Thu, 09 Feb 2023 13:22:21 +0100, Tassilo Horn <tsdh@gnu.org> said:

    Tassilo> Robert Pluim <rpluim@gmail.com> writes:
    >> Iʼm not sure Iʼm getting it.
    >> 
    >> - You insert (substitute-command-keys "\\[mu4e-search-maildir]")
    >> - At that point you can add a 'keymap property to the text youʼve just
    >> inserted, binding RET and mouse-2 to #'mu4e-search-maildir

    Tassilo> Ah, yes, you are right.  I imagined I would compute a large string with
    Tassilo> different \[foo] and \[bar] occurrences and then pass the whole thing
    Tassilo> through substitute-command-keys.  If I do it in small parts, it
    Tassilo> obviously becomes much easier.  Sometimes I don't see the forest for the
    Tassilo> trees. :-)

Breaking things into small parts is the essence of computer
programming :-)

Robert
-- 



^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: Get key-binding for a command and print key binding in kbd syntax
  2023-02-09 13:46               ` Robert Pluim
@ 2023-02-09 14:10                 ` Tassilo Horn
  0 siblings, 0 replies; 10+ messages in thread
From: Tassilo Horn @ 2023-02-09 14:10 UTC (permalink / raw)
  To: Robert Pluim; +Cc: help-gnu-emacs

Robert Pluim <rpluim@gmail.com> writes:

>     Tassilo> Ah, yes, you are right.  I imagined I would compute a
>     Tassilo> large string with different \[foo] and \[bar] occurrences
>     Tassilo> and then pass the whole thing through
>     Tassilo> substitute-command-keys.  If I do it in small parts, it
>     Tassilo> obviously becomes much easier.  Sometimes I don't see the
>     Tassilo> forest for the trees. :-)
>
> Breaking things into small parts is the essence of computer
> programming :-)

Yes, generally in small *things*, not necessarily in small *strings*
although the latter fits the bill here. :-)

Bye,
Tassilo



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2023-02-09 14:10 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-02-09  8:33 Get key-binding for a command and print key binding in kbd syntax Tassilo Horn
2023-02-09 10:28 ` Robert Pluim
2023-02-09 10:50   ` Tassilo Horn
2023-02-09 11:09     ` Tassilo Horn
2023-02-09 11:44       ` Robert Pluim
2023-02-09 11:58         ` Tassilo Horn
2023-02-09 12:20           ` Robert Pluim
2023-02-09 12:22             ` Tassilo Horn
2023-02-09 13:46               ` Robert Pluim
2023-02-09 14:10                 ` Tassilo Horn

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).