Hi all! This is my first post, so I hope this is the correct category. I am interested in some feedback for a piece of code that works but I find really clunky.
In a nutshell: I want to iterate through a logbook drawer and send all time stamps to an external command (which I need to track company times) that I called
my-other-cli in this example.
Here is what I got so far. I replaced the
(shell-command) with a
(princ) so it can be evaluated in the source block:
* Worklog ** 2022-11 :LOGBOOK: CLOCK: [2022-11-10 Thu 11:18]--[2022-11-10 Thu 19:55] => 8:37 CLOCK: [2022-11-10 Thu 08:18]--[2022-11-10 Thu 10:06] => 1:48 CLOCK: [2022-11-09 Wed 13:10]--[2022-11-09 Wed 17:55] => 4:45 CLOCK: [2022-11-09 Wed 08:48]--[2022-11-09 Wed 12:25] => 3:37 :END: #+name: loop-through-clocks #+begin_src elisp :results output replace (defun bascht/call-command-with-timestamp (clock-line) (let* ((timestamp (org-element-property :value clock-line))) (let* ((year-start (org-element-property :year-start timestamp)) (year-end (org-element-property :year-end timestamp)) (month-start (org-element-property :month-start timestamp)) (month-end (org-element-property :month-end timestamp)) (day-start (org-element-property :day-start timestamp)) (day-end (org-element-property :day-end timestamp)) (hour-start (org-element-property :hour-start timestamp)) (hour-end (org-element-property :hour-end timestamp)) (minute-start (org-element-property :minute-start timestamp)) (minute-end (org-element-property :minute-end timestamp))) (print (format "my-other-cli --work-start '%s-%s-%s %s:%s' --work-end '%s-%s-%s %s:%s'" year-start month-start day-start hour-start minute-start year-end month-end day-end hour-end minute-end))))) (save-excursion (goto-char (org-find-exact-headline-in-buffer "Worklog")) (goto-char (org-find-exact-headline-in-buffer (format-time-string "%Y-%m"))) (search-forward ":LOGBOOK:") (forward-line 1) (cl-loop until (s-equals? (s-trim (thing-at-point 'line t)) ":END:") do (bascht/call-command-with-timestamp (org-element-at-point)) (forward-line 1))) #+end_src #+RESULTS: loop-through-clocks : : "my-other-cli --work-start '2022-11-10 11:18' --work-end '2022-11-10 19:55'" : : "my-other-cli --work-start '2022-11-10 8:18' --work-end '2022-11-10 10:6'" : : "my-other-cli --work-start '2022-11-9 13:10' --work-end '2022-11-9 17:55'" : : "my-other-cli --work-start '2022-11-9 8:48' --work-end '2022-11-9 12:25'"
As I already mentioned: The code works, but I am not very confident.
(org-element-property :value […]) which gives me the org timestamp including both start and end time. But only as individual properties (year-start, month-start, etc.) so I had to re-map all of them.
Is there an easier way to access both time stamps for start and end? Feeding it directly into
(format-time-string "%Y-%m" timestamp) just gives me “Invalid time specification”.
At the moment I use
(search-forward) to find the
:LOGBOOK: drawer. Is there an easier way to jump straight into the drawer? (That way I could also get rid of the
Any other feedback what you would do different?
Thanks already for reading up until the end!