如何在调用这样的shell命令时告诉emacs不要弹出*Shell Command Output*
缓冲区?
(shell-command MY_COMMAND)
目前,emacs将当前窗口拆分为两个,显示(主要是不相关的)输出缓冲区。对我而言,如果我能够在以后查找它,那将是完全足够的。
答案 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*
缓冲区将不会弹出。
因此,为避免输出缓冲区,请使命令的输出静音。
一种简单的方法是:
" > /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修改)