我正试图让Aquamacs 3.0a GNU Emacs 24.3.50.2与iPython 1.2.0一起作为解释器。我基本上可以使用python.el中的说明让iPython正常工作。特别是,我在.emacs文件中添加了顶部答案中给出的设置,但我仍然看到一些奇怪的行为。
注意:我的.emacs文件中的设置显然适用于iPython 0.11,而不是1.2.0,这可能是问题的根源。我不是一个口齿不清的专家,所以任何帮助都将不胜感激。
以下是我能够重现的一个症状:^C^R(eval region)命令可能会在解释器中生成大量空白的"In[X]:"。为了在aquamacs中重现这个问题,我制作了一个名为test.py
的文件,并在其中放入以下代码:
spam = "spam "
spam = spam + spam
spam = spam + spam
print spam
然后我键入^C^p(启动解释器),返回到test.py
缓冲区,然后键入^C^ C(eval缓冲区)。输出为:
(... iPython startup message ...)
In [1]:
In [2]:
In [3]:
In [4]: spam spam spam spam
In [5]:
这一切都很好。但随后我高亮显示最后一行print spam
,然后键入^C^R。输出:
In [5]:
In [5]:
In [5]:
奇怪,不是吗?文件越长,情况就越糟。即使活动区域是一行,我也经常看到15行或更多的空白"In[X]:"行。
^C^R(eval region)命令可能会生成大量空白的"In[X]:"从到口译员。
以下是我对该问题的理解。您看到的是如何在comint-mode
中评估代码的副作用(这是一个通用模式,在该模式之上编写python模式的repl)。
基本上,它将您选择的字符串原样发送给下级进程(包括换行符等),然后接收下级进程的输出并将其打印在emacs comint缓冲区(您在emacs中打开的repl)中。python代码
spam = "spam "
spam = spam + spam
spam = spam + spam
不产生任何输出,这就是您看到空白"In[X]:"行的原因。
这一切都很好。但我强调了最后一行打印垃圾邮件和然后键入^C^R。输出:
在执行C-CC-r之后,如果切换到python repl并按>输入-hpython-shell-send-string
<kbd〉RET>,您将在帮助缓冲区中看到指向python.el
的链接,单击它,emacs将带您了解函数的定义)。在函数的末尾,我们有以下行
(when (or (not (string-match "n$" string))
(string-match "n[ t].*n?$" string))
(comint-send-string process "n"))
这似乎会检查刚刚发送的字符串是否有一个最终的newline
,如果没有,它会显式地发送一个newline
,对单行字符串的检查会失败,python模式永远不会插入最后一行换行符。这似乎是一个错误,也许这是在emacs主干中修复的,需要检查。
更新
我可以确认这个问题已经在emacs的行李箱中解决了。事实上,你报告的两个问题都已经解决了。
更新
python.el的github存储库现在已被弃用,它提供了获取该库最新版本的说明。
1) 从这个网址下载最新版本
2) 将下载python.el
的目录添加到您的加载路径中,方法是在初始化文件中添加类似的内容
(add-to-list 'load-path "<name_of_the_directory>")
3) 最后需要python模式
(require 'python)