Emacs Lisp:是否可以(使用Lisp)在其他缓冲区中运行Eshell中的命令?

3
我在一个缓冲区中运行eshell实例,并在另一个缓冲区中编写C++源代码。我已将compile绑定到<F5>,想知道是否可能在运行在另一个缓冲区中的eshell实例中运行编译的输出文件?
如果不行,也许有一种方法可以在新框架中打开eshell并自动在其中运行编译的输出?
非常感谢您的帮助。
2个回答

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缓冲区中输入内容,则此操作将删除您的输入。正如我上面所说,更多上下文会更有帮助。


你好。非常感谢您的回答 - 您在帖子末尾的函数解决了我的问题。现在这不是很相关,但背景是我正在编写许多简单的C++源文件(spoj/topcoder),可以通过g++ source.cc轻松编译 - 这样我就可以自动运行文件以进行测试,这对我来说更容易。 - zeroDivisible
我理解这一点,但我还不明白为什么你需要在eshell中运行编译后的程序。是因为你需要通过命令行与编译后的程序进行交互吗? - Gareth Rees
我在家和工作中都使用emacs - 在工作中,我的电脑(win xp)权限非常有限,eshell是我能够得到的最接近Unix shell的东西。此外,它在Emacs中,所以可以用更少的按键来操作它,而且我只需要一个带有基本命令的shell - 对我来说已经足够了。另外 - 我想知道如何完成这个hack;) - zeroDivisible

2

因为这是Emacs,所以可能是可行的,但需要进行一些Elisp编程。

同时,我建议采用简单的方法,将以下宏绑定到F5键上;假设您在c++缓冲区中按下F5

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接