この機能line-number-at-pos
(約50回繰り返した場合)は、ポイントがバッファーの終わり近くにあるときに、セミラインバッファー(たとえば50,000行)で顕著なスローダウンを引き起こしています。スローダウンとは、合計で約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))