unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* unreading a command key sequence
@ 2008-05-07  1:43 Lennart Borgman (gmail)
  2008-05-07  2:31 ` Stefan Monnier
  0 siblings, 1 reply; 10+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-07  1:43 UTC (permalink / raw)
  To: Emacs Devel

I just had a problem with unreading a command key sequence that lead to 
that Emacs looped. Looking into it I found that it is a bit non-trivial 
to unread a command key sequence. I am not sure I have got every thing 
correct but this is what I am using now

   ;; Unread the last command
   (setq last-command-char nil) ;; For viper
   (setq unread-command-events
         (listify-key-sequence (this-command-keys-vector)))

The missing bit that lead to the looping was setting last-command-char 
to nil.

Maybe something like this could be included in the manual in
(info "(elisp) Event Input Misc")?




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

* Re: unreading a command key sequence
  2008-05-07  1:43 unreading a command key sequence Lennart Borgman (gmail)
@ 2008-05-07  2:31 ` Stefan Monnier
  2008-05-07  8:01   ` Lennart Borgman (gmail)
  0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier @ 2008-05-07  2:31 UTC (permalink / raw)
  To: Lennart Borgman (gmail); +Cc: Emacs Devel

>   (setq unread-command-events
>         (listify-key-sequence (this-command-keys-vector)))

[ Ideally, you should not assume that unread-command-events was nil.  ]

> The missing bit that lead to the looping was setting last-command-char
> to nil.

> Maybe something like this could be included in the manual in
> (info "(elisp) Event Input Misc")?

I'd rather fix whichever code is responsible for the inf-loop.
Can you provide a recipe to reproduce the problem?


        Stefan




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

* Re: unreading a command key sequence
  2008-05-07  2:31 ` Stefan Monnier
@ 2008-05-07  8:01   ` Lennart Borgman (gmail)
       [not found]     ` <jwvod7i883u.fsf-monnier+emacs@gnu.org>
  0 siblings, 1 reply; 10+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-07  8:01 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Emacs Devel

Stefan Monnier wrote:
>>   (setq unread-command-events
>>         (listify-key-sequence (this-command-keys-vector)))
> 
> [ Ideally, you should not assume that unread-command-events was nil.  ]

No, but I was unsure how to add to the list ...


>> The missing bit that lead to the looping was setting last-command-char
>> to nil.
> 
>> Maybe something like this could be included in the manual in
>> (info "(elisp) Event Input Misc")?
> 
> I'd rather fix whichever code is responsible for the inf-loop.
> Can you provide a recipe to reproduce the problem?

Maybe I can provide a simple recipe, but I think there probably is 
nothing to fix. I believe the looping I saw was because of the way Viper 
is written. When you do something like d, y, c etc then 
`last-command-char' will be used. (Of course other commands may do 
similar things, there is nothing wrong with it AFAICS.)




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

* Re: unreading a command key sequence
       [not found]     ` <jwvod7i883u.fsf-monnier+emacs@gnu.org>
@ 2008-05-07 18:35       ` Lennart Borgman (gmail)
  2008-05-08  1:43         ` Stefan Monnier
  0 siblings, 1 reply; 10+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-07 18:35 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Emacs Devel

Stefan Monnier wrote:
>>>> (setq unread-command-events
>>>> (listify-key-sequence (this-command-keys-vector)))
>>> [ Ideally, you should not assume that unread-command-events was nil.  ]
> 
>> No, but I was unsure how to add to the list ...
> 
> 
>>>> The missing bit that lead to the looping was setting last-command-char
>>>> to nil.
>>>> Maybe something like this could be included in the manual in
>>>> (info "(elisp) Event Input Misc")?
>>> I'd rather fix whichever code is responsible for the inf-loop.
>>> Can you provide a recipe to reproduce the problem?
> 
>> Maybe I can provide a simple recipe, but I think there probably is nothing
>> to fix.  I believe the looping I saw was because of the way Viper is
>> written.  When you do something like d, y, c etc then `last-command-char'
>> will be used. (Of course other commands may do similar things, there is
>> nothing wrong with it AFAICS.)
> 
> An inf-loop is a bug.  And I have a hard time imagining why
> (setq last-command-char nil) would be The Right Fix(TM) (it might be an
> OK fix if you don't have access to the rest of the code, tho).


Thanks, you are right, of course.

I do this in pre-command-hook and I just did forget that this-command 
still will be carried out (and that was what I wanted to prevent). I 
think this is what I should do instead:

   (setq this-command 'tunnel-last-command)
   (setq unread-command-events
         (append unread-command-events
                 (listify-key-sequence
                  (this-command-keys-vector))
                 nil))
   (defun tunnel-last-command ()
     "Set `this-command' to `last-command'."
     (interactive)
     (setq this-command last-command))

This works for in the tests I have made (including some with Viper undo 
involved). If this is the way to do such things in pre-command-hook then 
this might be worth documenting.





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

* Re: unreading a command key sequence
  2008-05-07 18:35       ` Lennart Borgman (gmail)
@ 2008-05-08  1:43         ` Stefan Monnier
  2008-05-08  8:04           ` Lennart Borgman (gmail)
  0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier @ 2008-05-08  1:43 UTC (permalink / raw)
  To: Lennart Borgman (gmail); +Cc: Emacs Devel

> I do this in pre-command-hook and I just did forget that this-command still
> will be carried out (and that was what I wanted to prevent). I think this is
> what I should do instead:

>   (setq this-command 'tunnel-last-command)
>   (setq unread-command-events
>         (append unread-command-events
>                 (listify-key-sequence
>                  (this-command-keys-vector))
>                 nil))
>   (defun tunnel-last-command ()
>     "Set `this-command' to `last-command'."
>     (interactive)
>     (setq this-command last-command))

