¿Cómo interrumpir emacs cuando control-g no funciona en archivos muy grandes?

16

Me he encontrado con algún tipo de comportamiento O (n ^ 2) o peor cuando veo archivos muy grandes (por ejemplo, 128 MB) en Emacs y salto al final del archivo. Creo que puede tener que ver con mi algoritmo de coloración para colorear el texto contextualmente. Si escribo control-g (teclado-salir), la operación no se ve afectada. Me gustaría recuperar mi sesión de emacs sin matarla. Intenté enviar un SIGINT, pero emacs acaba de salir. ¿Hay alguna señal que pueda enviar, o de alguna otra manera (tal vez en un depurador) para forzar cualquier acción que se esté ejecutando para renunciar y devolverme el control?

WilliamKF
fuente
No conozco una manera de hacer que el bloqueo de fuente sea interrumpible, pero puede encontrar algo útil en esta página Wiki de Emacs sobre cómo acelerar el bloqueo de fuente .
Aaron Miller
55
¿Intentaste escapar 3 veces?
yPhil
Sí, creo que su propio código de bloqueo de fuente es probablemente el culpable aquí. Examina tus font-lock-keywordsexpresiones regulares cuidadosamente para tratar de encontrar el problema.
Drew
1
EMACS: ocho megabytes e intercambio constante :-)
user829755
2
Golpear escapar tres veces no hace nada para mí.
WilliamKF

Respuestas:

8

Dudo que sea el modo de bloqueo de fuente. Eso probablemente solo tiene secciones cerca de lo que es visible. Probablemente esté copiando datos en la memoria.

sigusr1

sigusr2

Estos eventos se generan cuando el proceso Emacs recibe las señales SIGUSR1y SIGUSR2. No contienen datos adicionales porque las señales no llevan información adicional. Pueden ser útiles para la depuración (consulte Error de depuración ).

Fuente: GNU Emacs Lisp Reference Manual: Varios eventos

No sé qué haría (o qué versión de emacs está ejecutando), pero podría probar una señal PROBABLEMENTE no destructiva (USR1 o USR2).

$ kill -USR1 pid

O podrías irte a dormir y ver si se recupera.

9mjb
fuente
Me pregunto qué tan ocupada (CPU y disco) está su máquina. Eso podría decirle un poco sobre lo que está haciendo. .. y es posible que pueda ejecutar otra copia de emacs y "kill -USR1 pid" esa nueva para ver qué sucede antes de hacer la que le interesa.
9mjb
2
Wow, el envío kill -USR2a emacs-mac funcionó para mí en una situación similar: cargué un archivo grande en modo js2 y comencé una búsqueda. USR2 salió de la búsqueda e ingresó al depurador. ¡Mucho mejor que matar el proceso!
William
No estoy de acuerdo con tus dudas. La muerte funcionó para mí. Me llevó al depurador y font-lock-default-fontify-region estaba donde estaba atascado.
Brian C.
2

No conozco ningún manejo de señal que emacs haga, pero puede usar el servidor Emacs colocando server-startsu archivo ~ / .emacs para que pueda hacer RPC en su instancia de emacs en ejecución.

Luego, cuando quiera matar emacs y escribir, puede llamar desde su shell emacsclient -e '(save-buffers-kill-emacs t)'.

Dwight Spencer
fuente