Emacs中的IPython. 快速代码评估

6 投票
2 回答
3781 浏览
提问于 2025-04-16 09:06

更新: 这个问题仍然没有一个令人满意的答案。

我想在 Emacs 23.2(Linux)中把代码片段“发送”到 IPython 解释器。假设我已经在 Emacs 的一个窗口中启动了 IPython 终端(比如使用了 Python-mode.elIPython.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 个回答

0

我找到了一部分关于问题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的魔法命令)。

1

你在用 ipython.el 吗?

它应该可以在 Emacs 23 上正常工作。

如果没有,可以看看这个链接:EmacsWiki: iPython Emacs 23

在 IPython Cookbook 里也有关于 Emacs 的部分(搜索 IPythonEmacs23;抱歉我不能发超过一个链接 :(

一旦你启动了一个 ipython-shell(按 C-c !),你就可以在这个已经启动的 shell 中执行任何缓冲区的代码片段,方法是使用“执行区域(C-c |)”。

安德烈亚斯

撰写回答