Defs.rem
Jump to navigation
Jump to search
- Main article: Remind
############################################################################# # # # DEFS.REM # # # # This file is a reminder script, which contains a few handy definitions. # # Cut and paste as desired! Also, near the end, there are a bunch of # # holiday definitions for the U.S. # # # # Some examples provided by George M. Sipe <gsipe@pyratl.ga.pyramid.com> # # # # U.S. holidays provided by Dave Rickel <drickel@sjc.mentorg.com> # # # # Use your text editor to search for: # # "#USHOLS" for U.S. holidays # # "#JHOLS" for Jewish holidays # # "#PSSTUFF" for nifty PostScript examples # # "#COLORS" for examples of ANSI color escape sequences. # # # # This file is part of REMIND. # # Copyright (C) 1992-1997 Dianne Skoll # # Copyright (C) 1999-2000 Roaring Penguin Software Inc. # # # ############################################################################# RUN OFF ################################################ # Ensure required version of remind is used... # ################################################ IF version() < "03.01.08" ERRMSG This file requires at least version 03.01.08 of Remind.% ERRMSG This version is version [version()]. EXIT ENDIF ###################################### # Symbolic constants for weekdays... # ###################################### SET Sunday 0 SET Monday 1 SET Tuesday 2 SET Wednesday 3 SET Thursday 4 SET Friday 5 SET Saturday 6 SET Sun 0 SET Mon 1 SET Tue 2 SET Wed 3 SET Thu 4 SET Fri 5 SET Sat 6 ######################################### # Symbolic constants for month names... # ######################################### SET Jan 1 SET Feb 2 SET Mar 3 SET Apr 4 SET May 5 SET Jun 6 SET Jul 7 SET Aug 8 SET Sep 9 SET Oct 10 SET Nov 11 SET Dec 12 SET January 1 SET February 2 SET March 3 SET April 4 SET May 5 SET June 6 SET July 7 SET August 8 SET September 9 SET October 10 SET November 11 SET December 12 ########################################################### # Other symbolic constants and functions for "pasting"... # ########################################################### SET Quote CHAR(34) # Handy constants/function for specifing week of month... SET Week_1 1 SET Week_2 8 SET Week_3 15 SET Week_4 22 FSET _last(mo) "1 " + MON((mo%12)+1) + " --7" # Handy function to provide SCANFROM dates... FSET _back(days) TODAY()-days ########################################################### # Function which returns a string in "am/pm" format based # # on the time. For example, set a am_pm(NOW())... # ########################################################### FSET _am_pm(tm) IIF(tm<01:00, tm+12*60+"am", \ tm<12:00, tm+"am", \ tm<13:00, tm+"pm", \ tm-12*60+"pm") ################################################################# # Function which removes a single leading zero from a string... # ################################################################# FSET _no_lz(s) IIF(SUBSTR(s, 1, 1)=="0", SUBSTR(s, 2), s) ################################################################# # Return the length of the daylight/night portion of a date, # # in minutes. # ################################################################# FSET _light_len(date) MAX(SUNSET(date)-SUNRISE(date), 0) FSET _dark_len(date) 1440-_light_len(date) ############################################################ # Function to calculate number of years since a given year # # or number of months since a given month and year... # ############################################################ FSET _yr_num(yr) ORD(YEAR(TRIGDATE()) - yr) FSET _mo_num(mo, yr) ORD(12 * (YEAR(TRIGDATE()) - yr) + \ MONNUM(TRIGDATE()) - mo) # Here's an example of how to use them: REM 1 Nov ++12 MSG %"Dean's [_yr_num(1984)] birthday%" is %b. REM 1 MSG Dean's [_mo_num(11, 1984)] 'monthly' anniversary ########################################################### # Function to send mail via elm's "fastmail" (by GMS!)... # ########################################################### #FSET _mail(from, subj) "mailx -s " + \ # Quote + from + " : " + subj + Quote \ # GETENV("LOGNAME") + " < /dev/null 1>&0" FSET _mail(from, subj) "fastmail -f " + \ Quote + from + Quote + \ " -s " + Quote + subj + Quote + \ " /dev/null " + GETENV("LOGNAME") ############################################################################# # Here's a tricky problem: The 4th of July is a holiday in the U.S. # However, if it falls on a Saturday, the previous Friday is a holiday. # If it falls on a Sunday, the next Monday is a holiday. Here's how # to do it. NOTE that the following procedure makes the OMIT context # dependent upon the current date. SInce it only depends on the current # year, which is not likely to change while producing a calendar, we # are fairly safe. However, reminders with huge DELTA or BACK components # may not operate as expected. In general, any time you make OMIT # dependent upon the current date, it's tricky and results may not be # what you expect. You should try to make sure that the OMIT context # "near" any current reminders will not change during a calendar run. # The SCANFROM clause should help make these OMITs very safe. ############################################################################ # Calculate the weekday of the holiday. REM 4 July SCANFROM [_back(7)] SATISFY 1 IF WKDAYNUM(TRIGDATE()) == Sat REM [TRIGDATE()] MSG Independence day (actual) OMIT [TRIGDATE()-1] MSG Independence day (observed) ELSE IF WKDAYNUM(TRIGDATE()) == Sun REM [TRIGDATE()] MSG Independence day (actual) OMIT [TRIGDATE()+1] MSG Independence day (observed) ELSE OMIT [TRIGDATE()] MSG Independence day ENDIF ENDIF ############################################################################ # # # A meeting on the first Monday of every month which is moved to the # # second Monday in the event of a holiday. # # # ############################################################################ # First, the normal meeting. However, the SKIP keyword means this # one won't be triggered if the first Monday is a holiday REM Mon 1 SKIP MSG Meeting # Now, calculate the "potential" delayed meeting REM Mon 8 SATISFY 1 # But only actually trigger the delayed meeting if the previous # Monday was a holiday IF ISOMITTED(TRIGDATE()-7) REM [TRIGDATE()] MSG Delayed meeting ENDIF ############################################################################ # # # A very complicated reminder sent in by a Remind user. # # This person gets paid every two weeks, starting from 8 January 1993. # # If a pay date occurs before the twelfth of a month, then that # # he pays his mortgage on that pay date. Otherwise, he pays the mortgage # # on the previous pay date. Furthermore, he has to schedule his # # mortgage payment six days before it is due. He wants to be reminded # # a further four days before the scheduling deadline. He also # # wants to be mailed a notice two weeks before the scheduling deadline. # # # # Here's the solution - if you can follow this, consider yourself a # # Remind programmer extraordinaire! # # # ############################################################################ # A function to determine whether or not a pay-date is a mortgage-date. FSET _IsMortDate(x) DAY(x) < 12 || (DAY(x+14) >= 12 && DAY(x+14) <= 14) # Paydays - for reference REM 8 Jan 1993 *14 MSG Payday # Calculate the mortgage payment six days ahead of time. Note that this # is done "implicitly" by subtracting 6 from the starting date - we start # on 2 Jan rather than 8 Jan. We add 6 to TRIGDATE() in _IsMortDate to # compensate. REM 2 Jan 1993 *14 ++4 SATISFY [_IsMortDate(TRIGDATE()+6)] \ MSG %"Schedule mortgage payment%" for %a. # Now the mail reminder two weeks before the payment date - because two # weeks before a payment date is also a payment date, no pre-compensation # in the starting date of 8 Jan is necessary - convince yourself of this! # This uses the _mail() function defined earlier. REM ONCE 8 Jan 1993 *14 SATISFY [_IsMortDate(TRIGDATE()+14)] \ RUN [_mail("Decatur Federal", \ "Pay mortgage by the " + ORD(DAY(TRIGDATE()+14)))] # Make an entry on the calendar when the mortgage should be paid REM 8 Jan 1993 *14 SATISFY [_IsMortDate(TRIGDATE())] \ CAL Mortgage payment ########################################################################## # # # On our UNIX system, I run a program which queries the university # # library and creates a file called ".booksdue". This file is # # a REMIND script to tell me when my library books are due. Here's # # an example from my reminder file - it shows the use of filedate(). # # When the .booksdue file is at least 7 days old, I create a new version # # by querying the library computer. Note the use of realtoday() rather # # than today. # # # ########################################################################## IF !$RunOff && !$CalMode && !$SimpleCal IF REALTODAY()-FILEDATE("/home/dfs/.booksdue") >= 7 REM RUN /home/dfs/bilge/library/getbooks ENDIF ENDIF #PSSTUFF1 ########################################################################## # # # This portion of the file contains some cute examples of the new # # PS-type reminders. You need a PostScript printer or viewer to # # appreciate these. To use them, pipe the output of remind -p into the # # rem2ps program. More examples are in the PSSTUFF2 section, below. # # # ########################################################################## # The following reminder will shade the Saturday and Sunday calendar # entries. REM Sat Sun SPECIAL SHADE 220 #USHOLS ############################################################################# # # # The following holidays were provided by Dave Rickel # # Modified by D. Skoll to give safe OMITs for moveable holidays # # # ############################################################################# SET SaveTrig $NumTrig SET easter EASTERDATE(YEAR(TODAY())) REM [easter-46] MSG %"Ash Wednesday%" REM [easter-7] MSG %"Palm Sunday%" OMIT [easter-2] MSG %"Good Friday%" OMIT [easter] MSG %"Easter%" Sunday REM [easter+39] MSG %"Ascension Day%" REM [easter+49] MSG %"Pentecost%" # Some holidays are omitted, some are not. You may want to change # which ones are omitted - use the general forms shown below. # You'll need the _back() function and the Week_n variables defined # way up in the file. OMIT Jan 1 MSG %"New Year's%" Day REM Mon Jan [Week_3] MSG Martin Luther King - %"MLK Day%" REM Feb 2 MSG %"Ground Hog Day%" REM Feb 14 MSG %"Valentine's%" Day REM Mon Feb [Week_3] SCANFROM [_back(7)] SATISFY 1 OMIT [trigdate()] MSG %"President's Day%" REM Mar 17 MSG %"St. Patrick's%" Day # The DST rules are accurate for most locations in # North America REM Sun Apr 1 ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b REM Sun Mar 8 ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST starts%" %b REM Sun [_last(Oct)] ++2 UNTIL 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b REM Sun 1 Nov ++2 FROM 1 Jan 2007 MSG Daylight Saving Time - %"DST ends%" %b REM Apr 1 MSG %"April Fool's%" Day REM Mon Tue Wed Thu Fri Sat 15 Apr MSG %"Income tax%" due REM May 5 MSG %"Cinco de Mayo%" REM Sat May [Week_1] MSG %"Kentucky Derby%" REM Sun May [Week_2] MSG %"Mother's Day%" REM Sat May [Week_3] MSG %"Armed Forces Day%" REM Mon [_last(May)] SCANFROM [_back(7)] SATISFY 1 OMIT [trigdate()] MSG %"Memorial Day%" REM Jun 14 MSG %"Flag Day%" REM Sun Jun [Week_3] MSG %"Father's Day%" REM Mon Sep [Week_1] SCANFROM [_back(7)] SATISFY 1 OMIT [trigdate()] MSG %"Labor Day%" REM Mon Oct [Week_2] MSG %"Columbus Day%" REM Nov 11 MSG %"Veterans Day%" REM Oct 30 MSG %"Mischief Night%" REM Oct 31 MSG %"Halloween%" REM Tue Nov 2 SCANFROM [_back(7)] \ SATISFY [(YEAR(TRIGDATE()) % 4) == 0] \ MSG %"Election%" Day REM Thu Nov [Week_4] SCANFROM [_back(7)] SATISFY 1 OMIT [trigdate()] MSG %"Thanksgiving%" Day REM Fri Nov [Week_4+1] SCANFROM [_back(7)] SATISFY 1 OMIT [trigdate()] MSG %"Thanksgiving%" (cont.) OMIT Dec 24 MSG %"Christmas Eve%" OMIT Dec 25 MSG %"Christmas%" Day ########################################################################## # # # If any US holidays were triggered above, shade in the calendar # # entry in PostScript. This is not quite correct, as it blots out any # # other PostScript stuff above. I was too lazy to do it properly :-) # # # ########################################################################## if $NumTrig > SaveTrig REM SPECIAL SHADE 220 endif # Seasons (valid from 1992 to 2000)... REM Mar 20 MSG %"Spring%" begins REM Jun [IIF(YEAR(TODAY())%4, 21, 20)] MSG %"Summer%" begins REM Sep [CHOOSE(YEAR(TODAY())-1991, 22,22,23,23,22,22,22,23,22)] \ MSG %"Fall%" begins REM Dec [IIF((YEAR(TODAY())+1)%4, 21, 22)] MSG %"Winter%" begins #PSSTUFF2 ########################################################################## # # # Since the SHADE special blots out any previous PostScript # # reminders for a date, these examples need to follow the US Holidays # # section, which uses SHADE. # # # ########################################################################## # The following will fill in the Hebrew dates on the calendar. For this # example, I recommend that you use the -sd 10 option for Rem2PS. REM PS Border Border moveto \ /DayFont findfont DaySize scalefont setfont \ ([hebday(today())] [hebmon(today())]) show # Fill in the phases of the moon on the PostScript calendar [moondate(0)] SPECIAL MOON 0 [moondate(1)] SPECIAL MOON 1 [moondate(2)] SPECIAL MOON 2 [moondate(3)] SPECIAL MOON 3 # The following example puts sunrise and sunset times in PostScript in the # calendar - the sizes are hard-coded, however, and work best in landscape. REM PS Border Border 5 sub moveto \ /SmallFont findfont 4 scalefont setfont \ (Sunrise: [sunrise(trigdate())] Sunset: [sunset(trigdate())]) show # The next one puts the day number (1-366) and days left in the year at the # bottom of the post-script calendar. Again, the hard-coded sizes work best # in landscape. FSET _DayOfYear(x) x-(date(year(x),1,1) - 1) REM PS BoxWidth 3 mul 4 div Border 5 sub moveto \ /SmallFont findfont 4 scalefont setfont \ ([_DayOfYear(today())]([365+isleap(today())-_DayOfYear(today())])) show #JHOLS ########################################################################## # # # This portion of the file contains reminders for Jewish holidays. The # # dates were obtained from "The First Jewish Catalog" by Richard Siegel # # and Michael and Sharon Strassfeld, published by the Jewish Publication # # Society of America. The Reform version of the calendar was guessed # # at by Dianne Skoll based on experience. There is probably no standard # # Reform position on many of the holidays, so you may have to adjust # # the file as required. # # # # Additional corrections were made from the paper "Calendrical # # Calculations" by Nachum Dershowitz and Edward M. Reingold. Any # # further corrections are welcome. # # # ########################################################################## # Here are some general functions that you might find nice to use # _hstr: Returns a string which is the full Hebrew date of its argument. # Example: hstr('1994/02/02') returns "21 Shvat 5754" FSET _hstr(x) HEBDAY(x) + " " + HEBMON(x) + " " + HEBYEAR(x) # _hyrlen: Return the length of the specified Hebrew year # Example: _hyrlen(5754) returns 355 FSET _hyrlen(x) HEBDATE(1, "Tishrey", x+1) - HEBDATE(1, "Tishrey", x) # --- HERE ARE THE JEWISH HOLIDAYS --- # Set the variable InIsrael to 1 if you live in Israel. Otherwise, # you get the Diaspora versions of Jewish holidays SET InIsrael 0 # Set the variable Reform to 1 if you want the Reform version of the # Jewish calendar. Otherwise, you get the traditional version SET Reform 0 # Convenient function definition to save typing FSET _h(x, y) HEBDATE(x,y) FSET _h2(x, y) HEBDATE(x, y, TODAY()-7) FSET _PastSat(x, y) IIF(WKDAYNUM(_h2(x,y))!=6, _h2(x,y), _h2(x,y)+1) FSET _PastSun(x, y) IIF(WKDAYNUM(_h2(x,y))!=0, _h2(x,y), _h2(x,y)+1) FSET _PastMon(x, y) IIF(WKDAYNUM(_h2(x,y))!=1, _h2(x,y), _h2(x,y)+1) # Default values in case InIsrael and Reform are not set SET InIsrael VALUE("InIsrael", 0) SET Reform VALUE("Reform", 0) [_h(1, "Tishrey")] ++4 MSG %"Rosh Hashana 1%" is %b. # No RH-2 or Tzom Gedalia in Reform IF !Reform [_h(2, "Tishrey")] ++4 MSG %"Rosh Hashana 2%" is %b. [_PastSat(3, "Tishrey")] ++4 MSG %"Tzom Gedalia%" is %b. ENDIF [_h(10, "Tishrey")] ++4 MSG %"Yom Kippur%" is %b. [_h(15, "Tishrey")] ++4 MSG %"Sukkot 1%" is %b. IF !InIsrael [_h(16, "Tishrey")] MSG %"Sukkot 2%" ENDIF [_h(21, "Tishrey")] ++4 MSG %"Hoshana Rabba%" is %b. [_h(22, "Tishrey")] ++4 MSG %"Shemini Atzeret%" is %b. IF InIsrael [_h(22, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b. ELSE [_h(23, "Tishrey")] ++4 MSG %"Simchat Torah%" is %b. ENDIF # Because Kislev can change length, we must be more careful about Chanukah FSET _chan(x) HEBDATE(24, "Kislev", today()-9)+x [_chan(1)] ++4 MSG %"Chanukah 1%" is %b. [_chan(2)] MSG %"Chanukah 2%" [_chan(3)] MSG %"Chanukah 3%" [_chan(4)] MSG %"Chanukah 4%" [_chan(5)] MSG %"Chanukah 5%" [_chan(6)] MSG %"Chanukah 6%" [_chan(7)] MSG %"Chanukah 7%" [_chan(8)] MSG %"Chanukah 8%" # Not sure about Reform's position on the next one. IF !Reform # 10 Tevet will never be a Saturday, so whether or not to # move it is moot. (Thanks to Art Werschulz.) [_h(10, "Tevet")] MSG %"Tzom Tevet%" is %b. ENDIF [_h(15, "Shvat")] ++4 MSG %"Tu B'Shvat%" is %b. [_h(14, "Adar A")] ++4 MSG %"Purim Katan%" is %b. [_h(15, "Adar A")] ++4 MSG %"Shushan Purim Katan%" is %b. # If Purim is on Sunday, then Fast of Esther is 11 Adar. IF WKDAYNUM(_h2(13, "Adar")) != 6 REM [_h2(13, "Adar")] ++4 MSG %"Fast of Esther%" is %b. ELSE REM [_h2(11, "Adar")] ++4 MSG %"Fast of Esther%" is %b. ENDIF [_h(14, "Adar")] ++4 MSG %"Purim%" is %b. [_h(15, "Adar")] ++4 MSG %"Shushan Purim%" is %b. [_h(15, "Nisan")] ++4 MSG %"Pesach%" is %b. IF !InIsrael [_h(16, "Nisan")] MSG %"Pesach 2%" ENDIF [_h(21, "Nisan")] MSG %"Pesach 7%" IF !InIsrael && !Reform [_h(22, "Nisan")] MSG %"Pesach 8%" ENDIF REM [_PastSun(27, "Nisan")] SATISFY 1 IF $Tw == 5 REM [_PastSun(26, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b. ELSE REM [_PastSun(27, "Nisan")] ++4 MSG %"Yom HaShoah%" is %b. ENDIF # If 4 Iyar is a Thursday or Friday, then Yom Hazikaron is # the Wednesday before and Yom Ha'atzmaut is on # Thursday. If 4 Iyar is a Sunday, then Yom Hazikaron # moves to 5 Iyar and Yom Ha'atzmaut to 6 Iyar. IF WKDAYNUM(_h2(4, "Iyar")) == 4 || WKDAYNUM(_h2(4, "Iyar")) == 5 [_h(2, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b. [_h(3, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b. ELSE IF WKDAYNUM(_h2(4, "Iyar")) == 0 [_h(5, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b. [_h(6, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b. ELSE [_h(4, "Iyar")] ++4 MSG %"Yom Hazikaron%" is %b. [_h(5, "Iyar")] ++4 MSG %"Yom Ha'atzmaut%" is %b. ENDIF ENDIF # Not sure about Reform's position on Lag B'Omer IF !Reform [_h(18, "Iyar")] ++4 MSG %"Lag B'Omer%" is %b. ENDIF [_h(28, "Iyar")] ++4 MSG %"Yom Yerushalayim%" is %b. [_h(6, "Sivan")] ++4 MSG %"Shavuot%" is %b. IF !InIsrael && !Reform [_h(7, "Sivan")] MSG %"Shavuot 2%" ENDIF # Fairly sure Reform Jews don't observe the next two IF !Reform # Tzom Tamuz and Tish'a B'Av are moved to Sunday if they normally # fall on a Saturday [_PastSat(17, "Tamuz")] ++4 MSG %"Tzom Tammuz%" is %b. [_PastSat(9, "Av")] ++4 MSG %"Tish'a B'Av%" is %b. ENDIF # Counting the omer - do the whole spiel, i.e: # "This is the xth day of the omer, being y weeks and z days of the omer." # Nice Remind programming example here! SET ostart HEBDATE(16, "Nisan", TODAY()-50) IF ostart <= TODAY() && (TODAY() - ostart < 49) SET odays TODAY()-ostart+1 IF odays < 7 MSG %"%"Today is the [ORD(odays)] day of the Omer. ELSE IF !(odays % 7) MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays / 7] [PLURAL(odays/7, "week")] of the Omer. ELSE MSG %"%"Today is the [ORD(odays)] day of the Omer, being [odays/7] [PLURAL(odays/7, "week")] and [odays%7] [PLURAL(odays%7, "day")] of the Omer. ENDIF ENDIF CAL [ORD(odays)] of Omer ENDIF ### Candle lighting and Havdalah. You should probably add candle lighting ### for other holidays besides Shabbat. These just create calendar entries ### for Friday and Saturday. Note: You must set your latitude, longitude ### and possibly time zone for these to work properly! REM Friday CAL Candle lighting at [sunset(trigdate())-18] REM Saturday CAL Havdalah at [sunset(trigdate())+42] #COLORS ########################################################################## # # # This contains sample ANSI escape sequences for coloring messages. # # It should work on an IBM PC with the ANSI.SYS driver, and on # # other terminals which use the ANSI sequences. # # # # This information was provided by Gail Gurman. # # ########################################################################## # Colors - use Nrm to reset to normal text. SET Esc CHAR(27) SET Nrm Esc + "[0m" SET Blk Esc + "[0;30m" SET Red Esc + "[0;31m" SET Grn Esc + "[0;32m" SET Ylw Esc + "[0;33m" SET Blu Esc + "[0;34m" SET Mag Esc + "[0;35m" SET Cyn Esc + "[0;36m" SET Wht Esc + "[0;37m" SET Gry Esc + "[30;1m" SET BrRed Esc + "[31;1m" SET BrGrn Esc + "[32;1m" SET BrYlw Esc + "[33;1m" SET BrBlu Esc + "[34;1m" SET BrMag Esc + "[35;1m" SET BrCyn Esc + "[36;1m" SET BrWht Esc + "[37;1m" # Examples REM MSG A [Blu]blue[Nrm] reminder. REM MSG [Red]%"A red reminder%" safe to use in the calendar mode.[Nrm] # Here is an example of how to use msgprefix() and msgsuffix(). These # will highlight priority-0 reminders in bright red, # priority-2500 in red, and priority-7500 in blue. All others # will be in the normal colors FSET msgprefix(x) iif(x==0, BrRed, x==2500, Red, x==7500, Blu, Nrm) # Don't forget to return to normal color set at the end of reminder! FSET msgsuffix(x) Nrm # The next examples are great for putting right at the end of the reminder # file. They make queued reminders more eye-catching when they pop up. FSET msgprefix(x) char(13,10,13,10)+"******************"+char(13,10,13,10) FSET msgsuffix(x) char(13,10)+"******************"+char(13,10,13,10)