py-down-exception IPython issues

Bug #913428 reported by Andreas Roehler
8
This bug affects 1 person
Affects Status Importance Assigned to Milestone
python-mode.el
Fix Released
Medium
Andreas Roehler

Bug Description

Most things work well, there are couple of strange things.

First, if you repeatedly press C-c - to go up the exception stack. With
regular Python, the cursor ends up jumping to line 1 of the file with
the exception and in the minibuffer it says: "Jumping to exception in
file <stdin> on line 1"; it might be better just to stay at the
outermost frame in the stack as line 1 might be a long way away. With
IPython the behaviour is a bit worse because the cursor in the *IPython*
buffer goes to the lines like

----> 1 demo1.f()

(This is for the demo1.py file I sent before and attached again.) And
Emacs opens a new buffer called "---->" which is a bit disconcerting.
It's worse if you use the universal argument to C-c =

For the same file I get a new buffer "----->" associated with the file
"/Users/reverson/projects/edge/<ipython-input-1-b03658927958> in
<module>()" which I guess comes from the IPython traceback lines:

In [5]: demo1.f()
Hello from f
Hello from g
Hello from h -- just before exception
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
/Users/reverson/projects/edge/<ipython-input-5-1cebb13502c5> in <module>()
----> 1 demo1.f()

Secondly, the SyntaxError exceptions in the IPython buffer don't get
matched. Pressing C-c - does nothing with the following:

In [1]: import demo2
  File "demo3.py", line 4
    if a != 25
              ^
SyntaxError: invalid syntax

I'm afraid I don't understand exactly what you've done for the buffer switching and the way the string matching is now supposed to work, so I haven't been able to come up with a fix. Sorry.

One thing that would be very useful would be to limit the searching for exception reporting lines to the *last* set of exceptions. If you have a long Python or IPython session there will probably be several exceptions and pressing C-c - repeatedly, not only goes up the stack for the last exception, but then revisits the stack for the previous one, and so on until the beginning of the buffer is reached. I don't know if it's feasible to narrow the search just to the last exception.

Anyway, it's much, much better in it's current state than before. Many thanks.

Best,
Richard.

(Here are the demo files again, just in case.)

Changed in python-mode:
assignee: nobody → Andreas Roehler (a-roehler)
milestone: none → 6.0.5
importance: Undecided → Medium
Revision history for this message
Andreas Roehler (a-roehler) wrote : Re: [Bug 913428] [NEW] py-down-exception IPython issues

Am 08.01.2012 15:32, schrieb Andreas Roehler:
> Public bug reported:
>
>
> Most things work well, there are couple of strange things.
>
> First, if you repeatedly press C-c - to go up the exception stack. With
> regular Python, the cursor ends up jumping to line 1 of the file with
> the exception and in the minibuffer it says: "Jumping to exception in
> file<stdin> on line 1"; it might be better just to stay at the
> outermost frame in the stack as line 1 might be a long way away. With
> IPython the behaviour is a bit worse because the cursor in the *IPython*
> buffer goes to the lines like
>
> ----> 1 demo1.f()
>
> (This is for the demo1.py file I sent before and attached again.) And
> Emacs opens a new buffer called "---->" which is a bit disconcerting.
> It's worse if you use the universal argument to C-c =
>
> For the same file I get a new buffer "----->" associated with the file
> "/Users/reverson/projects/edge/<ipython-input-1-b03658927958> in
> <module>()" which I guess comes from the IPython traceback lines:
>
> In [5]: demo1.f()
> Hello from f
> Hello from g
> Hello from h -- just before exception
> ---------------------------------------------------------------------------
> ZeroDivisionError Traceback (most recent call last)
> /Users/reverson/projects/edge/<ipython-input-5-1cebb13502c5> in<module>()
> ----> 1 demo1.f()
>
>
> Secondly, the SyntaxError exceptions in the IPython buffer don't get
> matched. Pressing C-c - does nothing with the following:
>
> In [1]: import demo2
> File "demo3.py", line 4
> if a != 25
> ^
> SyntaxError: invalid syntax
>
>
> I'm afraid I don't understand exactly what you've done for the buffer switching and the way the string matching is now supposed to work, so I haven't been able to come up with a fix. Sorry.
>
>
> One thing that would be very useful would be to limit the searching for exception reporting lines to the *last* set of exceptions. If you have a long Python or IPython session there will probably be several exceptions and pressing C-c - repeatedly, not only goes up the stack for the last exception, but then revisits the stack for the previous one, and so on until the beginning of the buffer is reached. I don't know if it's feasible to narrow the search just to the last exception.
>
>
> Anyway, it's much, much better in it's current state than before. Many thanks.
>
> Best,
> Richard.
>
>

