1
0
mirror of https://git.savannah.gnu.org/git/emacs/org-mode.git synced 2024-11-24 07:20:29 +00:00

Speed optimization of indent method

This commit is contained in:
Nicolas Goaziou 2010-08-21 04:32:48 +02:00
parent c96c14a9d5
commit c675061eb2

View File

@ -361,35 +361,35 @@ indented than the previous item within LIMIT.
Return the position of the previous item, if applicable."
(save-excursion
(beginning-of-line)
;; do not start searching at a blank line or inside a block
(while (or (and (org-list-maybe-skip-block #'re-search-backward limit)
(goto-char (1- (point-at-bol))))
(and (looking-at "^[ \t]*$") (not (bobp))))
(cond
;; do not start searching inside a block...
((org-list-maybe-skip-block #'re-search-backward limit))
;; ... or at a blank line
((looking-at "^[ \t]*$")
(skip-chars-backward " \r\t\n")
(beginning-of-line))
(beginning-of-line)))
(beginning-of-line)
(or (and (org-at-item-p) (point-at-bol))
(let* ((pos (point))
(ind (org-get-indentation))
(bound (save-excursion
(goto-char limit)
(and (org-search-forward-unenclosed
org-item-beginning-re pos t)
(point-at-bol)))))
(when bound
(catch 'exit
(while t
(cond
((or (bobp) (< (point) bound)) (throw 'exit nil))
;; skip blank lines..
((and (not (looking-at "[ \t]*$"))
;; blocks...
(not (org-list-maybe-skip-block
#'re-search-backward bound))
;; and items more indented.
(< (org-get-indentation) ind))
(throw 'exit (and (org-at-item-p) (point-at-bol))))
(t (beginning-of-line 0))))))))))
(let ((case-fold-search t)
(bound (save-excursion
(when (org-search-backward-unenclosed
org-item-beginning-re limit t)
(cons (point-at-bol) (org-get-indentation))))))
(and bound
(catch 'exit
(while t
(let ((ind (org-get-indentation)))
(cond
((looking-at "^[ \t]*$")
(skip-chars-backward " \r\t\n")
(beginning-of-line))
((looking-at "^[ \t]*#\\+end_")
(re-search-backward "^[ \t]*#\\+begin_"))
((= (point) (car bound))
(throw 'exit (car bound)))
((>= (cdr bound) ind)
(throw 'exit nil))
(t (forward-line -1)))))))))))
(defun org-list-in-item-p-with-regexp (limit)
"Is the cursor inside a plain list?
@ -445,17 +445,31 @@ List ending is determined by regexp. See
List ending is determined by indentation of text. See
`org-list-ending-method'. for more information."
(save-excursion
(let ((prev-p (org-list-in-item-p-with-indent limit)))
(let ((prev-p (org-list-in-item-p-with-indent limit))
(case-fold-search t))
(and prev-p
(catch 'exit
(while t
(cond
((not prev-p) (throw 'exit (1+ (point-at-eol))))
((= prev-p limit) (throw 'exit limit))
(t
(goto-char prev-p)
(beginning-of-line 0)
(setq prev-p (org-list-in-item-p-with-indent limit))))))))))
(let ((item-ref (goto-char prev-p))
(ind-ref 10000))
(forward-line -1)
(catch 'exit
(while t
(let ((ind (org-get-indentation)))
(cond
((<= (point) limit)
(throw 'exit item-ref))
((looking-at "^[ \t]*$")
(skip-chars-backward " \r\t\n")
(beginning-of-line))
((looking-at "^[ \t]*#\\+end_")
(re-search-backward "^[ \t]*#\\+begin_"))
((not (looking-at org-item-beginning-re))
(setq ind-ref (min ind ind-ref))
(forward-line -1))
((>= ind ind-ref)
(throw 'exit item-ref))
(t
(setq item-ref (point-at-bol) ind-ref 10000)
(forward-line -1)))))))))))
(defun org-list-bottom-point-with-indent (limit)
"Return point just before list ending or nil if not in a list.
@ -463,29 +477,34 @@ List ending is determined by indentation of text. See
List ending is determined by the indentation of text. See
`org-list-ending-method' for more information."
(save-excursion
(let* ((ind (save-excursion
(ignore-errors (org-beginning-of-item))
(org-get-indentation)))
(end-item (lambda ()
(save-excursion
(catch 'end
(while t
(beginning-of-line 2)
(cond
((>= (point) limit) (throw 'end limit))
((or (looking-at "^[ \t]*$")
(org-list-maybe-skip-block
#'re-search-forward limit)
(> (org-get-indentation) ind)))
(t (throw 'end (point-at-bol))))))))))
(and (org-in-item-p)
(let* ((beg-item (org-in-item-p))
(ind-ref (save-excursion
(when beg-item
(goto-char beg-item)
(org-get-indentation))))
(case-fold-search t))
;; do not start inside a block
(org-list-maybe-skip-block #'re-search-forward limit)
(beginning-of-line)
(and beg-item
(catch 'exit
(while t
(goto-char (funcall end-item))
(if (looking-at org-item-beginning-re)
(setq ind (org-get-indentation))
(skip-chars-backward " \r\t\n")
(throw 'exit (1+ (point-at-eol))))))))))
(let ((ind (org-get-indentation)))
(cond
((>= (point) limit)
(throw 'exit limit))
((looking-at "^[ \t]*$")
(skip-chars-forward " \r\t\n")
(beginning-of-line))
((looking-at org-item-beginning-re)
(setq ind-ref (min ind ind-ref))
(forward-line 1))
((<= ind ind-ref)
(throw 'exit (point-at-bol)))
((looking-at "^[ \t]*#\\+begin_")
(re-search-forward "[ \t]*#\\+end_")
(forward-line 1))
(t (forward-line 1))))))))))
(defun org-list-at-regexp-after-bullet-p (regexp)
"Is point at a list item with REGEXP after bullet?"