Fungsi line-number-at-pos
(ketika diulang sekitar 50 kali) menyebabkan penurunan yang nyata pada buffer semi-besar - misalnya, 50.000 baris - ketika titik mendekati akhir buffer. Dengan perlambatan, maksud saya total gabungan sekitar 1,35 detik.
Alih-alih menggunakan fungsi 100% elisp
untuk menghitung garis dan kebagian atas buffer, saya lebih tertarik pada metode hibrida yang memanfaatkan kemampuan C bawaan yang bertanggung jawab atas nomor baris yang muncul pada mode-line. Nomor baris yang muncul pada mode-line terjadi dengan kecepatan ringan, terlepas dari ukuran buffer.
Berikut ini adalah fungsi tes:
(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))
sumber
line-number-display-limit-width
yang diatur ke nilai 200 per default seperti yang saya temukan di sini .i
diganti dengan(string-to-number (format-mode-line "%l"))
untuk tes pertama, dan huruf keduai
diganti dengan(line-number-at-pos)
untuk tes kedua.nlinum.el menggunakan yang berikut:
dengan konfigurasi tambahan berikut dalam fungsi mode:
sumber
line-number-at-pos
bisa diganti dengan jawaban oleh Constantine, dan itu akan mempercepat perpustakaan Anda bahkan lebih dari yang sudah ada - terutama dalam buffer besar.count-lines
juga harus diperbaiki menggunakan metode oleh Constantine. Saya bahkan berpikir untuk mengirimkan pengiriman kotak saran ke hotline report-emacs-bug untuk memperbaiki fungsi-fungsi tersebut.