ichernyshovvv / org-timeblock Goto Github PK
View Code? Open in Web Editor NEWSchedule your day visually, using timeblocking technique inside Emacs
License: GNU General Public License v3.0
Schedule your day visually, using timeblocking technique inside Emacs
License: GNU General Public License v3.0
Would it be possible to set the minimum displayed hour and maximum displayed hour?
Hello @ichernyshovvv,
Looking at the org-timeblock-tag-colors
, I wonder if you have thought about the following approach:
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.
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.
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
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
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...
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.
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)
on mac os. emacs 29.1.
getting the following error when trying to load org-timeblock
:org-timeblock/:catch: Cannot open load file: No such file or directory, compat-macs
Installing with:
(use-package org-timeblock
:straight (org-timeblock :type git
:host github
:repo "ichernyshovvv/org-timeblock"))
It appears that it needs to be set to 0 to show only one day. This is contrary to the docstring.
Hi @ichernyshovvv,
Wonderful package! Loving it!
May we have shift-rightarrow or shift-leftarrow for rescheduling the selected task? This will be very useful and consistent with org-agenda.
Thanks and have a great day!
Bala
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)))
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!
Hi @ichernyshovvv,
Hope you are doing well.
When I have a repeater in the timestamp (++1w), the item seems to be repeating every day.
Can you please look into this?
Thanks
Bala
Hej Hej,
Thank you for this package!
I would like to see a day with no data to display just the timelines instead of the string "no data."
This is just esthetics so there is no high priority.
Thanks a lot.
Cheers!
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>
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)
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).
Any information will be appreciated!
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!
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.
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.
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 :)
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!
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?
Your package requires org-ql, which transitively requires ts.el:
https://github.com/alphapapa/org-ql/blob/eb5377320fcfd38354d6e9e3e655969ae3c0e052/org-ql.el#L8
https://github.com/alphapapa/ts.el
You should be able to simplify your library by relying on ts.el's functionality.
e.g. ot--timestamp-encode
is probably already covered by ts-parse-org
or ts-parse-org-element
.
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)]]
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
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:
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!
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.
Pomodoro timers mainly use 2x sounds:
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
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.
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.
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:
Configuration:
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:
(todo "DONE")
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!).
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'
M-x org-timeblock
M-x org-timeblock-write
Exported schedule image has empty background.
Exported schedule image has the same background as current emacs theme.
Image from expected behavior recreated with help of inkscape.
P.S.: Thank you for your work on this package.
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
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?
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
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.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.