unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* Bug with S-Tab in keymaps
@ 2008-05-05 14:11 Alan Mackenzie
  2008-05-05 18:07 ` Stefan Monnier
  2008-05-06 17:08 ` Drew Adams
  0 siblings, 2 replies; 12+ messages in thread
From: Alan Mackenzie @ 2008-05-05 14:11 UTC (permalink / raw)
  To: emacs-devel; +Cc: Drew Adams

Hi, Emacs!

I'm Running Emacs 22.2 in a Linux tty.

I've been having severe trouble with the binding S-Tab, as required by
Drew's Icicles.

When I type <shift>-<tab>, what comes out of my function-key-map is
#x2000009, that is \C-i together with the b25.

By contrast, the pertinent entry in icicle-mode-map is
(S-tab . icicle-generic-S-tab).

(lookup-key icicle-mode-map [#x2000009]) fails to find the binding for
S-Tab.

Should S-Tab be stored in a keymap as a symbol or a number?  Or are both
valid?  Which is the canonical form?  Where should the conversion from
the uncanonical form to the canonical be done?

I think this should be fixed before the next release.

-- 
Alan Mackenzie (Nuremberg, Germany).




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

* Re: Bug with S-Tab in keymaps
  2008-05-05 14:11 Bug with S-Tab in keymaps Alan Mackenzie
@ 2008-05-05 18:07 ` Stefan Monnier
  2008-05-05 20:40   ` Drew Adams
  2008-05-05 20:54   ` Alan Mackenzie
  2008-05-06 17:08 ` Drew Adams
  1 sibling, 2 replies; 12+ messages in thread
From: Stefan Monnier @ 2008-05-05 18:07 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Drew Adams, emacs-devel

> Should S-Tab be stored in a keymap as a symbol or a number?  Or are both
> valid?  Which is the canonical form?  Where should the conversion from
> the uncanonical form to the canonical be done?

IIUC the canonical name of shift-tab in Emacs is `backtab'.
The conversion from various other terminal-specific representations
should be done in function-key-map.  If it's not done there, please
report it as a bug.


        Stefan






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

* RE: Bug with S-Tab in keymaps
  2008-05-05 18:07 ` Stefan Monnier
@ 2008-05-05 20:40   ` Drew Adams
  2008-05-06  0:46     ` Stefan Monnier
  2008-05-05 20:54   ` Alan Mackenzie
  1 sibling, 1 reply; 12+ messages in thread
From: Drew Adams @ 2008-05-05 20:40 UTC (permalink / raw)
  To: 'Stefan Monnier', 'Alan Mackenzie'; +Cc: emacs-devel

> > Should S-Tab be stored in a keymap as a symbol or a number? 
> > Or are both valid?  Which is the canonical form?  Where
> > should the conversion from the uncanonical form to the
> > canonical be done?
> 
> IIUC the canonical name of shift-tab in Emacs is `backtab'.
> The conversion from various other terminal-specific representations
> should be done in function-key-map.  If it's not done there, please
> report it as a bug.

Thanks, I didn't know that. Icicles was binding it by default to both `S-tab'
and `S-iso-lefttab', but I've now changed that to `backtab'.

I agree with Alan that the canonical form should be documented in the manual.
And just what is meant by "canonical form" should be explained there as well.





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

* Re: Bug with S-Tab in keymaps
  2008-05-05 20:54   ` Alan Mackenzie
@ 2008-05-05 20:46     ` Lennart Borgman (gmail)
  2008-05-05 21:00       ` Drew Adams
  2008-05-06 21:26     ` Alan Mackenzie
  1 sibling, 1 reply; 12+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-05 20:46 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan Monnier, Drew Adams, emacs-devel

Alan Mackenzie wrote:
> I also think the canonical form of a key sequence should be defined in
> the Elisp manual.  (Yes, I know, I'm implicitly volunteering to do
> this.)

There is a little bit here:

   (info "(emacs) Function Keys")




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

* Re: Bug with S-Tab in keymaps
  2008-05-05 18:07 ` Stefan Monnier
  2008-05-05 20:40   ` Drew Adams
@ 2008-05-05 20:54   ` Alan Mackenzie
  2008-05-05 20:46     ` Lennart Borgman (gmail)
  2008-05-06 21:26     ` Alan Mackenzie
  1 sibling, 2 replies; 12+ messages in thread
From: Alan Mackenzie @ 2008-05-05 20:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Drew Adams, emacs-devel

Hi, Stefan!

On Mon, May 05, 2008 at 02:07:53PM -0400, Stefan Monnier wrote:
> > Should S-Tab be stored in a keymap as a symbol or a number?  Or are both
> > valid?  Which is the canonical form?  Where should the conversion from
> > the uncanonical form to the canonical be done?

> IIUC the canonical name of shift-tab in Emacs is `backtab'.
> The conversion from various other terminal-specific representations
> should be done in function-key-map.  If it's not done there, please
> report it as a bug.

That's what I thought I was doing.  I think the bug is that a symbol,
here 'S-tab, is being used when there's a perfectly good ASCII char +
bucky bit available.

I also think the canonical form of a key sequence should be defined in
the Elisp manual.  (Yes, I know, I'm implicitly volunteering to do
this.)

Icicles actually uses the symbol 'S-tab.  So, potentially, does a fair
bit of other software.

My own opinion, for what it's worth, is that read_key_sequence (in
keyboard.c) and lookup-key (in keymap.c) should both massage the
differences between #x2000009 and 'S-tab and 'S-TAB, somehow.  I suppose
even #x4000049 (&I + the control bucky bit) for the same thing is
conceivable.  Maybe `define-key' should canonicalise the key-sequences
it's given before writing them into a keymap.

In fact, `canonicalise-key-sequence' would be easy to write in Lisp, and
could be called from all of read_key_sequence, lookup-key and
define-key.  What do you think?

>         Stefan

-- 
Alan Mackenzie (Nuremberg, Germany).




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

* RE: Bug with S-Tab in keymaps
  2008-05-05 20:46     ` Lennart Borgman (gmail)
@ 2008-05-05 21:00       ` Drew Adams
  0 siblings, 0 replies; 12+ messages in thread
From: Drew Adams @ 2008-05-05 21:00 UTC (permalink / raw)
  To: 'Lennart Borgman (gmail)', 'Alan Mackenzie'
  Cc: 'Stefan Monnier', emacs-devel

> > I also think the canonical form of a key sequence should be 
> > defined in the Elisp manual.  (Yes, I know, I'm implicitly
> > volunteering to do this.)
> 
> There is a little bit here:
>    (info "(emacs) Function Keys")

I really don't see how that helps. (And it is not in the Elisp manual.)

What's needed is to know which keys (e.g. `S-tab', `S-isoleft-tab') are
represented canonically by which keys (e.g. `backtab').





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

* Re: Bug with S-Tab in keymaps
  2008-05-05 20:40   ` Drew Adams
@ 2008-05-06  0:46     ` Stefan Monnier
  0 siblings, 0 replies; 12+ messages in thread
From: Stefan Monnier @ 2008-05-06  0:46 UTC (permalink / raw)
  To: Drew Adams; +Cc: 'Alan Mackenzie', emacs-devel

> Thanks, I didn't know that. Icicles was binding it by default to both `S-tab'
> and `S-iso-lefttab', but I've now changed that to `backtab'.

> I agree with Alan that the canonical form should be documented in the manual.
> And just what is meant by "canonical form" should be explained there as well.

Yes, that does sound sensible.  There aren't many such "canonical
keys".  I can think of ?\t, ?\r, ?\^?, and `backtab'.  Any other?
Maybe `mwheel-up' and `mwheel-down', except that these are currently not
canonicalized correctly under X11.


        Stefan




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

* RE: Bug with S-Tab in keymaps
  2008-05-05 14:11 Bug with S-Tab in keymaps Alan Mackenzie
  2008-05-05 18:07 ` Stefan Monnier
@ 2008-05-06 17:08 ` Drew Adams
  1 sibling, 0 replies; 12+ messages in thread
From: Drew Adams @ 2008-05-06 17:08 UTC (permalink / raw)
  To: 'Alan Mackenzie', emacs-devel

Hi Alan,

Any luck with your S-TAB binding?

BTW, I just noticed this:

> I've been having severe trouble with the binding S-Tab, as required by
> Drew's Icicles.

Actually, Icicles doesn't require that you use S-TAB. You can use any key (or
keys) in option `icicle-generic-S-tab-keys'.

But I think you mean that you want to use your keyboard's Shift+TAB but the code
that that sends is not picked up well by Emacs/Icicles.

Just wanted to make sure you understand that you could use any key for this; you
are not limited to S-TAB.

Regards,

  Drew





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

* Re: Bug with S-Tab in keymaps
  2008-05-05 20:54   ` Alan Mackenzie
  2008-05-05 20:46     ` Lennart Borgman (gmail)
@ 2008-05-06 21:26     ` Alan Mackenzie
  2008-05-06 23:13       ` Miles Bader
  1 sibling, 1 reply; 12+ messages in thread
From: Alan Mackenzie @ 2008-05-06 21:26 UTC (permalink / raw)
  To: Stefan Monnier, Drew Adams; +Cc: emacs-devel

Hi, Stefan and Drew!

On Mon, May 05, 2008 at 08:54:11PM +0000, Alan Mackenzie wrote:
> Hi, Stefan!

> On Mon, May 05, 2008 at 02:07:53PM -0400, Stefan Monnier wrote:
> > > Should S-Tab be stored in a keymap as a symbol or a number?  Or are
> > > both valid?  Which is the canonical form?  Where should the
> > > conversion from the uncanonical form to the canonical be done?

[ .... ]

> My own opinion, for what it's worth, is that read_key_sequence (in
> keyboard.c) and lookup-key (in keymap.c) should both massage the
> differences between #x2000009 and 'S-tab and 'S-TAB, somehow.  I suppose
> even #x4000049 (&I + the control bucky bit) for the same thing is
> conceivable.  Maybe `define-key' should canonicalise the key-sequences
> it's given before writing them into a keymap.

