假设我在Emacs中用M-x ansi-term
打开一个终端模拟器。这会在Emacs中打开一个带有我选择的shell的缓冲区。假设我从这个shell运行ipython
。我是否可以从另一个包含Python代码的Emacs缓冲区发送代码到这个ipython
会话?如果可以,如何操作?
ansi-term
缓冲区:
M-xansi-term
RET/usr/bin/ipython
RET
M-xisend-associate
RET*ansi-term*
RET
ansi-term
缓冲区中的解释器。(defun send-buffer-to-ipython ()
"Send current buffer to the running ipython process."
(interactive)
(let* ((ipython-buffer "*ansi-term*") ; the buffer name of your running terminal
(proc (get-buffer-process ipython-buffer)))
(unless proc
(error "no process found"))
(save-buffer)
(process-send-string proc
(format "execfile(\"%s\")\n" (buffer-file-name)))
(pop-to-buffer ipython-buffer) ; show ipython and select it
;; (display-buffer ipython-buffer) ; show ipython but don't select it
))
然后将命令send-buffer-to-ipython
绑定到您喜欢的任何键。我将其绑定到C-c C-c
(define-key python-mode-map [?\C-c ?\C-c] 'send-buffer-to-ipython)
python-send-region
会将当前缓冲区的内容保存到临时文件中,并发送命令以加载临时文件。 - Tao Pengansi_term
缓冲区,我该如何设置?我可以将运行 IPython 的 Emacs 缓冲区重命名为其他名称,并将其作为参数传递给 py-shell-name
吗?或者我们应该如何处理多个 ansi-term? - Amelio Vazquez-Reina
C-x h C-RET
(但我很少使用此功能,因为我的主要用途是逐行或逐部分解释脚本)。 - François Févotteisend
不能很好地处理其中有缩进的代码块的代码片段。例如,如果我选择具有if
块或带有其他未缩进代码的for
循环的代码,则isend
将不会按照IPython期望的方式发送缩进。在IPython中调用%paste
,将所选代码发送到shell是否更好?(即,您将使isend
将代码复制到Emacs剪贴板,然后在IPython缓冲区中调用%paste
)。这将允许isend
处理任意复杂的代码片段。 - Amelio Vazquez-Reinaisend
会忽略这样的行,但我已经上传了一个新版本,可以使用(setq isend-skip-empty-lines nil)
告诉它发送空行。 - François Févotteunexpected indent
,因为代码已经缩进了。解决isend
问题的唯一方法是在将代码块发送到缓冲区之前从代码块中删除任何额外的缩进(但保持行之间的相对缩进)。我认为这将是一个优雅的解决方案,并且它应该也适用于其他shell(其他shell对缩进不挑剔)。 - Amelio Vazquez-Reina