Jak przerwać emacsa, gdy control-g nie działa w bardzo dużych plikach?

16

Natknąłem się na jakieś O (n ^ 2) lub gorsze zachowanie podczas przeglądania bardzo dużych plików (np. 128 MB) w Emacsie i przeskakiwania na koniec pliku. Myślę, że może to mieć związek z moim algorytmem kolorowania, aby pokolorować tekst kontekstowo. Jeśli wpiszesz control-g (keyboard-quit), operacja nie zostanie zmieniona. Chciałbym w jakiś sposób odzyskać moją sesję emacsa, nie zabijając jej. Próbowałem wysłać SIGINT, ale emacs właśnie wyszedł. Czy są jakieś sygnały, które mogę wysłać, lub w inny sposób (być może w debuggerze), aby zmusić cokolwiek działa, aby zrezygnować i zwrócić mi kontrolę?

WilliamKF
źródło
Nie znam sposobu na przerwanie blokowania czcionek, ale możesz znaleźć coś na tej stronie Emacs Wiki w sprawie przyspieszenia blokowania czcionek .
Aaron Miller,
5
Czy próbowałeś trafić trzy razy w ucieczkę?
yPhil
Tak, myślę, że twój własny kod blokowania czcionek prawdopodobnie jest tutaj winny. Sprawdź font-lock-keywordsdokładnie wyrażenia regularne, aby spróbować znaleźć problem.
Drew
1
EMACS: Osiem megabajtów i
ciągła wymiana
2
Trzykrotne uderzenie w ucieczkę nic dla mnie nie robi.
WilliamKF,

Odpowiedzi:

9

Wątpię, czy to tryb blokady czcionek. To prawdopodobnie robi tylko sekcje w pobliżu tego, co jest widoczne. Prawdopodobnie kopiuje dane do pamięci.

sigusr1

sigusr2

Te zdarzenia są generowane, gdy proces Emacs odbiera sygnały SIGUSR1i SIGUSR2. Nie zawierają żadnych dodatkowych danych, ponieważ sygnały nie niosą dodatkowych informacji. Mogą być przydatne do debugowania (patrz: Debugowanie błędów ).

Źródło: Podręcznik GNU Emacs Lisp: Różne zdarzenia

Nie wiem, co by to zrobił (ani jakiej wersji emacsa używasz), ale możesz spróbować PRAWDOPODOBNIE nieniszczącego sygnału (USR1 lub USR2).

$ kill -USR1 pid

Lub możesz iść spać i sprawdzić, czy to wyzdrowieje.

9mjb
źródło
Zastanawiam się, jak zajęty (procesor i dysk) jest twój komputer. To może ci trochę powiedzieć o tym, co robi. .. i możesz być w stanie uruchomić kolejną kopię emacsa i „zabić -USR1 pid” tego nowego, aby zobaczyć, co się stanie, zanim zrobisz to, na czym ci zależy.
9mjb,
3
Wow, wysyłanie kill -USR2do emacs-mac działało dla mnie w podobnej sytuacji - załadowałem duży plik w trybie js2 i uruchomiłem isearch. USR2 zamknął isearch i wszedł do debuggera. O wiele lepsze niż zabicie procesu!
William
Nie zgadzam się z twoimi wątpliwościami. Zabójstwo działało na mnie. Skopiowało mnie to do debuggera, a region, w którym utknął, to font-lock-default-fontify-region.
Brian C.
2

Nie jestem świadomy obsługi sygnałów przez emacsa, ale możesz użyć serwera Emacs, umieszczając server-startplik ~ / .emacs, abyś mógł wykonać RPC w uruchomionej instancji emacsa.

Jeśli chcesz zabić emacsa i napisać, możesz zadzwonić ze swojej powłoki emacsclient -e '(save-buffers-kill-emacs t)'.

Dwight Spencer
źródło