【问题标题】:Emacs lisp: is it possible (using lisp) to run command in an eshell working in other buffer?Emacs lisp:是否可以(使用 lisp)在其他缓冲区中工作的 eshell 中运行命令?
【发布时间】:2010-11-23 07:36:57
【问题描述】:

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

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

非常感谢您。

【问题讨论】:

    标签: shell emacs lisp g++ elisp


    【解决方案1】:

    通常,如果您想在编译完成后运行某些内容,请将其添加到编译命令中。例如,而不是

    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 编译 - 对我来说自动运行文件更容易,所以我可以测试一下。
    • 我明白,但我还不明白为什么你需要在 in eshell 中运行编译好的程序。是不是因为你需要通过命令行和编译好的程序进行交互?
    • 我在家里和工作中都在使用 emacs - 在工作中,我在我的电脑 (win xp) 上的权限非常有限,而 eshell 是我可以获得的最接近 Unix shell 的东西。另外,它在 Emacs 中,因此可以使用更少的击键,因为我只需要一个带有少量基本命令的 shell - 这对我来说就足够了。另外 - 我想知道这个黑客是如何完成的;)
    【解决方案2】:

    因为它是 Emacs,所以这是可能的,但需要一些 Elisp hacking。

    同时,我建议通过绑定到F5 一个宏来执行以下操作;假设你在 c++ 缓冲区中点击了F5

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多