Wie kann man Emacs unterbrechen, wenn Control-G in sehr großen Dateien nicht funktioniert?

16

Ich habe beim Anzeigen sehr großer (z. B. 128 MB) Dateien in Emacs und beim Springen zum Ende der Datei ein O (n ^ 2) oder schlechteres Verhalten festgestellt. Ich denke, es kann mit meinem Farbalgorithmus zu tun haben, um den Text kontextuell einzufärben. Wenn ich control-g (keyboard-quit) eingebe, ist der Vorgang nicht betroffen. Ich hätte gerne eine Möglichkeit, meine Emacs-Sitzung wiederherzustellen, ohne sie einfach zu beenden. Ich habe versucht, ein SIGINT zu senden, aber der Emacs ist gerade gegangen. Gibt es irgendwelche Signale, die ich senden oder auf eine andere Weise (vielleicht in einem Debugger), um die gerade ausgeführte Aktion zu erzwingen, die Kontrolle aufzugeben und an mich zurückzugeben?

WilliamKF
quelle
Ich kenne keine Möglichkeit, das Sperren von Schriftarten zu unterbrechen, aber möglicherweise finden Sie auf dieser Emacs-Wiki-Seite etwas Nützliches, um das Sperren von Schriftarten zu beschleunigen .
Aaron Miller
5
Hast du 3 Mal versucht zu fliehen?
yPhil
Ja, ich denke, Ihr eigener Fontsperrcode ist hier wahrscheinlich schuld. Untersuchen Sie Ihre font-lock-keywordsregulären Ausdrücke sorgfältig, um das Problem zu finden.
Drew
1
EMACS: Acht Megabyte und ständiges Austauschen :-)
user829755
2
Dreimal zu entkommen bringt mir nichts.
WilliamKF

Antworten:

8

Ich bezweifle, dass es sich um den Schriftsperrmodus handelt. Das macht wahrscheinlich nur Abschnitte in der Nähe des Sichtbaren. Es kopiert wahrscheinlich Daten in den Speicher.

sigusr1

sigusr2

Diese Ereignisse werden generiert, wenn der Emacs-Prozess die Signale SIGUSR1und empfängt SIGUSR2. Sie enthalten keine zusätzlichen Daten, da die Signale keine zusätzlichen Informationen enthalten. Sie können für die Fehlersuche (siehe nützlich sein Fehler Debugging ).

Quelle: GNU Emacs Lisp Referenzhandbuch: Verschiedene Ereignisse

Ich weiß nicht, was es tun würde (oder welche Version von Emacs Sie ausführen), aber Sie könnten ein MÖGLICHERWEISE zerstörungsfreies Signal (USR1 oder USR2) versuchen.

$ kill -USR1 pid

Oder Sie könnten schlafen gehen und sehen, ob es sich erholt.

9mjb
quelle
Ich frage mich, wie beschäftigt (CPU und Festplatte) Ihre Maschine ist. Das könnte Ihnen ein wenig darüber erzählen, was es tut. .. und Sie könnten in der Lage sein, eine weitere Kopie von Emacs auszuführen und -USR1 pid zu "töten", um zu sehen, was passiert, bevor Sie das tun, was Sie interessiert.
11.
2
Wow, das Senden kill -USR2an emacs-mac hat bei mir in einer ähnlichen Situation funktioniert - eine große Datei im js2-Modus geladen und eine Suche gestartet. USR2 hat die Suche beendet und den Debugger aufgerufen. Viel besser als den Prozess zu beenden!
William
Ich bin mit Ihren Zweifeln nicht einverstanden. Der Mord hat bei mir funktioniert. Es hat mich zum Debugger gebracht und Font-Lock-Default-Fontify-Region war, wo es stecken geblieben war.
Brian C.
2

Ich kenne keine Signalverarbeitung, die von Emacs ausgeführt wird, aber Sie können den Emacs-Server verwenden, indem Sie server-startIhre ~ / .emacs-Datei einfügen, damit Sie RPC auf Ihrer laufenden Emacs-Instanz ausführen können.

Wenn Sie dann Emacs töten und schreiben möchten, können Sie von Ihrer Shell aus anrufen emacsclient -e '(save-buffers-kill-emacs t)'.

Dwight Spencer
quelle