Emacs中的IPython. 快速代码评估
更新: 这个问题仍然没有一个令人满意的答案。
我想在 Emacs 23.2(Linux)中把代码片段“发送”到 IPython 解释器。假设我已经在 Emacs 的一个窗口中启动了 IPython 终端(比如使用了 Python-mode.el
和 IPython.el
),有没有办法从另一个窗口中选择一段代码,然后把这段代码“发送”到已经启动的 IPython 终端呢?
我试过 C-c C-c
(发送整个缓冲区到终端)和 C-c |
(发送选定区域到终端),但这只在代码是用 Python 写的时候有效,而不是 IPython(IPython 可以运行 Python 代码)。原因似乎是,Emacs 对这两个命令会创建一个临时文件,文件后缀是 .py
(而不是 .ipy
),然后 IPython 把这个文件当作“Python 特有的代码”来解释。这就让我无法使用 IPython 特有的功能,比如魔法命令。
另外,我还看到 Emacs 提供了 M-| ('shell-command-on-region')
来在 shell 中运行选定的区域。为了用 IPython 解释器做到这一点,我试着把 shell-file-name
设置为我的 IPython 路径。但是,当我在选择区域后运行 M-|
时,Emacs 会提示我:
在区域上运行 shell 命令:
然后如果我按 RET
,我会在 *Shell Command Output*
窗口看到 IPython 的手册页面,而选定的区域并没有被执行。有没有什么 IPython 特有的命令可以让我在 M-| ('shell-command-on-region')
中运行我的代码呢?
谢谢!
2 个回答
我找到了一部分关于问题1的答案:
Python模式提供了一个快捷键C-c C-c
,可以把当前的代码发送到已经打开的Python命令行(类似地,C-c C-|
可以把选中的代码发送到命令行)。如果你安装了ipython.el
,那么默认的Python命令行就会变成IPython。
不过,这个功能只适用于普通的Python脚本,而不适用于IPython脚本。C-c C-c
的工作原理是把代码片段复制到一个临时文件,这个文件的后缀是.py,然后再发送到命令行。因为这个文件是以.py结尾的,所以IPython会把它当作普通的Python代码来执行,这样的话,代码片段里就不能包含IPython特有的代码(比如IPython的魔法命令)。
你在用 ipython.el 吗?
它应该可以在 Emacs 23 上正常工作。
如果没有,可以看看这个链接:EmacsWiki: iPython Emacs 23。
在 IPython Cookbook 里也有关于 Emacs 的部分(搜索 IPythonEmacs23;抱歉我不能发超过一个链接 :(
一旦你启动了一个 ipython-shell(按 C-c !),你就可以在这个已经启动的 shell 中执行任何缓冲区的代码片段,方法是使用“执行区域(C-c |)”。
安德烈亚斯