32.10.5 Special Diary Entries

In addition to entries based on calendar dates, the diary file can contain sexp entries for regular events such as anniversaries. These entries are based on Lisp expressions (sexps) that Emacs evaluates as it scans the diary file. Instead of a date, a sexp entry contains ‘%%’ followed by a Lisp expression which must begin and end with parentheses. The Lisp expression determines which dates the entry applies to.

Calendar mode provides commands to insert certain commonly used sexp entries:

i a

Add an anniversary diary entry for the selected date (diary-insert-anniversary-entry).

i b

Add a block diary entry for the current region (diary-insert-block-entry).

i c

Add a cyclic diary entry starting at the date (diary-insert-cyclic-entry).

If you want to make a diary entry that applies to the anniversary of a specific date, move point to that date and use the i a command. This displays the end of your diary file in another window and inserts the anniversary description; you can then type the rest of the diary entry. The entry looks like this:

%%(diary-anniversary 10 31 1988) Arthur's birthday

This entry applies to October 31 in any year after 1988; ‘10 31 1988’ specifies the date. (If you are using the European or ISO calendar style, the input order of month, day and year is different.) The reason this expression requires a beginning year is that advanced diary functions can use it to calculate the number of elapsed years.

A block diary entry applies to a specified range of consecutive dates. Here is a block diary entry that applies to all dates from June 24, 2012 through July 10, 2012:

%%(diary-block 6 24 2012 7 10 2012) Vacation

The ‘6 24 2012’ indicates the starting date and the ‘7 10 2012’ indicates the stopping date. (Again, if you are using the European or ISO calendar style, the input order of month, day and year is different.)

To insert a block entry, place point and the mark on the two dates that begin and end the range, and type i b. This command displays the end of your diary file in another window and inserts the block description; you can then type the diary entry.

Cyclic diary entries repeat after a fixed interval of days. To create one, select the starting date and use the i c command. The command prompts for the length of interval, then inserts the entry, which looks like this:

%%(diary-cyclic 50 3 1 2012) Renew medication

This entry applies to March 1, 2012 and every 50th day following; ‘3 1 2012’ specifies the starting date. (If you are using the European or ISO calendar style, the input order of month, day and year is different.)

All three of these commands make marking diary entries. To insert a nonmarking entry, give a prefix argument to the command. For example, C-u i a makes a nonmarking anniversary diary entry.

Marking sexp diary entries in the calendar can be time-consuming, since every date visible in the calendar window must be individually checked. So it’s a good idea to make sexp diary entries nonmarking (with ‘&’) when possible.

Another sophisticated kind of sexp entry, a floating diary entry, specifies a regularly occurring event by offsets specified in days, weeks, and months. It is comparable to a crontab entry interpreted by the cron utility. Here is a nonmarking, floating diary entry that applies to the fourth Thursday in November:

&%%(diary-float 11 4 4) American Thanksgiving

The 11 specifies November (the eleventh month), the 4 specifies Thursday (the fourth day of the week, where Sunday is numbered zero), and the second 4 specifies the fourth Thursday (1 would mean “first”, 2 would mean “second”, −2 would mean “second-to-last”, and so on). The month can be a single month or a list of months. Thus you could change the 11 above to ‘'(1 2 3)’ and have the entry apply to the last Thursday of January, February, and March. If the month is t, the entry applies to all months of the year.

%%(diary-offset '(diary-float t 3 4) 2) Monthly committee meeting

This entry applies to the Saturday after the third Thursday of each month. The 2 specifies number of days after when the sexp '(diary-float t 3 4) would evaluate to t. This is useful when for example your organization has a committee meeting two days after every monthly meeting which takes place on the third Thursday, or if you would like to attend a virtual meeting scheduled in a different timezone causing a difference in the date.

Each of the standard sexp diary entries takes an optional parameter specifying the name of a face or a single-character string to use when marking the entry in the calendar. Most generally, sexp diary entries can perform arbitrary computations to determine when they apply. See Sexp Entries and the Fancy Diary Display.