Giter VIP home page Giter VIP logo

org-timeblock's Introduction

org-timeblock

Emacs package that provides interactive multiple-day timeblock view for orgmode tasks.

Contents

Screenshots

org-timeblock-mode buffer:

screenshots/org-timeblock-mode.png

You can press [T] to toggle the display of org-timeblock-list-mode buffer. Foreground colors for timeblocks are generated randomly, but you can assign specific background and foreground colors in customizable variable org-timeblock-tag-colors:

screenshots/org-timeblock-with-list-mode.png

You can switch to a multi-day view using org-timeblock-change-span [V]:

screenshots/multi-day-view.png

Screencast

https://youtu.be/lVV9gVp5nxU

Why

The builtin orgmode package for collecting and displaying open tasks/events/deadlines relevant for a particular set of dates, org-agenda, does not have a timeblock representation which is available in almost all modern calendars.

Sometimes, a list representation (like in org-agenda) is not sufficient, because it can be difficult to quickly get an overview of a day or week schedule.

Installation

Requirements:

  • Emacs 28.1 (or higher)
  • SVG support in your Emacs build

MELPA

You can install the package from MELPA using M-x package-install org-timeblock

package-vc-install (Emacs 29)

If you use Emacs 29, you can install the package via

M-x package-vc-install RET https://github.com/ichernyshovvv/org-timeblock/ RET

Guix

If you use Guix, you can install the package from this channel.

  1. To add the channel, add this to the list of channels in channels.scm:
(channel
 (name 'sklv)
 (url "https://git.sr.ht/~sokolov/channel"))
  1. Then, run guix pull.
  2. Now you can install the package.

Quelpa

  1. Install quelpa-use-package (which can be installed directly from MELPA).
  2. Add this form to your init file:
(use-package org-timeblock
  :quelpa (org-timeblock :fetcher github :repo "ichernyshovvv/org-timeblock"))

Straight

Add this form to your init file:

(use-package org-timeblock
  :straight (org-timeblock :type git
              :host github
              :repo "ichernyshovvv/org-timeblock"))

Usage

There are two major modes provided by the package:

  • org-timeblock-mode. Displays timeblock view of SCHEDULED/DEADLINE org tasks or events (entries that have active timestamps in the body or heading) for specific days.
  • org-timeblock-list-mode. Displays a list of tasks (including those that are not time-specific).

Run M-x org-timeblock to open 3-day view that starts from today’s date. The default days span can be customized via org-timeblock-span variable. In the view you will see only entries that have time specified in their timestamps. To see other found tasks/events (entries that have timestamps without time), press T (M-x org-timeblock-toggle-timeblock-list).

Tasks and events are searched in org-timeblock-files which defaults to (org-agenda-files).

To navigate between the blocks, use [fbpn], arrow keys or mouse (yes, the blocks are clickable).

To open other dates, you can run the following the following commands:

  • org-timeblock-day-later [C-<right> / C-f]
  • org-timeblock-day-earlier [C-<left> / C-b]
  • org-timeblock-jump-to-day j
  • org-timeblock-change-span V

To reschedule or change the duration of the task bound to the selected block, use these commands:

  • org-timeblock-schedule s
  • org-timeblock-set-duration d

Also, you can mark the blocks and operate on them via M-x org-timeblock-schedule [s]:

  • org-timeblock-mark-block m
  • org-timeblock-mark-by-regexp %
  • org-timeblock-unmark-block u
  • org-timeblock-unmark-all-blocks U

If you want to add a new task, press + (M-x org-timeblock-new-task).

Almost all commands with the same bindings are available in org-timeblock-list.

Customization

M-x customize-group org-timeblock to see available customizable variables.

TODOs

  • [ ] Implement caching mechanism for SVG data
  • [ ] Improve timeblocks layout algorithm
  • [ ] Split each column into a separate SVG image to improve the speed of *org-timeblock* buffer redisplay
  • [ ] Create timeblock.el library that could be used for iCalendar and other time data

Donations

444GDw7rkd3Mj5hi6ZzEXZ4QN565TFw4J5ithFcywsMnJn7dFsxWTEQ4vtSMQC1sckFBu7neS8yZZRLnY8EYpS4UNMEAvpL




liberapay.com/ichernyshovvv

Changelog

0.1

First tagged release.

0.2

  • Added mark commands (mark-block, unmark-block, mark-by-regexp) for timeblocks that can be used to reschedule multiple tasks at once
  • Replaced ts.el with built-in time API
  • Replaced org-ql with own searching and caching functions
  • dom.el is now used instead of regexps to fetch and change SVG data (much cleaner code)
  • Deadline timestamps are now treated as it should be, not as events
  • Now, each active timestamp in a heading body is displayed (as event), not only the first one
  • Added custom variable org-timeblock-files
  • Other minor bug fixes and improvements 8)

org-timeblock's People

Contributors

artsi0m avatar flinner avatar ichernyshovvv avatar progfolio avatar sirikid avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

org-timeblock's Issues

Drag and drop events for moving and increasing time

Hi @ichernyshovvv,
I guess I am getting greedy looking at the amazing enhancements you are providing to this package. 😄

Would it be possible to also do drag and drop in the 5-day or 3-day format for a quick moving blocks around?

Also, just like how google calendar does it, would it be possible to extend the time range by holding and dragging the end of the event?

I read through your code to see if I could do anything. This is way above my paygrade when it comes to elisp abilities.

Thanks and have a nice day!
Bala

Support faces in `org-timeblock-tag-colors`

Hello @ichernyshovvv,

Looking at the org-timeblock-tag-colors, I wonder if you have thought about the following approach:

  1. Define faces directly, such as to cover the six main colours: red, green, blue, yellow, magenta, cyan. These faces can then be styled by themes to give them the right values.

  2. In org-timeblock-tag-colors accept a face as an argument, so the user can set something like ("tag" org-timeblock-red). The current style can still be accepted as an option (or some variant of it).

The reason I mention these is because right now it is not as easy to switch from a light to a dark theme: the org-timeblock-tag-colors needs to be evaluated again with colours that suit the current theme.

BUG: (wrong-type-argument stringp id)

Hi,

I honestly don't know if it's a bug or if I'm doing something wrong, but org-timeblock and org-timeblock-list won't work with a specific agenda entry - haven't checked if it's that specific entry though.

The debug output is:

