Command-line and Emacs Calendar Client

move ids to the right

Ryan Gibb 28b65897 2a257c62

Changed files
+34 -20
lib
+15 -15
README.md
···
```
$ caled list
-
054bb346-b24f-49f4-80ab-fcb6040c19a7 personal 2025-04-04 Fri 13:00 - 14:00 (America/New_York) New York 8am meeting
-
3B84B125-6EFC-4E1C-B35A-97EFCA61110E family 2025-04-06 Sun 21:00 - 22:00 (UTC) Family chat @Video call
-
4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d work 2025-04-09 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting
-
ccef66cd4d1e87ae7319097f027f8322de67f758 personal 2025-04-10 Thu 11:00 - 12:00 (UTC) Dentist
-
3B84B125-6EFC-4E1C-B35A-97EFCA61110E family 2025-04-13 Sun 21:00 - 22:00 (UTC) Family chat @Video call
-
33cf18ec-90d3-40f8-8335-f338fbdb395b personal 2025-04-15 Tue - 2025-04-17 Thu John Doe in town
-
8601c255-65fc-4bc9-baa9-465dd7b4cd7d personal 2025-04-15 Tue 21:00 - 21:30 (UTC) Grandma call
-
4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d work 2025-04-16 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting
-
7hm4laoadevr1ene8o876f2576@google.com personal 2025-04-19 Sat Jane Doe's birthday
-
3B84B125-6EFC-4E1C-B35A-97EFCA61110E family 2025-04-20 Sun 21:00 - 22:00 (UTC) Family chat @Video call
-
8601c255-65fc-4bc9-baa9-465dd7b4cd7d personal 2025-04-22 Tue 21:00 - 21:30 (UTC) Grandma call
-
4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d work 2025-04-23 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting
-
3B84B125-6EFC-4E1C-B35A-97EFCA61110E family 2025-04-27 Sun 21:00 - 22:00 (UTC) Family chat @Video call
-
8601c255-65fc-4bc9-baa9-465dd7b4cd7d personal 2025-04-29 Tue 21:00 - 21:30 (UTC) Grandma call
-
4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d work 2025-04-30 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting
+
personal 2025-04-04 Fri 13:00 - 14:00 (America/New_York) New York 8am meeting 054bb346-b24f-49f4-80ab-fcb6040c19a7
+
family 2025-04-06 Sun 21:00 - 22:00 (UTC) Family chat @Video call 3B84B125-6EFC-4E1C-B35A-97EFCA61110E
+
work 2025-04-09 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting 4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d
+
personal 2025-04-10 Thu 11:00 - 12:00 (UTC) Dentist ccef66cd4d1e87ae7319097f027f8322de67f758
+
family 2025-04-13 Sun 21:00 - 22:00 (UTC) Family chat @Video call 3B84B125-6EFC-4E1C-B35A-97EFCA61110E
+
personal 2025-04-15 Tue - 2025-04-17 Thu John Doe in town 33cf18ec-90d3-40f8-8335-f338fbdb395b
+
personal 2025-04-15 Tue 21:00 - 21:30 (UTC) Grandma call 8601c255-65fc-4bc9-baa9-465dd7b4cd7d
+
work 2025-04-16 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting 4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d
+
personal 2025-04-19 Sat Jane Doe's birthday 7hm4laoadevr1ene8o876f2576@google.com
+
family 2025-04-20 Sun 21:00 - 22:00 (UTC) Family chat @Video call 3B84B125-6EFC-4E1C-B35A-97EFCA61110E
+
personal 2025-04-22 Tue 21:00 - 21:30 (UTC) Grandma call 8601c255-65fc-4bc9-baa9-465dd7b4cd7d
+
work 2025-04-23 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting 4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d
+
family 2025-04-27 Sun 21:00 - 22:00 (UTC) Family chat @Video call 3B84B125-6EFC-4E1C-B35A-97EFCA61110E
+
personal 2025-04-29 Tue 21:00 - 21:30 (UTC) Grandma call 8601c255-65fc-4bc9-baa9-465dd7b4cd7d
+
work 2025-04-30 Wed 15:00 - 16:00 (Europe/London) Weekly Meeting 4adcb98dfc1848601e38c2ea55edf71fab786c674d7b72d4c263053b23560a8d
```
See [TODO](./TODO.org) for future plans.
+19 -5
lib/event.ml
···
let id, calendar_name, date_time, summary, location =
text_event_data ?tz event
in
-
Printf.sprintf "%s\t%s\t%s\t%s\t%s" id calendar_name date_time summary
-
location
+
Printf.sprintf "%s\t%s\t%s\t%s\t%s" calendar_name date_time summary
+
location id
| `Entries ->
let format_opt label f opt =
Option.map (fun x -> Printf.sprintf "%s: %s\n" label (f x)) opt
···
(fun acc (_, _, date, _, _) -> max acc (String.length date))
0 event_data
in
+
(* Calculate max width for summary+location *)
+
let max_summary_loc_width =
+
List.fold_left
+
(fun acc (_, _, _, summary, location) ->
+
let full_length =
+
String.length summary
+
+ if location <> "" then String.length location + 1 else 0
+
in
+
max acc full_length)
+
0 event_data
+
in
(* Format each event with calculated widths *)
let formatted_events =
List.map
(fun (id, cal, date, summary, location) ->
-
Printf.sprintf "%-*s %-*s %-*s %s%s" max_id_width id max_cal_width
-
cal max_date_width date summary
-
(if location <> "" then " " ^ location else ""))
+
let summary_loc =
+
summary ^ if location <> "" then " " ^ location else ""
+
in
+
Printf.sprintf "%-*s %-*s %-*s %-*s" max_cal_width cal
+
max_date_width date max_summary_loc_width summary_loc max_id_width
+
id)
event_data
in
String.concat "\n" formatted_events