Как ускорить вывод emacs из асинхронной командной оболочки?
Я запускаю вывод приложения в буфере emacs, используя команду shell.
(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))
Теперь он прокручивается быстрее. Ура!
Ответы
Ответ 1
Как и в документации, shell-command
запускает команду в нижней оболочке, подразумевая 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
, указывая на комментарий об обработке амперсанда. Если он там, команда будет выполняться асинхронно.)
Ответ 2
Если команда является многословной, есть ли смысл использовать полный вывод в реальном времени? Возможно, вы можете запустить verbose-app > app.log
в фоновом режиме, а затем запустить в emacs что-то вроде while true; do tail -n50 app.log; sleep 1; done
, чтобы обновлять буфер, чтобы просмотреть последние несколько строк файла журнала. Позже, когда вы хотите получить полный вывод, вы можете открыть файл журнала в emacs.