diff --git a/lisp/org-list.el b/lisp/org-list.el index ed956c292..1ec46c7ae 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -271,12 +271,12 @@ the end of the nearest terminator from max." (cond ;; nothing found: return nil ((not (funcall search-fun regexp bound noerror count)) nil) - ;; match is enclosed or protected: start again, searching one - ;; more occurrence away. ((or (save-match-data (org-in-regexps-block-p "^[ \t]*#\\+\\(begin\\|BEGIN\\)_\\([a-zA-Z0-9_]+\\)" '(concat "^[ \t]*#\\+\\(end\\|END\\)_" (match-string 2)))) (get-text-property (match-beginning 0) 'org-protected)) + ;; match is enclosed or protected: start again, searching one + ;; occurrence away. (goto-char origin) (org-list-search-unenclosed-generic search-fun regexp bound noerror (1+ count))) ;; else return point. @@ -301,23 +301,18 @@ the end of the nearest terminator from max." (defun org-list-get-item-same-level (search-fun pos limit pre-move) "Return point at the beginning of next item at the same level. Search items using function SEARCH-FUN, from POS to LIMIT. It -uses PRE-MOVE before searches. Return nil if no item was found. - -Internal use only. Prefer `org-get-next-item' and -`org-get-previous-item' for cleaner code." +uses PRE-MOVE before search. Return nil if no item was found." (save-excursion - (when pos (goto-char pos)) - (let ((begin (point)) - (ind (progn + (goto-char pos) + (let ((ind (progn (org-beginning-of-item) (org-get-indentation))) (start (point-at-bol))) - ;; we don't want to match the current line. + ;; We don't want to match the current line. (funcall pre-move) ;; Skip any sublist on the way (while (and (funcall search-fun (org-item-re) limit t) - (> (org-get-indentation) ind)) - (funcall pre-move)) + (> (org-get-indentation) ind))) (when (and (/= (point-at-bol) start) ; Have we moved ? (= (org-get-indentation) ind)) (point-at-bol))))) @@ -357,31 +352,26 @@ function ends." (let ((insert-blank-p (cdr (assq 'plain-list-item org-blank-before-new-entry)))) (cond - ((or - org-empty-line-terminates-plain-lists - (not insert-blank-p)) - 0) + ((or org-empty-line-terminates-plain-lists + (not insert-blank-p)) 0) ((eq insert-blank-p t) 1) ;; plain-list-item is 'auto. Count blank lines separating ;; neighbours items in list. - (t - (let ((next-p (org-get-next-item (point) (org-list-bottom-point)))) - (cond - ;; Is there a next item? - (next-p (goto-char next-p) - (org-back-over-empty-lines)) - ;; Is there a previous item? - ((not (org-first-list-item-p)) (org-back-over-empty-lines)) - ;; no luck: item is alone. Use default value. - (t 1))))))) + (t (let ((next-p (org-get-next-item (point) (org-list-bottom-point)))) + (cond + ;; Is there a next item? + (next-p (goto-char next-p) + (org-back-over-empty-lines)) + ;; Is there a previous item? + ((not (org-first-list-item-p)) (org-back-over-empty-lines)) + ;; no luck: item is alone. Use default value. + (t 1))))))) (insert-fun (lambda (text) ;; insert bullet above item in order to avoid bothering ;; with possible blank lines ending last item. (org-beginning-of-item) - (insert (concat bullet - (when checkbox "[ ] ") - after-bullet)) + (insert (concat bullet (when checkbox "[ ] ") after-bullet)) ;; Stay between after-bullet and before text. (save-excursion (insert (concat text (make-string (1+ blank-lines-nb) ?\n)))) @@ -389,11 +379,10 @@ function ends." (when checkbox (org-update-checkbox-count-maybe))))) (goto-char true-pos) (cond - (before-p - (funcall insert-fun nil) - ;; Not taking advantage of renumbering while moving down. Need - ;; to call it directly. - (org-maybe-renumber-ordered-list) t) + (before-p (funcall insert-fun nil) + ;; Not taking advantage of renumbering while moving + ;; down. Need to call it directly. + (org-maybe-renumber-ordered-list) t) ;; Can't split item: insert bullet at the end of item. ((not (org-get-alist-option org-M-RET-may-split-line 'item)) (funcall insert-fun nil) t) @@ -420,20 +409,19 @@ function ends." (defun org-in-item-p () "Is the cursor inside a plain list ?" - (unless (org-at-heading-p) + (unless (let ((outline-regexp org-outline-regexp)) (org-at-heading-p)) (save-excursion - ;; Move to eol so that current line can be matched by - ;; `org-item-re'. - (let* ((limit (save-excursion (outline-previous-heading))) - (actual-pos (goto-char (point-at-eol))) - (last-item-start (save-excursion - (org-search-backward-unenclosed (org-item-re) limit t))) - (list-ender (org-list-terminator-between last-item-start actual-pos))) - ;; We are in a list when we are on an item line or we can find - ;; an item before and there is no valid list ender between us - ;; and the item found. - (and last-item-start - (not list-ender)))))) + (let* ((limit (save-excursion (outline-previous-heading))) + ;; Move to eol so current line can be matched by `org-item-re'. + (actual-pos (goto-char (point-at-eol))) + (last-item-start (save-excursion + (org-search-backward-unenclosed (org-item-re) limit t))) + (list-ender (org-list-terminator-between last-item-start actual-pos))) + ;; We are in a list when we are on an item line or when we can + ;; find an item before point and there is no valid list ender + ;; between it and the point. + (and last-item-start + (not list-ender)))))) (defun org-first-list-item-p () "Is this heading the first item in a plain list?" @@ -604,9 +592,7 @@ Return point." (let ((prev-p (org-get-previous-item pos bound))) ;; recurse until no more item of the same level ;; can be found. - (if prev-p - (funcall move-up prev-p bound) - pos))))) + (if prev-p (funcall move-up prev-p bound) pos))))) ;; Go to the last item found and at bol in case we didn't move (goto-char (funcall move-up (point) limit)) (goto-char (point-at-bol)))) @@ -623,9 +609,7 @@ Return point." (let ((next-p (org-get-next-item pos bound))) ;; recurse until no more item of the same level ;; can be found. - (if next-p - (funcall get-last-item next-p bound) - pos))))) + (if next-p (funcall get-last-item next-p bound) pos))))) ;; Move to the last item of every list or sublist encountered, and ;; down to bol of a higher-level item, or limit. (while (and (/= (point) limit) @@ -886,11 +870,8 @@ Assumes cursor in item line." ;;; Bullets (defun org-get-bullet () - (save-excursion - (goto-char (point-at-bol)) - (and (looking-at - "^\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\(\\*\\)\\)\\( \\|$\\)") - (or (match-string 2) (match-string 4))))) + (and (org-at-item-p) + (org-trim (match-string 1)))) (defun org-fix-bullet-type (&optional force-bullet) "Make sure all items in this list have the same bullet as the first item. @@ -898,23 +879,22 @@ Also, fix the indentation." (interactive) (unless (org-at-item-p) (error "This is not a list")) (org-preserve-lc - (let* ((bullet + (let* ((ini-bul (progn (org-beginning-of-item-list) (org-get-bullet))) + (bullet (progn - (org-beginning-of-item-list) - (looking-at "[ \t]*\\(\\S-+\\)") - (concat (or force-bullet (match-string 1)) " " - ;; Do we need to concat another white space ? - (when (and org-list-two-spaces-after-bullet-regexp - (string-match org-list-two-spaces-after-bullet-regexp bullet)) - " ")))) + (concat + (or force-bullet ini-bul) " " + ;; Do we need to concat another white space ? + (when (and org-list-two-spaces-after-bullet-regexp + (string-match org-list-two-spaces-after-bullet-regexp ini-bul)) + " ")))) (replace-bullet (lambda (result bullet) (let* ((old (progn - (skip-chars-forward " \t") - (looking-at "\\S-+ *") - (match-string 0)))) + (looking-at "[ \t]*\\(\\S-+[ \t]*\\)") + (match-string 1)))) (unless (equal bullet old) - (replace-match bullet) + (replace-match bullet nil nil nil 1) ;; When bullet lengths are differents, move the whole ;; sublist accordingly (org-shift-item-indentation (- (length bullet) (length old)))))))) @@ -996,12 +976,13 @@ is an integer, 0 means `-', 1 means `+' etc. If WHICH is ;; Description items cannot be numbered (unless (org-at-description-p) '("1." "1)")))) (len (length bullet-list)) - (item-pos (- len (length (member current bullet-list)))) + (item-index (- len (length (member current bullet-list)))) + (get-value (lambda (index) (nth (mod index len) bullet-list))) (new (cond ((member which bullet-list) which) - ((numberp which) (nth (mod which len) bullet-list)) - ((eq 'previous which) (nth (mod (1- item-pos) len) bullet-list)) - (t (nth (mod (1+ item-pos) len) bullet-list))))) + ((numberp which) (funcall get-value which)) + ((eq 'previous which) (funcall get-value (1- item-index))) + (t (funcall get-value (1+ item-index)))))) (org-fix-bullet-type new)))) ;;; Checkboxes