La fonction line-number-at-pos
(lorsqu'elle est répétée environ 50 fois) provoque un ralentissement notable dans les tampons semi-volumineux - par exemple, 50 000 lignes - lorsque le point est proche de la fin du tampon. Par ralentissement, je veux dire un total combiné d'environ 1,35 seconde.
Au lieu d'utiliser une fonction à 100% elisp
pour compter les lignes et atteindre le haut du tampon, je serais intéressé par une méthode hybride qui exploite les capacités C intégrées responsables du numéro de ligne apparaissant sur la ligne de mode. Le numéro de ligne qui apparaît sur la ligne de mode se produit à la vitesse de la lumière, quelle que soit la taille du tampon.
Voici une fonction de test:
(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))
la source
line-number-display-limit-width
ce qui est fixé à une valeur de 200 par défaut comme je l'ai découvert ici .i
soit remplacée par(string-to-number (format-mode-line "%l"))
pour le premier test, et la deuxième lettrei
soit remplacée par(line-number-at-pos)
pour le deuxième test.nlinum.el utilise les éléments suivants:
avec la configuration supplémentaire suivante dans la fonction mode:
la source
line-number-at-pos
pourrait être remplacé par la réponse de Constantine, et cela accélérerait encore plus votre bibliothèque qu'elle ne l'est déjà - en particulier dans les grands tampons.count-lines
devrait également être corrigé en utilisant la méthode de Constantine. Je pensais même à envoyer une soumission de suggestions à la hotline report-emacs-bug pour corriger ces fonctions.