Debugger entered--Lisp error: (wrong-type-argument stringp id)
  #<subr F616e6f6e796d6f75732d6c616d626461_anonymous_lambda_51>(#("       17:00-22:30         Arbeit" 0 27 (sched (timestamp (:type active-range :raw-value "<2023-09-18 Mo 17:00-22:30>" :year-start 2023 :month-start 9 :day-start 18 :hour-start 17 :minute-start 0 :year-end 2023 :month-end 9 :day-end 18 :hour-end 22 :minute-end 30 :begin 19779 :end 19806 :post-blank 0)) marker #<marker (moves after insertion) at 19755 in termine.org> tags nil id "86f2f07b2021c601666a41e2c7386844" title #("Arbeit" 0 6 (fontified t line-prefix #("****" 0 4 (face org-indent)) wrap-prefix #("********* " 0 10 (face org-indent)) face org-level-5)) prefix t) 27 33 (sched (timestamp (:type active-range :raw-value "<2023-09-18 Mo 17:00-22:30>" :year-start 2023 :month-start 9 :day-start 18 :hour-start 17 :minute-start 0 :year-end 2023 :month-end 9 :day-end 18 :hour-end 22 :minute-end 30 :begin 19779 :end 19806 :post-blank 0)) marker #<marker (moves after insertion) at 19755 in termine.org> tags nil id "86f2f07b2021c601666a41e2c7386844" title #("Arbeit" 0 6 (fontified t line-prefix #("****" 0 4 (face org-indent)) wrap-prefix #("********* " 0 10 (face org-indent)) face org-level-5)) face org-level-5 wrap-prefix #("********* " 0 10 (face org-indent)) line-prefix #("****" 0 4 (face org-indent)) fontified t)))
  org-timeblock-get-entries()
  org-timeblock-redraw-buffers()
  org-timeblock()
  funcall-interactively(org-timeblock)
  command-execute(org-timeblock record)
  counsel-M-x-action("org-timeblock")
  #f(compiled-function (x) #<bytecode 0x1dd120376f00da4d>)("org-timeblock")
  ivy-call()
  #<subr ivy-read>("M-x " [company-box--max test-rmail-mime-bulk-handler evil-find-file-at-point-visual soap-xs-complex-type-is-group--cmacro tramp-sudoedit-file-name-handler tramp-completion-handle-file-name-all-completions Set\ Slice newsticker--parse-rss-1.0 speedbar-check-vc-this-line vc-sccs-log-view-mode-hook cmd-line project--process-file-region idlwave-check-abbrev yas-x-prompt eww--open-url-in-new-buffer org-table-previous-row finder-unload-function allout-abbreviate-flattened-numbering semantic-function-argument-separator delphi-unit-statements evil-collection-org-maps smiley-directory erc-networks--warn-on-connect flycheck-irony--start org-get-and-remove-property tree-widget-button-keymap traversed hl-column-mode-set-explicitly kmacro-pop-ring1 general-describe-priority-keymaps rng-ipattern-set-memo-map-data-deriv gdb-thread-number tramp-sudoedit-handle-set-file-acl verilog-auto-assign-modport mhtml--submode-keymap evil-visual-rotate Above traversing\ a\ directory timeclock-get-reason-function kmacro-p hs-toggle-hiding emacs-lock--set-mode ibuffer-delete-alist projectile-unserialize dashboard-mode tramp-adb-connection-local-default-shell-variables erc-sasl--scram-sha-512-authenticate-server font-list-limit todo-sort evil-command-window-current-buffer ...] :predicate #f(compiled-function (sym) #<bytecode 0x1738306fafa8e0fe>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x :sort t)
  apply(#<subr ivy-read> ("M-x " [company-box--max test-rmail-mime-bulk-handler evil-find-file-at-point-visual soap-xs-complex-type-is-group--cmacro tramp-sudoedit-file-name-handler tramp-completion-handle-file-name-all-completions Set\ Slice newsticker--parse-rss-1.0 speedbar-check-vc-this-line vc-sccs-log-view-mode-hook cmd-line project--process-file-region idlwave-check-abbrev yas-x-prompt eww--open-url-in-new-buffer org-table-previous-row finder-unload-function allout-abbreviate-flattened-numbering semantic-function-argument-separator delphi-unit-statements evil-collection-org-maps smiley-directory erc-networks--warn-on-connect flycheck-irony--start org-get-and-remove-property tree-widget-button-keymap traversed hl-column-mode-set-explicitly kmacro-pop-ring1 general-describe-priority-keymaps rng-ipattern-set-memo-map-data-deriv gdb-thread-number tramp-sudoedit-handle-set-file-acl verilog-auto-assign-modport mhtml--submode-keymap evil-visual-rotate Above traversing\ a\ directory timeclock-get-reason-function kmacro-p hs-toggle-hiding emacs-lock--set-mode ibuffer-delete-alist projectile-unserialize dashboard-mode tramp-adb-connection-local-default-shell-variables erc-sasl--scram-sha-512-authenticate-server font-list-limit todo-sort evil-command-window-current-buffer ...] :predicate #f(compiled-function (sym) #<bytecode 0x1738306fafa8e0fe>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x :sort t))
  ivy-read("M-x " [company-box--max test-rmail-mime-bulk-handler evil-find-file-at-point-visual soap-xs-complex-type-is-group--cmacro tramp-sudoedit-file-name-handler tramp-completion-handle-file-name-all-completions Set\ Slice newsticker--parse-rss-1.0 speedbar-check-vc-this-line vc-sccs-log-view-mode-hook cmd-line project--process-file-region idlwave-check-abbrev yas-x-prompt eww--open-url-in-new-buffer org-table-previous-row finder-unload-function allout-abbreviate-flattened-numbering semantic-function-argument-separator delphi-unit-statements evil-collection-org-maps smiley-directory erc-networks--warn-on-connect flycheck-irony--start org-get-and-remove-property tree-widget-button-keymap traversed hl-column-mode-set-explicitly kmacro-pop-ring1 general-describe-priority-keymaps rng-ipattern-set-memo-map-data-deriv gdb-thread-number tramp-sudoedit-handle-set-file-acl verilog-auto-assign-modport mhtml--submode-keymap evil-visual-rotate Above traversing\ a\ directory timeclock-get-reason-function kmacro-p hs-toggle-hiding emacs-lock--set-mode ibuffer-delete-alist projectile-unserialize dashboard-mode tramp-adb-connection-local-default-shell-variables erc-sasl--scram-sha-512-authenticate-server font-list-limit todo-sort evil-command-window-current-buffer ...] :predicate #f(compiled-function (sym) #<bytecode 0x1738306fafa8e0fe>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel--info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x)
  counsel-M-x()
  funcall-interactively(counsel-M-x)
  command-execute(counsel-M-x)

If you need any more info, just ask. What bugs me is that IIRC it worked with that entry earlier...

Apperance: background is white with dark themes

Possibly I have not found the correct way to configure the appearance, but when I try to use this package with modus-vivendi theme (i.e. dark background themes), package draws background in white:

Screenshot from 2023-09-19 22-12-19

Configuration:

  • emacs 29.1 from opensuse tumbleweed
  • doom emacs
  • a lot of personal customization
  • used version of org-timeblock: 43239ca

Wrong type argument: integer-or-marker-p

When I run org-timeblock I get the following error:

Wrong type argument: integer-or-marker-p, (headline (:raw-value "The Case of the Dead Russian Spy by Owen Parr" :begin 71508 :end 71724 :pre-blank 0 :contents-begin 71564 ...))

I am on Emacs 28.2 and Org mode version 9.5.5.

Below is the stacktrace:

Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p (headline (:raw-value "The Case of the Dead Russian Spy by Owen Parr" :begin 71508 :end 71604 :pre-blank 0 :contents-begin 71564 :contents-end 71603 :level 4 :priority nil :tags nil :todo-keyword #("TODO" 0 4 (face (org-todo org-level-4) wrap-prefix #("******* " 0 8 (face org-indent)) line-prefix #("***" 0 3 (face org-indent)) org-category "gtd" fontified t)) :todo-type todo :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 71508 :scheduled (timestamp (:type active :raw-value "<2023-12-13 Wed 18:00 .+1d>" :year-start 2023 :month-start 12 :day-start 13 :hour-start 18 :minute-start 0 :year-end 2023 :month-end 12 :day-end 13 :hour-end 18 :minute-end 0 :begin 71575 :end 71602 :post-blank 0 :repeater-type restart :repeater-value 1 :repeater-unit day)) :title "The Case of the Dead Russian Spy by Owen Parr")))
  org-get-tags((headline (:raw-value "The Case of the Dead Russian Spy by Owen Parr" :begin 71508 :end 71604 :pre-blank 0 :contents-begin 71564 :contents-end 71603 :level 4 :priority nil :tags nil :todo-keyword #("TODO" 0 4 (face (org-todo org-level-4) wrap-prefix #("******* " 0 8 (face org-indent)) line-prefix #("***" 0 3 (face org-indent)) org-category "gtd" fontified t)) :todo-type todo :post-blank 1 :footnote-section-p nil :archivedp nil :commentedp nil :post-affiliated 71508 :scheduled (timestamp (:type active :raw-value "<2023-12-13 Wed 18:00 .+1d>" :year-start 2023 :month-start 12 :day-start 13 :hour-start 18 :minute-start 0 :year-end 2023 :month-end 12 :day-end 13 :hour-end 18 :minute-end 0 :begin 71575 :end 71602 :post-blank 0 :repeater-type restart :repeater-value 1 :repeater-unit day)) :title "The Case of the Dead Russian Spy by Owen Parr")))
  (mapcar #'substring-no-properties (org-get-tags (org-element-at-point)))
  (let ((title (org-get-heading t nil t t)) (sched (org-element-property :scheduled (org-element-at-point))) (event (org-timeblock-get-event-timestamp)) (marker (copy-marker (point) t)) (tags (mapcar #'substring-no-properties (org-get-tags (org-element-at-point))))) (cons (if event (progn (propertize (concat (org-timeblock--construct-entry-prefix event t) title) 'event event 'marker marker 'tags tags 'id (org-timeblock-construct-id nil t) 'title title))) (if sched (progn (propertize (concat (org-timeblock--construct-entry-prefix sched) title) 'sched sched 'marker marker 'tags tags 'id (org-timeblock-construct-id) 'title title)))))
  (closure ((files "~/somefolder/inbox.org" "~/somefolder/gtd.org" "~/somefolder/tickler.org" "~/somefolder/Birthdays.org" "~/somefolder/meetings.org") (with-time) (exclude-dateranges) (sort-func) (--cl-rest--) org-timeblock-list-mode-abbrev-table org-timeblock-list-mode-syntax-table org-timeblock-mode-abbrev-table org-timeblock-mode-syntax-table t) nil (let ((title (org-get-heading t nil t t)) (sched (org-element-property :scheduled (org-element-at-point))) (event (org-timeblock-get-event-timestamp)) (marker (copy-marker (point) t)) (tags (mapcar #'substring-no-properties (org-get-tags (org-element-at-point))))) (cons (if event (progn (propertize (concat (org-timeblock--construct-entry-prefix event t) title) 'event event 'marker marker 'tags tags 'id (org-timeblock-construct-id nil t) 'title title))) (if sched (progn (propertize (concat (org-timeblock--construct-entry-prefix sched) title) 'sched sched 'marker marker 'tags tags 'id (org-timeblock-construct-id) 'title title))))))()
  org-ql--select(:query (and (not (done)) (and (not (done)) (org-timeblock-active-ts #s(ts :hour nil :minute nil :second nil :day 13 :month 12 :year 2023 :dow nil :day-abbr nil :day-name nil :doy nil :woy nil :month-abbr nil :month-name nil :tz-abbr nil :tz-offset nil :internal nil :unix 1702459262.686986) #s(ts :hour nil :minute nil :second nil :day 13 :month 12 :year 2023 :dow nil :day-abbr nil :day-name nil :doy nil :woy nil :month-abbr nil :month-name nil :tz-abbr nil :tz-offset nil :internal nil :unix 1702459262.0) :exclude-dateranges nil :with-time nil))) :preamble "<\\([[:digit:]]\\{4\\}-[[:digit:]]\\{2\\}-[[:digit:]]\\{..." :preamble-case-fold nil :predicate #f(compiled-function () #<bytecode 0xda52764258dafb8>) :action (closure ((files "~/somefolder/inbox.org" "~/somefolder/gtd.org" "~/somefolder/tickler.org" "~/somefolder/Birthdays.org" "~/somefolder/meetings.org") (with-time) (exclude-dateranges) (sort-func) (--cl-rest--) org-timeblock-list-mode-abbrev-table org-timeblock-list-mode-syntax-table org-timeblock-mode-abbrev-table org-timeblock-mode-syntax-table t) nil (let ((title (org-get-heading t nil t t)) (sched (org-element-property :scheduled (org-element-at-point))) (event (org-timeblock-get-event-timestamp)) (marker (copy-marker (point) t)) (tags (mapcar #'substring-no-properties (org-get-tags (org-element-at-point))))) (cons (if event (progn (propertize (concat ... title) 'event event 'marker marker 'tags tags 'id (org-timeblock-construct-id nil t) 'title title))) (if sched (progn (propertize (concat ... title) 'sched sched 'marker marker 'tags tags 'id (org-timeblock-construct-id) 'title title)))))) :narrow nil)
  org-ql--select-cached(:query (and (not (done)) (and (not (done)) (org-timeblock-active-ts #s(ts :hour nil :minute nil :second nil :day 13 :month 12 :year 2023 :dow nil :day-abbr nil :day-name nil :doy nil :woy nil :month-abbr nil :month-name nil :tz-abbr nil :tz-offset nil :internal nil :unix 1702459262.686986) #s(ts :hour nil :minute nil :second nil :day 13 :month 12 :year 2023 :dow nil :day-abbr nil :day-name nil :doy nil :woy nil :month-abbr nil :month-name nil :tz-abbr nil :tz-offset nil :internal nil :unix 1702459262.0) :exclude-dateranges nil :with-time nil))) :preamble "<\\([[:digit:]]\\{4\\}-[[:digit:]]\\{2\\}-[[:digit:]]\\{..." :preamble-case-fold nil :predicate #f(compiled-function () #<bytecode 0xda52764258dafb8>) :action (closure ((files "~/somefolder/inbox.org" "~/somefolder/gtd.org" "~/somefolder/tickler.org" "~/somefolder/Birthdays.org" "~/somefolder/meetings.org") (with-time) (exclude-dateranges) (sort-func) (--cl-rest--) org-timeblock-list-mode-abbrev-table org-timeblock-list-mode-syntax-table org-timeblock-mode-abbrev-table org-timeblock-mode-syntax-table t) nil (let ((title (org-get-heading t nil t t)) (sched (org-element-property :scheduled (org-element-at-point))) (event (org-timeblock-get-event-timestamp)) (marker (copy-marker (point) t)) (tags (mapcar #'substring-no-properties (org-get-tags (org-element-at-point))))) (cons (if event (progn (propertize (concat ... title) 'event event 'marker marker 'tags tags 'id (org-timeblock-construct-id nil t) 'title title))) (if sched (progn (propertize (concat ... title) 'sched sched 'marker marker 'tags tags 'id (org-timeblock-construct-id) 'title title)))))) :narrow nil)
  #f(compiled-function (it) #<bytecode 0x3a67e9e466625df>)(#<buffer gtd.org>)
  org-ql-select(("~/somefolder/inbox.org" "~/somefolder/gtd.org" "~/somefolder/tickler.org" "~/somefolder/Birthdays.org" "~/somefolder/meetings.org") (and (not (done)) (org-timeblock-active-ts #s(ts :hour nil :minute nil :second nil :day 13 :month 12 :year 2023 :dow nil :day-abbr nil :day-name nil :doy nil :woy nil :month-abbr nil :month-name nil :tz-abbr nil :tz-offset nil :internal nil :unix 1702459262.686986) #s(ts :hour nil :minute nil :second nil :day 13 :month 12 :year 2023 :dow nil :day-abbr nil :day-name nil :doy nil :woy nil :month-abbr nil :month-name nil :tz-abbr nil :tz-offset nil :internal nil :unix 1702459262.0) :exclude-dateranges nil :with-time nil)) :action (closure ((files "~/somefolder/inbox.org" "~/somefolder/gtd.org" "~/somefolder/tickler.org" "~/somefolder/Birthdays.org" "~/somefolder/meetings.org") (with-time) (exclude-dateranges) (sort-func) (--cl-rest--) org-timeblock-list-mode-abbrev-table org-timeblock-list-mode-syntax-table org-timeblock-mode-abbrev-table org-timeblock-mode-syntax-table t) nil (let ((title (org-get-heading t nil t t)) (sched (org-element-property :scheduled (org-element-at-point))) (event (org-timeblock-get-event-timestamp)) (marker (copy-marker (point) t)) (tags (mapcar #'substring-no-properties (org-get-tags (org-element-at-point))))) (cons (if event (progn (propertize (concat ... title) 'event event 'marker marker 'tags tags 'id (org-timeblock-construct-id nil t) 'title title))) (if sched (progn (propertize (concat ... title) 'sched sched 'marker marker 'tags tags 'id (org-timeblock-construct-id) 'title title)))))))
  (let ((result (org-ql-select files (if (cdr org-timeblock-daterange) (list 'and '(not ...) (list 'org-timeblock-active-ts (car org-timeblock-daterange) (cdr org-timeblock-daterange) ':exclude-dateranges exclude-dateranges ':with-time with-time)) (list 'and '(not ...) (list 'org-timeblock-active-ts-on (car org-timeblock-daterange) ':exclude-dateranges exclude-dateranges ':with-time with-time))) :action #'(lambda nil (let (... ... ... ... ...) (cons ... ...))))) flattened) (let ((--dolist-tail-- result)) (while --dolist-tail-- (let ((el (car --dolist-tail--))) (and (car el) (setq flattened (cons (car el) flattened))) (and (cdr el) (setq flattened (cons (cdr el) flattened))) (setq --dolist-tail-- (cdr --dolist-tail--)))) flattened))
  (mapcar #'(lambda (entry) (let ((timestamp (or (get-text-property 0 ... entry) (get-text-property 0 ... entry)))) (let ((--dolist-tail-- (org-timeblock-get-dates))) (while --dolist-tail-- (let (...) (if ... ...) (setq --dolist-tail-- ...))))) entry) (let ((result (org-ql-select files (if (cdr org-timeblock-daterange) (list 'and '... (list ... ... ... ... exclude-dateranges ... with-time)) (list 'and '... (list ... ... ... exclude-dateranges ... with-time))) :action #'(lambda nil (let ... ...)))) flattened) (let ((--dolist-tail-- result)) (while --dolist-tail-- (let ((el (car --dolist-tail--))) (and (car el) (setq flattened (cons ... flattened))) (and (cdr el) (setq flattened (cons ... flattened))) (setq --dolist-tail-- (cdr --dolist-tail--)))) flattened)))
  (sort (mapcar #'(lambda (entry) (let ((timestamp (or ... ...))) (let ((--dolist-tail-- ...)) (while --dolist-tail-- (let ... ... ...)))) entry) (let ((result (org-ql-select files (if (cdr org-timeblock-daterange) (list ... ... ...) (list ... ... ...)) :action #'(lambda nil ...))) flattened) (let ((--dolist-tail-- result)) (while --dolist-tail-- (let ((el ...)) (and (car el) (setq flattened ...)) (and (cdr el) (setq flattened ...)) (setq --dolist-tail-- (cdr --dolist-tail--)))) flattened))) (or sort-func org-timeblock-sort-function))
  (if files (sort (mapcar #'(lambda (entry) (let ((timestamp ...)) (let (...) (while --dolist-tail-- ...))) entry) (let ((result (org-ql-select files (if ... ... ...) :action #'...)) flattened) (let ((--dolist-tail-- result)) (while --dolist-tail-- (let (...) (and ... ...) (and ... ...) (setq --dolist-tail-- ...))) flattened))) (or sort-func org-timeblock-sort-function)) nil)
  (let* ((files (and t (org-agenda-files)))) (if files (sort (mapcar #'(lambda (entry) (let (...) (let ... ...)) entry) (let ((result (org-ql-select files ... :action ...)) flattened) (let ((--dolist-tail-- result)) (while --dolist-tail-- (let ... ... ... ...)) flattened))) (or sort-func org-timeblock-sort-function)) nil))
  (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '(:sort-func :exclude-dateranges :with-time :allow-other-keys)) (setq --cl-keys-- (cdr (cdr --cl-keys--)))) ((car (cdr (memq ... --cl-rest--))) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:sort-func :exclud..." (car --cl-keys--)))))) (let* ((files (and t (org-agenda-files)))) (if files (sort (mapcar #'(lambda (entry) (let ... ...) entry) (let ((result ...) flattened) (let (...) (while --dolist-tail-- ...) flattened))) (or sort-func org-timeblock-sort-function)) nil)))
  (let* ((sort-func (car (cdr (plist-member --cl-rest-- ':sort-func)))) (exclude-dateranges (car (cdr (plist-member --cl-rest-- ':exclude-dateranges)))) (with-time (car (cdr (plist-member --cl-rest-- ':with-time))))) (progn (let ((--cl-keys-- --cl-rest--)) (while --cl-keys-- (cond ((memq (car --cl-keys--) '...) (setq --cl-keys-- (cdr ...))) ((car (cdr ...)) (setq --cl-keys-- nil)) (t (error "Keyword argument %s not one of (:sort-func :exclud..." (car --cl-keys--)))))) (let* ((files (and t (org-agenda-files)))) (if files (sort (mapcar #'(lambda ... ... entry) (let (... flattened) (let ... ... flattened))) (or sort-func org-timeblock-sort-function)) nil))))
  org-timeblock-get-entries()
  (let ((inhibit-read-only t) (entries (org-timeblock-get-entries)) (dates (org-timeblock-get-dates))) (erase-buffer) (org-timeblock-list-mode) (setq header-line-format (substitute-command-keys (format "\\<org-timeblock-list-mode-map>Sorted by %s propert..." (cond ((eq org-timeblock-sort-function 'org-timeblock-order<) (let nil "SORTING-ORDER")) ((eq org-timeblock-sort-function 'org-timeblock-sched-or-event<) (let nil "SCHEDULED")) ((symbolp org-timeblock-sort-function) (let nil (symbol-name org-timeblock-sort-function))))))) (let ((--dolist-tail-- dates)) (while --dolist-tail-- (let ((date (car --dolist-tail--))) (let ((entries (seq-filter ... entries)) (date-beg (point))) (insert (propertize (concat ... ...) 'face 'org-timeblock-list-header)) (insert "\n") (let ((--dolist-tail-- entries)) (while --dolist-tail-- (let ... ... ...))) (if (eq org-timeblock-sort-function #'org-timeblock-order<) (progn (goto-char date-beg) (forward-line ...) (insert ...))) (goto-char (point-max))) (setq --dolist-tail-- (cdr --dolist-tail--))))) (goto-char (point-min)) (if (get-buffer-window org-timeblock-buffer) (progn (org-timeblock-redraw-timeblocks))))
  (save-current-buffer (set-buffer (get-buffer-create org-timeblock-list-buffer)) (let ((inhibit-read-only t) (entries (org-timeblock-get-entries)) (dates (org-timeblock-get-dates))) (erase-buffer) (org-timeblock-list-mode) (setq header-line-format (substitute-command-keys (format "\\<org-timeblock-list-mode-map>Sorted by %s propert..." (cond ((eq org-timeblock-sort-function ...) (let nil "SORTING-ORDER")) ((eq org-timeblock-sort-function ...) (let nil "SCHEDULED")) ((symbolp org-timeblock-sort-function) (let nil ...)))))) (let ((--dolist-tail-- dates)) (while --dolist-tail-- (let ((date (car --dolist-tail--))) (let ((entries ...) (date-beg ...)) (insert (propertize ... ... ...)) (insert "\n") (let (...) (while --dolist-tail-- ...)) (if (eq org-timeblock-sort-function ...) (progn ... ... ...)) (goto-char (point-max))) (setq --dolist-tail-- (cdr --dolist-tail--))))) (goto-char (point-min)) (if (get-buffer-window org-timeblock-buffer) (progn (org-timeblock-redraw-timeblocks)))))
  org-timeblock-redraw-buffers()
  org-timeblock()
  funcall-interactively(org-timeblock)
  command-execute(org-timeblock record)
  helm-M-x-execute-command(org-timeblock)

Do let me know if you need more info.

Does not render links properly

Hi,

First of cool package and I can see this being really useful as I find org's schedule hard to get any good overview of the tasks.

I figured this would be excellent to test out on my fosdem schedule. It worked quite well except that it does not render the links properly, but instead just prints them in raw form. Which makes the blocks quite hard to read. Here is a snippet from the org file I tested this out on.

#+title: FOSDEM 2024
#+STARTUP: overview

* TODO [#B] [[https://fosdem.org/2024/schedule/event/fosdem-2024-2392-rocgdb-gdb-and-amdgpu-debugging/][ROCgdb, GDB and AMDGPU debugging]]
SCHEDULED: <2024-02-03 Sat 16:20-16:40>
- Track: [[https://fosdem.org/2024/schedule/track/debuggers-and-analysis/][Debuggers and analysis tools devroom]]
- Room: [[https://fosdem.org/2024/schedule/room/k4401/][K.4.401]]

* TODO [#A] [[https://fosdem.org/2024/schedule/event/fosdem-2024-2560-self-hosting-and-autonomy-using-guix-forge/][Self-hosting and autonomy using guix-forge]]
SCHEDULED: <2024-02-04 Sun 11:40-12:00>
- Track: [[https://fosdem.org/2024/schedule/track/declarative-and-minimalistic-computing/][Declarative and Minimalistic Computing devroom]]
- Room: [[https://fosdem.org/2024/schedule/room/h1309/][H.1309 (Van Rijn)]]

Consider using org-ql-search interface and make org-timeblock display its results

I'm imagining something like the agenda-like view in this:

Except the part that shows the agenda like view would show the org-timeblock blocks.

This would enable:

  • using org-timeblock as normal to block your time
  • using org-timeblock to see what your real time usage looked like (hit =v=, modify query to (todo "DONE")
  • utilize org-ql-agenda's ability to save queries as views

I remember you stating on reddit a goal was to be compatible with org-agenda. Perhaps a middle step that should be pretty easy if I understand the code would be integrating with org-ql-agenda.

It also covers quite a few of my wants/feedback in #41 (which I hope was useful and not overwhelming!).

a question about dependencies

hi, thank you for this nice software!
i tried install it manually by just using the elisp file, but it didnt go well, but when i tried the straight.el approach it worked like a charm.
it seems that straight just take care of the dependencies automatically, and i wonder if it can be done fully manually

error with latest org, emacs 30.0.50 with native comp enabled

installed via package-vc-install
call org-timeblock
the first time it worked but said no events for today.
After first time, get this:

error: org-timeblock-redraw-buffers: Wrong type argument: stringp, nil

There were some errors during native compilation, would it be best to disable native for this library?

Design suggestions

Avoid this pattern:

(cl-macrolet ((on (accessor op lhs rhs)
                `(,op (,accessor ,lhs)
                      (,accessor ,rhs))))
                  
    ;;wrapping defuns
)

It makes debugging the functions which use on much harder than necessary.
It would be better to properly define the macro using defmacro and use it.
Even better would be to rewrite on as a function so a macro is not necessary at all.

The macro also raises the following byte-compiler warnings:

org-timeblock.el  336  17 warning  e-f-b-c  Use of deprecated ((lambda (item) ...) ...) form
org-timeblock.el  341  17 warning  e-f-b-c  Use of deprecated ((lambda (item) ...) ...) form

Can this regexp be replaced with org-scheduled-regexp?

	(when (re-search-forward "^SCHEDULED:.+>\n" (1+ (line-end-position)) t)

Likewise, could these be replaced by org-tsr-regexp?:

(defconst org-ts-regexp0
  "\\(\\([0-9]\\{4\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\)\\( +[^]+0-9>\r\n -]+\\)?\\( +\\([0-9]\\{1,2\\}\\):\\([0-9]\\{2\\}\\)\\)?\\)"
  "Regular expression matching time strings for analysis.
This one does not require the space after the date, so it can be used
on a string that terminates immediately after the date.")

(defconst org-ts-regexp1 "\\(\\([0-9]\\{4\\}\\)-\\([0-9]\\{2\\}\\)-\\([0-9]\\{2\\}\\)\\(?: *\\([^]+0-9>\r\n -]+\\)\\)?\\( \\([0-9]\\{1,2\\}\\):\\([0-9]\\{2\\}\\)\\)?\\)"
  "Regular expression matching time strings for analysis.")

(defconst org-ts-regexp2 (concat "<" org-ts-regexp1 "[^>\n]\\{0,16\\}>")
  "Regular expression matching time stamps, with groups.")

(defconst org-ts-regexp3 (concat "[[<]" org-ts-regexp1 "[^]>\n]\\{0,16\\}[]>]")
  "Regular expression matching time stamps (also [..]), with groups.")

(defconst org-tr-regexp (concat org-ts-regexp "--?-?" org-ts-regexp)
  "Regular expression matching a time stamp range.")

Instead of searching through the text of the svg file, you should be able to give each element an id or classname when creating them and programatically manipulate them via the svg functions or the built-in dom.el.

      (while (re-search-forward "<rect width=\"\\([^\"]+\\)\" height=\"\\([^\"]+\\)\" x=\"\\([^\"]+\\)\" y=\"\\([^\"]+\\)\" id=\"\\([^\"]+\\)\"" nil t)
      ...
  (when (re-search-forward (format " fill=\"\\(%s\\)\"" ot-sel-block-color) nil t)

FR: Pomodoro timer-like sound notifications indicating timeblock status (working on task, or on break)

Pomodoro timers mainly use 2x sounds:

  • 1: a task start sound
  • 2: a task stop sound
    • (And a 3: break end sound, but this can be ignored)

It would be cool if 1 and 2 could be triggered automatically based of a timeblocked schedule, so that there is a live feedback loop letting me know what's going on with my schedule and where I'm at within it, without having to regularly glance at the actual schedule itself.

Also it would be cool if sounds could be customized to specific tasks

  • (Say notification sounds for exercise, are different than normal work, so I can know what task I'm going into by just listening to the sound itself).

And in addition, maybe some sort of espeak or Emacspeak speaking the task name when entering a new timeblock, to further clarify and exalt what exact timeblock is being entered.

Wrong type argument

I initially tried to install with:

M-x package-vc-install https://github.com/ichernyshovvv/org-timeblock/

but was getting a Maximum buffer size exceeded error. I ended up just M-x eshell'ing into a file location, git cloning the directory & package-install-file. That seemed to work okay.

When I ran M-x org-timeblock, it seemed to work the first time. Then when I tried to run again later on, I get the following error message:

org-timeblock: Wrong type argument: stringp, #s(ts nil nil nil nil 9 2023 nil nil nil ...)

Not sure what this is about at the moment.

Edit: Just set my org-agenda-files to a different location without any .org files to see if there was something wrong with the input, but I get the same error.

"no data" if later date found before current date

I have an interesting circumstance, consider that I have the following early on in my org-agenda-files, and it is 20 January 2024.

* TODO [#A] Weekly Review
SCHEDULED: <2024-01-21 Sun 17:00-18:00 ++1w>
:PROPERTIES:
:STYLE:    habit
:LOGGING:  DONE(!)
:LOG_INTO_DRAWER: LOGBOOK
:END:

When I try to show a time-block view for today, I see "no data", despite there being other entries for the day.

Recurring tasks/events are ignored

It's 2023-08-24 today.

This event won't show up in today's timeblock view (but it should!)

* Recurring event which started in the past 
<2023-02-20 Mon 12:00-13:00 +1d>

This event shows up:

* Event today  
<2023-08-24 Mon 12:00-13:00 +1d>

Time/date range not correctly rendered

Thank you very much for making the time blocking in org-agenda an ease!

I wonder whether the following issue can be easily fixed with certain configurations:

The following heading with the timestamp range format

** end of week
   <2024-02-11 Sun 19:40>--<2024-02-11 Sun 20:30>

will be rendered as two events in the org-timeblock buffer: one with the correct range, then another one with the second time stamp (see screenshot).

Screenshot of Emacs at 11_ Feb 2024 at 19_54_50

Any information will be appreciated!

Dependency to org-ql

Today I installed org-timeblock on Crafted Emacs v2beta, which by default uses package.el. org-timeblock, however, is installed using package-vc which caused an error when I tried to evaluate

(package-vc-install
 '(org-timeblock :url "https://github.com/ichernyshovvv/org-timeblock/"))

The message was

Compiling file /home/gan/.config/craftedemacs/elpa/org-timeblock/org-timeblock.el at Wed Sep  6 14:23:00 2023
org-timeblock.el:40:2: Error: Cannot open load file: No such file or directory, org-ql

A look into the package directories revealed that org-ql packages had been downloaded (via package.el) yet not compiled, however, org-timeblock was not able to find it.

After manually re-installing org-ql, org-timeblock compiled

UI rendered too small

Hey there,
what a great package! ive been wanting such a functionality for a long time.

I installed org-timeblock on Emacs 28.2 using Doom Emacs and the rendered UI is way too small.
Ive tried manually setting the values for org-timeblock-svg-width and org-timeblock-svg-height, but it seems they are overwritten once the timeblock UI is actually drawn.
Any ideas as to what might cause that problem? Could you maybe allow for users to set the desired size of the UI?
Thanks alot in advance :)

Screenshot 2023-09-02 at 10 32 20

Suggestion: Work Week and Week view

Dear @ichernyshovvv,
The app now looks very polished and I use the org-timeblock package a lot more than org-agenda these days.

A suggestion from my side is to have a Work Week view (Mon-Fri) and Week view (Sun-Sat or Mon-Sun).

This will make sure I never have to go to Google Calendar or any other non-FOSS apps any more :)

Thanks and have a nice day!

BUG: org-timeblock-write saves file with empty background

Platform

GNU/Emacs 29.1 installed from scoop on windows 10


Name        : emacs
Description : An extensible, customizable, free/libre text editor.
Version     : 29.1
Bucket      : extras
Website     : https://www.gnu.org/software/emacs
License     : GPL-3.0-or-later
Updated at  : 31.07.2023 12:57:50
Updated by  : HUMORCE
Installed   : 29.1
Binaries    : bin\runemacs.exe | bin\emacs.exe | bin\emacsclientw.exe | bin\etags.exe | bin\ctags.exe
Shortcuts   : Emacs | Emacs Client
Notes       : For 32-bit version, install 'versions/emacs27.2'

How to reproduce

  1. Open org-timeblock with M-x org-timeblock
  2. Save schedule to file M-x org-timeblock-write

Result

Exported schedule image has empty background.
image

Expected behavior

Exported schedule image has the same background as current emacs theme.
Image from expected behavior recreated with help of inkscape.
image

P.S.: Thank you for your work on this package.

FEATURE: support org-clocking in org-timeblock mode

org-timeblock supports clocking in for entries that already appear in the org-timeblock view, but people that regularly log their time tend to have most of their timestamps in the form of clocks. Currently, viewing logs is not supported.

Please add the option show-log, as a custom variable. This would easily fix the limitations in visual clarity of the org-agenda.

Path with org-headlines in the mini-buffer when an agenda item is highlighted

Hi @ichernyshovvv,
This is an excellent package and I love it. I had been using org-gcal to sync my TODOs from org-mode so that I can see how I balance my workload in a visual format.

Your package makes that step unnecessary!

A suggestion I have is - When I move my focus around, the agenda item highlighted, if it can show the path of the selected item in the mini-buffer, just like how org-agenda does it, that will be great! (Right now, it says Type C-c C-c to view the image as text

Thanks again and have a great day!
Bala

Suggestion: Implement PunteroRed for Improved Org-Timeblock Contribution and Compensation

Hello maintainers of Org-Timeblock,

We recently came across your project, and I've been impressed with the work you have been doing. As your project grows, thinking about project governance and how to incentivize contributors is important. With that in mind, I'd like to suggest implementing PunteroRed.

If you are considering monetizing Org-Timeblock into a product, PunteroRed can help you establish a fair and transparent governance system. By tokenizing contributions, PunteroRed allows you to easily track contributions and allocate resources according to the value provided. This can be a powerful way to incentivize contributors and engage your community.

Here are a few reasons why implementing PunteroRed can be beneficial for Org-Timeblock:

Fair Governance: PunteroRed's decentralized approach ensures a fair distribution of governance power among contributors.
Transparent Compensation: By tokenizing contributions, PunteroRed creates a transparent system for tracking and rewarding contributions.
Increased Engagement: PunteroRed can help increase community engagement and collaboration with clear incentives and rewards for contributions.
Easier Scaling: As your project grows, PunteroRed can provide a scalable solution for governance and compensation.
PunteroRed could be a valuable addition to your project, and we would love to discuss how to implement it.

Let us know if you're interested, and we'll chat further, or say yes, and we will fork Org-Timeblock, and add what is needed for you to merge it.

Thanks for considering this suggestion, and keep up the great work!

Best regards,
PunteroRed Team

how to change face size

Love this package. Would like to be able to make the text size of the time blocks smaller. I can scale it to be smaller using ctrl + scrollwheel but then when I click on it, it reverts back to the larger default size. I changed all the face heights in the customize menu but it hasn't had any impact on the font size. Let me know if it's possible to change this. Thank you!

optional backend for SVG drawing?

Hi!

Is it possible to use something else for drawing SVG? Or not drawing it at all?

org-timeblock shows me the current date and an empty buffer. It reports no error with toggle-debug-on-error. I've looked at my ImageMagick configuration and how to fix it. Could not find a quick solution and decided to ask here for a tip.

Here's what org-timeblock puts in the message buffer:

Type C-c C-c or C-c C-x to view the image as text or hex.
ImageMagick error: NoDecodeDelegateForThisImageFormat `SVG' @ error/blob.c/BlobToImage/460 [9 times]
QuitImageMagick error: NoDecodeDelegateForThisImageFormat `SVG' @ error/blob.c/BlobToImage/460
ImageMagick error: NoDecodeDelegateForThisImageFormat `SVG' @ error/blob.c/BlobToImage/460

My Emacs build:

(system-configuration-features)
"ACL GIF GLIB GMP GNUTLS IMAGEMAGICK JPEG JSON LCMS2 LIBXML2 MODULES NATIVE_COMP NOTIFY KQUEUE NS PDUMPER PNG RSVG THREADS TIFF TOOLKIT_SCROLL_BARS XIM ZLIB"

Thanks!

Feedback from experienced org-mode user/timeblocker

Hi! I'm an experienced org-mode user who's been using hyperscheduler.

I had done a bit of time-blocking this morning, so I was expecting to see some entries after M-x org-timeblock but didn't see any.

A C-h b and I saw I could easily add something with + though. It added it to inbox.org for me.

Ah, my timeblocks weren't yet scheduled.. just a small difference in workflow. Before I would use an org-capture-template that added items to the agenda by scheduling them for the day.

Then after adding all items I'd like to do for the day I'd create the timeblocks.

I just noticed that if you add a timeblock with + and don't provide a time range then it won't show up in the time-grid. This makes sense, but could be confusing for newer users.

I also find utility in for instance putting all of the blocks without specific times only scheduled to the day at the bottom.

Maybe this method can be supported ? I'm pretty bad at timeblocking before I've added everything I'll potentially do for the day.

One minor annoyance is that I found day later and day earlier arrows to be counter-intuitive, but maybe I'm just not used to it?

One big bonus is that with this being compatible with the mouse:

  • I can recommend it to friends that want some kind of planning but avoid learning so many shortcuts
  • When I'm feeling lazier, I can use the mouse
  • It should work well on Android too with the official emacs package I think

Another minor issue is that custom todo keywords such as TIMEBLOCK don't seem to have colors even though they show up on the org-timeblock grid.

I use a custom todo keyword to make filtering in my org-agenda easier. I'm guessing that many others would run into this issue as well.

Just now I was adding a second time-block with + and was reminded of Working faster in emacs by reading the future when hitting M-p to go back in my schedule history.

The idea it gave me was org-timeblock could insert the last scheduled date's end time into the org scheduled ring (actually not sure what the history variable is named).

For example:

+ 1 hour lunch RET 12:30-13:30
+ 10 minute walk RET M-n - 13:40

Would give:

12:30-13:30 1 hour lunch
13:30-13:40 10 minute walk

All I have for now, but will post more as I use this package in the real world. Thanks again!

compat-version error

when i try to call org-timeblock :

image

my current config for org-timeblock
image

i'm using emacs from git, maybe this is why it's not compatible, is there anything that i can do about it?

Not compatible with evil

When evil-mode is enabled, keybindings does'nt work
Here is my configuration to have evil working

(use-package org-timeblock
  :hook ((org-timeblock-mode org-timeblock-list-mode) . my/org-timeblock-evil-map)
  :straight (org-timeblock :type git
			   :host github
			   :repo "ichernyshovvv/org-timeblock")
  :init
  (defun my/org-timeblock-evil-map ()
    "Set the keybindings for 'org-timeblock' to be compatible with evil mode"
    (evil-define-key 'normal org-timeblock-mode-map
      "+" 'org-timeblock-new-task
      "j" 'org-timeblock-forward-block
      "l" 'org-timeblock-forward-column
      "h" 'org-timeblock-backward-column
      "k" 'org-timeblock-backward-block
      (kbd "C-<down>") 'org-timeblock-day-later
      (kbd "C-<up>") 'org-timeblock-day-earlier
      (kbd "RET") 'org-timeblock-goto
      (kbd "TAB") 'org-timeblock-goto-other-window
      "d" 'org-timeblock-set-duration
      "r" 'org-timeblock-redraw-buffers
      "gd" 'org-timeblock-jump-to-day
      "s" 'org-timeblock-schedule
      "t" 'org-timeblock-toggle-timeblock-list
      "v" 'org-timeblock-switch-scaling
      "V" 'org-timeblock-switch-view)
    (evil-define-key 'normal org-timeblock-list-mode-map
      "+" 'org-timeblock-new-task
      "j" 'org-timeblock-list-next-line
      "k" 'org-timeblock-list-previous-line
      (kbd "C-<down>") 'org-timeblock-day-later
      (kbd "C-<up>") 'org-timeblock-day-earlier
      (kbd "C-s") 'org-timeblock-list-save
      (kbd "M-<down>") 'org-timeblock-list-drag-line-forward
      (kbd "M-<up>") 'org-timeblock-list-drag-line-backward
      (kbd "RET") 'org-timeblock-list-goto
      (kbd "TAB") 'org-timeblock-list-goto-other-window
      "S" 'org-timeblock-list-toggle-sort-function
      "d" 'org-timeblock-list-set-duration
      "r" 'org-timeblock-redraw-buffers
      "gd" 'org-timeblock-jump-to-day
      "q" 'org-timeblock-quit
      "s" 'org-timeblock-list-schedule
      "t" 'org-timeblock-list-toggle-timeblock
      "v" 'org-timeblock-switch-scaling
      "V" 'org-timeblock-switch-view)))

Don't rely on other package's private symbols

The following private symbols are referenced directly:

svg--append
svg--encode-text
org-fold-core--isearch-reveal 

These are not meant to be consumed directly. Their API may change at any time.

Support for sexp entries?

Sexp entries with time ranges such as %%(school-timetable date 1) English 10:10-10:50 are not shown on the timeblock.
Is there a way that this could be done?

In this case, school-timetable is a function that checks if the date matches with my school's day 1 for the cycle. The reason why this cant be a normal timestamp is that for my school, every cycle repeats every 6 school days, so +1w won't work.

The relevant section on sexp entries:

The generality of sexp diary entries lets you specify any diary entry that you can describe algorithmically. A sexp diary entry contains an expression that computes whether the entry applies to any given date. If its value is non-nil, the entry applies to that date; otherwise, it does not. The expression can use the variable date to find the date being considered; its value is a list (month day year) that refers to the Gregorian calendar.

On startup: obsolete timestamp with cdr 1

When running org-timeblock for the first time I get to see 3 empty days and the message obsolete timestamp with cdr 1.
I even get this message if I remove all my org files. It has probably nothing to do with my files.

I set debug-on-error but I can't get any more detailled information.

What's wrong?

  • emacs-version GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.37, cairo version 1.16.0)
    of 2023-05-14, modified by Debian
  • org-version 9.5.5
  • org-timeblock from melpa

how to specify tags

I see that there is a org-timeblock-tag-colors variable, but is there a way to use this to have all entries from a specific calendar use the same colour in the display? (E.g. all events from Agenda.org should be shown in red)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.