2012-08-23 2 views
18

Я запускаю вывод приложения в буфер emacs, используя команду 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)) 

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

+0

Вы можете попробовать небуферировать вывод подробного приложения: http : //stackoverflow.com/a/3466024/265069 – Tom

+0

Я запускаю MacOSX, поэтому unbuffer недоступен. – hyperlogic

+0

Я не знаю Os X, но google говорит следующее: http://jubianchi.fr/help/3.Tweaks/unbuffered-processes. Если это не работает, вы можете искать альтернативы с помощью google – Tom

ответ

10

Как и в документации, 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, указывая на комментарий об обработке амперсанда. Если он там, команда будет выполняться асинхронно.)

+0

Хммм. Как исправить ссылку Git, чтобы указать на текущую HEAD на сегодняшний день? – tripleee

+0

Вы, сэр, выиграйте! Сейчас это как минимум 4 раза быстрее. – hyperlogic

0

Если команда является многословной, можно ли использовать полный захват в реальном времени? Возможно, вы могли бы запустить verbose-app > app.log в фоновом режиме, а затем запустить что-то вроде while true; do tail -n50 app.log; sleep 1; done внутри emacs, чтобы обновлять буфер, чтобы просмотреть последние несколько строк файла журнала. Позже, когда вы хотите получить полный вывод, вы можете открыть файл журнала в emacs.

Смежные вопросы