Re: repo to work on python scripting support

Jim Blandy
2008-03-25T18:18:33Z

It's worth putting some investment into the way arguments get handled,
to make writing commands as easy as possible. For example, in Emacs
Lisp, any function you write in Lisp can be turned into a command just
by adding an "interactive spec" to it, which says how to prompt the
user for the function's arguments. It's still just an ordinary
function that you can call from Lisp code, but if you invoke it as an
editing command, Emacs knows how to prompt for arguments for it.

The interactive spec is either a bit of arbitrary lisp code that
returns a list of arguments to pass, or just a string with magic
character codes that are shorthand for the most common cases.

For example, if I have a function that writes the currently selected
region to a file, it might take three arguments:

(start end filename)

and its interactive spec might be:

(interactive "rFFile to write to: ")

where the 'r' passes the start and end of the currently selected
region as 'start' and 'end', and the 'F' means "filename", to be
prompted for with the following text. With 'F', emacs will do
filename completion; with 'f', it'll do completion, and also insist
that the file exists. A function that was going to read the file
would use 'f'.

The point here is that it becomes dirt-easy to write most of the
interactive functions you'd care to. You get the interactivity out of
the way and focus on the meat of your command.

I don't know the most Pythonish way of doing things, but it seems to
me that Python could register not functions, but objects, to be
callable with $(). The object could have an 'interactive' member to
specify how to call it (say, "e" might mean, evaluate an expression
and pass its value to me, and "s" might mean, just hand it to me as a
string), and then some other method to actually do the call.

class Strcmp (GdbCommand):
interactive = 'ee'
def doit (expr1, expr2):
// compare expr1 and expr2 as strings

strcmp = Strcmp ();

or something. Surely someone here is more fluent in Python than I am.