16 KiB
- Chronometrist
- Getting started
- How-to guides
- Explanation
- Reference
- Legend of currently-used time formats
- chronometrist-common.el
- chronometrist-custom.el
- chronometrist-diary-view.el
- chronometrist.el
- chronometrist-events.el
- chronometrist-migrate.el
- chronometrist-plist-pp.el
- chronometrist-queries.el
- chronometrist-report-custom.el
- chronometrist-report.el
- chronometrist-sexp.el
- chronometrist-statistics-custom.el
- chronometrist-statistics.el
- chronometrist-time.el
- chronometrist-timer.el
- chronometrist-goals
Chronometrist
Getting started
Installation
Usage
How-to guides
Explanation
Design goals
-
Don't make assumptions about the user's profession
- e.g. timeclock seems to assume you're using it for a 9-to-5/contractor job
-
Incentivize use
- Hooks allow the time tracker to automate tasks and become a useful part of your workflow
-
Make it easy to edit data using existing, familiar tools
- We don't use an SQL database, where changing a single field is tricky [1]
- We use a text file containing s-expressions (easy for humans to read and write)
- We use ISO-8601 for timestamps (easy for humans to read and write) rather than UNIX epoch time
- Reduce human errors in tracking
- Have a useful, informative, interactive interface
- Support mouse and keyboard use equally
[1] I still have doubts about this. Having SQL as a query language would be very useful in perusing the stored data. Maybe we should have tried to create a companion mode to edit SQL databases interactively?
Midnight-spanning events
A unique problem in working with Chronometrist, one I had never foreseen, was tasks which start on one day and end on another. These mess up data consumption (especially interval calculations and acquiring data for a specific date) in all sorts of unforeseen ways.
There are a few different approaches of dealing with them. (Currently, Chronometrist uses #3.)
1. (timeclock format) When the code of the first event in the day is "o", it's a midnight-spanning event.
- Advantage - very simple to detect
- Disadvantage - "in" and "out" events must be represented separately
2. Split them at the file level
- Advantage - operation is performed only once for each such event + simpler data-consuming code + reduced post-parsing load.
-
What happens when the user changes their day-start-time? The split-up events are now split wrongly, and the second event may get split again. Possible solutions -
- Add function to check if, for two events A and B, the :stop of A is the same as the :start of B, and that all their other tags are identical. Then we can re-split them according to the new day-start-time.
- Add a :split tag to split events. It can denote that the next event was originally a part of this one.
-
Re-check and update the file when the day-start-time changes.
- Possible with
add-variable-watcher
or:custom-set
in Customize (thanks bpalmer)
- Possible with
3. Split them at the hash-table-level
Handled by chronometrist-events-clean
- Advantage - simpler data-consuming code.
4. Split them at the data-consumer level (e.g. when calculating time for one day/getting events for one day)
- Advantage - reduced repetitive post-parsing load.
Reference
- (?) - of dubious utility, a candidate for deprecation
- DEPRECATED - deprecated, slated to be removed in the future
Legend of currently-used time formats
1. | (Emacs) decode-time | (seconds minutes hours day month year dow dst utcoff) |
2. | list-timestamp | (year month day hours minutes seconds) |
3. | list-date | (year month day) |
4. | list-time/list-duration | (hours minutes seconds) |
5. | (?) vector-date | [year month day] |
6. | (?) vector-time/vector-duration | [hours minutes seconds] |
7. | (Emacs) encode-time AKA UNIX epoch | (sec-high sec-low microsec picosec) |
8. | seconds | seconds as an integer |
9. | minutes | minutes as an integer |
10. | iso-timestamp | "YYYY-MM-DDTHH:MM:SSZ" |
11. | iso-date | "YYYY-MM-DD" |
12. | (DEPRECATED) timeclock-timestamp | "year/month/day hours:minutes:seconds" |
13. | (DEPRECATED) timeclock-date | "year/month/day" |
chronometrist-common.el
- Variable - chronometrist-empty-time-string
- Variable - chronometrist-date-re
- Variable - chronometrist-time-re-ui
- Variable - chronometrist-task-list
- Internal Variable - chronometrist–fs-watch
-
Function - chronometrist-buffer-exists? (buffer-name)
- String -> List?
-
Function - chronometrist-buffer-visible? (buffer-or-buffer-name)
- Buffer | String -> Boolean
-
Function - chronometrist-format-time (duration &optional blank)
- vector-duration | list-duration -> "hⓂ️s"
- Command - chronometrist-open-file (&optional button)
- Function - chronometrist-common-create-chronometrist-file ()
- Function - chronometrist-common-file-empty-p (file)
- Function - chronometrist-common-clear-buffer (buffer)
- Function - chronometrist-format-keybinds (command map &optional firstonly)
-
Function - chronometrist-events->time-list (events)
- (event …) -> ((encode-time encode-time) …)
-
Function - chronometrist-time-list->sum-of-intervals (time-value-lists)
- ((encode-time encode-time) …) -> encode-time
- Function - chronometrist-delete-list (&optional arg)
- Function - chronometrist-previous-week-start (date-string)
- Function - chronometrist-current-task ()
chronometrist-custom.el
- Custom variable - chronometrist-file
- Custom variable - chronometrist-buffer-name
- Custom variable - chronometrist-hide-cursor
- Custom variable - chronometrist-update-interval
- Custom variable - chronometrist-activity-indicator
- Custom variable - chronometrist-day-start-time
chronometrist-diary-view.el
- Variable - chronometrist-diary-buffer-name
- Internal Variable - chronometrist-diary–current-date
- Function - chronometrist-intervals-on (date)
- Function - chronometrist-diary-tasks-reasons-on (date)
- Function - chronometrist-diary-refresh (&optional ignore-auto noconfirm date)
- Major Mode - chronometrist-diary-view-mode
- Command - chronometrist-diary-view (&optional date)
chronometrist.el
- Internal Variable - chronometrist–task-history
- Internal Variable - chronometrist–point
- Variable - chronometrist-mode-map
-
Function - chronometrist-task-active? (task)
- String -> Boolean
- Function - chronometrist-activity-indicator ()
- Function - chronometrist-entries ()
- Function - chronometrist-task-at-point ()
- Function - chronometrist-goto-last-task ()
- Function - chronometrist-print-keybind (command &optional description firstonly)
- Function - chronometrist-print-non-tabular ()
- Function - chronometrist-goto-nth-task (n)
- Function - chronometrist-refresh (&optional ignore-auto noconfirm)
- Function - chronometrist-refresh-file (fs-event)
- Command - chronometrist-query-stop ()
- Variable - chronometrist-before-in-functions
- Variable - chronometrist-after-in-functions
- Variable - chronometrist-before-out-functions
- Variable - chronometrist-after-out-functions
- Function - chronometrist-run-functions-and-clock-in (task)
- Function - chronometrist-run-functions-and-clock-out (task)
- Variable - chronometrist-mode-map
- Major Mode - chronometrist-mode
- Function - chronometrist-toggle-task-button (button)
- Function - chronometrist-add-new-task-button (button)
- Command - chronometrist-toggle-task (&optional prefix inhibit-hooks)
- Command - chronometrist-toggle-task-no-hooks (&optional prefix)
- Command - chronometrist-add-new-task ()
- Command - chronometrist (&optional arg)
chronometrist-events.el
- Variable - chronometrist-events
- Function - chronometrist-list-midnight-spanning-events ()
- Function - chronometrist-day-start (timestamp)
- Function - chronometrist-file-clean ()
- Function - chronometrist-events-maybe-split (event)
- Function - chronometrist-events-populate ()
- Function - chronometrist-tasks-from-table ()
- Function - chronometrist-events-subset (start-date end-date)
- Function - chronometrist-events-query-spec-match-p (plist specifiers)
chronometrist-migrate.el
- Variable - chronometrist-migrate-table
- Function - chronometrist-migrate-populate (in-file)
- Function - chronometrist-migrate-timelog-file->sexp-file (&optional in-file out-file)
- Function - chronometrist-migrate-check ()
chronometrist-plist-pp.el
- Variable - chronometrist-plist-pp-keyword-re
- Variable - chronometrist-plist-pp-whitespace-re
- Function - chronometrist-plist-pp-longest-keyword-length ()
- Function - chronometrist-plist-pp-buffer-keyword-helper ()
- Function - chronometrist-plist-pp-buffer ()
- Function - chronometrist-plist-pp-to-string (object)
- Function - chronometrist-plist-pp (object &optional stream)
chronometrist-queries.el
-
Function - chronometrist-task-time-one-day (task &optional date-string)
- String &optional iso-date -> seconds
-
Function - chronometrist-active-time-one-day (&optional date-string)
- &optional iso-date -> vector-duration
- Function - chronometrist-statistics-count-active-days (task &optional table)
- Function - chronometrist-task-events-in-day (task date-string)
chronometrist-report-custom.el
- Custom variable - chronometrist-report-buffer-name
- Custom variable - chronometrist-report-week-start-day
- Custom variable - chronometrist-report-weekday-number-alist
chronometrist-report.el
- Internal Variable - chronometrist-report–ui-date
- Internal Variable - chronometrist-report–ui-week-dates
- Internal Variable - chronometrist-report–point
- Function - chronometrist-report-date ()
- Function - chronometrist-report-date->dates-in-week (first-date-in-week)
- Function - chronometrist-report-date->week-dates ()
- Function - chronometrist-report-entries ()
- Function - chronometrist-report-format-date (format-string time-date)
- Function - chronometrist-report-print-keybind (command &optional description firstonly)
- Function - chronometrist-report-print-non-tabular ()
- Function - chronometrist-report-refresh (&optional ignore-auto noconfirm)
- Function - chronometrist-report-refresh-file (fs-event)
- Variable - chronometrist-report-mode-map
- Major Mode - chronometrist-report-mode
- Function - chronometrist-report (&optional keep-date)
- Function - chronometrist-report-previous-week (arg)
- Function - chronometrist-report-next-week (arg)
chronometrist-sexp.el
- Internal Variable - chronometrist–tag-suggestions
- Internal Variable - chronometrist–value-suggestions
- Function - chronometrist-plist-remove (plist &rest keys)
- Function - chronometrist-maybe-string-to-symbol (list)
- Function - chronometrist-maybe-symbol-to-string (list)
- Command - chronometrist-reindent-buffer ()
- Function - chronometrist-last-expr ()
- Function - chronometrist-append-to-last-expr (tags plist)
- Variable - chronometrist-tags-history
- Function - chronometrist-tags-history-populate ()
- Function - chronometrist-tags-history-combination-strings (task)
- Function - chronometrist-tags-history-individual-strings (task)
- Function - chronometrist-tags-prompt (task &optional initial-input)
- Function - chronometrist-tags-add (&rest args)
- Custom Variable - chronometrist-kv-buffer-name
- Variable - chronometrist-key-history
- Variable - chronometrist-value-history
- Function - chronometrist-ht-history-prep (table)
- Function - chronometrist-key-history-populate ()
- Function - chronometrist-value-history-populate ()
- Command - chronometrist-kv-accept ()
- Command - chronometrist-kv-reject ()
- Variable - chronometrist-kv-read-mode-map
- Major Mode - chronometrist-kv-read-mode
- Function - chronometrist-kv-completion-quit-key ()
- Function - chronometrist-string-has-whitespace-p (string)
- Function - chronometrist-key-prompt (used-keys)
- Function - chronometrist-value-prompt (key)
- Function - chronometrist-value-insert (value)
- Function - chronometrist-kv-add (&rest args)
- Command - chronometrist-in (task &optional prefix)
- Command - chronometrist-out (&optional prefix)
chronometrist-statistics-custom.el
- Custom variable - chronometrist-statistics-buffer-name
chronometrist-statistics.el
- Internal Variable - chronometrist-statistics–ui-state
- Internal Variable - chronometrist-statistics–point
- Variable - chronometrist-statistics-mode-map
-
Function - chronometrist-statistics-count-average-time-spent (task &optional table)
- string &optional hash-table -> seconds
- Function - chronometrist-statistics-entries-internal (table)
- Function - chronometrist-statistics-entries ()
- Function - chronometrist-statistics-print-keybind (command &optional description firstonly)
- Function - chronometrist-statistics-format-date (date)
- Function - chronometrist-statistics-print-non-tabular ()
- Function - chronometrist-statistics-refresh (&optional ignore-auto noconfirm)
- Major Mode - chronometrist-statistics-mode
- Command - chronometrist-statistics (&optional preserve-state)
- Command - chronometrist-statistics-previous-range (arg)
- Command - chronometrist-statistics-next-range (arg)
chronometrist-time.el
- Constant - chronometrist-seconds-in-day
- Function - chronometrist-date (&optional time)
- Function - chronometrist-day-of-week->number (day-of-week)
- Function - chronometrist-number->day-of-week (number)
- Function - chronometrist-format-time-iso8601 (&optional unix-time)
-
Function - chronometrist-time-interval-span-midnight? (t1 t2)
- list-timestamp list-timestamp -> Boolean
- Function - chronometrist-midnight-spanning-p (start-time stop-time)
-
Function - chronometrist-time->seconds (time)
- vector-duration -> seconds
-
Function - chronometrist-seconds-to-hms (seconds)
- seconds -> vector-duration
-
Function - chronometrist-time-add (a b)
- vector-duration vector-duration -> vector-duration
-
Function - chronometrist-iso-date->timestamp (date)
- iso-date -> iso-timestamp
- Function - chronometrist-date->time (date)
- Function - chronometrist-date-less-p (date1 date2)
- Function - chronometrist-time-less-or-equal-p (t1 t2)
- Function - chronometrist-calendrical->date (date)
-
Function - chronometrist-interval (event)
- event -> encode-time
chronometrist-timer.el
- Internal Variable - chronometrist–timer-object
- Function - chronometrist-timer ()
- Command - chronometrist-stop-timer ()
- Command - chronometrist-maybe-start-timer (&optional interactive-test)
- Command - chronometrist-force-restart-timer ()
- Command - chronometrist-change-update-interval (arg)
chronometrist-goals
- Custom Variable - chronometrist-goals-list nil
- Function - chronometrist-run-at-time (time repeat function &rest args)
-
Function - chronometrist-task-minutes-one-day (task)
- string -> minutes
- Function - chronometrist-minutes->alert-string (minutes)
- Function - chronometrist-approach-alert (task goal spent)
- Function - chronometrist-complete-alert (task goal spent)
- Function - chronometrist-exceed-alert (task goal spent)
- Function - chronometrist-no-goal-alert (task goal spent)
- Custom Variable - chronometrist-goals-alert-functions
-
Function - chronometrist-get-goal (task &optional targets-list)
- String &optional List -> minutes
- Internal Variable - chronometrist–timers-list
- Function - chronometrist-minutes-string (minutes)
- Function - chronometrist-goals-run-alert-timers (task)
- Function - chronometrist-goals-stop-alert-timers (&optional _task)
- Function - chronometrist-goals-on-file-change ()