<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body bgcolor="#ffffff" text="#000000">
Dear All,<br>
<br>
This is mail concerning pyreadline. I'm&nbsp; 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.<br>
<br>
Here is the corresponding section ipythonrc.ini<br>
<blockquote>#readline_parse_and_bind tab: complete<br>
#readline_parse_and_bind tab: menu-complete<br>
readline_parse_and_bind tab: tab-insert<br>
readline_parse_and_bind Control-space: complete<br>
</blockquote>
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.<br>
<br>
<tt>C:&gt;ipython<br>
<br>
In [1]: Readline internal error<br>
Traceback (most recent call last):<br>
&nbsp; File "C:\Python25\lib\site-packages\pyreadline\console\console.py",
line 671,<br>
in hook_wrapper_23<br>
&nbsp;&nbsp;&nbsp; res = ensure_str(readline_hook(prompt))<br>
&nbsp; File "C:\Python25\lib\site-packages\pyreadline\rlmain.py", line 342,
in readli<br>
ne<br>
&nbsp;&nbsp;&nbsp; return self.mode.readline(prompt)<br>
&nbsp; File "C:\Python25\lib\site-packages\pyreadline\modes\emacs.py", line
133, in r<br>
eadline<br>
&nbsp;&nbsp;&nbsp; self._readline_from_keyboard()<br>
&nbsp; File "C:\Python25\lib\site-packages\pyreadline\modes\emacs.py", line
90, in _r<br>
eadline_from_keyboard<br>
&nbsp;&nbsp;&nbsp; r = dispatch_func(event)<br>
&nbsp; File "C:\Python25\lib\site-packages\pyreadline\modes\emacs.py", line
289, in t<br>
ab_insert<br>
&nbsp;&nbsp;&nbsp; ws = ' ' * (self.tabstop - (self.line_cursor%self.tabstop))<br>
AttributeError: 'EmacsMode' object has no attribute 'line_cursor'<br>
</tt><br>
To address the problem I have define a default for tabstop in
rlmain.Readline:<br>
<blockquote><tt>class Readline(object):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; def __init__(self):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.startup_hook = None</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.pre_input_hook = None</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.completer = None</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.completer_delims = " \t\n\"\\'`@$&gt;&lt;=;|&amp;{("</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.console = console.Console()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.size = self.console.size()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.prompt_color = None</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.command_color = None</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.selection_color = self.console.saveattr&lt;&lt;4</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.key_dispatch = {}</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.previous_func = None</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.first_prompt = True</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.next_meta = False # True to force meta on next
character</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">self.tabstop = 4</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.allow_ctrl_c=False</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.ctrl_c_tap_time_interval=0.3</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.debug=False</tt><br>
</blockquote>
And slightly change the emacs and notemacs modes:<br>
<blockquote><tt>class EmacsMode(basemode.BaseMode):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; ...</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; def tab_insert(self, e): # (M-TAB)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''Insert a tab character. '''</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">line_cursor = len(self.l_buffer)</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">ws = ' ' * (self.tabstop -
(line_cursor%self.tabstop))</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#009900">#ws = ' ' * (self.tabstop -
(self.line_cursor%self.tabstop))</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.insert_text(ws)</tt><br>
  <br>
  <tt>class NotEmacsMode(basemode.BaseMode):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; ...</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; def tab_insert(self, e): # (M-TAB)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '''Insert a tab character. '''</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">line_cursor = len(self.l_buffer)</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">ws = ' ' * (self.tabstop -
(line_cursor%self.tabstop))</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#009900">#ws = ' ' * (self.tabstop -
(self.line_cursor%self.tabstop))</font></tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.insert_text(ws)</tt><br>
</blockquote>
Please tell if you think about these propositions of changes.<br>
<br>
Regards,<br>
Vivian.<br>
<br>
</body>
</html>