如何加速异步shell命令的emacs输出?

时间:2012-08-23 00:31:19

标签: shell emacs elisp

我正在使用shell-command在emacs缓冲区中运行应用程序的输出。

(shell-command "verbose-app &" "*verbose-app*")

问题是这个命令非常冗长。这么多,emacs缓冲区有时需要几秒钟才能赶上。它与实际输出相差几秒钟。

有什么办法可以通过禁用某些东西加快输出滚动速度?像正则表达式匹配或语法高亮?

供将来参考:

详细应用是adb logcat。我改变了现有的功能:

(defun adb-logcat ()
  (interactive)
  (shell-command "adb logcat -v threadtime&" "*adb-logcat*")
  (pop-to-buffer "*adb-logcat*")
  (buffer-disable-undo))

以下内容:

(defun adb-logcat ()
  (interactive)
  (start-process "*adb-logcat*" "*adb-logcat*" "/bin/sh" "-c" "adb logcat -v threadtime")
  (pop-to-buffer "*adb-logcat*")
  (buffer-disable-undo))

现在滚动速度更快。耶!

2 个答案:

答案 0 :(得分:10)

就像文档所说,shell-command在劣质shell中运行命令,暗示shell-mode。如果您只想要输出而不是任何功能,则使用start-process运行命令可能更接近您想要的。

(start-process "*verbose-app*" "*verbose-app*"
 "/bin/sh" "-c" "verbose-app")

将其包装成函数不应该太难。您可能想看看shell-command如何实现异步命令;例如,如果您尝试在另一个已存在的情况下创建一个进程,它将询问是否应终止现有进程。 http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/simple.el#n2447可能是一个很好的起点。 (如果链接变坏,这是一个指向内部defun shell-command的链接,指向一个关于处理&符号的注释。如果它在那里,该命令将异步运行。)

答案 1 :(得分:0)

如果命令是那么详细,那么实时捕获完整输出是否有用?也许你可以在后台运行verbose-app > app.log然后在emacs中运行类似while true; do tail -n50 app.log; sleep 1; done的内容来继续更新缓冲区以查看日志文件的最后几行。稍后,当您需要完整输出时,可以在emacs中打开日志文件。