Browse Source

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'.
Nicolas Goaziou 15 years ago
parent
commit
66bf386e25
1 changed files with 37 additions and 38 deletions
  1. 37 38
      lisp/org-list.el

+ 37 - 38
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'."
 of `org-plain-list-ordered-item-terminator'."
   (cond
   (cond
    ((or general (eq org-plain-list-ordered-item-terminator t))
    ((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 ?.)
    ((= org-plain-list-ordered-item-terminator ?.)
-    "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\( \\|$\\)")
+    "\\([ \t]*\\([-+]\\|\\([0-9]+\\.\\)\\)\\|[ \t]+\\*\\)\\([ \t]+\\|$\\)")
    ((= org-plain-list-ordered-item-terminator ?\))
    ((= 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'"))))
    (t (error "Invalid value of `org-plain-list-ordered-item-terminator'"))))
 
 
 (defconst org-item-beginning-re (concat "^" (org-item-re))
 (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)
   (and (org-at-item-p)
        (save-excursion
        (save-excursion
 	 (goto-char (match-end 0))
 	 (goto-char (match-end 0))
-	 (skip-chars-forward " \t")
 	 (looking-at regexp))))
 	 (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)
 (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.
   "Return point at the beginning of next item at the same level.
 Search items using function SEARCH-FUN, from POS to LIMIT. It
 Search items using function SEARCH-FUN, from POS to LIMIT. It
@@ -380,8 +366,8 @@ function ends."
       (end-of-line 0)))
       (end-of-line 0)))
   (let* ((true-pos (point))
   (let* ((true-pos (point))
 	 (bullet (and (org-beginning-of-item)
 	 (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
 	 (before-p (progn
 		     ;; Description item: text starts after colons.
 		     ;; Description item: text starts after colons.
 		     (or (org-at-description-p)
 		     (or (org-at-description-p)
@@ -419,6 +405,7 @@ function ends."
 	    ;; insert bullet above item in order to avoid bothering
 	    ;; insert bullet above item in order to avoid bothering
 	    ;; with possible blank lines ending last item.
 	    ;; with possible blank lines ending last item.
 	    (org-beginning-of-item)
 	    (org-beginning-of-item)
+            (indent-to-column ind)
 	    (insert (concat bullet (when checkbox "[ ] ") after-bullet))
 	    (insert (concat bullet (when checkbox "[ ] ") after-bullet))
 	    ;; Stay between after-bullet and before text.
 	    ;; Stay between after-bullet and before text.
 	    (save-excursion
 	    (save-excursion
@@ -875,12 +862,7 @@ children. Return t if sucessful."
     ;; have if we're outdenting. This is needed to prevent indentation
     ;; have if we're outdenting. This is needed to prevent indentation
     ;; problems of subtrees when outdenting changes bullet size.
     ;; problems of subtrees when outdenting changes bullet size.
     (when (< delta 0)
     (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)))
         (org-list-replace-bullet new-bul)))
     ;; Proceed to reindentation.
     ;; Proceed to reindentation.
     (while (< (point) end)
     (while (< (point) end)
@@ -901,7 +883,6 @@ children. Return t if sucessful."
       (unless (or (< arg 0) (= (org-list-top-point) (point)))
       (unless (or (< arg 0) (= (org-list-top-point) (point)))
         (beginning-of-line 0)
         (beginning-of-line 0)
         (org-beginning-of-item)
         (org-beginning-of-item)
-        (org-beginning-of-item-list)
         (org-fix-bullet-type)))
         (org-fix-bullet-type)))
     ;; Take care of list at point. If demoting, look at
     ;; Take care of list at point. If demoting, look at
     ;; `org-list-demote-modify-bullet'.
     ;; `org-list-demote-modify-bullet'.
@@ -1008,6 +989,28 @@ Assumes cursor in item line."
   (and (org-at-item-p)
   (and (org-at-item-p)
        (org-trim (match-string 1))))
        (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)
 (defun org-fix-bullet-type (&optional force-bullet)
   "Make sure all items in this list have the same bullet as the first item.
   "Make sure all items in this list have the same bullet as the first item.
 Also, fix the indentation."
 Also, fix the indentation."
@@ -1015,13 +1018,7 @@ Also, fix the indentation."
   (unless (org-at-item-p) (error "This is not a list"))
   (unless (org-at-item-p) (error "This is not a list"))
   (org-preserve-lc
   (org-preserve-lc
    (let* ((ini-bul (progn (org-beginning-of-item-list) (org-get-bullet)))
    (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
 	  (replace-bullet
 	   (lambda (result bullet)
 	   (lambda (result bullet)
 	     (org-list-replace-bullet bullet))))
 	     (org-list-replace-bullet bullet))))
@@ -1147,11 +1144,13 @@ text below the heading."
 	     t t nil 1)))
 	     t t nil 1)))
 	(throw 'exit t))
 	(throw 'exit t))
        ((org-at-item-p)
        ((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")))
        (t (error "Not at a checkbox or heading, and no active region")))
       (setq end (move-marker (make-marker) end))
       (setq end (move-marker (make-marker) end))
       (save-excursion
       (save-excursion