diff --git a/elisp/chronometrist.el b/elisp/chronometrist.el index 38d07be..41e581b 100644 --- a/elisp/chronometrist.el +++ b/elisp/chronometrist.el @@ -2080,6 +2080,11 @@ Return value is a list as specified by `tabulated-list-entries'." (chronometrist-run-transformers chronometrist-details-row-transformers it))) do (cl-incf index))) +(defvar chronometrist-details-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "R" 'chronometrist-details-set-range) + map)) + (define-derived-mode chronometrist-details-mode tabulated-list-mode "Details" "Major mode for `chronometrist-details'." (make-local-variable 'tabulated-list-format) @@ -2141,8 +2146,18 @@ TABLE must be a hash table similar to `chronometrist-events'." ;; (chronometrist-details-intervals-for-range "2021-06-01" chronometrist-events) ;; (chronometrist-details-intervals-for-range '("2021-06-01" . "2021-06-03") chronometrist-events) -(defvar chronometrist-details-set-range () - "Prompt user for range for current `chronometrist-details' buffer.") +(defun chronometrist-details-set-range () + "Prompt user for range for current `chronometrist-details' buffer." + (interactive) + (let ((input (completing-read-multiple + (concat "Range (blank, ISO-8601 date, " + "or two ISO-8601 dates/timestamps): ") + (hash-table-keys chronometrist-events) nil nil chronometrist-details-range))) + (pcase input + ("" (setq-local chronometrist-details-range nil)) + ((or string `(,begin . ,end)) + (setq-local chronometrist-details-range (read input))) + (t (error "Unsupported range."))))) (defvar chronometrist-details-filter nil "Parameters to filter intervals displayed by `chronometrist-details'. diff --git a/elisp/chronometrist.org b/elisp/chronometrist.org index f6ff93d..b3ac5d6 100644 --- a/elisp/chronometrist.org +++ b/elisp/chronometrist.org @@ -2328,7 +2328,7 @@ refresh the `chronometrist' buffer." (chronometrist-out)) t)) #+END_SRC -**** chronometrist-in :command: +**** chronometrist-in :command: #+BEGIN_SRC emacs-lisp (defun chronometrist-in (task &optional _prefix) "Clock in to TASK; record current time in `chronometrist-file'. @@ -2338,7 +2338,7 @@ TASK is the name of the task, a string. PREFIX is ignored." (chronometrist-sexp-new plist) (chronometrist-refresh))) #+END_SRC -**** chronometrist-out :command: +**** chronometrist-out :command: #+BEGIN_SRC emacs-lisp (defun chronometrist-out (&optional _prefix) "Record current moment as stop time to last s-exp in `chronometrist-file'. @@ -2363,7 +2363,7 @@ PREFIX is ignored." (chronometrist-out) (run-hook-with-args 'chronometrist-after-out-functions task))) #+END_SRC -**** chronometrist-mode-map :keymap: +**** chronometrist-mode-map :keymap: #+BEGIN_SRC emacs-lisp (defvar chronometrist-mode-map (let ((map (make-sparse-keymap))) @@ -2381,7 +2381,7 @@ PREFIX is ignored." map) "Keymap used by `chronometrist-mode'.") #+END_SRC -**** chronometrist-menu :menu: +**** chronometrist-menu :menu: #+BEGIN_SRC emacs-lisp (easy-menu-define chronometrist-menu chronometrist-mode-map "Chronometrist mode menu." @@ -2400,7 +2400,7 @@ PREFIX is ignored." ["View/edit log file" chronometrist-open-log] ["Reset state" chronometrist-reset])) #+END_SRC -**** chronometrist-mode :major:mode: +**** chronometrist-mode :major:mode: #+BEGIN_SRC emacs-lisp (define-derived-mode chronometrist-mode tabulated-list-mode "Chronometrist" "Major mode for `chronometrist'." @@ -2792,7 +2792,7 @@ Argument _FS-EVENT is ignored." '(change) #'chronometrist-refresh-file)))) #+END_SRC -**** chronometrist-report :command: +**** chronometrist-report :command: #+BEGIN_SRC emacs-lisp ;;;###autoload (defun chronometrist-report (&optional keep-date) @@ -3054,7 +3054,7 @@ value of `revert-buffer-function'." '(change) #'chronometrist-refresh-file)))) #+END_SRC -**** chronometrist-statistics :command: +**** chronometrist-statistics :command: #+BEGIN_SRC emacs-lisp ;;;###autoload (defun chronometrist-statistics (&optional preserve-state) @@ -3311,7 +3311,21 @@ Return value is a list as specified by `tabulated-list-entries'." do (cl-incf index))) #+END_SRC -**** chronometrist-details-mode :major:mode: +**** map :keymap: +#+BEGIN_SRC emacs-lisp +(defvar chronometrist-details-mode-map + (let ((map (make-sparse-keymap))) + (define-key map "R" 'chronometrist-details-set-range) + map)) + +#+END_SRC +**** menu +#+BEGIN_SRC emacs-lisp +(easy-menu-define chronometrist-details-menu chronometrist-details-mode-map + "Menu for `chronometrist-details'." + '("Details" ["Set date/time range" chronometrist-details-set-range])) +#+END_SRC +**** chronometrist-details-mode :major:mode: #+BEGIN_SRC emacs-lisp (define-derived-mode chronometrist-details-mode tabulated-list-mode "Details" "Major mode for `chronometrist-details'." @@ -3325,7 +3339,7 @@ Return value is a list as specified by `tabulated-list-entries'." (run-hooks 'chronometrist-mode-hook)) #+END_SRC -**** chronometrist-details :command: +**** chronometrist-details :command: #+BEGIN_SRC emacs-lisp (defun chronometrist-details () (interactive) @@ -3391,8 +3405,27 @@ TABLE must be a hash table similar to `chronometrist-events'." #+END_SRC **** set-range :command: #+BEGIN_SRC emacs-lisp -(defvar chronometrist-details-set-range () - "Prompt user for range for current `chronometrist-details' buffer.") +(defun chronometrist-details-set-range () + "Prompt user for range for current `chronometrist-details' buffer." + (interactive) + (let ((input (completing-read-multiple + (concat "Range (blank, ISO-8601 date, " + "or two ISO-8601 dates/timestamps): ") + (hash-table-keys chronometrist-events) nil nil + (pcase chronometrist-details-range + ('nil nil) + ((pred stringp) + (format "%s" chronometrist-details-range)) + (`(,begin . ,end) + (format "%s,%s" begin end)))))) + (pcase input + ('nil (setq-local chronometrist-details-range nil)) + (`(,date) + (setq-local chronometrist-details-range date)) + (`(,begin ,end) + (setq-local chronometrist-details-range (cons begin end))) + (_ (error "Unsupported range."))) + (tabulated-list-revert))) #+END_SRC **** filter :variable: