[IPython-dev] pyreadline and Tab insertion

Vivian De Smedt vds at aisystems.be
Sat Jun 7 04:40:02 EDT 2008


Dear All,

This is mail concerning pyreadline. I'm  a Window user and I'm using 
pyreadline. Because of my VisualStudio background I have configured code 
completion to be Ctrl+' ' and tab to be tab insertion.

Here is the corresponding section ipythonrc.ini

    #readline_parse_and_bind tab: complete
    #readline_parse_and_bind tab: menu-complete
    readline_parse_and_bind tab: tab-insert
    readline_parse_and_bind Control-space: complete

The completion part of that configuration works well but if I hit the 
tab touch I get a traceback in IPython basically because tabstop and 
line_cursor are not defined.

C:>ipython

In [1]: Readline internal error
Traceback (most recent call last):
  File "C:\Python25\lib\site-packages\pyreadline\console\console.py", 
line 671,
in hook_wrapper_23
    res = ensure_str(readline_hook(prompt))
  File "C:\Python25\lib\site-packages\pyreadline\rlmain.py", line 342, 
in readli
ne
    return self.mode.readline(prompt)
  File "C:\Python25\lib\site-packages\pyreadline\modes\emacs.py", line 
133, in r
eadline
    self._readline_from_keyboard()
  File "C:\Python25\lib\site-packages\pyreadline\modes\emacs.py", line 
90, in _r
eadline_from_keyboard
    r = dispatch_func(event)
  File "C:\Python25\lib\site-packages\pyreadline\modes\emacs.py", line 
289, in t
ab_insert
    ws = ' ' * (self.tabstop - (self.line_cursor%self.tabstop))
AttributeError: 'EmacsMode' object has no attribute 'line_cursor'

To address the problem I have define a default for tabstop in 
rlmain.Readline:

    class Readline(object):
        def __init__(self):
            self.startup_hook = None
            self.pre_input_hook = None
            self.completer = None
            self.completer_delims = " \t\n\"\\'`@$><=;|&{("
            self.console = console.Console()
            self.size = self.console.size()
            self.prompt_color = None
            self.command_color = None
            self.selection_color = self.console.saveattr<<4
            self.key_dispatch = {}
            self.previous_func = None
            self.first_prompt = True
            self.next_meta = False # True to force meta on next character
            self.tabstop = 4
            self.allow_ctrl_c=False
            self.ctrl_c_tap_time_interval=0.3
            self.debug=False

And slightly change the emacs and notemacs modes:

    class EmacsMode(basemode.BaseMode):
        ...
        def tab_insert(self, e): # (M-TAB)
            '''Insert a tab character. '''
            line_cursor = len(self.l_buffer)
            ws = ' ' * (self.tabstop - (line_cursor%self.tabstop))
            #ws = ' ' * (self.tabstop - (self.line_cursor%self.tabstop))
            self.insert_text(ws)

    class NotEmacsMode(basemode.BaseMode):
        ...
        def tab_insert(self, e): # (M-TAB)
            '''Insert a tab character. '''
            line_cursor = len(self.l_buffer)
            ws = ' ' * (self.tabstop - (line_cursor%self.tabstop))
            #ws = ' ' * (self.tabstop - (self.line_cursor%self.tabstop))
            self.insert_text(ws)

Please tell if you think about these propositions of changes.

Regards,
Vivian.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ipython-dev/attachments/20080607/8dab756f/attachment.html>


More information about the IPython-dev mailing list