Steven D'Aprano wrote: > 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.
> (P.S. I'm aware of IPython, I want to get this working in the standard > CPython interpreter.) If IPython does what you want why don't you have a look at the source? Anyway, here's what I came up with (no warranties as it was all trial-and- error): $ cat readline_callback.py import ctypes import ctypes.util from ctypes import c_int, c_char_p import readline import sys rlname = ctypes.util.find_library("readline") # int rl_add_defun (const char *name, rl_command_func_t *function, int key) # typedef int rl_command_func_t (int, int); # int rl_done # char * rl_line_buffer rl = ctypes.CDLL(rlname) RL_COMMAND_FUNC = ctypes.CFUNCTYPE(c_int, c_int, c_int) intercepted_line = None def lovely_spam(a, b): global intercepted_line print intercepted_line = c_char_p.in_dll(rl, "rl_line_buffer").value rl.rl_insert_text("*" + intercepted_line) c_int.in_dll(rl, "rl_done").value = 1 return 0 def control(c): return ord(c.upper())-64 rl.rl_add_defun("lovely-spam", RL_COMMAND_FUNC(lovely_spam), control("P")) #rl.rl_add_defun("lovely-spam", RL_COMMAND_FUNC(lovely_spam), -1) #readline.parse_and_bind("Control-P: lovely-spam") $ python -i readline_callback.py >>> alpha = 42 >>> alpha 1764 The relevant documentation: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html http://docs.python.org/library/ctypes.html -- http://mail.python.org/mailman/listinfo/python-list