emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
* Bug: Feature-request: `org-after-checkbox-statistics-hook' [7.7 (release_7.7.370.g8e44ba)]
@ 2011-10-02 20:23 Dave Abrahams
  2011-10-02 22:15 ` Nicolas Goaziou
  0 siblings, 1 reply; 3+ messages in thread
From: Dave Abrahams @ 2011-10-02 20:23 UTC (permalink / raw)
  To: emacs-orgmode



Remember to cover the basics, that is, what you expected to happen and
what in fact did happen.  You don't know how to make a good report?  See

     http://orgmode.org/manual/Feedback.html#Feedback

Your bug report will be posted to the Org-mode mailing list.
------------------------------------------------------------------------

I was using checkboxes for a group of subtasks, and was surprised when
the following (which I lifted from the manual) wasn't causing the parent
item to be marked DONE upon checking the last box.

--8<---------------cut here---------------start------------->8---
(defun dwa/org-summary-todo (n-done n-not-done)
  "Switch entry to DONE when all subentries are done, to TODO otherwise."
  (let (org-log-done org-log-states)   ; turn off logging
    (org-todo (if (= n-not-done 0) "DONE" "TODO"))))
(add-hook 'org-after-todo-statistics-hook 'dwa/org-summary-todo)
--8<---------------cut here---------------end--------------->8---

So I set some debugger breakpoints and realized that code wasn't even
getting called.  There's a completely separate wad of code in org-list
that handles checkbox statistics.  So naturally, there's a hook, which I
added my TODO->DONE function to:

--8<---------------cut here---------------start------------->8---
(add-hook 'org-checkbox-statistics-hook 'dwa/org-summary-todo)
--8<---------------cut here---------------end--------------->8---

