我在一个缓冲区中有一个eshell
的运行实例,而我正在另一个缓冲区中编写c ++源代码。我已将compile
绑定到<F5>
,我想知道是否可以在另一个缓冲区中运行的eshell实例中运行输出文件(编译)?
如果没有,那么可能有办法在新框架中打开eshell并自动运行编译输出吗?
非常感谢你。
答案 0 :(得分:5)
通常,如果要在编译完成后运行某些内容,请将其添加到编译命令中。例如,而不是
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
缓冲区中输入,那么这会删除您的输入。正如我上面所说,更多的上下文可能会有所帮助。
答案 1 :(得分:2)
因为它是Emacs,所以可能,但需要一些Elisp黑客攻击。
与此同时,我建议通过绑定到F5
宏来实现以下目标;假设您在c ++缓冲区中点击F5
: