Emacs lisp:是否有可能(使用lisp)在其他缓冲区中运行eshell命令?

时间:2010-11-23 07:36:58

标签: shell emacs lisp g++ elisp

我在一个缓冲区中有一个eshell的运行实例,而我正在另一个缓冲区中编写c ++源代码。我已将compile绑定到<F5>,我想知道是否可以在另一个缓冲区中运行的eshell实例中运行输出文件(编译)?

如果没有,那么可能有办法在新框架中打开eshell并自动运行编译输出吗?

非常感谢你。

2 个答案:

答案 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

  1. 切换到eshell缓冲区
  2. 运行程序的编译命令
  3. 切换回c ++缓冲区