Patches item #1690201, was opened at 2007-03-28 17:52 Message generated for change (Comment added) made by btimby You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1690201&group_id=5470
Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: Core (C code) Group: Python 2.3 Status: Open Resolution: None Priority: 5 Private: No Submitted By: Ben Timby (btimby) Assigned to: Nobody/Anonymous (nobody) Summary: Added support for custom readline functions Initial Comment: This patch allows for binding a key or keyseq to a custom function named custom. A custom handler can be registered and will be called by readline when the registered sequence input. Example: rl.py -- import readline def handler(): print "need some help?" readline.set_custom_hook(handler) readline.parse_and_bind("\"?\": custom") text = raw_input("type ? for help# ") -- ---------------------------------------------------------------------- >Comment By: Ben Timby (btimby) Date: 2007-04-03 07:59 Message: Logged In: YES user_id=932679 Originator: YES Paul, thank you for clarifying. I agree with you completely. The reason I was unable to implement the API fully is the following problem (probably as you said due to the lack of dynamic features in C). 1. User defines python function. 2. User calls python readline.add_defun() 3. readline.add_defun() must whip up a C handler that will call the python function and in turn call rl_add_defun to register it. Problem being that multiple custom python functions registered with readline to a single C handler will have no way to determine which python function to call on invocation. 4. User calls readline.parse_and_bind() I have no clue how to do step 3, so I avoided it. If anyone has suggestions, ideas or examples, I am happy to do the work, I simply have not had to do something like this before in C. I don't even know what this would be called in order to google for it. The patch is certainly not as useful as the full API, however, I DID implement it to solve a problem, thus there is some use to it :-). I learned recently that I can maintain this feature as an extension (outside of) python, thus allowing me to continue to use it without depending on python maintainers to perceive usefulness. I will do this for the time being and if I am able to figure out item 3 I will resubmit the patch with a full implementation. ---------------------------------------------------------------------- Comment By: Paul Hankin (paulhankin) Date: 2007-04-02 13:28 Message: Logged In: YES user_id=1740099 Originator: NO Hi Ben, I'm sorry if you thought my short reply suggested I hadn't looked at the patch properly. I'll try to clarify what I meant. Gnu readline provides an interface to custom functions: you declare a function that takes a 'count' and a 'key' and returns 0 or an error. You then call rl_add_defunc to declare it. You use the name you used in 'rl_add_defunc' in the readline init file to bind the command to a key. The patch uses a different interface: the user provides a function that takes no arguments. He declares it by calling 'set_custom_hook', and calls it by using the name 'custom' in the init file to bind it to a key. An interface consistent between python and readline would be: def say_hello(key, count): ... readline.add_defunc("say_hello", say_hello) readline.parse_and_bind('"?" : say_hello') (Perhaps the 'add_defun' is an artefact of lack of dynamic features of C and would be dropped from the python interface). The patch's use of a 'custom' hook is more complicated than using the function name directly in the init file, and provides less functionality (a single command, and removes the arguments that the c command would have). Accepting this patch will cause minor compatibility trouble in future if anyone works out a way round the admittedly difficult technical problems of doing things the 'right' way. Given the interface troubles, I'm not convinced enough of the usefulness of the patch. ---------------------------------------------------------------------- Comment By: Ben Timby (btimby) Date: 2007-04-01 21:53 Message: Logged In: YES user_id=932679 Originator: YES If by adopt you mean adapt, that is what I have done. I simplified things to allow a single named function "custom" but it uses the gnu readline custom function interface (rl_add_defunc) . Have you even looked at the patch? ---------------------------------------------------------------------- Comment By: Paul Hankin (paulhankin) Date: 2007-04-01 17:47 Message: Logged In: YES user_id=1740099 Originator: NO Gnu readline supports custom functions in C - it would be better to adopt the gnu readline custom function interface to python, rather than using the 'custom' handler which smells of a hack. ---------------------------------------------------------------------- Comment By: Ben Timby (btimby) Date: 2007-03-28 19:01 Message: Logged In: YES user_id=932679 Originator: YES new Example: rl.py -- #!/usr/bin/python import readline def say_hello(): print print "this is my help text..." readline.on_new_line() readline.set_custom_hook(say_hello) readline.parse_and_bind("\"?\": custom") while True: data = raw_input("input# ") print "data: ", data -- ---------------------------------------------------------------------- Comment By: Ben Timby (btimby) Date: 2007-03-28 19:00 Message: Logged In: YES user_id=932679 Originator: YES File Added: python-2.3.4-readline_custom.patch ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=305470&aid=1690201&group_id=5470 _______________________________________________ Patches mailing list Patches@python.org http://mail.python.org/mailman/listinfo/patches