From 66bf386e259a364bcca68174047d67fe7d046709 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Tue, 27 Jul 2010 20:52:30 +0200 Subject: [PATCH] Correctly handle bullets with two spaces. * org-list.el (org-list-bullet-string): New function returning bullet concatenated with an appropriate number of white spaces. * org-list.el (org-list-insert-item-generic): Insert the right bullet, with help of `org-list-bullet-string'. * org-list.el (org-indent-item-tree): Use `org-list-bullet-string'. * org-list.el (org-fix-bullet-type): Use `org-list-bullet-string'. * org-list.el (org-toggle-checkbox): send an error when `org-toggle-checkbox' is trying to insert a checkbox at a description item. * org-list.el (org-item-re): modified regexp so it can catch correct number of white space before item body. * org-list.el (org-list-at-regexp-after-bullet-p): Take into consideration new `org-item-re'. --- lisp/org-list.el | 75 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 38 deletions(-) diff --git a/lisp/org-list.el b/lisp/org-list.el index 3d8f92d53..79b15d92e 100644 --- a/lisp/org-list.el +++ b/lisp/org-list.el @@ -261,11 +261,11 @@ If GENERAL is non-nil, return the general regexp independent of the value of `org-plain-list-ordered-item-terminator'." (cond ((or general (eq org-plain-list-ordered-item-terminator t)) - "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9]+[.)]\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ((= org-plain-list-ordered-item-terminator ?.) - "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") ((= org-plain-list-ordered-item-terminator ?\)) - "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)") + "\\([ \t]*\\([-+]\\|\\([0-9]+)\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)") (t (error "Invalid value of `org-plain-list-ordered-item-terminator'")))) (defconst org-item-beginning-re (concat "^" (org-item-re)) @@ -322,22 +322,8 @@ the end of the nearest terminator from max." (and (org-at-item-p) (save-excursion (goto-char (match-end 0)) - (skip-chars-forward " \t") (looking-at regexp)))) -(defun org-list-replace-bullet (new-bullet) - "Replace current item's bullet with NEW-BULLET. -Assume point is at item. Indent body if needed." - (save-excursion - (let ((old (progn - (looking-at "[ \t]*\\(\\S-+[ \t]*\\)") - (match-string 1)))) - (unless (equal new-bullet old) - (replace-match new-bullet nil nil nil 1) - ;; When bullet lengths are differents, move the whole - ;; sublist accordingly - (org-shift-item-indentation (- (length new-bullet) (length old))))))) - (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 @@ -380,8 +366,8 @@ function ends." (end-of-line 0))) (let* ((true-pos (point)) (bullet (and (org-beginning-of-item) - (looking-at org-item-beginning-re) - (match-string 0))) + (org-list-bullet-string (org-get-bullet)))) + (ind (org-get-indentation)) (before-p (progn ;; Description item: text starts after colons. (or (org-at-description-p) @@ -419,6 +405,7 @@ function ends." ;; insert bullet above item in order to avoid bothering ;; with possible blank lines ending last item. (org-beginning-of-item) + (indent-to-column ind) (insert (concat bullet (when checkbox "[ ] ") after-bullet)) ;; Stay between after-bullet and before text. (save-excursion @@ -875,12 +862,7 @@ children. Return t if sucessful." ;; have if we're outdenting. This is needed to prevent indentation ;; problems of subtrees when outdenting changes bullet size. (when (< delta 0) - (let ((new-bul (concat - (or bul-up bullet) " " - ;; 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 next-bul)) - " ")))) + (let ((new-bul (org-list-bullet-string (or bul-up bullet)))) (org-list-replace-bullet new-bul))) ;; Proceed to reindentation. (while (< (point) end) @@ -901,7 +883,6 @@ children. Return t if sucessful." (unless (or (< arg 0) (= (org-list-top-point) (point))) (beginning-of-line 0) (org-beginning-of-item) - (org-beginning-of-item-list) (org-fix-bullet-type))) ;; Take care of list at point. If demoting, look at ;; `org-list-demote-modify-bullet'. @@ -1008,6 +989,28 @@ Assumes cursor in item line." (and (org-at-item-p) (org-trim (match-string 1)))) +(defun org-list-bullet-string (bullet) + "Concatenate BULLET with an appropriate number of whitespaces. +It determines the number of whitespaces to append by looking at +`org-list-two-spaces-after-bullet-regexp'." + (concat + bullet " " + ;; Do we need to concat another white space ? + (when (string-match org-list-two-spaces-after-bullet-regexp bullet) " "))) + +(defun org-list-replace-bullet (new-bullet) + "Replace current item's bullet with NEW-BULLET. +Assume point is at item. Indent body if needed." + (save-excursion + (let ((old (progn + (looking-at "[ \t]*\\(\\S-+[ \t]*\\)") + (match-string 1)))) + (unless (equal new-bullet old) + (replace-match new-bullet nil nil nil 1) + ;; When bullet lengths are differents, move the whole + ;; sublist accordingly + (org-shift-item-indentation (- (length new-bullet) (length old))))))) + (defun org-fix-bullet-type (&optional force-bullet) "Make sure all items in this list have the same bullet as the first item. Also, fix the indentation." @@ -1015,13 +1018,7 @@ Also, fix the indentation." (unless (org-at-item-p) (error "This is not a list")) (org-preserve-lc (let* ((ini-bul (progn (org-beginning-of-item-list) (org-get-bullet))) - (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)) - " "))) + (bullet (org-list-bullet-string (or force-bullet ini-bul))) (replace-bullet (lambda (result bullet) (org-list-replace-bullet bullet)))) @@ -1147,11 +1144,13 @@ text below the heading." t t nil 1))) (throw 'exit t)) ((org-at-item-p) - ;; add a checkbox - (save-excursion - (goto-char (match-end 0)) - (insert "[ ] ")) - (throw 'exit t)) + ;; add a checkbox if point is not at a description item + (save-excursion + (goto-char (match-end 0)) + (if (org-at-description-p) + (error "Cannot add a checkbox in a description list") + (insert "[ ] "))) + (throw 'exit t)) (t (error "Not at a checkbox or heading, and no active region"))) (setq end (move-marker (make-marker) end)) (save-excursion -- 2.11.4.GIT