But `org-checkbox-statistics-hook' is a list of nullary functions, so of
course this broke since my function expects N-DONE and N-NOT-DONE.  I
looked around for an easy way to determine N-DONE and N-NOT-DONE but it
doesn't seem to exist; it's buried in the logic of
org-update-checkbox-count... I think.  What I need is a hook that acts
like org-after-todo-statistics-hook, but for checkboxes.

Emacs  : GNU Emacs 23.3.1 (x86_64-apple-darwin10.8.0, Carbon Version 1.6.0 AppKit 1038.36)
 of 2011-09-12 on pluto.luannocracy.com
Package: Org-mode version 7.7 (release_7.7.370.g8e44ba)

current state:
==============
(setq
 org-x-backends '(ox-org ox-redmine)
 org-agenda-deadline-leaders '("D: " "D%d: ")
 org-clock-in-switch-to-state "STARTED"
 org-agenda-skip-scheduled-if-deadline-is-shown t
 org-export-latex-after-initial-vars-hook '(org-beamer-after-initial-vars)
 org-special-ctrl-a/e '(nil . t)
 org-x-redmine-title-prefix-match-function 'org-x-redmine-title-prefix-match
 org-speed-command-hook '(org-speed-command-default-hook org-babel-speed-command-hook)
 org-agenda-custom-commands '(("E" "Errands (next 3 days)" tags
                               "Errand&TODO<>\"DONE\"&TODO<>\"CANCELED\"&STYLE<>\"habit\"&SCHEDULED<\"<+3d>\""
                               ((org-agenda-overriding-header "Errands (next 3 days)")
                                                                                                                )
                               )
                              ("A" "Priority #A tasks" agenda ""
                               ((org-agenda-ndays 1)
                                (org-agenda-overriding-header "Today's priority #A tasks: ")
                                (org-agenda-skip-function
                                 (quote (org-agenda-skip-entry-if (quote notregexp) "\\=.*\\[#A\\]")))
                                )
                               )
                              ("b" "Priority #A and #B tasks" agenda ""
                               ((org-agenda-ndays 1)
                                (org-agenda-overriding-header "Today's priority #A and #B tasks: ")
                                (org-agenda-skip-function
                                 (quote (org-agenda-skip-entry-if (quote regexp) "\\=.*\\[#C\\]")))
                                )
                               )
                              ("w" "Waiting/delegated tasks" tags
                               "TODO=\"WAITING\"|TODO=\"DELEGATED\""
                               ((org-agenda-overriding-header "Waiting/delegated tasks:")
                                (org-agenda-sorting-strategy
                                 (quote (todo-state-up priority-down category-up)))
                                )
                               )
                              ("p" "Unprioritized tasks" tags
                               "AREA<>\"Work\"&TODO<>\"\"&TODO<>{DONE\\|CANCELED\\|NOTE\\|PROJECT\\|DEFERRED\\|SOMEDAY}"
                               ((org-agenda-files
                                 
                                                                                                                           (quote
                                                                                                                            
                                                                                                                            
                                                                                                                                             ("~/Documents/Tasks/todo.txt")
                                                                                                                            
                                                                                                                            
                                                                                                                                             )
                                 
                                                                                                                           )
                                
                                                                                                                          (org-agenda-overriding-header "Unprioritized tasks: ")
                                
                                                                                                                          (org-agenda-skip-function
                                                                                                                           
                                                                                                                           (quote
                                                                                                                            
                                                                                                                            
                                                                                                                            
                                                                                                                                                     (org-agenda-skip-entry-if
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                            (quote regexp)
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                      
                                                                                                                                                            "\\=.*\\[#[A-Z]\\]")
                                                                                                                            
                                                                                                                            
                                                                                                                            
                                                                                                                                                     )
                                                                                                                           
                                                                                                                           )
                                
                                                                                                                          )
                               )
                              ("u" "Unscheduled tasks" tags
                               "AREA<>\"Work\"&TODO<>\"\"&TODO<>{DONE\\|CANCELED\\|NOTE\\|PROJECT}"
                               ((org-agenda-files (quote ("~/Documents/Tasks/todo.txt")))
                                (org-agenda-overriding-header "Unscheduled tasks: ")
                                (org-agenda-skip-function
                                 (quote
                                  (org-agenda-skip-entry-if (quote scheduled) (quote deadline)
                                   (quote timestamp) (quote regexp) "\\* \\(DEFERRED\\|SOMEDAY\\)")
                                  )
                                 )
                                (org-agenda-sorting-strategy (quote (priority-down))))
                               )
                              ("U" "Deferred tasks" tags "TODO=\"DEFERRED\""
                               ((org-agenda-files (quote ("~/Documents/Tasks/todo.txt")))
                                (org-agenda-overriding-header "Deferred tasks:"))
                               )
                              ("Y" "Someday tasks" tags "TODO=\"SOMEDAY\""
                               ((org-agenda-overriding-header "Someday tasks:")))
                              ("G" "Ledger tasks (all)" alltodo ""
                               ((org-agenda-files (quote ("~/src/ledger/plan/TODO")))
                                (org-agenda-overriding-header "Ledger tasks:")
                                (org-agenda-sorting-strategy
                                 (quote (todo-state-up priority-down category-up)))
                                )
                               )
                              ("N" "Ledger tasks (all, alphabetical)" alltodo ""
                               ((org-agenda-files (quote ("~/src/ledger/plan/TODO")))
                                (org-agenda-overriding-header "Ledger tasks, alphabetical:")
                                (org-agenda-sorting-strategy (quote (alpha-up))))
                               )
                              ("l" "Ledger tasks" tags-todo "TODO<>{SOMEDAY\\|DEFERRED}"
                               ((org-agenda-files (quote ("~/src/ledger/plan/TODO")))
                                (org-agenda-overriding-header "Ledger tasks:")
                                (org-agenda-sorting-strategy
                                 (quote (todo-state-up priority-down category-up)))
                                (org-agenda-skip-function
                                 (quote (org-agenda-skip-entry-if (quote regexp) "\\=.*\\[#C\\]")))
                                )
                               )
                              ("L" "Ledger tasks not in Bugzilla" tags
                               "TODO<>{DONE\\|TESTED\\|CLOSED\\|NOTE}&LEVEL=2"
                               ((org-agenda-files (quote ("~/src/ledger/plan/TODO")))
                                (org-agenda-overriding-header "Ledger tasks:")
                                (org-agenda-sorting-strategy
                                 (quote (todo-state-up priority-down category-up)))
                                (org-agenda-skip-function
                                 (quote (org-agenda-skip-entry-if (quote regexp) "#")))
                                )
                               )
                              ("r" "Uncategorized items" tags "CATEGORY=\"Inbox\"&LEVEL=2"
                               ((org-agenda-overriding-header "Uncategorized items")))
                              ("V" "Unscheduled work-related tasks" tags
                               "AREA=\"Work\"&TODO<>\"\"&TODO<>{DONE\\|CANCELED\\|NOTE\\|PROJECT}"
                               ((org-agenda-overriding-header "Unscheduled work-related tasks")
                                (org-agenda-files (quote ("~/Documents/Tasks/todo.txt")))
                                (org-agenda-sorting-strategy (quote (category-up)))
                                (org-agenda-skip-function
                                 (quote
                                  (org-agenda-skip-entry-if (quote scheduled) (quote deadline)
                                   (quote timestamp) (quote regexp) "\\* \\(DEFERRED\\|SOMEDAY\\)")
                                  )
                                 )
                                )
                               )
                              ("W" "Work-related tasks" tags
                               "AREA=\"Work\"&TODO<>\"\"&TODO<>{DONE\\|CANCELED\\|NOTE\\|PROJECT}"
                               ((org-agenda-overriding-header "Work-related tasks")
                                (org-agenda-files (quote ("~/Documents/Tasks/todo.txt")))
                                (org-agenda-sorting-strategy
                                 (quote (category-up priority-down todo-state-up alpha-up)))
                                (org-agenda-skip-function
                                 (quote
                                  (org-agenda-skip-entry-if (quote regexp)
                                   "\\* \\(DEFERRED\\|SOMEDAY\\)")
                                  )
                                 )
                                )
                               )
                              )
 org-agenda-files '("~/Documents/Tasks/todo.txt")
 org-agenda-include-diary t
 org-blocker-hook '(org-block-todo-from-children-or-siblings-or-parent)
 org-src-fontify-natively t
 org-habit-completed-glyph 10004
 org-habit-show-habits-only-for-today nil
 org-agenda-window-setup 'current-window
 org-hide-leading-stars t
 org-clock-into-drawer "LOGBOOK"
 org-completion-use-ido t
 org-metaup-hook '(org-babel-load-in-session-maybe)
 org-footnote-section nil
 org-agenda-scheduled-leaders '("" "S%d: ")
 org-archive-save-context-info '(time category itags)
 org-after-todo-state-change-hook '(org-clock-out-if-current)
 org-babel-tangle-lang-exts '(("python" . "py") ("emacs-lisp" . "el"))
 org-agenda-text-search-extra-files '(agenda-archives)
 org-agenda-follow-indirect t
 org-archive-location "TODO-archive::"
 org-agenda-skip-unavailable-files t
 org-agenda-default-appointment-duration 60
 org-habit-today-glyph 9483
 org-time-clocksum-use-fractional t
 org-edit-src-content-indentation 0
 org-agenda-sorting-strategy '((agenda habit-down time-up todo-state-up priority-down category-keep)
                               (todo priority-down category-keep) (tags priority-down category-keep)
                               (search category-keep))
 org-export-blocks-postblock-hook '(org-exp-res/src-name-cleanup)
 org-agenda-prefix-format '((agenda . "  %-11:c%?-12t% s") (timeline . "  % s") (todo . "  %-11:c")
                            (tags . "  %-11:c"))
 org-after-todo-statistics-hook '(dwa/org-summary-todo)
 org-habit-preceding-days 42
 org-export-latex-format-toc-function 'org-export-latex-format-toc-default
 org-agenda-skip-scheduled-if-done t
 org-x-redmine-title-prefix-function 'org-x-redmine-title-prefix
 org-clock-in-resume t
 org-tab-first-hook '(yas/org-very-safe-expand org-hide-block-toggle-maybe
                      org-src-native-tab-command-maybe org-babel-hide-result-toggle-maybe)
 org-src-mode-hook '(org-src-babel-configure-edit-buffer org-src-mode-configure-edit-buffer)
 org-finalize-agenda-hook '(org-agenda-add-overlays)
 org-cycle-global-at-bob t
 org-confirm-shell-link-function nil
 org-export-first-hook '(org-beamer-initialize-open-trackers)
 org-clock-persist 'history
 org-agenda-before-write-hook '(org-agenda-add-entry-text)
 org-agenda-start-with-follow-mode t
 org-default-notes-file "~/Documents/Tasks/todo.txt"
 org-use-property-inheritance '("AREA")
 org-directory "~/Documents/Tasks/"
 org-agenda-persistent-filter t
 org-blank-before-new-entry nil
 org-babel-pre-tangle-hook '(save-buffer)
 org-cycle-hook '(org-cycle-hide-archived-subtrees org-cycle-hide-drawers org-cycle-show-empty-lines
                  org-optimize-window-after-visibility-change)
 org-export-preprocess-before-normalizing-links-hook '(org-remove-file-link-modifiers)
 org-refile-target-verify-function 'dwa/org-verify-refile-target
 org-use-speed-commands t
 org-mode-hook '((lambda nil (set (make-local-variable (quote yas/trigger-key)) [tab])
                  (add-to-list (quote org-tab-first-hook) (quote yas/org-very-safe-expand))
                  (define-key yas/keymap [tab] (quote yas/next-field)))
                 (lambda nil (local-unset-key (kbd ".,")))
                 #[nil "\300\301\302\303\304$\207"
                   [org-add-hook change-major-mode-hook org-show-block-all append local] 5]
                 #[nil "\300\301\302\303\304$\207"
                   [org-add-hook change-major-mode-hook org-babel-show-result-all append local] 5]
                 org-babel-result-hide-spec org-babel-hide-all-hashes)
 org-clock-out-remove-zero-time-clocks t
 org-agenda-ndays 1
 org-refile-targets '((nil :todo . "PROJECT") (nil :maxlevel . 2))
 org-extend-today-until 6
 org-mobile-pre-pull-hook '(my-org-convert-incoming-items)
 org-ctrl-c-ctrl-c-hook '(org-babel-hash-at-point org-babel-execute-safely-maybe)
 org-log-buffer-setup-hook '((lambda nil (setq fill-column (- fill-column 5))))
 org-return-follows-link t
 org-confirm-elisp-link-function nil
 org-fast-tag-selection-single-key 'expert
 org-todo-repeat-to-state "TODO"
 org-log-into-drawer t
 org-clock-modeline-total 'current
 org-agenda-mode-hook '((lambda nil (local-unset-key (kbd ".,"))))
 org-agenda-start-on-weekday nil
 org-agenda-fontify-priorities t
 org-export-interblocks '((lob org-babel-exp-lob-one-liners) (src org-babel-exp-inline-src-blocks))
 org-clock-out-hook '(org-clock-remove-empty-clock-drawer)
 org-enforce-todo-dependencies t
 org-agenda-skip-deadline-if-done t
 org-reverse-note-order t
 org-occur-hook '(org-first-headline-recenter)
 org-export-babel-evaluate nil
 org-mobile-post-push-hook '((lambda nil (shell-command "/bin/rm -f ~/Dropbox/MobileOrg/agendas.org")
                              (shell-command
                               (concat "perl -i -ne 'print unless /agendas\\.org/;'"
                                "~/Dropbox/MobileOrg/checksums.dat")
                               )
                              (shell-command
                               (concat "perl -i -ne 'print unless /agendas\\.org/;'"
                                "~/Dropbox/MobileOrg/index.org")
                               )
                              )
                             )
 org-drawers '("PROPERTIES" "CLOCK" "LOGBOOK" "OUT")
 org-export-preprocess-before-selecting-backend-code-hook '(org-beamer-select-beamer-code)
 org-tags-column -97
 org-modules '(org-id org-info org-habit)
 org-agenda-auto-exclude-function 'org-my-auto-exclude-function
 org-export-latex-final-hook '(org-beamer-amend-header org-beamer-fix-toc
                               org-beamer-auto-fragile-frames
                               org-beamer-place-default-actions-for-lists)
 org-metadown-hook '(org-babel-pop-to-session-maybe)
 org-clock-idle-time 10
 org-attach-method 'mv
 org-export-blocks '((src org-babel-exp-src-block nil) (comment org-export-blocks-format-comment t)
                     (ditaa org-export-blocks-format-ditaa nil) (dot org-export-blocks-format-dot nil))
 )
-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Bug: Feature-request: `org-after-checkbox-statistics-hook' [7.7 (release_7.7.370.g8e44ba)]
  2011-10-02 20:23 Bug: Feature-request: `org-after-checkbox-statistics-hook' [7.7 (release_7.7.370.g8e44ba)] Dave Abrahams
@ 2011-10-02 22:15 ` Nicolas Goaziou
  2011-10-03 13:53   ` Dave Abrahams
  0 siblings, 1 reply; 3+ messages in thread
From: Nicolas Goaziou @ 2011-10-02 22:15 UTC (permalink / raw)
  To: Dave Abrahams; +Cc: emacs-orgmode

Dave Abrahams <dave@boostpro.com> writes:

> I was using checkboxes for a group of subtasks, and was surprised when
> the following (which I lifted from the manual) wasn't causing the parent
> item to be marked DONE upon checking the last box.
>
> (defun dwa/org-summary-todo (n-done n-not-done)
>   "Switch entry to DONE when all subentries are done, to TODO otherwise."
>   (let (org-log-done org-log-states)   ; turn off logging
>     (org-todo (if (= n-not-done 0) "DONE" "TODO"))))
> (add-hook 'org-after-todo-statistics-hook 'dwa/org-summary-todo)
>
> So I set some debugger breakpoints and realized that code wasn't even
> getting called.  There's a completely separate wad of code in org-list
> that handles checkbox statistics.  So naturally, there's a hook, which I
> added my TODO->DONE function to:
>
> (add-hook 'org-checkbox-statistics-hook 'dwa/org-summary-todo)
>
> But `org-checkbox-statistics-hook' is a list of nullary functions, so of
> course this broke since my function expects N-DONE and N-NOT-DONE.  I
> looked around for an easy way to determine N-DONE and N-NOT-DONE but it
> doesn't seem to exist; it's buried in the logic of
> org-update-checkbox-count... I think.  What I need is a hook that acts
> like org-after-todo-statistics-hook, but for checkboxes.

