【问题标题】:Eval region ipython interpreter in aquamacsaquamacs 中的 Eval 区域 ipython 解释器
【发布时间】:2014-02-23 15:54:17
【问题描述】:

我正在尝试让 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(评估区域)命令可能会从解释器生成大量空白“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]:”行或更多行。

【问题讨论】:

    标签: emacs elisp ipython aquamacs python.el


    【解决方案1】:

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

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

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

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

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

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

    执行C-cC-r之后,如果你切换到python repl并按下enter,你实际上会得到打印输出。我猜的问题是python模式没有将最终的newline(触发评估)添加到发送到命令解释器的字符串中。我能够将此问题追溯到python.el 中的函数python-shell-send-string(执行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"))
    

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

    更新

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

    更新

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

    1) 从此url下载最新版本

    2) 将下载 python.el 的目录添加到加载路径,方法是在初始化文件中添加类似这样的内容

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

    3) 最后需要python-mode

    (require 'python)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多