|
@@ -20460,6 +20460,10 @@ This function considers both visible and invisible heading lines.
|
|
|
With argument, move up ARG levels."
|
|
|
(outline-up-heading arg t))
|
|
|
|
|
|
+(defvar-local org--up-heading-cache nil
|
|
|
+ "Buffer-local `org-up-heading-safe' cache.")
|
|
|
+(defvar-local org--up-heading-cache-tick nil
|
|
|
+ "Buffer `buffer-chars-modified-tick' in `org--up-heading-cache'.")
|
|
|
(defun org-up-heading-safe ()
|
|
|
"Move to the heading line of which the present line is a subheading.
|
|
|
This version will not throw an error. It will return the level of the
|
|
@@ -20469,10 +20473,28 @@ Also, this function will be a lot faster than `outline-up-heading',
|
|
|
because it relies on stars being the outline starters. This can really
|
|
|
make a significant difference in outlines with very many siblings."
|
|
|
(when (ignore-errors (org-back-to-heading t))
|
|
|
- (let ((level-up (1- (funcall outline-level))))
|
|
|
- (and (> level-up 0)
|
|
|
- (re-search-backward (format "^\\*\\{1,%d\\} " level-up) nil t)
|
|
|
- (funcall outline-level)))))
|
|
|
+ (let (level-cache)
|
|
|
+ (unless org--up-heading-cache
|
|
|
+ (setq org--up-heading-cache (make-hash-table)))
|
|
|
+ (if (and (eq (buffer-chars-modified-tick) org--up-heading-cache-tick)
|
|
|
+ (setq level-cache (gethash (point) org--up-heading-cache)))
|
|
|
+ (when (<= (point-min) (car level-cache) (point-max))
|
|
|
+ ;; Parent is inside accessible part of the buffer.
|
|
|
+ (progn (goto-char (car level-cache))
|
|
|
+ (cdr level-cache)))
|
|
|
+ ;; Buffer modified. Invalidate cache.
|
|
|
+ (unless (eq (buffer-chars-modified-tick) org--up-heading-cache-tick)
|
|
|
+ (setq-local org--up-heading-cache-tick
|
|
|
+ (buffer-chars-modified-tick))
|
|
|
+ (clrhash org--up-heading-cache))
|
|
|
+ (let* ((level-up (1- (funcall outline-level)))
|
|
|
+ (pos (point))
|
|
|
+ (result (and (> level-up 0)
|
|
|
+ (re-search-backward
|
|
|
+ (format "^\\*\\{1,%d\\} " level-up) nil t)
|
|
|
+ (funcall outline-level))))
|
|
|
+ (when result (puthash pos (cons (point) result) org--up-heading-cache))
|
|
|
+ result)))))
|
|
|
|
|
|
(defun org-up-heading-or-point-min ()
|
|
|
"Move to the heading line of which the present is a subheading, or point-min.
|