---------------------------------------- CLI Tricks: remind March 30th, 2021 ---------------------------------------- remind - a sophisticated reminder service One of the little cool CLI utilities I've been meaning to use is remind(1). It's a tool with a plain text, human readable calendar format and some hefty power under the hood. Let's look at an example entry in a reminder file: REM July 6 +7 MSG tomasino's birthday %b% In looking at this line you can have a pretty good guess what it means without any help at all. These insructions can become far more complex and esoteric as you start using the powerful programming features built into remind, but most of your entries are probably going to be as simple as this. The main structure of a remind entry is: <trigger> <action> <body> In the example above the trigger is: REM July 6 +7 The action is: MSG And the body is: tomasino's birthday %b Technically the "REM" at the start is optional, except in some weird cases where the line might begin with OMIT or RUN. It's safest just to keep it. Every line ends in % also. Want the full list of options for a REM line? Sure... REM [ONCE] [date_spec] [back] [delta] [repeat] [PRIORITY prio] [SKIP | BEFORE | AFTER] [OMIT omit_list] [OMITFUNC omit_func‐ tion] [AT time [tdelta] [trepeat]] [SCHED sched_function] [WARN warn_function] [UNTIL expiry_date | THROUGH last_date] [SCAN‐ FROM scan_date | FROM start_date] [DURATION duration] [TAG tag] <MSG | MSF | RUN | CAL | SATISFY | SPECIAL special | PS | PS‐ FILE> body The trigger section is often a date and they follow some really simple and intuitive rules. If you list a full date including day, month, and year, then it will trigger on that day. If you omit the year then it will remind you on that calendar day every year. Omit the month and it will remind you on that day every month. Simple, right? What if you want the reminder to occur for several days leading up to the date? Just like in my example above, the +7 following a date will do that. In my case you get a full week's worth of reminders leading up to my birthday. Date's can be more than just calendar days, though. For instance: REM SUN 1 --7 at 23:30 MSG Tilde Trivia with Tomasino % Here I'm setting the date to the first Sunday of the month, minus seven days at 11:30pm. Well, if you move backwards one week from the first sunday that gets you the last sunday of the month. A nice trick, right? Here we have a reminder for my radio show on tilderadio.org. I should note that all times in remind(1) are in your local timezone. If you are scripting something with external data and need to convert timezones there are functions built in for that, though. So far I've just shown off the MSG action, but there are several others. Most notably there's the RUN action, which lets you execute a program on your machine when the trigger occurs. Perhaps you want to use that to output your todo list every Monday? Or maybe you have it automatically email you a system report on the second Tuesday of the month. There's no limit to the options available. So how do you use it? Well, first you install remind(1). It's available in apt and most other package managers. There's a package for MacOS as well. It will come with two executables: remind(1) and rem(1). The latter is a shortcut that will run remind(1) with the default remind file (normally ~/.reminders, but you can change it with an ENV var). In my .profile I have the environment variable set to use a remind file in XDG_CONFIG_HOME since I like a clean home dir. export DOTREMINDERS=$XDG_CONFIG_HOME/remind/reminders Then inside that 'reminders' file I use a tiny script to automatically include any files that match "*.rem" inside a special syncthing folder: SET HOME getenv("HOME") include [HOME]/.syncthing/remind/ This means I can organize my stuff into relevant files like "work.rem" and "birthdays.rem". There's an incredible amount of depth you can get into with this thing. It can output to a terminal calendar or even an html calendar or just the plain reminders. It can generate a postscript printer file and allows advanced commands for shading. It has a robust programming language built in as well that will make you scratch your head at first and then scoff at the childish limitations of Outlook and Google Calendar. You can even build your own custom functions in this thing. The remind(1) man page is well written and packed full of examples, but there's also some great tutorials online. Here's a few to start your explorations: (HTM) Keep your calendar in plain text with Remind (HTM) Roaring Penguin's Remind FAQ