在Emacs中使用ipython的奇怪行为

时间:2011-07-27 17:16:27

标签: emacs ipython

我在使用ipython作为python-mode.el的python解释器时遇到了一个小问题。一切都在功能上有效,但按RET会向前跳两行(无论我是否输入了表达式),并且函数定义的自动缩进很奇怪。这就是它的样子:

In [164]: a = 1

In [165]:   
In [166]: a + 3

Out[166]: 4

In [167]:   
In [168]: def nine():

   .....:    .....:     return 4+5

   .....: 
In [169]: 

In [170]:   

只有一个.....:在'返回'行。我怀疑ipython.el或python-mode.el中的某些缩进/换行函数是以某种方式被调用两次。 (我真的不知道elisp,但这可能是让我进入它的问题)。

当我做“M-x ansi-term RET ipython”时,它按预期工作,但这并不理想,因为从其他文件发送代码,调试等不起作用。

我可以想象两种方法来解决这个问题:要么弄清楚我的设置是如何导致双缩进/换行并修复它,要么以某种方式将默认的python解释器从ipython.el更改为ipython,同时仍然保留能够发送代码和调试。

对于从何处开始这些建议表示赞赏。

3 个答案:

答案 0 :(得分:1)

您可以在Python缓冲区(M-x describe-bindings)中检查RET的绑定,然后从那里开始。对我来说它必然会换行。单击绑定函数或使用M-x describe-function查找绑定函数的定义。

答案 1 :(得分:0)

好的,我在将.emacs从我的Ubuntu工作机器移植到MacBook的过程中想到了这一点。

首先,我从.emacs中注释掉以下几行:

(defadvice comint-send-input (around block-comint-formatting activate)
 (if (string= (buffer-name) "*Python*")
     (letf (((symbol-function 'add-text-properties) (lambda (x y z) nil)))
       ad-do-it))
ad-do-it)

哪个摆脱了双重换行的事情。我还添加了

(define-key py-shell-map "\C-j" 'ipython-send-and-indent)

然后我的ipython.el结束,所以我可以使用它,就像在python-mode中一样。

答案 2 :(得分:0)

M-x ipython RET

使用当前的python-mode.el

,只需要

http://launchpad.net/python-mode

虽然ipython并不完美,但您可以帮助发送错误报告