aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'README.md')
-rw-r--r--README.md110
1 files changed, 52 insertions, 58 deletions
diff --git a/README.md b/README.md
index 51f27f8..94304fe 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,10 @@
# then
-Then is a minimalist plain text file calendar inspired by [When](https://www.lightandmatter.com/when/when.html). It aims to have simple syntax for the average scheduling case. Then supports recurring events at least as complex as average calendar apps.
+Then is a minimalist plain text file calendar inspired by [When](https://www.lightandmatter.com/when/when.html). It has simple syntax optimized for the average scheduling case, but supports recurring cases more complex than most calendars. It optionally supports todo lists and deadlines but won't clutter your agenda with an empty todo list if you don't want that.
+
+Then is a single binary with no dependencies optimized for people who want to manage events directly in their text editor rather than a TUI/GUI. You can columnize, group, sort, and archive events in your .then file(s) to keep them neat and pretty.
+
+In terms of features and complexity, Then lies between [When](https://www.lightandmatter.com/when/when.html) and [Remind](https://dianne.skoll.ca/projects/remind/) but aims to be less verbose than either.
# .then file syntax
@@ -30,7 +34,7 @@ Tue, Taco night (Every Tuesday)
Mon Wed Fri, Submit TPS Report (Every Monday, Wednesday, or Friday)
20:00 Fri, Friday Night Magic (Every Friday at 8pm)
-09:00, Coffee (Every day at 9am)
+9am, Coffee (Every day at 9am)
, Journal (Every day)
```
@@ -44,61 +48,50 @@ Any line starting with a `-` or `+` is attached to the nearest above event. This
- Dr. Elias Berkins, +1 (555)-123-1234
```
-## Logical Operators (`|`, `!`)
+## Ranges (`-`)
-Parameters can be grouped with parentheses.\
-`|` means or.\
-`!` means not.\
-`and` is always *implied* by whitespace
+You can specify ranges with a dash for any condition. This works for dates if you group a day and month (and optionally year) in parentheses.
```
-1 | 15, Every 1st OR 15th
-Fri !13, Every Friday AND NOT the 13th
-Sun !(Dec 25), Every Sunday AND NOT December 25
-2025 Aug 14, 2025 AND August AND the 14th
-1 2, Every 1st AND 2nd (i.e. never)
+Mon-Fri, Work every weekday
+Jan 1-7 2025, Las Vegas convention
+(Jan 30 2025)-(Feb 3 2025), Ski trip
+(Dec 25)-(Jan 2), Christmas vacation
```
-## Comparison Operators (`<`, `>`)
-
-`<` mean on or before.\
-`>` mean on or after.
-
-This lets you express start and end dates. Note that these operators are **inclusive** of the date they operate on. I virtually always mean `<=` when writing `<` with a date, so the equals is omitted to reduce special characters.
+You can omit one end of a date range to mean "before" or "after".
```
-Fri <(Sep 13 2024), Every Friday, ending September 13 2024
->(Jan 1 2025) <(Jan 15 2025), Every day from Jan 1 2025 through Jan 15 2025
-2025 Jan >1 <15, Same as above expressed a different way
->(Jul 15), All days from July 15 to Dec 31.
+Fri -(Sep 13 2025), Every Friday before Sep 13 2025
+Fri (Sep 13 2025)-, Every Friday after Sep 13 2025
```
-You can put a comparison operator in front of a group in these two cases:
-1. The group includes a day, month, and year
-2. The group includes a day and month
-
-For groups in parentheses if a day, month, and year is given, the date will be converted to a Modified Julian Date and works how you expect.
-
-```
->(Dec 24 2025) <(Jan 4 2026), Christmas vacation
-```
+## Logical Operators (`|`, `!`)
-If groups have only a month and day, it will match every date from Jan 1 or until Dec 31.
+Parameters can be grouped with parentheses.\
+`|` means OR.\
+`!` means NOT.\
+AND is *implied* by whitespace between conditions
```
->(Dec 24) <(Jan 4), Christmas vacation every year
+1 | 15, Every 1st OR 15th
+Fri !13, Every Fridaym, NOT the 13th
+Sun !(Dec 25), Every Sunday, NOT December 25
+2025 Aug 14, 2025 AND August AND the 14th
+1 2, Every 1st AND 2nd (i.e. never)
```
## First/last week(s) of Month (`W`, `L`)
-{N}W is the Nth set of 7 days of a month
-{N}L is the Nth-from-last set of 7 days of a month
+[N]W is the Nth set of 7 days of a month
+[N]L is the Nth-from-last set of 7 days of a month
This is mostly useful for certain Holidays.
```
-May 2W Sun, Mother's Day (Second Sunday of May)
-May 1L Mon, Memorial Day (Last Monday of May)
+May 2W Sun, Mother's Day (Second Sunday of May)
+May 1L Mon, Memorial Day (Last Monday of May)
+1W Fri, First Friday (of every month)
```
## Modified Julian Date (`J%n+y`)
@@ -114,9 +107,9 @@ Note, you can't put spaces in here like `!(J % 3)` because spaces are always int
This syntax sucks but is included because it's possible. It's on the outside edge of what Then is intended to support support while still meeting the primary goal of every parameter being a condition. It's included as a last resort to allow for "every N days" when necessary.
-You technically can express dates like "Repeat every 3 days between July 10-19 2025" as `>(Jul 10 2025) <(Jul 19 2025) !(J%3-2)`, but Then syntax is optimized for simple cases and gets klugey for complex recurring events. You should consider the much more powerful [Remind](https://dianne.skoll.ca/projects/remind/) instead if you're frequently making events like this.
+You technically can express dates like "Repeat every 3 days between July 10-19 2025" as `>(Jul 10 2025) <(Jul 19 2025) !(J%3-2)`, but Then syntax is optimized for simple cases and gets klugey for complex recurring events.
-## Deadline Recipe
+## Deadline Recipe (TODO: Redo this entirely)
There is no distinction between a scheduled event and deadline but by using a less than operator `<` combined with some frequency you might create useful deadline reminders:
@@ -126,7 +119,7 @@ There is no distinction between a scheduled event and deadline but by using a le
<(Aug 15 2025) J%2, Due 8/15 - Remind me every other day
>(Aug 10 2025) <(Aug 15 2025), Due 8/15 - Start daily reminders on 8/10/2025
-You technically could do this as well:
+# You technically could do this as well, although I wouldn't:
<(Aug 15 2025) ((>(Aug 1 2025) J%2) | >(Aug 10 2025)), SomeProject
- Due 8/15
- Bi-daily reminders starting 8/1
@@ -139,47 +132,48 @@ You technically could do this as well:
2. You want to manage your schedule directly in your text editor
3. It's fun
-Then is minimal and created to meet my personal use case. If your first thought was something about how the world runs on mobile phones or planning how to sync Then to *another* Calendar program to get so-and-so functionality, Then is the wrong tool and you'd probably be overcomplicating your workflow rather than simplifying it.
+Then is minimal and created to meet my personal use case. If your first thought was something about mobile phone notifications or planning how to sync Then to *another* calendar program, Then is the wrong tool and you'd be overcomplicating your workflow rather than simplifying it.
## Why would I use this over When?
-I love [When](https://www.lightandmatter.com/when/when.html)! 95% of my events are single dates or simple recurrences (e.g. bill due on 5th of month). Then was only created to slightly simplify When's syntax to remove special characters from average cases.
+I love [When](https://www.lightandmatter.com/when/when.html)! Then was created to simplify When's syntax to remove special characters from average cases.
-1. Parameter types in the date are inferred. The only 4-digit string that can appear in a date is the year. `y=1984` in `when` is simplified to `1984` in `then`.
-2. The `&` logical operator is implied by whitespace. `m=jan & d=1` in `when` is simplified to `Jan 1` in `then`.
+**When**: `* * 1, Mortgage Due`\
+**then**: `1, Mortgage Due`
-In short, I think it looks nicer:
+I also added optional todo/deadline features because I use calendar events like a todo list. I might complete an event like "Change air filters" early or let it run late. I want it on my calendar until it's done, or I want it gone if I've already done it.
-**when**: `* Dec 25, Christmas` or `m=dec & d=25, Christmas`\
-**then**: `Dec 25, Christmas`
+## Why would I use this over Remind?
-**when**: `m=sep & w=mon & a=1, Labor Day`\
-**then**: `Sep Mon 1W, Labor Day`
+I love [Remind](https://dianne.skoll.ca/projects/remind/)! It is incredibly powerful. Then syntax is shorter than Remind for average cases:
-## Why would I use this over Remind?
+**Remind**: `REM Jan 1 MSG New Years!`\
+**then**: `Jan 1, New Years!`
-I love [Remind](https://dianne.skoll.ca/projects/remind/)! It is incredibly powerful! I am not a scheduling nerd and keep a very simple calendar. Then does 1% of what Remind does, *if that*. Particularly if you deal with events with unusual recurrence patterns, Remind is nicer than Then:
+If you deal with events with unusual recurrence patterns or conditions, Remind is arguably nicer and inarguably much more powerful:
Every 3 days between July 10-19 2025:\
**Remind**: `REM Jul 10 2025 *3 THROUGH Jul 19 2025`\
-**then**: `>(Jul 10 2025) <(Jul 19 2025) !(J%3-2)`
+**then**: `(Jul 10 2025)-(Jul 19 2025) !(J%3-2)`
If you have any case on the edge of what Then supports, or far beyond, you should use Remind instead.
# Alternatives
-If you're interested in text file based calendars, the three GOATs are:
+If you're interested in other plain text file calendars, I highly recommend When or Remind. It's easy to get caught up yak shaving the maximalist Emacs, so Org Mode is a bit of a beast.
-- [When](https://www.lightandmatter.com/when/when.html) - IMO, the simplest terminal calendar that's flexible enough for real world use.
-- [Remind](https://dianne.skoll.ca/projects/remind/) - A *very* flexible, programmable calendar format. [(Better overview here.)](https://blog.thechases.com/posts/remind/)
-- [Org Mode](https://orgmode.org) - The most flexible and expansive productivity playground for text (warning: endless time sink).
+- [When](https://www.lightandmatter.com/when/when.html) - The simplest text file calendar that's flexible enough for real world use.
+- [Remind](https://dianne.skoll.ca/projects/remind/) - The opposite: The most powerful, programmable calendar program ever made (CLI or otherwise) but simple cases are easy and concise.
+ - [(Better overview here.)](https://blog.thechases.com/posts/remind/)
+- [Org Mode](https://orgmode.org) - An expansive productivity playground for text with agenda features, but also a time sink trap for tinkerers.
## See Also
+- [khal](https://github.com/pimutils/khal) - Similar CLI calendar, but stores calendars directly as .ics files.
+- TUI calendar/productivity apps like [Calcurse](https://calcurse.org/), [calcure](https://github.com/anufrievroman/calcure), and maybe [Taskwarrior](https://taskwarrior.org/).
- [Emacs Diary](https://www.gnu.org/software/emacs/manual/html_node/emacs/Format-of-Diary-File.html) - A single agenda/diary file.
- [Plain Text Personal Organizer](https://danlucraft.com/blog/2008/04/plain-text-organizer/)
-- [Calendar.txt](https://terokarvinen.com/2021/calendar-txt/) - A one-day per line text calendar format inspired by [todo.txt](https://todotxt.org/). Very simple but high maintenence due to lack of repeating events, etc.
-- Featureful TUI calendar/productivity apps like [Calcurse](https://calcurse.org/), [calcure](https://github.com/anufrievroman/calcure), [khal](https://github.com/pimutils/khal), and maybe [Taskwarrior](https://taskwarrior.org/). Often it's preferable to manage appointments via the program itself rather than directly editing a text file.
+- [Calendar.txt](https://terokarvinen.com/2021/calendar-txt/) - A one-day per line text calendar idea inspired by [todo.txt](https://todotxt.org/). Very simple but high maintenence due to lack of repeating events, etc.
# License