9

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

(shell-command MY_COMMAND)

当前 emacs 将当前窗口分成两部分,显示(大部分不相关的)输出缓冲区。对我来说,如果我以后愿意的话,以后再看就足够了。

4

4 回答 4

11

也许使用shell-command是问题的根源。我想我找到了一个可行的解决方案call-process,尽管可能有一种更优雅的方式:

(call-process-shell-command
 "cat ~/.emacs.d/init.el"
 nil "*Shell Command Output*" t
 )
于 2012-07-23T15:08:01.103 回答
9

shell-command接受一个可选参数OUTPUT-BUFFER,您可以在其中指定要输出到的缓冲区。如果它是t(实际上不是缓冲区名称而不是nil),它将在当前缓冲区中输出。所以我们把它包装成 awith-temp-buffer并且永远不必打扰它:

(with-temp-buffer
  (shell-command "cat ~/.emacs.d/init.el" t))
于 2012-07-23T14:08:13.830 回答
2

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

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

一种简单的方法是:

  • 添加" > /dev/null 2>&1"到任何 shell 命令的末尾。

(警告:我不确定是否/dev/null存在 100% 可以运行 emacs 的平台,但在每个 Linux 发行版上都应该没问题。)

如果对 elisp 函数的调用shell-command是在 elisp 脚本中,那么您可以更改:

(shell-command cmd)

对此:

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

如果您偶尔确实想监视输出,那么您可以创建一个通过 抑制输出的/dev/null包装函数和一个不抑制输出的包装函数,并根据需要在它们之间切换。

上述建议在lcy01-07 的 2017-09-20 的 GNU Emacs 24.5.1 (x86_64-pc-linux-gnu, GTK+ Version 3.18.9) 上进行了测试,由 Debian 修改

于 2019-06-27T23:01:34.507 回答
1

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

(defun shell-command-as-string (cmd)
  (with-temp-buffer
    (shell-command-on-region (point-min) (point-max)
                             cmd t)
    (buffer-string)))
于 2013-12-12T13:29:58.810 回答