+(defvar nlinum--line-number-cache nil)
+(make-variable-buffer-local 'nlinum--line-number-cache)
+
+(defun nlinum--after-change (&rest _args)
+ (setq nlinum--line-number-cache nil))
+
+(defun nlinum--line-number-at-pos ()
+ "Like `line-number-at-pos' but sped up with a cache."
+ ;; (assert (bolp))
+ (let ((pos
+ (if (and nlinum--line-number-cache
+ (> (- (point) (point-min))
+ (abs (- (point) (car nlinum--line-number-cache)))))
+ (funcall (if (> (point) (car nlinum--line-number-cache))
+ #'+ #'-)
+ (cdr nlinum--line-number-cache)
+ (count-lines (point) (car nlinum--line-number-cache)))
+ (line-number-at-pos))))
+ ;;(assert (= pos (line-number-at-pos)))
+ (setq nlinum--line-number-cache (cons (point) pos))
+ pos))
+