从emacs运行交互式python脚本

时间:2012-02-17 08:04:58

标签: python emacs

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

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

那么,有没有任何规范的方法呢?

6 个答案:

答案 0 :(得分:4)

我不知道 canonical ,但如果我需要与脚本进行交互,我会做 M - x {{ 1}} RET 并从那里运行脚本。

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

答案 1 :(得分:3)

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

重新启动Emacs时,您将丢失命令行。但是你可以通过在python脚本的底部放置这种代码(实际上是一个python注释)来让Emacs为保存脚本的缓冲区设置编译命令:

 # Trigger emacs to run this script using the "compile" command
 # ;;; Local Variables: ***
 # ;;; compile-command: "my_cool_script.py --complicated_option some_filename.txt" ***
 # ;;; end: ***

这对于具有复杂调用的脚本非常方便。 注意:python注释字符'#'保护python解释器,而Emacs知道设置这些变量,因为它在打开它们时查看每个文件的底部。

我希望能够像编译命令一样跳转到我的python脚本中的'编译错误',当你使用它来编译C代码但是我懒得创建Emacs正则表达式来实现这个目的工作。也许这会成为堆栈溢出的另一个很好的问题!

答案 2 :(得分:2)

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

(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一起以交互方式调用编译函数:

(global-set-key (kbd "<f4>") (lambda () (interactive) (setq current-prefix-arg '(4)) (call-interactively 'compile)))

一个按钮来统治它们!

如果按 F4 (在我的情况下,您可以自己在global-set-key的lambda中设置密钥),则将编译以C ++或C模式打开的文件,并且将运行python或perl模式的文件(交互式)

答案 3 :(得分:1)

我认为ansi-term最忠实地模仿终端。但是我没有看到将参数传递给进程的方法。您当然可以从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-q TAB 将始终为您提供文字标签
  • 您可以将标签重新绑定为inferior-python-mode-map中的文字标签:

    (define-key inferior-python-mode-map "\C-i" 'self-insert-command)
    
  • 我确信还有其他我无法想到的

答案 4 :(得分:0)

又一个选择:

使用C-c C-c可以很好地与fgallina's python.el配合使用 - pwd将是缓冲区文件的位置。

答案 5 :(得分:0)

如果使用C-c C-c,则会创建一个缓冲区(查找inferior-python)。尝试更改到该缓冲区*,每次点击C-c C-c时都会显示结果,您需要查看该缓冲区以获得结果。使用C-x 2,这样您就可以同时看到两个缓冲区。 也可以尝试C-c C-z(切换到shell)。

*我使用Ibuffer来管理缓冲区,非常好。 (顺便说一句,这个http://tuhdo.github.io/index.html 是学习一些emacs的好地方)

编辑:你有没有尝试过C-c C-p?