You just have to search for "[ ]" or "[-]" in the current section. If
there is none, and there is at least one "[X]", you can mark your task
as done.

Isn't is sufficient for your task?

Regards,

-- 
Nicolas Goaziou

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: Bug: Feature-request: `org-after-checkbox-statistics-hook' [7.7 (release_7.7.370.g8e44ba)]
  2011-10-02 22:15 ` Nicolas Goaziou
@ 2011-10-03 13:53   ` Dave Abrahams
  0 siblings, 0 replies; 3+ messages in thread
From: Dave Abrahams @ 2011-10-03 13:53 UTC (permalink / raw)
  To: Nicolas Goaziou; +Cc: emacs-orgmode


on Sun Oct 02 2011, Nicolas Goaziou <n.goaziou-AT-gmail.com> wrote:

> Dave Abrahams <dave@boostpro.com> writes:
>
>> I was using checkboxes for a group of subtasks, and was surprised when
>> the following (which I lifted from the manual) wasn't causing the parent
>> item to be marked DONE upon checking the last box.
>>
>> (defun dwa/org-summary-todo (n-done n-not-done)
>>   "Switch entry to DONE when all subentries are done, to TODO otherwise."
>>   (let (org-log-done org-log-states)   ; turn off logging
>>     (org-todo (if (= n-not-done 0) "DONE" "TODO"))))
>> (add-hook 'org-after-todo-statistics-hook 'dwa/org-summary-todo)
>>
>> So I set some debugger breakpoints and realized that code wasn't even
>> getting called.  There's a completely separate wad of code in org-list
>> that handles checkbox statistics.  So naturally, there's a hook, which I
>> added my TODO->DONE function to:
>>
>> (add-hook 'org-checkbox-statistics-hook 'dwa/org-summary-todo)
>>
>> But `org-checkbox-statistics-hook' is a list of nullary functions, so of
>> course this broke since my function expects N-DONE and N-NOT-DONE.  I
>> looked around for an easy way to determine N-DONE and N-NOT-DONE but it
>> doesn't seem to exist; it's buried in the logic of
>> org-update-checkbox-count... I think.  What I need is a hook that acts
>> like org-after-todo-statistics-hook, but for checkboxes.
>
> You just have to search for "[ ]" or "[-]" in the current section. If
> there is none, and there is at least one "[X]", you can mark your task
> as done.

Silly me; I was looking for a programmatic interface that would handle
things at a level of abstraction above pattern matching in text.  But
given the number of similar-looking regexps I see scattered through the
Org code I'm guessing that's just not the way things are done.

-- 
Dave Abrahams
BoostPro Computing
http://www.boostpro.com

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2011-10-03 13:54 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-02 20:23 Bug: Feature-request: `org-after-checkbox-statistics-hook' [7.7 (release_7.7.370.g8e44ba)] Dave Abrahams
2011-10-02 22:15 ` Nicolas Goaziou
2011-10-03 13:53   ` Dave Abrahams

Code repositories for project(s) associated with this inbox:

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).