Wie vermeide ich das Scrollen mit großen Dateien, die für kurze Zeit hängen bleiben? (Halten von Seitentasten zum Beispiel)

9

Selbst bei Verwendung der Standardeinstellungen ( emacs -Q) habe ich festgestellt, dass große C-Dateien mit Emacs nur langsam gescrollt werden können.

Wenn ich zum Beispiel eine große Datei öffne und halte Page-Down. Es wird 1-2 Seiten nach unten scrollen und dann ein oder zwei Sekunden lang hängen bleiben. Beim Loslassen des Dokuments wird viele Seiten nach unten gescrollt (etwa 20 Seiten). * *

Ich weiß, dass Emacs zu weniger unberechenbarem Verhalten fähig ist, denn wenn ich schnell auf tippe page down, kann es mithalten und hängt nicht mehr wie zuvor.

Ist es möglich, dass Emacs nicht versucht, mehrere Ereignisse gleichzeitig zu verarbeiten, sondern zwischen Ereignissen neu zeichnet?

Oder irgendwie reaktionsschneller werden, anstatt zu hängen, während versucht wird, viele Ereignisse zu verarbeiten?


* Die tatsächliche Verlangsamung wird in diesem Fall durch Syntaxhervorhebung verursacht, da, wenn ich das gesamte Dokument einmal scrolle, das Scrollen danach schnell ist. Ich habe verschiedene Optionen in Bezug auf das Sperren von Schriftarten untersucht und bin zu dem Schluss gekommen, dass die Standardeinstellungen für das Sperren von Schriftarten angemessen sind. Wenn ich sie optimiere, wird das Problem nicht gelöst. Ich habe dies erwähnt, da ich dies bereits untersucht habe und nicht denke, dass dies ein wichtiger Teil davon ist Frage.

ideasman42
quelle
1
Das klingt nicht normal. Haben Sie Tests durchgeführt, um die Ursache herauszufinden? Dies kann mit Ihrer Emacs-Konfiguration zusammenhängen (Test mit emacs -Q, um dies auszuschließen), oder es kann sein, dass Ihre Festplatte sehr langsam ist. Sie können auch versuchen, die Syntaxhervorhebung oder ein anderes hilfreiches Verhalten zu deaktivieren (den Puffer in den Grundmodus versetzen).
db48x
1
Standardmäßig meinte ich emacs -Q, bearbeitete Frage. Verlangsamung ist definitiv eine Hervorhebung der Syntax. Es wird jedoch durch Emacs verschlimmert, die versuchen, alle Ereignisse vor dem Neuzeichnen zu behandeln.
ideasman42

Antworten:

10

Wie Sie bemerkt haben, geschieht dies im Grunde genommen, wenn die Wiedergabe aus irgendeinem Grund zu langsam ist. Im allgemeinen Fall können wir nicht viel tun (wenn es "viel zu langsam" ist), aber wenn es "nur ein bisschen zu langsam" ist, können Sie eines davon ausprobieren (oder beides, obwohl es wahrscheinlich nicht mehr als tut) nur einer der beiden):

(setq jit-lock-defer-time 0)
(setq fast-but-imprecise-scrolling t)

Beachten Sie, dass beide neu in Emacs-25 sind.

