如何让Emacs Python解释器正常工作

时间:2015-11-02 18:41:37

标签: python emacs

我发现标准的Ubuntu Emacs Python解释器不是特别适合使用。考虑一下Emacs中的这个小程序:

print ['hello'] * 10000

使用C-c C-p和C-c C-r标记代码块我在Python解释器窗口中得到一个慢速输出。

如果我尝试使用C-x o C-c C-c停止输出,那么Emacs在接近100%的负载下运行会得到非常慢的响应。一段时间后我得到了KeyboardInterrupt,但是Python提示下的任何输入都很慢。这使得Emacs Python对我无法使用。

我想知道我是否缺少任何设置?

2 个答案:

答案 0 :(得分:2)

我可以确认,当您查看非常长的行,行> = 10,000个字符时,Emacs通常会变慢。没有简单的解决方法。 Emacs被设计为文本编辑器,源代码很少超过200个字符。

“解决方案”是对长线视而不见。例如,在运行print ["hello"] * 10000时,您可以通过转到缓冲区顶部(M-<)来“远离”。该命令将运行得更快,根据我的经验,这样做的速度提高了大约10倍。

在打印完所有文本后,Emacs仍然很慢,因为该行仍在查看中。将其滚出视图的简单方法是print "\n" * 50

一般来说,我尽量避免打印长线。例如,如果print a恰好打印出来,我可能会将其更改为print "\n".join(a)print a[:10]

答案 1 :(得分:2)

根据@ j-f-sebastian关于上述评论sys.displayhookrepr()大小的建议,这里有几次尝试:

from __future__ import print_function
import sys, textwrap
sys.displayhook = lambda value: print("\n".join(textwrap.wrap(repr(value), 80))) if type(value) == list else sys.__displayhook__(value)

以上内容包含行并且显示数据的速度仍然很慢,但在显示数据后,提示响应速度更快。

以下简单地限制了所有类型的输出:

from __future__ import print_function
import sys
sys.displayhook = lambda value: print(repr(value)[:200])

这是一个稍微提供更多信息的版本(并且输出更长):

from __future__ import print_function
import sys
sys.displayhook = lambda value: print(repr(value)) if len(repr(value)) < 1000 else print("%s ..." % repr(value)[:997])

要重置:

sys.displayhook = sys.__displayhook__