2012-08-23 7 views
18

Używam danych wyjściowych aplikacji w buforze emacs za pomocą polecenia powłoki.Jak przyspieszyć wyjście emacsa z asynchronicznego polecenia powłoki?

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

Problem polega na tym, że to polecenie jest bardzo szczegółowe. Tak bardzo, że buforowanie emacsa zajmuje kilka sekund. Opóźnia o kilka sekund rzeczywistą moc wyjściową.

Czy mogę przyspieszyć przewijanie wyjściowe przez wyłączenie czegoś? Podobnie jak w przypadku dopasowywania wyrażenia regularnego lub składni?

Na przyszłość:

verbose aplikacja jest adb logcat. Zmieniłem istniejącą funkcję:

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

na następujące kwestie:

(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)) 

przewija sposób szybciej teraz. Yay!

+0

Możesz spróbować odblokować wyjście pełnej wersji aplikacji: http : //stackoverflow.com/a/3466024/265069 – Tom

+0

Używam MacOSXa, więc opcja niebuforowania nie jest dostępna. – hyperlogic

+0

Nie wiem Os X, ale google mówi to: http://jubianchi.fr/help/3.Tweaks/unbuffered-processes Jeśli to nie działa, to możesz szukać alternatyw z Google – Tom

Odpowiedz

10

Podobnie jak w przypadku dokumentacji, shell-command uruchamia polecenie w gorszej powłoce, co oznacza, shell-mode. Jeśli chcesz tylko wyjście i żadną z funkcji, uruchomienie polecenia z numerem start-process może być bliższe temu, co chcesz.

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

Zawijanie tego do funkcji nie powinno być zbyt trudne. Możesz przyjrzeć się, w jaki sposób shell-command implementuje polecenia asynchroniczne; na przykład zapyta, czy powinien zakończyć istniejący proces, jeśli spróbujesz go utworzyć, gdy już istnieje. http://git.savannah.gnu.org/cgit/emacs.git/tree/lisp/simple.el#n2447 może być dobrym punktem wyjścia. (W przypadku, gdy link jest zły, jest to link do wewnątrz defun shell-command, wskazujący na komentarz dotyczący obsługi ampersand.) Jeśli jest, polecenie zostanie uruchomione asynchronicznie.)

+0

Hmmm. Jak naprawić link Git, aby wskazywał bieżącą HEAD na dzień dzisiejszy? – tripleee

+0

Ty sir, wygraj! Teraz jest co najmniej 4 razy szybsze. – hyperlogic

0

Jeśli polecenie jest pełne, czy jest jakikolwiek pożytek z przechwytywania pełnego wyniku w czasie rzeczywistym? Może mógłbyś uruchomić w tle verbose-app > app.log, a następnie uruchomić coś w stylu emacs, np. while true; do tail -n50 app.log; sleep 1; done, aby aktualizować bufor, aby wyświetlić kilka ostatnich wierszy pliku dziennika. Później, gdy chcesz uzyskać pełne wyniki, możesz otworzyć plik dziennika w emacs.

Powiązane problemy