看了下 linum-mode
的实现
自己在 scratch buffer 一万行处(自己dotimes insert行什么的)执行
(benchmark-run 1000 (line-number-at-pos)) ;; 1.293795s
(benchmark-run 1000 (string-to-number (format-mode-line "%l"))) ;; 0.004484s
因为 (line-number-at-pos)
是通过 elisp
来一行一行统计行数来得到当前行数的,而 format-mode-line
是 build-in 的函数。所以后者在速度上优于前者。
所以理论上,可以直接
;; 不推荐使用,原因看下面
(defun line-number-at-pos ()
"Much faster line-number-at-pos"
(string-to-number (format-mode-line "%l")))
(setq line-number-display-limit-width 2000000)
来获取更快的速度。
当然以上都只是理论上
我看了下 linum-mode 的实现,它只针对当前显示的区域进行更新,而且 line-number-at-pos
只执行了一次(上面执行了1000次)所以
-
linum-mode 的卡顿真的存在么,还是我们错怪了它(我在这个10000行的buffer里未能察觉到卡顿,是要求什么特有的mode还是超长行什么的?),有没有什么方法稳定的复现这种卡顿
-
如果存在,究竟是因为什么原因呢