在 GNU Emacs 中执行 Python 单行语句

在 GNU Emacs 中执行 Python 单行语句

我在 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

使用方法如下:

  1. 在终端中运行 Python 解释器:

    M-xansi-termRET/usr/bin/pythonRET

  2. 切换到包含 Python 代码的缓冲区:

    C-xbmy-buffer.pyRET

  3. 将其与您的终端关联:

    M-xisendRET*ansi-term*RET

  4. 键入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()"))

相关内容