diff --git a/lisp/org.el b/lisp/org.el index 8acf5a9df..87341eac1 100644 --- a/lisp/org.el +++ b/lisp/org.el @@ -11138,7 +11138,8 @@ statistics everywhere." (first t) (box-re "\\(\\(\\[[0-9]*%\\]\\)\\|\\(\\[[0-9]*/[0-9]*\\]\\)\\)") level ltoggle l1 new ndel - (cnt-all 0) (cnt-done 0) is-percent kwd cookie-present) + (cnt-all 0) (cnt-done 0) is-percent kwd + checkbox-beg ov ovs ove cookie-present) (catch 'exit (save-excursion (beginning-of-line 1) @@ -11159,31 +11160,36 @@ statistics everywhere." (throw 'exit nil)) (while (re-search-forward box-re (point-at-eol) t) (setq cnt-all 0 cnt-done 0 cookie-present t) - (setq is-percent (match-end 2)) + (setq is-percent (match-end 2) checkbox-beg (match-beginning 0)) (save-match-data (unless (outline-next-heading) (throw 'exit nil)) (while (and (looking-at org-complex-heading-regexp) - (> (setq l1 (length (match-string 1))) level)) - (setq kwd (and (or recursive (= l1 ltoggle)) - (match-string 2))) - (if (or (eq org-provide-todo-statistics 'all-headlines) - (and (listp org-provide-todo-statistics) - (or (member kwd org-provide-todo-statistics) - (member kwd org-done-keywords)))) - (setq cnt-all (1+ cnt-all)) - (if (eq org-provide-todo-statistics t) - (and kwd (setq cnt-all (1+ cnt-all))))) - (and (member kwd org-done-keywords) - (setq cnt-done (1+ cnt-done))) - (outline-next-heading))) + (> (setq l1 (length (match-string 1))) level)) + (setq kwd (and (or recursive (= l1 ltoggle)) + (match-string 2))) + (if (or (eq org-provide-todo-statistics 'all-headlines) + (and (listp org-provide-todo-statistics) + (or (member kwd org-provide-todo-statistics) + (member kwd org-done-keywords)))) + (setq cnt-all (1+ cnt-all)) + (if (eq org-provide-todo-statistics t) + (and kwd (setq cnt-all (1+ cnt-all))))) + (and (member kwd org-done-keywords) + (setq cnt-done (1+ cnt-done))) + (outline-next-heading))) (setq new - (if is-percent - (format "[%d%%]" (/ (* 100 cnt-done) (max 1 cnt-all))) - (format "[%d/%d]" cnt-done cnt-all)) - ndel (- (match-end 0) (match-beginning 0))) - (goto-char (match-beginning 0)) + (if is-percent + (format "[%d%%]" (/ (* 100 cnt-done) (max 1 cnt-all))) + (format "[%d/%d]" cnt-done cnt-all)) + ndel (- (match-end 0) checkbox-beg)) + ;; handle overlays when updating cookie from column view + (when (setq ov (car (overlays-at checkbox-beg))) + (setq ovs (overlay-start ov) ove (overlay-end ov)) + (delete-overlay ov)) + (goto-char checkbox-beg) (insert new) - (delete-region (point) (+ (point) ndel))) + (delete-region (point) (+ (point) ndel)) + (when ov (move-overlay ov ovs ove))) (when cookie-present (run-hook-with-args 'org-after-todo-statistics-hook cnt-done (- cnt-all cnt-done))))))