我正在努力让Aquamacs 3.0a GNU Emacs 24.3.50.2与iPython 1.2.0一起使用作为解释器。我能够使用python.el中的指令使iPython基本上正常工作。特别是,我将顶部答案here中给出的设置添加到我的.emacs文件中,但我仍然看到一些奇怪的行为。
注意:我的.emacs文件中的设置显然适用于iPython 0.11,而不是1.2.0,这可能是问题的根源。我不是一个lisp专家,所以对此有任何帮助将不胜感激。
这是我能够重现的一个症状:^ 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 buffer)。输出是:
(... 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]:”行或更多行。
答案 0 :(得分:3)
^ C ^ R(eval region)命令可能会产生大量空白“In [X]:” 从翻译到翻译。
以下是我能够理解的问题。您所看到的是如何在comint-mode
中评估代码的副作用(这是一种基于其编写python-mode的repl的通用模式)。
基本上它将你选择的字符串发送到下级进程(包括换行符等),然后它接收来自下级进程的输出并将其打印在emacs comint缓冲区(你在emacs中打开的repl)中。 python代码
spam = "spam "
spam = spam + spam
spam = spam + spam
不要产生任何输出,这就是为什么你看到空白的“In [X]:”行。
这一切都很好。但后来我突出了最后一行打印垃圾邮件和 然后键入^ C ^ R.输出:
在执行 C-c C-r 之后,如果切换到python repl并按输入,您将实际打印输出。我猜的问题是python-mode不会将最终newline
(触发评估)添加到发送给命令解释器的字符串。我能够将此问题跟踪到python-shell-send-string
中的函数python.el
(执行 Ch f python-shell-send-string
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 trunk需要检查。
<强>更新强>
我可以确认这已在emacs主干中修复。实际上,您报告的两个问题都已修复。
<强>更新强>
python.el的github repository现已弃用,它提供了获取最新版本库的说明。
1)从此url
下载最新版本 2)通过在init文件中添加类似内容,将已下载python.el
的目录添加到加载路径
(add-to-list 'load-path "<name_of_the_directory>")
3)最后需要python-mode
(require 'python)