我在 GNU Emacs 24.3 上使用run-python
其“劣质 Python Shell”,并尝试获得类似于的行为lisp-send-last-sexp
,即在正在运行的解释器中发送和评估表达式。我每次只尝试对一行执行此操作。
我缩短了解决方案给出到以下函数:
(add-hook 'python-mode-hook
'my-python-send-statement)
(defun my-python-send-statement ()
(interactive)
(local-set-key [S-return] 'my-python-send-statement)
(end-of-line)
(set-mark (line-beginning-position))
(call-interactively 'python-shell-send-region))
成功了一半。当我运行此命令几行时,我得到了一串 >>> 提示符,我不知道为什么,因为应该只发送一行。此外,有时结果不会立即显示,我必须运行两次命令。例如:
9+9 # 运行.py文件第13行的命令,
======
# result in Python shell.
>>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> >>> 18
答案1
免责声明:以下为自我广告……
为了管理缓冲区和代码解释器之间的交互,我开发了isend-mode
。
使用方法如下:
在终端中运行 Python 解释器:
M-x
ansi-term
RET/usr/bin/python
RET切换到包含 Python 代码的缓冲区:
C-xb
my-buffer.py
RET将其与您的终端关联:
M-x
isend
RET*ansi-term*
RET键入C-RET以将当前缓冲区行发送到解释器。
它的优点isend-mode
(至少从我的角度来看)是与语言无关。您可以以相同的方式将其用于 python、shell 或您喜欢的任何解释语言。
答案2
好的,在进一步浏览了 python-shell 函数之后,我整理出了一个可以解决我的问题的技巧:在发送区域后发送打印命令!无论出于什么原因,这都会抑制所有 >>> 提示。
(add-hook 'python-mode-hook
'my-python-send-statement)
(defun my-python-send-statement ()
(interactive)
(local-set-key [S-return] 'my-python-send-statement)
(end-of-line)
(set-mark (line-beginning-position))
(call-interactively 'python-shell-send-region)
(python-shell-send-string "; print()"))