Die Funktion line-number-at-pos
(wenn sie ungefähr 50 Mal wiederholt wird) bewirkt eine merkliche Verlangsamung in halbgroßen Puffern - z. B. 50.000 Zeilen -, wenn sich der Punkt nahe dem Ende des Puffers befindet. Mit Verlangsamung meine ich insgesamt ungefähr 1,35 Sekunden.
Anstatt eine 100% elisp
-Funktion zu verwenden, um Zeilen zu zählen und an die Spitze des Puffers zu gelangen, wäre ich an einer Hybridmethode interessiert, die die eingebauten C-Fähigkeiten nutzt, die für die Zeilennummer verantwortlich sind, die auf der Moduszeile erscheint. Die Zeilennummer, die in der Moduszeile erscheint, wird unabhängig von der Größe des Puffers mit Lichtgeschwindigkeit angezeigt.
Hier ist eine Testfunktion:
(defmacro measure-time (&rest body)
"Measure the time it takes to evaluate BODY.
http://lists.gnu.org/archive/html/help-gnu-emacs/2008-06/msg00087.html"
`(let ((time (current-time)))
,@body
(message "%.06f" (float-time (time-since time)))))
(measure-time
(let* (
line-numbers
(window-start (window-start))
(window-end (window-end)))
(save-excursion
(goto-char window-end)
(while
(re-search-backward "\n" window-start t)
(push (line-number-at-pos) line-numbers)))
line-numbers))