Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

How to translate M-kp-multiply to M-* before key is mapped to function?

12 views
Skip to first unread message

paul

unread,
Jul 2, 2004, 11:10:41 AM7/2/04
to
Hello all,

I've nearly pulled out my hair for the following problem;
I want to translate M-kp-multiply to M-* *BEFORE* the key
gets bound to its default function (in my case pop-tag-mark).

I do *not* want to use global-set-key but am looking for
a general way to remap non-ascii input events.

Using (define-key function-key-map ...) or (define-key key-translation-map ...)
is too late; I can remap the key, but the function pop-tag-mark is not
called.

Trying an approach with keyboard-translate drives me nuts because
it does not seem to support non-ascii events.

Help!

Kai Grossjohann

unread,
Jul 2, 2004, 11:28:58 AM7/2/04
to help-gn...@gnu.org
lit...@graffiti.net (paul) writes:

> I've nearly pulled out my hair for the following problem;
> I want to translate M-kp-multiply to M-* *BEFORE* the key
> gets bound to its default function (in my case pop-tag-mark).

Maybe (global-set-key (kbd "M-<kp_multiply>") (kbd "M-*")) is enough?

Kai

Kevin Rodgers

unread,
Jul 2, 2004, 12:32:49 PM7/2/04
to
paul wrote:
> I've nearly pulled out my hair for the following problem;
> I want to translate M-kp-multiply to M-* *BEFORE* the key
> gets bound to its default function (in my case pop-tag-mark).

You must be running emacs without a window system (or under a window
system, but with the -nw command line option). In an xterm on my
platform (i386-pc-solaris2.7, X toolkit), `C-h k M-kp-multiply' shows

| ESC * runs the command pop-tag-mark

and then `C-h l' shows

| C-h k ESC * C-h l

The odd thing is that function-key-map contains this entry

(kp-multiply . [42])

but no escape sequence that maps to [kp-multiply] in the way that `ESC [
1 1 ~' is bound to [f1] or `ESC O p' is bound to [kp-1].

> I do *not* want to use global-set-key but am looking for
> a general way to remap non-ascii input events.

What non-ASCII input event do you think your terminal is sending to
Emacs?

> Using (define-key function-key-map ...) or (define-key key-translation-map ...)
> is too late; I can remap the key, but the function pop-tag-mark is not
> called.

Since setting function-key-map and key-translation-map do not change the
results reported by `C-h k' and `C-h l', I don't think they have
anything to do with it: I think it means that the xterm is actually
sending `*' to Emacs, not an escape sequence.

> Trying an approach with keyboard-translate drives me nuts because
> it does not seem to support non-ascii events.

What do you want to do? It seems like you want to bind M-kp-multiply to
a different command, but for some reason you don't want to use
global-set-key like this:

(global-set-key "\M-*" 'whatever)

--
Kevin Rodgers


paul wrote:
> I've nearly pulled out my hair for the following problem;
> I want to translate M-kp-multiply to M-* *BEFORE* the key
> gets bound to its default function (in my case pop-tag-mark).

You must be running emacs without a window system (or under a window
system, but with the -nw command line option). In an xterm on my
platform (i386-pc-solaris2.7, X toolkit), `C-h k M-kp-multiply' shows

| ESC * runs the command pop-tag-mark

