我是一个相当熟练的vim用户,但是我的朋友告诉我关于emacs的很多好东西,我决定尝试一下 - 特别是在找到适当命名的邪恶模式之后......
无论如何,我目前正在开发一个需要用户输入的python脚本(cmd.Cmd的子类)。在vim中,如果我想尝试它,我可以简单地执行:!python %
然后可以与我的脚本交互,直到它退出。在emacs中,我尝试了M-! python script.py
,它确实会在一个单独的缓冲区中运行脚本,但是RETURN似乎不会被发送回脚本,而是被emacs缓冲区捕获。我还试着看一下python-mode的C-c C-c
,但这会在一些临时目录中运行脚本,而我只想在(pwd)
中运行它。
那么,有没有任何规范的方法呢?
答案 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))
我查了一下,这可以让你互动。要获得标签,您可以选择一些选项。
您可以将标签重新绑定为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?