Hello Nicolas, Nicolas Goaziou writes: > Sebastien Vauban writes: > >> I still consider the default behavior as dangerous -- because the novice >> is not aware (except if obvious) that some clock times may be dropped in >> the computation, and I find that scary --, but thanks anyway for the >> workaround. > > Would you mind testing the following patch, then? `untilnow' is just > a suggestion.
Applied the patch: --8<---------------cut here---------------start------------->8--- patching file lisp/org-clock.el Hunk #1 succeeded at 441 (offset 1 line). Hunk #2 succeeded at 2091 (offset 3 lines). Hunk #3 succeeded at 2200 (offset 3 lines). Hunk #4 succeeded at 2216 (offset 3 lines). --8<---------------cut here---------------end--------------->8--- Tested on one of my real files, with: ┌──── │ org-clock-display-default-range is a variable defined in `org-clock.el'. │ Its value is untilnow │ Original value was thisyear │ │ Documentation: │ Default range when displaying clocks with `org-clock-display'. │ │ You can customize this variable. └──── Got this: --8<---------------cut here---------------start------------->8--- Debugger entered--Lisp error: (error "Specified time is not representable") encode-time(0 0 0 1 1 1) (setq ts (encode-time s m h d month y) te (encode-time (or s1 s) (or m1 m) (or h1 h) (or d1 d) (or month1 month) (or y1 y))) (let* ((tm (decode-time (or time (current-time)))) (s 0) (m (nth 1 tm)) (h (nth 2 tm)) (d (nth 3 tm)) (month (nth 4 tm)) (y (nth 5 tm)) (dow (nth 6 tm)) (ws (or wstart 1)) (ms (or mstart 1)) (skey (symbol-name key)) (shift 0) (q (cond ((>= (nth 4 tm) 10) 4) ((>= (nth 4 tm) 7) 3) ((>= (nth 4 tm) 4) 2) ((>= (nth 4 tm) 1) 1))) s1 m1 h1 d1 month1 y1 diff ts te fm txt w date interval tmp shiftedy shiftedm shiftedq) (cond ((string-match "^[0-9]+$" skey) (setq y (string-to-number skey) m 1 d 1 key (quote year))) ((string-match "^\\([0-9]+\\)-\\([0-9]\\{1,2\\}\\)$" skey) (setq y (string-to-number (match-string 1 skey)) month (string-to-number (match-string 2 skey)) d 1 key (quote month))) ((string-match "^\\([0-9]+\\)-[wW]\\([0-9]\\{1,2\\}\\)$" skey) (require (quote cal-iso)) (setq y (string-to-number (match-string 1 skey)) w (string-to-number (match-string 2 skey))) (setq date (calendar-gregorian-from-absolute (calendar-iso-to-absolute (list w 1 y)))) (setq d (nth 1 date) month (car date) y (nth 2 date) dow 1 key (quote week))) ((string-match "^\\([0-9]+\\)-[qQ]\\([1-4]\\)$" skey) (require (quote cal-iso)) (setq y (string-to-number (match-string 1 skey))) (setq q (string-to-number (match-string 2 skey))) (setq date (calendar-gregorian-from-absolute (calendar-iso-to-absolute (org-quarter-to-date q y)))) (setq d (nth 1 date) month (car date) y (nth 2 date) dow 1 key (quote quarter))) ((string-match "^\\([0-9]+\\)-\\([0-9]\\{1,2\\}\\)-\\([0-9]\\{1,2\\}\\)$" skey) (setq y (string-to-number (match-string 1 skey)) month (string-to-number (match-string 2 skey)) d (string-to-number (match-string 3 skey)) key (quote day))) ((string-match "\\([-+][0-9]+\\)$" skey) (setq shift (string-to-number (match-string 1 skey)) key (intern (substring skey 0 (match-beginning 1)))) (if (and (memq key (quote (quarter thisq))) (> shift 0)) (error "Looking forward with quarters isn't implemented")))) (if (= shift 0) (progn (cond ((eq key (quote yesterday)) (setq key (quote today) shift -1)) ((eq key (quote lastweek)) (setq key (quote week) shift -1)) ((eq key (quote lastmonth)) (setq key (quote month) shift -1)) ((eq key (quote lastyear)) (setq key (quote year) shift -1)) ((eq key (quote lastq)) (setq key (quote quarter) shift -1))))) (cond ((memq key (quote (day today))) (setq d (+ d shift) h 0 m 0 h1 24 m1 0)) ((memq key (quote (week thisweek))) (setq diff (+ (* -7 shift) (if (= dow 0) (- 7 ws) (- dow ws))) m 0 h 0 d (- d diff) d1 (+ 7 d))) ((memq key (quote (month thismonth))) (setq d (or ms 1) h 0 m 0 d1 (or ms 1) month (+ month shift) month1 (1+ month) h1 0 m1 0)) ((memq key (quote (quarter thisq))) (cond ((< (+ (- q 1) shift) 0) (setq interval (* -1 (+ ... shift))) (setq tmp (org-floor* interval 4)) (if (= 0 (nth 1 tmp)) (setq shiftedy (- y ...) shiftedm 1 shiftedq 1) (setq shiftedy (- y ...) shiftedm (- 13 ...) shiftedq (- 5 ...))) (setq d 1 h 0 m 0 d1 1 month shiftedm month1 (+ 3 shiftedm) h1 0 m1 0 y shiftedy)) ((> (+ q shift) 0) (setq shiftedq (+ q shift)) (setq shiftedy y) (setq d 1 h 0 m 0 d1 1 month (+ 1 (* 3 ...)) month1 (+ 4 (* 3 ...)) h1 0 m1 0)))) ((memq key (quote (year thisyear))) (setq m 0 h 0 d 1 month 1 y (+ y shift) y1 (1+ y))) ((eq key (quote untilnow)) (setq y1 y month1 m d1 d m 0 h 0 d 1 month 1 y 1)) ((eq key (quote interactive)) nil) (t (user-error "No such time block %s" key))) (setq ts (encode-time s m h d month y) te (encode-time (or s1 s) (or m1 m) (or h1 h) (or d1 d) (or month1 month) (or y1 y))) (setq fm (cdr org-time-stamp-formats)) (cond ((memq key (quote (day today))) (setq txt (format-time-string "%A, %B %d, %Y" ts))) ((memq key (quote (week thisweek))) (setq txt (format-time-string "week %G-W%V" ts))) ((memq key (quote (month thismonth))) (setq txt (format-time-string "%B %Y" ts))) ((memq key (quote (year thisyear))) (setq txt (format-time-string "the year %Y" ts))) ((eq key (quote untilnow)) (setq txt "now")) ((memq key (quote (quarter thisq))) (setq txt (concat (org-count-quarter shiftedq) " quarter of " (number-to-string shiftedy))))) (if as-strings (list (format-time-string fm ts) (format-time-string fm te) txt) (if (eq key (quote interactive)) (list (org-read-date nil t nil "Range start? ") (org-read-date nil t nil "Range end? ") "(Range interactively set)") (list ts te txt)))) org-clock-special-range(untilnow) (and (symbolp range) (org-clock-special-range range)) (or (and (symbolp range) (org-clock-special-range range)) (org-clock-special-range (intern (completing-read "Range: " (quote ("today" "yesterday" "thisweek" "lastweek" "thismonth" "lastmonth" "thisyear" "lastyear" "interactive")) nil t)))) (let ((r (or (and (symbolp range) (org-clock-special-range range)) (org-clock-special-range (intern (completing-read "Range: " (quote ...) nil t)))))) (org-clock-sum (car r) (cadr r) headline-filter (or propname :org-clock-minutes-custom))) org-clock-sum-custom(nil untilnow :org-clock-minutes-default) (cond ((not arg) (org-clock-sum-custom nil org-clock-display-default-range prop)) (todayp (org-clock-sum-today)) (customp (org-clock-sum-custom nil arg)) (t (org-clock-sum))) (let* ((todayp (equal arg (quote (4)))) (customp (member arg (quote ((16) today yesterday thisweek lastweek thismonth lastmonth thisyear lastyear interactive)))) (prop (cond ((not arg) :org-clock-minutes-default) (todayp :org-clock-minutes-today) (customp :org-clock-minutes-custom) (t :org-clock-minutes))) time h m p) (cond ((not arg) (org-clock-sum-custom nil org-clock-display-default-range prop)) (todayp (org-clock-sum-today)) (customp (org-clock-sum-custom nil arg)) (t (org-clock-sum))) (if (eq arg (quote (64))) nil (save-excursion (goto-char (point-min)) (while (or (and (equal (setq p ...) (point-min)) (get-text-property p prop)) (setq p (next-single-property-change (point) prop))) (goto-char p) (if (setq time (get-text-property p prop)) (progn (org-clock-put-overlay time)))) (setq h (/ org-clock-file-total-minutes 60) m (- org-clock-file-total-minutes (* 60 h))) (if org-remove-highlights-with-change (progn (org-add-hook (quote before-change-functions) (quote org-clock-remove-overlays) nil (quote local)))))) (message (concat (format "Total file time%s: " (cond (todayp " for today") (customp " (custom)") (t ""))) (org-minutes-to-clocksum-string org-clock-file-total-minutes) " (%d hours and %d minutes)") h m)) org-clock-display(nil) call-interactively(org-clock-display nil nil) #[1025 "\306\211?\205\f \211\3069\203!\307N\203!\203!\310\303!\202\235\311!\262\211\211\242\312=\262\203<\313\"\211\262\204\"\314!\203l\203e\315E\fB \247\203e \316V\203e \f\233\211:\203d\211\306\241\210\210\315\"\202\233\317#9\203\233\320N\203\233\321N\204\233\322\321\323#\210\324\325\326 \211\320N\327#\"\210\262\207" [debug-on-next-call prefix-arg current-prefix-arg disabled-command-function command-history history-length nil disabled run-hooks indirect-function autoload autoload-do-load arrayp execute-kbd-macro 0 call-interactively byte-obsolete-info command-execute-obsolete-warned put t message "%s" macroexp--obsolete-warning "command"] 13 1990350](org-clock-display nil nil nil) funcall(#[1025 "\306\211?\205\f \211\3069\203!\307N\203!\203!\310\303!\202\235\311!\262\211\211\242\312=\262\203<\313\"\211\262\204\"\314!\203l\203e\315E\fB \247\203e \316V\203e \f\233\211:\203d\211\306\241\210\210\315\"\202\233\317#9\203\233\320N\203\233\321N\204\233\322\321\323#\210\324\325\326 \211\320N\327#\"\210\262\207" [debug-on-next-call prefix-arg current-prefix-arg disabled-command-function command-history history-length nil disabled run-hooks indirect-function autoload autoload-do-load arrayp execute-kbd-macro 0 call-interactively byte-obsolete-info command-execute-obsolete-warned put t message "%s" macroexp--obsolete-warning "command"] 13 1990350] org-clock-display nil nil nil) (with-no-warnings (funcall ad--addoit-function cmd record-flag keys special)) (setq ad-return-value (with-no-warnings (funcall ad--addoit-function cmd record-flag keys special))) (let (ad-return-value) (setq ad-return-value (with-no-warnings (funcall ad--addoit-function cmd record-flag keys special))) (when (fancy-narrow-active-p) (fancy-narrow--motion-function)) ad-return-value) ad-Advice-command-execute(#[1025 "\306\211?\205\f \211\3069\203!\307N\203!\203!\310\303!\202\235\311!\262\211\211\242\312=\262\203<\313\"\211\262\204\"\314!\203l\203e\315E\fB \247\203e \316V\203e \f\233\211:\203d\211\306\241\210\210\315\"\202\233\317#9\203\233\320N\203\233\321N\204\233\322\321\323#\210\324\325\326 \211\320N\327#\"\210\262\207" [debug-on-next-call prefix-arg current-prefix-arg disabled-command-function command-history history-length nil disabled run-hooks indirect-function autoload autoload-do-load arrayp execute-kbd-macro 0 call-interactively byte-obsolete-info command-execute-obsolete-warned put t message "%s" macroexp--obsolete-warning "command"] 13 1990350] org-clock-display) apply(ad-Advice-command-execute #[1025 "\306\211?\205\f \211\3069\203!\307N\203!\203!\310\303!\202\235\311!\262\211\211\242\312=\262\203<\313\"\211\262\204\"\314!\203l\203e\315E\fB \247\203e \316V\203e \f\233\211:\203d\211\306\241\210\210\315\"\202\233\317#9\203\233\320N\203\233\321N\204\233\322\321\323#\210\324\325\326 \211\320N\327#\"\210\262\207" [debug-on-next-call prefix-arg current-prefix-arg disabled-command-function command-history history-length nil disabled run-hooks indirect-function autoload autoload-do-load arrayp execute-kbd-macro 0 call-interactively byte-obsolete-info command-execute-obsolete-warned put t message "%s" macroexp--obsolete-warning "command"] 13 1990350] org-clock-display) command-execute(org-clock-display) --8<---------------cut here---------------end--------------->8--- while the default version `thisyear' did work, before applying the patch. BTW, `untilnow' is not proposed when TAB'ing on `C-u C-u C-c C-x C-d'. Best regards, Seb -- Sebastien Vauban