> in fact, `canonicalise-key-sequence' would be easy to write in lisp, and
> could be called from all of read_key_sequence, lookup-key and
> define-key.  what do you think?

here's an embryonic `canonicalize-event' (note the American spelling ;-).
It works, e.g. for

(canonicalize-event 'TaB)
(canonicalize-event 'C-Tab)
(canonicalize-event 'C-PgUp)
(canonicalize-event #x4000049)
(canonicalize-event 'M-C-prior)

.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defconst non-canon-key-symbs
  '((tab . 9)
    (bs . 127)
    (pgup . "prior"))
  "An alist mapping non-standard keynames to canonical ones")

(defun canonicalize-event (evt)
  "Turn the event EVT into its canonical equivalent.

EVT is typically a single key press after being massaged by the
function-key-map, or a mouse action.

In the following, the \"base-key\" means the key event without
its modifiers.  If EVT is an integer, the base-key is its bottom
8 bits; if EVT's a symbol, the base-key is the symbol name
without the modifiers, a string.

The rules for a key event's canonicity are, in order of
decreasing priority:

\(i) it is a number (character, perhaps including bucky bits) if possible.
\(ii) if it contains control and a low ASCII character (?@, ?a, ...., ?z, ?{,
  ..., ~, del), the base key is the corresponding control character.
\(iii) Upper and lower case letters will be represented as such in the base
  key, rather than by use of the shift bucky bit.

\(iv) if it can't be represented by a number, it is a symbol containing the
  modifiers, e.g. 'C-M-up.
\(v) Any attached modifiers are case significant, and appear in the canonical
  order, A-C-H-M-S-s-.
\(vi) The base key part of the symbol name is in lower case, and is the
  canonical name."
  (let ((M-bit #x8000000)
	(C-bit #x4000000)
	(S-bit #x2000000)		; shift
	(H-bit #x1000000)
	(s-bit #x800000)		; super
	(A-bit #x400000)
	(base-mask #x3fffff)
	base-key			; key without modifiers; number or string.
	got-M got-C got-S got-H got-s got-A ; are explicit modifiers present?
	is-C is-upper-case		    ; is it a control/upper-case key?
	is-CC			      ; is it a "double" ctrl key, e.g. C-TAB?
	(char-mod-alist
	 '((?M . got-M) (?C . got-C) (?S . got-S)
	   (?H . got-H) (?s . got-s) (?A . got-A)))
	key-string canon-symb ch pos
	)
;;;; Analyse the argument
    (cond
     ((numberp evt)
      (setq base-key (logand evt base-mask) ; Unchanged until the "Synthesize" bit.
	    got-M (/= 0 (logand evt M-bit))
	    got-C (/= 0 (logand evt C-bit))
	    got-S (/= 0 (logand evt S-bit))
	    got-H (/= 0 (logand evt H-bit))
	    got-s (/= 0 (logand evt s-bit))
	    got-A (/= 0 (logand evt A-bit)))

      ;; Have we got a "double <ctrl>", e.g. C-TAB?
      (setq is-CC (and got-C (< base-key 32))))

     ((symbolp evt)
      (setq key-string (symbol-name evt))
      ;; get the modifiers.
      (setq pos 0)
      (while (eq (string-match "[MCSHsA]-." key-string pos) pos)
	(setq ch (aref key-string pos))
	(set (cdr (assq ch char-mod-alist)) t)
	(setq pos (+ 2 pos)))
      ;; get the base "key" (might be a mouse event).
      (or (string-match "[^-]+$" key-string pos)
	  (error "canonicalize-event: invalid symbol: %s" evt))
      (setq base-key (substring key-string pos)))

     (t (error "canonicalize-event: argument not number or symbol: %s" evt)))

;;;; Synthesize the result
    (when (stringp base-key)
      (if (eq (length base-key) 1)		; must be a letter or digit.
	  (setq base-key (aref base-key 0))
	(setq base-key (downcase base-key))
	(if (setq canon-symb (assoc (intern base-key) non-canon-key-symbs))
	    (setq base-key (cdr canon-symb))))) ; symbol or number
	
    ;; Can we transform base-key into an ASCII control sequnce (0 - 31)?
    (when (and got-C (numberp base-key))
      (cond
       ;; Convert got-C with (e.g.) ?A -> shift + ?\C-a
       ((and (>= base-key ?A) (<= base-key ?Z))
	(setq base-key (- base-key ?A -1)
	      got-C nil
	      got-S t))
       ;; got-C with (e.g.) ?@ -> ?\C-@
       ((or (eq base-key ?@)
	    (and (>= base-key ?\[) (<= base-key ?_)))
	(setq base-key (- base-key ?@)
	      got-C nil))
       ;; got-C with (e.g.) ?a -> ?\C-a
       ((and (>= base-key ?a) (<= base-key ?z))
	(setq base-key (- base-key ?a -1)
	      got-C nil))))

    (if (numberp base-key)
	(logior
	 base-key
	 (if got-M M-bit 0)
	 (if (or got-C is-CC) C-bit 0)
	 (if got-S S-bit 0)
	 (if got-H H-bit 0)
	 (if got-M M-bit 0)
	 (if got-M M-bit 0))
      (intern
       (concat
       (if got-A "A-" "")
       (if got-C "C-" "")
       (if got-H "H-" "")
       (if got-M "M-" "")
       (if got-S "S-" "")
       (if got-s "s-" "")
       base-key)))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-- 
Alan Mackenzie (Nuremberg, Germany).





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

* Re: Bug with S-Tab in keymaps
  2008-05-06 21:26     ` Alan Mackenzie
@ 2008-05-06 23:13       ` Miles Bader
  2008-05-07  8:24         ` Alan Mackenzie
  0 siblings, 1 reply; 12+ messages in thread
From: Miles Bader @ 2008-05-06 23:13 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: Stefan Monnier, Drew Adams, emacs-devel

Alan Mackenzie <acm@muc.de> writes:
> here's an embryonic `canonicalize-event' (note the American spelling ;-).
> It works, e.g. for

Why all the mucking about with symbols?!  [E.g. 'C-M-u ]

Why not use a representation that actually works with emacs like
'(control meta u)?

Thanks,

-Miles

-- 
Insurrection, n. An unsuccessful revolution.




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

* Re: Bug with S-Tab in keymaps
  2008-05-06 23:13       ` Miles Bader
@ 2008-05-07  8:24         ` Alan Mackenzie
  2008-05-07 15:17           ` Stefan Monnier
  0 siblings, 1 reply; 12+ messages in thread
From: Alan Mackenzie @ 2008-05-07  8:24 UTC (permalink / raw)
  To: Miles Bader; +Cc: Stefan Monnier, Drew Adams, emacs-devel

'Morning, Miles!

On Wed, May 07, 2008 at 08:13:09AM +0900, Miles Bader wrote:
> Alan Mackenzie <acm@muc.de> writes:
> > here's an embryonic `canonicalize-event' (note the American spelling
> > ;-).  It works, e.g. for

> Why all the mucking about with symbols?!  [E.g. 'C-M-u ]

My main point is that there should BE a standard way of representing key
sequences.  At the moment there is not.  So that if I type <shift>-<tab>
on my keyboard, function-key-map turns this into #x2000009.  `lookup-key'
then fails to find the binding on the symbol 'S-tab in a keymap.  This is
a bug.

Whether the standard I tentatively proposed is the right one or not can
be debated.  I'd appreciate people agreeing with me that a standard is
wanted.

> Why not use a representation that actually works with emacs like
> '(control meta u)?

What do you mean?  Symbols actually work with Emacs very well.

For the specific instance you give, I actually proposed a number:
#x8000015 = ?\C-u + the meta bit.

But I still think 'C-M-up is superior to '(control meta up).  It takes
less space, and (eq sym 'C-M-up) is faster than (equal sym '(control meta
up)).  Also, events are represented as symbols at the moment, so why
change this to a list?

Of course, if the speed of looking up keys were a problem (it's not) we
could use an obarray.

The mucking about with symbols in my `canonicalize-event' only needs to
be twice per event per key lookup (and when the binding is made, of
course).  

> Thanks,

> -Miles

-- 
Alan Mackenzie (Nuremberg, Germany).




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

* Re: Bug with S-Tab in keymaps
  2008-05-07  8:24         ` Alan Mackenzie
@ 2008-05-07 15:17           ` Stefan Monnier
  0 siblings, 0 replies; 12+ messages in thread
From: Stefan Monnier @ 2008-05-07 15:17 UTC (permalink / raw)
  To: Alan Mackenzie; +Cc: emacs-devel, Drew Adams, Miles Bader

>> > here's an embryonic `canonicalize-event' (note the American spelling
>> > ;-).  It works, e.g. for
>> Why all the mucking about with symbols?!  [E.g. 'C-M-u ]
> My main point is that there should BE a standard way of representing key
> sequences.

There is, actually, but it's only partly formalized.
See `reorder_modifiers' in src/keyboard.c for example.

> At the moment there is not.  So that if I type <shift>-<tab>
> on my keyboard, function-key-map turns this into #x2000009.

Sounds like a bug: as mentioned, shift-tab should be mapped by
function-key-map to `backtab'.

> Whether the standard I tentatively proposed is the right one or not can
> be debated.  I'd appreciate people agreeing with me that a standard is
> wanted.

No argument here.


        Stefan




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

end of thread, other threads:[~2008-05-07 15:17 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-05 14:11 Bug with S-Tab in keymaps Alan Mackenzie
2008-05-05 18:07 ` Stefan Monnier
2008-05-05 20:40   ` Drew Adams
2008-05-06  0:46     ` Stefan Monnier
2008-05-05 20:54   ` Alan Mackenzie
2008-05-05 20:46     ` Lennart Borgman (gmail)
2008-05-05 21:00       ` Drew Adams
2008-05-06 21:26     ` Alan Mackenzie
2008-05-06 23:13       ` Miles Bader
2008-05-07  8:24         ` Alan Mackenzie
2008-05-07 15:17           ` Stefan Monnier
2008-05-06 17:08 ` Drew Adams

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

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).