Explorar el Código

org-list: rewrite of org-apply-on-list

* lisp/org-list.el (org-apply-on-list): use new structures. Function
  is now applied in reverse order so modifications do not change
  positions of items in buffer.
Nicolas Goaziou hace 14 años
padre
commit
9230df2e0d
Se han modificado 2 ficheros con 17 adiciones y 11 borrados
  1. 11 8
      lisp/org-list.el
  2. 6 3
      lisp/org-mouse.el

+ 11 - 8
lisp/org-list.el

@@ -2223,20 +2223,23 @@ FUNCTION must be called with at least one argument: INIT-VALUE,
 that will contain the value returned by the function at the
 previous item, plus ARGS extra arguments.
 
+FUNCTION is applied on items in reverse order.
+
 As an example, (org-apply-on-list (lambda (result) (1+ result)) 0)
 will return the number of items in the current list.
 
 Sublists of the list are skipped.  Cursor is always at the
 beginning of the item."
-  (let* ((pos (copy-marker (point)))
-	 (end (copy-marker (org-list-bottom-point)))
-	 (next-p (copy-marker (org-get-beginning-of-list (org-list-top-point))))
+  (let* ((struct (org-list-struct))
+	 (prevs (org-list-struct-prev-alist struct))
+	 (item (copy-marker (point-at-bol)))
+	 (all (org-list-get-all-items (marker-position item) struct prevs))
 	 (value init-value))
-    (while (< next-p end)
-      (goto-char next-p)
-      (set-marker next-p (or (org-get-next-item (point) end) end))
-      (setq value (apply function value args)))
-    (goto-char pos)
+    (mapc (lambda (e)
+	    (goto-char e)
+	    (setq value (apply function value args)))
+	  (nreverse all))
+    (goto-char item)
     value))
 
 (defun org-sort-list (&optional with-case sorting-type getkey-func compare-func)

+ 6 - 3
lisp/org-mouse.el

@@ -579,9 +579,12 @@ SCHEDULED: or DEADLINE: or ANYTHINGLIKETHIS:"
 
 (defun org-mouse-for-each-item (funct)
   ;; Functions called by `org-apply-on-list' need an argument
-  (let ((wrap-fun (lambda (c) (funcall funct))))
-    (when (org-in-item-p)
-      (org-apply-on-list wrap-fun nil))))
+  (let ((wrap-fun (lambda (c) (funcall funct)))
+	(item-beg (org-in-item-p)))
+    (when item-beg
+      (save-excursion
+	(goto-char item-beg)
+	(org-apply-on-list wrap-fun nil)))))
 
 (defun org-mouse-bolp ()
   "Return true if there only spaces, tabs, and '*' before point.