better now?
Thanks for the excellent examples BTW

cheers,

Andreas

Changed in python-mode:
status: New → Fix Committed
Revision history for this message
Richard Everson (r-m-everson) wrote : Re: [Bug 913428] py-down-exception IPython issues
  • *IPython* Edit (2.0 KiB, application/octet-stream; name="*IPython*")
Download full text (3.5 KiB)

Hi Andreas,

A good improvement. There's still a minor bug with IPython and moving up the stacks with C-c -. In the demo1.py example, pressing C-c - repeatedly goes up the stack until the

----> 1 demo1.f()

line is reached, at which point string-match says "wrong-type-argument stringp nil"; here's the backtrace:

Debugger entered--Lisp error: (wrong-type-argument stringp nil)
  string-match(".+.pyc" nil)
  (if (string-match ".+.pyc" file) (progn (setq file ...)))
  (when (string-match ".+.pyc" file) (setq file (substring file 0 -1)))
  (progn (setq py-last-exeption-buffer (current-buffer)) (if (save-match-data ...) (progn ...) (setq line ... pos ... file ...)) (when (string-match ".+.pyc" file) (setq file ...)) (when (string= errwhere "Bottom") (goto-char pos)) (if (and file line) (if ... ... ...) (error "%s of traceback" errwhere)))
  (if (not (save-match-data ...)) (progn (setq py-last-exeption-buffer ...) (if ... ... ...) (when ... ...) (when ... ...) (if ... ... ...)) (goto-char orig) (error "%s of traceback" errwhere))
  (if (save-match-data (eq ... origline)) (progn (forward-line ...) (py-find-next-exception start buffer searchdir errwhere)) (if (not ...) (progn ... ... ... ... ...) (goto-char orig) (error "%s of traceback" errwhere)))
  (if (funcall searchdir py-traceback-line-re nil t) (if (save-match-data ...) (progn ... ...) (if ... ... ... ...)))
  (let ((orig ...) (origline ...) file line pos) (goto-char (py-point start)) (if (funcall searchdir py-traceback-line-re nil t) (if ... ... ...)))
  py-find-next-exception(bol "*IPython*" re-search-backward "Top")
  (if (string= start "TOP") (py-find-next-exception (quote bob) buffer (quote re-search-forward) "Top") (py-find-next-exception (quote bol) buffer (quote re-search-backward) "Top"))
  (if (eq direction (quote up)) (if (string= start "TOP") (py-find-next-exception ... buffer ... "Top") (py-find-next-exception ... buffer ... "Top")) (if (string= start "BOTTOM") (py-find-next-exception ... buffer ... "Bottom") (py-find-next-exception ... buffer ... "Bottom")))
  (let* ((name ...) (buffer ...)) (when buffer (set-buffer ...)) (switch-to-buffer (current-buffer)) (if (eq direction ...) (if ... ... ...) (if ... ... ...)))
  py-find-next-exception-prepare(up nil)
  py-up-exception(nil)
  call-interactively(py-up-exception nil nil)

At this point the cursor in the *IPython* buffer is sitting at the start of the "----> 1 demo1.f()" line. It's not much of a problem, because on pressing C-c - again, the mini-buffer reports, "Top of traceback".

>> Secondly, the SyntaxError exceptions in the IPython buffer don't get
>> matched. Pressing C-c - does nothing with the following:
>>
>> In [1]: import demo2
>> File "demo3.py", line 4
>> if a != 25
>> ^
>> SyntaxError: invalid syntax
>>

Works well for me!

>> One thing that would be very useful would be to limit the searching for exception reporting lines to the *last* set of exceptions. If you have a long Python or IPython session there will probably be several exceptions and pressing C-c - repeatedly, not only goes up the stack for the last exception, but then revisits the stack for the previous one, and so on un...

