https://launchpad.net/ubuntu/+source/pyflakes/0.2.1+svn14502-1ubuntu1/+build/545566
Doing a Google search, you will see reports that Emacs hangs when using triple quotes ('''). You end up seeing really high CPU load and the only way to solve the issue is by killing the process. In fact, there was a $500 bounty to solve this issue 2 years ago:
http://www.plope.com/bounty_solved
I have solved our problem with triple-quotes. The problem is that Emacs expects PyFlakes to only output error messages, but on a syntax error, PyFlakes prints out an error message, then the *entire* contents of the module that it cannot import, and *finally* a line that contains a number of spaces equal to the offset into the file of the syntax error (in the case of my real-world file, the triple-quote was 3,896 characters into the file, so PyFlake's line of spaces was that long as well). The offending code is in the "pyflakes" command-line program and looks like this: print >> sys.stderr, 'could not compile %r:%d:' % (filename, lineno) print >> sys.stderr, line print >> sys.stderr, " " * (offset-2), "^" By removing or commenting out those last two lines, so that PyFlakes only outputs its error message, you will stop flooding the Emacs regular-expression engine with data. It's actually the long line of spaces that causes the problem, and it's one regular expression that's really sensitive to it (this is from the Emacs 22 flymake.el): ;; ant/javac (" *\\(\\[javac\\] *\\)?\\(\\([a-zA-Z]:\\)?[^:(\t\n]+\\)\:\\([0-9]+\\)\:[ \t\n]*\\(.+\\)" 2 4 nil 5)) For some reason (I'm not an RE engine guru), something about the way it's matching spaces takes exponential time when given several thousand spaces. Go figure. Anyway, I see no point in throwing anything but error messages at Flymake, so I comment out both the printing of the module and the spaces from PyFlakes.
The problem was corrected in PyFlakes v0.3.0 according to the release notes:
http://divmod.org/trac/browser/tags/releases/Pyflakes-0.4.0/NEWS.txt
0.3.0 (2009-01-30): 20 - Display more informative SyntaxError messages. 21 - Don't hang flymake with unmatched triple quotes (only report a single 22 line of source for a multiline syntax error). 23 - Recognize __builtins__ as a defined name. 24 - Improve pyflakes support for python versions 2.3-2.5 25 - Support for if-else expressions and with statements. 26 - Warn instead of error on non-existant file paths. 27 - Check for __future__ imports after other statements. 28 - Add reporting for some types of import shadowing. 29 - Improve reporting of unbound localsThe trick to fixing this issue on Ubuntu v8.04? Use pip install pyflakes, which will download the 0.4.0 version.
sudo apt-get remove pyflakes sudo pip install pyflakes
No comments:
Post a Comment