Ich benutze Emacs mit Geiser, um einen Schema-Code zu hacken. Während ich in der REPL herumspiele, bewerte ich manchmal Ausdrücke, die zu viel Ausgabe führen, oft alle in einer Zeile.
Ich habe zum Beispiel gerade mit SRFI-41 (Streams) gespielt und einen Charakter-Stream aus einer großen Datei erstellt. dann habe ich den stream gezwungen und geiser hat den gesamten inhalt der datei als zeichenstream in meinen puffer gepuffert. Fast sofort blieb Emacs stehen, als immer mehr Zeichen an die Ausgabezeile angehängt wurden und egal wie lange ich gedrückt hielt C-g
oder C-c C-c
ich Emacs (oder Geiser) nicht zum Stoppen bringen konnte.
Dies hat meine gesamte Emacs-Sitzung unterbrochen, da Emacs meine Eingaben jetzt völlig ignoriert und der Ansicht ist, dass es vorrangig sein muss, diesen massiven Zeichenstrom in einer Zeile in einen nicht reagierenden Geiser REPL-Puffer zu drucken.
Kann ich etwas tun, um meine Emacs-Sitzung vor meiner zerstörerischen Neugier zu schützen? (Warum wird Emacs so langsam, wenn sehr lange Zeilen angezeigt werden?) Kann ich ein Limit für lange Zeilen festlegen und Emacs mitteilen, dass es in Ordnung ist, einfach nicht zu versuchen, sehr lange Zeilen anzuzeigen?
quelle
yes
in einem hatansi-term
zum Beispiel einen ähnlichen (aber nicht so schrecklichen) Effekt. Es ist wirklich nur die Textmenge, die Emacs zum Innehalten bringt.yes
in einem VTE-Terminalemulator alle CPU-Kerne ausgelastet, sodass ich es nicht als Beispiel verwenden würde.Antworten:
Wie bereits in den Kommentaren beantwortet, ist es ein bekanntes Problem , dass Emacs bei langen Warteschlangen nur sehr langsam wieder angezeigt wird . Es wäre sehr schön, es zu reparieren, aber es sind viele Überlegungen erforderlich, um es richtig abzunehmen. Ich habe eine Vorstellung davon, wie dies auf der Grundlage von Abschnitt 6.3 dieses Dokuments erreicht werden könnte (im Grunde genommen speichere visuelle Zeileninformationen im aktuellen Puffer und aktualisiere sie beim Einfügen von Leerzeichen, Anzeigeeigenschaften, Fensteränderungen usw. und verwende diese Informationen dann in den Redisplay-Code, um nicht ständig danach zu suchen), aber ich kenne die C-Interna nicht gut genug, um ihn abzurufen.
Es gibt jedoch Problemumgehungen. Die naheliegendsten sind das Optimieren von anzeigebezogenen Parametern (z. B. das Aktivieren der visuellen Linienabschneidung in der grafischen Emacs-Instanz, das automatische Deaktivieren von Bidi-Funktionen in einem nicht grafischen Emacs usw.) und das Vorverarbeiten des Dateiinhalts, den Sie verwenden. Einlesen. Weniger offensichtlich ist, dass die Dateien automatisch nachbearbeitet werden, indem die Zeilen tatsächlich abgeschnitten werden oder indem Texteigenschaften hinzugefügt werden, die die Zeilen kürzer erscheinen lassen, als sie tatsächlich sind. Um dies in eine interessantere Antwort zu verwandeln,
comint
stelle ich einen ziemlich hässlichen Hack der vorherigen Option vor, der nur für abgeleitete Modi funktioniert:Dies definiert
my-comint-shorten-long-lines
eine Funktion, die einen möglicherweise aus vielen Zeilen bestehenden String verwendet und mithilfe regulärer Ausdrücke eine Zeile mit einer Länge von 80 Zeichen oder mehr durch eine verkürzte Version ersetzt, die den Originaltext anzeigt, wenn Sie den Mauszeiger darüber halten. Bei Verwendung als Hook-Incomint-preoutput-filter-functions
werden allecomint
Ausgaben gefiltert, bevor sie angezeigt werden.Diese Wiedergabe des Hack hat jedoch eine ziemlich ernsthafte Schwäche. In Modi, in denen grundlegende Schriftarten verwendet werden (wie z. B.
M-x ielm
), werden Zeilen, die Teil einer Zeichenfolge sind, abgeschnitten, und auf diese Weise wird alles bis zum nächsten Anführungszeichen als Zeichenfolge fontifiziert! Das ist nicht das, was wir wollen und es kann mit etwas mehr Regex-Beherrschung behoben werden (wird aber vermutlich in einer REPL für eine Sprache wie Python brechen). Lassen Sie uns auch die verkürzte Ausgabe hervorheben:Das ist ein bisschen besser, aber immer noch hässlich. Das Schweben auf der Ausgabe von so etwas wie
find /
inM-x shell
ist nicht ansprechend (im Idealfall möchten wir nur die unverkürzte Zeile anzeigen, nicht die gesamte Ausgabe), die Zeichenfolgenerkennung ist bestenfalls rudimentär und das Abschneiden könnte besser mit Ellipsen angezeigt werden, anstatt alles zu beschriften. Darüber hinaus kann nicht garantiert werden, dass der eingehende Text nicht in Stapel umgewandelt wird. All dies schreit nach dem Ausführen des Verarbeitungsschritts in einem temporären Puffer, wird jedoch dem Leser als Übung (oder dem Autor als möglicher Blog-Beitrag) überlassen.quelle
Wie dies auch bei Python der Fall ist , besteht die Lösung bei python-mode.el, https://launchpad.net/python-mode , darin, eine direkte Verbindung zum Prozess herzustellen, nicht über den Comint-Modus.
Verlässt sich auf
start-process
und verarbeitet den Sende-StringZum Beispiel siehe Funktionen
py--start-fast-process
undpy--fast-send-string-intern
quelle