> This works for in the tests I have made (including some with Viper undo
> involved). If this is the way to do such things in pre-command-hook then
> this might be worth documenting.

You seem to be thinking out loud.  I don't know what you mean by "such
things".


        Stefan




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

* Re: unreading a command key sequence
  2008-05-08  1:43         ` Stefan Monnier
@ 2008-05-08  8:04           ` Lennart Borgman (gmail)
  2008-05-08 13:55             ` Stefan Monnier
  0 siblings, 1 reply; 10+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-08  8:04 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Emacs Devel

Stefan Monnier wrote:
>> I do this in pre-command-hook and I just did forget that this-command still
>> will be carried out (and that was what I wanted to prevent). I think this is
>> what I should do instead:
> 
>>   (setq this-command 'tunnel-last-command)
>>   (setq unread-command-events
>>         (append unread-command-events
>>                 (listify-key-sequence
>>                  (this-command-keys-vector))
>>                 nil))
>>   (defun tunnel-last-command ()
>>     "Set `this-command' to `last-command'."
>>     (interactive)
>>     (setq this-command last-command))
> 
>> This works for in the tests I have made (including some with Viper undo
>> involved). If this is the way to do such things in pre-command-hook then
>> this might be worth documenting.
> 
> You seem to be thinking out loud.  I don't know what you mean by "such
> things".

Sorry. "Such things" = when you want to prevent running this-command at 
the moment and instead want to change some things first, but still want 
the read key sequence to be used as input.

In my situation I want to change major mode first.




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

* Re: unreading a command key sequence
  2008-05-08  8:04           ` Lennart Borgman (gmail)
@ 2008-05-08 13:55             ` Stefan Monnier
  2008-05-08 21:00               ` Lennart Borgman (gmail)
  0 siblings, 1 reply; 10+ messages in thread
From: Stefan Monnier @ 2008-05-08 13:55 UTC (permalink / raw)
  To: Lennart Borgman (gmail); +Cc: Emacs Devel

> Sorry. "Such things" = when you want to prevent running this-command at the
> moment and instead want to change some things first, but still want the read
> key sequence to be used as input.

That sounds hilarious to me: you say "such things" as if it's one of the
those things people do on a regular basis, and then you go on to
describe a very peculiar need.


        Stefan




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

* Re: unreading a command key sequence
  2008-05-08 13:55             ` Stefan Monnier
@ 2008-05-08 21:00               ` Lennart Borgman (gmail)
  2008-05-08 21:15                 ` David Kastrup
  0 siblings, 1 reply; 10+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-08 21:00 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Emacs Devel

Stefan Monnier wrote:
>> Sorry. "Such things" = when you want to prevent running this-command at the
>> moment and instead want to change some things first, but still want the read
>> key sequence to be used as input.
> 
> That sounds hilarious to me: you say "such things" as if it's one of the
> those things people do on a regular basis, and then you go on to
> describe a very peculiar need.

That made me a bit curious so I looked into Emacs sources to see what 
others used unread-command-events for. You are right, my need is 
uncommon. And those who need to use it can probably figure out how to 
use it.




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

* Re: unreading a command key sequence
  2008-05-08 21:00               ` Lennart Borgman (gmail)
@ 2008-05-08 21:15                 ` David Kastrup
  2008-05-08 21:19                   ` Lennart Borgman (gmail)
  0 siblings, 1 reply; 10+ messages in thread
From: David Kastrup @ 2008-05-08 21:15 UTC (permalink / raw)
  To: Emacs Devel

"Lennart Borgman (gmail)" <lennart.borgman@gmail.com> writes:

[...]

> That made me a bit curious so I looked into Emacs sources to see what
> others used unread-command-events for. You are right, my need is
> uncommon.

"You are right"?  Is this not considered inappropriate language on
emacs-devel?

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum




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

* Re: unreading a command key sequence
  2008-05-08 21:15                 ` David Kastrup
@ 2008-05-08 21:19                   ` Lennart Borgman (gmail)
  0 siblings, 0 replies; 10+ messages in thread
From: Lennart Borgman (gmail) @ 2008-05-08 21:19 UTC (permalink / raw)
  To: David Kastrup; +Cc: Emacs Devel

David Kastrup wrote:
> "Lennart Borgman (gmail)" <lennart.borgman@gmail.com> writes:
> 
> [...]
> 
>> That made me a bit curious so I looked into Emacs sources to see what
>> others used unread-command-events for. You are right, my need is
>> uncommon.
> 
> "You are right"?  Is this not considered inappropriate language on
> emacs-devel?

My bad. Double error.




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

end of thread, other threads:[~2008-05-08 21:19 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-07  1:43 unreading a command key sequence Lennart Borgman (gmail)
2008-05-07  2:31 ` Stefan Monnier
2008-05-07  8:01   ` Lennart Borgman (gmail)
     [not found]     ` <jwvod7i883u.fsf-monnier+emacs@gnu.org>
2008-05-07 18:35       ` Lennart Borgman (gmail)
2008-05-08  1:43         ` Stefan Monnier
2008-05-08  8:04           ` Lennart Borgman (gmail)
2008-05-08 13:55             ` Stefan Monnier
2008-05-08 21:00               ` Lennart Borgman (gmail)
2008-05-08 21:15                 ` David Kastrup
2008-05-08 21:19                   ` Lennart Borgman (gmail)

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