and then `C-h l' shows

| C-h k ESC * C-h l

The odd thing is that function-key-map contains this entry

(kp-multiply . [42])

but no escape sequence that maps to [kp-multiply] in the way that `ESC [
1 1 ~' is bound to [f1] or `ESC O p' is bound to [kp-1].

> I do *not* want to use global-set-key but am looking for
> a general way to remap non-ascii input events.

What non-ASCII input event do you think your terminal is sending to
Emacs?

> Using (define-key function-key-map ...) or (define-key key-translation-map ...)
> is too late; I can remap the key, but the function pop-tag-mark is not
> called.

Since setting function-key-map and key-translation-map do not change the
results reported by `C-h k' and `C-h l', I don't think they have
anything to do with it: I think it means that the xterm is actually
sending `*' to Emacs, not an escape sequence.

> Trying an approach with keyboard-translate drives me nuts because
> it does not seem to support non-ascii events.

What do you want to do? It seems like you want to bind M-kp-multiply to
a different command, but for some reason you don't want to use
global-set-key like this:

(global-set-key "\M-*" 'whatever)

--
Kevin Rodgers

paul

unread,
Jul 4, 2004, 5:51:25 PM7/4/04
to
My problem is, is that kp-multiply is bound to * somewhere down the
line,
but C-kp-multiply, M-kp-multiply and C-M-kp-multiply are not.
I would like C-kp-multiply to act like C-*, M-multiply to act like
M-*,
and C-M-kp-multiply to act like C-M-* (without having to rely on
information
to what functions C-*, M-* and C-M-* are bound).

How to tell keyboard-translate to do just this?

I tried any sequence of char, strings, ints etc. to get
keyboard-translate to do what I want, but the closest I get are errors
which show that my literals are wrong or are interpreted as 'C-k'
(with 'p-multiply' as the trail of the literal) etc.


Kevin Rodgers <ihs_...@yahoo.com> wrote in message news:<40E58E3...@yahoo.com>...

paul

unread,
Jul 5, 2004, 4:01:32 AM7/5/04
to
lit...@graffiti.net (paul) wrote in message news:<bb3e39cd.04070...@posting.google.com>...

Maybe I should add this to clarify things a bit; my emacs is
GNU Emacs 21.3.1 (i386-mingw-nt5.0.2195)

and my kp-multiply keys show up in C-h k as:
*, <C-kp-multiply>, <M-kp-multiply> and <C-M-kp-multiply>

and C-h l shows:
C-h k <kp-multiply> C-h k <M-kp-multiply>
C-h k <C-kp-multiply> C-h k <C-M-kp-multiply>

Stefan Monnier

unread,
Jul 5, 2004, 2:05:28 PM7/5/04
to
> My problem is, is that kp-multiply is bound to * somewhere down the line,
> but C-kp-multiply, M-kp-multiply and C-M-kp-multiply are not. I would
> like C-kp-multiply to act like C-*, M-multiply to act like M-*, and
> C-M-kp-multiply to act like C-M-* (without having to rely on information
> to what functions C-*, M-* and C-M-* are bound).

> How to tell keyboard-translate to do just this?

You need something like

(define-key function-key-map [M-kp-multiply] [?\M-*])
(define-key function-key-map [C-kp-multiply] [?\C-*])
(define-key function-key-map [C-M-kp-multiply] [?\C-\M-*])

I don't think there is an easy way to have all combinations mapped in
a single step. Sadly.


Stefan

paul

unread,
Jul 6, 2004, 5:23:31 AM7/6/04
to
Stefan Monnier <mon...@iro.umontreal.ca> wrote in message news:<jwvacyenxga.fsf-mon...@gnu.org>...

Hi Stefan,

Thanks for your reply. I don't mind having to do multiple steps for this.
Unfortunately, the solution you propose is the one I tried too.

It doesn't work.

Although it indeed remaps the key unto the correct key, it does *NOT* call
the function bound to that key. This is due to the order in which this
remapping is done, it happens *after* the effects of global-set-key, as
far as I can tell (at least it does for M-*, pop-tag-mark).

Regards,
Paul

Stefan Monnier

unread,
Jul 7, 2004, 1:13:28 PM7/7/04
to
> Although it indeed remaps the key unto the correct key, it does *NOT* call
> the function bound to that key. This is due to the order in which this
> remapping is done, it happens *after* the effects of global-set-key, as
> far as I can tell (at least it does for M-*, pop-tag-mark).

No, you are mistaken. The problem you're seeing must be due to
something else. The way it works is:

- if the key is bound in the normal maps, use the binding.
- else if the key has a binding is function-key-map, do the rebinding
and then look up the result in the normal maps.

So one problem may be if you have M-kp-multiply bound to a function
in one of the normal maps (global, of buffer-local), in which case
function-key-map will indeed be ignored.

Another problem might be if M-kp-multiply is not coming directly from the
keyboard but is itself the result of mapping some keyboard's input through
function-key-map, in which case it will not go through function-key-map
again. This can happen e.g. if you run in a text terminal.

You can also try (define-key key-translation-map [M-kp-multiply] [?\M-*])
because key-translation-map does the translation whether there is a normal
binding or not.


Stefan

0 new messages