S
Steven D'Aprano
I'm working with the readline module, and I'm trying to set a key
combination to process the current command line by calling a known
function, *and* enter the command line.
Something along the lines of:
* execute function spam() in some context where it can access
the current command line as a string
* enter the command line
Function spam() may or may not modify the command line.
Here is what I have got so far: I can discard the current line and call a
function:
readline.parse_and_bind(r'"\C-p": "%cspam()\n"' % 0x15) # ^U
binds ctrl-P to the key combinations `ctrl-U spam() Enter`, which clears
the command line before entering spam().
If I leave out the ctrl-U, I'll get a SyntaxError or other exception,
e.g. command line `x = 123` gets transformed into `x = 123spam()`.
This is not suitable:
readline.parse_and_bind(r'"\C-p": "; spam()\n"')
because it changes the command line. It's okay for spam() itself to
modify the command line, but the key binding should not.
I tried to do this:
readline.parse_and_bind(r'"\C-p": "\nspam()\n"')
but it gives me a segmentation fault, which is a little less helpful than
I had expected.
This Stackoverflow question suggests that what I want is not possible in
vanilla Python:
http://stackoverflow.com/questions/11680356
but I'm a stubborn guy and I have not given up yet. Any suggestions?
(P.S. I'm aware of IPython, I want to get this working in the standard
CPython interpreter.)
combination to process the current command line by calling a known
function, *and* enter the command line.
Something along the lines of:
* execute function spam() in some context where it can access
the current command line as a string
* enter the command line
Function spam() may or may not modify the command line.
Here is what I have got so far: I can discard the current line and call a
function:
readline.parse_and_bind(r'"\C-p": "%cspam()\n"' % 0x15) # ^U
binds ctrl-P to the key combinations `ctrl-U spam() Enter`, which clears
the command line before entering spam().
If I leave out the ctrl-U, I'll get a SyntaxError or other exception,
e.g. command line `x = 123` gets transformed into `x = 123spam()`.
This is not suitable:
readline.parse_and_bind(r'"\C-p": "; spam()\n"')
because it changes the command line. It's okay for spam() itself to
modify the command line, but the key binding should not.
I tried to do this:
readline.parse_and_bind(r'"\C-p": "\nspam()\n"')
but it gives me a segmentation fault, which is a little less helpful than
I had expected.
This Stackoverflow question suggests that what I want is not possible in
vanilla Python:
http://stackoverflow.com/questions/11680356
but I'm a stubborn guy and I have not given up yet. Any suggestions?
(P.S. I'm aware of IPython, I want to get this working in the standard
CPython interpreter.)