Подтвердить что ты не робот

Как ускорить вывод 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))

Теперь он прокручивается быстрее. Ура!

4b9b3361

Ответ 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.