org-list: make org-at-item-p less permissive

* lisp/org-list.el (org-at-item-p): also verify context is valid.
  Otherwise it would recognize valid items where org-in-item-p
  wouldn't.
(org-in-item-p, org-list-struct-apply-struct): use shorter version of
org-at-item-p.
(org-cycle-list-bullet): fix typo.
(org-list-parse-list): avoid calling org-at-item-p two times by using
an appropriate regexp
* lisp/org.el (org-indent-line-function): use an appropriate regexp
  instead of calling org-at-item-p two times.
This commit is contained in:
Nicolas Goaziou 2011-01-24 23:37:35 +01:00
parent 0bec47e9ab
commit 0148fac717
2 changed files with 14 additions and 8 deletions

View File

@ -408,6 +408,7 @@ This checks `org-list-ending-method'."
(lim-up (car context))
(inlinetask-re (and (featurep 'org-inlinetask)
(org-inlinetask-outline-regexp)))
(item-re (org-item-re))
;; Indentation isn't meaningful when point starts at an empty
;; line or an inline task.
(ind-ref (if (or (looking-at "^[ \t]*$")
@ -416,7 +417,7 @@ This checks `org-list-ending-method'."
(org-get-indentation))))
(cond
((eq (nth 2 context) 'invalid) nil)
((org-at-item-p) (point))
((looking-at item-re) (point))
(t
;; Detect if cursor in amidst `org-list-end-re'. First, count
;; number HL of hard lines it takes, then call `org-in-regexp'
@ -440,7 +441,7 @@ This checks `org-list-ending-method'."
(let ((ind (org-get-indentation)))
(cond
;; This is exactly what we want.
((and (org-at-item-p)
((and (looking-at item-re)
(or (< ind ind-ref)
(eq org-list-ending-method 'regexp)))
(throw 'exit (point)))
@ -471,7 +472,10 @@ This checks `org-list-ending-method'."
(defun org-at-item-p ()
"Is point in a line starting a hand-formatted item?"
(save-excursion (beginning-of-line) (looking-at (org-item-beginning-re))))
(save-excursion
(beginning-of-line)
(and (not (eq (nth 2 (org-list-context)) 'invalid))
(looking-at (org-item-re)))))
(defun org-at-item-bullet-p ()
"Is point at the bullet of a plain list item?"
@ -1591,6 +1595,7 @@ have changed.
Initial position of cursor is restored after the changes."
(let* ((pos (copy-marker (point)))
(item-re (org-item-re))
(shift-body-ind
(function
;; Shift the indentation between END and BEG by DELTA.
@ -1600,7 +1605,8 @@ Initial position of cursor is restored after the changes."
(skip-chars-backward " \r\t\n")
(beginning-of-line)
(while (or (> (point) beg)
(and (= (point) beg) (not (org-at-item-p))))
(and (= (point) beg)
(not (looking-at item-re))))
(when (org-looking-at-p "^[ \t]*\\S-")
(let ((i (org-get-indentation)))
(org-indent-line-to (+ i delta))))
@ -1958,7 +1964,7 @@ If WHICH is a valid string, use that as the new bullet. If WHICH
is an integer, 0 means `-', 1 means `+' etc. If WHICH is
`previous', cycle backwards."
(interactive "P")
(unless (org-at-item-p) (error "This is not a list"))
(unless (org-at-item-p) (error "Not at an item"))
(save-excursion
(beginning-of-line)
(let* ((struct (org-list-struct))
@ -2619,12 +2625,12 @@ Point is left at list end."
(mapcar parse-item e)))))
(parse-item
(function
;; Return a list containing conter of item, if any, text
;; Return a list containing counter of item, if any, text
;; and any sublist inside it.
(lambda (e)
(let ((start (save-excursion
(goto-char e)
(or (org-at-item-counter-p) (org-at-item-p))
(looking-at "[ \t]*\\S-+[ \t]+\\(\\[@[:[:alnum:]]+\\][ \t]*\\)?")
(match-end 0)))
;; Get counter number. For alphabetic counter, get
;; its position in the alphabet.

View File

@ -18866,7 +18866,7 @@ If point is in an inline task, mark that task instead."
(org-get-indentation (match-string 0)))))
;; Lists
((ignore-errors (goto-char (org-in-item-p)))
(or (org-at-item-description-p) (org-at-item-p))
(looking-at "[ \t]*\\(\\S-+\\)\\(.*[ \t]+::\\)?[ \t]+")
(setq bpos (match-beginning 1) tpos (match-end 0)
bcol (progn (goto-char bpos) (current-column))
tcol (progn (goto-char tpos) (current-column)))