Account Options

  1. Sign in
The old Google Groups will be going away soon, but your browser is incompatible with the new version.
Google Groups Home
« Groups Home
Message from discussion readline trick needed
The group you are posting to is a Usenet group. Messages posted to this group will make your email address visible to anyone on the Internet.
Your reply message has not been sent.
Your post was successful
 
From:
To:
Cc:
Followup To:
Add Cc | Add Followup-to | Edit Subject
Subject:
Validation:
For verification purposes please type the characters you see in the picture below or the numbers you hear by clicking the accessibility icon. Listen and type the numbers you hear
 
Peter Otten  
View profile  
 More options Oct 16 2012, 4:29 am
Newsgroups: comp.lang.python
From: Peter Otten <__pete...@web.de>
Date: Tue, 16 Oct 2012 10:30:01 +0200
Local: Tues, Oct 16 2012 4:30 am
Subject: [on topic] Re: readline trick needed

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


 
You must Sign in before you can post messages.
To post a message you must first join this group.
Please update your nickname on the subscription settings page before posting.
You do not have the permission required to post.