Функция line-number-at-pos
(при повторении около 50 раз) вызывает заметное замедление в полубольших буферах - например, 50000 строк - когда точка находится рядом с концом буфера. Под замедлением я подразумеваю общую сумму около 1,35 секунды.
Вместо того, чтобы использовать 100% -ную elisp
функцию для подсчета строк и перехода в верхнюю часть буфера, я бы заинтересовался гибридным методом, который использует встроенные способности C, отвечающие за номер строки, появляющейся в строке режима. Номер строки, который появляется на строке режима, появляется со скоростью света, независимо от размера буфера.
Вот тестовая функция:
(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))
источник
line-number-display-limit-width
которых превышает 200, устанавливается по умолчанию, как я узнал здесь .i
заменялась(string-to-number (format-mode-line "%l"))
на первый тест, а втораяi
-(line-number-at-pos)
на второй тест.nlinum.el использует следующее:
со следующей дополнительной настройкой в функции mode:
источник
line-number-at-pos
можно заменить на ответ Константина, и это ускорит вашу библиотеку даже больше, чем она уже есть, особенно в больших буферах.count-lines
следует также исправить с помощью метода Константина. Я даже думал о том, чтобы отправить предложение-предложение на горячую линию report-emacs-bug, чтобы исправить эти функции.