<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Dear all,<br>
<br>
This mail to propose a new feature for IPython together with a
proposition of implementation.<br>
I'm a windows user and I love IPython to run Python command, debug
Python scripts and inspect Python script failures.<br>
<br>
However I prefer to edit my scripts in an non console text editor.
That's why each time IPython tell me my script has a problem at a given
line I jump in my editor to inspect the code and fix it.<br>
<br>
Since IPython has all the information needed I was wondering if it
could do it himself and that is the purpose of my patch.<br>
<br>
I the attached patch I have introduced a new hook
'synchronize_with_editor' when defined IPython synchronize my editor
with the code it is considering in a bunch of situations:<br>
&nbsp;- When it notice that it couldn't import a code that is syntactically
incorrect (and let me fix it swiftly)<br>
&nbsp;- When it print a traceback because a script failed (and let me at
what portion of the code the script failed)<br>
&nbsp;- When the debugger print a bunch of line of the current line (and let
me follow the progression of the code pointer in my favorite editor
which give a much bigger code context)<br>
<br>
With that hook set in place debugging script with IPython is nearly as
easy (and for the reasons you know even more easy) that debugging with
a Gui debugger as Komodo or PythonWin.<br>
<br>
Here is the version of the hook I have put in my "ipy_user_conf.py"
configuration file:<br>
<blockquote><tt># vds &gt;&gt;</tt><br>
  <tt>import win32api</tt><br>
  <tt>import win32ui</tt><br>
  <tt>import win32console</tt><br>
  <tt>import dde</tt><br>
  <tt>import os</tt><br>
  <br>
  <tt>def synchronize_with_editor(ip, filename, lineno, columnno):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; if not os.path.isabs(filename):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename = os.path.join(os.getcwd(), filename)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; if not os.path.isfile(filename):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "couldn't find file:", file</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; h = win32console.GetConsoleWindow()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; w = win32ui.CreateWindowFromHandle(h)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; w.SetWindowText("%s %d" % (filename, lineno))</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; </tt><br>
  <tt>&nbsp;&nbsp;&nbsp; server = dde.CreateServer()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; server.Create("myddeserver")</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; conversation = dde.CreateConversation(server)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; conversation.ConnectTo("uedit32", "System")</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; conversation.Exec(r'[open("%s/%d"])' % (filename,
lineno)) </tt><br>
  <tt>&nbsp;&nbsp;&nbsp; </tt><br>
  <tt>&nbsp;&nbsp;&nbsp; win32api.Sleep(10)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; w.SetForegroundWindow()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; server.Shutdown()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><br>
  <tt># vds &lt;&lt;</tt><br>
  <br>
  <tt>import IPython.ipapi</tt><br>
  <tt>ip = IPython.ipapi.get()</tt><br>
  <tt>ip.set_hook("synchronize_with_editor", synchronize_with_editor)</tt><br>
</blockquote>
For the one that would be interested at testing it.<br>
In that version I use UltraEdit and its DDE functionality but something
simpler works also for other editors that dont have DDE capabilities:<br>
<blockquote><tt># vds &gt;&gt;</tt><br>
  <tt>import win32api</tt><br>
  <tt>import win32console</tt><br>
  <tt>import os</tt><br>
  <br>
  <tt>def synchronize_with_editor(ip, filename, lineno, columnno):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; if not os.path.isabs(filename):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; filename = os.path.join(os.getcwd(), filename)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; if not os.path.isfile(filename):</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "couldn't find file:", file</tt><br>
  <tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; h = win32console.GetConsoleWindow()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; w = win32ui.CreateWindowFromHandle(h)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; w.SetWindowText("%s %d" % (filename, lineno))</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; </tt><br>
  <tt>&nbsp;&nbsp;&nbsp; os.system(</tt><tt>"uedit32</tt><tt>/%d</tt><tt>" % </tt><tt>lineno)</tt><br>
  <tt>&nbsp;&nbsp; </tt><br>
  <tt>&nbsp;&nbsp;&nbsp; win32api.Sleep(10)</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; w.SetForegroundWindow()</tt><br>
  <tt>&nbsp;&nbsp;&nbsp; server.Shutdown()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </tt><br>
  <tt># vds &lt;&lt;</tt><br>
  <br>
  <tt>import IPython.ipapi</tt><br>
  <tt>ip = IPython.ipapi.get()</tt><br>
  <tt>ip.set_hook("synchronize_with_editor", synchronize_with_editor)</tt><br>
</blockquote>
I put in attachment a patch for the 8.1 version. I don't have svn
access here but if some one send me the code of the latest version I'll
be glad to send a patch for that version too.<br>
<br>
<br>
Kindest regards,<br>
Vivian.<br>
<br>
</body>
</html>