19

我正在使用 shell 命令在 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))

它现在滚动得更快。耶!

4

2 回答 2

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可能是一个很好的起点。(如果链接坏了,这是一个到 inside 的链接defun shell-command,指向一个关于处理 & 符号的评论。如果它在那里,命令将异步运行。)

于 2012-08-28T07:41:21.753 回答
0

如果命令很冗长,那么实时捕获完整输出有什么用吗?也许您可以verbose-app > app.log在后台运行,然后while true; do tail -n50 app.log; sleep 1; done在 emacs 中运行类似的东西来不断更新缓冲区以查看日志文件的最后几行。稍后当您想要完整输出时,您可以在 emacs 中打开日志文件。

于 2012-08-28T00:27:33.343 回答