*Shell Command Output*
当调用这样的 shell 命令时,如何告诉 emacs 不要弹出缓冲区?
(shell-command MY_COMMAND)
当前 emacs 将当前窗口分成两部分,显示(大部分不相关的)输出缓冲区。对我来说,如果我以后愿意的话,以后再看就足够了。
*Shell Command Output*
当调用这样的 shell 命令时,如何告诉 emacs 不要弹出缓冲区?
(shell-command MY_COMMAND)
当前 emacs 将当前窗口分成两部分,显示(大部分不相关的)输出缓冲区。对我来说,如果我以后愿意的话,以后再看就足够了。
也许使用shell-command
是问题的根源。我想我找到了一个可行的解决方案call-process
,尽管可能有一种更优雅的方式:
(call-process-shell-command
"cat ~/.emacs.d/init.el"
nil "*Shell Command Output*" t
)
shell-command
接受一个可选参数OUTPUT-BUFFER
,您可以在其中指定要输出到的缓冲区。如果它是t
(实际上不是缓冲区名称而不是nil
),它将在当前缓冲区中输出。所以我们把它包装成 awith-temp-buffer
并且永远不必打扰它:
(with-temp-buffer
(shell-command "cat ~/.emacs.d/init.el" t))
根据我的经验,如果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 修改
此实用程序功能可能会有所帮助。它返回shell命令的实际值
(defun shell-command-as-string (cmd)
(with-temp-buffer
(shell-command-on-region (point-min) (point-max)
cmd t)
(buffer-string)))