1

我正在尝试使 Aquamacs 3.0a GNU Emacs 24.3.50.2 与 iPython 1.2.0 作为解释器一起工作。我能够使用 python.el 中的指令使 iPython 基本上正常工作。特别是,我将此处最佳答案中给出的设置添加到了我的 .emacs 文件中,但我仍然看到一些奇怪的行为。

注意:我的 .emacs 文件中的设置显然适用于 iPython 0.11,而不是 1.2.0,这可能是问题的根源。我不是 lisp 专家,因此将不胜感激任何帮助。

这是我能够重现的一个症状:^C^R(评估区域)命令可能会从解释器生成大量空白“In [X]:”。为了重现 aquamacs 中的问题,我创建了一个名为的文件test.py并将以下代码放入其中:

spam = "spam "
spam = spam + spam
spam = spam + spam
print spam

然后我输入 ^C^P(启动解释器),返回test.py缓冲区,然后输入 ^C^C(评估缓冲区)。输出是:

(... 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]:”行。

4

1 回答 1

3

^C^R (eval region) 命令可能会为解释器生成大量空白“In [X]:”。

这是我对这个问题的理解。您所看到的是如何评估代码的副作用comint-mode(这是在其上编写 python-mode 的 repl 的通用模式)。

基本上,它将您选择的字符串按原样发送到劣质进程(包括换行符等),然后它接收来自劣质进程的输出并将其打印在 emacs comint 缓冲区(您在 emacs 中打开的 repl)中。蟒蛇代码

spam = "spam "
spam = spam + spam
spam = spam + spam

不要产生任何输出,这就是为什么您会看到空白的“In [X]:”行。

这一切都很好。但随后我突出显示最后一行打印垃圾邮件,然后键入 ^C^R。输出:

完成后C-cC-r,如果您切换到 python repl 并按下enter,您实际上会打印输出。我猜的问题是python模式没有将final newline(触发评估)添加到发送到命令解释器的字符串中。我能够将此问题追溯到函数python-shell-send-stringpython.el(做C-h fpython-shell-send-stringRET,你会python.el在帮助缓冲区中看到一个链接,单击它,emacs 将带你到函数的定义)。在函数的最后,我们有这些行

(when (or (not (string-match "\n$" string))
                (string-match "\n[ \t].*\n?$" string))
        (comint-send-string process "\n"))

似乎这会检查刚刚发送的字符串是否有 final newline,如果没有,它会显式发送 a newline,单行字符串的检查失败,python 模式永远不会插入最后一个换行符。这似乎是一个错误,也许这是在 emacs 主干中修复的,需要检查。

更新

我可以确认这已在 emacs 主干中修复。事实上,您报告的两个问题都已得到修复。

更新

python.el 的github 存储库(现已弃用)包含获取最新版本库的说明。

1) 从此网址下载最新版本

2)python.el通过将类似这样的内容添加到您的init文件中,将您下载的目录添加到您的加载路径

(add-to-list 'load-path "<name_of_the_directory>")

3) 最后需要 python-mode

(require 'python)
于 2014-02-23T18:02:08.647 回答