Stefan
quelle
2
In der Dokumentzeichenfolge für die Variable fast-but-imprecise-scrollingheißt es: " Wenn Sie nicht Null sind, beschleunigen Sie den Bildlauf. " Möglicherweise sollte das Beispiel einen Wert ungleich Null widerspiegeln, da dies den Bildlauf beschleunigen würde.
Lawlist
2
  1. Sie können dem Bildlaufbefehl ein numerisches Präfixargument übergeben, anstatt nur die Taste zu drücken und gedrückt zu halten, um es wiederholt aufzurufen.

    Wenn Sie beispielsweise den <next>Schlüssel (auch bekannt als PageDown) verwenden, lautet der aufgerufene Befehl scroll-up-command. Und C-h f scroll-up-commandsagt Ihnen, dass ein numerisches Präfix arg sagt, dass so viele Zeilen gescrollt werden sollen.

    Beispiel: Angenommen, Ihr Puffer enthält 50.000 Zeilen und der Cursor befindet sich oben (in der ersten Zeile). Wenn Sie dies tun C-u 25000 <next>, wird der Puffer zur Hälfte nach unten gescrollt (25.000 Zeilen).

    Es wird immer noch eine Pause geben, aber sie wird etwas kürzer sein.

  2. Eine andere Möglichkeit besteht darin, sich um eine bestimmte Anzahl großer Emacs-Dinger nach unten zu bewegen. Wenn Ihr Puffer Textabschnitte mit ^L(Strg-L, Formular-Feed) Zeichen trennt , können Sie die Seitennavigationsbefehle verwenden, z. B. forward-page, an die gebunden ist C-x ]. Auch hier können Sie ein numerisches Präfixargument übergeben, um so viele Seiten gleichzeitig vorwärts zu bewegen. Wenn keine ^LZeichen vorhanden sind , können Sie forward-paragraph( C-<down>) forward-lineoder einen anderen Bewegungsbefehl mit dem Präfix arg verwenden.

  3. Ebenso können Sie mit command goto-line( M-g M-g) zu einer bestimmten Zeilennummer wechseln. (Wählen Sie eine große Zahl aus.) Der Befehl what-linegibt an, wie die aktuelle Zeilennummer lautet (Sie können sie auch in der Moduszeile anzeigen lassen). ( M->führt Sie zum Ende des Puffers, wo M-x what-lineSie erfahren, wie viele Zeilen insgesamt vorhanden sind.)

  4. (Nach Ihrem Kommentar zum Überfliegen hinzugefügt, bis Sie dies oder jenes sehen.) Verwenden Sie die inkrementelle Suche für die Navigation. Suchen Sie vorwärts nach etwas in der Nähe, wo Sie scrollen möchten, entweder mit C-soder (für die Regexp-Suche) C-M-s.

    Wenn Sie die Bibliothek Isearch + verwenden , können Sie auch beliebige Prädikate im laufenden Betrieb in Ihre Suche einbeziehen .

    Das heißt, Sie müssen nicht nur mit Mustervergleich suchen. Sie könnten beispielsweise suchen, um (1) einem Muster zu entsprechen, das einen ganzen Kommentarblock oder eine vollständige switchAnweisung auswählt , und (2) zu verlangen, dass die Übereinstimmung eine bestimmte Größe (Anzahl der Zeichen) hat.

    Mit Isearch + können Sie auch nach Übereinstimmungen mit mehreren Mustern suchen oder nach einer Übereinstimmung mit einem Muster innerhalb einer bestimmten Entfernung zu einer Übereinstimmung für ein anderes Muster ("nahe") suchen (wobei die Entfernung in Zeichen, Wörtern, Sexps, Listen, Sätzen gemessen wird. ..)

Drew
quelle
1
Ich bin mit Möglichkeiten vertraut, um im Dokument herumzuspringen, eine Seite nach unten zu verschieben oder das Mausrad zu verwenden. Dies ist hauptsächlich eine Möglichkeit, eine Datei zu überfliegen (Sie können schnell nach unten scrollen, bis Sie auf einen großen Kommentarblock einer großen switch-Anweisung für z digitales Äquivalent zum Durchblättern eines Buches :)) .
ideasman42
1

Dies zu posten, da es eine schwache Lösung ist, aber besser als nichts.

Anstatt das gesamte Verhalten von Emacs zu ändern, können Funktionen geschrieben werden, die nach jedem Vorgang ein erneutes Zeichnen erzwingen. Dadurch wird ein Hängen vermieden und das Scrollen reagiert schneller auf das Auf- und Abblättern von Seiten und das Mausrad.

(global-set-key [next]
 (lambda () (interactive)
   (condition-case nil (scroll-up)
     (end-of-buffer (goto-char (point-max))))
   (redisplay)))

(global-set-key [prior]
 (lambda () (interactive)
   (condition-case nil (scroll-down)
     (beginning-of-buffer (goto-char (point-min))))
   (redisplay)))

(global-set-key (kbd "<mouse-4>")
 (lambda () (interactive) (scroll-down mouse-wheel-scroll-amount) (redisplay)))
(global-set-key (kbd "<mouse-5>")
 (lambda () (interactive) (scroll-up mouse-wheel-scroll-amount) (redisplay)))
ideasman42
quelle
Beachten Sie, dass dies dazu führt, dass Emacs hinter Ihrer Tastenwiederholung zurückbleibt. Wenn Sie also die Taste loslassen, geht das Scrollen weiter als gedacht :-(
Stefan
Richtig, in der Praxis finde ich das allerdings nicht so problematisch, weil ich normalerweise nur für kurze Zeit gedrückt halte.
ideasman42