Read more...

Revision history for this message
Andreas Roehler (a-roehler) wrote :
Download full text (3.8 KiB)

Am 09.01.2012 18:44, schrieb Richard Everson:
> Hi Andreas,
>
> A good improvement. There's still a minor bug with IPython and moving
> up the stacks with C-c -. In the demo1.py example, pressing C-c -
> repeatedly goes up the stack until the
>
> ----> 1 demo1.f()
>
> line is reached, at which point string-match says "wrong-type-argument
> stringp nil"; here's the backtrace:
>
> Debugger entered--Lisp error: (wrong-type-argument stringp nil)
> string-match(".+.pyc" nil)
> (if (string-match ".+.pyc" file) (progn (setq file ...)))
> (when (string-match ".+.pyc" file) (setq file (substring file 0 -1)))
> (progn (setq py-last-exeption-buffer (current-buffer)) (if (save-match-data ...) (progn ...) (setq line ... pos ... file ...)) (when (string-match ".+.pyc" file) (setq file ...)) (when (string= errwhere "Bottom") (goto-char pos)) (if (and file line) (if ... ... ...) (error "%s of traceback" errwhere)))
> (if (not (save-match-data ...)) (progn (setq py-last-exeption-buffer ...) (if ... ... ...) (when ... ...) (when ... ...) (if ... ... ...)) (goto-char orig) (error "%s of traceback" errwhere))
> (if (save-match-data (eq ... origline)) (progn (forward-line ...) (py-find-next-exception start buffer searchdir errwhere)) (if (not ...) (progn ... ... ... ... ...) (goto-char orig) (error "%s of traceback" errwhere)))
> (if (funcall searchdir py-traceback-line-re nil t) (if (save-match-data ...) (progn ... ...) (if ... ... ... ...)))
> (let ((orig ...) (origline ...) file line pos) (goto-char (py-point start)) (if (funcall searchdir py-traceback-line-re nil t) (if ... ... ...)))
> py-find-next-exception(bol "*IPython*" re-search-backward "Top")
> (if (string= start "TOP") (py-find-next-exception (quote bob) buffer (quote re-search-forward) "Top") (py-find-next-exception (quote bol) buffer (quote re-search-backward) "Top"))
> (if (eq direction (quote up)) (if (string= start "TOP") (py-find-next-exception ... buffer ... "Top") (py-find-next-exception ... buffer ... "Top")) (if (string= start "BOTTOM") (py-find-next-exception ... buffer ... "Bottom") (py-find-next-exception ... buffer ... "Bottom")))
> (let* ((name ...) (buffer ...)) (when buffer (set-buffer ...)) (switch-to-buffer (current-buffer)) (if (eq direction ...) (if ... ... ...) (if ... ... ...)))
> py-find-next-exception-prepare(up nil)
> py-up-exception(nil)
> call-interactively(py-up-exception nil nil)
>
>
> At this point the cursor in the *IPython* buffer is sitting at the start
> of the "----> 1 demo1.f()" line. It's not much of a problem, because on
> pressing C-c - again, the mini-buffer reports, "Top of traceback".
>
>>> Secondly, the SyntaxError exceptions in the IPython buffer don't get
>>> matched. Pressing C-c - does nothing with the following:
>>>
>>> In [1]: import demo2
>>> File "demo3.py", line 4
>>> if a != 25
>>> ^
>>> SyntaxError: invalid syntax
>>>
>
> Works well for me!
>
>
>>> One thing that would be very useful would be to limit the searching for exception reporting lines to the *last* set of exceptions. If you have a long Python or IPython session there will probably be several exceptions and press...

Read more...

Revision history for this message
Andreas Roehler (a-roehler) wrote :

Am 09.01.2012 18:44, schrieb Richard Everson:
> A good improvement. There's still a minor bug with IPython and moving

Hi Richard,

it's a regexp now which must much the last line above - see diff.

Does it?

Cheers,

Andreas

Changed in python-mode:
status: Fix Committed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Bug attachments

Remote bug watches

Bug watches keep track of this bug in other bug trackers.