A função line-number-at-pos
(quando repetida cerca de 50 vezes) está causando um abrandamento perceptível nos buffers semi-grandes - por exemplo, 50.000 linhas - quando o ponto está próximo ao final do buffer. Por desaceleração, quero dizer um total combinado de cerca de 1,35 segundos.
Em vez de usar uma função 100% elisp
para contar linhas e ir para o topo do buffer, eu estaria interessado em um método híbrido que explora as habilidades C integradas responsáveis pelo número da linha que aparece na linha de modo. O número da linha que aparece na linha de modo ocorre na velocidade da luz, independentemente do tamanho do buffer.
Aqui está uma função de teste:
(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))
fonte
line-number-display-limit-width
que é definido como um valor de 200 por padrão, como descobri aqui .i
seja substituída(string-to-number (format-mode-line "%l"))
pelo primeiro teste e a segunda letrai
seja substituída(line-number-at-pos)
pelo segundo teste.O nlinum.el usa o seguinte:
com a seguinte configuração extra na função mode:
fonte
line-number-at-pos
poderia ser substituído pela resposta de Constantine, o que aceleraria sua biblioteca ainda mais do que já é - especialmente em buffers grandes.count-lines
também deve ser corrigido usando o método de Constantine. Eu estava pensando em enviar um envio de caixa de sugestões para a linha direta report-emacs-bug para corrigir essas funções.