unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: Juri Linkov <juri@jurta.org>
Cc: yzhh <yezonghui@gmail.com>, emacs-devel@gnu.org
Subject: Re: Is there a plan to record kbd macro as elisp code?
Date: Sat, 27 Oct 2007 21:14:23 -0400	[thread overview]
Message-ID: <jwvmyu4oxpp.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <87y7doxmcw.fsf@jurta.org> (Juri Linkov's message of "Sun\, 28 Oct 2007 00\:45\:45 +0300")

>>> Thank you for your appreciation. But my modification is in the C code of
>>> emacs, because 'execute-command' and 'call-interactively' are in C code.
>>> And I don't think my dirty code would be a valid patch for the emacs
>>> developers.
>> 
>> I think what was expected was to first record a keyboard macro and later to
>> turn that into elisp code.

> That's was exactly my first attempt when I tried to implement this feature.
> However, this approach doesn't work because a macro highly depends on its
> context, and will fail when repeating it in different buffers, modes, etc.

I think this doesn't matter: the same holds for the keyboard macros
themselves and yet they're quite usable.  The limitation of the approach
(that the macro needs to be converted to Elisp in the same context where it
was recorded) doesn't seem to be too serious: at least not a show-stopper.

OTOH I do expect that it can be very tricky to recover the structure from
just the key sequence: e.g. after a keybinding that may or may not present
a minibuffer prompt, figuring out whether the rest of the keys were sent to
the minibuffer or to the next command can be impossible without guessing.

>> Another approach is to use a pre-command-hook to record the value of
>> `this-command' for each command run.

> After failing with the first approach, I tried to do this, but this doesn't
> work because `this-command' doesn't record the arguments of the last
> command.  So when I added a new variable `this-command-args' that records
> the arguments of the command being executed, this approach produced
> good results.

> Also I added a new variable `last-kbd-macro-commands', and a new command
> `insert-last-kbd-macro-commands' to convert the recorded commands with
> their arguments to a Lisp function.  A change in isearch was also required
> to convert all isearch subcommands into one search function.

> Since yzhh doesn't want to post his code, I will post mine.
> I ask yzhh to comment on this code, compare with his own,
> and suggest further improvements:

This doesn't sound too bad.  Another approach would be to advise
`call-interactively'.

This may require changes at the C level so as to make sure that calls to
Fcall_interactively are never made directly but always go through the
`call-interactively' symbol.

With an exhaustive around advice on call-interactively, you should be
able to get a fairly reliable trace.

But even a reliable trace will encounter the problems mentioned by Kim, and
in order to get /good/ Elisp code (rather than just /working/ Elisp code),
a fair bit of post-processing will be needed with ad-hoc rewrites.


        Stefan

  reply	other threads:[~2007-10-28  1:14 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-27  9:28 Is there a plan to record kbd macro as elisp code? yzhh
2007-10-27 15:48 ` Robert J. Chassell
2007-10-27 17:30   ` yzhh
2007-10-27 18:01     ` Drew Adams
2007-10-28 13:50       ` Richard Stallman
2007-10-27 20:04     ` Stefan Monnier
2007-10-27 21:22       ` Kim F. Storm
2007-10-28 13:50         ` Richard Stallman
2007-10-28 22:00           ` Kim F. Storm
2007-10-29  5:20             ` yzhh
2007-10-29  9:22             ` Richard Stallman
2007-10-29  9:22             ` Richard Stallman
2007-10-27 21:45       ` Juri Linkov
2007-10-28  1:14         ` Stefan Monnier [this message]
2007-10-28  1:34           ` Juri Linkov
2007-10-29  0:11             ` Richard Stallman
2007-10-28  6:49         ` yzhh
2007-10-28  7:13           ` yzhh
2007-10-28 10:54           ` Juri Linkov
2007-10-28 13:50         ` Richard Stallman
2007-10-28 15:09           ` Juri Linkov
2007-10-29  9:21             ` Richard Stallman
2007-10-28 16:13           ` yzhh
2007-10-28 16:48             ` Juri Linkov
2007-10-29  9:21             ` Richard Stallman
2007-10-30 14:14               ` Juri Linkov
2007-10-31  7:46                 ` Richard Stallman
2007-10-27 19:26   ` Jay Belanger
2007-10-27 16:20 ` Drew Adams
2007-10-27 17:13   ` yzhh
2007-10-27 17:40     ` Drew Adams
2007-10-27 18:05       ` yzhh
2007-10-27 19:22       ` Robert J. Chassell
2007-10-27 20:11         ` Drew Adams
2007-10-28 13:50   ` Richard Stallman
2007-10-28 16:45     ` Juri Linkov
2007-10-29  6:41 ` Klaus Zeitler

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwvmyu4oxpp.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    --cc=juri@jurta.org \
    --cc=yezonghui@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).