【发布时间】:2010-11-23 07:36:57
【问题描述】:
我在一个缓冲区中有一个正在运行的 eshell 实例,我正在另一个缓冲区中编写 c++ 源代码。我已将compile 绑定到<F5>,我想知道是否可以在另一个缓冲区中运行的 eshell 实例中运行(编译的)输出文件?
如果没有,那么也许有办法在新框架中打开eshell并在其中自动运行编译输出?
非常感谢您。
【问题讨论】:
标签: shell emacs lisp g++ elisp
我在一个缓冲区中有一个正在运行的 eshell 实例,我正在另一个缓冲区中编写 c++ 源代码。我已将compile 绑定到<F5>,我想知道是否可以在另一个缓冲区中运行的 eshell 实例中运行(编译的)输出文件?
如果没有,那么也许有办法在新框架中打开eshell并在其中自动运行编译输出?
非常感谢您。
【问题讨论】:
标签: shell emacs lisp g++ elisp
通常,如果您想在编译完成后运行某些内容,请将其添加到编译命令中。例如,而不是
M-x compile RET make RET
你可以输入
M-x compile RET make && ./test RET
或者你可以将程序添加到你的makefile中的某个适当的目标,所以你可以这样做
M-x compile RET make test RET
如果您能解释一下为什么要在 eshell 中运行已编译的程序,我可以为您提供更好的建议。
不过,如果你坚持使用eshell,或许可以使用compilation-finish-functions:
编译过程完成时调用的函数。每个函数都使用两个参数调用:编译缓冲区和描述进程如何完成的字符串。
这并没有很好的记录,但如果过程成功完成,字符串是"finished\n"。所以你可能会这样做:
(defun run-compilation-output-in-eshell (buf msg)
"If compilation finished successfully, switch to eshell and execute a command."
(when (string= msg "finished\n")
(eshell)
(goto-char (point-max))
(eshell-kill-input)
(insert "echo command goes here")
(eshell-send-input)))
(add-hook 'compilation-finish-functions #'run-compilation-output-in-eshell)
不过,这似乎很粗鲁:如果您在编译完成时碰巧输入了eshell 缓冲区,那么这会删除您的输入。正如我上面所说,更多的上下文可能会有所帮助。
【讨论】:
g++ source.cc 编译 - 对我来说自动运行文件更容易,所以我可以测试一下。
因为它是 Emacs,所以这是可能的,但需要一些 Elisp hacking。
同时,我建议通过绑定到F5 一个宏来执行以下操作;假设你在 c++ 缓冲区中点击了F5:
【讨论】: