From mboxrd@z Thu Jan 1 00:00:00 1970 From: Olli P Subject: Bug: org-clock-remove-empty-clock-drawer eats LOGBOOK drawer before todo state gets logged [8.3.2 (8.3.2-52-g6d0af5-elpaplus @ /Users/Olli/.emacs.d/elpa/org-20151228/)] Date: Sun, 03 Jan 2016 23:09:04 +0700 Message-ID: Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:33226) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aFlDa-0000GH-5z for emacs-orgmode@gnu.org; Sun, 03 Jan 2016 11:09:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aFlDW-00031E-Tn for emacs-orgmode@gnu.org; Sun, 03 Jan 2016 11:09:18 -0500 Received: from mail-pa0-x231.google.com ([2607:f8b0:400e:c03::231]:34876) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aFlDW-00030w-Kr for emacs-orgmode@gnu.org; Sun, 03 Jan 2016 11:09:14 -0500 Received: by mail-pa0-x231.google.com with SMTP id ho8so565142pac.2 for ; Sun, 03 Jan 2016 08:09:14 -0800 (PST) Received: from Ollis-MBP ([110.77.203.223]) by smtp.gmail.com with ESMTPSA id t76sm83901357pfi.26.2016.01.03.08.09.11 for (version=TLSv1/SSLv3 cipher=OTHER); Sun, 03 Jan 2016 08:09:12 -0800 (PST) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: emacs-orgmode@gnu.org Steps to reproduce: Launching Emacs with -Q, calling `M-x package-initialize` and then `M-x org-mode`, and evaluating the following settings: (setq org-clock-into-drawer t) (setq org-log-into-drawer t) (setq org-clock-into-drawer t) (setq org-log-done 'time) (setq org-clock-out-when-done t) (setq org-clock-out-remove-zero-time-clocks t) (setq org-todo-keywords '((sequence "TODO(t)" "WAIT(w@/!)" "|" "DONE(d!)" "CANCELED(c@)"))) Creating a new task, clock-in in and immediately completing the task will result in: ---------------------------------------------------------------------- * DONE I bug out CLOSED: [2016-01-03 Sun 21:36] - State "DONE" from "TODO" [2016-01-03 Sun 21:36] ---------------------------------------------------------------------- Instead of the expected: ---------------------------------------------------------------------- * DONE I bug out CLOSED: [2016-01-03 Sun 21:38] :LOGBOOK: - State "DONE" from "TODO" [2016-01-03 Sun 21:38] :END: ---------------------------------------------------------------------- If I wait for the timer to run for a minute then things work as expected as well: ---------------------------------------------------------------------- * DONE I bug out CLOSED: [2016-01-03 Sun 23:00] :LOGBOOK: - State "DONE" from "TODO" [2016-01-03 Sun 23:00] CLOCK: [2016-01-03 Sun 22:59]--[2016-01-03 Sun 23:00] => 0:01 :END: ---------------------------------------------------------------------- The culprit is `org-clock-remove-empty-clock-drawer` that gets run at the end of `org-clock-out` for being a `org-clock-out-hook`. There is in fact code that handles a similar case of storing a note at the end of `org-clock-out`: ... (if (and clock-drawer (not (stringp clock-drawer)) ;; 1) (org-log-into-drawer) (eq org-log-done 'note) ;; 2) org-clock-out-when-done) (setq h (delq 'org-clock-remove-empty-clock-drawer h))) (mapc (lambda (f) (funcall f)) h) ... ..but I as far as I see this branch of the `if` can never actually run as I couldn't come up with a way for `(not (stringp clock-drawer))` to be true. If I comment out the lines marked as 1) and 2) then my issue goes away, but I don't know if this might cause problems elsewhere. - Olli > Emacs : GNU Emacs 24.5.1 (x86_64-apple-darwin14.3.0, Carbon Version 157 AppKit 1347.57) > of 2015-12-20 on Ollis-MacBook-Pro.local > Package: Org-mode version 8.3.2 (8.3.2-52-g6d0af5-elpaplus @ /Users/Olli/.emacs.d/elpa/org-20151228/) > > current state: > ============== > (setq > org-id-locations-file "/Users/Olli/.emacs.d/.cache/.org-id-locations" > org-export-babel-evaluate nil > org-agenda-tags-todo-honor-ignore-options t > org-tab-first-hook '(org-hide-block-toggle-maybe org-babel-hide-result-toggle-maybe org-babel-header-arg-expand) > org-insert-heading-hook '(gtd/insert-heading-inactive-timestamp) > org-clock-persist-file "/Users/Olli/.emacs.d/.cache/org-clock-save.el" > org-speed-command-hook '(org-speed-command-default-hook org-babel-speed-command-hook) > org-agenda-skip-timestamp-if-done t > org-clock-history-length 24 > org-occur-hook '(org-first-headline-recenter) > org-agenda-todo-ignore-timestamp t > org-metaup-hook '(org-babel-load-in-session-maybe) > org-agenda-todo-ignore-deadlines t > org-log-done 'time > org-src-window-setup 'current-window > org-confirm-shell-link-function 'yes-or-no-p > org-id-link-to-org-use-id 'create-if-interactive-and-no-custom-id > org-link-translation-function 'toc-org-unhrefify > org-pomodoro-started-hook '(gtd/keep-clock-running) > org-present-mode-hook '(spacemacs//org-present-start) > org-agenda-sticky t > org-agenda-restore-windows-after-quit t > org-agenda-todo-ignore-scheduled t > org-agenda-skip-scheduled-if-done t > org-agenda-custom-commands '(("N" "Notes" tags "NOTE" > ((org-agenda-overriding-header "Notes") (org-tags-match-list-sublevels t))) > (" " "Agenda" > ((agenda "" nil) > (tags-todo "-WAITING-CANCELLED/!NEXT" > ((org-agenda-overriding-header "Next Tasks") > (org-agenda-skip-function (quote gtd/skip-projects-and-habits-and-single-tasks)) > (org-agenda-todo-ignore-scheduled t) (org-agenda-todo-ignore-deadlines t) > (org-agenda-todo-ignore-with-date t) (org-agenda-tags-todo-honor-todo-options t) > (org-tags-match-list-sublevels t) > (org-agenda-sorting-strategy > (quote (todo-state-down priority-down effort-up category-keep))) > ) > ) > (tags-todo "-REFILE-CANCELLED-URL/!-DEFER-WAITING" > ((org-agenda-overriding-header "Tasks") > (org-agenda-skip-function (quote gtd/skip-project-tasks-maybe)) > (org-agenda-todo-ignore-scheduled t) (org-agenda-todo-ignore-deadlines t) > (org-agenda-todo-ignore-with-date t) > (org-agenda-sorting-strategy (quote (priority-down effort-up category-keep)))) > ) > (tags-todo "-CANCELLED/!-DEFER+WAITING" > ((org-agenda-overriding-header "Waiting") (org-tags-match-list-sublevels nil) > (org-agenda-todo-ignore-scheduled (quote future)) > (org-agenda-todo-ignore-deadlines (quote future))) > ) > (tags-todo "-CANCELLED/!" > ((org-agenda-overriding-header "Stuck Projects") > (org-agenda-skip-function (quote gtd/skip-non-stuck-projects))) > ) > (tags-todo "-DEFER-CANCELLED/!" > ((org-agenda-overriding-header "Projects") > (org-agenda-skip-function (quote gtd/skip-non-projects)) > (org-agenda-sorting-strategy (quote (priority-down effort-up category-keep)))) > ) > (tags-todo "-CANCELLED/!DEFER" > ((org-agenda-overriding-header "Deferred") > (org-agenda-skip-function (quote gtd/skip-stuck-projects)) > (org-tags-match-list-sublevels nil) > (org-agenda-todo-ignore-scheduled (quote future)) > (org-agenda-todo-ignore-deadlines (quote future))) > ) > (tags-todo "-REFILE+URL-DONE" > ((org-agenda-overriding-header "Web") (org-tags-match-list-sublevels nil))) > (tags "REFILE" > ((org-agenda-overriding-header "Tasks to Refile") > (org-tags-match-list-sublevels nil)) > ) > (tags "-REFILE/" > ((org-agenda-overriding-header "Tasks to Archive") > (org-agenda-skip-function (quote gtd/skip-non-archivable-tasks)) > (org-tags-match-list-sublevels nil)) > ) > ) > nil) > ("r" "Tasks to Refile" tags "REFILE" > ((org-agenda-overriding-header "Tasks to Refile") > (org-tags-match-list-sublevels nil)) > ) > ("d" "Done Tasks" agenda "" > ((org-agenda-start-with-log-mode (quote (closed))) > (org-agenda-skip-function > (quote (org-agenda-skip-entry-if (quote nottodo) (quote ("DONE"))))) > ) > ) > ("#" "Stuck Projects" tags-todo "-CANCELLED/!" > ((org-agenda-overriding-header "Stuck Projects") > (org-agenda-skip-function (quote gtd/skip-non-stuck-projects))) > ) > ("n" "Next Tasks" tags-todo "-WAITING-CANCELLED/!NEXT" > ((org-agenda-overriding-header "Next Tasks") > (org-agenda-skip-function (quote gtd/skip-projects-and-habits-and-single-tasks)) > (org-agenda-todo-ignore-scheduled t) (org-agenda-todo-ignore-deadlines t) > (org-agenda-todo-ignore-with-date t) (org-tags-match-list-sublevels t) > (org-agenda-sorting-strategy (quote (todo-state-down effort-up category-keep)))) > ) > ("t" "Tasks" tags-todo "-REFILE-CANCELLED/!-DEFER-WAITING" > ((org-agenda-overriding-header "Tasks") > (org-agenda-skip-function (quote gtd/skip-project-tasks-maybe)) > (org-agenda-sorting-strategy (quote (category-keep)))) > ) > ("p" "Projects" tags-todo "-DEFER-CANCELLED/!" > ((org-agenda-overriding-header "Projects") > (org-agenda-skip-function (quote gtd/skip-non-projects)) > (org-agenda-sorting-strategy (quote (category-keep)))) > ) > ("w" "Waiting Tasks" tags-todo "-CANCELLED+WAITING/!" > ((org-agenda-overriding-header "Waiting and Postponed tasks")) > (org-tags-match-list-sublevels nil)) > ("h" "Habits" tags-todo "STYLE=\"habit\"" > ((org-agenda-overriding-header "Habits") > (org-agenda-sorting-strategy (quote (todo-state-down effort-up category-keep)))) > ) > ("u" "Web" tags-todo "+URL-DONE" > ((org-agenda-overriding-header "List of pages to study/read later"))) > ("A" "Tasks to Archive" tags "-REFILE/" > ((org-agenda-overriding-header "Tasks to Archive") > (org-agenda-skip-function (quote gtd/skip-non-archivable-tasks)) > (org-tags-match-list-sublevels nil)) > ) > ) > org-return-follows-link t > org-default-notes-file "~/org/gtd/refile.org" > org-clock-in-resume t > org-todo-keyword-faces '(("TODO" :weight bold :foreground "RosyBrown1" :background "OrangeRed3" :box > (:style released-button)) > ("DONE" :weight bold :foreground "#8bc34a" :background "#1b5e10" :box > (:style released-button)) > ("NEXT" :weight bold :foreground "wheat1" :background "DarkOrange2" :box > (:style released-button)) > ("CANCELLED" :weight bold :foreground "#8bc34a" :background "#1b5e10" :box > (:style released-button)) > ("WAITING" :weight bold :foreground "SkyBlue1" :background "DodgerBlue3" :box > (:style released-button)) > ("DEFER" :weight bold :foreground "plum1" :background "purple3" :box > (:style released-button)) > ) > org-capture-templates '(("t" "Todo" entry (file "~/org/gtd/refile.org") "* TODO [#B] %?\n%U\n") > ("l" "Todo Link" entry (file "~/org/gtd/refile.org") "* TODO [#B] Reply to: %a\n%U\n") > ("n" "Note" entry (file "~/org/gtd/refile.org") "* %? :NOTE:\n%U\n") > ("i" "Idea" entry (file "~/org/ideas.org") "\n* %? :IDEA:\n%U\n") > ("d" "Drill" entry (file "~/org/drill/refile.org") "* %?" :empty-lines 1) > ("l" "Ledger Entry" plain (file "~/ledger/2015.ledger") "%(org-read-date) * %?\n" > :empty-lines 1) > ("w" "Web" entry (file "~/org/gtd/refile.org") "* TODO Check out: %? :URL:\n%U\n")) > org-startup-indented t > org-after-todo-state-change-hook '(org-clock-out-if-current) > org-src-mode-hook '(org-src-babel-configure-edit-buffer org-src-mode-configure-edit-buffer) > org-agenda-before-write-hook '(org-agenda-add-entry-text) > org-babel-pre-tangle-hook '(save-buffer) > org-global-properties '(("Effort_ALL" . "0:05 0:10 0:15 0:30 0:45 1:00 2:00 3:00 5:00 0:00")) > org-mode-hook '(spacemacs/load-yasnippet toc-org-enable org-bullets-mode org-clock-load > #[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 spacemacs/add-org-surrounds evil-org-mode > org-eldoc-load spacemacs//init-company-org-mode company-mode) > org-refile-targets '((nil :maxlevel . 9) (org-agenda-files :maxlevel . 9) (someday-file :maxlevel . 9) > (weblog-file :maxlevel . 9)) > org-outline-path-complete-in-steps nil > org-todo-state-tags-triggers '(("CANCELLED" ("CANCELLED" . t)) ("WAITING" ("WAITING" . t)) > ("DEFER" ("WAITING" . t) ("DEFER" . t)) (done ("WAITING") ("DEFER")) > ("TODO" ("WAITING") ("CANCELLED") ("DEFER")) > ("NEXT" ("WAITING") ("CANCELLED") ("DEFER")) > ("DONE" ("WAITING") ("CANCELLED") ("DEFER"))) > org-stuck-projects '("" nil nil "") > org-archive-hook '(org-attach-archive-delete-maybe) > org-agenda-compact-blocks t > org-clock-persist t > org-ctrl-c-ctrl-c-hook '(org-babel-hash-at-point org-babel-execute-safely-maybe) > org-refile-use-outline-path t > org-clock-in-switch-to-state 'gtd/clock-in-to-next > org-enforce-todo-dependencies t > org-cycle-hook '(org-cycle-hide-archived-subtrees org-cycle-hide-drawers org-cycle-show-empty-lines > org-optimize-window-after-visibility-change) > org-agenda-tags-column 85 > org-archive-location "%s_archive::* Archived Tasks" > org-present-mode-quit-hook '(spacemacs//org-present-end) > org-clock-persist-query-resume nil > org-agenda-todo-ignore-with-date t > org-refile-allow-creating-parent-nodes 'confirm > org-todo-keywords '((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!/!)") > (sequence "WAITING(w/!)" "DEFER(f@/!)" "|" "CANCELLED(c/!)")) > org-agenda-window-setup 'current-window > org-clock-report-include-clocking-task t > org-agenda-span 'day > org-confirm-elisp-link-function 'yes-or-no-p > org-startup-with-inline-images t > org-metadown-hook '(org-babel-pop-to-session-maybe) > org-pomodoro-finished-hook '(gtd/dont-keep-clock-running) > org-log-into-drawer t > org-blocker-hook '(org-block-todo-from-children-or-siblings-or-parent) > org-agenda-skip-deadline-if-done t > org-fontify-whole-heading-line t > org-agenda-files '("~/org/gtd/" "~/org/projects.org") > org-clock-out-hook '(org-clock-remove-empty-clock-drawer gtd/clock-out-maybe) > org-confirm-babel-evaluate nil > org-clock-out-remove-zero-time-clocks t > org-refile-target-verify-function 'gtd/verify-refile-target > org-pomodoro-killed-hook '(gtd/dont-keep-clock-running) > )