如何将* shell命令输出*缓冲区保存在后台?

时间:2012-07-23 13:56:13

标签: emacs

如何在调用这样的shell命令时告诉emacs不要弹出*Shell Command Output*缓冲区?

(shell-command MY_COMMAND)

目前,emacs将当前窗口拆分为两个,显示(主要是不相关的)输出缓冲区。对我而言,如果我能够在以后查找它,那将是完全足够的。

4 个答案:

答案 0 :(得分:9)

shell-command采用可选参数OUTPUT-BUFFER,您可以在其中指定要输出的缓冲区。如果它是t(实际上不是缓冲区名称而不是nil),它将在当前缓冲区中输出。因此,我们将其包装成with-temp-buffer并且永远不必为此烦恼:

(with-temp-buffer
  (shell-command "cat ~/.emacs.d/init.el" t))

答案 1 :(得分:9)

使用shell-command可能是问题的根源。我认为我找到了call-process的解决方案,虽然可能有更优雅的方式:

(call-process-shell-command
 "cat ~/.emacs.d/init.el"
 nil "*Shell Command Output*" t
 )

答案 2 :(得分:1)

此实用程序功能可能会有所帮助。它返回shell命令的实际值

(defun shell-command-as-string (cmd)
  (with-temp-buffer
    (shell-command-on-region (point-min) (point-max)
                             cmd t)
    (buffer-string)))

答案 3 :(得分:0)

根据我的经验,如果 shell命令本身不产生任何输出,那么emacs *Shell Command Output*缓冲区将不会弹出。

因此,为避免输出缓冲区,请使命令的输出静音。

一种简单的方法是:

  • 在所有shell命令的末尾添加" > /dev/null 2>&1"

(注意:我不确定/dev/null是否在100%可以运行emacs的平台上存在,但是在每个Linux发行版上都可以。)

如果对elisp函数shell-command的调用是在elisp脚本中,则可以更改以下内容:

(shell-command cmd)

对此:

(shell-command (concat cmd " > /dev/null 2>&1"))

如果偶尔要监视输出,则可以创建一个包装器函数,该包装器函数通过/dev/null抑制输出,并创建一个不带抑制器的包装器函数,然后根据需要在它们之间切换。

上面的建议已在以下代码上进行了测试:em @ yc-07-07上的 GNU Emacs 24.5.1(x86_64-pc-linux-gnu,GTK +版本3.18.9)(由Debian修改)