Eval region ipython译员在aquamacs

时间:2014-02-23 15:54:17

标签: emacs elisp ipython aquamacs python.el

我正在努力让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]:”行或更多行。

1 个答案:

答案 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)