Funkcja line-number-at-pos
(powtórzona około 50 razy) powoduje zauważalne spowolnienie w buforach pół-dużych - np. 50 000 linii - gdy punkt znajduje się w pobliżu końca bufora. Przez spowolnienie mam na myśli łącznie około 1,35 sekundy.
Zamiast używać 100% elisp
funcitonu do zliczania linii i przejścia do górnej części bufora, byłbym zainteresowany hybrydową metodą, która wykorzystuje wbudowane zdolności C odpowiedzialne za numer linii pojawiający się na linii trybu. Numer linii, który pojawia się na linii trybu, występuje z prędkością światła, niezależnie od wielkości bufora.
Oto funkcja testowa:
(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))
źródło
line-number-display-limit-width
która jest ustawiona na wartość 200 domyślnie, jak się tutaj dowiedziałem .i
została zastąpiona(string-to-number (format-mode-line "%l"))
przez pierwszy test, a druga literai
została zastąpiona(line-number-at-pos)
przez drugi test.nlinum.el wykorzystuje:
z następującą dodatkową konfiguracją w funkcji trybu:
źródło
line-number-at-pos
Można zastąpić odpowiedź przez Konstantyna, i że będzie przyspieszyć swoją bibliotekę jeszcze bardziej niż już jej - zwłaszcza w dużych buforów.count-lines
powinien również zostać naprawiony przy użyciu metody Constantine. Zastanawiałem się nawet nad przesłaniem skrzynki z sugestiami na infolinię z raportem-emacs-bug, aby naprawić te funkcje.