从emacs运行交互式python脚本

从emacs运行交互式python脚本,python,emacs,Python,Emacs,我是一个相当熟练的vim用户,但是我的朋友告诉我很多关于emacs的好东西,所以我决定尝试一下——特别是在找到了恰当命名的邪恶模式之后 无论如何,我目前正在编写一个需要用户输入的python脚本(cmd.cmd的一个子类)。在vim中,如果我想尝试它,我可以简单地执行:!python%,然后可以与我的脚本交互,直到它退出。在emacs中,我尝试了M-!python script.py确实会在一个单独的缓冲区中运行脚本,但随后返回的结果似乎不会发送回脚本,而是被emacs缓冲区捕获。我还试着看一下

我是一个相当熟练的vim用户,但是我的朋友告诉我很多关于emacs的好东西,所以我决定尝试一下——特别是在找到了恰当命名的邪恶模式之后

无论如何,我目前正在编写一个需要用户输入的python脚本(cmd.cmd的一个子类)。在vim中,如果我想尝试它,我可以简单地执行
:!python%
,然后可以与我的脚本交互,直到它退出。在emacs中,我尝试了
M-!python script.py确实会在一个单独的缓冲区中运行脚本,但随后返回的结果似乎不会发送回脚本,而是被emacs缓冲区捕获。我还试着看一下python模式的
C-C-C
,但是它在一些临时目录中运行脚本,而我只想在
(pwd)
中运行它

那么,有什么规范的方法可以做到这一点吗?

我不知道规范,但是如果我需要与脚本交互,我会执行M-x
shell
RET并从那里运行脚本

还有M-x
终端仿真器
用于更严肃的终端仿真,而不仅仅是shell的东西。

我喜欢使用Emacs“compile”命令来测试/运行我的python脚本
M
-
X
compile
RET
将调出默认的“make-k”,但如果您删除它并将其放入脚本的命令行(包括选项),后续的“compiles”将自动提供新的“compile”命令。脚本的所有输出都将显示在编译缓冲区中。(与shell相反,每次调用它时,它都会提供一个干净的缓冲区。适合搜索等。如果在运行之前忘记保存脚本,compile会询问您是否要保存文件。)

当您重新启动Emacs时,您将丢失命令行。但是,您可以让Emacs为保存脚本的缓冲区设置compile命令,方法是在python脚本的底部放置以下代码(实际上是python注释):

这对于具有复杂调用的脚本非常方便。 注意:python注释字符“#”可以防止python解释器对此进行修改,而Emacs知道如何设置这些变量,因为它在打开每个文件时都会查看它们的底部


我希望能够像使用compile命令编译C代码时那样跳转到python脚本中的“compile errors”,但我太懒了,无法创建Emacs正则表达式来实现这一点。也许这会成为堆栈溢出的另一个重要问题

我认为ansi术语
最忠实地模拟了终端。但我看不到一种将参数传递给流程的方法。当然,您可以从
ansi term
缓冲区内的shell启动它

但我认为最好的办法是不要使用
python send buffer
,而是使用一个新的函数,它可以“正确”地完成任务,即发送当前文件的路径,而不是生成临时文件。当然,这里有一些细微的区别,您必须先保存当前文件,但下面的内容至少可以让您走上正确的轨道

(defun python-send-file ()
  (interactive)
  (save-buffer)
  (python-send-string (concat "execfile('" (buffer-file-name) "')")))

;; This overwrites the `python-send-buffer' binding so you may want to pick another key
(eval-after-load "python" 
  (define-key python-mode-map "\C-c\C-c" 'python-send-file))
我检查过了,这让你可以互动。要获取选项卡,您有几个选项

  • C-qTAB将始终为您提供一个文本选项卡
  • 您可以将选项卡重新绑定为
    python模式映射中的文本选项卡

    (define-key inferior-python-mode-map "\C-i" 'self-insert-command)
    
  • 我肯定还有其他我想不起来的

还有另一种选择:


使用
C-C-C
可以很好地使用--pwd将是缓冲区文件的位置。

如果使用C-C-C,将创建一个缓冲区(查找劣质python)。尝试更改为该缓冲区*,每次点击C-C-C,结果就会显示在那里,您需要查看该缓冲区才能获得结果。使用C-x 2,以便可以同时看到两个缓冲区。 也可以尝试C-C-z(切换到shell)

*我用Ibuffer来管理缓冲区,非常好。 (顺便说一句,这是学习emacs的好地方)


编辑:你试过C-C-p吗?

我目前使用这些钩子来定义我的编译命令:

(defun convert-filename-to-executable (file)
  (if (eq system-type 'windows-nt)
      (concat (file-name-sans-extension file) ".exe")
    ;; linux
    (concat "./" (file-name-sans-extension file))))


(add-hook 'c++-mode-hook
          (lambda ()
            (unless (file-exists-p "Makefile")
              (set (make-local-variable 'compile-command)
                   (let* ((file (file-name-nondirectory buffer-    file-name))
                      (executable (convert-filename-to-executable file)))
                 (concat "g++ -g -Wall -o "
                         (file-name-sans-extension file)
                         " "
                         file
                         " && "
                         executable))))))

(add-hook 'c-mode-hook
      (lambda ()
        (unless (file-exists-p "Makefile")
          (set (make-local-variable 'compile-command)
               (let* ((file (file-name-nondirectory buffer-file-name))
                      (executable (convert-filename-to-executable file)))
                 (concat "gcc -g -ansi -Wall -Wpedantic -Wextra -Wc++-compat -Wconversion -o "
                         (file-name-sans-extension file)
                         " "
                         file
                         " && "
                         executable))))))    
(add-hook 'python-mode-hook
          (lambda ()
              (set (make-local-variable 'compile-command)
                   (concat "python " buffer-file-name))))

(add-hook 'perl-mode-hook
          (lambda ()
              (set (make-local-variable 'compile-command)
                   (concat "python " buffer-file-name))))
与此lambda集合一起以交互方式调用compile函数:

(global-set-key (kbd "<f4>") (lambda () (interactive) (setq current-prefix-arg '(4)) (call-interactively 'compile)))
(全局设置键(kbd“”)(lambda()(交互式)(setq当前前缀arg'(4))(交互式调用“编译”))
一个按钮来统治他们所有人


如果按F4(在我的例子中,你可以在Labbda中为KEP > Global set Kyp:/Cuper>设置密钥),那么将编译一个在C++或C模式下打开的文件,并且Python或Perl模式下的文件将运行(交互)

你所寻找的术语是“劣等过程”。Python模式包括一个劣质的Python shell,但我不太熟悉它的任何细节。我无法与只读的
*compilation*
窗口交互,所以这对我来说不起作用…非常好!我的脚本很少是交互式的,所以我忽略了这一点,虽然这显然无助于op,但它对我来说非常方便!您可以通过使用以下lambda使用
交互调用
来实现此交互:
(lambda()(交互)(setq current prefix arg'(4))(交互调用“compile”)
这几乎适用于我,就像发送到进程一样;然而,emacs(显然)仍然捕获了这些病毒。有没有办法让emacs也通过s?太棒了!我在找这个。非常感谢。
(global-set-key (kbd "<f4>") (lambda () (interactive) (setq current-prefix-arg '(4)) (call-interactively 'compile)))