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:
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?$")
(shortened-text (replace-regexp-in-string regexp "\\1" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
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-In
comint-preoutput-filter-functions
werden alle comint
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:
(defun my-comint-shorten-long-lines (text)
(let* ((regexp "^\\(.\\{80\\}\\).*?\\(\"?\\)$")
(shortened-text (replace-regexp-in-string regexp "\\1\\2" text)))
(if (string= shortened-text text)
text
(propertize shortened-text 'font-lock-face 'shadow 'help-echo text))))
(add-hook 'comint-preoutput-filter-functions 'my-comint-shorten-long-lines)
Das ist ein bisschen besser, aber immer noch hässlich. Das Schweben auf der Ausgabe von so etwas wie find /
in M-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.