.TH REMIND 1 "2026-06-05" "Remind" "VERSION 06.02.07" .SH "نام (NAME)" remind \- یک سرویس پیشرفته یادآوری .SH "کتابچه راهنمای رمایند (THE BOOK OF REMIND)" این صفحه راهنما یک \fIمرجع\fR خوب برای Remind است. با این حال، اگر مبتدی هستید و می‌خواهید Remind را \fIیاد بگیرید\fR، پیشنهاد می‌کنم «کتابچه راهنمای رمایند» (The Book of Remind) را از صفحه اصلی Remind در نشانی اینترنتی زیر بارگیری کنید: .PP .nf https://dianne.skoll.ca/projects/remind .fi .SH "خلاصه دستور (SYNOPSIS)" .B remind [\fIoptions\fR] \fIfilename\fR [\fIdate\fR] [\fI*rep\fR] [\fItime\fR] .SH "توضیحات (DESCRIPTION)" دستور \fBRemind\fR فایل \fIfilename\fR ارائه‌شده را می‌خواند و دستورات موجود در آن را اجرا می‌کند. این دستورات برای صدور یادآوری‌ها و هشدارها به کار می‌روند. هر یادآوری یا هشدار می‌تواند شامل پیامی باشد که به خروجی استاندارد فرستاده می‌شود، یا برنامه‌ای باشد که باید اجرا شود. .PP اگر \fIfilename\fR به صورت یک خط تیره منفرد '-' مشخص شود، آنگاه \fBRemind\fR ورودی خود را از ورودی استاندارد دریافت می‌کند. در این حالت، اگر \fBRemind\fR با کتابخانه GNU Readline کامپایل شده باشد، از Readline برای ارائه یک رابط تعاملی ویرایش خط استفاده خواهد کرد. .PP اگر \fIfilename\fR به جای یک فایل معمولی یک دایرکتوری باشد، آنگاه \fBRemind\fR تمام فایل‌های موجود در آن دایرکتوری را که با الگوی "*.rem" مطابقت دارند (اما نه هیچ زیردایرکتوری را!) می‌خواند. فایل‌ها به ترتیب مرتب‌شده خوانده می‌شوند؛ ترتیب مرتب‌سازی ممکن است به محلی‌سازی (locale) شما بستگی داشته باشد، اما باید با ترتیب مرتب‌سازی شل هنگام بسط دادن "*.rem" مطابقت داشته باشد. .PP دستور \fBRemind\fR فایل‌های خود را از ابتدا تا انتها می‌خواند، یا تا زمانی که به خطی برسد که محتوای آن تنها "__EOF__" باشد (بدون علامت نقل‌قول). هر چیزی پس از نشانگر __EOF__ کاملاً نادیده گرفته می‌شود. .SH "حالت‌های عملکرد (MODES OF OPERATION)" دستور \fBRemind\fR دارای چهار حالت اصلی عملکرد است: .TP .B Agenda Mode حالت دستور کار (Agenda mode)، حالت پیش‌فرض است. در این حالت، \fBRemind\fR یادآوری‌های امروز را در خروجی استاندارد چاپ کرده و خارج می‌شود. همچنین ممکن است یک فرایند پس‌زمینه را برای نمایش یادآوری‌های صف‌بندی‌شده برای ساعات بعدی روز منشعب (fork) کند. .TP .B Calendar Mode در این حالت، \fBRemind\fR یک تقویم تولید می‌کند؛ یا با رسم آن در ترمینال یا با ارسال داده‌ها در قالبی خوانا برای رایانه به یک برنامه پشتیبان که تقویم را واقعاً رسم می‌کند. .TP .B Daemon Mode این یک حالت عملکرد ویژه است که در آن \fBRemind\fR توسط یک برنامه فرانت‌اند فراخوانی شده و به عنوان یک دیمن اجرا می‌شود، درخواست‌ها را از فرانت‌اند می‌پذیرد و پیام‌ها را به فرانت‌اند بازمی‌گرداند. \fBTkRemind\fR از \fBRemind\fR در حالت دیمن استفاده می‌کند. .TP .B Purge Mode در این حالت، \fBRemind\fR هیچ خروجی تولید نمی‌کند، اما نسخه‌های جدیدی از فایل‌های ورودی خود می‌سازد که تمام یادآوری‌های منقضی‌شده در آن‌ها کامنت شده‌اند. .SH "گزینه‌ها (OPTIONS)" دستور \fBRemind\fR گزینه‌های بسیار زیادی دارد. اگر به تازگی با این برنامه آشنا شده‌اید، فعلاً آن‌ها را نادیده بگیرید و به بخش "فایل‌های یادآوری (REMINDER FILES)" بروید. .TP .B \-n گزینه \fB\-n\fR باعث می‌شود \fBRemind\fR رخداد \fBبعدی\fR هر یادآوری را در قالبی ساده از تقویم چاپ کند. می‌توانید با هدایت خروجی از طریق لوله به \fBsort(1)\fR آن را بر اساس تاریخ مرتب کنید. توجه داشته باشید که گزینه \fB\-n\fR باعث می‌شود هر گزینه \fB\-g\fR \fIنادیده گرفته شود\fR و همچنین به طور ضمنی گزینه \fB\-o\fR را فعال می‌کند. .TP .B \-j\fR[\fIn\fR] اجرای \fBRemind\fR در حالت "پاک‌سازی" (purge) برای خلاص شدن از یادآوری‌های منقضی‌شده. برای جزئیات به بخش PURGE MODE مراجعه کنید. .TP .B \-r گزینه \fB\-r\fR دستورالعمل‌های \fBRUN\fR و تابع \fBshell()\fR را غیرفعال می‌کند. .TP .B \-c\fI[flags]\fIn\fR گزینه \fB\-c\fR باعث می‌شود \fBRemind\fR تقویمی تولید کند که به خروجی استاندارد فرستاده می‌شود. اگر عددی مانند \fIn\fR ارائه دهید، تقویمی برای \fIn\fR ماه، با شروع از ماه جاری تولید خواهد شد. به طور پیش‌فرض، تقویم فقط برای ماه جاری تولید می‌شود. این گزینه به طور ضمنی گزینه \fB\-o\fR را فعال می‌کند. .RS .PP می‌توانید قبل از \fIn\fR (در صورت وجود) مجموعه‌ای از فلگ‌ها را قرار دهید. فلگ‌ها به شرح زیر هستند: .TP .B '+' باعث می‌شود تقویمی برای \fIn\fR هفته تولید شود. .TP .B 'a' باعث می‌شود \fBRemind\fR یادآوری‌ها را در تقویم، هم در روز وقوع واقعی آن‌ها \fIو هم\fR در هر روز قبل از آن که با \fIdelta\fR یادآوری مشخص شده باشد، نمایش دهد. این کار \fIهمچنین\fR باعث می‌شود \fBRemind\fR متنی را که خارج از توالی‌های %"...%" قرار دارد و در غیر این صورت حذف می‌شد، بگنجاند (اگرچه خود نشانگرهای %" حذف می‌شوند). \"" Add comment to avoid Emacs highlighting problems .TP .B 'l' باعث می‌شود \fBRemind\fR از نویسه‌های خط‌کشی VT100 برای رسم تقویم استفاده کند. این نویسه‌ها به صورت ثابت کدگذاری شده‌اند و فقط روی ترمینال‌هایی کار می‌کنند که مجموعه نویسه‌های خط‌کشی VT100 را شبیه‌سازی نمایند. .TP .B 'u' مشابه 'l' است، اما باعث می‌شود \fBRemind\fR از نویسه‌های خط‌کشی UNICODE برای رسم تقویم استفاده کند. این نویسه‌ها به صورت ثابت کدگذاری شده‌اند و فقط روی ترمینال‌هایی که روی کدگذاری نویسه UTF-8 تنظیم شده باشند کار می‌کنند. این فلگ همچنین استفاده از نشانگر «چپ‌به‌راست» یونی‌کد را فعال می‌کند که می‌تواند مشکلات قالب‌بندی زبان‌های راست‌به‌چپ را در نمایش تقویم برطرف سازد. .TP .B 'z' دارای اثر تنظیم متغیر سیستمی \fB$TerminalHyperlinks\fR روی 1 است. مستندات این متغیر را در بخش "SYSTEM VARIABLES" ببینید. .TP .B 'c' باعث می‌شود \fBRemind\fR از توالی‌های گریز VT100 برای تقریبی کردن یادآوری‌های SPECIAL COLOR استفاده کند. توجه داشته باشید که این فلگ برای سازگاری با گذشته حفظ شده است؛ به جای آن باید از گزینه خط فرمان \fB\-@\fI[n][,m][,b]\fR استفاده کنید. .PP در یک لوکال UTF-8، برنامه \fBRemind\fR هنگام ایجاد تقویم با گزینه \fB\-c\fR از «نشانگرهای چپ‌به‌راست» استفاده خواهد کرد. برخی ترمینال‌ها این مورد را به درستی مدیریت نمی‌کنند و نمایش تقویم را به هم می‌ریزند؛ برای راه حل، مستندات \fB$SuppressLRM\fR را در بخش "SYSTEM VARIABLES" ببینید. .RE .TP .B \-@\fR[\fIn\fR][,\fIm\fR][,\fIb\fR] به \fBRemind\fR می‌گوید یادآوری‌های SPECIAL COLOR و SHADE را با استفاده از توالی‌های گریز VT100 تقریب بزند. این تقریب (به ناچار) بسیار نادقیق است، زیرا VT100 فقط هشت توالی رنگ مختلف دارد که هر کدام یکی از دو میزان روشنایی را دارند. مؤلفه رنگ بزرگ‌تر از ۶۴ به عنوان "روشن" در نظر گرفته می‌شود، و اگر هر یک از سه مؤلفه رنگ بزرگ‌تر از ۱۲۸ باشد، رنگ "درخشان" (bright) تلقی می‌شود. .RS .PP اگر پارامترهای عددی اختیاری را ارائه دهید، معانی زیر را خواهند داشت: \fIn\fR=0 به \fBRemind\fR می‌گوید از ۱۶ رنگ استاندارد VT100 استفاده کند. \fIn\fR=1 به آن می‌گوید از یک پالت توسعه‌یافته ۲۵۶ رنگی که توسط بسیاری از شبیه‌سازهای ترمینال مانند xterm پشتیبانی می‌شود استفاده کند. و \fIn\fR=2 به آن می‌گوید از توالی‌های گریزی استفاده کند که از رنگ‌های واقعی ۲۴ بیتی (true color) پشتیبانی می‌کنند، که باز هم توسط بسیاری از شبیه‌سازهای ترمینال مانند xterm پشتیبانی می‌شود. .PP اگر پارامتر اختیاری \fIm\fR پس از یک کاما ارائه شود، آنگاه \fIm\fR=0 به \fBRemind\fR می‌گوید که پس‌زمینه ترمینال تیره است، و \fBRemind\fR رنگ‌های تیره را روشن‌تر می‌کند تا قابل مشاهده باشند. اگر \fIm\fR=1 باشد، آنگاه \fBRemind\fR فرض می‌کند پس‌زمینه ترمینال روشن است و رنگ‌های روشن را تیره می‌کند تا قابل دیدن شوند. اگر \fIm\fR به صورت 2 مشخص شود، آنگاه \fBRemind\fR هیچ تنظیمی انجام نمی‌دهد، و در صورتی که رنگ بیش از حد به رنگ پس‌زمینه ترمینال نزدیک باشد، دیدن برخی یادآوری‌ها ممکن است سخت یا غیرممکن شود. اگر به جای عدد، حرف \fBt\fR را وارد کنید، آنگاه \fBRemind\fR تلاش می‌کند رنگ پس‌زمینه ترمینال را حدس بزند، \fIحتی اگر\fR خروجی استاندارد یک ترمینال نباشد. .PP هنگام راه‌اندازی، اگر خروجی استاندارد یک ترمینال باشد، \fBRemind\fR با ارسال یک توالی گریز ویژه جهت تعیین رنگ پس‌زمینه، تلاش می‌کند تشخیص دهد که آیا پس‌زمینه ترمینال تیره است یا روشن. پارامتر \fIm\fR می‌تواند این بررسی را لغو کند (یا اگر \fIm\fR به صورت \fBt\fR داده شود، آن را اجبار کند). .PP اگر پارامتر اختیاری \fIb\fR پس از یک کاما ارائه شود، آنگاه \fIb=0\fR به \fBRemind\fR می‌گوید که یادآوری‌های SPECIAL SHADE را نادیده بگیرد (پیش‌فرض) و \fIb=1\fR به \fBRemind\fR می‌گوید که یادآوری‌های SPECIAL SHADE را با انتشار کدهای گریز VT100 برای رنگ‌آمیزی پس‌زمینه خانه تقویم رعایت کند. توجه داشته باشید که SHADE به خوبی کار نمی‌کند مگر اینکه از پالت گسترده ۲۵۶ رنگی (\fIn\fR=1) یا رنگ‌های واقعی ۲۴ بیتی (\fIn\fR=2) استفاده کنید. توجه داشته باشید که برای خانه‌های تقویمی که سایه‌دار هستند، سازوکار محدودسازی روشنایی که پیش‌تر برای \fIm=0\fR یا \fIm=1\fR شرح داده شد اعمال نمی‌شود؛ فرض بر این است که اگر \fIهم\fR رنگ پیش‌زمینه یک یادآوری و \fIهم\fR رنگ پس‌زمینه یک خانه را تنظیم کرده‌اید، می‌دانید چه کاری انجام می‌دهید. .RE .TP .B \-w\fR\fIcol\fR[,\fIpad\fR[,\fIspc\fR[,\fIspc2\fR]]]] گزینه \fB\-w\fR عرض خروجی، فاصله‌گذاری حاشیه (padding) و فاصله‌گذاری بینابینی (spacing) خروجی تقویم قالب‌بندی‌شده را مشخص می‌کند. مقدار \fICol\fR تعداد ستون‌ها را در دستگاه خروجی مشخص می‌کند. اگر \fIcol\fR مشخص نشود، یا به صورت 0 مشخص شود، پیش‌فرض آن مقدار بزرگ‌تر میان ۷۱ یا عرض واقعی ترمینال شما خواهد بود، یا اگر خروجی استاندارد یک ترمینال نباشد، برابر با ۸۰ است. اگر \fIcol\fR به صورت حرف \fBt\fR مشخص شود، آنگاه \fBRemind\fR تلاش می‌کند عرض دستگاه ترمینال \fB/dev/tty\fR را به دست آورد. این مورد برای مثال زمانی مفید است که خروجی تقویم را از طریق لوله به \fBless\fR می‌فرستید؛ حتی اگر خروجی استاندارد یک پایپ باشد، می‌خواهید اندازه تقویم به درستی برای پنجره ترمینال شما تنظیم شود: .RS .PP .nf remind -c -wt .reminders | less .fi .RE .RS .PP توجه داشته باشید که مقدار \fIcol\fR همچنین برای تنظیم متغیر سیستمی $FormWidth استفاده می‌شود که با \fIcol\fR - 8 مقداردهی اولیه می‌گردد. برای جزئیات به "SYSTEM VARIABLES" مراجعه کنید. .PP مقدار \fIPad\fR مشخص می‌کند که از چند خط برای «پر کردن» (padding) خانه‌های خالی تقویم استفاده شود. مقدار پیش‌فرض آن ۵ است. اگر در روزهای خاصی یادآوری‌های زیادی دارید که باعث می‌شود تقویم شما برای جا شدن در یک صفحه بیش از حد بزرگ شود، می‌توانید با کاهش \fIpad\fR خانه‌های خالی را کوچک‌تر کنید. مقدار \fISpc\fR مشخص می‌کند که چند خط خالی بین شماره روز و اولین مدخل یادآوری باقی بماند که پیش‌فرض آن ۱ است. مقدار \fIspc2\fR ممکن است 0 یا 1 باشد و مشخص می‌کند که آیا خطوط خالی بین یادآوری‌های مربوط به یک روز چاپ شوند یا خیر. مقدار پیش‌فرض 1 است که باعث چاپ خطوط خالی می‌شود. .PP هر یک از مقادیر \fIcol\fR، \fIpad\fR یا \fIspc\fR را می‌توان نادیده گرفت، به شرطی که تعداد درستی از کاماها را وارد کنید. در این گزینه از هیچ فاصله‌ای (space) استفاده نکنید. .RE .TP .B \-s\fR[\fBa\fR]\fIn\fR گزینه \fB\-s\fR بسیار شبیه به گزینه \fB\-c\fR است، با این تفاوت که تقویم خروجی قالب‌بندی نمی‌شود. این تقویم در یک "قالب ساده" فهرست می‌شود که می‌تواند به عنوان ورودی برای برنامه‌های پیشرفته‌تر رسم تقویم به کار رود. اگر \fIn\fR با "+" شروع شود، به عنوان تعداد هفته‌ها تفسیر می‌شود. این گزینه همچنین به طور ضمنی گزینه \fB\-o\fR را فعال می‌کند. اگر بلافاصله پس از \fBs\fR حرف \fBa\fR را قرار دهید، آنگاه \fBRemind\fR یادآوری‌ها را در تقویم، هم در روز وقوع واقعی آن‌ها \fIو هم\fR در روزهای قبل از آن که توسط \fIdelta\fR یادآوری مشخص شده است نمایش می‌دهد. .TP .B \-p\fR[\fBa\fR][\fBp\fR][\fBp\fR][\fBq\fR][+]\fIn\fR گزینه \fB\-p\fR بسیار شبیه به گزینه \fB\-s\fR است، با این تفاوت که خروجی حاوی اطلاعات اضافی برای استفاده توسط یک برنامه پشتیبان مانند برنامه \fBRem2PS\fR (که تقویم PostScript تولید می‌کند) و سایر برنامه‌های پشتیبان گوناگون است. اگر \fIn\fR با "+" شروع شود، به جای تعداد ماه‌ها، تعداد هفته‌ها را مشخص می‌کند و از برنامه‌های پشتیبان انتظار می‌رود تقویم‌های هفتگی تولید کنند. توجه داشته باشید که همه برنامه‌های پشتیبان از تقویم‌های هفتگی پشتیبانی نمی‌کنند؛ در حال حاضر فقط \fBrem2pdf\fR و \fBrem2html\fR این کار را انجام می‌دهند. مشخص کردن تقویم هفتگی به طور ضمنی قالب تبادل خالص JSON را فعال می‌کند، مشابه \fB\-ppp\fR. .RS .PP قالب خروجی \fB\-p\fR در صفحه راهنمای \fBrem2ps(1)\fR شرح داده شده است. اگر بلافاصله پس از \fBp\fR حرف \fBa\fR را قرار دهید، آنگاه \fBRemind\fR یادآوری‌ها را در تقویم، هم در روز وقوع واقعی آن‌ها \fIو هم\fR در روزهای قبل از آن که توسط \fIdelta\fR یادآوری مشخص شده است نمایش می‌دهد. اگر بعد از \fBp\fR یک \fBp\fR دیگر بیاورید، آنگاه \fBRemind\fR به جای قالب "تقویم ساده"، از قالب جامع‌تری مبتنی بر JSON استفاده می‌کند. این قالب نیز در صفحه راهنمای \fBrem2ps(1)\fR مستند شده است. در نهایت، اگر از سه p استفاده کنید، مانند \fB\-ppp\fR، آنگاه \fBRemind\fR از یک قالب خالص JSON استفاده می‌کند که آن هم در \fBrem2ps(1)\fR مستند شده است. اگر حرف \fBq\fR را در این گزینه بگنجانید، فیلتر جایگزینی معمول حالت تقویم غیرفعال شده و توالی‌های %"...%" در خروجی حفظ می‌شوند. .PP توجه داشته باشید که برای ارسال رشته‌های INFO به یک برنامه پشتیبان، باید از \fB\-pp\fR یا \fB\-ppp\fR استفاده کنید. قالب ساده‌تر \fB\-p\fR قادر به انتقال رشته‌های INFO به برنامه پشتیبان نیست. .PP گزینه‌های \fB\-p\fR، \fB\-pp\fR و \fB\-ppp\fR به طور ضمنی گزینه \fB\-o\fR را فعال می‌کنند. .PP توجه داشته باشید که گزینه‌های \fB\-pp\fR یا \fB\-ppp\fR همچنین گزینه \fB\-l\fR را فعال می‌کنند. .RE .TP .B \-l اگر از گزینه \-l به همراه گزینه \-p استفاده کنید، آنگاه \fBRemind\fR اطلاعات اضافی برای برنامه‌های پشتیبان مانند \fBrem2ps\fR خروجی می‌دهد. این اطلاعات اضافی به برنامه‌های پشتیبان اجازه می‌دهد تا یک یادآوری را با فایل منبع و شماره خط تولیدکننده آن تطبیق دهند. .TP .B \-m گزینه \fB\-m\fR باعث می‌شود گزینه‌های \fB\-c\fR یا \fB\-p\fR تقویمی تولید کنند که ستون اول آن به جای یکشنبه، دوشنبه باشد. (این مطابق با استاندارد بین‌المللی است.) .TP .B \-v گزینه \fB\-v\fR خروجی \fBRemind\fR را کمی با جزئیات بیشتر (verbose) می‌کند. در حال حاضر، این باعث می‌شود \fBRemind\fR در صورت بروز خطا خط نادرست را تکرار کند، و اگر اسکریپتی متغیر سیستمی $RunOff را بررسی کند، یک پیام امنیتی چاپ کند. .TP .B \-o گزینه \fB\-o\fR باعث می‌شود \fBRemind\fR تمام دستورالعمل‌های \fBONCE\fR را نادیده بگیرد. توجه داشته باشید که در صورت استفاده از هر یک از گزینه‌های \fB\-c\fR، \fB\-n\fR، \fB\-p\fR، یا \fB\-s\fR، در صورت استفاده از ضریب تکرار \fB*n\fR، یا در صورتی که تاریخی غیر از تاریخ امروز در خط فرمان مشخص شده باشد، \fBONCE\fR نیز نادیده گرفته می‌شود. .TP .B \-t گزینه \fB\-t\fR باعث می‌شود \fBRemind\fR تمام یادآوری‌های منقضی‌نشده را بدون در نظر گرفتن \fIdelta\fR مشخص‌شده برای هر یادآوری، فعال (trigger) کند. .TP .B \-t\fR\fIn\fR اگر بعد از گزینه \fB\-t\fR عددی به صورت \fIn\fR ارائه دهید، آنگاه \fBRemind\fR فرض می‌کند هر دستور \fBREM\fR فارغ از هر دلتای موجود، دارای دلتایی به صورت ++\fIn\fR است. .TP .B \-tz\fR اگر بعد از گزینه \fB\-t\fR حرف \fBz\fR را وارد کنید، آنگاه \fBRemind\fR دلتای تمام دستورات REM را فارغ از مقدار ارائه‌شده در خود عبارت REM برابر صفر قرار می‌دهد. در عمل، این کار تمام دلتاهای به شکل \fB+\fIn\fR و \fB++\fIn\fR را غیرفعال می‌کند. .TP .B \-tt\fR[\fIn\fR] گزینه \fB-tt\fR باعث می‌شود \fBRemind\fR یک دلتای پیش‌فرض \fIn\fR دقیقه‌ای را برای تمام یادآوری‌های زمان‌دار در نظر بگیرد. اگر \fB\-tt\fR بدون \fIn\fR داده شود، یک دلتای پیش‌فرض ۵ دقیقه‌ای استفاده می‌شود. .TP .B \-h گزینه \fB\-h\fR (سکوت یا "hush...") پیام‌های هشدار و اطلاعاتی خاصی را سرکوب می‌کند. به ویژه، اگر هیچ یادآوری فعال نشود، این حالت هیچ خروجی تولید نمی‌کند. .TP .B \-a گزینه \fB\-a\fR باعث می‌شود \fBRemind\fR یادآوری‌های زمان‌داری را که در روز جاری فعال می‌شوند، بلافاصله فعال نکند. همچنین باعث می‌شود \fBRemind\fR یادآوری‌های زمان‌دار را در تقویم قرار ندهد. اگر دو یا چند گزینه \fB\-a\fR ارائه دهید، آنگاه \fBRemind\fR یادآوری‌های زمان‌داری را که در آینده هستند فعال \fIخواهد کرد\fR، اما یادآوری‌های زمان‌داری را که زمان آن‌ها سپری شده است فعال نمی‌کند. (صرف‌نظر از اینکه چند گزینه \fB\-a\fR ارائه دهید، در صورت استفاده از حداقل یک گزینه \fB\-a\fR، \fBRemind\fR یادآوری‌های زمان‌دار را در تقویم نخواهد گنجاند.) .TP \fB\-q\fR گزینه \fB\-q\fR باعث می‌شود \fBRemind\fR یادآوری‌های زمان‌دار را برای اجرای بعدی در صف قرار ندهد. .TP \fB\-f\fR گزینه \fB\-f\fR باعث می‌شود \fBRemind\fR هنگام پردازش یادآوری‌های صف‌بندی‌شده به جای ایجاد یک فرایند پس‌زمینه برای مدیریت آن‌ها، در پیش‌زمینه باقی بماند. .TP .B \-e گزینه \fB\-e\fR پیام‌های خطا را (که معمولاً به جریان خطای استاندارد ارسال می‌شوند) به جریان خروجی استاندارد هدایت می‌کند. .TP .B \-d\fR\fIchars\fR گزینه \fB-d\fR حالت‌های اشکال‌زدایی خاصی را فعال می‌کند. نویسه‌های \fIchars\fR مشخص می‌کنند کدام حالت‌ها فعال شوند: .RS .TP .B e تکرار (Echo) تمام خطوط ورودی .TP .B x ردیابی ارزیابی تمام عبارت‌ها .TP .B t نمایش تمام محاسبات تاریخ راه‌اندازی (trigger date) .TP .B v تخلیه جدول متغیرها پس از اجرای اسکریپت یادآوری .TP .B l تکرار خطوط هنگام نمایش پیام‌های خطا .TP .B f ردیابی خواندن فایل‌های یادآوری .TP .B p صدور هشدار در صورتی که یک POP-OMIT-CONTEXT، POP-VARS یا POP-FUNCS با یک PUSH متناظر در فایلی متفاوت مطابقت داشته باشد. .TP .B s ردیابی تجزیه عبارت و نمایش درخت داخلی گره‌های عبارت. این مورد بعید است مفید باشد مگر اینکه روی موتور ارزیابی عبارات \fBRemind\fR کار کنید. .TP .B h تخلیه آمار جدول درهم‌سازی (hash table) هنگام خروج. .TP .B u هنگام خروج \fBRemind\fR، فهرستی از متغیرهایی که SET شده‌اند اما بعداً استفاده نشده‌اند چاپ می‌شود. .RS .PP توجه داشته باشید که فلگ اشکال‌زدایی \fBu\fR ممکن است هشدارهای کاذب تولید کند. برای مثال، این توالی از دستورات: .PP .nf DEBUG +u SET a 1 IFTRIG Wed MSG a = [a] ENDIF .fi .PP هشداری مبنی بر بلااستفاده بودن \fBa\fR صادر خواهد کرد، مگر اینکه در روز چهارشنبه اجرا شود. .RE .TP .B n چاپ اطلاعات اشکال‌زدایی در این مورد که چرا \fBRemind\fR یک عبارت را «غیرثابت» (non-constant) در نظر می‌گیرد .TP .B q خروجی دادن یک دستور TRANSLATE در هر بار که تابع توکار \fB_()\fR فراخوانی شود یا توالی جایگزینی \fB%(...)\fR مشاهده گردد. .RE .TP \fB\-g\fR[\fBa|d\fR[\fBa|d\fR[\fBa|d\fR[\fBa|d\fR]]]] به طور معمول، یادآوری‌ها به ترتیبی که در اسکریپت یادآوری با آن‌ها برخورد می‌شود، صادر می‌گردند. گزینه \fB\-g\fR باعث می‌شود \fBRemind\fR یادآوری‌ها را قبل از صدور، بر اساس تاریخ و زمان مرتب کند. نویسه‌های اختیاری \fBa\fR و \fBd\fR ترتیب مرتب‌سازی (صعودی یا نزولی) را برای فیلدهای تاریخ، زمان و اولویت مشخص می‌کنند. برای اطلاعات بیشتر به بخش "SORTING REMINDERS" مراجعه کنید. توجه داشته باشید که اگر از گزینه \fB\-n\fR استفاده کنید، گزینه \fB\-g\fR \fIنادیده گرفته می‌شود\fR. .TP \fB\-b\fR[\fIn\fR] تنظیم قالب زمان برای خروجی‌های تقویم و تقویم ساده. مقدار \fIN\fR می‌تواند از 0 تا 2 باشد، با مقدار پیش‌فرض 0. مقدار 0 باعث می‌شود زمان‌ها در قالب ۱۲ ساعته (قبل از ظهر/بعد از ظهر) درج شوند. مقدار 1 باعث درج زمان‌ها در قالب ۲۴ ساعته می‌شود، و مقدار 2 از درج خودکار زمان‌ها در خروجی تقویم جلوگیری می‌کند. .TP \fB\-x\fR[\fIn\fR] محدودیت تکرار را برای بند \fBSATISFY\fR یک دستور \fBREM\fR تنظیم می‌کند. پیش‌فرض 1000 است. .TP \fB\-k\fR\fIcmd\fR به جای چاپ ساده یادآوری‌های نوع \fBMSG\fR، این گزینه باعث می‌شود آن‌ها به \fIcmd\fR مشخص‌شده ارسال شوند. باید از '%s' در جایی که می‌خواهید بدنه ظاهر شود استفاده کنید، و ممکن است لازم باشد این گزینه را در علامت نقل‌قول قرار دهید. توجه داشته باشید که تمام نویسه‌های شل در بدنه یادآوری با یک بک‌اسلش اسکیپ می‌شوند، و کل بدنه یادآوری به عنوان یک آرگومان واحد ارسال می‌شود. توجه داشته باشید که این گزینه بر گزینه \fB\-r\fR و دستور \fBRUN OFF\fR \fBارجحیت دارد\fR. .PP .RS به عنوان مثال، فرض کنید برنامه‌ای در سامانه پنجره X به نام \fBxmessage\fR دارید که پنجره‌ای باز می‌کند و آرگومان‌های فراخوانی خود را نمایش می‌دهد. می‌توانید از این دستور استفاده کنید: .PP .nf remind '\-kxmessage %s &' ... .fi .PP تا تمام یادآوری‌های نوع \fBMSG\fR شما با استفاده از xmessage پردازش شوند. .PP یک کلمه هشدار: تولید ده‌ها فرایند xmessage با روش فوق بسیار آسان است. بنابراین بسیار مراقب باشید. از آنجا که تمام نویسه‌های شل و فاصله‌ها اسکیپ شده‌اند، برنامه‌ای که با گزینه \fB\-k\fR اجرا می‌کنید باید آمادگی مدیریت کل پیام را به عنوان یک آرگومان واحد داشته باشد. .PP اگر پس از گزینه \fB\-k\fR یک دونقطه قرار دهید، آنگاه دستور فقط برای یادآوری‌های زمان‌دار صف‌بندی‌شده اعمال می‌شود. یادآوری‌های عادی طبق معمول مدیریت می‌شوند. در مثال بالا، اگر می‌خواهید یادآوری‌های عادی طبق معمول نمایش داده شوند، اما یادآوری‌های صف‌بندی‌شده به notify-send فرستاده شوند، می‌توانید از دستور زیر استفاده کنید: .PP .nf remind '\-k:notify-send %s &' ... .fi .PP می‌توانید از هر دو حالت \fB\-k\fR\fIcmd1\fR و \fB\-k:\fR\fIcmd2\fR برای استفاده از دستورات مختلف جهت یادآوری‌های صف‌بندی‌شده در مقابل غیر صف‌بندی‌شده استفاده کنید. .RE .TP \fB\-z\fR[\fIn\fR] Runs \fBRemind\fR in "daemon mode". If \fIn\fR is supplied, it specifies how often (in minutes) \fBRemind\fR should wake up to check if the reminder script has been changed. \fIN\fR defaults to 1, and can range from 1 to 60. Note that the use of the \fB\-z\fR option also enables the \fB\-f\fR option. .PP .RS اگر \fBRemind\fR روی سیستمی کامپایل شده باشد که از \fBinotify\fR(7) پشتیبانی می‌کند، در صورتی که اسکریپت یادآوری ارائه‌شده در خط فرمان در واقع یک دایرکتوری باشد، \fBRemind\fR علاوه بر این بررسی می‌کند که آیا تمام فایل‌های درون آن دایرکتوری از زمان راه‌اندازی تغییر کرده‌اند یا خیر. .PP اگر گزینه \fB\-zj\fR را ارائه دهید، \fBRemind\fR در یک حالت ویژه به نام \fBserver mode\fR (حالت کارگزار) اجرا می‌شود. این مورد در صفحه راهنمای tkremind مستند شده است؛ tkremind(1) را ببینید. گزینه قدیمی‌تر حالت کارگزار یعنی \fB\-z0\fR هنوز کار می‌کند، اما منسوخ شده است؛ این گزینه به جای استفاده از JSON برای ارتباط با کلاینت، از یک روش موردی (ad-hoc) برای برقراری ارتباط با کلاینت استفاده می‌کند. .RE .TP \fB\-u\fR\fIname\fR اجرای \fBRemind\fR با uid و gid کاربری که توسط \fIname\fR مشخص شده است. این گزینه uid و gid را همان‌طور که توضیح داده شد تغییر می‌دهد و متغیرهای محیطی HOME، SHELL و USER را به ترتیب روی دایرکتوری خانگی، شل و نام کاربری کاربر مشخص‌شده تنظیم می‌کند. متغیر LOGNAME نیز روی نام کاربری مشخص‌شده تنظیم می‌شود. این گزینه برای استفاده در اسکریپت‌های شل در نظر گرفته شده است که یادآوری‌ها را به تمام کاربران ایمیل می‌کنند. توجه داشته باشید که از نسخه 3.00.17 برنامه \fBRemind\fR، استفاده از \fB\-u\fR به طور ضمنی به معنای \fB\-r\fR است -- یعنی دستورالعمل RUN و توابع shell() غیرفعال می‌شوند. با این حال، اگر نام \fIname\fR را با علامت \fB+\fR پیشوند کنید، RUN و shell() غیرفعال \fIنمی‌شوند\fR. به عبارت دیگر، \fB\-uwhatever\fR کاربر را به \fBwhatever\fR تغییر داده و RUN را غیرفعال می‌کند، در حالی که \fB\-u+whatever\fR کاربر را به \fBwhatever\fR تغییر می‌دهد اما RUN را فعال باقی می‌گذارد. .PP .RS کاربران غیر ریشه (non-root) نیز می‌توانند از گزینه \fB\-u\fR استفاده کنند. با این حال، در این حالت، این گزینه فقط متغیرهای محیطی را همان‌طور که در بالا توضیح داده شد تغییر می‌دهد و شناسه کاربری یا گروهی مؤثر (effective uid or gid) را تغییر نمی‌دهد. .RE .TP \fB\-+\fIusername\fR باعث می‌شود \fBRemind\fR به فایل‌های متعلق به کاربر \fIusername\fR اعتماد کند. به طور معمول، اگر \fBRemind\fR فایلی را بخواند که شما مالک آن نیستید، RUN و تابع shell() را غیرفعال می‌کند. این گزینه باعث می‌شود به فایل‌های متعلق به \fIusername\fR نیز اعتماد کند. می‌توانید چندین گزینه \fB\-+\fR را برای اعتماد به چندین کاربر، تا حداکثر ۲۰ کاربر قابل اعتماد، ارائه دهید. .TP \fB-y\fR باعث می‌شود \fBRemind\fR برای هر یادآوری که فاقد بند TAG است یک برچسب (tag) تولید کند. .TP \fB\-i\fR\fIvar\fR\fB=\fR\fIexpr\fR مقدار \fIvar\fR مشخص‌شده را روی \fIexpr\fR تنظیم می‌کند و \fIvar\fR را \fBحفظ می‌کند\fR. مقدار \fIExpr\fR می‌تواند هر عبارت معتبر \fBRemind\fR باشد. برای جزئیات بیشتر به بخش "INITIALIZING VARIABLES ON THE COMMAND LINE" مراجعه کنید. اگر بخش \fB=\fR\fIexpr\fR را حذف کنید، آنگاه \fIvar\fR با 0 مقداردهی اولیه می‌شود. به عبارت دیگر، \fB\-i\fIvar\fR دقیقاً مشابه \fB\-i\fIvar\fR\fB=\fR0 است. .TP \fB\-i\fR\fIfunc\fR(\fIargs\fR)=\fIdefinition\fR به شما امکان می‌دهد یک تابع را در خط فرمان تعریف کنید. .PP اگر یک \fIdate\fR در خط فرمان وارد کنید، باید شامل [\fIday\fR] \fImonth\fR [\fIyear\fR] باشد، که در آن \fIday\fR روز ماه است، \fImonth\fR حداقل سه حرف اول نام انگلیسی ماه است، و \fIyear\fR یک سال (هر ۴ رقم) از ۱۹۹۰ تا حدود ۲۰۷۵ است. می‌توانید \fIday\fR را حذف کنید که در این صورت پیش‌فرض آن ۱ خواهد بود. اگر سال را حذف کنید، به سال جاری پیش‌فرض می‌شود. شما نمی‌توانید \fImonth\fR را حذف کنید. .PP اگر یک \fIdate\fR در خط فرمان وارد کنید، آنگاه \fBRemind\fR به جای تاریخ واقعی سیستم، از آن به عنوان مفهوم "امروز" خود استفاده می‌کند. این به شما امکان می‌دهد تقویم‌هایی برای ماه‌های آینده ایجاد کنید، یا بررسی کنید که یادآوری‌های شما چگونه در آینده فعال خواهند شد. به طور مشابه، می‌توانید یک \fItime\fR برای تنظیم مفهوم "اکنون" در \fBRemind\fR روی یک زمان خاص ارائه دهید. ارائه یک \fItime\fR در خط فرمان همچنین به طور ضمنی گزینه \fB\-q\fR را فعال کرده و گزینه \fB\-z\fR را غیرفعال می‌کند. مقدار \fItime\fR ممکن است در قالب ۲۴ ساعته (مانند 13:20) یا قالب رایج "AM/PM" (مانند 1:20pm) مشخص شود. .PP اگر ترجیح می‌دهید تاریخ را کوتاه‌تر مشخص کنید، می‌توانید آن را به صورت YYYY-MM-DD یا YYYY/MM/DD ارائه دهید. حتی می‌توانید تاریخ و زمان را به عنوان یک آرگومان در خط فرمان مشخص کنید: YYYY-MM-DD@HH:MM. .PP همچنین می‌توانید تاریخ را با افزودن نماد ات‌ساین "@" به عنوان پیشوند، به صورت یک \fIراه‌انداز (trigger)\fR مشخص کنید. ممکن است لازم باشد آرگومان را در نقل‌قول قرار دهید. در این حالت، Remind هر چیزی را پس از "@" به عنوان یک راه‌انداز ارزیابی می‌کند و تاریخ راه‌انداز حاصل به عنوان تاریخ مؤثر استفاده می‌شود. برای مثال، اگر می‌خواهید ببینید چه یادآوری‌هایی در جمعه سیزدهم بعدی فعال می‌شوند، می‌توانید از این دستور استفاده کنید: .PP .nf remind .reminders '@13 SATISFY [$Tw == 5]' .fi .PP همچنین می‌توانید تاریخ را مستقیماً مشخص کرده \fIو\fR از یک آرگومان راه‌انداز "@" استفاده کنید؛ در این حالت، Remind از تاریخ مشخص‌شده به عنوان نقطه شروع برای محاسبه راه‌انداز استفاده می‌کند. به عنوان مثال: .PP .nf remind .reminders 2026-07-01 '@13 SATISFY [$Tw == 5]' .fi .PP مفهوم "امروز" در \fBRemind\fR را روی 2026-11-13 تنظیم خواهد کرد، زیرا این اولین جمعه سیزدهم در تاریخ 2026-07-01 یا پس از آن است. .PP علاوه بر این، می‌توانید یک پارامتر \fIrepeat\fR ارائه دهید که به فرم *\fIrep\fR است. این کار باعث می‌شود \fBRemind\fR به تعداد \fIrep\fR بار اجرا شود و تاریخ در هر تکرار افزایش یابد. ممکن است مجبور شوید این پارامتر را در نقل‌قول قرار دهید تا از بسط شل جلوگیری شود. برای اطلاعات بیشتر، زیربخش "Repeated Execution" در بخش "CALENDAR MODE" را ببینید. .SH "گزینه‌های طولانی (LONG OPTIONS)" دستور \fBRemind\fR از گزینه‌های طولانی زیر پشتیبانی می‌کند که به حروف بزرگ و کوچک \fIحساس هستند\fR: .TP .B \-\-version گزینه \fB\-\-version\fR باعث می‌شود \fBRemind\fR شماره نسخه خود را در خروجی استاندارد چاپ کرده و سپس خارج شود. .TP .B \-\-hide-completed-todos در حالت تقویم، \fBRemind\fR معمولاً تمام TODOها را نشان می‌دهد. اگر این گزینه را وارد کنید، TODOهایی را که به عنوان تکمیل‌شده علامت‌گذاری شده‌اند نشان نخواهد داد. .TP .B \-\-only-todos فقط یادآوری‌های نوع TODO را صادر می‌کند. .TP .B \-\-only-events یادآوری‌های نوع TODO را صادر نمی‌کند. .TP .B \-\-json در حالت دستور کار (Agenda Mode)، خروجی JSON را به جای خروجی معمول حالت متنی تولید می‌کند. همچنین \fB\-\-json\fR مرتب‌سازی (گزینه \fB-g\fR) و صف‌بندی (گزینه \fB-q\fR) را غیرفعال می‌کند. برای جزئیات بیشتر به بخش "AGENDA MODE JSON OUTPUT" مراجعه کنید. گزینه \fB\-\-json\fR در حالت تقویم نادیده گرفته می‌شود. توجه داشته باشید که در حالت JSON، خروجی حاصل از هر یادآوری نوع \fBRUN\fR که معمولاً در خروجی استاندارد ظاهر می‌شد، به جای آن به خطای استاندارد هدایت می‌شود؛ این امر برای این است که یادآوری‌های نوع \fBRUN\fR خروجی را به هم نریزند و باعث تولید JSON نامعتبر در خروجی استاندارد نشوند. .TP .B \-\-print-errs گزینه \fB\-\-print-errs\fR باعث می‌شود \fBRemind\fR تمام پیام‌های خطای ممکن را در خروجی استاندارد چاپ کرده و سپس خارج شود. پیام‌ها در قالبی مناسب برای آرگومان اول دستور TRANSLATE چاپ می‌شوند. اگر پیام‌های خطا را با TRANSLATE ترجمه کنید، \fBRemind\fR هنگام نمایش پیام‌های خطا و هشدار از نسخه‌های ترجمه‌شده استفاده خواهد کرد. همچنین به TRANSLATE GENERATE در بخش "THE TRANSLATION TABLE" مراجعه کنید. .RS .PP توجه داشته باشید که اگر یک پیام ترجمه‌نشده حاوی توالی‌های قالب‌بندی سبک printf مانند "%s" یا "%d" باشد، پیام ترجمه‌شده \fIباید\fR حاوی همان توالی‌ها با همان ترتیب باشد، در غیر این صورت \fBRemind\fR آن را نادیده گرفته و از پیام اصلی ترجمه‌نشده استفاده خواهد کرد. .RE .TP .B \-\-print-config-cmd این گزینه باعث می‌شود \fBRemind\fR دستور دقیق \fB./configure\fR را که هنگام ساخت \fBRemind\fR استفاده شده بود، چاپ کند. با اجرای دستور زیر می‌توانید از این گزینه برای ساخت نسخه جدیدی از \fBRemind\fR با استفاده از همان پیکربندی قبلی استفاده کنید: .RS .PP .nf eval `remind --print-config-cmd` .fi .PP از دایرکتوری سطح بالای سورس‌کد \fBRemind\fR. (با این حال، ایمن‌تر است که دستور \fBremind --print-config-cmd\fR را اجرا کرده و پس از بررسی درست بودن ظاهر آن، دستور را تایپ و اجرا کنید.) .RE .TP .B \-\-print-tokens گزینه \fB\-\-print-tokens\fR باعث می‌شود \fBRemind\fR توکن‌های استفاده‌شده توسط تجزیه‌کننده، نام توابع داخلی و نام متغیرهای سیستم را در خروجی استاندارد چاپ کرده و سپس خارج شود. این خروجی طوری طراحی شده است که ساخت فایل برجسته‌سازی نحوی (syntax-highlighting) برای ویرایشگرهای متن مختلف آسان باشد. این خروجی را می‌توان با دست یا با یک اسکریپت با آسانی نسبی به یک فایل برجسته‌سازی نحوی تبدیل کرد. .TP .B \-\-max-execution-time\fR=\fIn\fR کل زمان اجرا (اندازه‌گیری‌شده بر اساس ساعت دیواری) را به \fIn\fR ثانیه محدود می‌کند. این مورد زمانی مفید است که \fBRemind\fR روی فایل‌های بالقوه غیرقابل اعتماد اجرا شود که ممکن است تلاش کنند منابع زیادی مصرف نمایند. توجه داشته باشید که محدودیت \fIn\fR تقریبی است و ممکن است \fBRemind\fR یک یا دو ثانیه بیشتر قبل از کشته شدن اجرا شود. اگر \fIn\fR به صورت صفر مشخص شود، هیچ محدودیتی اعمال نمی‌شود، درست مانند زمانی که از این گزینه اصلاً استفاده نشده باشد. .RS .PP اگر محدودیتی اعمال شود، فقط روی اجرای پیش‌زمینه \fBRemind\fR اعمال می‌شود. اگر \fBRemind\fR پردازش اسکریپت را تمام کند و سپس شروع به مدیریت یادآوری‌های صف‌بندی‌شده نماید، محدودیت زمانی به بدون محدودیت بازنشانی می‌شود. .RE .TP .B \-\-max-expr-complexity\fR=\fIn\fR پیچیدگی کل ارزیابی عبارت را برای یک خط مشخص در اسکریپت به \fIn\fR گره محدود می‌کند. به طور کلی، هر فراخوانی تابع، عملگر، مقدار ثابت، ارجاع به متغیر و غیره متناظر با یک گره عبارت است. به طور پیش‌فرض، این محدودیت روی 10000000 (ده میلیون) تنظیم شده است. اگر مایل نیستید هیچ محدودیتی اعمال شود، می‌توانید آن را صریحاً روی صفر تنظیم کنید. با این حال، محدودیت پیش‌فرض ده میلیون هرگز نباید توسط هیچ اسکریپت معقول Remind فعال شود و ما تغییر این محدودیت را توصیه نمی‌کنیم. .TP .B \-\-test گزینه طولانی \fB\-\-test\fR فقط برای استفاده توسط آزمون‌های پذیرش که با "make test" اجرا می‌شوند در نظر گرفته شده است. از این گزینه در محیط عملیاتی استفاده نکنید. .TP .B \-\-flush گزینه طولانی \fB\-\-flush\fR جریان‌های خروجی استاندارد و خطای استاندارد \fBRemind\fR را بدون بافر می‌کند. این گزینه بیشتر برای آزمایش استفاده می‌شود و احتمالاً نباید در محیط عملیاتی استفاده شود. .SH "فایل‌های یادآوری (REMINDER FILES)" .PP برنامه \fBRemind\fR برای کنترل عملکرد خود از اسکریپت‌ها استفاده می‌کند. می‌توانید از هر ویرایشگر متنی که قادر به ایجاد فایل‌های متنی ساده است برای ساخت یک اسکریپت \fBRemind\fR استفاده کنید. دستورات درون یک اسکریپت می‌توانند از دستورات بسیار ساده و تقریباً بلافاصله قابل فهم: .PP .nf REM Mar 31 MSG International Transgender Day of Visibility .fi .PP تا موارد بسیار پیچیده و مبهم را در بر گیرند: .PP .nf REM [date(thisyear, 1, 1) + 180] ++5 OMIT \\ sat sun BEFORE MSG [ord(thisyear-1980)] payment due %b! .fi .PP یک فایل یادآوری شامل دستورات است، با یک دستور در هر خط. چندین خط را می‌توان با استفاده از نویسه بک‌اسلش، مانند مثال بالا، ادامه داد. در این حالت، تمام خطوط متصل‌شده توسط \fBRemind\fR به عنوان یک خط واحد در نظر گرفته می‌شوند. توجه داشته باشید که در صورت بروز خطا، \fBRemind\fR شماره خط آخرین خط از یک خط ادامه‌یافته را گزارش می‌دهد. .PP برنامه \fBRemind\fR خطوط خالی و خطوطی را که با نویسه‌های '#' یا ';' شروع می‌شوند نادیده می‌گیرد. اگر می‌خواهید یک اسکریپت \fBRemind\fR را از پیش‌پردازنده C عبور دهید (که نویسه '#' را به عنوان شروع یک دستورالعمل پیش‌پردازش تفسیر می‌کند)، می‌توانید از نقطه ویرگول به عنوان نویسه کامنت استفاده کنید. .PP توجه داشته باشید که \fBRemind\fR ادامه خطوط را قبل از هر چیز دیگری پردازش می‌کند. برای مثال: .PP .nf # This is a comment \\ This line is part of the comment because of line continuation \\ and so on. REM MSG This line is not ignored (no \\ above) .fi .PP برنامه \fBRemind\fR به حروف بزرگ و کوچک حساس نیست؛ به طور کلی می‌توانید از هر ترکیبی از حروف بزرگ یا کوچک برای دستورات، پارامترها، گزینه‌های فراخوانی و غیره استفاده کنید. .SH "دستور REM (THE REM COMMAND)" .PP قدرتمندترین دستور در یک اسکریپت .BR Remind ، دستور .B REM است. این دستور مسئول صدور یادآورها است. نحو آن به صورت زیر است: .PP .RS \fBREM\fR [\fBONCE\fR] [\fIdate_spec\fR] [\fIback\fR] [\fIdelta\fR] [\fIrepeat\fR] [\fBTODO\fR] [\fBMAX-OVERDUE\fR \fIn\fR] [\fBCOMPLETE-THROUGH\fR \fIcomplete_date\fR] [\fBPRIORITY\fR \fIprio\fR] [\fBSKIP\fR | \fBBEFORE\fR | \fBAFTER\fR] [\fBOMIT\fR \fIomit_list\fR] [\fBADDOMIT\fR] [\fBNOQUEUE\fR] [\fBOMITFUNC\fR \fIomit_function\fR] [\fBAT\fR \fItime\fR [\fItdelta\fR] [\fItrepeat\fR]] [\fBSCHED\fR \fIsched_function\fR] [\fBWARN\fR \fIwarn_function\fR] [\fBUNTIL\fR \fIexpiry_date\fR | \fBTHROUGH\fR \fIlast_date\fR] [\fBSCANFROM\fR \fIscan_date\fR | \fBFROM\fR \fIstart_date\fR] [\fBDURATION\fR \fIduration\fR] [\fBTAG\fR \fItag\fR] [\fBTZ\fR \fItimezone\fR] [\fBINFO\fR "\fIinfo_string\fR"] \fBMSG\fR | \fBMSF\fR | \fBRUN\fR | \fBCAL\fR | \fBSATISFY\fR | \fBSPECIAL\fR \fIspecial\fR | \fBPS\fR | \fBPSFILE\fR .I body .RE .PP بخش‌های دستور .B REM می‌توانند با هر ترتیبی مشخص شوند، به جز این‌که .I body باید بلافاصله پس از کلیدواژه .BR MSG ، .BR RUN ، .BR CAL ، .BR PS ، .B PSFILE یا .B SATISFY قرار گیرد. بخشی از دستور .B REM که پیش از بندهای .BR MSG ، .BR MSF ، .BR RUN ، .B CAL یا .B SATISFY می‌آید، .I فعال‌ساز (trigger) نامیده می‌شود. .PP در نسخه‌های پیشین .BR Remind ، توکن .B REM اختیاری بود، مشروط بر این‌که باقی‌مانده دستور با دستور دیگری از .B Remind اشتباه گرفته نشود. با این حال، این کاربرد منسوخ شده است و اکنون موجب صدور یک هشدار می‌شود. تمام خطوط یادآور شما باید طوری نوشته شوند که با دستور .B REM آغاز گردند. .PP .B "MSG، MSF، RUN، CAL، SPECIAL، PS و PSFILE" .PP این کلیدواژه‌ها .I نوع (type) یادآور را مشخص می‌کنند. .RI ( SATISFY پیچیده‌تر است و بعداً توضیح داده خواهد شد.) یک یادآور از نوع .B MSG به‌طور معمول پیامی را پس از عبور دادن .I body از یک فیلتر جایگزینی ویژه (که در بخش «THE SUBSTITUTION FILTER» شرح داده شده است) در خروجی استاندارد چاپ می‌کند. با این حال، اگر از گزینه خط فرمان .B \-k استفاده کرده باشید، یادآورهای نوع .B MSG به برنامه مناسب ارسال می‌شوند. توجه داشته باشید که گزینه‌های .BR \-c ، .BR \-s ، .B \-p و .B \-n گزینه .B \-k را غیرفعال می‌کنند. .PP نسخه‌های پیشین .B Remind اجازه می‌دادند نوع یادآور را حذف کنید، که در این صورت پیش‌فرض آن .B MSG در نظر گرفته می‌شد. با این حال، این کاربرد منسوخ شده است و موجب صدور یک هشدار می‌شود. چیزی شبیه به: .PP .nf REM 6 January Dianne's Birthday .fi .PP هشدار «Missing REM type; assuming MSG» را صادر خواهد کرد. .PP کلیدواژه .B MSF تقریباً همانند کلیدواژه .B MSG است، با این تفاوت که یادآور به گونه‌ای قالب‌بندی می‌شود که در قالبی شبیه به پاراگراف جای گیرد. سه متغیر سیستمی قالب‌بندی یادآورهای نوع .B MSF را کنترل می‌کنند - آن‌ها .BR $FirstIndent ، .B $SubsIndent و .B $FormWidth هستند. این متغیرها در بخش «SYSTEM VARIABLES» بررسی شده‌اند. کلیدواژه .B MSF باعث تغییر فاصله‌گذاری یادآور شما می‌شود - فاصله‌های اضافی حذف می‌شوند و پس از نقطه‌ها و سایر نویسه‌ها، طبق آن‌چه متغیرهای سیستمی .B $EndSent و .B $EndSentIg مشخص کرده‌اند، دو فاصله قرار می‌گیرد. توجه داشته باشید که اگر بدنه یادآور شامل نویسه‌های خط جدید باشد (که با دنباله %_ در آن‌جا قرار داده شده‌اند)، با خطوط جدید به عنوان آغاز پاراگراف‌های تازه رفتار می‌شود و تورفتگی .B $FirstIndent برای خط بعدی به کار می‌رود. می‌توانید از دو خط جدید متوالی استفاده کنید تا پاراگراف‌های فاصله‌دار از یک بدنه یادآور منفرد منتشر شوند. .PP یک یادآور از نوع .B RUN نیز .I body را از فیلتر جایگزینی عبور می‌دهد، اما سپس نتیجه را به عنوان یک دستور سیستم اجرا می‌کند. یک یادآور از نوع .B CAL تنها برای قرار دادن مدخل‌ها در تقویمی استفاده می‌شود که هنگام اجرای .B Remind با گزینه‌های .BR \-c ، .B \-s یا .B \-p تولید می‌شود. هنگامی که .B Remind دستوری را اجرا می‌کند، ورودی استاندارد آن دستور را به گونه‌ای تنظیم می‌کند که از /dev/null خوانده شود. .PP یادآورهای نوع .B PS یا .B PSFILE برای ارسال مستقیم کد PostScript به چاپگر هنگام تولید تقویم‌های PostScript استفاده می‌شوند. این قابلیت می‌تواند برای سایه‌زدن برخی مدخل‌های تقویم (تابع ()psshade را ببینید)، گنجاندن گرافیک در تقویم، یا تقریباً هر هدف دیگری که به فکرتان برسد به کار رود. نباید از این انواع یادآور استفاده کنید مگر این‌که یک برنامه‌نویس خبره PostScript باشید. یادآورهای .B PS و .B PSFILE نادیده گرفته می‌شوند مگر این‌که .B Remind با گزینه .B \-p اجرا شود. برای جزئیات بیشتر به بخش «More about PostScript» مراجعه کنید. .PP یادآور از نوع .B SPECIAL برای انتقال اطلاعات «خارج از باند» (out-of-band) از .B Remind به بک‌اند تولیدکننده تقویم به کار می‌رود. این کلیدواژه باید با کلمه‌ای دنبال شود که نوع داده ویژه در حال ارسال را مشخص می‌کند. نوع یک یادآور ویژه به بک‌اند بستگی دارد. برای بک‌اند .BR Rem2PS ، عبارت .B SPECIAL PostScript معادل یک یادآور نوع .B PS است، و .B SPECIAL PSFile معادل یک یادآور نوع .B PSFILE است. بدنه یک یادآور .B SPECIAL بدیهی است که وابسته به بک‌اند است. یک بک‌اند .I باید هر .B SPECIAL را که نمی‌شناسد نادیده بگیرد. .PP .B "مشخصات تاریخ (DATE SPECIFICATIONS)" .PP یک .I date_spec شامل صفر تا چهار بخش است. این بخش‌ها عبارتند از: .I day (روز ماه)، .I month (نام ماه)، .I year (سال) و .IR weekday . .I Month و .I weekday نام‌های انگلیسی ماه‌ها و روزهای هفته هستند. دست‌کم باید سه نویسه اول آن‌ها استفاده شود. در ادامه مثال‌هایی از بخش‌های گوناگون یک .I date_spec آورده شده است: .TP .I day: 1, 22, 31, 14, 3 .TP .I month: JANUARY, feb, March, ApR, may, Aug .TP .I year: 1990, 1993, 2030. سال می‌تواند در بازه 1990 تا 2075 باشد. .TP .I weekday: Monday, tue, Wed, THU, Friday, saturday, sundAy .PP توجه داشته باشید که می‌تواند چندین مولفه .I weekday جداشده با فاصله در یک .I date_spec وجود داشته باشد. .PP .B "تفسیر مشخصات تاریخ (INTERPRETATION OF DATE SPECIFICATIONS)" .PP مثال‌های زیر نشان می‌دهند که مشخصات تاریخ چگونه تفسیر می‌شوند. .PP 1. مشخصات تاریخ تهی (Null) \- یادآور هر روز فعال می‌شود. تاریخ فعال‌سازی برای یک اجرای خاص، صرفاً تاریخ جاری سیستم است. به عنوان مثال: .PP .nf REM MSG This is triggered every time Remind runs .fi .PP 2. فقط .I day حضور دارد. یادآور در روز مشخص‌شده از هر ماه فعال می‌شود. تاریخ فعال‌سازی برای یک اجرای خاص، نزدیک‌ترین روز از این نوع به تاریخ جاری سیستم است. به عنوان مثال: .PP .nf REM 1 MSG First of every month. REM 31 MSG 31st of every month that has 31 days. .fi .PP 3. فقط .I month حضور دارد. یادآور در هر روز از ماه مشخص‌شده فعال می‌شود. مثال: .PP .nf REM Feb MSG Every day in February .fi .PP 4. .I day و .I month حضور دارند. مثال‌ها: .PP .nf REM 6 Jan MSG Every 6th of January REM Feb 29 MSG Every 29th of February .fi .PP 5. فقط .I year حضور دارد. مثال: .PP .nf REM 1991 MSG Every day in 1991 .fi .PP 6. .I year و .I day حضور دارند. مثال‌ها: .PP .nf REM 1 1990 MSG 1st of every month in 1990 REM 1992 23 MSG 23rd of every month in 1992 .fi .PP 7. .I year و .I month حضور دارند. مثال‌ها: .PP .nf REM Feb 1991 MSG Every day in Feb 1991 REM 1992 September MSG Every day in Sept 1992 .fi .PP 8. .IR "year, month" و .I day حضور دارند. مثال‌ها: .PP .nf REM 8 Jan 1991 MSG 8th January 1991. REM 1992 March 9 MSG 9th March 1992. .fi .PP 9. فقط .IR weekday . مثال‌ها: .PP .nf REM Sat MSG Every Saturday REM Mon Tue Wed Thu Fri MSG Every working day REM Monday Wednesday MSG Every Monday and Wednesday .fi .PP 10. .I weekday و .I day حضور دارند. مثال‌ها: .PP .nf REM Sat 1 MSG First Saturday of every month REM Mon Tue Wed Thu Fri 15 \\ MSG 1st working day on or after 15th of every month .fi .PP 11. .I weekday و .I month حضور دارند. مثال‌ها: .PP .nf REM Mon March MSG Every Monday in March REM Mon Tue Wed Thu Fri Feb MSG Every working day in February .fi .PP 12. .IR "weekday, month" و .I day حضور دارند. مثال‌ها: .PP .nf REM Mon 1 March MSG First Monday in March REM Sat Sun 15 July MSG First Sat or Sun on or after 15 July .fi .PP 13. .I weekday و .I year حضور دارند. مثال: .PP .nf REM Sat Sun 1991 MSG Every Saturday and Sunday in 1991 .fi .PP 14. .IR "weekday, day" و .I year حضور دارند. مثال‌ها: .PP .nf REM Mon 15 1990 MSG 1st Mon after 15th of every month in 1990 REM Mon Tue Wed Thu Fri 1 1990 \\ MSG 1st working day of every month in 1990 .fi .PP 15. .IR "weekday, month" و .I year حضور دارند. مثال: .PP .nf REM Mon Wed 1991 Feb MSG Every Mon and Wed in Feb 1991. .fi .PP 16. .IR "weekday, day, month" و .I year حضور دارند. مثال: .PP .nf REM Mon Tue Wed Thu Fri 28 Oct 1990 \\ MSG 1st working day on or after 28 October 1990. .fi .PP توجه داشته باشید هنگامی که هر دوی .I weekday و .I day مشخص شده باشند، .B Remind نخستین تاریخی را برمی‌گزیند که در همان .I day مشخص‌شده یا پس از آن باشد و همچنین شرط .I weekday را برآورده کند. این کار را با انتخاب نخستین تاریخی انجام می‌دهد که در همان .I day مشخص‌شده یا پس از آن قرار دارد و در فهرست .I weekday ها آمده است. بنابراین، یادآوری مانند: .PP .nf REM Mon Tue 28 Oct 1990 MSG Hi .fi .PP تنها در روز دوشنبه ۲۹ اکتبر ۱۹۹۰ صادر خواهد شد. این یادآور در روز سه‌شنبه ۳۰ اکتبر ۱۹۹۰ صادر نخواهد شد، زیرا ۲۹ام نخستین تاریخی است که قیود .I weekday را برآورده می‌سازد. .PP .B "مشخصات کوتاه تاریخ (SHORT-HAND DATE SPECIFICATIONS)" .PP علاوه بر نوشتن جداگانه روز، ماه و سال، می‌توانید از قالب YYYY-MM-DD یا YYYY/MM/DD استفاده کنید. به عنوان مثال، دستورهای زیر معادل یکدیگرند: .PP .nf REM 5 June 2010 MSG Cool! REM 2010-06-05 MSG Cool! .fi .PP همچنین می‌توانید تاریخ و زمان را به صورت YYYY-MM-DD@HH:MM مشخص کنید. این دستورها معادل یکدیگرند: .PP .nf REM 19 Dec 2010 AT 16:45 MSG Hi REM 2010-12-19@16:45 MSG Hi .fi .PP یک نکته ظریف درباره مشخصات کوتاه تاریخ وجود دارد: دستورهای زیر معادل یکدیگر \fIنیستند\fR: .PP .nf REM 19 Dec 2010 AT 16:45 +60 MSG Hi REM 2010-12-19@16:45 +60 MSG Hi .fi .PP در دستور دوم، مقدار «+60» یک .I delta است که بر تاریخ اعمال می‌شود، نه یک .I tdelta که بر زمان اعمال گردد. توصیه می‌کنیم برای یادآورهای زمان‌دار، صراحتاً از کلیدواژه AT استفاده کنید. .PP .B "الگوریتم REMIND (THE REMIND ALGORITHM)" .PP برنامه .B Remind از الگوریتم زیر برای محاسبه تاریخ فعال‌سازی استفاده می‌کند: از تاریخ جاری شروع کرده و تک‌تک روزها را یکی‌یکی بررسی می‌کند تا به تاریخی برسد که مشخصات تاریخ را برآورده سازد، یا برایش محرز شود که چنین تاریخی وجود ندارد. (در واقعیت، .B Remind صرفاً \fIرفتاری\fR شبیه به این الگوریتم دارد؛ این کار در عمل بسیار کند خواهد بود. در درون سیستم، .B Remind از روش‌های بسیار سریع‌تری برای محاسبه تاریخ فعال‌سازی بهره می‌برد.) برای اطلاعات بیشتر، بخش «DETAILS ABOUT TRIGGER COMPUTATION» را ببینید. .PP .B "پیمایش رو به عقب (BACKWARD SCANNING)" .PP گاهی لازم است تاریخی به عنوان مدت زمانی مشخص پیش از تاریخی دیگر تعیین شود. به عنوان مثال، آخرین دوشنبه یک ماه مفروض، به عنوان نخستین دوشنبه ماه بعد، منهای ۷ روز محاسبه می‌شود. مشخصه .I back در یادآور برای همین وضعیت به کار می‌رود: .PP .nf REM Mon 1 \-7 MSG Last Monday of every month. .fi .PP یک .I back با یک یا دو خط تیره به همراه یک عدد صحیح مشخص می‌شود. این کار باعث می‌شود .B Remind از آن‌چه معمولاً تاریخ فعال‌سازی بود به سمت «عقب» حرکت کند. تفاوت میان \-\-7 و \-7 هنگام شرح کلیدواژه .B OMIT توضیح داده خواهد شد. .PP .B "هشدار پیش‌هنگام (ADVANCE WARNING)" .PP برای برخی یادآورها، مناسب است که هشداری پیش‌هنگام از رویداد دریافت شود. برای نمونه، شاید بخواهید چند روز پیش از تولد فردی به شما یادآوری شود. بخش .I delta در دستور .B REM به این هدف دست می‌یابد. این بخش با یک یا دو علامت «+» و به دنبال آن یک عدد .I n مشخص می‌شود. مجدداً، تفاوت میان قالب‌های «+» و «++» ذیل کلیدواژه .B OMIT توضیح داده خواهد شد. .B Remind یادآور را هم در تاریخ فعال‌سازی محاسبه‌شده و هم در تک‌تک .I n روز پیش از رویداد فعال خواهد کرد. در ادامه چند مثال آورده شده است: .PP .nf REM 6 Jan +5 MSG Remind me of birthday 5 days in advance. .fi .PP مثال بالا در هر ۶ام ژانویه، و همچنین از ۱ام تا ۵ام ژانویه فعال خواهد شد. .PP .B "یادآورهای دوره‌ای (PERIODIC REMINDERS)" .PP پیش‌تر سازوکارهای توکار را برای انواع خاصی از یادآورهای دوره‌ای دیده‌ایم. برای مثال، رویدادی که هر چهارشنبه رخ می‌دهد را می‌توان چنین مشخص کرد: .PP .nf REM Wed MSG Event! .fi .PP با این حال، رویدادهایی که به صورت روزانه، هفتگی، ماهانه یا سالانه تکرار نمی‌شوند، نیازمند رویکرد دیگری هستند. مولفه .I repeat در دستور .B REM این نیاز را برطرف می‌کند. برای استفاده از آن، باید یک تاریخ را به‌طور کامل مشخص کنید (سال، ماه و روز، و در صورت تمایل روز هفته)؛ این تاریخ، تاریخ آغاز دوره تکرار است. مولفه .I repeat یک علامت ستاره است که با عددی دنبال می‌شود که دوره تکرار را بر حسب روز مشخص می‌سازد. .PP به عنوان مثال، فرض کنید هر دو چهارشنبه یک‌بار حقوق می‌گیرید و آخرین روز دریافت حقوق شما چهارشنبه ۲۸ اکتبر ۱۹۹۲ بوده است. می‌توانید بنویسید: .PP .nf REM 28 Oct 1992 *14 MSG Payday .fi .PP این دستور یادآور را از ۲۸ اکتبر ۱۹۹۲، هر ۱۴ روز یک‌بار صادر می‌کند. می‌توانید از .I delta و .I back همراه با .I repeat استفاده کنید. با این حال توجه داشته باشید که .I back تنها برای محاسبه تاریخ شروع به کار می‌رود؛ پس از آن، یادآور با دوره مشخص‌شده تکرار می‌شود. به طور مشابه، اگر یک روز هفته را مشخص کنید، فقط برای محاسبه تاریخ شروع به کار می‌رود و بر دوره تکرار تاثیری نمی‌گذارد. .PP .B "SCANFROM \fRو\fB FROM" .PP کلیدواژه‌های .B SCANFROM و .B FROM تنها برای برنامه‌نویسان پیشرفته .B Remind هستند و در بخش «DETAILS ABOUT TRIGGER COMPUTATION» در نزدیکی پایان این راهنما توضیح داده خواهند شد. توجه داشته باشید که .B SCANFROM تنها در نسخه‌های 03.00.04 به بعد .B Remind در دسترس است. کلیدواژه .B FROM تنها از نسخه 03.01.00 و پس از آن در دسترس قرار دارد. .PP .B "اولویت (PRIORITY)" .PP کلیدواژه .B PRIORITY باید با عددی از 0 تا 9999 دنبال شود. این کلیدواژه در حالت تقویم و هنگام مرتب‌سازی یادآورها استفاده می‌شود. اگر دو یادآور تاریخ و زمان فعال‌سازی یکسانی داشته باشند، بر اساس اولویت مرتب می‌شوند. اگر کلیدواژه .B PRIORITY ارائه نشود، اولویت پیش‌فرض 5000 استفاده می‌شود. (این مقدار پیش‌فرض را می‌توان با تنظیم متغیر سیستمی .B $DefaultPrio تغییر داد. برای اطلاعات بیشتر به بخش «SYSTEM VARIABLES» مراجعه کنید.) .PP .B "تاریخ‌های انقضا (EXPIRY DATES)" .PP برخی یادآورها باید به صورت دوره‌ای برای مدت مشخصی صادر شوند، اما سپس منقضی گردند. برای مثال، فرض کنید هر جمعه کلاسی دارید و آخرین جلسه کلاس شما در ۱۱ دسامبر ۱۹۹۲ است. می‌توانید بنویسید: .PP .nf REM Fri UNTIL 11 Dec 1992 MSG Class today. .fi .PP مثالی دیگر: فرض کنید از ۳۰ نوامبر ۱۹۹۲ تا ۴ دسامبر ۱۹۹۲ وظیفه هیئت منصفه دارید. یادآور زیر پیام را در هر روز از وظیفه هیئت منصفه شما، و همچنین ۲ روز پیش از موعد صادر خواهد کرد: .PP .nf REM 1992-11-30 *1 +2 UNTIL 1992-12-04 MSG Jury duty .fi .PP توجه داشته باشید که .I repeat به صورت *1 الزامی است؛ بدون آن، یادآور تنها در ۳۰ نوامبر (و دو روز پیش از آن) صادر می‌شد. .PP به عنوان یک مورد خاص، می‌توانید از کلیدواژه .B THROUGH به جای *1 و .B UNTIL استفاده کنید. دو دستور .B REM زیر معادل یکدیگرند: .PP .nf REM 1992-11-30 *1 +2 UNTIL 1992-12-04 MSG Jury duty REM 1992-11-30 +2 THROUGH 1992-12-04 MSG Jury duty .fi .PP اگر از طریق استفاده از .B THROUGH یا .B UNTIL یک تاریخ انقضا داشته باشید، آن‌گاه .B Remind \fIهرگز\fR یادآور را پس از تاریخ انقضا فعال نخواهد کرد. برای مثال، اگر این مورد را داشته باشید: .PP .nf OMIT 2021-01-08 REM 2021-01-01 THROUGH 2021-01-08 AFTER MSG Test .fi .PP یادآور در 2021-01-08 فعال نخواهد شد، و در 2021-01-09 نیز فعال نمی‌گردد؛ هرچند کلیدواژه AFTER معمولاً یادآور روز ۸ام را به روز ۹ام منتقل می‌کرد، اما تاریخ انقضای 2021-01-08 بر آن ارجحیت دارد. .PP .B "کلیدواژه ONCE (THE ONCE KEYWORD)" .PP گاهی لازم است اطمینان حاصل شود که یادآورها فقط یک بار در یک روز معین اجرا می‌شوند. به عنوان مثال، دو یادآور زیر را مقایسه کنید: .PP .nf REM Fri RUN do_backup REM Fri ONCE RUN do_backup .fi .PP اولی هر بار که .B Remind را در یک روز جمعه فراخوانی کنید اجرا خواهد شد، در حالی که دومی تنها نخستین باری که .B Remind را در یک جمعه مشخص فراخوانی کنید اجرا می‌شود. .PP برای مثال، اگر .B Remind را از اسکریپت login. خود اجرا کنید و چندین بار در روز وارد سیستم شوید، برنامه .I do_backup در یادآور نخست هر بار که وارد می‌شوید اجرا خواهد شد. اما اگر از کلیدواژه .B ONCE در یادآور استفاده کنید، .B Remind تاریخ آخرین دسترسی اسکریپت یادآور را بررسی می‌کند. اگر با تاریخ جاری یکسان باشد، .B Remind فرض می‌کند که از قبل اجرا شده است، و یادآورهای حاوی کلیدواژه .B ONCE را صادر نخواهد کرد. .PP توجه داشته باشید که اگر اسکریپت یادآور خود را مشاهده یا ویرایش کنید، تاریخ آخرین دسترسی به‌روزرسانی خواهد شد و کلیدواژه .B ONCE به درستی عمل نخواهد کرد. می‌توانید این مشکل را با تنظیم یک فایل برچسب زمانی (timestamp file) برای .B Remind جهت ردگیری تاریخ آخرین اجرا برطرف کنید؛ مستندات .B $OnceFile را در بخش .B "SYSTEM VARIABLES" ببینید. اگر از ورودی استاندارد به عنوان فایل ورودی .B Remind استفاده می‌کنید، آن‌گاه .I باید از .B $OnceFile استفاده کنید تا کلیدواژه .B ONCE به درستی کار کند. .PP اگر .B Remind را با گزینه .B \-o راه‌اندازی کنید، کلیدواژه .B ONCE و هرگونه .B $OnceFile نادیده گرفته خواهند شد. .PP .B "نادیده‌گرفتن محلی روزهای هفته (LOCALLY OMITTING WEEKDAYS)" .PP بخش .B OMIT از دستور .B REM برای «نادیده گرفتن» روزهایی خاص هنگام شمارش .I delta یا .I back استفاده می‌شود. این بخش با استفاده از کلیدواژه .B OMIT و به دنبال آن فهرستی از روزهای هفته مشخص می‌شود. عملکرد آن به بهترین شکل با چند مثال نشان داده می‌شود: .PP .nf REM 1 +1 OMIT Sat Sun MSG Important Event .fi .PP این یادآور معمولاً در اول هر ماه و همچنین روز پیش از آن فعال می‌شود. با این حال، اگر اول ماه مصادف با یکشنبه یا دوشنبه باشد، یادآور از جمعه قبلی فعال خواهد شد. این امر به این دلیل است که .I delta با مقدار +1 هنگام شمارش معکوس از تاریخ فعال‌سازی برای تعیین میزان هشدار پیش‌هنگام، شنبه یا یکشنبه را به حساب نمی‌آورد. .PP این را با کاربرد «++1» در دستور بالا مقایسه کنید. در این حالت، یادآور در روز اول هر ماه و همچنین روز پیش از آن فعال می‌شود؛ روزهای نادیده‌گرفته‌شده شمارش می‌شوند. .PP .nf REM 1 \-1 OMIT Sat Sun MSG Last working day of month .fi .PP مجدداً در مثال بالا، مقدار .I back با \-1 معمولاً باعث می‌شود تاریخ فعال‌سازی آخرین روز ماه باشد. با این حال، به دلیل بند .BR OMIT ، اگر اول ماه مصادف با یکشنبه یا دوشنبه باشد، تاریخ فعال‌سازی به عقب و از روی آخر هفته عبور کرده و به جمعه منتقل می‌شود. (اگر تعطیلاتی را به صورت سراسری نادیده گرفته باشید، یادآور به قبل از آن‌ها نیز منتقل می‌شود. برای جزئیات بیشتر به بخش «The OMIT command» مراجعه کنید.) .PP در مقایسه، اگر از «\-\-1» استفاده کرده بودیم، یادآور بدون توجه به .B OMIT در آخرین روز ماه فعال می‌شد. .PP اگر روزهای هفته را به صورت محلی نادیده بگیرید اما روزهای هفته‌ای نیز داشته باشید که به صورت سراسری نادیده گرفته شده‌اند، فهرست روزهای هفته نادیده‌گرفته‌شده اجتماع این دو خواهد بود. این مثال را در نظر بگیرید: .PP .nf OMIT Sat Sun REM 15 OMIT Fri Sat MSG Whatever .fi .PP در دستور REM، فهرست موثر روزهای هفته نادیده‌گرفته‌شده، جمعه، شنبه و یکشنبه خواهد بود. .PP .B "نادیده‌گیری‌های محلی محاسباتی (COMPUTED LOCAL OMITS)" .PP عبارت .B OMITFUNC از دستور .B REM به شما امکان می‌دهد تابعی را ارائه دهید که تعیین می‌کند آیا یک تاریخ نادیده گرفته می‌شود یا خیر. توجه داشته باشید که به .B OMITFUNC تنها باید نام یک تابع تعریف‌شده توسط کاربر داده شود؛ این عبارت نمی‌تواند یک عبارت دلخواه یا نام یک تابع توکار را بپذیرد. .PP به تابع یک پارامتر منفرد از نوع .B DATE داده می‌شود، و اگر تاریخ «نادیده‌گرفته‌شده» تلقی شود باید یک عدد صحیح غیر صفر، و در غیر این صورت 0 برگرداند. در این‌جا یک مثال آمده است: .PP .nf FSET _third(x) (day(x) % 3) || \\ (wkdaynum(x) == 0) || \\ (wkdaynum(x) == 6) REM OMITFUNC _third AFTER MSG Working day divisible by 3 .fi .PP در مثال بالا، یادآور در هر دوشنبه تا جمعه‌ای که شماره روز ماه آن بر سه بخش‌پذیر باشد فعال می‌شود. نحوه کار آن چنین است: .TP .B o بخش .B OMITFUNC _third باعث می‌شود تمام روزهایی که .B _third(x) برای آن‌ها مقداری غیر صفر برمی‌گرداند «نادیده‌گرفته‌شده» تلقی شوند. این امر باعث می‌شود تمام روزهایی که شماره روز ماه آن‌ها مضربی از سه .I نیست نادیده گرفته شوند. توجه داشته باشید که third_ اگر روز هفته یکشنبه یا شنبه باشد نیز غیر صفر برمی‌گرداند. .TP .B o کلیدواژه .B AFTER باعث می‌شود یادآور به پس از یک بلوک از روزهای نادیده‌گرفته‌شده منتقل شود. .PP ترکیب کلیدواژه‌های OMITFUNC و AFTER باعث می‌شود یادآور در تمام روزهایی که شماره روز ماه آن‌ها بر سه بخش‌پذیر است، اما نه در روزهای شنبه یا یکشنبه، صادر گردد. .PP توجه داشته باشید که اگر از .B OMITFUNC استفاده کنید، یک .B OMIT محلی .I نادیده گرفته می‌شود و همچنین .IR "تمامی OMITهای سراسری" . اگر می‌خواهید روزهای خاصی از هفته را نادیده بگیرید، تابع نادیده‌گیری شما باید آن‌ها را به طور خاص آزمایش کند. اگر می‌خواهید زمینه .B OMIT سراسری را در نظر بگیرید، تابع نادیده‌گیری شما باید آن را به صورت صریح (با استفاده از تابع .BR ()isomitted ) آزمایش کند. .PP توجه داشته باشید که یک .B OMITFUNC نادرست ممکن است باعث شود تمام روزها نادیده‌گرفته‌شده به شمار آیند. به همین دلیل، هنگامی که .B Remind روزهای نادیده‌گرفته‌شده را جستجو می‌کند، جستجو را پس از حد تکرار .B SATISFY (گزینه خط فرمان .BR \-x ) متوقف می‌سازد. .PP .B "افزودن تاریخ‌های فعال‌سازی به زمینه OMIT (ADDING TRIGGER DATES TO THE OMIT CONTEXT)" .PP اگر کلیدواژه .B ADDOMIT در یک دستور .B REM ظاهر شود، آن‌گاه تاریخ فعال‌سازی (در صورتی که قابل محاسبه باشد) به صورت خودکار به فهرست OMITهای سراسری افزوده می‌شود. .PP دستور: .PP .nf REM ... whatever ... ADDOMIT MSG Foo .fi .PP از نظر رفتار با دنباله زیر یکسان است: .PP .nf REM ... whatever ... SATISFY 1 IF trigvalid() OMIT [trigdate()] MSG Foo ENDIF .fi .PP .B "یادآورهای زمان‌دار (TIMED REMINDERS)" .PP یادآورهای زمان‌دار یادآورهایی هستند که یک کلیدواژه .B AT دارند که با یک .I time و به صورت اختیاری .I tdelta و .I trepeat دنبال می‌شود. مقدار .I time ممکن است در قالب ۲۴ ساعته مشخص شود، که در آن 0:00 نشان‌دهنده نیمه‌شب، 12:00 نشان‌دهنده ظهر، و 23:59 نشان‌دهنده یک دقیقه به نیمه‌شب است. در غیر این صورت، می‌توان آن را در قالب رایج «AM/PM» مشخص کرد؛ در این حالت، ساعت باید در بازه ۱ تا ۱۲ باشد. مقدار 12:00am نشان‌دهنده نیمه‌شب، 12:00pm نشان‌دهنده ظهر، و 11:59pm نشان‌دهنده یک دقیقه به نیمه‌شب است. بخش‌های «am» و «pm» حساس به حروف کوچک و بزرگ نیستند و حرف «m» اختیاری است. .PP می‌توانید از دونقطه یا نقطه برای جداسازی ساعت از دقیقه استفاده کنید؛ یعنی 13:39 و 13.39 معادل یکدیگرند. .PP نرم‌افزار .B Remind با یادآورهای زمان‌دار به طور ویژه‌ای رفتار می‌کند. اگر تاریخ فعال‌سازی یک یادآور زمان‌دار با تاریخ جاری سیستم یکسان باشد، یادآور برای فعال‌سازی در آینده در صف قرار می‌گیرد. هنگامی که .B Remind پردازش فایل یادآور را به پایان رساند، خود را به پس‌زمینه می‌برد، و با رسیدن زمان سیستم به زمان مشخص‌شده، یادآورهای زمان‌دار را فعال می‌کند. توجه داشته باشید که اگر از اصلاح‌کننده .B NOQUEUE در دستور .B REM استفاده کنید، این صف‌بندی و فعال‌سازی در پس‌زمینه انجام .I نمی‌شود . اصلاح‌کننده .B NOQUEUE زمانی مفید است که می‌خواهید زمانی به یک یادآور اختصاص یابد (مثلاً در تقویم) اما علاقه‌ای به ظاهر شدن یادآور به صورت بالاپران (popup) در زمان مشخص‌شده ندارید. .PP اگر از یک .I tdelta بسیار بزرگ استفاده کنید، .B Remind یادآورهای با تاریخ آینده را که .I tdelta و .I trep اختیاری آن‌ها باعث صدور آن‌ها در امروز می‌شود، در صف قرار می‌دهد. .PP با این حال، اگر از کلیدواژه SCHED استفاده کنید، هرگونه .I tdelta .I نادیده گرفته می‌شود و نمی‌توانید یادآور را مجبور کنید که زودتر از تاریخ فعال‌سازی واقعی در صف قرار گیرد. .PP برای مثال، یادآور زیر که در هر روز کاری فعال می‌شود، پیامی صادر می‌کند که به شما می‌گوید در ساعت 5:00pm محل را ترک کنید: .PP .nf REM Mon Tue Wed Thu Fri AT 17:00 MSG Time to leave! .fi .PP یادآور زیر در پنجشنبه‌ها و جمعه‌ها فعال خواهد شد، اما فقط در روزهای جمعه در صف قرار می‌گیرد: .PP .nf REM Fri ++1 AT 1:00PM MSG Lunch at 1pm Friday. .fi .PP مقادیر .I tdelta و .I trepeat قالبی مشابه با .I repeat و .I delta دارند، اما بر حسب دقیقه مشخص می‌شوند. به عنوان مثال، این یادآور در ساعت 12:00pm و همچنین ۴۵ دقیقه پیش از آن فعال خواهد شد: .PP .nf REM AT 12:00 +45 MSG Example .fi .PP یادآور زیر از ساعت 10:45 شروع شده و هر نیم ساعت تا 11:45، و مجدداً در ظهر صادر خواهد شد: .PP .nf REM AT 12:00 +75 *30 MSG Example2 .fi .PP مقدار «+75» بدین معناست که صدور یادآور از ۷۵ دقیقه قبل از ظهر، به عبارت دیگر در ساعت 10:45 آغاز می‌شود. مقدار 30* مشخص می‌کند که یادآور پس از آن هر ۳۰ دقیقه یک‌بار صادر شود. توجه داشته باشید که یادآور همواره در زمان مشخص‌شده صادر می‌شود، حتی اگر .I tdelta مضربی از .I trepeat نباشد. بنابراین مثال بالا در ساعت‌های 10:45am، 11:15am، 11:45am و 12:00pm صادر می‌شود. توجه کنید که در مشخصات زمان، تفاوتی میان قالب‌های «+» و «++» برای .I tdelta وجود ندارد. .PP به‌طور معمول، .B Remind هنگام پردازش اسکریپت یادآور، یادآورهای زمان‌دار را صادر می‌کند و همچنین آن‌ها را برای بعد در صف قرار می‌دهد. اگر نمی‌خواهید .B Remind هنگام پردازش اسکریپت یادآورها را صادر کند، بلکه فقط می‌خواهید آن‌ها را برای بعد در صف قرار دهد، از گزینه خط فرمان .B \-a استفاده کنید. اگر نمی‌خواهید یادآورها برای بعد در صف قرار گیرند، از گزینه خط فرمان .B \-q استفاده کنید. .PP به‌طور معمول، .B Remind یک فرآیند پس‌زمینه را برای مدیریت یادآورهای در صف فورک می‌کند. اگر می‌خواهید .B Remind در پیش‌زمینه باقی بماند، از گزینه خط فرمان .B \-f استفاده کنید. این گزینه برای مثال در اسکریپت‌های xinitrc. مفید است، جایی که می‌توانید از دستور زیر استفاده کنید: .PP .nf remind \-fa myreminders & .fi .PP این کار تضمین می‌کند هنگامی که از X-Windows خارج می‌شوید، فرآیند .B Remind کشته می‌شود. .PP .B "هشدار درباره یادآورهای زمان‌دار (WARNING ABOUT TIMED REMINDERS)" .PP توجه: اگر از توابع یا متغیرهای تعریف‌شده توسط کاربر (که بعداً شرح داده می‌شوند) در بدنه یادآورهای زمان‌دار استفاده کنید، هنگامی که یادآورهای زمان‌دار فعال می‌شوند، متغیرها و توابع تعاریفی را خواهند داشت که در انتهای اسکریپت یادآور برقرار بوده‌اند. این تعاریف لزوماً ممکن است تعاریفی .I نباشند که در زمان صف‌بندی یادآور برقرار بودند. علاوه بر این، زمینه OMIT همان چیزی است که در انتهای اسکریپت یادآور برقرار بوده است، که ممکن است لزوماً با زمانی که دستور .B REM برای نخستین بار پردازش شد یکسان نباشد. .PP .B "کلیدواژه‌های SCHED و WARN (THE SCHED AND WARN KEYWORDS)" .PP کلیدواژه .B SCHED امکان کنترل دقیق‌تر فعال‌سازی یادآورهای زمان‌دار را فراهم می‌کند، و کلیدواژه .B WARN کنترل دقیق بر فعال‌سازی پیش‌هنگام تمامی انواع یادآورها را میسر می‌سازد. با این حال، بحث در این باره باید به بعد از توضیح عبارات و توابع تعریف‌شده توسط کاربر موکول شود. زیربخش «PRECISE SCHEDULING» را در ادامه ببینید. .PP .B "TAG، INFO و DURATION" .PP کلیدواژه .B TAG به شما اجازه می‌دهد یادآورهای خاصی را «برچسب‌گذاری» کنید. این قابلیت توسط برخی بک‌اندها یا سیستم‌های ساخته‌شده پیرامون .BR Remind ، مانند .BR TkRemind ، استفاده می‌شود. این بک‌اندها قوانین خاصی درباره برچسب‌ها دارند؛ برای جزئیات به مستندات آن‌ها مراجعه کنید. .PP کلیدواژه .B TAG با برچسبی شامل حداکثر ۴۸ نویسه دنبال می‌شود. در یک عبارت REM مفروض می‌توانید هر تعداد بند TAG که مایلید داشته باشید. یک برچسب می‌تواند شامل هر نویسه‌ای به جز فاصله خالی و کاما باشد. .PP اگر گزینه .B \-y را به .B Remind بدهید، برای هر یادآوری که فاقد .B TAG باشد، یک برچسب ساخته می‌شود. برچسب ساخته‌شده شامل نویسه‌های «__syn__» و به دنبال آن نمایش هگزادسیمال مجموع MD5 خط دستور REM است. این امر به شما امکان می‌دهد یک شناسه کم‌وبیش یکتا به هر دستور متمایز REM اختصاص دهید. .PP کلیدواژه .B INFO مشابه با .B TAG است اما با هدف انتقال فراداده درباره یک رویداد، مانند مکان آن، در نظر گرفته شده است. بک‌اندها قوانین خود را درباره این‌که کدام .IR info_string ها را شناسایی می‌کنند خواهند داشت، و باید .IR info_string هایی را که نمی‌شناسند نادیده بگیرند. توجه داشته باشید که .B INFO باید با یک رشته در گیومه دنبال شود؛ می‌توانید با ارائه "\\n" خطوط جدید را در رشته بگنجانید. .PP یک رشته INFO .I باید به صورت "Header: Value" باشد. سرآیند (Header) می‌تواند شامل هر نویسه قابل چاپی باشد، اما نمی‌تواند حاوی فاصله خالی باشد. مقدار (Value) می‌تواند شامل هر نویسه‌ای باشد که می‌خواهید. قبل از دونقطه نباید فاصله بیاید، اما بعد از آن مجاز است؛ چنین فاصله‌ای بخشی از مقدار در نظر گرفته نمی‌شود. اگر بیش از یک رشته INFO برای یک یادآور مشخص وجود داشته باشد، سرآیند تکراری مجاز نیست. هنگام تعیین این‌که آیا یک سرآیند تکراریِ یک سرآیند موجود است یا خیر، بزرگی و کوچکی حروف نادیده گرفته می‌شود. .PP به عنوان مثال، یک بک‌اند فرضی ممکن است به شما امکان دهد مکان و توضیحات یک یادآور را به این صورت تعیین کنید: .PP .nf REM 26 Feb 2025 INFO "Location: Boardroom #2" \\ INFO "Description: Go over latest pull requests" \\ MSG Engineering meeting .fi .PP در حالی که بک‌اندها می‌توانند انتخاب کنند از کدام رشته‌های INFO پشتیبانی کنند، تمام بک‌اندها باید تلاش کنند از سه مورد استاندارد پشتیبانی به عمل آورند: .BR Location: ، .B Description: و .BR Url: . برنامه TkRemind از هر سه این موارد پشتیبانی می‌کند؛ به این صورت که یادآورهای دارای رشته INFO با .B Url: را به ابرپیوند تبدیل می‌کند، و پنجره‌های اطلاعاتی را برای رشته‌های INFO با .B Location: و .B Description: بالا می‌آورد. مقادیر .B Location: و .B Url: بی‌نیاز از توضیح‌اند؛ .B Description: برای توضیحی طولانی‌تر و عمیق‌تر از یادآور نسبت به خلاصه‌ای که معمولاً نمایش داده می‌شود، در نظر گرفته شده است. .PP کلیدواژه .B DURATION تنها برای یادآورهای زمان‌دار معنادار است؛ این کلیدواژه مدت زمان یک رویداد را مشخص می‌کند. برای مثال، اگر جلسه‌ای ۹۰ دقیقه‌ای دارید که از ساعت 1:00pm آغاز می‌شود، می‌توانید از هر یک از موارد زیر استفاده کنید: .PP .nf REM 5 March 2021 AT 13:00 DURATION 1:30 MSG Meeting REM 5 March 2021 AT 13:00 DURATION 90 MSG Meeting REM 5 March 2021 AT 1:00pm DURATION 1:30 MSG Meeting REM 5 March 2021 AT 1:00pm DURATION 90 MSG Meeting .fi .PP برای یادآورهای با مدت زمان طولانی، استفاده از عبارات برای ساده‌سازی نوشتن DURATION راحت است. برای مثال، اگر از ۲۰ فوریه ۲۰۲۳ تا ۲۳ فوریه ۲۰۲۳ دور هستید (مجموعاً ۴ روز)، می‌توانید بنویسید: .PP .nf REM 20 Feb AT 00:00 DURATION [4*24]:00 MSG away REM 20 Feb AT 00:00 DURATION [4*24*60] MSG away .fi .PP توجه داشته باشید که .I duration یا به صورت .IR hours : minutes یا صرفاً به صورت .I minutes که به شکل یک .I integer (عدد صحیح) بیان شده است، مشخص می‌شود. .PP اگر مدت زمانی برابر با 00:00 یا 0 را مشخص کنید، .B Remind دقیقاً طوری رفتار می‌کند که گویی اصلاً هیچ .B DURATION حضور نداشته است. اگرچه مدت زمان‌هایی که به صورت .IR hours : minutes مشخص می‌شوند از نظر ظاهری شبیه به زمان از روز به نظر می‌رسند، اما چنین نیستند؛ مولفه .I hours به بازه 00-23 محدود نمی‌شود. .PP .SH "قند نحوی برای دستور REM (SYNTACTIC SUGAR FOR REM)" .PP دستور REM قند نحوی دارد تا به شما امکان دهد یادآورهای رایج را بیان کنید. جفت‌های یادآور زیر با یکدیگر معادل هستند: .PP .nf REM First Monday April MSG Foo REM Mon 1 April MSG Foo REM Second Monday May MSG Bar REM Mon 8 May MSG Bar REM Third Monday MSG Third Monday of every month REM Mon 15 MSG Third Monday of every month REM Fourth Sunday June 2025 MSG Fourth Sunday in June 2025 REM Sun 22 June 2025 MSG Fourth Sunday in June 2025 REM Last Monday MSG Last Monday of every month REM Mon 1 --7 MSG Last Monday of every month REM Last Monday April MSG Last Monday of every April REM Mon 1 May --7 MSG Last Monday of every April REM Last Monday December 2025 MSG Last Monday of Dec 2025 REM Monday 1 Jan 2026 --7 MSG Last Monday of Dec 2025 .fi .PP توجه داشته باشید که .B Last در صورت نیاز، ماه و سال را به طور موثری تنظیم می‌کند تا یادآور در تاریخ صحیح فعال شود. .PP کلیدواژه .B IN کاملاً نادیده گرفته می‌شود، بنابراین می‌توانید (به عنوان مثال) بنویسید: .PP .nf REM Second Monday in May MSG foo REM Last Monday in December 2025 MSG Bar .fi .PP شکل دیگری از .I back نوشتن یادآورها را آسان‌تر می‌کند. گروه‌های یادآور زیر معادل یکدیگرند: .PP .nf REM ~~1 MSG Last day of every month REM Lastday MSG Last day of every month REM 1 --1 MSG Last day of every month REM May ~~1 MSG Last day of May REM Lastday May MSG Last day of May REM 1 June --1 MSG Last day of May REM Dec 2025 ~~1 MSG Last day of December 2025 REM Lastday Dec 2025 MSG Last day of December 2025 REM 1 Jan 2026 --1 MSG Last day of December 2025 REM Apr ~1 OMIT SAT SUN MSG Last workday of April REM Lastworkday April OMIT SAT SUN MSG Last workday of April REM 1 May -1 OMIT SAT SUN MSG Last workday of April REM Apr ~~7 MSG Seventh-last day of April REM 1 May --7 MSG Seventh-last day of April REM Apr ~2 OMIT SAT SUN MSG Second-last workday of April REM 1 May -2 OMIT SAT SUN MSG Second-last workday of April .fi .PP همان‌طور که می‌بینیم، "Lastday" معادل ~~1 و "Lastworkday" معادل ~1 است. .PP توجه داشته باشید که کلیدواژه‌های First/Second/Third/Fourth/Last و شکل‌های ~ و ~~ از .I back بر یک مقدار برای روز ماه دلالت دارند؛ از این رو، نمی‌توان آن‌ها را با یک روز ترکیب کرد. علاوه بر این، First/Second/Third/Fourth/Last باید دست‌کم یک نام روز هفته داشته باشند. موارد زیر غیرمجاز هستند: .PP .nf REM First Monday 3 June MSG Huh? REM April 3 ~~1 MSG What? REM Second June MSG Where's the weekday??? .fi .PP .SH "فیلتر جایگزینی (THE SUBSTITUTION FILTER)" .PP پیش از پردازش، بدنه یک دستور .B REM از یک فیلتر جایگزینی عبور داده می‌شود. این فیلتر توالی‌های "%x" (که در آن "x" هر حرف الفبا و برخی نویسه‌های خاص دیگر است) را بررسی کرده و جایگزینی‌ها را مطابق زیر انجام می‌دهد. (تمامی تاریخ‌ها به تاریخ فعال‌سازی یادآور اشاره دارند.) .TP .B %a با عبارت "on \fIweekday, day month, year\fR" (در \fIروز هفته، روز ماه، سال\fR) جایگزین می‌شود. .RS برای مثال، این یادآور را در نظر بگیرید: .PP REM 18 Oct 1990 +4 MSG Meeting with Bob %a. .PP در ۱۶ اکتبر ۱۹۹۰، عبارت "Meeting with Bob on Thursday, 18 October, 1990." چاپ می‌شود. .PP در ۱۷ اکتبر ۱۹۹۰، عبارت "Meeting with Bob tomorrow." چاپ می‌شود. .PP در ۱۸ اکتبر ۱۹۹۰، عبارت "Meeting with Bob today." چاپ می‌شود. .RE .TP .B %b با "in \fIdiff\fR day's time" (در مدت \fIdiff\fR روز آینده) جایگزین می‌شود که در آن .I diff تعداد .B واقعی روزهای بین تاریخ جاری و تاریخ فعال‌سازی است. (دستورات و روزهای \fBOMIT\fR هیچ تاثیری ندارند.) .RS برای مثال، این دستور را در نظر بگیرید: .PP REM 18 Oct 1990 +4 MSG Meeting with Bob %b. .PP در ۱۶ اکتبر ۱۹۹۰، عبارت "Meeting with Bob in 2 days' time." چاپ می‌شود. .PP در ۱۷ اکتبر ۱۹۹۰، عبارت "Meeting with Bob tomorrow." چاپ می‌شود. .PP در ۱۸ اکتبر ۱۹۹۰، عبارت "Meeting with Bob today." چاپ می‌شود. .RE .TP .B %c با "on \fIweekday\fR" (در \fIروز هفته\fR) جایگزین می‌شود. .RS مثال: REM 18 Oct 1990 +4 MSG Meeting with Bob %c. .PP در ۱۶ اکتبر ۱۹۹۰، عبارت "Meeting with Bob on Thursday." چاپ می‌شود. .PP در ۱۷ اکتبر ۱۹۹۰، عبارت "Meeting with Bob tomorrow." چاپ می‌شود. .PP در ۱۸ اکتبر ۱۹۹۰، عبارت "Meeting with Bob today." چاپ می‌شود. .RE .TP .B %d با "\fIday\fR"، یعنی روز ماه جایگزین می‌شود. .TP .B %e با "on \fIdd-mm-yyyy\fR" جایگزین می‌شود. .TP .B %f با "on \fImm-dd-yyyy\fR" جایگزین می‌شود. .TP .B %g با "on \fIweekday, day month\fR" جایگزین می‌شود. .TP .B %h با "on \fIdd-mm\fR" جایگزین می‌شود. .TP .B %i با "on \fImm-dd\fR" جایگزین می‌شود. .TP .B %j با "on \fIweekday, month day-th, year\fR" جایگزین می‌شود. این قالب بر حسب مورد، پسوندهای ترتیبی "st"، "nd"، "rd" یا "th" را به روز ماه اضافه می‌کند. .TP .B %k با "on \fIweekday, month day-th\fR" جایگزین می‌شود. .TP .B %l با "on \fIyyyy-mm-dd\fR" جایگزین می‌شود. .TP .B %m با "\fImonth\fR"، یعنی نام ماه جایگزین می‌شود. .TP .B %n با شماره ماه (۱ تا ۱۲) جایگزین می‌شود. .TP .B %o با " (today)" جایگزین می‌شود اگر و تنها اگر تاریخ جاری سیستم دقیقاً همان تاریخی باشد که توسط .B Remind به عنوان تاریخ جاری استفاده می‌شود. به یاد داشته باشید که می‌توانید از طریق خط فرمان تاریخی را برای استفاده .B Remind مشخص کنید. این جایگزینی معمولاً در یک دستور .B REM کاربرد چندانی ندارد، اما در دستور .B BANNER بسیار مفید است. (بخش "دستور BANNER" را ببینید.) .TP .B %p اگر مقدار .I diff (اختلاف روزها) بین تاریخ جاری و تاریخ فعال‌سازی برابر با ۱ نباشد، با "s" جایگزین می‌شود (برای جمع بستن واژه day در انگلیسی). می‌توانید از این توالی برای ساخت یادآورهایی مانند نمونه زیر استفاده کنید: .RS REM 1 Jan +4 MSG %x day%p to go before New Year! .RE .TP .B %q اگر مقدار .I diff بین تاریخ فعال‌سازی و تاریخ جاری برابر با ۱ باشد، با "'s" جایگزین می‌شود. در غیر این صورت با "s'" جایگزین می‌گردد. از این مورد می‌توان به صورت زیر استفاده کرد: .RS REM 1 Jan +4 MSG New Year in %x day%q time! .RE .TP .B %r با روز ماه (۰۱ تا ۳۱) جایگزین می‌شود که در صورت نیاز با صفر در ابتدا پر شده تا دو رقمی شود. .TP .B %s بسته به روز ماه، با یکی از پسوندهای ترتیبی انگلیسی "st"، "nd"، "rd" یا "th" جایگزین می‌شود. .TP .B %t با شماره ماه (۰۱ تا ۱۲) که با صفر اولیه به صورت دو رقمی پر شده است جایگزین می‌شود. .TP .B %u با "on \fIweekday, day-th month, year\fR" جایگزین می‌شود. این توالی شبیه به .B %a است، با این تفاوت که پسوندهای ترتیبی "st"، "nd"، "rd" یا "th" بر حسب مورد به .I day (روز) اضافه می‌شود. .TP .B %v با "on \fIweekday, day-th month\fR" جایگزین می‌شود. .TP .B %w با "\fIweekday\fR"، یعنی نام روز هفته جایگزین می‌شود. .TP .B %x با مقدار .I diff (اختلاف) بین تاریخ جاری و تاریخ فعال‌سازی جایگزین می‌شود. این .I diff به عنوان تعداد روزهای واقعی بین این دو تاریخ تعریف می‌شود؛ موارد .B OMIT شمارش نمی‌شوند. (تفریق دقیق تقویمی انجام می‌شود.) .TP .B %y با "\fIyear\fR"، یعنی سال تاریخ فعال‌سازی جایگزین می‌شود. .TP .B %z با "\fIyy\fR"، یعنی دو رقم آخر سال جایگزین می‌شود. .TP .B %(\fIany_text\fR\fB) با جستجوی عبارت \fIany_text\fR در جدول ترجمه جایگزین می‌شود. این معادل [_("any_text")] است، اما تایپ کردن آن راحت‌تر است. .TP .B %<\fIany_text\fR\fB> با مقدار INFO مرتبط با هدر \fIany_text\fR یا در صورت عدم وجود چنین مقداری، با یک رشته خالی جایگزین می‌شود. این توالی معادل [triginfo("any_text")] است، اما تایپ کردن آن آسان‌تر می‌باشد. .TP .B %_ (درصد-زیرخط) با یک نویسه خط جدید (Newline) جایگزین می‌شود. می‌توانید از این توالی برای ایجاد یادآوری‌های چندخطی استفاده کنید. توجه داشته باشید که بک‌اندهای مختلف تقویم در نحوه مدیریت یادآورهای چندخطی تفاوت دارند: .RS .TP .B o اجرای \fBremind -c\fR خطوط جدید را در خروجی تقویم ترمینال حفظ می‌کند. .TP .B o برنامه \fBrem2pdf\fR در صورتی که \fBremind\fR با گزینه \fB\-pp\fR یا \fB\-ppp\fR فراخوانی شود، خطوط جدید را حفظ می‌کند. .TP .B o برنامه \fBrem2html\fR در صورتی که \fBremind\fR با گزینه \fB\-pp\fR فراخوانی شود، خطوط جدید را حفظ می‌کند. .TP .B o برنامه \fBtkremind\fR خطوط جدید را حفظ می‌کند.\fR .TP .B o برنامه \fBrem2ps\fR خطوط جدید را به فاصله (Space) تبدیل می‌کند. اما \fBrem2ps\fR منسوخ شده است؛ به جای آن از \fBrem2pdf\fR استفاده کنید. .TP .B o قالب‌های "تقویم ساده" (یعنی گزینه‌های \fB\-s\fR، \fB\-n\fR و \fB\-p\fR در \fBremind\fR) خطوط جدید را به فاصله تبدیل می‌کنند. .PP تمام بک‌اندهای تقویم فاصله‌های متوالی چندگانه را به یک فاصله تکی و خطوط جدید متوالی چندگانه را به یک خط جدید تکی تبدیل (فشرده) می‌کنند. .RE .TP .B %1 بسته به وضعیت یادآور زمان‌دار، با یکی از عبارت‌های "now" (اکنون)، "\fIm\fR minutes from now" (\fIm\fR دقیقه بعد)، "\fIm\fR minutes ago" (\fIm\fR دقیقه پیش)، "\fIh\fR hours from now" (\fIh\fR ساعت بعد)، "\fIh\fR hours ago" (\fIh\fR ساعت پیش)، "\fIh\fR hours and \fIm\fR minutes from now" (\fIh\fR ساعت و \fIm\fR دقیقه بعد) یا "\fIh\fR hours and \fIm\fR minutes ago" (\fIh\fR ساعت و \fIm\fR دقیقه پیش) جایگزین می‌شود. اگر یادآور بیش از یک روز در آینده باشد، پیشوند "\fId\fR days," به ابتدای عبارت افزوده می‌شود. توجه داشته باشید که مگر در صورت مشخص کردن گزینه \fB\-a\fR، یادآورهای زمان‌دار مانند یادآورهای معمولی فعال می‌شوند و بنابراین ممکن است یادآوری زمان‌داری که زمان آن در ساعات اولیه همان روز گذشته است نیز راه‌اندازی شود. این امر دلیل نیاز به عبارت‌های "...ago" (پیش) را توجیه می‌کند. .TP .B %2 بسته به زمان .B AT یادآور، با عبارت "at \fIhh\fR:\fImm\fRam" یا "..pm" جایگزین می‌شود. .TP .B %3 با عبارت "at \fIhh\fR:\fImm\fR" در قالب ۲۴ ساعته جایگزین می‌شود. .TP .B %4 با "\fImm\fR" جایگزین می‌شود که در آن \fImm\fR تعداد دقایق بین زمان "جاری" و تاریخ و زمان فعال‌سازی مشخص‌شده توسط \fBAT\fR است. اگر زمان \fBAT\fR قبل از زمان جاری باشد، حاصل عددی منفی خواهد بود. .TP .B %5 با "\fIma\fR" جایگزین می‌شود که در آن \fIma\fR قدر مطلق عدد تولید شده توسط \fB%4\fR است. .TP .B %6 بسته به رابطه بین زمان \fBAT\fR و زمان جاری، با "ago" (پیش) یا "from now" (دیگر / بعد) جایگزین می‌شود. .TP .B %7 با تعداد ساعت‌های بین زمان \fBAT\fR و زمان جاری جایگزین می‌شود. این مقدار همیشه نامنفی و عددی بین ۰ تا ۲۳ است. (یعنی برای رویدادهایی با فاصله بیش از یک روز، روزها در \fB%7\fR محاسبه نمی‌شوند.) .TP .B %8 با تعداد دقایق بین زمان \fBAT\fR و زمان جاری، پس از کسر ساعت‌ها (\fB%7\fR)، جایگزین می‌شود. این عدد مقداری از ۰ تا ۵۹ است. .TP .B %9 اگر مقدار تولید شده توسط \fB%8\fR برابر با ۱ نباشد، با "s" جایگزین می‌شود (برای جمع بسته شدن minutes در انگلیسی). .TP .B %0 اگر مقدار تولید شده توسط \fB%7\fR برابر با ۱ نباشد، با "s" جایگزین می‌شود (برای جمع بسته شدن hours در انگلیسی). .TP .B %! اگر تاریخ و زمان جاری پیش از تاریخ فعال‌سازی و زمان \fBAT\fR باشد، با "is" و اگر پس از آن باشد، با "was" جایگزین می‌شود. توالی \fB%!\fR را می‌توان در یادآورهای بدون زمان نیز استفاده کرد که در این صورت فقط تاریخ‌ها با هم مقایسه می‌شوند. .TP .B %? اگر تاریخ و زمان جاری قبل از تاریخ فعال‌سازی و زمان \fBAT\fR باشد، با "are" و اگر بعد از آن باشد، با "were" جایگزین می‌شود. توالی \fB%?\fR در یادآورهای غیرزمان‌دار نیز قابل استفاده است که در آن حالت فقط تاریخ‌ها مقایسه می‌شوند. .TP .B %@ مشابه \fB%2\fR است اما زمان جاری را نمایش می‌دهد. .TP .B %# مشابه \fB%3\fR است اما زمان جاری را نمایش می‌دهد. .TP .B %: برای یک یادآور TODO که تاریخ فعال‌سازی آن در تاریخ COMPLETE-THROUGH یا پس از آن باشد، با " (done)" جایگزین می‌شود. در هر وضعیت دیگری با یک رشته خالی جایگزین می‌شود. توجه داشته باشید از آنجا که \fBRemind\fR یادآورهای TODO تکمیل‌شده را در حالت Agenda نمایش نمی‌دهد، این توالی اسکیپ در عمل تنها در حالت Calendar (تقویم) مفید است. .TP .B %" .\" " (درصد-نقل‌قول دوگانه) حذف می‌شود. این توالی توسط فیلتر جایگزینی استفاده نمی‌شود، بلکه برای تعیین متنی به کار می‌رود که هنگام انتخاب گزینه‌های \fB\-c\fR، \fB\-s\fR یا \fB\-p\fR باید توسط \fBRemind\fR در ورودی تقویم گنجانده شود. بخش "حالت تقویم (CALENDAR MODE)" را ببینید. .PP نکات: .TP o .B Remind به‌طور معمول پس از هر یادآور یک خط خالی چاپ می‌کند؛ اگر آخرین نویسه بدنه "%" باشد، خط خالی چاپ نخواهد شد. می‌توانید با تنظیم \fB$AddBlankLines\fR روی ۰، چاپ خطوط خالی اضافی را به‌طور سراسری غیرفعال کنید. .TP o جایگزینی‌های a، b، c، e، f، g، h، i، j، k، l، u و v همگی در صورتی که تاریخ جاری با تاریخ فعال‌سازی برابر باشد با "today" (امروز) و اگر تاریخ فعال‌سازی یک روز بعد از تاریخ جاری باشد با "tomorrow" (فردا) جایگزین می‌شوند. بنابراین، این موارد با جایگزینی‌های ساخته‌شده از توالی‌های ساده‌تر مانند %w، %y و غیره یکسان .B نیستند. .TP o پیش از جایگزینی‌های a، c، e، f، g، h، i، j، k، l، u، v، 2 و 3 می‌توان از یک ستاره استفاده کرد (مانند \fB%*c\fR) که باعث می‌شود واژه "at" یا "on" که به‌طور معمول در خروجی درج می‌شد، حذف گردد. .TP o جایگزینی‌های ! و ? می‌توانند با ستاره همراه شوند (\fB%*!\fR یا \fB%*?\fR)؛ در این صورت مقایسه بین تاریخ فعال‌سازی و تابع ()realtoday به جای ()today انجام می‌گیرد. .TP o هر یک از جایگزینی‌های مربوط به زمان (۰ تا ۹) اگر در یادآوری فاقد کلمه کلیدی \fBAT\fR استفاده شوند، نتایج تعریف‌نشده‌ای تولید می‌کنند. همچنین، اگر یک یادآور دارای \fIdelta\fR باشد و در چندین روز فعال شود، جایگزینی‌های زمانی تاریخ را نادیده می‌گیرند. بنابراین، برای نمونه جایگزینی \fB%1\fR ممکن است گزارش دهد که جلسه ۱۵ دقیقه دیگر است، در حالی که در واقع ۲ روز بعد است، زیرا یک \fIdelta\fR یادآور را فعال کرده است. توصیه می‌شود جایگزینی‌های زمانی را تنها در یادآورهای زمان‌دار بدون \fIdelta\fR که برای صف‌بندی جهت فعال‌سازی زمان‌بندی‌شده طراحی شده‌اند استفاده کنید. .TP o می‌توان از حروف بزرگ لاتین در توالی جایگزینی استفاده کرد که در این صورت، حرف اول رشته جایگزین‌شده به صورت بزرگ نوشته می‌شود (در صورتی که به‌طور معمول یک حرف کوچک باشد). .TP o سایر نویسه‌های پس از علامت "%" مستقیماً رونوشت می‌شوند. به‌ویژه، برای چاپ علامت "%"، از "%%" در بدنه استفاده کنید. برای شروع بدنه یک یادآور با فاصله، از "% " استفاده کنید؛ زیرا .B Remind معمولاً پس از نشانه‌های .B MSG، .B CAL یا .B RUN به دنبال اولین نویسه غیرفاصله می‌گردد. .PP .SH "رویدادها و وظایف (EVENTS AND TODOS)" .PP دستور \fBREM\fR به‌طور معمول برای ایجاد یک \fIEVENT\fR (رویداد) استفاده می‌شود. رویداد چیزی است که در زمان مشخصی رخ می‌دهد، احتمالاً تکرارشونده است و صرف‌نظر از اقداماتی که انجام می‌دهید اتفاق می‌افتد. رویدادها شامل مواردی مانند زادروزها، تعطیلات، جلسات و غیره هستند... تقریباً هر چیزی که طبق یک برنامه زمان‌بندی خاص رخ می‌دهد. پس از گذشت تاریخ رویداد، \fBRemind\fR دیگر آن رویداد را به شما یادآوری نخواهد کرد. .PP یک \fITODO\fR (وظیفه یا کار برای انجام) متفاوت است؛ این یک تسک یا وظیفه است که باید آن را تا یک تاریخ یا تاریخ و زمان معین تکمیل کنید. اگر یک TODO را صریحاً به عنوان انجام‌شده علامت‌گذاری نکنید، \fBRemind\fR حتی \fIپس از سررسید (Due Date)\fR نیز یادآوری آن را به شما ادامه خواهد داد. .PP برای علامت‌گذاری یک دستور \fBREM\fR به عنوان TODO، کافی است کلمه کلیدی TODO را درج کنید. برای مثال: .PP .nf REM TODO 15 August 2025 ++5 MSG Buy cat food %b. .fi .PP در حالت Agenda (دستور کار)، \fBRemind\fR از تاریخ ۱۰ اوت ۲۰۲۵ هشدار دادن را آغاز می‌کند که باید ظرف ۵ روز آینده، ۴ روز آینده و غیره غذای گربه بخرید... .PP با این حال، در ۱۶ اوت ۲۰۲۵، \fBRemind\fR عبارت "Buy cat food yesterday." (دیروز باید غذای گربه می‌خریدید) را نمایش می‌دهد و تا ابد یا تا زمانی که TODO را به عنوان انجام‌شده علامت‌گذاری کنید، این نیاز به خرید غذای گربه را به شما یادآوری خواهد کرد. .PP .SH "علامت‌گذاری وظایف به عنوان انجام‌شده (MARKING TODOS AS DONE)" .PP دو روش برای علامت‌گذاری یک TODO به عنوان انجام‌شده وجود دارد. اگر TODO تکرارشونده نباشد، ساده‌ترین راه حذف نشان‌گر TODO از دستور REM (یا در واقع، حذف کامل آن دستور) است. روش اول یادآور را در تقویم نگه می‌دارد در حالی که روش دوم آن را کاملاً حذف می‌کند. .PP اگر یک TODO تکرارشونده باشد، از بند \fBCOMPLETE-THROUGH\fR برای مشخص کردن اینکه کدام تکرارها تکمیل شده‌اند استفاده کنید. برای مثال: .PP .nf REM TODO 30 April ++15 COMPLETE-THROUGH 2025-04-30 MSG File taxes .fi .PP مالیات بر درآمد کانادا باید هر سال تا ۳۰ آوریل ارسال شود. دستور بالا پرداخت مالیات در سال ۲۰۲۶ را به شما یادآوری می‌کند. اگر تاریخ COMPLETE-THROUGH را به‌روزرسانی نکنید، پس از ۳۰ آوریل ۲۰۲۶، برنامه \fBRemind\fR تا ابد به شما یادآوری می‌کند که موعد مالیات شما ۳۰ آوریل ۲۰۲۶ بوده است. برای نشان دادن اینکه آن را پرداخت کرده‌اید، کافی است تاریخ COMPLETE-THROUGH را به 2026-04-30 به‌روزرسانی کنید؛ سپس \fBRemind\fR یادآوری مالیات سال ۲۰۲۷ را (از ۱۵ روز قبل از تاریخ سررسید) آغاز خواهد کرد. .PP تعیین COMPLETE-THROUGH بدون مشخص کردن TODO یک خطا محسوب می‌شود. کلمه کلیدی COMPLETED-THROUGH می‌تواند به عنوان مترادفی برای COMPLETE-THROUGH به کار رود. .PP .SH "محدود کردن یادآوری‌های مربوط به وظایف معوق (LIMITING REMINDERS ABOUT OVERDUE TODOS)" .PP اگرچه \fBRemind\fR با کمال میل می‌تواند تا صدها سال یادآوری وظایف (TODO) معوق را ادامه دهد، اما برای برخی کارها این یادآوری بی‌معنی خواهد بود. اگر می‌خواهید \fBRemind\fR پس از گذشت تعداد روز معینی از سررسید یک وظیفه، یادآوری مکرر آن را \fIمتوقف\fR کند، از بند MAX-OVERDUE \fIn\fR استفاده کنید. در این حالت، \fBRemind\fR یادآوری وظیفه‌ای را که بیش از \fIn\fR روز به تعویق افتاده متوقف می‌سازد. در اینجا یک مثال آورده شده است: .PP .nf REM TODO 2025-08-13 ++5 MAX-OVERDUE 5 MSG Task: %b. .fi .PP برنامه \fBRemind\fR یادآوری وظیفه را به دلیل مقدار پس‌روی ۵++ در تاریخ 2025-08-08 \fIآغاز\fR می‌کند. یادآوری وظیفه پس از موعد سررسید نیز ادامه می‌یابد. با این حال، به دلیل بند MAX-OVERDUE، آخرین باری که آن را یادآوری می‌کند در تاریخ 2025-08-18 خواهد بود. از تاریخ 2025-08-19 به بعد، \fBRemind\fR دیگر این وظیفه را یادآوری نخواهد کرد، زیرا احتمالاً دیگر فایده‌ای ندارد---چرا که دوره MAX-OVERDUE به پایان رسیده است. .PP .SH "جزئیات بیشتر درباره وظایف (MORE DETAILS ABOUT TODOS)" .PP وظایف (TODOs) فقط در حالت Agenda (دستور کار) به صورت ویژه مدیریت می‌شوند. در حالت Calendar (تقویم)، آن‌ها دقیقاً مانند یک رویداد معمولی در تقویم ظاهر می‌شوند. .PP وظایف از نظر داخلی به این صورت پیاده‌سازی می‌شوند که تاریخ COMPLETE-THROUGH به علاوه یک روز به عنوان نقطه شروع الگوریتم پیمایش تاریخ در \fBRemind\fR استفاده می‌شود. اگر یک TODO تکرارشونده بدون بند COMPLETE-THROUGH داشته باشید، \fBRemind\fR پیمایش را از آغاز زمان شروع می‌کند؛ که همه می‌دانیم ۱ ژانویه ۱۹۹۰ است! این دستور را در نظر بگیرید: .PP .nf REM TODO Wed +7 MSG Take out the trash %a (%b) .fi .PP اجرای این دستور در حالت Agenda در تاریخ 2025-08-13 خروجی زیر را تولید می‌کند: .PP .nf Take out the trash on Wednesday, 3 January, 1990 (13006 days ago) .fi .PP برنامه \fBRemind\fR در یادآوری وظایف به شما بسیار مصمم و پیگیر است! اگر زباله‌ها را بیرون بگذارید و آن را انجام‌شده علامت بزنید: .PP .nf REM TODO Wed +7 COMPLETE-THROUGH 2025-08-13 MSG Take out the trash %a (%b) .fi .PP سپس این خروجی را دریافت می‌کنید: .PP .nf Take out the trash on Wednesday, 20 August, 2025 (in 7 days' time) .fi .PP می‌توانید همانند رویدادها، از \fBFROM\fR و \fBUNTIL\fR برای محدود کردن بازه تکرار وظایف نیز استفاده کنید. برای مثال، اگر در ماه اوت از خانه کسی مراقبت می‌کنید و باید هر چهارشنبه به گیاهان آب بدهید: .PP .nf REM TODO Wed +7 FROM 2025-08-06 UNTIL 2025-08-27 MSG Plants %b. .fi .PP اجرای این دستور در ۱۳ اوت عبارت "Plants 7 days ago." را تولید می‌کند، زیرا به \fBRemind\fR نگفته‌اید که اولین آبیاری را انجام داده‌اید. اگر وظایف خود را تمام کنید و تاریخ COMPLETE-THROUGH برابر با 2025-08-27 را اضافه نمایید، \fBRemind\fR در آینده هرگز آن کار را یادآوری نخواهد کرد. .PP در حالت پاک‌سازی (Purge Mode)، برنامه \fBRemind\fR وظایف TODO را پاک‌سازی نمی‌کند مگر اینکه به عنوان تکمیل‌شده علامت‌گذاری شده باشند. در مورد یک TODO تکرارشونده، \fBRemind\fR آن را تا زمانی که آخرین تکرار به عنوان تکمیل‌شده علامت نخورد پاک نخواهد کرد. .PP .SH "دستور OMIT (THE OMIT COMMAND)" .PP دستور \fBOMIT\fR افزون بر اینکه یک کلمه کلیدی در دستور \fBREM\fR است، خود یک دستور مستقل نیز به شمار می‌رود. ساختار نحوی آن به این صورت است: .PP .RS \fBOMIT\fR \fIweekday\fR [\fIweekday\fR...] .PP یا: .PP \fBOMIT\fR [\fIday\fR] \fImonth\fR [\fIyear\fR] .PP یا: .PP \fBOMIT\fR [\fIday1\fR] \fImonth1\fR [\fIyear1\fR] \fBTHROUGH\fR [\fIday2\fR] \fImonth2\fR [\fIyear2\fR] .RE .PP دستور \fBOMIT\fR برای حذف و نادیده گرفتن "سراسری" روزهای مشخصی (معمولاً روزهای تعطیل) به کار می‌رود. این روزهای حذف‌شده سراسری توسط فرم‌های "\-" و "+" از \fIback\fR و \fIdelta\fR نادیده گرفته می‌شوند، اما توسط فرم‌های "\-\-" و "++" نادیده گرفته نمی‌شوند. چند مثال: .PP .nf OMIT Saturday Sunday OMIT 1 Jan OMIT 7 Sep 1992 OMIT 15 Jan THROUGH 14 Feb OMIT May # Equivalent to OMIT May 1 THROUGH May 31 OMIT 25 Dec THROUGH 4 Jan OMIT 2023-05-03 THROUGH 2023-05-12 OMIT Jun THROUGH July # Equivalent to OMIT Jun 1 THROUGH July 31 .fi .PP مثال اول تمامی شنبه‌ها و یکشنبه‌ها را حذف (OMIT) می‌کند. این برای یادآورهایی که نباید در روزهای پایانی هفته فعال شوند مفید است. .PP مثال دوم یک تعطیلی را مشخص می‌کند که در هر سال در یک تاریخ ثابت رخ می‌دهد - روز سال نو. .PP مثال سوم تعطیلی‌ای را مشخص می‌کند که هر سال تغییر می‌کند - روز کارگر. برای این‌گونه تعطیلات، باید برای هر سال یک دستور \fBOMIT\fR جداگانه ایجاد کنید. (بعداً در بخش توضیحات مربوط به عبارت‌ها و برخی از ویژگی‌های پیشرفته‌تر \fBRemind\fR خواهید دید که چگونه می‌توان این فرایند را در مواردی خودکارسازی کرد.) .PP همانند دستور REM، می‌توانید از مشخص‌کننده‌های کوتاه برای تاریخ‌ها استفاده کنید؛ دستورات زیر معادل یکدیگر هستند: .PP .nf OMIT 7 Sep 1992 OMIT 1992-09-07 .fi .PP جهت سهولت کار، می‌توانید از یک \fIdelta\fR و کلمه کلیدی \fBMSG\fR یا \fBRUN\fR در دستور \fBOMIT\fR استفاده نمایید. توالی‌های زیر با یکدیگر معادل هستند: .PP .nf OMIT 1 Jan REM 1 Jan +4 MSG New year's day is %b! و OMIT 1 Jan +4 MSG New year's day is %b! .fi .PP کلمه کلیدی \fBTHROUGH\fR به شما امکان می‌دهد تا به‌راحتی یک بازه از روزها را OMIT کنید. برای مثال، توالی‌های زیر معادل هستند: .PP .nf OMIT 3 Jan 2011 OMIT 4 Jan 2011 OMIT 5 Jan 2011 و OMIT 3 Jan 2011 THROUGH 5 Jan 2011 .fi .PP توجه داشته باشید که \fBRemind\fR یک محدودیت کامپایل‌شده داخلی برای تعداد OMITهای کامل دارد. اگر بازه‌ای از \fIN\fR روز با تاریخ کاملاً مشخص (یعنی شامل سال) را OMIT کنید، آنگاه \fIN\fR اسلات OMIT کامل مصرف می‌شود. تلاش برای حذف یک بازه بسیار بزرگ ممکن است به خطای "Too many full OMITs" منجر شود. .PP می‌توانید کاری کنید که یک دستور OMIT حاوی THROUGH، در صورتی که هر دو تاریخ کاملاً مشخص شده باشند، به عنوان یک دستور \fBREM\fR نیز عمل کند: .PP .nf OMIT 6 Sep 2010 THROUGH 10 Sep 2010 MSG Vacation .fi .PP اگر از بند THROUGH استفاده می‌کنید، سال یا باید هم قبل و هم بعد از THROUGH ذکر شود، یا در هر دو طرف حذف گردد. موارد زیر مجاز هستند: .PP .nf OMIT 25 Dec THROUGH 6 Jan OMIT 25 Dec 2024 THROUGH 6 Jan 2025 .fi .PP اما موارد زیر مجاز نیستند: .PP .nf OMIT 25 Dec THROUGH 6 Jan 2025 OMIT 25 Dec 2024 THROUGH 6 Jan .fi .PP می‌توانید با دستور زیر OMITهای سراسری خود را اشکال‌زدایی کنید: .PP .nf OMIT DUMP .fi .PP دستور OMIT DUMP روزهای حذف‌شده سراسری فعلی را در خروجی استاندارد چاپ می‌کند. .PP .B "کلمات کلیدی BEFORE، AFTER و SKIP (THE BEFORE, AFTER AND SKIP KEYWORDS)" .PP به‌طور معمول، روزهایی که حذف (OMIT) شده‌اند، چه از طریق یک دستور سراسری \fBOMIT\fR و چه از طریق کلمات کلیدی محلی \fBOMIT\fR یا \fBOMITFUNC\fR در یک دستور \fBREM\fR، تنها روی شمارش \-\fIback\fR یا +\fIdelta\fR تأثیر می‌گذارند. برای مثال، فرض کنید هر چهارشنبه یک جلسه دارید. همچنین فرض کنید ۱۱ نوامبر را به عنوان تعطیلی مشخص کرده‌اید: .PP .nf OMIT 11 Nov +4 MSG Remembrance Day REM Wed +1 MSG Code meeting %b. .fi .PP توالی بالا یک یادآور برای جلسه در ۱۱ نوامبر ۱۹۹۲ (که یک چهارشنبه است) صادر می‌کند. این احتمالاً نادرست است. سه گزینه وجود دارد: .TP .B BEFORE این کلمه کلیدی یادآور را به پیش از هر روز حذف‌شده منتقل می‌کند. بنابراین، در مثال بالا، استفاده از \fBBEFORE\fR باعث می‌شود یادآور جلسه در روز سه‌شنبه، ۱۰ نوامبر ۱۹۹۲ فعال شود. .TP .B AFTER این کلمه کلیدی یادآور را به پس از هر روز حذف‌شده منتقل می‌کند. در مثال بالا، یادآور جلسه در روز پنج‌شنبه، ۱۲ نوامبر ۱۹۹۲ فعال خواهد شد. .TP .B SKIP این کلمه کلیدی باعث می‌شود یادآور در روزهای حذف‌شده کاملاً نادیده گرفته شود. بنابراین، در مثال بالا، یادآور در ۱۱ نوامبر ۱۹۹۲ فعال نخواهد شد. با این حال، طبق معمول در چهارشنبه بعد، ۱۸ نوامبر ۱۹۹۲ فعال می‌شود. .PP کلمات کلیدی \fBBEFORE\fR و \fBAFTER\fR به ترتیب تاریخ فعال‌سازی یادآور را به قبل یا بعد از بلوکی از روزهای حذف‌شده منتقل می‌کنند. فرض کنید معمولاً در اولین روز هر ماه یک پشتیبان‌گیری اجرا می‌کنید. اما اگر اولین روز ماه مصادف با آخر هفته یا تعطیلی باشد، پشتیبان‌گیری را در اولین روز کاری پس از آخر هفته یا تعطیلی اجرا می‌کنید. می‌توانید بنویسید: .PP .nf REM 1 OMIT Sat Sun AFTER RUN do_backup .fi .PP بیایید نحوه محاسبه تاریخ فعال‌سازی را بررسی کنیم. عدد \fB1\fR اولین روز ماه را مشخص می‌کند. کلمه کلیدی محلی \fBOMIT\fR باعث می‌شود کلمه کلیدی \fBAFTER\fR یادآور را به جلوتر و پس از روزهای آخر هفته منتقل کند. در نهایت، کلمه کلیدی \fBAFTER\fR یادآور را همچنان به جلو منتقل می‌کند تا از هرگونه تعطیلی مشخص‌شده با دستورات سراسری \fBOMIT\fR نیز عبور کند. .PP .SH "پشتیبانی از منطقه زمانی (TIMEZONE SUPPORT)" .PP دستور \fBREM\fR از کلمه کلیدی اختیاری \fBTZ\fR پشتیبانی می‌کند که باید پس از آن نام \fIحساس به حروف کوچک و بزرگ\fR منطقه زمانی قرار گیرد که دستور قرار است در آن تفسیر شود. توجه داشته باشید در صورت استفاده از کلمه کلیدی \fBTZ\fR، \fIحتماً باید\fR از یک بند \fBAT\fR نیز استفاده کنید. در اینجا چند مثال آورده شده است: .PP .nf REM Wednesday AT 14:00 TZ America/Toronto MSG 2PM Eastern (%2). REM Wednesday AT 23:59 TZ America/Los_Angeles SATISFY [$Td == 13] MSG Foo %b %2. .fi .PP درون یک بند \fBSATISFY\fR و یک تابع \fBOMITFUNC\fR، تمام توابع راه‌اندازی و تاریخ فعال‌سازی \fIدر منطقه زمانی مشخص‌شده در دستور\fR \fBREM\fR تفسیر می‌شوند. با این حال، در خارج از دستور \fBREM\fR، توابع راه‌اندازی با منطقه زمانی محلی تطبیق داده می‌شوند. اگر منطقه زمانی محلی UTC باشد و در تاریخ 2025-09-04 بر حسب UTC فایل زیر را به \fBRemind\fR بدهیم: .PP .nf SET $AddBlankLines 0 BANNER % REM Wednesday AT 14:00 TZ America/Toronto MSG 2PM Eastern (%2). set a $T set b $Tt REM MSG a = [a], b = [b] REM Wednesday AT 23:59 TZ America/Los_Angeles SATISFY [$Td == 13] MSG Foo %b %2. set c $T set d $Tt REM MSG c = [c], d = [d] .fi .PP آنگاه خروجی به صورت زیر خواهد بود: .PP .nf a = 2025-09-10, b = 18:00 c = 2026-05-14, d = 06:59 .fi .PP علت این است که تاریخ فعال‌سازی اولی (چهارشنبه، 2025-09-10 در ساعت ۱۴:۰۰ به وقت شرقی) برابر با 2025-09-10 در ساعت ۱۸:۰۰ به وقت UTC است. در مورد دوم، چهارشنبه ۱۳ مه ۲۰۲۶ تاریخ راه‌اندازی برآورده‌شده (SATISFied) است که به دلیل تنظیم منطقه زمانی، به پنج‌شنبه ۱۴ مه ۲۰۲۶ در ساعت ۰۶:۵۹ به وقت UTC منتقل می‌شود. .PP اگر بعد از کلمه کلیدی \fBTZ\fR از نام منطقه زمانی نامعتبر استفاده کنید، نتایج تعریف‌نشده خواهند بود. همان‌طور که پیش‌تر ذکر شد، نام‌های مناطق زمانی \fIبه حروف بزرگ و کوچک حساس هستند\fR؛ نام America/Toronto معتبر است، اما america/toronto معتبر نیست. .PP اگر روی سیستمی هستید که داده‌های منطقه زمانی را در مسیر \fI/usr/share/zoneinfo\fR ذخیره می‌کند، \fBRemind\fR تلاش می‌کند نام منطقه زمانی را اعتبارسنجی کند و اگر نامعتبر به نظر برسد به شما هشدار می‌دهد. اگر می‌خواهید در هر حال منطقه‌ای زمانی را مشخص کنید که فاقد فایلی در مسیر \fI/usr/share/zoneinfo\fR است و می‌خواهید هشدار را نادیده بگیرید، یک علامت "!" را در ابتدای نام منطقه زمانی قرار دهید. برای مثال: .PP .nf REM Thursday AT 14:45 TZ !EST+5EDT,M3.2.0/2,M11.1.0/2 MSG Old TZ format .fi .PP در یادآوری دارای کلمه کلیدی \fBTZ\fR، تاریخ‌های OMIT در منطقه زمانی مشخص‌شده ارزیابی می‌شوند. در اینجا یک مثال آورده شده است: فرض کنید منطقه زمانی محلی America/Toronto است و شما این اسکریپت را دارید: .PP .nf # A Friday OMIT 2025-09-05 # A Saturday OMIT 2025-09-13 REM Saturday AT 01:00 TZ Europe/Amsterdam SKIP MSG Early Sat AM .fi .PP در تاریخ 2025-09-05 در منطقه زمانی America/Toronto، یادآور فعال \fIخواهد شد\fR. هرچند تاریخ 2025-09-05 حذف (OMIT) شده است، اما کلمه کلیدی SKIP تاریخ را در منطقه زمانی Europe/Amsterdam ارزیابی می‌کند و تاریخ 2025-09-06 (تاریخ فعال‌سازی) حذف \fIنشده است\fR. .PP برعکس، در تاریخ 2025-09-12 در منطقه زمانی America/Toronto، یادآور فعال \fIنخواهد شد\fR. اگرچه 2025-09-12 حذف نشده است، اما تاریخ 2025-09-13 حذف شده است و این همان تاریخ فعال‌سازی در منطقه زمانی Europe/Amsterdam است. .PP.SH "دستورات DO، INCLUDE و SYSINCLUDE (THE DO, INCLUDE AND SYSINCLUDE COMMANDS)" .PP \fBRemind\fR به شما امکان می‌دهد پرونده‌های دیگر را در اسکریپت یادآور خود بگنجانید (include کنید)، شبیه به دستور پیش‌پردازنده #include در زبان C. برای مثال، می‌توانید یادآورهای مختلف را در پرونده‌های جداگانه به شکل زیر سازماندهی کنید: .PP .nf INCLUDE holidays.rem INCLUDE birthdays.rem INCLUDE "quote files with spaces.rem" .fi .PP پرونده‌های \fBINCLUDE\fR می‌توانند تا عمق ۸ لایه تو در تو (nested) شوند. همان‌طور که در بالا نشان داده شد، اگر نام یک پرونده حاوی فاصله باشد (که توصیه نمی‌شود!) می‌توانید نام پرونده را درون دابل‌کوتیشن (نقل‌قول دوگانه) قرار دهید. .PP اگر در دستور \fBINCLUDE\fR نام پرونده را "-" تعیین کنید، \fBRemind\fR خواندن را از ورودی استاندارد (standard input) آغاز خواهد کرد. .PP اگر یک \fIپوشه\fR را به‌عنوان آرگومان به \fBINCLUDE\fR بدهید، آن‌گاه \fBRemind\fR تمام پرونده‌های (و نه زیرپوشه‌های!) موجود در آن پوشه را که با الگوی شل "*.rem" مطابقت دارند پردازش خواهد کرد. پرونده‌ها به ترتیب مرتب‌شده پردازش می‌شوند؛ ترتیب مرتب‌سازی مطابق با ترتیبی است که شل هنگام بسط دادن "*.rem" استفاده می‌کند. .PP توجه داشته باشید که پرونده مشخص‌شده در دستور \fBINCLUDE\fR نسبت به \fIپوشه کاری جاری فرایند \fBRemind\fR\fR تفسیر می‌شود. اگر می‌خواهید پرونده‌ای را نسبت به پوشه حاوی پرونده در حال پردازش جاری بگنجانید، به‌جای آن از \fBDO\fR استفاده کنید. برای مثال، اگر پرونده جاری \fB/home/user/.reminders/foo.rem\fR باشد و پوشه کاری Remind برابر با \fB/home/user\fR باشد، آن‌گاه: .PP .nf # Read /home/user/.reminders/bar.rem DO bar.rem # Read /usr/share/bar.rem - absolute path DO /usr/share/bar.rem # Read /home/user/bar.rem INCLUDE bar.rem # Read /usr/share/bar.rem - absolute path INCLUDE /usr/share/bar.rem .fi .PP شاید بتوان گفت که دستور \fBINCLUDE\fR باید از همان ابتدا مانند \fBDO\fR عمل می‌کرد، اما تغییر رفتار آن سازگاری رو به عقب (backward-compatibility) را می‌شکست؛ به همین دلیل دستور \fBDO\fR معرفی شد. .PP توجه داشته باشید اگر پرونده یادآور در حال پردازش فعلی، به‌عنوان یک پیوند نمادین (symbolic link) به پرونده‌ای ارجاع داده شده باشد که در همان پوشه خود پیوند نمادین نیست، \fBDO\fR با شکست مواجه می‌شود. \fBRemind\fR مسیر واقعی پیوندهای نمادین را تفکیک (resolve) \fIنمی‌کند\fR، بنابراین باید از استفاده از پیوندهای نمادین برای پرونده‌ها خودداری کنید. .PP دستور \fBSYSINCLUDE\fR مشابه \fBDO\fR است، اما مسیرهای نسبی را در پوشه سیستمی حاوی اسکریپت‌های استاندارد یادآور جستجو می‌کند. در این نسخه نصب‌شده از \fBRemind\fR، پوشه سیستمی برابر با "/usr/share/remind" است. .PP .SH "دستور RETURN (THE RETURN COMMAND)" .PP دستور \fBRETURN\fR باعث می‌شود \fBRemind\fR باقی‌مانده محتوای پرونده‌ای را که در حال حاضر پردازش می‌شود نادیده بگیرد. این دستور می‌تواند راهی سریع برای "خروج" از یک پرونده گنجانده‌شده (included) باشد (هرچند در سطح بالا یا top-level نیز کار می‌کند). .PP در اینجا مثالی از نحوه استفاده از \fBRETURN\fR آورده شده است: .PP .nf IF already_done RETURN ENDIF set already_done 1 preserve already_done # Do expensive processing here .fi .PP .SH "دستور RUN (THE RUN COMMAND)" .PP اگر پرونده‌های دیگر را در اسکریپت یادآور خود بگنجانید، ممکن است همیشه به‌طور کامل به محتوای پرونده‌های دیگر اعتماد نداشته باشید. برای مثال، ممکن است آن‌ها حاوی یادآورهایی از نوع \fBRUN\fR باشند که بتوانند برای دسترسی به پرونده‌های شما یا انجام اقدامات ناخواسته استفاده شوند. دستور \fBRUN\fR می‌تواند این موضوع را محدود کند: اگر دستور \fBRUN OFF\fR را در اسکریپت یادآور سطح بالای (top-level) خود قرار دهید، هر یادآور یا عبارتی که در حالت عادی یک دستور سیستمی را اجرا می‌کند غیرفعال می‌شود. \fBRUN ON\fR اجرای دستورات سیستمی را دوباره فعال خواهد کرد. توجه داشته باشید که دستور \fBRUN ON\fR \fIفقط\fR می‌تواند در اسکریپت یادآور سطح بالا استفاده شود؛ این دستور در هیچ پرونده‌ای که توسط دستور \fBINCLUDE\fR فراخوانی شده است کار \fIنخواهد کرد\fR. این برای محافظت از شما در برابر فردی است که دستور \fBRUN ON\fR را در یک پرونده گنجانده‌شده قرار می‌دهد. با این حال، دستور \fBRUN OFF\fR می‌تواند در سطح بالا یا در یک پرونده گنجانده‌شده استفاده شود. .PP اگر \fBRemind\fR را با گزینه خط فرمان .B \-r اجرا کنید، یادآورهای نوع \fBRUN\fR و تابع \fBshell()\fR بدون توجه به هرگونه دستور \fBRUN\fR در اسکریپت یادآور، غیرفعال خواهند شد. با این حال، هر دستوری که با گزینه .B \-k ارائه شده باشد همچنان اجرا خواهد شد. .PP علاوه بر این، \fBRemind\fR شامل چند ویژگی امنیتی دیگر است. این برنامه پرونده‌ای را که توسط گروه یا دیگران قابل نوشتن باشد (group-writable یا world-writable) نخواهد خواند. این برنامه با مجوز set-uid اجرا نخواهد شد. اگر پرونده‌ای را بخواند که متعلق به شما نیست، RUN و تابع ()shell را غیرفعال خواهد کرد. و اگر با دسترسی کاربر ارشد (\fIroot\fR) اجرا شود، فقط پرونده‌های متعلق به \fIroot\fR را خواهد خواند. .PP توجه داشته باشید که اگر \fBRemind\fR از ورودی استاندارد بخواند، \fIهیچ\fR تلاشی برای بررسی مالکیت ورودی استاندارد نمی‌کند، حتی اگر از یک پرونده هدایت شده باشد، و بنابراین در این شرایط RUN و ()shell را غیرفعال \fIنمی‌کند\fR. .PP .SH "دستور EXPR (THE EXPR COMMAND)" .PP \fBRemind\fR به شما امکان می‌دهد ارزیابی عبارت‌ها را به‌طور کامل غیرفعال کنید. این می‌تواند در صورتی مفید باشد که \fBRemind\fR را روی پرونده‌ای تا حدی غیرقابل‌اعتماد اجرا می‌کنید که انتظار نمی‌رود حاوی عبارت‌ها باشد. برای غیرفعال کردن ارزیابی عبارت‌ها، استفاده کنید از: .PP .nf EXPR OFF .fi .PP اگر \fBRemind\fR در هنگام فعال بودن EXPR OFF با عبارتی مواجه شود، یک خطا برمی‌گرداند. .PP برای فعال‌سازی مجدد ارزیابی عبارت‌ها، استفاده کنید از: .PP .nf EXPR ON .fi .PP همانند \fBRUN ON\fR، دستور \fBEXPR ON\fR فقط می‌تواند در اسکریپت سطح بالا استفاده شود، نه در پرونده‌های گنجانده‌شده. .PP .SH "دستور INCLUDECMD (THE INCLUDECMD COMMAND)" .PP \fBRemind\fR به شما اجازه می‌دهد یک دستور شل را اجرا کنید و خروجی آن دستور را طوری ارزیابی کنید که گویی یک پرونده گنجانده‌شده (included) است. برای مثال، می‌توانید اسکریپت‌هایی داشته باشید که یادآورها را از یک پایگاه‌داده استخراج کرده و آن‌ها را در stdout به عنوان دستورات REM چاپ کنند. در اینجا یک مثال آورده شده است: .PP .nf INCLUDECMD extract_reminders_for dfs .fi .PP فرض می‌کنیم دستور "extract_reminders_for" یادآورها را از یک پایگاه‌داده مرکزی برای کاربر نام‌برده استخراج می‌کند. یکی دیگر از موارد کاربرد INCLUDECMD این است که اگر یادآورهای خود را در پرونده‌ای با قالبی غیر از Remind ذخیره کرده باشید، می‌توانید دستوری بنویسید که آن‌ها را به قالب \fBRemind\fR تبدیل کند و سپس \fBRemind\fR می‌تواند با یک دستور مناسب INCLUDECMD آن پرونده را "بگنجاند". .PP توجه داشته باشید اگر RUN غیرفعال باشد، آن‌گاه INCLUDECMD با پیام خطای "RUN disabled" با شکست مواجه خواهد شد. .PP \fBRemind\fR ترتیبی می‌دهد که هنگام اجرای دستور مشخص‌شده توسط INCLUDECMD، ورودی استاندارد آن به /dev/null متصل شود. .PP دستور INCLUDECMD باقی‌مانده خط را به \fBpopen\fR(3) ارسال می‌کند، به این معنی که دستور توسط شل اجرا می‌شود. به همین ترتیب، بسته به کاری که می‌خواهید انجام دهید، نویسه‌های ویژه (meta-characters) شل ممکن است نیاز به اسکیپ کردن یا نقل‌قول (کوتیشن) آرگومان‌ها داشته باشند. خود \fBRemind\fR هیچ‌گونه تغییری روی خط فرمان اعمال نمی‌کند (به جز سازوکار عادی الصاق عبارت [expr]). .PP اگر دستوری که به INCLUDECMD ارسال می‌شود با علامت تعجب "!" آغاز شود، آن‌گاه \fBRemind\fR ویژگی \fBRUN\fR را برای خروجی آن دستور غیرفعال می‌کند. اگر دستوری را اجرا می‌کنید که به خروجی آن کاملاً اعتماد ندارید، باید پیشوند "!" را به آن اضافه کنید تا هر دستور RUN که صادر می‌کند با شکست مواجه شود. .PP یک دستور \fBINCLUDECMD\fR در عمق تو در توی INCLUDE به شمار می‌آید. در هر اجرای مشخص از \fBRemind\fR، یک دستور معین INCLUDECMD فقط یک بار اجرا می‌شود و نتایج حافظه‌پنهان (کَش) می‌شوند. برای مثال، اگر تقویمی تولید کنید، هر دستور منحصربه‌فرد INCLUDECMD فقط یک بار اجرا می‌شود، نه یک بار برای هر روز از تقویم تولیدشده. "منحصربه‌فرد بودن" با بررسی دستوری که قرار است به شل ارسال شود تعیین می‌شود؛ بنابراین اگر (برای مثال) INCLUDECMD شما از الصاق عبارتی استفاده کند که بسته به مقدار \fBtoday()\fR نتایج متفاوتی ایجاد نماید، آن‌گاه هر نسخه \fIمنحصربه‌فرد\fR از دستور یک بار اجرا خواهد شد. .PP اگر یک پرونده یادآور حاوی بیش از یک دستور یکسان \fBINCLUDECMD\fR باشد، تنها اولین دستور در عمل اجرا خواهد شد. تمام موارد یکسان بعدی از خروجی حافظه‌پنهان‌شده مربوط به اولین اجرا استفاده خواهند کرد. .PP .SH "دستور BANNER (THE BANNER COMMAND)" .PP هنگامی که \fBRemind\fR برای نخستین بار یادآوری را صادر می‌کند، پیامی مانند این چاپ می‌کند: .PP .nf Reminders for Friday, 30th October, 1992 (today): .fi .PP (اگر از هر یک از گزینه‌های تولید تقویم استفاده شود، یا اگر گزینه .B \-k به کار رود، بنر چاپ نمی‌شود.) .PP دستور \fBBANNER\fR به شما اجازه می‌دهد قالب را تغییر دهید. این دستور باید پیش از هر دستور \fBREM\fR بیاید. قالب به صورت زیر است: .PP .RS \fBBANNER\fR \fIformat\fR .RE .PP مقدار \fIformat\fR مشابه با \fIbody\fR (بدنه) در دستور \fBREM\fR است. این مقدار از فیلتر جایگزینی عبور داده می‌شود و محرک ضمنی (implicit trigger) آن تاریخ جاری سیستم است. بنابراین، بنر پیش‌فرض معادل دستور زیر است: .PP .nf BANNER Reminders for %w, %d%s %m, %y%o: .fi .PP شما می‌توانید بنر را با دستور BANNER % به‌طور کامل غیرفعال کنید. یا می‌توانید یک بنر سفارشی ایجاد نمایید: .PP .nf BANNER Hi - here are your reminders for %y-%t-%r: .fi .SH "کنترل بافت OMIT (CONTROLLING THE OMIT CONTEXT)" .PP گاهی اوقات لازم است \fBOMIT\fRهای عمومی (global) را که برای چند یادآور فعال هستند، موقتاً تغییر دهید. سه دستور به شما امکان می‌دهند این کار را انجام دهید: .TP .B PUSH-OMIT-CONTEXT این دستور \fBOMIT\fRهای عمومی جاری را روی یک پشته (stack) داخلی ذخیره می‌کند. .TP .B CLEAR-OMIT-CONTEXT این دستور تمام \fBOMIT\fRهای عمومی را پاک می‌کند و کار را از یک "لوح سفید" آغاز می‌نماید. .TP .B POP-OMIT-CONTEXT این دستور \fBOMIT\fRهای عمومی ذخیره‌شده توسط جدیدترین \fBPUSH-OMIT-CONTEXT\fR را بازیابی می‌کند. .PP برای مثال، فرض کنید بلوکی از یادآورها دارید که به یک بافت \fBOMIT\fR خالی نیاز دارند، و همچنین \fBOMIT\fRهای عمومی ناخواسته‌ای ایجاد می‌کنند که می‌توانند با یادآورهای بعدی تداخل داشته باشند. می‌توانید از قطعه‌کد زیر استفاده کنید: .PP .nf PUSH-OMIT-CONTEXT # Save the current context CLEAR-OMIT-CONTEXT # Clean the slate # Block of reminders goes here POP-OMIT-CONTEXT # Restore the saved omit context .fi .SH "عبارت‌ها (EXPRESSIONS)" .PP در برخی بافت‌ها که بعداً توضیح داده خواهد شد، \fBRemind\fR عبارت‌ها را برای ارزیابی می‌پذیرد. عبارت‌های \fBRemind\fR شبیه عبارت‌های زبان C هستند، اما روی انواع متفاوتی از اشیاء عمل می‌کنند. .PP .B "انواع داده (DATA TYPES)" .PP عبارت‌های \fBRemind\fR روی پنج نوع شیء عمل می‌کنند: .TP .B INT نوع داده \fBINT\fR شامل اعداد صحیحی است که در یک کلمه ماشین (machine word) قابل نمایش هستند. نوع داده \fBINT\fR با نوع "int" در زبان C مطابقت دارد. .TP .B STRING نوع داده \fBSTRING\fR شامل رشته‌هایی از نویسه‌ها (کاراکترها) است. این نوع تا حدودی با آرایه نویسه‌ای در C قابل مقایسه است، اما بیشتر به نوع رشته در زبان BASIC شباهت دارد. .RS .PP \fBRemind\fR به‌طور معمول انتظار دارد در محیط UTF-8 اجرا شود. در این محیط، میان \fIبایت‌ها\fR و \fIنویسه‌ها\fR تفاوت وجود دارد؛ زیرا در UTF-8 یک نویسه ممکن است با دنباله‌ای از بیش از یک بایت نمایش داده شود. برای مثال در محیط UTF-8، رشته "🙂" شامل یک نویسه اما چهار بایت است؛ و رشته "één" شامل سه نویسه اما پنج بایت است. .PP \fBRemind\fR مجموعه‌ای از توابع دارد که روی \fIبایت‌ها\fR عمل می‌کنند، از جمله \fBindex\fR، \fBstrlen\fR و \fBsubstr\fR و چند تابع دیگر. استفاده از این توابع برای رشته‌های چندبایتی ایمن نیست؛ در عوض باید از \fBmbindex\fR، \fBmbstrlen\fR و \fBmbsubstr\fR و نسخه‌های دارای پیشوند \fBmb\fR در سایر توابع استفاده کنید. اگر \fIکاملاً مطمئن\fR هستید که یک رشته فقط شامل نویسه‌های تک‌بایتی است، نسخه‌های بایت‌محور می‌توانند استفاده شوند و سریع‌تر از نسخه‌های چندبایتی هستند. .RE .TP .B TIME نوع داده \fBTIME\fR برای دو هدف متفاوت به کار می‌رود: برای نمایش زمانی از روز با دقت یک دقیقه، یا برای نمایش یک مدت‌زمان (duration) با دقت یک دقیقه. بافتی که در آن \fBTIME\fR استفاده می‌شود مشخص می‌کند که آیا به عنوان زمانی از روز یا یک مدت‌زمان تفسیر شود. .RS .PP در بافت‌هایی که \fBTIME\fR زمانی از روز را نشان می‌دهد، می‌تواند از 00:00 تا 23:59 باشد و در داخل به عنوان یک عدد صحیح از 0 تا 1439 به نشانه تعداد دقیقه‌های سپری‌شده از نیمه‌شب ذخیره می‌شود. .PP در بافت‌هایی که \fBTIME\fR یک مدت‌زمان را نشان می‌دهد، هیچ حد بالایی برای مؤلفه ساعت وجود ندارد (فراتر از محدودیتی که تحمیل می‌کند که یک مدت‌زمان بر حسب دقیقه باید در نوع داده عدد صحیح علامت‌دار معماری پردازنده شما بگنجد). در داخل، یک مدت‌زمان به عنوان یک عدد صحیح بر حسب دقیقه ذخیره می‌شود. .RE .TP .B DATE نوع داده \fBDATE\fR شامل تاریخ‌ها (پس از ۱ ژانویه ۱۹۹۰) است. در داخل برنامه، اشیاء \fBDATE\fR به صورت تعداد روزهای سپری‌شده از ۱ ژانویه ۱۹۹۰ ذخیره می‌شوند. .TP .B DATETIME نوع داده \fBDATETIME\fR شامل تاریخ و زمان در کنار یکدیگر است. در داخل برنامه، اشیاء \fBDATETIME\fR به صورت تعداد دقیقه‌های گذشته از نیمه‌شب ۱ ژانویه ۱۹۹۰ ذخیره می‌شوند. می‌توانید یک شیء \fBDATETIME\fR را ترکیبی از بخش‌های \fBDATE\fR و \fBTIME\fR در نظر بگیرید. .PP .B "ثابت‌ها (CONSTANTS)" .PP مثال‌های زیر مقادیر ثابت را در عبارت‌های \fBRemind\fR نشان می‌دهند: .TP .B "ثابت‌های INT (INT constants)" 12, 36, \-10, 0, 1209, 0x1F, 0xfe00 (دو مورد آخر استفاده از مقادیر ثابت در مبنای شانزده را نشان می‌دهند) .TP .B "ثابت‌های STRING (STRING constants)" "Hello there", "This is a test", "\\nHello\\tThere", "", "π is Cool! 🙂" .PP .RS توجه داشته باشید که رشته خالی با "" نشان داده می‌شود. \fBRemind\fR از توالی‌های گریز (escape sequences) شامل "\\a"، "\\b"، "\\f"، "\\n"، "\\r"، "\\t" و "\\v" پشتیبانی می‌کند که معانی مشابه با همتایان خود در C دارند. همچنین از "\\xAB" که در آن A و B ارقام هگزادسیمال هستند پشتیبانی می‌کند؛ این قابلیت دقیقاً مانند زبان C عمل می‌کند. بعد از "\\x" باید یک یا دو رقم هگزادسیمال قرار گیرد؛ توالی گریز "\\x00" مجاز نیست. .PP برای گنجاندن علامت نقل‌قول در رشته، از "\\"" استفاده کنید. هر نویسه دیگری که قبل از آن بک‌اسلش قرار گیرد، همان‌طور که هست وارد رشته می‌شود اما خود بک‌اسلش حذف می‌گردد. برای گنجاندن بک‌اسلش در یک رشته، از "\\\\" استفاده کنید. .RE .TP .B "ثابت‌های TIME (TIME constants)" 12:33, 0:01, 14:15, 16:42, 12.16, 13.00, 1.11, 4:30PM, 12:20am .PP .RS توجه داشته باشید که مقادیر ثابت \fBTIME\fR ممکن است در قالب ۲۴ ساعته یا قالب متداول "AM/PM" نوشته شوند. اگر از قالب "AM/PM" استفاده کنید، ساعت می‌تواند از ۱ تا ۱۲ باشد. برای جداسازی دقیقه از ساعت می‌توان از نقطه یا دونقطه استفاده کرد. با این حال، \fBRemind\fR زمان‌ها را همواره در قالب ۲۴ ساعته و فقط با استفاده از یک نویسه جداکننده خروجی می‌دهد. (نویسه جداکننده خروجی در زمان کامپایل انتخاب می‌شود.) .PP اگر \fBTIME\fR در جایی استفاده شود که \fBRemind\fR انتظار یک زمان از روز را دارد (برای مثال در یک عبارت \fBAT\fR)، می‌تواند در قالب ۲۴ ساعته (از 00:00 تا 23:59) یا در قالب ۱۲ ساعته (از 12:00am تا 11:59pm) نوشته شود. اگر \fBTIME\fR در جایی استفاده شود که \fBRemind\fR انتظار یک مدت‌زمان را دارد، نباید پسوند \fIam\fR یا \fIpm\fR داشته باشد و مؤلفه ساعت تا زمانی که تعداد کل دقیقه‌ها در یک متغیر عدد صحیح علامت‌دار بگنجد می‌تواند به هر اندازه بزرگ باشد. .PP برای راحتی کار، می‌توان ثابت \fBTIME\fR را در کوتیشن تکی قرار داد تا با ثابت‌های \fBDATE\fR و \fBDATETIME\fR هماهنگ شود، اما این کوتیشن‌ها اختیاری هستند؛ یعنی 12:56 و '12:56' همان ثابت \fBTIME\fR یکسان را نشان می‌دهند. .RE .TP .B "ثابت‌های DATE (DATE constants)" ثابت‌های \fBDATE\fR به صورت 'yyyy/mm/dd' یا 'yyyy-mm-dd' بیان می‌شوند و کوتیشن‌های تکی \fIباید\fR درج شوند. این کار ثابت‌های تاریخ را از عملگرهای تقسیم یا تفریق اعداد صحیح متمایز می‌کند. مثال‌ها: .PP .RS \(aq1993/02/22', '1992-12-25', '1999/01/01' .PP توجه داشته باشید که مقادیر \fBDATE\fR بدون علامت‌های نقل‌قول \fIچاپ می‌شوند\fR. گرچه هر دو نویسه '-' یا '/' به‌عنوان جداکننده تاریخ در ورودی پذیرفته می‌شوند، هنگام چاپ تاریخ‌ها فقط یکی از آن‌ها استفاده خواهد شد. انتخاب استفاده از '-' یا '/' در زمان کامپایل صورت می‌گیرد. همچنین توجه داشته باشید که نسخه‌های \fBRemind\fR پیش از 03.00.01 از ثابت‌های تاریخ پشتیبانی نمی‌کردند. در آن نسخه‌ها، باید با استفاده از تابع \fBdate()\fR تاریخ‌ها را ایجاد کنید. علاوه بر این، نسخه‌های پیش از 03.00.02 از جداکننده تاریخ '-' پشتیبانی نمی‌کردند. .RE .TP .B "ثابت‌های DATETIME (DATETIME constants)" ثابت‌های \fBDATETIME\fR مشابه با ثابت‌های \fBDATE\fR بیان می‌شوند با این تفاوت که یک بخش "@HH:MM" به آن‌ها اضافه می‌گردد و به صورت اختیاری پسوند "am" یا "pm" به دنبال آن می‌آید. برای مثال: .PP .RS \(aq2008-04-05@23:11', '1999/02/03@14:06', '2001-04-07@08:30', '2020-01-01@3:20pm' .PP مقادیر \fBDATETIME\fR بدون علامت‌های نقل‌قول چاپ می‌شوند. نکات مربوط به نویسه‌های جداکننده تاریخ و زمان برای ثابت‌های \fBDATE\fR و \fBTIME\fR، برای ثابت‌های \fBDATETIME\fR نیز صدق می‌کنند. .RE .PP .B "مقادیر صفر و درست/نادرست (ZERO VALUES AND TRUE/FALSE)" .PP تمام انواع دارای یک \fIمقدار صفر (zero value)\fR مرتبط هستند که توسط دستور IF، تابع IIF و عملگرهای منطقی به عنوان \fIنادرست (false)\fR در نظر گرفته می‌شود. مقادیر صفر عبارتند از: .PP .RS .PP \fBINT\fR \- 0 .PP \fBDATE\fR \- '1990-01-01' .PP \fBTIME\fR \- 00:00 .PP \fBDATETIME\fR \- '1990-01-01@00:00' .PP \fBSTRING\fR \- "" (رشته خالی) .RE .PP هر مقداری غیر از \fIمقدار صفر\fR به عنوان \fIدرست (true)\fR در نظر گرفته می‌شود. .PP .B "عملگرها (OPERATORS)" .PP \fBRemind\fR عملگرهای زیر را دارد. عملگرهای موجود در یک خط دارای اولویت یکسان هستند، در حالی که عملگرهای خطوط پایین‌تر اولویت کمتری نسبت به خطوط بالاتر دارند. این عملگرها تقریباً با عملگرهای زبان C مطابقت دارند. .PP .nf ! - (نفی منطقی یگانی و نفی محاسباتی) * / % (ضرب، تقسیم، باقی‌مانده) + - (جمع/الحاق، تفریق) < <= > >= (مقایسه‌ها) == != (آزمون‌های برابری و نابرابری) && (AND منطقی) || (OR منطقی) .fi .PP .B "شرح عملگرها (DESCRIPTION OF OPERATORS)" .PP .TP .B ! نفی منطقی. می‌تواند روی هر نوع داده‌ای اعمال شود. اگر عملوند غیر صفر باشد، مقدار 0 و در غیر این صورت مقدار 1 را برمی‌گرداند. .TP .B \- منهای یگانی (قرینه). می‌تواند روی یک \fBINT\fR اعمال شود و منفی عملوند را برمی‌گرداند. .TP .B * ضرب. حاصل‌ضرب دو مقدار \fBINT\fR را برمی‌گرداند. متناوباً، اگر یک آرگومان \fBSTRING\fR و دیگری \fBINT\fR باشد، یک \fBSTRING\fR شامل به تعداد INT بار تکرارِ STRING اصلی برمی‌گرداند. در این حالت آرگومان INT نمی‌تواند منفی باشد. .TP .B / تقسیم صحیح. خارج‌قسمت دو مقدار \fBINT\fR را با صرف‌نظر از باقی‌مانده برمی‌گرداند. .TP .B % باقی‌مانده (Modulus). باقی‌مانده تقسیم یک مقدار \fBINT\fR بر دیگری را برمی‌گرداند. .TP .B + کاربردهای متعددی دارد که عبارتند از: .PP .RS \fBINT\fR + \fBINT\fR \- مجموع دو مقدار \fBINT\fR را برمی‌گرداند. .PP \fBINT\fR + \fBTIME\fR یا \fBTIME\fR + \fBINT\fR \- یک \fBTIME\fR حاصل از افزودن \fBINT\fR دقیقه به \fBTIME\fR اصلی را برمی‌گرداند. نتیجه همواره در بازه 00:00 تا 23:59 خواهد بود. .PP \fBTIME\fR + \fBTIME\fR پارامتر دوم \fBTIME\fR را به عنوان مدت‌زمان در نظر می‌گیرد، آن را به یک عدد صحیح از دقیقه‌های پس از نیمه‌شب تبدیل می‌کند و سپس مانند \fBTIME\fR + \fBINT\fR عمل جمع را انجام می‌دهد. .PP \fBINT\fR + \fBDATE\fR یا \fBDATE\fR + \fBINT\fR \- یک \fBDATE\fR حاصل از افزودن \fBINT\fR روز به \fBDATE\fR اصلی را برمی‌گرداند. .PP \fBINT\fR + \fBDATETIME\fR یا \fBDATETIME\fR + \fBINT\fR \- یک \fBDATETIME\fR حاصل از افزودن \fBINT\fR دقیقه به \fBDATETIME\fR اصلی را برمی‌گرداند. .PP \fBDATETIME\fR + \fBTIME\fR یا \fBTIME\fR + \fBDATETIME\fR پارامتر \fBTIME\fR را به عنوان مدت‌زمان در نظر می‌گیرد، آن را به یک عدد صحیح از دقیقه‌های پس از نیمه‌شب تبدیل می‌کند و سپس مانند \fBDATETIME\fR + \fBINT\fR عمل جمع را انجام می‌دهد. .PP \fBSTRING\fR + \fBSTRING\fR \- یک \fBSTRING\fR که حاصل الحاق دو \fBSTRING\fR اصلی است برمی‌گرداند. .PP \fBSTRING\fR + anything یا anything + \fBSTRING\fR \- آرگومان غیر-\fBSTRING\fR را به یک \fBSTRING\fR تبدیل کرده و سپس الحاق را انجام می‌دهد. تابع \fBcoerce()\fR را ببینید. .RE .TP .B \- کاربردهای متعددی دارد که عبارتند از: .PP .RS \fBINT\fR - \fBINT\fR \- تفاضل دو مقدار \fBINT\fR را برمی‌گرداند. .PP \fBDATE\fR - \fBDATE\fR \- اختلاف روزها بین دو \fBDATE\fR را (به صورت یک \fBINT\fR) برمی‌گرداند. .PP \fBTIME\fR - \fBTIME\fR \- اختلاف بر حسب دقیقه بین دو \fBTIME\fR را (به صورت یک \fBINT\fR) برمی‌گرداند. .PP \fBDATETIME\fR - \fBDATETIME\fR \- اختلاف بر حسب دقیقه بین دو \fBDATETIME\fR را (به صورت یک \fBINT\fR) برمی‌گرداند. .PP \fBDATE\fR - \fBINT\fR \- یک \fBDATE\fR برمی‌گرداند که به اندازه \fBINT\fR روز قبل‌تر از \fBDATE\fR اصلی است. .PP \fBTIME\fR - \fBINT\fR \- یک \fBTIME\fR برمی‌گرداند که به اندازه \fBINT\fR دقیقه قبل‌تر از \fBTIME\fR اصلی است. .PP \fBDATETIME\fR - \fBINT\fR \- یک \fBDATETIME\fR برمی‌گرداند که به اندازه \fBINT\fR دقیقه قبل‌تر از \fBDATETIME\fR اصلی است. .PP \fBDATETIME\fR - \fBTIME\fR \- مقدار \fBTIME\fR را به یک \fBINT\fR تبدیل (اجبار/coerce) کرده و سپس تفریق را مانند بالا انجام می‌دهد. .RE .TP .B <, <=, >, and >= این‌ها عملگرهای مقایسه هستند. آن‌ها می‌توانند عملوندهایی از هر نوعی بپذیرند، اما هر دو عملوند باید از یک نوع باشند. عملگرهای مقایسه در صورت برقرار بودن مقایسه مقدار 1 و در صورت نادرست بودن مقدار 0 را برمی‌گردانند. توجه داشته باشید که مقایسه رشته‌ها بر اساس ترتیب واژگانی (lexical) نویسه‌ها روی سیستم شما انجام می‌شود و برای این عملگرها حروف بزرگ و کوچک \fIمتفاوت\fR در نظر گرفته می‌شوند. .TP .B ==, != عملگر == برای آزمون برابری است که در صورت برابر بودن عملوندها مقدار 1 و در صورت نابرابر بودن مقدار 0 را برمی‌گرداند. عملگر != برای آزمون نابرابری است. .PP .RS اگر عملوندها از یک نوع نباشند، == مقدار 0 و != مقدار 1 را برمی‌گرداند. مجدداً یادآوری می‌شود که مقایسه رشته‌ها به بزرگی و کوچکی حروف حساس است. .RE .TP .B && این عملگر AND منطقی است. اگر هر دو عملوند غیر صفر باشند، عملوند دوم را برمی‌گرداند. در غیر این صورت، هر کدام از عملوندها که صفر باشد را برمی‌گرداند. عملوندها می‌توانند از هر نوعی باشند و "صفر" متناسب با نوع هر عملوند تفسیر می‌شود. .TP .B || این عملگر OR منطقی است. اولین عملوندی را که غیر صفر باشد برمی‌گرداند؛ اگر هر دو عملوند صفر باشند، عملوند دوم را برمی‌گرداند. عملوندها می‌توانند از هر نوعی باشند و "صفر" متناسب با نوع هر عملوند تفسیر می‌شود. .PP .B "نکات (NOTES)" .PP اگر نتیجه عملیات جمع، تفریق یا ضرب در نوع "int" زبان C نگنجد، \fBRemind\fR خطای "Number too high" صادر می‌کند. بر خلاف زبان C، عملیات اعداد صحیح در هنگام سرریز (overflow) صرفاً پاسخ اشتباه تولید نمی‌کنند. .PP عملگرهای دارای اولویت یکسان \fIهمیشه\fR از چپ به راست ارزیابی می‌شوند، مگر در مواردی که پرانتزها خلاف آن را دیکته کنند. این نکته مهم است، زیرا عملگر ارتقایافته "+" لزوماً شرکت‌پذیر (associative) نیست. برای مثال: .PP .nf 1 + 2 + "string" + 3 + 4 yields "3string34" 1 + (2 + "string") + (3 + 4) yields "12string7" 12:59 + 1 + "test" yields "13:00test" 12:59 + (1 + "test") yields "12:591test" .fi .PP عملگرهای منطقی اصطلاحاً اتصال‌کوتاه (short-circuit) هستند، همان‌طور که در C هستند. این بدان معناست که اگر عملوند اول || درست (true) باشد، آن‌گاه عملوند دوم ارزیابی \fIنمی‌شود\fR. به همین ترتیب، اگر عملوند اول && نادرست (false) باشد، آن‌گاه عملوند دوم ارزیابی \fIنمی‌شود\fR. .PP .B "متغیرها (VARIABLES)" .PP \fBRemind\fR به شما اجازه می‌دهد مقادیر را به متغیرها اختصاص دهید. دستور \fBSET\fR به صورت زیر استفاده می‌شود: .PP \fBSET\fR \fIvar\fR \fIexpr\fR .PP مقدار \fIvar\fR نام یک متغیر است. این نام باید با یک حرف یا زیرخط (_) آغاز شود و فقط شامل حروف، ارقام و زیرخط باشد. فقط ۶۴ نویسه اول نام متغیر دارای اهمیت هستند. نام متغیرها به بزرگی و کوچکی حروف حساس \fIنیستند\fR؛ بنابراین "Afoo" و "afOo" یک متغیر یکسان هستند. مثال‌ها: .PP .nf SET a 10 + (9*8) SET b "This is a test" SET mydir getenv("HOME") SET time 12:15 SET date today() .fi .PP توجه داشته باشید که خود متغیرها نوع خاصی ندارند؛ آن‌ها نوع هر چیزی را که در آن‌ها ذخیره می‌کنید به خود می‌گیرند. .PP متغیرهایی که با SET یا در خط فرمان با \fB\-i\fR\fIvar\fB=\fR\fIexpr\fR تنظیم شوند، دارای دامنه سراسری (global scope) هستند. .PP برای حذف یک متغیر، از دستور \fBUNSET\fR استفاده کنید: .PP \fBUNSET\fR \fIvar\fR [\fIvar\fR...] .PP برای مثال، برای حذف تمام متغیرهای اعلان‌شده در بالا، استفاده کنید از: .PP .nf UNSET a b mydir time date .fi .PP .SH "متغیرهای سیستمی (SYSTEM VARIABLES)" .PP علاوه بر متغیرهای معمولی کاربر، .B Remind چندین «متغیر سیستمی» دارد که برای بررسی وضعیت یا کنترل حالت عملیاتی .B Remind به کار می‌روند. متغیرهای سیستمی از نسخه 03.00.07 در .B Remind در دسترس هستند. .PP همه متغیرهای سیستمی با علامت دلار «$» آغاز می‌شوند. می‌توان از آن‌ها همانند متغیرهای معمولی در دستورات .B SET و عبارت‌ها استفاده کرد. تمام متغیرهای سیستمی همواره مقادیری از نوعی مشخص را نگه می‌دارند. علاوه بر این، برخی از متغیرهای سیستمی غیرقابل‌تغییر هستند و شما نمی‌توانید متغیر سیستمی جدیدی بسازید. متغیرهای سیستمی را می‌توان در خط فرمان با گزینه .B \-i مقداردهی اولیه کرد، اما ممکن است لازم باشد آن‌ها را در علامت نقل‌قول قرار دهید تا از تفسیر علامت دلار توسط پوسته جلوگیری شود. نام متغیرهای سیستمی به بزرگ و کوچک بودن حروف حساس نیست. .PP متغیرهای سیستمی زیر تعریف شده‌اند. مواردی که با برچسب «فقط‌خواندنی» مشخص شده‌اند، با دستور .B SET قابل تغییر نیستند. تمام متغیرهای سیستمی مقادیری از نوع .B INT (عدد صحیح) نگه می‌دارند، مگر اینکه خلاف آن مشخص شده باشد. .TP .B $AddBlankLines اگر روی 1 (پیش‌فرض) تنظیم شود، آن‌گاه .B Remind به‌طور عادی پس از بنر و هر یادآور، یک خط خالی چاپ می‌کند. (این رفتار را می‌توان با پایان دادن یادآور یا بنر با یک علامت درصد تکی متوقف کرد.) اگر $AddBlankLines روی 0 تنظیم شود، .B Remind خط خالی را چاپ نمی‌کند. در این حالت، پایان دادن یادآور با % هیچ اثری ندارد. اگر .I واقعاً می‌خواهید پس از یک یادآور خط خالی چاپ شود، آن را با .B %_ به پایان برسانید تا یک خط تازه درج شود. .TP .B $CalcUTC اگر 1 (پیش‌فرض) باشد، آن‌گاه .B Remind از توابع کتابخانه C برای محاسبه تعداد دقایق بین زمان محلی و زمان هماهنگ جهانی (UTC) استفاده می‌کند. این امر بر محاسبات نجومی (به عنوان مثال .BR sunrise() ) اثر می‌گذارد. اگر 0 باشد، باید تعداد دقایق بین زمان محلی و زمان هماهنگ جهانی را در متغیر سیستمی .B $MinsFromUTC مشخص کنید. .TP .B "$CalMode (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-c در خط فرمان داده شده است. .TP .B "$CalType (فقط‌خواندنی، نوع STRING)" اگر گزینه‌های خط فرمان .BR \-c ، .B \-s یا .B \-p استفاده شده باشند، مقدار این متغیر برابر با "monthly" خواهد بود. اگر از .BR \-c+ ، .B \-s+ یا .B \-p+ استفاده شده باشد، مقدار آن "weekly" است. در غیر این صورت، مقدار آن "none" خواهد بود. .TP .B "$Daemon (فقط‌خواندنی)" اگر حالت دیمن با گزینه .B \-z فراخوانی شده باشد، شامل تعداد دقایق بین هر بار بیدار شدن است. اگر در حالت دیمن اجرا نشود، شامل مقدار 0 خواهد بود. در حالت سرور (چه با .B \-z0 یا .BR \-zj )، شامل مقدار -1 است. .TP .B "$DateSep (نوع STRING)" این متغیر فقط می‌تواند روی "/" یا "-" تنظیم شود. این متغیر نویسه‌ای را که برای جداسازی بخش‌های تاریخ هنگام چاپ یک مقدار DATE یا DATETIME توسط .B Remind به کار می‌رود در خود نگه می‌دارد. .TP .B $DedupeReminders اگر این متغیر روی 1 تنظیم شود، .B Remind یادآورهای تکراری را حذف خواهد کرد. یک یادآور مفروض زمانی تکراری یک یادآور پیشین در نظر گرفته می‌شود که تاریخ فعال‌سازی، زمان فعال‌سازی و بدنه آن .I دقیقاً یکسان باشد. به‌طور پیش‌فرض، این متغیر روی 0 تنظیم است و .B Remind یادآورهای تکراری را حذف نمی‌کند. .RS .PP به عنوان مثال، فایل یادآور زیر را در نظر بگیرید: .PP .nf SET $DedupeReminders 1 REM Wednesday MSG Phooey REM 20 MSG Phooey .fi .PP در روز چهارشنبه، ۲۰ نوامبر ۲۰۲۴، فقط .I یک پیام "Phooey" صادر خواهد شد. در دسامبر ۲۰۲۴، پیام "Phooey" در هر چهارشنبه و همچنین در روز جمعه، ۲۰ دسامبر ۲۰۲۴ صادر خواهد شد. .PP اگر $DedupeReminders را روی 0 تنظیم کنید، .B Remind حتی یادآورها را برای تشخیص تکراری بودن ردیابی نمی‌کند. مثال زیر را در نظر بگیرید: .PP .nf SET $DedupeReminders 0 REM Wednesday MSG Hello SET $DedupeReminders 1 REM Wednesday MSG Hello .fi .PP هر چهارشنبه، .B Remind تعداد .I دو یادآور "Hello" صادر خواهد کرد. زیرا زمانی که اولین "Hello" صادر شد، مقدار $DedupeReminders برابر 0 بود و بنابراین برای موارد تکراری بالقوه ردیابی نشد. .PP موارد تکراری پس از انجام تمام بسط‌ها و جایگزینی‌های متغیرها تشخیص داده می‌شوند. موارد زیر را در نظر بگیرید: .PP .nf SET $DedupeReminders 1 set a "foo" REM MSG [a] set a "bar" REM MSG [a] set a "foo" REM MSG [a] .fi .PP اولین دستور REM فعال می‌شود و "foo" را چاپ می‌کند. دومی فعال می‌شود و "bar" را چاپ می‌کند. سومی فعال نمی‌شود زیرا تکراری اولین "foo" است. .RE .TP .B "$DefaultColor (نوع STRING)" این متغیر را می‌توان روی رشته‌ای به صورت سه عدد که با فاصله از هم جدا شده‌اند تنظیم کرد. هر عدد باید یک عدد صحیح از 0 تا 255 باشد، یا هر سه عدد باید -1 باشند. مقدار پیش‌فرض .B $DefaultColor برابر "-1 -1 -1" است که رنگ‌آمیزی پیش‌فرض یادآورهای نوع MSG را غیرفعال می‌کند. اگر .B $DefaultColor را روی هر مقدار دیگری تنظیم کنید، آن‌گاه تمام یادآورهای نوع MSG، MSF و CAL به طور مؤثر به یادآورهای SPECIAL COLOR تبدیل می‌شوند که مقدار رنگ آن‌ها توسط .B $DefaultColor مشخص شده است. .RS .PP برخلاف سایر متغیرهای سیستمی، مقدار .B $DefaultColor در بین تکرارهای تقویم حفظ .I نمی‌شود؛ بلکه در شروع هر تکرار، مجدداً به "-1 -1 -1" بازنشانی می‌شود. .RE .TP .B $DefaultPrio اولویت پیش‌فرضی که به یادآورهای فاقد عبارت .B PRIORITY اختصاص داده می‌شود. می‌توانید این مقدار را در صورت نیاز تنظیم کنید تا اولویت بلوک‌هایی از یادآورها را بدون نیاز به تایپ اولویت برای تک‌تک یادآورها تغییر دهید. در زمان شروع، مقدار .B $DefaultPrio برابر 5000 است؛ این مقدار می‌تواند از 0 تا 9999 متغیر باشد. .TP .B $DefaultDelta می‌توانید این متغیر را روی عددی از 0 تا 10000 تنظیم کنید. اگر روی عددی غیرصفر تنظیم شود، آن‌گاه .B Remind هر دستور .B REM را که فاقد اختلاف زمان (دلتا) است، به‌گونه‌ای فعال می‌کند که گویی دلتایی برابر با .B ++$DefaultDelta داشته است. به‌طور پیش‌فرض، مقدار .B $DefaultDelta برابر صفر است. .TP .B $DefaultTDelta اختلاف زمان پیش‌فرضی که در صورت عدم تعیین +N در عبارت AT استفاده می‌شود. این مقدار معمولاً 0 است، اما می‌توان آن را با گزینه .B \-tt یا به صورت صریح در اسکریپت خود تنظیم کرد. اگر .B $DefaultDelta غیرصفر باشد، می‌توانید از یک دلتای صریح +0 در عبارت AT برای لغو دلتای پیش‌فرض استفاده کنید. .TP .B "$DeltaOverride (فقط‌خواندنی)" اگر غیرصفر باشد، متناظر با آرگومان .I n داده‌شده به گزینه خط فرمان .BI \-t n است. .TP .B "$DontFork (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-c در خط فرمان مشخص شده است. .TP .B "$DontTrigAts (فقط‌خواندنی)" تعداد دفعاتی که گزینه .B \-a در خط فرمان ارائه شده است. .TP .B "$DontQueue (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-q در خط فرمان مشخص شده است. .TP .B "$EndSent (نوع STRING)" شامل فهرستی از نویسه‌هایی است که جمله را به پایان می‌رسانند. کلیدواژه .B MSF دو فاصله پس از این نویسه‌ها درج می‌کند. در ابتدا، مقدار .B $EndSent روی ".!?" (نقطه، علامت تعجب و علامت سؤال) تنظیم شده است. .TP .B "$EndSentIg (نوع STRING)" شامل فهرستی از نویسه‌هایی است که وقتی .B MSF تصمیم می‌گیرد آیا دو فاصله پس از جمله قرار دهد یا خیر، باید نادیده گرفته شوند. در ابتدا، روی "'>)]}"+CHAR(34) (نقل‌قول تکی، بزرگ‌تر از، پرانتز بسته، براکت بسته، آکلاد بسته و نقل‌قول دوگانه) تنظیم است. .PP .RS به عنوان مثال، مقادیر پیش‌فرض به این صورت کار می‌کنند: .PP .nf MSF He said, "Huh! (Two spaces will follow this.)" Yup. .fi .PP زیرا پرانتز و علامت نقل‌قول پایانی (به منظور فاصله‌گذاری) هنگامی که بعد از یک نقطه می‌آیند، نادیده گرفته می‌شوند. .RE .TP .B $ExpressionTimeLimit اگر روی یک مقدار غیرصفر .I n تنظیم شود، هر عبارتی که ارزیابی آن بیش از .I n ثانیه طول بکشد، متوقف شده و خطایی برگردانده می‌شود. این کار برای جلوگیری از عبارت‌های مخرب طراحی‌شده جهت ایجاد حمله منع سرویس (DoS) است. در یک فایل ضمیمه‌شده، مقدار $ExpressionTimeLimit فقط می‌تواند نسبت به مقدار فعلی خود کاهش یابد. در فایل سطح بالا، می‌توان آن را روی هر مقداری تنظیم کرد، از جمله صفر برای غیرفعال کردن محدودیت زمانی. .TP .B $FirstIndent تعداد فاصله‌هایی که خط اول یک یادآور نوع .B MSF باید به اندازه آن تورفتگی داشته باشد. مقدار پیش‌فرض 0 است. .TP .B $FoldYear توابع استاندارد کتابخانه یونیکس ممکن است در مواجهه با تاریخ‌های پس از سال ۲۰۳۷ با مشکل مواجه شوند. اگر این متغیر روی 1 تنظیم شود، آن‌گاه محاسبات UTC سال‌های پس از ۲۰۳۷ را پیش از استفاده از توابع کتابخانه یونیکس «به عقب بازمی‌گردانند». به عنوان مثال، برای فهمیدن اینکه آیا ساعت تابستانی در ژوئن ۲۰۷۷ برقرار است یا خیر، سال به ۲۰۲۷ برگردانده می‌شود، زیرا هر دو سال در یک روز جمعه آغاز می‌شوند و هر دو سال عادی (غیرکبیسه) هستند. بنابراین فرض می‌شود که قوانین ساعت تابستانی برای هر دو سال یکسان است و توابع کتابخانه یونیکس می‌توانند سال ۲۰۲۷ را پردازش کنند. به‌طور پیش‌فرض، مقدار این متغیر 0 است. اگر توابع مربوط به خورشید یا UTC برای سال‌های پس از ۲۰۳۷ درست عمل نکردند، آن را روی 1 تنظیم کنید. همچنین بخش «دستگاه‌های دارای نوع TIME_T ۳۲ بیتی» را مشاهده کنید. .TP .B $FormWidth حداکثر عرض هر خط متن برای قالب‌بندی یادآورهای نوع .BR MSF . مقدار پیش‌فرض برابر با عرض ترمینال بر حسب ستون‌ها منهای ۸ است، اما بین حداقل ۲۰ و حداکثر ۵۰۰ محدود شده است. اگر خروجی استاندارد یک ترمینال نباشد، مقدار پیش‌فرض ۷۲ است. اگر یک یادآور نوع .B MSF حاوی کلمه‌ای باشد که بیش از حد طولانی بوده و در این عرض نگنجد، بریده نخواهد شد؛ بلکه محدودیت عرض نادیده گرفته می‌شود. .TP .B "$HideCompletedTodos (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-\-hide\-completed\-todos در خط فرمان مشخص شده است. .TP .B "$HushMode (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-h در خط فرمان مشخص شده است. .TP .B "$IgnoreOnce (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-o در خط فرمان ارائه شده است یا به دلیلی دیگر به صورت ضمنی فعال شده است. در این حالت، دستورالعمل‌های .B ONCE نادیده گرفته خواهند شد. .TP .B "$InfDelta (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-t بدون آرگومان .I n در خط فرمان مشخص شده است. .TP .B "$IntMax (فقط‌خواندنی)" بزرگ‌ترین مقدار قابل نمایش از نوع .BR INT . روی سیستمی با اعداد صحیح علامت‌دار ۳۲ بیتی با استفاده از نمایش مکمل دو، این مقدار ۲۱۴۷۴۸۳۶۴۷ خواهد بود. .TP .B "$IntMin (فقط‌خواندنی)" کوچک‌ترین مقدار قابل نمایش از نوع .BR INT . روی سیستمی با اعداد صحیح علامت‌دار ۳۲ بیتی با استفاده از نمایش مکمل دو، این مقدار -۲۱۴۷۴۸۳۶۴۸ خواهد بود. .TP .B "$Latitude (نوع STRING)" عرض جغرافیایی موقعیت مکانی شما، که به صورت یک رشته حاوی عدد ممیز شناور بیان می‌شود. از آنجا که .B Remind نوع ممیز شناور بومی ندارد، باید آن را به صورت رشته بیان کنیم. $Latitude می‌تواند از "-90.0" تا "90.0" متغیر باشد که اعداد مثبت نشان‌دهنده نقاط واقع در شمال خط استوا و اعداد منفی نشان‌دهنده جنوب هستند. توجه داشته باشید که صرف‌نظر از محلی‌سازی سیستم شما، $Latitude همواره در محلی‌سازی "C" تفسیر می‌شود و بنابراین ممیز اعشاری باید یک نقطه (".") باشد. .TP .B "$Longitude (نوع STRING)" طول جغرافیایی موقعیت مکانی شما، که به صورت یک رشته حاوی عدد ممیز شناور بیان می‌شود. از آنجا که .B Remind نوع ممیز شناور بومی ندارد، باید آن را به صورت رشته بیان کنیم. $Longitude می‌تواند از "-180.0" تا "180.0" متغیر باشد که اعداد مثبت نشان‌دهنده نقاط شرق نصف‌النهار گرینویچ و اعداد منفی نشان‌دهنده غرب آن هستند. توجه داشته باشید که صرف‌نظر از محلی‌سازی سیستم شما، $Longitude همواره در محلی‌سازی "C" تفسیر می‌شود و بنابراین ممیز اعشاری باید یک نقطه (".") باشد. .RS .PP به عنوان مثال، مختصات مجسمه آزادی در شهر نیویورک تقریباً به این صورت تنظیم می‌شود: .PP .nf SET $Latitude "40.68933" SET $Longitude "-74.04454" .fi .RE .TP .B "$LatDeg، $LatMin، $LatSec (منسوخ‌شده)" این‌ها عرض جغرافیایی موقعیت مکانی شما را مشخص می‌کنند. .B $LatDeg می‌تواند از \-90 تا 90 و موارد دیگر از \-59 تا 59 متغیر باشند. عرض‌های جغرافیایی شمالی مثبت و عرض‌های جنوبی منفی هستند. برای عرض‌های جنوبی، هر سه مؤلفه باید منفی باشند. این سه متغیر منسوخ شده‌اند؛ باید به جای آن‌ها از .B $Latitude استفاده کنید. .TP .B "$Location (نوع STRING)" رشته‌ای است که نام موقعیت مکانی شما را مشخص می‌کند. این معمولاً نام شهر شما است. می‌توان آن را روی هر مقداری که مایلید تنظیم کرد، اما سبک نگارش مناسب ایجاب می‌کند که با متغیرهای سیستمی عرض و طول جغرافیایی سازگار نگه داشته شود. .TP .B "$LongDeg، $LongMin، $LongSec (منسوخ‌شده)" این‌ها طول جغرافیایی موقعیت مکانی شما را مشخص می‌کنند. .B $LongDeg می‌تواند از \-180 تا 180 متغیر باشد. طول‌های جغرافیایی غربی مثبت و طول‌های شرقی منفی هستند. توجه داشته باشید که هر سه مؤلفه باید دارای علامت یکسانی باشند: همگی برای طول‌های غربی مثبت و همگی برای طول‌های شرقی منفی. توجه کنید که به دلایل تاریخی، علامت طول جغرافیایی با .I عرف متداول متفاوت است! اگر طول جغرافیایی موقعیت خود را از یک موتور جستجو پیدا کنید، به احتمال زیاد .I باید علامت آن را معکوس کنید تا با Remind درست کار کند. این سه متغیر منسوخ شده‌اند؛ باید به جای آن‌ها از .B $Longitude استفاده کنید. همچنین توجه داشته باشید که .B $Longitude از قرارداد استاندارد علامت منفی برای طول‌های غربی و مثبت برای طول‌های شرقی استفاده می‌کند. .RS .PP اطلاعات عرض و طول جغرافیایی برای توابع .B sunrise() و .B sunset() مورد نیاز است. مقادیر پیش‌فرض را می‌توان در زمان کامپایل در .B Remind گنجاند، یا می‌توانید مقادیر صحیح را با .B SET در ابتدای اسکریپت‌های یادآور خود تنظیم کنید. .PP توجه داشته باشید که تنظیم هر یک از .BR $LongDeg ، .B $LongMin و .B $LongSec مقدار .B $Longitude را متناظراً به‌روزرسانی می‌کند، و تنظیم .B $Longitude نیز .BR $LongDeg ، .B $LongMin و .B $LongSec را به‌روز می‌نماید. قوانین مشابهی برای .BR $Latitude ، .BR $LatDeg ، .B $LatMin و .B $LatSec اعمال می‌شود. .RE .TP .B "$JSONMode (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه خط فرمان .B \-\-json مشخص شده است. .TP .B $MaxLateMinutes این متغیر نحوه واکنش .B Remind به به خواب رفتن (suspend) و سپس بیدار شدن رایانه را کنترل می‌کند. به‌طور معمول، اگر یک یادآور زمان‌دار در صف قرار گیرد و سپس رایانه معلق (suspend) شود و پس از آن رایانه .I بعد از زمان فعال‌سازی یادآور زمان‌دار بیدار شود، .B Remind علیرغم اینکه زمان فعال‌سازی قبلاً سپری شده است، تایمر را فعال می‌کند. .RS .PP اگر .B $MaxLateMinutes را روی یک عدد صحیح غیرصفر بین 1 تا 1440 تنظیم کنید، آن‌گاه .B Remind یادآور زمان‌داری را که زمان فعال‌سازی آن بیش از .B $MaxLateMinutes دقیقه در گذشته باشد، فعال .I نخواهد کرد. .PP توجه داشته باشید که .B Remind از مقدار .B $MaxLateMinutes که در زمان اتمام خواندن فایل یادآور و رفتن به پس‌زمینه حاکم است استفاده می‌کند. عموماً باید .B $MaxLateMinutes را یک بار نزدیک ابتدای فایل تنظیم کنید و پس از آن تغییر ندهید. .RE .TP .B $MaxSatIter حداکثر تعداد تکرارها برای عبارت .B SATISFY (که در ادامه توضیح داده شده است). باید حداقل 10 باشد. مقدار پیش‌فرض 10,000 است. .TP .B $MaxStringLen محدودیتی روی طولانی‌ترین رشته‌ای که .B Remind به شما اجازه ایجاد آن را می‌دهد. مقدار پیش‌فرض 65535 است. اگر .B $MaxStringLen را روی 0 یا -1 تنظیم کنید، آن‌گاه .B Remind به شما اجازه می‌دهد رشته‌هایی با طول دلخواه ایجاد کنید، دست‌کم تا زمانی که حافظه تمام شود. ما تنظیم .B $MaxStringLen روی 0 یا -1 را توصیه نمی‌کنیم، زیرا در این حالت نوشتن کدی که باعث منع سرویس (DoS) .B Remind شود بسیار آسان خواهد بود. .TP .B $MinsFromUTC تعداد دقایق بین زمان هماهنگ جهانی (UTC) و زمان محلی. اگر .B $CalcUTC غیرصفر باشد، این مقدار هنگام شروع .B Remind محاسبه می‌شود. در غیر این صورت، باید آن را به صورت صریح تنظیم کنید. اگر .B $CalcUTC صفر باشد، از .B $MinsFromUTC در محاسبات نجومی استفاده می‌شود. شما باید خودتان آن را برای ساعت تابستانی تنظیم کنید. همچنین، اگر می‌خواهید .B $MinsFromUTC را با استفاده از گزینه خط فرمان .B \-i مقداردهی اولیه کنید، باید .B $CalcUTC را نیز با گزینه .B \-i روی 0 تنظیم کنید. .TP .B "$NextMode (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-n در خط فرمان مشخص شده است. .TP .B "$MaxFullOmits (فقط‌خواندنی)" حداکثر تعداد OMITهای کامل مجاز (یک مقدار ثابت در زمان کامپایل). .TP .B "$MaxPartialOmits (فقط‌خواندنی)" حداکثر تعداد OMITهای جزئی مجاز (یک مقدار ثابت در زمان کامپایل). .TP .B "$NumFullOmits (فقط‌خواندنی)" تعداد OMITهای کامل در بافت OMIT فعلی. .TP .B "$NumPartialOmits (فقط‌خواندنی)" تعداد OMITهای جزئی در بافت OMIT فعلی. .TP .B "$NumQueued (فقط‌خواندنی)" تعداد یادآورهایی که تاکنون برای فعال‌سازی زمان‌بندی‌شده در پس‌زمینه در صف قرار گرفته‌اند. .TP .B "$NumTrig (فقط‌خواندنی)" شامل تعداد یادآورهای فعال‌شده برای تاریخ جاری است. یکی از کاربردهای این متغیر به شرح زیر است: فرض کنید می‌خواهید هر زمان که یک تعطیلی فعال شد، خانه تقویم PostScript را سایه‌دار (رنگی) کنید. می‌توانید مقدار .B $NumTrig را پیش از اجرای یک بلوک از یادآورهای تعطیلات در یک متغیر معمولی ذخیره کنید. اگر مقدار .B $NumTrig پس از بلوک تعطیلات بیشتر از مقدار ذخیره‌شده باشد، آن‌گاه حداقل یک روز تعطیل فعال شده است و می‌توانید دستور سایه‌زدن خانه تقویم را اجرا کنید. (بخش «حالت تقویم» را مشاهده کنید.) .PP .RS توجه داشته باشید که .B $NumTrig .I تنها تحت تأثیر دستورات .B REM قرار می‌گیرد؛ فعال‌سازی‌ها در دستورات .B IFTRIG روی آن اثری ندارند. .RE .TP .B "$OnceFile (نوع STRING)" اگر این متغیر را روی یک رشته غیرخالی تنظیم کنید، .B Remind به جای استفاده از تاریخ دسترسی فایل برای تعیین اجرا یا عدم اجرای یادآور نوع ONCE، یک برچسب زمانی را در فایل .B $OnceFile نگهداری خواهد کرد. این روش قابل‌اعتمادتر از استفاده از تاریخ دسترسی به فایل یادآور است. .RS .PP اگر .B $OnceFile وجود نداشته باشد، در اولین باری که یک کلیدواژه .B ONCE پردازش می‌شود ایجاد خواهد شد. این فایل باید توسط کاربر فعلی قابل‌نوشتن باشد. اگر سعی کنید .B $OnceFile را .I پس از اینکه یک یادآور .B ONCE قبلاً پردازش شده است تنظیم کنید، .B Remind یک هشدار صادر کرده و تلاش برای تنظیم .B $OnceFile را نادیده می‌گیرد. .RE .TP .B $ParseUntriggered پرچمی که مشخص می‌کند آیا .B Remind باید دستورات .B REM را که فعال نشده‌اند به طور کامل تجزیه کند یا خیر. مقدار 0 (پیش‌فرض) به معنای نادیده گرفتن تجزیه آن‌ها و 1 به معنای تجزیه کامل آن‌هاست. .PP .RS به عنوان مثال، اگر دستور .B REM زیر را داشته باشیم: .PP .nf REM 2020-01-01 MSG ["bad_expression" / 2] .fi .PP آن‌گاه اگر .B $ParseUntriggered روی 1 تنظیم شده باشد، .B Remind خط را به طور کامل تجزیه کرده و حتی اگر یادآور فعال نشده باشد، خطای «Type mismatch» (عدم تطابق نوع) صادر می‌کند. با این حال، اگر .B $ParseUntriggered روی 0 (پیش‌فرض) تنظیم باشد، .B Remind هیچ خطایی صادر نخواهد کرد مگر در تاریخ 2020-01-01 که یادآور فعال می‌شود. .PP نگه‌داشتن .B $ParseUntriggered روی 0 ممکن است عملکرد را کمی بهبود بخشد، هرچند به قیمت شناسایی نشدن خطاها تا زمان فعال شدن یادآور تمام می‌شود. ما توصیه می‌کنیم آن را روی 0 بگذارید. .RE .TP .B "$PrefixLineNo (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-l در خط فرمان مشخص شده است. .TP .B "$PSCal (فقط‌خواندنی)" اگر غیرصفر باشد، گزینه .B \-p در خط فرمان مشخص شده است. .TP .B "$Repeat (فقط‌خواندنی)" اگر این متغیر دارای مقدار غیرصفر .I n باشد، آرگومان خط فرمان به صورت *\fIn\fR برای مشخص کردن اجرای مکرر .B Remind ارائه شده است. .TP .B "$RunOff (فقط‌خواندنی)" اگر غیرصفر باشد، دستورالعمل‌های .B RUN غیرفعال هستند. .TP .B "$Shaded (فقط‌خواندنی)" تعداد دفعاتی را برمی‌گرداند که یک یادآور ویژه .B SHADE فعال شده است. .I این متغیر فقط در حالت تقویم تنظیم می‌شود، نه در حالت یادداشت روزانه (agenda). می‌توانید از این متغیر برای جلوگیری از سایه‌زدن مجدد روزی در تقویم که قبلاً سایه‌دار شده است استفاده کنید. .RS .PP به عنوان مثال، فرض کنید می‌خواهید تمام خانه‌های تقویم را زرد کنید .I اگر یادآوری در آن روز فعال شده باشد؛ اما اگر خانه‌ای به صراحت سایه‌دار شده باشد، نمی‌خواهید آن سایه‌زنی بازنویسی شود. می‌توانید از کدی شبیه به این استفاده کنید: .PP .nf SET n $NumTrig # تمام یادآورهای خود را اینجا قرار دهید... # اگر چیزی فعال شده باشد و خانه هنوز # سایه‌دار نشده باشد، آن را زرد کنید IF $NumTrig > n && !$Shaded REM SPECIAL SHADE 255 255 128 ENDIF .fi .RE .TP .B "$SimpleCal (فقط‌خواندنی)" اگر .I هر یک از گزینه‌های خط فرمان .B \-p یا .B \-s داده شده باشند، روی مقداری غیرصفر تنظیم می‌شود. .TP .B "$SortByDate (فقط‌خواندنی)" اگر از گزینه .B \-g استفاده نشود مقدار آن 0 است، اگر مرتب‌سازی بر اساس تاریخ به صورت صعودی باشد 1، و اگر مرتب‌سازی بر اساس تاریخ به صورت نزولی باشد 2 است. .TP .B "$SortByPrio (فقط‌خواندنی)" اگر از گزینه .B \-g استفاده نشود مقدار آن 0 است، اگر مرتب‌سازی بر اساس اولویت به صورت صعودی باشد 1، و اگر مرتب‌سازی بر اساس اولویت به صورت نزولی باشد 2 است. .TP .B "$SortByTime (فقط‌خواندنی)" اگر از گزینه .B \-g استفاده نشود مقدار آن 0 است، اگر مرتب‌سازی بر اساس زمان به صورت صعودی باشد 1، و اگر مرتب‌سازی بر اساس زمان به صورت نزولی باشد 2 است. .TP .B $SubsIndent تعداد فاصله‌هایی که تمام خطوط (به جز خط اول) یک یادآور نوع .B MSF باید دارای تورفتگی باشند. مقدار پیش‌فرض 0 است. .TP .B $SuppressImplicitWarnings به طور معمول، اگر خطی با یک نشانه ناشناخته آغاز شود و به عنوان دستور .B REM در نظر گرفته شود، یا اگر یک دستور .B REM فاقد نوع باشد و به عنوان یادآور نوع .B MSG در نظر گرفته شود، .B Remind یک هشدار صادر می‌کند. تنظیم .B $SuppressImplicitWarnings روی 1 این هشدارها را متوقف می‌کند. مقدار پیش‌فرض 0 است و ما غیرفعال کردن هشدارها را توصیه نمی‌کنیم. .TP .B $SuppressLRM به طور معمول، هنگامی که .B Remind با گزینه .B \-c در یک محلی‌سازی UTF-8 اجرا می‌شود، پس از چاپ نام روزها یا یادآورها، یک توالی علامت چپ‌به‌راست (LRM) صادر می‌کند. برخی پایانه‌ها این توالی را به نادرستی رندر می‌کنند، بنابراین می‌توانید از: .RS .PP .nf SET $SuppressLRM 1 .fi .PP در بالای فایل یادآور خود برای جلوگیری از صدور توالی‌های LRM استفاده کنید، یا می‌توانید .B Remind را با گزینه .B '\-i$SuppressLRM=1' فراخوانی کنید. .RE .TP .B "$SysInclude (فقط‌خواندنی، نوع STRING)" یک مسیر دایرکتوری شامل اسکریپت‌های استاندارد یادآور است. در حال حاضر، .B Remind همراه با برخی فایل‌های استاندارد تعطیلات و بسته‌های زبان عرضه می‌شود. مقدار .B $SysInclude در این نصب "/usr/share/remind" است. .TP .B "$T (فقط‌خواندنی، نوع DATE یا INT)" معادل با .BR trigdate() . (بخش توابع توکار را مشاهده کنید.) .TP .B "$Tb (فقط‌خواندنی، نوع DATE یا INT)" معادل با .BR trigbase() . .TP .B "$Td (فقط‌خواندنی)" معادل با .BR day(trigdate()) . .TP .B "$Tm (فقط‌خواندنی)" معادل با .BR monnum(trigdate()) . .TP .B "$Tu (فقط‌خواندنی، نوع DATE یا INT)" معادل با .BR triguntil() . .TP .B "$Tw (فقط‌خواندنی)" معادل با .BR wkdaynum(trigdate()) . .TP .B "$Ty (فقط‌خواندنی)" معادل با .BR year(trigdate()) . .TP .B "$Tt (فقط‌خواندنی، نوع TIME یا INT)" معادل با .BR trigtime() . .TP .B "$TimeSep (نوع STRING)" این متغیر فقط می‌تواند روی ":" یا "." تنظیم شود. نویسه‌ای را نگه می‌دارد که برای جداسازی بخش‌های زمان هنگام چاپ یک مقدار TIME یا DATETIME توسط .B Remind به کار می‌رود. .TP .B "$TimetIs64bit (فقط‌خواندنی)" این متغیر اگر نوع داخلی .B time_t در C حداقل ۶۴ بیت طول داشته باشد مقدار 1 را برمی‌گرداند. اگر 0 برگرداند، کتابخانه داخلی C قادر به نمایش تاریخ‌های پس از حدود ۲۰۳۸ نخواهد بود و .B Remind از یک راهکار جایگزین برای جلوگیری از مشکلات استفاده خواهد کرد. همچنین بخش «دستگاه‌های دارای نوع TIME_T ۳۲ بیتی» را مشاهده کنید. .TP .B "$TodoFilter (فقط‌خواندنی)" اگر 0 باشد، هم رویدادها و هم موارد انجام کار (TODO) خروجی داده می‌شوند. اگر 1 باشد، گزینه خط فرمان .B \-\-only\-todos مشخص شده است. اگر 2 باشد، گزینه خط فرمان .B \-\-only\-events مشخص شده است. .TP .B "$UntimedFirst (فقط‌خواندنی)" اگر گزینه .B \-g با نویسه چهارم مرتب‌سازی به صورت "d" استفاده شده باشد روی 1 تنظیم می‌شود؛ در غیر این صورت روی 0 تنظیم است. .TP .B "$U (فقط‌خواندنی، نوع DATE)" دقیقاً معادل با .BR today() . (بخش توابع توکار را مشاهده کنید.) .TP .B "$Ud (فقط‌خواندنی)" معادل با .BR day(today()) . .TP .B "$Um (فقط‌خواندنی)" معادل با .BR monnum(today()) . .TP .B "$Uw (فقط‌خواندنی)" معادل با .BR wkdaynum(today()) . .TP .B "$Uy (فقط‌خواندنی)" معادل با .BR year(today()) . .TP .B "$UseVTColors (فقط‌خواندنی)" اگر از گزینه‌های .B \-@ یا .B \-cc استفاده شده باشد روی 1 تنظیم می‌شود؛ در غیر این صورت 0 است. .TP .B "$UseBGVTColors (فقط‌خواندنی)" اگر از گزینه .B \-@,,1 استفاده شده باشد روی 1 تنظیم می‌شود؛ در غیر این صورت 0 است. .TP .B "$Use256Colors (فقط‌خواندنی)" اگر از گزینه .B \-@1 استفاده شده باشد روی 1 تنظیم می‌شود؛ در غیر این صورت 0 است. .TP .B "$UseTrueColors (فقط‌خواندنی)" اگر از گزینه .B \-@2 استفاده شده باشد روی 1 تنظیم می‌شود؛ در غیر این صورت 0 است. .TP .B "$TerminalBackground (فقط‌خواندنی)" اگر رنگ پس‌زمینه پایانه قابل تشخیص نباشد مقدار -1 را برمی‌گرداند؛ اگر تیره تشخیص داده شود (یا با گزینه .B \-@,0 به عنوان تیره مشخص شده باشد) مقدار 0 و اگر روشن تشخیص داده شود (یا با گزینه .B \-@,1 به عنوان روشن مشخص شده باشد) مقدار 1 را برمی‌گرداند. پس‌زمینه پایانه زمانی «تیره» در نظر گرفته می‌شود که میانگین مؤلفه‌های قرمز، سبز و آبی حداکثر ۸۵ از ۲۵۵ باشد، و حداکثر هر یک از مؤلفه‌ها حداکثر ۱۲۸ از ۲۵۵ باشد. .TP .B "$TerminalHyperlinks (نوع INT)" اگر پایانه شما از توالی‌های گریز برای ایجاد پیوندهایی شبیه به HTML در اطراف متن پشتیبانی می‌کند (نشانی https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda را ببینید)، می‌توانید این متغیر را روی 1 تنظیم کنید. آن‌گاه .B Remind هر یادآور دارای رشته اطلاعاتی "Url:" را به یک ابرپیوند در پایانه شما تبدیل خواهد کرد. به‌طور پیش‌فرض، اگر خروجی استاندارد .B Remind یک پایانه باشد، مقدار .B $TerminalHyperlinks روی 1 تنظیم می‌شود، و اگر پایانه نباشد روی 0 تنظیم خواهد شد. .TP .B "$WarningLevel (نوع STRING)" با انتشار نسخه‌های جدید .BR Remind ، ممکن است هشدارهای جدیدی اضافه شوند. اگر اسکریپت‌های شما که قبلاً بدون مشکل اجرا می‌شدند، با ارتقای .B Remind ناگهان شروع به صدور هشدار کنند، به عنوان یک راهکار .I موقت می‌توانید .B $WarningLevel را روی رشته‌ای به فرم .IB AB . CD . EF تنظیم کنید که در آن .IR AB ، .I CD و .I EF جفت‌هایی از ارقام ده‌دهی هستند. این کار هرگونه هشداری را که .I پس از نسخه .IB AB . CD . EF برنامه .B Remind معرفی شده است متوقف می‌کند. اگر .B $WarningLevel را تنظیم نکنید، مقدار پیش‌فرض آن نسخه جاری .B Remind خواهد بود، به این معنی که تمام هشدارها صادر خواهند شد. .RS .PP به عنوان مثال، اگر می‌خواهید هشدارهایی که دریافت می‌کنید به آنچه Remind 05.00.00 تولید می‌کرد محدود شود، از این دستور استفاده کنید: .PP .nf SET $WarningLevel "05.00.00" .fi .PP ما توصیه .I نمی‌کنیم که .B $WarningLevel را به عنوان یک روال معمول تنظیم کنید؛ شما باید از آن تنها تا زمانی برای متوقف کردن هشدارها استفاده کنید که اسکریپت‌های remind خود را اصلاح نمایید تا دیگر هشداری صادر نکنند. .RE .PP نکته: اگر هر یک از حالت‌های تقویم فعال باشند، مقادیر متغیرهای $Daemon ،$DontFork ،$DontTrigAts ،$DontQueue ،$HushMode ،$IgnoreOnce ،$InfDelta و $NextMode معنایی نخواهند داشت. .PP .SH "ذخیره و بازیابی متغیرها (SAVING AND RESTORING VARIABLES)" .PP درست مانند بافت OMIT، شما می‌توانید مقادیر متغیرهای سراسری و تمام متغیرهای سیستمی (قابل‌تغییر) را ذخیره و بازیابی کنید. به عنوان مثال: .PP .nf SET a 1 UNSET b # ذخیره متغیرها PUSH-VARS $DefaultColor $AddBlankLines a b SET $DefaultColor "255 0 0" SET $AddBlankLines 0 SET a 3 SET b 4 REM MSG Hello # بازیابی تمام متغیرهایی که پیش‌تر ذخیره شدند POP-VARS # اکنون تغییرات اعمال‌شده بر $DefaultColor و $AddBlankLines # لغو شده‌اند. علاوه بر این، a به مقدار 1 بازگردانده شده # و مقدار b لغو شده است .fi .PP همان‌طور که در مثال مشاهده می‌کنید، PUSH-VARS فهرستی از نام‌های متغیرهای سراسری و/یا نام‌های متغیرهای سیستمی را دریافت می‌کند. شما می‌توانید مقادیر هر متغیر سیستمی .I قابل‌تغییر و هر متغیر سراسری را ذخیره کنید. حتی می‌توانید متغیرهای سراسری را که هنوز مقداردهی نشده‌اند ذخیره (push) کنید. .PP دستور POP-VARS مقادیر تمام متغیرهای سیستمی و متغیرهای سراسری را که توسط آخرین دستور PUSH-VARS ذخیره شده بودند بازیابی می‌کند. اگر یک متغیر سراسری تعریف‌نشده را ذخیره کرده باشید، آن متغیر توسط دستور POP-VARS لغو مقدار (unset) می‌شود. .PP .SH "توابع داخلی (BUILT-IN FUNCTIONS)" .PP دستور \fBRemind\fR شمار زیادی از توابع داخلی دارد. نحو فراخوانی یک تابع مانند زبان C است \- نام تابع، و به دنبال آن فهرستی از آرگومان‌ها که با کاما از یکدیگر جدا شده و درون پرانتز قرار گرفته‌اند. نام توابع به حروف بزرگ و کوچک حساس نیست. اگر تابعی هیچ آرگومانی نپذیرد، باید در فراخوانی تابع با «()» همراه شود. در غیر این صورت، \fBRemind\fR آن را به عنوان نام متغیر تفسیر کرده و احتمالاً به درستی کار نخواهد کرد. .PP در توضیحات زیر، از اشکال کوتاه برای نشان دادن نوع‌های مجاز آرگومان‌ها استفاده می‌شود. نویسه‌های "i"، "s"، "d"، "t" و "q" به ترتیب نمایانگر آرگومان‌های \fBINT\fR، \fBSTRING\fR، \fBDATE\fR، \fBTIME\fR و \fBDATETIME\fR هستند. اگر یک آرگومان بتواند یکی از چندین نوع باشد، این نویسه‌ها به یکدیگر متصل می‌شوند. برای نمونه، "di_arg" نمایانگر آرگومانی است که می‌تواند یک \fBDATE\fR یا یک \fBINT\fR باشد. "x_arg" نمایانگر آرگومانی از هر نوعی است. پس از نوع آرگومان، یک زیرخط (underscore) و شناسه‌ای که نام آرگومان است قرار می‌گیرد. .PP توابع داخلی عبارتند از: .TP .B _(s_message) مدخل جدول ترجمه برای \fImessage\fR را برمی‌گرداند. اگر چنین مدخلی در جدول ترجمه وجود نداشته باشد، مقدار \fImessage\fR را بدون تغییر بازمی‌گرداند. برای نمونه، این دنباله را در نظر بگیرید: .RS .PP .nf TRANSLATE "Goodbye" "Tot ziens" SET a _("Goodbye") .fi .PP پس از اجرای این دو خط، متغیر \fBa\fR برابر "Tot ziens" تنظیم خواهد شد. برای اطلاعات بیشتر بخش «جدول ترجمه (THE TRANSLATION TABLE)» را ببینید. .PP در بدنه یک یادآور، دنباله جایگزینی \fB%(\fItext\fR\fB)\fR (تقریباً) معادل \fB[_("\fItext\fR\fB")]\fR است. بنابراین یادآورهای زیر تقریباً معادلند: .PP .nf REM MSG %(Goodbye) REM MSG [_("Goodbye")] .fi .PP تنها تفاوت در این است که اگر _("Goodbye") حاوی علامت \fB%\fR باشد، آنگاه آن نتیجه از فیلتر جایگزینی عبور داده خواهد شد، در حالی که در یادآور اول عبور داده نمی‌شود. علت آن است که دستور دوم \fBREM\fR ابتدا الصاق عبارت (expression pasting) و به دنبال آن یک گذر از فیلتر جایگزینی را انجام می‌دهد، در حالی که دستور اول ترجمه را به عنوان بخشی از فیلتر جایگزینی انجام می‌دهد (و گذر دوم از فیلتر جایگزینی را اعمال نمی‌کند). .RE .TP .B abs(i_num) قدر مطلق \fInum\fR را برمی‌گرداند. .TP .B access(s_file, si_mode) مجوزهای دسترسی به فایل \fIfile\fR را آزمایش می‌کند. \fIMode\fR می‌تواند رشته‌ای شامل ترکیبی از نویسه‌های "rwx" برای آزمایش مجوزهای خواندن، نوشتن و اجرا باشد. متناوباً، \fImode\fR می‌تواند عددی مطابق با فراخوانی سیستمی \fBaccess\fR(2) در یونیکس باشد. این تابع در صورتی که فایل با \fImode\fR مشخص‌شده قابل دسترسی باشد مقدار 0 و در غیر این صورت مقدار \-1 را بازمی‌گرداند. .TP .B adawn([dq_date]) زمان «سپیده‌دم نجومی» (astronomical dawn) را در \fIdate\fR مشخص‌شده برمی‌گرداند. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. اگر یک شیء \fIdatetime\fR داده شود، تنها مؤلفه تاریخ آن استفاده می‌شود. .TP .B adusk([dq_date]) زمان «گرگ‌ومیش نجومی» (astronomical twilight) را در \fIdate\fR مشخص‌شده برمی‌گرداند. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. .TP .B ampm(tq_time [,s_am [,s_pm [,i_lz]]]) یک \fBSTRING\fR برمی‌گرداند که نتیجه تبدیل \fItime\fR (که یک شیء \fBTIME\fR یا \fBDATETIME\fR است) به قالب "AM/PM" می‌باشد. آرگومان‌های اختیاری \fIam\fR و \fIpm\fR رشته‌هایی هستند که به ترتیب در حالت‌های قبل‌ازظهر و بعدازظهر اضافه می‌شوند؛ مقادیر پیش‌فرض آن‌ها "AM" و "PM" است. آرگومان اختیاری \fIlz\fR مشخص می‌کند که آیا ساعت باید با صفر پیشگام (leading zero) به دو رقم تکمیل شود یا خیر. اگر \fIlz\fR صفر باشد، صفر پیشگام اضافه نمی‌شود؛ در غیر این صورت، ساعت با یک صفر پیشگام به دو رقم تکمیل می‌گردد. در صورت عدم تعیین، مقدار پیش‌فرض \fIlz\fR برابر صفر است. .RS .PP این تابع هنگام قالب‌بندی خروجی خود از متغیرهای سیستمی $DateSep، $TimeSep و $DateTimeSep پیروی می‌کند. در اینجا چند نمونه از خروجی آن آورده شده است: .PP .nf ampm(0:22) returns "12:22AM" ampm(17:45, "am", "pm") returns "5:45pm" ampm(17:45, "am", "pm", 1) returns "05:45pm" ampm('2020-03-14@21:34') returns "2020-03-14@9:34PM" .fi .PP .RE .TP .B ansicolor(i_red, i_green, i_blue [,i_bg [,i_clamp]]) یک \fBSTRING\fR شامل دنباله فرار ANSI برای تغییر رنگ متن ترمینال برمی‌گرداند. پارامترهای \fIred\fR، \fIgreen\fR و \fIblue\fR اعدادی صحیح از 0 تا 255 هستند که مقدار مؤلفه رنگ مربوطه را مشخص می‌کنند. به عنوان یک حالت ویژه، هر سه مقدار می‌توانند \-1 باشند؛ در این حالت دنباله ANSI با مقدار "ESC[0m" بازگردانده می‌شود که تمام ویژگی‌های متنی را به حالت عادی بازنشانی می‌کند. .RS .PP رشته بازگردانده‌شده توسط \fBansicolor\fR به حالت رنگی که \fBRemind\fR در آن اجرا می‌شود (همان‌طور که توسط گزینه B\-@ R تعیین شده) بستگی دارد. اگر حالت رنگی فعال نباشد، \fBansicolor\fR همواره رشته خالی بازمی‌گرداند. در غیر این صورت، دنباله فراری را بازمی‌گرداند که بهترین تقریب رنگ را با توجه به حالت رنگی B\-@ R ارائه می‌دهد. .PP آرگومان اختیاری \fIbg\fR برابر 0 یا 1 است. اگر 0 باشد (پیش‌فرض)، رنگ پیش‌زمینه تنظیم می‌شود. اگر 1 باشد، رنگ پس‌زمینه تنظیم می‌گردد. توجه داشته باشید که تنظیم رنگ پس‌زمینه تنها در حالت 256 رنگی یا رنگ واقعی (true-color) کار می‌کند. .PP آرگومان اختیاری \fIclamp\fR برابر 0 یا 1 است. اگر 0 باشد (پیش‌فرض)، رنگ‌ها بر اساس رنگ پس‌زمینه ترمینال تعدیل نمی‌شوند. اگر 1 باشد، \fBRemind\fR تلاش می‌کند رنگ‌های تیره یا روشن را طوری تنظیم کند که کنتراست کافی برای دیده شدن در ترمینال داشته باشند. .PP سه آرگومان نخست می‌توانند به عنوان یک جایگزین، به صورت رشته‌ای متشکل از سه عدد جداشده با فاصله نیز مشخص شوند، مانند این مثال: "128 128 0" .PP به عنوان یک حالت ویژه، \fBansicolor("")\fR معادل \fBansicolor(-1,-1,-1)\fR است و دنباله ANSI برای بازنشانی تمام ویژگی‌های متنی به حالت عادی را برمی‌گرداند. .PP توجه داشته باشید که درج دنباله‌های رنگی ANSI در حالت تقویم \fIنتایج به‌هم‌ریخته‌ای تولید خواهد کرد\fR. بنابراین، توصیه می‌کنیم توابعی مانند موارد زیر تعریف کنید که در حالت تقویم رشته خالی برمی‌گردانند: .PP .nf IF $CalMode FSET fg(r,g,b) "" FSET bg(r,g,b) "" ELSE FSET fg(r,g,b) ansicolor(r,g,b) FSET bg(r,g,b) ansicolor(r,g,b,1) ENDIF REM [fg(255,0,0)][bg(64,64,64)]Red on Gray[fg(-1,-1,-1)] in agenda mode REM SPECIAL COLOR 0 255 0 Green in agenda and calendar mode .fi .PP اگر از تابع \fBansicolor\fR استفاده می‌کنید، فراموش نکنید که رنگ را با \fBansicolor(-1,-1,-1)\fR به حالت عادی بازنشانی کنید؛ در غیر این صورت یادآورهای بعدی همچنان رنگی باقی خواهند ماند. .RE .TP .B args(s_fname) تعداد آرگومان‌های مورد انتظار تابع تعریف‌شده توسط کاربر \fIfname\fR را برمی‌گرداند، یا در صورتی که چنین تابع کاربری وجود نداشته باشد، مقدار \-1 را بازمی‌گرداند. توجه داشته باشید که این تابع تنها توابع تعریف‌شده توسط کاربر را بررسی می‌کند، نه توابع داخلی را. کاربرد اصلی آن تعیین این است که آیا یک تابع کاربری خاص قبلاً تعریف شده است یا خیر. تابع \fBargs()\fR تنها در نسخه‌های 03.00.04 به بالای \fBRemind\fR در دسترس است. .TP .B asc(s_string) یک \fBINT\fR برمی‌گرداند که کد اسکی (ASCII) نخستین بایت در \fIstring\fR است. به عنوان یک حالت ویژه، \fBasc("")\fR مقدار 0 را برمی‌گرداند. برای رشته‌های UTF-8، این تابع بایت UTF-8 شروع‌کننده رشته را برمی‌گرداند که احتمالاً چندان مفید نخواهد بود. .TP .B codepoint(s_string) یک \fBINT\fR برمی‌گرداند که کد پوینت (code point) نخستین نویسه در \fIstring\fR است و با نویسه‌های چندبایتی به درستی رفتار می‌کند. به عنوان یک حالت ویژه، \fBcodepoint("")\fR مقدار 0 را برمی‌گرداند. .TP .B baseyr() «سال پایه» (base year) که در \fBRemind\fR کامپایل شده است را برمی‌گرداند (معمولاً 1990). تمامی تاریخ‌ها در داخل برنامه به صورت تعداد روزهای گذشته از ۱ ژانویه \fBbaseyr()\fR ذخیره می‌شوند. .TP .B catch(x_arg1, x_arg2) مقدار \fBarg1\fR را ارزیابی می‌کند و در صورتی که خطایی رخ ندهد، مقدار حاصل را برمی‌گرداند. اگر در حین ارزیابی \fBarg1\fR خطایی رخ دهد، \fBarg2\fR را ارزیابی کرده و بازمی‌گرداند. توجه داشته باشید که \fBcatch()\fR تنها خطاهای زمان اجرای \fIارزیابی\fR را می‌گیرد و قادر به گرفتن خطاهای \fIنحوی\fR نیست. .RS .PP چند مثال: .PP .nf catch(4/2, 33) => 2, because 4/2 evaluates without error catch(4/0, 33) => 33, because 4/0 gives a divide-by-zero error catch(2, 1/0) => 2, and the second argument is not evaluated catch(4/0, 1/0) results in a divide-by-zero error .fi .PP در آخرین مثال توجه کنید که catch از شما در برابر خطاهای موجود در ارزیابی \fBarg2\fR محافظت \fIنمی‌کند\fR. .RE .TP .B catcherr() رشته‌ای نمایانگر پیام خطای آخرین تابع \fBcatch()\fR ارزیابی‌شده که آرگومان اول آن منجر به خطا شده بود را برمی‌گرداند. توجه داشته باشید که پیام خطا همواره به زبان انگلیسی است حتی اگر \fBRemind\fR بومی‌سازی شده باشد؛ این ویژگی به شما امکان می‌دهد مقدار بازگشتی را به طور قابل اطمینان بیازمایید. چند مثال: .RS .PP .nf # No "catch" invocations yet: sets a to "Ok" set a catcherr() # Sets b to "oops" and a to "Division by zero" set b catch(1/0, "oops") set a catcherr() # Sets b to 1 and a to "Division by zero". The catch error # is never cleared by a non-error catch() set b catch(4-3, "not-evaluated") set a catcherr() .fi .RE .TP .B char(i_i1 [,i_i2...]) این تابع می‌تواند هر تعداد آرگومان از نوع \fBINT\fR بپذیرد. یک \fBSTRING\fR متشکل از بایت‌های مشخص‌شده توسط آرگومان‌ها را برمی‌گرداند. ایجاد دنباله‌های نامعتبر UTF-8 به آسانی ممکن است؛ \fBchar\fR این موضوع را بررسی نمی‌کند. توجه داشته باشید که هیچ‌یک از آرگومان‌ها نمی‌تواند 0 باشد، مگر اینکه فقط یک آرگومان وجود داشته باشد. به عنوان یک حالت ویژه، \fBchar(0)\fR مقدار "" را برمی‌گرداند. .TP .B mbchar(i_i1 [,i_i2...]) این تابع می‌تواند هر تعداد آرگومان از نوع \fBINT\fR بپذیرد. یک \fBSTRING\fR متشکل از نویسه‌های مشخص‌شده توسط آرگومان‌ها را برمی‌گرداند. هر کد پوینتی می‌تواند ارائه شود و رشته‌ای صحیح از نویسه‌های چندبایتی بازگردانده خواهد شد. توجه داشته باشید که هیچ‌یک از آرگومان‌ها نمی‌تواند 0 باشد، مگر اینکه فقط یک آرگومان وجود داشته باشد. به عنوان یک حالت ویژه، \fBmbchar(0)\fR مقدار "" را برمی‌گرداند. علاوه بر این، هیچ آرگومانی نمی‌تواند عدد منفی باشد. .TP .B choose(i_index, x_arg1 [,x_arg2...]) دستور \fBchoose\fR باید دست‌کم دو آرگومان بپذیرد که نخستین آرگومان یک \fBINT\fR است. اگر \fIindex\fR برابر \fIn\fR باشد، آنگاه \fIn\fR-اُمین آرگومان بعدی بازگردانده می‌شود. اگر \fIindex\fR کمتر از 1 باشد، \fIarg1\fR برگردانده می‌شود. اگر \fIindex\fR بزرگ‌تر از تعداد آرگومان‌های بعدی باشد، آخرین آرگومان بازگردانده خواهد شد. مثال‌ها: .PP .nf \fBchoose(0, "foo", 1:13, 1000)\fR returns "foo" \fBchoose(1, "foo", 1:13, 1000)\fR returns "foo" \fBchoose(2, "foo", 1:13, 1000)\fR returns 1:13 \fBchoose(3, "foo", 1:13, 1000)\fR returns 1000 \fBchoose(4, "foo", 1:13, 1000)\fR returns 1000 .fi .RS .PP توجه داشته باشید که تنها آرگومان نخست و نتیجه انتخاب‌شده ارزیابی می‌شوند. هر آرگومانی که انتخاب نشود ارزیابی نخواهد شد. .RE .TP .B coerce(s_type, x_arg) این تابع در صورت امکان، \fIarg\fR را به نوع \fItype\fR مشخص‌شده تبدیل می‌کند. \fIType\fR باید یکی از موارد "INT"، "STRING"، "DATE"، "TIME" یا "DATETIME" باشد (بدون حساسیت به بزرگی و کوچکی حروف). قوانین تبدیل به شرح زیر است: .RS .PP اگر \fIarg\fR از پیش از نوع \fItype\fR مشخص‌شده باشد، بدون تغییر بازگردانده می‌شود. .PP اگر \fItype\fR برابر "STRING" باشد، آنگاه \fIarg\fR به رشته‌ای متشکل از نمایش چاپی آن تبدیل می‌شود. .PP اگر \fItype\fR برابر "DATE" باشد، آنگاه آرگومان \fIarg\fR از نوع \fBINT\fR با تفسیر آن به عنوان تعداد روزهای گذشته از ۱ ژانویه \fBbaseyr()\fR تبدیل می‌شود. آرگومان \fIarg\fR از نوع \fBSTRING\fR با تلاش برای خواندن آن به عنوان یک تاریخ چاپی تبدیل می‌گردد. یک \fBDATETIME\fR با حذف مؤلفه زمان به تاریخ تبدیل می‌شود. یک آرگومان \fIarg\fR از نوع \fBTIME\fR نمی‌تواند به تاریخ تبدیل شود. .PP اگر \fItype\fR برابر "TIME" باشد، آنگاه آرگومان \fIarg\fR از نوع \fBINT\fR با تفسیر آن به عنوان تعداد دقایق گذشته از نیمه‌شب تبدیل می‌شود. آرگومان \fIarg\fR از نوع \fBSTRING\fR با تلاش برای خواندن آن به عنوان یک زمان چاپی تبدیل می‌شود. یک \fBDATETIME\fR با حذف مؤلفه تاریخ به زمان تبدیل می‌شود. یک آرگومان \fIarg\fR از نوع \fBDATE\fR نمی‌تواند به زمان تبدیل شود. .PP اگر \fItype\fR برابر "DATETIME" باشد، آنگاه آرگومان \fIarg\fR از نوع \fBINT\fR با تفسیر آن به عنوان تعداد دقایق گذشته از نیمه‌شب ۱ ژانویه \fBbaseyr()\fR تبدیل می‌شود. یک \fBSTRING\fR با تلاش برای خواندن آن به عنوان یک تاریخ و زمان چاپی تبدیل می‌شود. سایر انواع داده نمی‌توانند به تاریخ و زمان تبدیل شوند. .PP اگر \fItype\fR برابر "INT" باشد، آنگاه آرگومان‌های \fBDATE\fR، \fBTIME\fR و \fBDATETIME\fR با استفاده از عکس رویه‌های شرح‌داده‌شده در بالا تبدیل می‌شوند. آرگومان \fIarg\fR از نوع \fBSTRING\fR با تجزیه آن به عنوان یک عدد صحیح تبدیل می‌گردد. .RE .TP .B columns([s_arg]) اگر بدون آرگومان فراخوانی شود، \fBcolumns()\fR به صورت زیر عمل می‌کند: اگر خروجی استاندارد یا خطای استاندارد یک TTY باشد، عرض ترمینال را بر حسب ستون بازمی‌گرداند. اگر هیچ‌کدام از خروجی استاندارد یا خطای استاندارد TTY نباشند، برای دریافت اندازه ترمینال تلاش می‌کند "/dev/tty" را باز کند. اگر این کار با شکست مواجه شود، مقدار \-1 را برمی‌گرداند. .RS .PP اگر با یک آرگومان رشته‌ای فراخوانی شود، \fBcolumns(str)\fR تعداد ستون‌هایی را که \fBstr\fR در صورت چاپ در ترمینال اشغال می‌کند بازمی‌گرداند. دنباله‌های تغییر رنگ ANSI صفر ستون اشغال می‌کنند در حالی که برخی نویسه‌های یونیکد دو ستون را اشغال می‌کنند. \fBcolumns(str)\fR همه این موارد را لحاظ می‌کند. توجه داشته باشید که اگر \fBRemind\fR بدون پشتیبانی از یونیکد کامپایل شده باشد، \fBcolumns(str)\fR خطای عدم تطابق نوع بازمی‌گرداند. .PP نتیجه \fBcolumns(str)\fR ممکن است کمتر، مساوی یا بیشتر از نتیجه \fBmbstrlen(str)\fR باشد. این بدان علت است که برخی نویسه‌های یونیکد به اصطلاح نویسه‌های ترکیبی (combining characters) هستند که یک واحد به طول نویسه‌ها می‌افزایند، اما خودشان هیچ ستونی را اشغال نمی‌کنند. و برخی دیگر از نویسه‌های یونیکد نویسه‌های با عرض دوگانه (double-width) هستند که یک واحد به طول نویسه‌ها اضافه می‌کنند، اما دو ستون نمایش را اشغال می‌نمایند. .RE .TP .B const(x_arg) مقدار \fIarg\fR را ارزیابی کرده و بازمی‌گرداند، اما همچنین اطمینان حاصل می‌کند که نتیجه به عنوان "ثابت" (constant) علامت‌گذاری شود. با احتیاط استفاده کنید؛ استفاده نادرست ممکن است منجر به پاکسازی یادآورهای ناخواسته در حالت پاکسازی (Purge Mode) شود. همچنین بخش «عبارت‌های غیرثابت (NON-CONSTANT EXPRESSIONS)» را ببینید. .TP .B current() تاریخ و زمان جاری را به عنوان یک شیء DATETIME برمی‌گرداند. این مقدار ممکن است تاریخ و زمان واقعی باشد، یا تاریخ و زمانی باشد که در خط فرمان تعیین شده است. .TP .B date(i_y, si_m, i_d) تابع \fBdate()\fR یک شیء \fBDATE\fR شامل مؤلفه‌های سال، ماه و روز مشخص‌شده توسط \fIy\fR، \fIm\fR و \fId\fR را برمی‌گرداند. ماه می‌تواند به صورت یک عدد صحیح از 1 تا 12 یا رشته‌ای شامل نام ماه مشخص شود. .TP .B datepart(dq_datetime) یک شیء \fBDATE\fR برمی‌گرداند که نمایانگر بخش تاریخ \fIdatetime\fR است. .TP .B datetime(args) تابع \fBdatetime()\fR می‌تواند از دو تا پنج آرگومان بپذیرد. همواره یک DATETIME تولیدشده از آرگومان‌های خود را برمی‌گرداند. .RS .PP اگر دو آرگومان بدهید، اولی باید یک DATE و دومی یک TIME باشد. .PP اگر سه آرگومان بدهید، اولی باید یک DATE و دومی و سومی باید INT باشند. آرگومان‌های دوم و سوم به عنوان ساعت و دقیقه تفسیر شده و به یک TIME تبدیل می‌شوند. .PP اگر چهار آرگومان بدهید، به عنوان سال، ماه، روز و زمان تفسیر می‌شوند. سال و روز باید INT باشند. ماه می‌تواند یک INT از 0 تا 12 یا رشته‌ای شامل نام ماه باشد. زمان باید یک TIME باشد. .PP در نهایت، اگر پنج آرگومان بدهید، همگی باید INT باشند و به عنوان سال، ماه، روز، ساعت و دقیقه تفسیر می‌شوند. (در واقع، ماه می‌تواند رشته‌ای شامل نام ماه نیز باشد.) .RE .TP .B dawn([dq_date]) زمان «سپیده‌دم شهری» (civil dawn) را در \fIdate\fR مشخص‌شده برمی‌گرداند. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. اگر یک شیء \fIdatetime\fR داده شود، تنها مؤلفه تاریخ آن استفاده می‌شود. .TP .B day(dq_date) این تابع یک \fBDATE\fR یا \fBDATETIME\fR را به عنوان آرگومان می‌پذیرد و یک \fBINT\fR که مؤلفه روز از ماهِ \fIdate\fR است را برمی‌گرداند. .TP .B daysinmon(si_m, i_y)\fR or \fB daysinmon(dq_date)\fR تعداد روزهای موجود در ماه \fIm\fR (1-12) از سال \fIy\fR را برمی‌گرداند. آرگومان نخست می‌تواند یک عدد صحیح از 1 تا 12 یا رشته‌ای شامل نام ماه باشد. اگر یک آرگومان منفرد DATE یا DATETIME داده شود، تعداد روزهای ماهی را که شامل آن آرگومان است برمی‌گرداند. .TP .B defined(s_var) اگر متغیر با نام \fIvar\fR تعریف شده باشد مقدار 1 و در غیر این صورت مقدار 0 را برمی‌گرداند. .RS توجه داشته باشید که \fBdefined()\fR آرگومانی از نوع \fBSTRING\fR می‌پذیرد؛ بنابراین برای بررسی اینکه آیا متغیر X تعریف شده است یا خیر، از دستور زیر استفاده کنید: .PP .nf defined("X") .fi .PP و نه: .PP .nf defined(X) .fi .PP مثال دوم برای ارزیابی X تلاش خواهد کرد و در صورتی که تعریف نشده باشد یا از نوع \fBSTRING\fR نباشد، خطایی بازمی‌گرداند. .RE .TP .B dosubst(s_str [,d_date [,t_time]]) \fRor\fB dosubst(s_str [,q_datetime]) یک \fBSTRING\fR برمی‌گرداند که حاصل عبور دادن \fIstr\fR از فیلتر جایگزینی شرح داده شده در بخش‌های پیشین است. پارامترهای \fIdate\fR و \fItime\fR (یا \fIdatetime\fR) تاریخ و زمان راه‌انداز مؤثری را تعیین می‌کنند که توسط فیلتر جایگزینی استفاده می‌شود. اگر \fIdate\fR و \fItime\fR حذف شوند، مقادیر پیش‌فرض آن‌ها \fBtoday()\fR و \fBnow()\fR خواهد بود. .RS .PP توجه داشته باشید که اگر \fIstr\fR با "%" پایان نیابد، یک نویسه خط جدید به انتهای نتیجه اضافه خواهد شد. همچنین، فراخوانی \fBdosubst()\fR با یک \fIdate\fR در گذشته (یعنی اگر \fIdate\fR < \fBtoday()\fR باشد)، نتایج تعریف‌نشده‌ای تولید خواهد کرد. .PP تابع \fBdosubst()\fR تنها از نسخه 03.00.04 به بعد \fBRemind\fR در دسترس است. .RE .TP .B dusk([dq_date]) زمان «گرگ‌ومیش شهری» (civil twilight) را در \fIdate\fR مشخص‌شده برمی‌گرداند. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. .TP .B easterdate([dqi_arg]) اگر \fIarg\fR یک \fBINT\fR باشد، تاریخ یکشنبه عید پاک را برای سال مشخص‌شده برمی‌گرداند. اگر \fIarg\fR یک \fBDATE\fR یا \fBDATETIME\fR باشد، تاریخ یکشنبه عید پاک بعدی در تاریخ یا پس از \fIarg\fR را برمی‌گرداند. (مؤلفه زمان شیء datetime نادیده گرفته می‌شود.) اگر \fIarg\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. .RS .PP توجه داشته باشید که \fBeasterdate\fR عید پاک غربی را محاسبه می‌کند. برای تاریخ عید پاک ارتدکس، \fBorthodoxeaster\fR را ببینید. .RE .TP .B escape(s_string [,i_add_quotes]) یک \fBSTRING\fR برمی‌گرداند که همان رشته ورودی است، اما تمام نویسه‌های ویژه با بک‌اسلش اسکیپ شده‌اند. برای نمونه، دستور زیر: .RS .PP .nf set a escape("foo" + char(10) + "bar") .fi .PP مقدار a را برابر "foo\enbar" قرار می‌دهد که در آن "\en" دنباله دقیق "\\" و به دنبال آن "n" است. این ویژگی زمانی مفید است که بخواهید در یک عبارت الصاقی رشته‌ای را محاسبه کنید که \fBRemind\fR سپس آن را دوباره به عنوان یک رشته درون علامت نقل‌قول تجزیه کند، مانند یک دستور TRANSLATE یا یک بند INFO. .PP اگر آرگومان اختیاری \fIadd_quotes\fR داده شود و غیر صفر باشد، مقدار بازگشتی از \fBescape\fR شامل علامت‌های نقل‌قول دوتایی در دو طرف آن خواهد بود. .RE .TP .B eval(s_arg) رشته \fIarg\fR را به عنوان یک عبارت تجزیه و ارزیابی کرده و نتیجه را برمی‌گرداند. توجه داشته باشید که هر نام متغیری در عبارت تجزیه‌شده به متغیرهای سراسری اشاره دارد، نه به متغیرهای محلی. برای نمونه، این مورد را در نظر بگیرید: .PP .RS .nf SET x 2 FSET f(x) x + eval("1 + x") REM MSG F is [f(9)] .fi .PP نتیجه "F is 12" خواهد بود زیرا ارجاع به \fIx\fR درون آرگومان \fBeval()\fR به متغیر \fIسراسری\fR \fIx\fR اشاره دارد و نه به آرگومان تابع. .PP توجه داشته باشید که برای امنیت، \fBRUN\fR در حین ارزیابی \fBeval()\fR غیرفعال است، که یعنی نمی‌توانید از داخل یک \fBeval()\fR از تابع \fBshell()\fR استفاده کنید. .PP .RE .TP .B evaltrig(s_trigger [,dq_start]) عبارت \fItrigger\fR را مانند یک مشخصه راه‌انداز در REM یا IFTRIG ارزیابی کرده و تاریخ راه‌انداز را به صورت یک \fBDATE\fR (یا در صورت وجود بند \fBAT\fR به صورت یک \fBDATETIME\fR) برمی‌گرداند. اگر هیچ راه‌اندازی قابل محاسبه نباشد، یک \fBINT\fR منفی بازمی‌گرداند. .RS .PP به طور معمول، \fBevaltrig\fR تاریخ راه‌انداز را در امروز یا پس از آن می‌یابد. اگر آرگومان \fIstart\fR را بدهید، پویش از آن تاریخ شروع می‌شود. .PP برای نمونه، عبارت: .PP .nf evaltrig("Mon 1", '2008-10-07') .fi .PP مقدار '2008-11-03' را برمی‌گرداند، چرا که این تاریخ نخستین روز در تاریخ یا بعد از ۷ اکتبر ۲۰۰۸ است که شرط "Mon 1" را برآورده می‌کند. .PP اگر می‌خواهید بدانید از نخستین دوشنبه اکتبر ۲۰۰۸ تا نخستین دوشنبه نوامبر ۲۰۰۸ چند روز فاصله است، از دستور زیر استفاده کنید: .PP .nf evaltrig("Mon 1", '2008-11-01') - evaltrig("Mon 1", '2008-10-01') .fi .PP و پاسخ ۲۸ است. آرگومان راه‌انداز به \fBevaltrig\fR می‌تواند شامل تمامی بندهای معمول راه‌انداز (مانند \fBOMIT\fR، \fBAT\fR، \fBSKIP\fR و غیره) باشد اما \fIنمی‌تواند\fR حاوی بندهای نوع یادآور مانند \fBSATISFY\fR، \fBMSG\fR و غیره باشد. .RE .TP .B filedate(s_filename) تاریخ تغییر فایل \fIfilename\fR را برمی‌گرداند. اگر \fIfilename\fR وجود نداشته باشد، یا تاریخ تغییر آن قبل از سال \fBbaseyr()\fR باشد، ۱ ژانویه \fBbaseyr()\fR بازگردانده می‌شود. .TP .B filedatetime(s_filename) تاریخ و زمان تغییر فایل \fIfilename\fR را برمی‌گرداند. اگر \fIfilename\fR وجود نداشته باشد، یا تاریخ تغییر آن قبل از سال \fBbaseyr()\fR باشد، نیمه‌شب ۱ ژانویه \fBbaseyr()\fR بازگردانده می‌شود. .TP .B filedir() دایرکتوری حاوی فایل جاری در حال پردازش را برمی‌گرداند. این مسیر ممکن است نسبی یا مطلق باشد، اما تضمین می‌شود که برای استفاده در دستور \fBINCLUDE\fR به شرح زیر صحیح باشد: .PP .nf INCLUDE [filedir()]/stuff .fi .PP .RS این دستور فایل "stuff" را در همان دایرکتوری فایل جاری در حال پردازش درج می‌کند. توجه داشته باشید که این راهکار دیگر ضروری نیست زیرا \fBDO stuff\fR به همان هدف دست می‌یابد. .PP توجه داشته باشید که اگر فایل یادآورهای در حال پردازش کنونی به صورت یک پیوند نمادین مشخص شده باشد، \fBfiledir()\fR دایرکتوری حاوی پیوند نمادین را بازمی‌گرداند و \fIنه\fR دایرکتوری حاوی هدف پیوند نمادین را. باید از به‌کارگیری پیوندهای نمادین به فایل‌ها خودداری کنید مگر آنکه هم پیوند نمادین و هم هدف آن اتفاقاً در یک دایرکتوری قرار داشته باشند. .RE .TP .B filename() نام فایل جاری در حال پردازش توسط \fBRemind\fR را (به عنوان یک \fBSTRING\fR) برمی‌گرداند. درون فایل‌های گنجانده‌شده، نام فایل گنجانده‌شده را بازمی‌گرداند. .TP .B getenv(s_envvar) مشابه با فراخوانی سیستمی \fBgetenv\fR(2). رشته‌ای نمایانگر مقدار متغیر محیطی مشخص‌شده را برمی‌گرداند. اگر متغیر محیطی تعریف نشده باشد مقدار "" را بازمی‌گرداند. توجه داشته باشید که نام متغیرهای محیطی معمولاً به بزرگی و کوچکی حروف حساس هستند؛ بنابراین getenv("HOME") با getenv("home") یکسان نیست. .TP .B hebdate(i_day, s_hebmon [,idq_yrstart [,i_jahr [,i_aflag]]]) پشتیبانی از تاریخ‌های عبری \- بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید. .TP .B hebday(dq_date) پشتیبانی از تاریخ‌های عبری \- بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید. .TP .B hebmon(dq_date) پشتیبانی از تاریخ‌های عبری \- بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید. .TP .B hebyear(dq_date) پشتیبانی از تاریخ‌های عبری \- بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید. .TP .B hex(i_n) یک \fBSTRING\fR برمی‌گرداند که نمایش هگزادسیمال \fIn\fR است. هیچ پیشوند "0x" وجود ندارد و تمام حروف در مقدار بازگشتی بزرگ هستند. .TP .B hour(tq_time) مؤلفه ساعتِ \fItime\fR را برمی‌گرداند. .TP .B htmlescape(s_str) یک نسخه اصلاح‌شده از \fIstr\fR را برمی‌گرداند که در آن "<" با "<"، ">" با ">" و "&" با "&" جایگزین شده است. .TP .B htmlstriptags(s_str) یک نسخه اصلاح‌شده از \fIstr\fR را برمی‌گرداند که در آن برچسب‌های HTML حذف شده‌اند. الگوریتم حذف نسبتاً ساده است؛ این تابع هنگام مواجهه با "<" شروع به حذف نویسه‌ها می‌کند و هنگام مواجهه با ">" حذف را متوقف می‌سازد. .TP .B iif(x_test1, x_arg1, [x_test2, x_arg2,...], x_default) اگر \fItest1\fR درست (true) باشد، \fIarg1\fR را برمی‌گرداند. در غیر این صورت، اگر \fItest2\fR درست باشد، \fIarg2\fR را برمی‌گرداند و به همین ترتیب. اگر تمامی آرگومان‌های \fItest\fR نادرست (false) باشند، \fIdefault\fR را برمی‌گرداند. توجه داشته باشید که تنها آرگومان‌هایی ارزیابی می‌شوند که برای تعیین نتیجه نهایی مورد نیازند. این تابع تعداد فردی از آرگومان‌ها را می‌پذیرد \- توجه داشته باشید که پیش از نسخه 03.00.05 برنامه \fBRemind\fR، تنها ۳ آرگومان می‌پذیرفت. نسخه ۳ آرگومانی \fBiif()\fR با نسخه‌های قبلی \fBRemind\fR سازگار است. .TP .B index(s_search, s_target [,i_start) یک \fBINT\fR برمی‌گرداند که موقعیت \fItarget\fR در رشته \fIsearch\fR است. توجه داشته باشید که \fBindex\fR از موقعیت‌های \fIبایت\fR استفاده می‌کند نه موقعیت‌های نویسه، بنابراین نباید برای رشته‌های غیر اسکی (non-ASCII) استفاده شود. برای رشته‌های غیر اسکی از \fBmbindex\fR استفاده کنید. .RS .PP اولین بایت یک رشته از 1 شماره‌گذاری می‌شود. اگر \fItarget\fR در \fIsearch\fR وجود نداشته باشد، مقدار 0 بازگردانده می‌شود. .PP پارامتر اختیاری \fIstart\fR موقعیتی در \fIsearch\fR را مشخص می‌کند که جستجو برای \fItarget\fR باید از آنجا آغاز شود. .RE .TP .B mbindex(s_search, s_target [,i_start]) مشابه با \fBindex()\fR است اما به جای موقعیت \fIبایت\fR، موقعیت \fIنویسه\fR را برمی‌گرداند. همچنین، \fIstart\fR به عنوان نمایه نویسه‌ای بر پایه 1 تفسیر می‌شود، نه نمایه بایتی. .TP .B isany(arg1 [,arg2, ..., argN]); اگر نخستین آرگومان \fIarg1\fR با هر یک از آرگومان‌های بعدی \fIarg2\fR تا \fIargN\fR برابر باشد، مقدار 1 و در غیر این صورت مقدار 0 را برمی‌گرداند. همچنین اگر تنها با یک آرگومان فراخوانی شود مقدار 0 بازمی‌گرداند. .RS .PP به عنوان مثال، دو عبارت زیر معادل یکدیگرند: .PP .nf (a == b) || (a == c) || (a == d) || (a == e) isany(a, b, c, d, e) .fi .RE .TP .B isconst(x_any) آرگومان خود را ارزیابی کرده و سپس مقدار آن را \fIدور می‌اندازد\fR؛ در صورتی که عبارت ثابت باشد مقدار 1 و در صورت غیرثابت بودن مقدار 0 را برمی‌گرداند. توجه داشته باشید که \fBisconst\fR بافتار را در نظر نمی‌گیرد؛ اگر \fIarg\fR یک عبارت ثابت باشد اما در بافتاری غیرثابت ارزیابی شود، \fBisconst\fR همچنان 1 را برمی‌گرداند. برای جزئیات در مورد عبارت‌های ثابت در برابر غیرثابت، بخش «عبارت‌های غیرثابت (NON-CONSTANT EXPRESSIONS)» را ببینید. .TP .B isdst([d_date [,t_time]]) \fRor\fB isdst(q_datetime) اگر در تاریخ و زمان مشخص‌شده ساعت تابستانی در حال اجرا باشد، یک عدد مثبت بازمی‌گرداند. مقدار پیش‌فرض \fIdate\fR برابر \fBtoday()\fR و مقدار پیش‌فرض \fItime\fR برابر نیمه‌شب است. .RS .PP توجه داشته باشید که قابلیت اطمینان این تابع تنها به اندازه توابع کتابخانه زمان اجرای C است. این تابع از نسخه 03.00.07 برنامه \fBRemind\fR در دسترس است. .RE .TP .B isleap(idq_arg) اگر \fIarg\fR یک سال کبیسه باشد مقدار 1 و در غیر این صورت مقدار 0 را برمی‌گرداند. \fIArg\fR می‌تواند یک شیء \fBINT\fR، \fBDATE\fR یا \fBDATETIME\fR باشد. اگر یک \fBDATE\fR یا \fBDATETIME\fR داده شود، مؤلفه سال در این آزمون به کار می‌رود. .TP .B isomitted(dq_date) اگر با توجه به بافتار سراسری \fBOMIT\fR، تاریخ \fIdate\fR نادیده‌گرفته‌شده (omitted) باشد مقدار 1 و در غیر این صورت مقدار 0 را برمی‌گرداند. (اگر یک datetime داده شود، تنها بخش تاریخ استفاده می‌شود.) توجه داشته باشید که هیچ‌یک از بندهای محلی \fBOMIT\fR یا \fBOMITFUNC\fR توسط این تابع در نظر گرفته \fIنمی‌شوند\fR. .TP .B language() یک \fBSTRING\fR شامل نام زبان کامپایل‌شده پشتیبانی‌شده توسط \fBRemind\fR را برمی‌گرداند. در گذشته \fBRemind\fR از پشتیبانی کامپایل‌شده برای سایر زبان‌ها برخوردار بود، اما اکنون تمام بومی‌سازی‌ها در زمان اجرا انجام می‌شود. از این رو، این تابع همواره "English" را برمی‌گرداند. با این حال، عبارت \fB_("LANGID")\fR کد زبان دوحرفی ISO 639 هر بسته زبان فعال را برمی‌گرداند، به شرطی که نگارنده بسته زبان، بومی‌سازی را به درستی نوشته باشد! .TP .B localtoutc(q_datetime) با دریافت یک شیء \fBDATETIME\fR که در منطقه زمانی محلی تفسیر شده است، یک شیء \fBDATETIME\fR برمی‌گرداند که همان زمان را در ساعت هماهنگ جهانی (UTC) بیان می‌کند. .TP .B lower(s_string) یک \fBSTRING\fR برمی‌گرداند که در آن تمام بایت‌های حروف بزرگ در \fIstring\fR به حروف کوچک تبدیل شده‌اند. \fBنکته:\fR این تابع تنها برای رشته‌های اسکی (ASCII) به درستی کار می‌کند. اگر از نویسه‌های یونیکد خارج از مجموعه اسکی استفاده می‌کنید، به جای آن از \fBmblower\fR استفاده کنید. .TP .B mblower(s_string) یک \fBSTRING\fR برمی‌گرداند که در آن تمامی نویسه‌های حروف بزرگ در \fIstring\fR به حروف کوچک تبدیل شده‌اند. این تابع روی هر رشته یونیکدی به درستی عمل می‌کند. .TP .B max(x_arg1 [,x_arg2...) می‌تواند هر تعداد آرگومان بپذیرد و بیشینه آن‌ها را برمی‌گرداند. آرگومان‌ها می‌توانند از هر نوعی باشند، اما همگی باید هم‌نوع باشند. آن‌ها همانند عملگر < مقایسه می‌شوند. .TP .B min(x_arg1 [,x_arg2...) می‌تواند هر تعداد آرگومان بپذیرد و کمینه آن‌ها را برمی‌گرداند. آرگومان‌ها می‌توانند از هر نوعی باشند، اما همگی باید هم‌نوع باشند. آن‌ها همانند عملگر < مقایسه می‌شوند. .TP .B minsfromutc([d_date [,t_time]]) \fRor\fB minsfromutc(q_datetime) تعداد دقایق از ساعت هماهنگ جهانی (سابقاً GMT) تا زمان محلی را در تاریخ و زمان مشخص‌شده برمی‌گرداند. مقدار پیش‌فرض \fIdate\fR برابر \fBtoday()\fR و مقدار پیش‌فرض \fItime\fR برابر نیمه‌شب است. اگر زمان محلی قبل از UTC باشد، نتیجه منفی است. در غیر این صورت، نتیجه مثبت خواهد بود. .RS .PP توجه داشته باشید که قابلیت اطمینان این تابع تنها به اندازه توابع کتابخانه زمان اجرای C است. این تابع از نسخه 03.00.07 برنامه \fBRemind\fR در دسترس است. .RE .TP .B minute(tq_time) مؤلفه دقیقهِ \fItime\fR را برمی‌گرداند. .TP .B mon(dqis_arg) اگر \fIarg\fR از نوع \fBDATE\fR یا \fBDATETIME\fR باشد، رشته‌ای شامل نام مؤلفه ماه از آن تاریخ را برمی‌گرداند. اگر \fIarg\fR یک \fBINT\fR از 1 تا 12 باشد، رشته‌ای شامل نام ماه را برمی‌گرداند. اگر \fIarg\fR یک \fBSTRING\fR باشد، نام ماه را برمی‌گرداند. این حالت آخر ممکن است عجیب به نظر برسد، اما برای نمونه: .RS .PP .nf mon("Mar") .fi .PP مقدار "March"، یعنی نام کامل ماه را بازمی‌گرداند. .RE .TP .B monnum(dq_date)\fR or \fBmonnum(s_str)\fR یک \fBINT\fR از 1 تا 12 برمی‌گرداند که نمایانگر مؤلفه ماه از \fIdate\fR است. اگر به جای \fBDATE\fR یا \fBDATETIME\fR یک \fBSTRING\fR داده شود، در صورتی که \fIstr\fR نام معتبری برای ماه باشد (یا مخفف حداقل ۳ حرفی از نام یک ماه باشد) شماره ماه متناظر بازگردانده می‌شود. اگر \fIstr\fR نام معتبری برای ماه نباشد، خطایی رخ می‌دهد. .TP .B moondate(i_phase [,d_date [,t_time]]) \fRor\fB moondate(i_phase, q_datetime) این تابع تاریخ نخستین وقوع فاز \fIphase\fR ماه را در تاریخ و زمان \fIdate\fR و \fItime\fR یا پس از آن برمی‌گرداند. \fIPhase\fR می‌تواند از 0 تا 3 باشد، که 0 نشان‌دهنده ماه نو، 1 تربیع اول، 2 ماه کامل (بدر) و 3 تربیع سوم است. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. اگر \fItime\fR حذف شود، مقدار پیش‌فرض نیمه‌شب است. .RS .PP برای نمونه، دستور زیر تاریخ ماه کامل بعدی را برمی‌گرداند: .PP .nf SET fullmoon moondate(2) .fi .PP .RE .TP .B moontime(i_phase [,d_date [,t_time]]) \fRor\fB moontime(i_phase, q_datetime) این تابع زمان نخستین وقوع فاز \fIphase\fR ماه را در تاریخ و زمان \fIdate\fR و \fItime\fR یا پس از آن برمی‌گرداند. \fIPhase\fR می‌تواند از 0 تا 3 باشد، که 0 نشان‌دهنده ماه نو، 1 تربیع اول، 2 ماه کامل و 3 تربیع سوم است. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. اگر \fItime\fR حذف شود، مقدار پیش‌فرض نیمه‌شب است. \fBMoontime()\fR برای استفاده همراه با \fBmoondate()\fR در نظر گرفته شده است. توابع \fBmoondate()\fR و \fBmoontime()\fR با دقت چند دقیقه نسبت به زمان‌های موجود در "Old Farmer's Almanac" برای اتاوا در انتاریو مطابقت دارند. .RS .PP برای نمونه، دستور زیر تاریخ و زمان ماه کامل بعدی را برمی‌گرداند: .PP .nf MSG Next full moon at [moontime(2)] on [moondate(2)] .fi .PP .RE .TP .B moondatetime(i_phase [,d_date [,t_time]]) \fRor\fB moondatetime(i_phase, q_datetime) این تابع مشابه \fBmoondate\fR و \fBmoontime\fR است، اما یک نتیجه از نوع DATETIME برمی‌گرداند. .TP .B moonphase([d_date [,t_time]]) \fRor\fB moonphase(q_datetime) این تابع فاز ماه را در \fIdate\fR و \fItime\fR برمی‌گرداند که مقادیر پیش‌فرض آن‌ها به ترتیب \fBtoday()\fR و نیمه‌شب است. مقدار بازگردانده‌شده عددی صحیح از 0 تا 359 است که فاز ماه را بر حسب درجه نشان می‌دهد. مقدار 0 ماه نو، 180 ماه کامل، 90 تربیع اول و غیره است. .TP .B moonrise([d_date]) این تابع یک نتیجه DATETIME ارائه می‌دهد که تاریخ و زمان نخستین طلوع ماه در نیمه‌شب \fIdate\fR یا پس از آن را مشخص می‌کند. اگر \fIdate\fR داده نشود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. .RS .PP توجه داشته باشید که غیرمعمول نیست در یک روز هیچ طلوع ماهی رخ ندهد، بنابراین بخش تاریخ مقدار بازگشتی ممکن است با آرگومان \fIdate\fR یکسان نباشد. پس اگر تقویمی از زمان‌های طلوع ماه می‌خواهید، می‌توانید از چیزی مانند این استفاده کنید: .PP .nf SET mr moonrise() IF datepart(mr) == today() REM NOQUEUE [mr] MSG Moon rises at %3. ELSE REM MSG No moonrise today ENDIF .fi .PP .RE .TP .B moonrisedir([d_date]) این تابع یک نتیجه از نوع INT برمی‌گرداند که جهتی را مشخص می‌کند که ماه در نخستین طلوع خود در نیمه‌شب \fIdate\fR یا پس از آن، از آنجا طلوع خواهد کرد. اگر \fIdate\fR داده نشود، مقدار پیش‌فرض \fBtoday()\fR خواهد بود. مقدار بازگشتی در بازه 0 تا 359 است که در آن 0 شمال، 90 شرق، 180 جنوب و 270 غرب می‌باشد. .TP .B moonset([d_date]) این تابع مشابه \fBmoonrise()\fR است اما مقدار DATETIME غروب ماه بعدی در نیمه‌شب \fIdate\fR یا پس از آن را برمی‌گرداند. .TP .B moonsetdir([d_date]) این تابع مشابه \fBmoonrisedir()\fR است اما جهت غروب ماه را برمی‌گرداند. .TP .B multitrig(s_trig1 [,s_trig2, [... s_trigN]]) تابع \fBmultitrig\fR مشابه با \fBevaltrig\fR هر رشته را به عنوان یک محرک ارزیابی می‌کند، و \fIنزدیک‌ترین\fR تاریخ محرکی را که در تاریخ \fBtoday()\fR یا پس از آن است، برمی‌گرداند. \fBmultitrig\fR مشابه با \fBtrig\fR است اما تفاوت‌های زیر را دارد: .RS .PP تابع \fBtrig\fR \fIنخستین\fR تاریخ محرکی را که امروز فعال می‌شد برمی‌گرداند، در حالی که \fBmultitrig\fR \fIنزدیک‌ترین\fR تاریخ محرک پس از امروز را، صرف‌نظر از اینکه آیا امروز فعال می‌شد یا خیر، برمی‌گرداند. .PP اگر هیچ محرکی قابل محاسبه نباشد که پس از \fBtoday()\fR باشد، \fBmultitrig\fR مقدار 1990-01-01 را برمی‌گرداند. .PP مثال‌های زیر را با این فرض که امروز یکشنبه، ۲۴ مارس ۲۰۲۴ است در نظر بگیرید: .PP .nf # Returns 1990-01-01 because neither would trigger today SET a trig("Mon", "Wed") # Returns 2024-03-25 because it's the earlier trigger date SET a multitrig("Mon", "Wed") # Returns 2024-03-27 because it's the first that would trigger today SET a trig("Wed +3", "Mon +3") # Returns 2024-03-25 because it's the earlier trigger date SET a multitrig("Wed +3", "Mon +3") # Returns 1990-01-01 because all triggers have expired SET a multitrig("2000", "2022", "1998", "2023") .fi .PP به‌طور کلی، \fBmultitrig\fR با الگوریتم \fBRemind\fR بهتر از \fBtrig\fR کار می‌کند و در بیشتر مواقع باید استفاده شود. به عنوان نمونه، این یادآور در پایان هر فصل سال صادر می‌شود: .PP .nf REM [multitrig("Mar 31", "Jun 30", "Sep 30", "Dec 31")] +7 MSG \ %"End of [ord($Tm/3)] quarter%" is %b. .fi .PP اگر آخرین روز کاری هر فصل را بخواهید، می‌توانید از ساختار زیر استفاده کنید: .PP .nf PUSH-OMIT-CONTEXT OMIT Sat Sun REM [multitrig("Mar ~1", "Jun ~1", "Sep ~1", "Dec ~1")] +7 MSG \ %"Last working day of [ord($Tm/3)] quarter%" is %b. POP-OMIT-CONTEXT .fi .PP توجه داشته باشید که برخلاف \fBevaltrig\fR، تابع \fBmultitrig\fR همیشه یک \fBDATE\fR برمی‌گرداند و هرگز \fBDATETIME\fR برنمی‌گرداند. گنجاندن یک بند \fBAT\fR در محرک ارائه‌شده به \fBmultitrig\fR منجر به خطا خواهد شد. .RE .TP .B ndawn([dq_date]) زمان «سپیده‌دم دریانوردی» (nautical dawn) را در \fIdate\fR مشخص‌شده برمی‌گرداند. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR است. اگر یک شیء \fIdatetime\fR ارائه شود، تنها بخش تاریخ آن استفاده می‌شود. .TP .B ndusk([dq_date]) زمان «غروب دریانوردی» (nautical twilight) را در \fIdate\fR مشخص‌شده برمی‌گرداند. اگر \fIdate\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR است. .TP .B nonomitted(dq_start, dq_end [, i_step] [,s_wkday...]) این تابع تعداد روزهای \fIحذف‌نشده\fR (non-omitted) میان \fIstart\fR و \fIend\fR را برمی‌گرداند. اگر \fIstart\fR حذف‌نشده باشد، شمارش می‌شود. \fIend\fR هرگز شمارش نمی‌شود. .RS .PP توجه داشته باشید که اگر \fIend\fR کمتر از \fIstart\fR باشد، آرگومان‌ها عملاً جابه‌جا می‌شوند، به طوری که شمارش همیشه از تاریخ قدیمی‌تر آغاز می‌شود. .PP اگر آرگومان سوم \fBnonomitted\fR یک \fBINT\fR باشد، باید بزرگتر از صفر باشد و به عنوان گام (\fIstep\fR) شمارش \fBnonomitted\fR در نظر گرفته می‌شود. برای نمونه عبارت زیر: .PP .nf nonomitted('2023-07-01', '2023-07-29', 7) .fi .PP تعداد شنبه‌های حذف‌نشده از 2023-07-01 تا (اما بدون احتساب) 2023-07-29 را برمی‌گرداند. (هر دو تاریخ 2023-07-01 و 2023-07-29 شنبه هستند.) .PP اگر هیچ آرگومان \fIstep\fR ارائه نشود، گام ۱ استفاده می‌شود. .PP علاوه بر استفاده از زمینه سراسری OMIT، می‌توانید آرگومان‌های بیشتری ارائه دهید که نام روزهای هفته برای حذف شدن هستند. با این حال، در یک دستور \fBREM\fR، هر بند محلی \fBOMITFUNC\fR توسط این تابع در نظر گرفته \fIنمی‌شود\fR. .PP برای نمونه، خط زیر متغیر a را برابر با ۱۱ قرار می‌دهد (با فرض نبود OMITهای سراسری): .PP .nf set a nonomitted('2007-08-01', '2007-08-16', "Sat", "Sun") .fi .PP زیرا پنج‌شنبه، ۱۶ اوت ۲۰۰۷، یازدهمین روز کاری (بدون احتساب شنبه و یکشنبه) پس از چهارشنبه، ۱ اوت ۲۰۰۷ است. .PP تابع \fBnonomitted\fR کاربردهای گوناگونی دارد. برای نمونه، بسیاری از مدارس بر پایه یک چرخه شش‌روزه فعالیت می‌کنند و شماره روز در روزهای تعطیل افزایش نمی‌یابد. فرض کنید سال تحصیلی با «روز ۱» در ۴ سپتامبر ۲۰۰۷ آغاز شود. یادآور زیر شماره روزها را در یک تقویم برچسب‌گذاری می‌کند: .PP .nf IF today() >= '2007-09-04' set daynum nonomitted('2007-09-04', today(), "Sat", "Sun") REM OMIT SAT SUN SKIP CAL Day [(daynum % 6) + 1] ENDIF .fi .PP بدیهی است نتیجه‌ای که از \fBnonomitted\fR دریافت می‌کنید به زمینه سراسری OMIT بستگی دارد. اگر از OMITهای متحرک استفاده کنید، ممکن است نتایج ناسازگاری به دست آورید. .PP در اینجا یک کاربرد پیچیده‌تر برای \fBnonomitted\fR آورده شده است. جمع‌آوری زباله محله من از دو چرخه ۱۴‌روزه متناوب پیروی می‌کند: یک جمعه، زباله و بازیافت کاغذ («جعبه سیاه» یا "Black Box") جمع‌آوری می‌شوند. جمعه بعدی، زباله و بازیافت پلاستیک («جعبه آبی» یا "Blue Box") جمع‌آوری می‌شوند. اگر هر یک از روزهای دوشنبه تا جمعه تعطیل باشد، جمع‌آوری تا روز شنبه به تعویق می‌افتد. روشی برای پیاده‌سازی این قواعد بدین صورت است: .PP .nf fset _garbhol(x) wkdaynum(x) == 5 && nonomitted(x-4, x+1) < 5 REM 12 November 1999 *14 AFTER OMITFUNC _garbhol MSG Black Box REM 19 November 1999 *14 AFTER OMITFUNC _garbhol MSG Blue Box .fi .PP نحوه کارکرد آن بدین شرح است: تابع تعریف‌شده توسط کاربر _garbhol(x) مقدار ۱ را تنها زمانی برمی‌گرداند که (۱) \fIx\fR جمعه باشد و (۲) دست‌کم یک روز OMITشده از دوشنبه پیشین تا و با احتساب جمعه وجود داشته باشد. .PP دستور نخست REM چرخه ۱۴‌روزه جعبه سیاه را تنظیم می‌کند. کلمه کلیدی AFTER باعث می‌شود در صورتی که _garbhol مقدار ۱ را برگرداند، جمع‌آوری به شنبه منتقل شود. دستور دوم REM چرخه ۱۴‌روزه جعبه آبی را با تعدیل مشابهی توسط AFTER در هماهنگی با _garbhol تنظیم می‌کند. .RE .TP .B nonconst(x_arg) آرگومان \fIarg\fR را بدون تغییر برمی‌گرداند، اما عبارت را وادار می‌کند تا به عنوان \fIغیرثابت\fR (non-constant) تلقی شود. برای جزئیات، بخش "NON-CONSTANT EXPRESSIONS" را ببینید. .TP .B now() زمان فعلی سیستم را به صورت نوع \fBTIME\fR برمی‌گرداند. این مقدار ممکن است زمان واقعی باشد، یا زمانی که در خط فرمان تعیین شده است. توجه داشته باشید که در حالت تقویم (Calendar Mode)، تابع \fBnow()\fR همیشه مقدار 00:00 را برمی‌گرداند. .TP .B ord(i_num) رشته‌ای را برمی‌گرداند که عدد ترتیبیِ \fInum\fR است. برای نمونه، \fBord(2)\fR مقدار "2nd" و \fBord(213)\fR مقدار "213th" را برمی‌گرداند. .RS .PP به منظور کمک به بومی‌سازی، اگر تابعی به نام \fBordx\fR تعریف کنید که یک پارامتر دریافت می‌کند، فراخوانی \fBord\fR(\fIn\fR) تابع \fBordx\fR(\fIn\fR) را فراخوانی کرده و هر مقداری که آن برگرداند را بازمی‌گرداند. در طول فراخوانی بازگشتی (callback) به \fBordx\fR، اجرای \fBRUN\fR غیرفعال خواهد بود. .RE .TP .B orthodoxeaster([dqi_arg]) اگر \fIarg\fR یک \fBINT\fR باشد، تاریخ یکشنبه عید پاک ارتدکس را برای سال مشخص‌شده برمی‌گرداند. اگر \fIarg\fR یک \fBDATE\fR یا \fBDATETIME\fR باشد، تاریخ یکشنبه عید پاک ارتدکس بعدی را در \fIarg\fR یا پس از آن برمی‌گرداند. (بخش زمان در datetime نادیده گرفته می‌شود.) اگر \fIarg\fR حذف شود، مقدار پیش‌فرض \fBtoday()\fR است. .RS .PP توجه داشته باشید که \fBorthodoxeaster\fR عید پاک ارتدکس را محاسبه می‌کند. برای تاریخ عید پاک غربی، \fBeasterdate\fR را ببینید. .RE .TP .B ostype() مقدار "UNIX" را برمی‌گرداند. \fBRemind\fR در گذشته روی OS/2 و MS-DOS نیز اجرا می‌شد، اما دیگر اجرا نمی‌شود. .TP .B pad(x_arg, s_padstr, i_len [, i_right]) آرگومان نخست \fIarg\fR را در صورت نیاز به رشته تبدیل می‌کند، و سپس اگر کوتاه‌تر از \fIlen\fR بایت باشد، با استفاده از تعداد نسخه‌های لازم (شامل نسخه‌های جزئی) از \fIpadstr\fR، آن را تا \fIlen\fR بایت پر (pad) می‌کند. به‌طور پیش‌فرض، رشته از چپ پر می‌شود، اما اگر \fIright\fR داده شود و غیرصفر باشد، رشته از راست پر خواهد شد. .RS .PP چند نمونه در اینجا آمده است: .PP .nf pad(3, "0", 2) --> "03" pad(465, "0", 2) --> "465" pad("foo", " ", 5) --> " foo" pad("foo", " ", 5, 1) --> "foo " pad("foo", "bar", 11) --> "barbarbafoo" .fi .RE .TP .B mbpad(x_arg, s_padstr, i_len [, i_right]) این تابع همتای چندبایتیِ \fBpad\fR است. طول به جای بایت، بر حسب نویسه مشخص می‌شود. در صورتی که هر یک از رشته‌ها شامل نویسه‌های غیر ASCII باشد، به جای \fBpad\fR از \fBmbpad\fR استفاده کنید. .TP .B plural(i_num [,s_str1 [,s_str2]]) می‌تواند یک تا سه آرگومان دریافت کند. اگر یک آرگومان داده شود، در صورتی که \fInum\fR برابر با ۱ نباشد "s" و اگر \fInum\fR برابر با ۱ باشد "" برمی‌گرداند. .RS .PP اگر دو آرگومان داده شود، در صورتی که \fInum\fR برابر با ۱ نباشد مقدار \fIstr1\fR + "s" را برمی‌گرداند. در غیر این صورت، \fIstr1\fR را برمی‌گرداند. .PP اگر سه آرگومان داده شود، در صورتی که \fInum\fR برابر با ۱ باشد \fIstr1\fR و در غیر این صورت \fIstr2\fR را برمی‌گرداند. .RE .TP .B psmoon(i_phase [,i_size [,s_note [,i_notesize]]]) [منسوخ‌شده] یک \fBSTRING\fR شامل کد PostScript برای رسم یک ماه در گوشه بالا-چپ کادر تقویم برمی‌گرداند. \fIPhase\fR فاز ماه را مشخص می‌کند، و مقادیر آن 0 (ماه نو)، 1 (تربیع اول)، 2 (ماه کامل یا بدر) یا 3 (تربیع سوم) است. اگر \fIsize\fR مشخص شود، شعاع ماه را در واحدهای PostScript (یک هفتاد و دوم اینچ) کنترل می‌کند. اگر مشخص نشود یا منفی باشد، اندازه قلمِ شماره روز استفاده می‌شود. .PP .PP .RS برای نمونه، چهار خط زیر نمادهای ماه را در تقویم PostScript قرار می‌دهند: .PP .nf REM [moondate(0)] PS [psmoon(0)] REM [moondate(1)] PS [psmoon(1)] REM [moondate(2)] PS [psmoon(2)] REM [moondate(3)] PS [psmoon(3)] .fi .PP اگر \fInote\fR مشخص شود، از متن آن برای یادداشت‌گذاری نمایش ماه استفاده می‌شود. قلم، همان قلم مورد استفاده برای مدخل‌های تقویم است. اگر \fInotesize\fR داده شود، اندازه قلم مورد استفاده برای یادداشت‌گذاری را در واحدهای PostScript (یک هفتاد و دوم اینچ) مشخص می‌کند. اگر \fInotesize\fR داده نشود، مقدار پیش‌فرض آن اندازه مورد استفاده برای مدخل‌های تقویم است. (اگر روی نمایش یادداشت می‌گذارید، دقت کنید که روی شماره روز بازنویسی نشود -- \fBRemind\fR این مورد را بررسی نمی‌کند.) برای نمونه، اگر زمان هر ماه نو را در نمایش تقویم می‌خواهید، می‌توانید از این دستور در اسکریپت یادآور خود استفاده کنید: .PP .nf REM [moondate(0)] PS [psmoon(0, \-1, moontime(0)+"")] .fi .PP توجه داشته باشید که چگونه زمان با الحاق به رشته تهی، به یک رشته تبدیل شده است. .RE .TP \fBpsshade(i_gray)\fR or \fBpsshade(i_red, i_green, i_blue)\fR [منسوخ‌شده] یک \fBSTRING\fR شامل دستورات PostScript برای سایه‌زدن یک کادر تقویم برمی‌گرداند. \fINum\fR می‌تواند از 0 (کاملاً سیاه) تا 100 (کاملاً سفید) باشد. اگر سه آرگومان داده شود، شدت رنگ‌های قرمز، سبز و آبی را از 0 تا 100 مشخص می‌کنند. نمونه‌ای از نحوه استفاده در ادامه آمده است: .RS .PP .nf REM Sat Sun PS [psshade(95)] .fi .PP دستور فوق کد PostScript را برای ایجاد سایه‌ای ملایم در کادرهای روزهای شنبه و یکشنبه در یک تقویم PostScript تولید می‌کند. .PP توجه داشته باشید که \fBpsmoon\fR و \fBpsshade\fR منسوخ شده‌اند؛ به جای آن‌ها باید از یادآورهای SPECIAL SHADE و SPECIAL MOON همان‌طور که در "Out-of-Band Reminders" توصیف شده است استفاده کنید. .RE .TP .B realcurrent() تاریخ و زمان واقعی روز را طبق اطلاعات ارائه‌شده توسط سیستم‌عامل (به صورت یک DATETIME) برمی‌گرداند. این در تضاد با \fBcurrent()\fR است که ممکن است زمانی تعیین‌شده در خط فرمان را بازگرداند. .TP .B realnow() زمان واقعی روز را طبق اطلاعات ارائه‌شده توسط سیستم‌عامل برمی‌گرداند. این در تضاد با \fBnow()\fR است که ممکن است زمانی تعیین‌شده در خط فرمان، یا در حالت تقویم 00:00 را برگرداند. .TP .B realtoday() تاریخ را طبق اطلاعات ارائه‌شده توسط سیستم‌عامل برمی‌گرداند. این در تضاد با مفهوم «امروز» در \fBRemind\fR است که ممکن است در صورت اجرا در حالت تقویم، یا در صورت تعیین تاریخ در خط فرمان، تغییر کند. .TP .B rows() اگر خروجی استاندارد یا خطای استاندارد یک TTY باشد، ارتفاع ترمینال را بر حسب سطر برمی‌گرداند. اگر هیچ‌کدام یک TTY نباشند، تلاش می‌کند برای به دست آوردن اندازه ترمینال "/dev/tty" را باز کند. در صورت ناموفق بودن، مقدار -1 را برمی‌گرداند. .TP .B sgn(i_num) اگر \fInum\fR منفی باشد مقدار \-1، اگر مثبت باشد مقدار 1 و اگر صفر باشد مقدار 0 را برمی‌گرداند. .TP .B shell(s_cmd [,i_maxlen]) دستور \fIcmd\fR را به عنوان یک دستور سیستمی اجرا می‌کند، و ۵۱۱ نویسه نخست از خروجی حاصل از \fIcmd\fR را برمی‌گرداند. هر نویسه فضای خالی در خروجی به یک فاصله (space) تبدیل می‌شود. توجه داشته باشید که اگر \fBRUN OFF\fR اجرا شده باشد، یا از گزینه خط فرمان \fB\-r\fR استفاده شده باشد، \fBshell()\fR منجر به خطا شده و \fIcmd\fR اجرا نخواهد شد. .RS .PP هنگامی که \fBshell\fR دستور \fIcmd\fR را اجرا می‌کند، ترتیبی می‌دهد که توصیف‌گر فایلِ ورودی استاندارد \fIcmd\fR به /dev/null متصل شود. .PP اگر \fImaxlen\fR مشخص شود، \fBshell()\fR نخستین \fImaxlen\fR نویسه خروجی را (به جای ۵۱۱ نویسه نخست) برمی‌گرداند. اگر \fImaxlen\fR به عنوان یک عدد منفی مشخص شود، مقدار پیش‌فرض آن برابر با متغیر سیستمی \fB$MaxStringLen\fR خواهد بود. .RE .TP .B shellescape(s_str) رشته \fIstr\fR را در حالی که تمام فرانویسه‌های شل مانند " "، "*" و غیره با یک بک‌اسلش اسکیپ شده‌اند برمی‌گرداند. برای نمونه: .PP .nf SET a shellescape("a b*? c&d$e") .fi .RS .PP مقدار \fBa\fR را به این صورت تنظیم می‌کند: .RE .PP .nf "a\\ b\\*\\?\\ c\\&d\\$e" .fi .TP .B slide(d_start, i_amt [, i_step] [,s_wkday...]) این تابع معکوس \fBnonomitted\fR است. این تابع \fIamt\fR قطعه (که می‌تواند منفی باشد) از روزهای \fIstep\fR را به \fIstart\fR اضافه می‌کند، \fIبدون احتساب روزهای حذف‌شده (omitted)\fR. اگر \fIstep\fR ارائه نشود، مقدار پیش‌فرض آن ۱ در نظر گرفته می‌شود. توجه داشته باشید که تنها هر روزِ \fIstep\fR-اُم بررسی می‌شود تا مشخص شود آیا حذف شده است یا خیر. آرگومان‌های اختیاری \fIwkday\fR نام روزهای هفته اضافی برای حذف شدن هستند. .RS .PP این مثال را در نظر بگیرید: .PP .nf OMIT 14 May 2009 SET a slide('2009-05-13', 5, "Sat", "Sun") .fi .PP در این حالت، \fIa\fR برابر با 2009-05-21 تنظیم می‌شود. زیرا ما ۵ روز به جلو لغزش می‌کنیم، بدون احتساب پنج‌شنبه، ۱۴ مه یا شنبه و یکشنبه، ۱۶ و ۱۷ مه. شما می‌توانید به عقب نیز حرکت کنید، بنابراین: .PP .nf OMIT 14 May 2009 SET a slide('2009-05-21', \-5, "Sat", "Sun") .fi .PP مقدار \fIa\fR را به 2009-05-13 بازمی‌گرداند. .PP اکنون این مثال را بررسی کنید: .PP .nf OMIT 14 May 2009 SET a slide('2009-05-07', 2, 7) .fi .PP این دستور \fIa\fR را برابر با '2009-05-28' قرار می‌دهد زیرا ما دو هفته به جلو می‌پریم، بدون احتساب هفته‌ای که روز فرود ما بر حسب اتفاق در آن حذف شده است. این را با مثال زیر مقایسه کنید: .PP .nf OMIT 13 May 2009 SET a slide('2009-05-07', 2, 7) .fi .PP که \fIa\fR را برابر با '2009-05-21' تنظیم می‌کند. با اینکه 2009-05-13 حذف شده است، ما هنگام گام برداشتن به جلو در قطعه‌های ۷‌روزه، روی آن «فرود نمی‌آییم»، بنابراین هرگز متوجه حذف شدن آن نمی‌شویم. .RE .TP .B soleq(i_which [, dqi_start]) تابع \fBsoleq\fR اعتدالین و انقلابین را محاسبه می‌کند. پارامتر \fIwhich\fR در محدوده 0 تا 3 است و مشخص می‌کند به کدام رویداد علاقه‌مند هستیم: 0 اعتدال مارس (بهاری)؛ 1 انقلاب ژوئن (تابستانی)؛ 2 اعتدال سپتامبر (پاییزی) و 3 انقلاب دسامبر (زمستانی) است. .RS .PP پارامتر اختیاری \fIstart\fR می‌تواند یک عدد صحیح برای مشخص کردن سال رویداد مورد نظر، یا یک شیء \fBDATE\fR یا \fBDATETIME\fR باشد؛ اگر حالت دوم باشد، \fBsoleq\fR نخستین رویداد در بخش تاریخِ پارامتر \fIstart\fR یا پس از آن را برمی‌گرداند (در صورتی که \fIstart\fR یک \fBDATETIME\fR باشد، بخش زمان را نادیده می‌گیرد.) اگر \fIstart\fR ارائه نشود، مقدار پیش‌فرض \fBtoday()\fR در نظر گرفته می‌شود. .PP مقدار بازگشتی \fBsoleq()\fR یک شیء \fBDATETIME\fR است که تاریخ و زمان انقلاب یا اعتدال را در منطقه زمانی محلی مشخص می‌کند. این مقدار در بدترین حالت باید تا حدود ۳ دقیقه دقیق باشد. .PP برای مشاهده مثال‌هایی از نحوه استفاده از \fBsoleq()\fR، فایل ضمیمه‌شده \fB$SysInclude/seasons.rem\fR را ببینید. .RE .TP .B stdout() رشته‌ای را برمی‌گرداند که نشان می‌دهد خروجی استاندارد Remind به کجا می‌رود. مقادیر بازگشتی یکی از موارد زیر است: "TTY" اگر خروجی استاندارد یک ترمینال باشد، "BLOCKDEV" اگر یک دستگاه بلوکی باشد (بسیار بعید)، "CHARDEV" اگر یک دستگاه کاراکتری باشد (مانند /dev/null)، "DIR" اگر یک دایرکتوری باشد (بسیار بعید)، "PIPE" اگر یک لوله یا FIFO باشد، "SYMLINK" اگر یک پیوند نمادین باشد (بسیار بعید)، "SOCKET" اگر یک سوکت باشد، یا "UNKNOWN" اگر قابل تعیین نباشد. .RS .PP هدف \fBstdout()\fR عمدتاً تمایز قائل شدن میان خروجی TTY و غیر TTY است؛ ممکن است بخواهید در صورتی که خروجی به TTY نمی‌رود، رنگ‌ها را تغییر دهید یا غیرفعال کنید. .RE .TP .B strlen(s_str) طول \fIstr\fR را بر حسب بایت برمی‌گرداند. اگر طول \fIstr\fR برای نمایش به عنوان یک عدد صحیح بسیار بزرگ باشد، خطای "Number too high" صادر می‌کند. توجه داشته باشید که \fBstrlen\fR تعداد \fIبایت‌های\fR موجود در رشته را برمی‌گرداند، نه تعداد \fIنویسه‌ها\fR را. این ارقام برای رشته‌های ASCII یکسان هستند، اما ممکن است برای رشته‌های UTF-8 متفاوت باشند. .TP .B mbstrlen(str) مشابه با \fBstrlen\fR است، اما طول رشته را به جای \fIبایت‌ها\fR بر حسب \fIنویسه‌ها\fR برمی‌گرداند و بنابراین برای استفاده روی رشته‌های چندبایتی ایمن است. .TP .B substr(s_str, i_start [,i_end]) یک \fBSTRING\fR شامل تمام بایت‌های موجود در \fIstr\fR از \fIstart\fR تا و با احتساب \fIend\fR برمی‌گرداند. شماره‌گذاری بایت‌ها از ۱ آغاز می‌شود. اگر \fIend\fR ارائه نشود، مقدار پیش‌فرض آن طول \fIstr\fR است. از آنجا که \fBsubstr\fR به جای اندیس‌های \fIنویسه\fR از اندیس‌های \fIبایت\fR استفاده می‌کند، نباید روی رشته‌های چندبایتی استفاده شود. .TP .B mbsubstr(s_str, i_start [,i_end]) مشابه با \fBsubstr\fR است اما به جای اندیس‌های \fIبایت\fR از اندیس‌های \fIنویسه\fR استفاده می‌کند، و بنابراین برای استفاده روی رشته‌های چندبایتی ایمن است. .TP .B sunrise([dq_date]) یک شیء \fBTIME\fR نشان‌دهنده زمان طلوع آفتاب در \fIdate\fR مشخص‌شده (پیش‌فرض \fBtoday()\fR) برمی‌گرداند. در عرض‌های جغرافیایی بالا ممکن است در یک روز خاص طلوع آفتابی رخ ندهد؛ در این حالت اگر خورشید هرگز غروب نکند \fBsunrise()\fR مقدار \fBINT\fR صفر، و اگر هرگز طلوع نکند مقدار 1440 را برمی‌گرداند. .TP .B sunset([dq_date]) یک شیء \fBTIME\fR نشان‌دهنده زمان غروب آفتاب در \fIdate\fR مشخص‌شده (پیش‌فرض \fBtoday()\fR) برمی‌گرداند. در عرض‌های جغرافیایی بالا ممکن است در یک روز خاص غروب آفتابی رخ ندهد؛ در این حالت اگر خورشید هرگز طلوع نکند \fBsunset()\fR مقدار \fBINT\fR صفر، و اگر هرگز غروب نکند مقدار 1440 را برمی‌گرداند. .RS .PP توابع \fBsunrise()\fR و \fBsunset()\fR بر پایه الگوریتمی در "Almanac for Computers for the year 1978" اثر L. E. Doggett از دفتر تقویم نجومی دریانوردی، USNO هستند. این توابع نیازمند تعیین طول و عرض جغرافیایی از طریق تنظیم متغیرهای سیستمی مناسب هستند. (بخش "System Variables" را ببینید.) توابع خورشید باید برای عرض‌های جغرافیایی کمتر از ۶۰ درجه تا حدود ۴ دقیقه دقیق باشند. این توابع از نسخه 03.00.07 برنامه \fBRemind\fR در دسترس هستند. .RE .TP .B time(i_hr, i_min) یک شیء \fBTIME\fR با مؤلفه‌های ساعت و دقیقه مشخص‌شده توسط \fIhr\fR و \fImin\fR ایجاد می‌کند. .TP .B timepart(tq_datetime) یک شیء \fBTIME\fR نشان‌دهنده بخش زمانِ \fIdatetime\fR برمی‌گرداند. .TP .B timezone([dq_datetime]) رشته‌ای نشان‌دهنده نام منطقه زمانی محلی برای \fBDATETIME\fR داده‌شده برمی‌گرداند. اگر هیچ آرگومانی ارائه نشود، \fBRemind\fR از مقدار \fBcurrent()\fR استفاده می‌کند. اگر به جای \fBDATETIME\fR یک \fBDATE\fR ارائه شود، \fBRemind\fR از بخش زمان 00:00 استفاده می‌کند. .TP .B today() مفهوم «امروز» در \fBRemind\fR را برمی‌گرداند. این مقدار ممکن است تاریخ واقعی سیستم باشد، یا تاریخی که در خط فرمان تعیین شده است، یا (در حالت تقویم) تاریخ مدخل تقویمی که هم‌اکنون در حال محاسبه است. .TP .B trig(s_1 [,s_2, ...]) به ازای هر آرگومان رشته‌ای s_\fIn\fR، تابع \fBtrig\fR مقدار s_\fIn\fR را به گونه‌ای ارزیابی می‌کند که گویی یک مشخصات محرک REM یا IFTRIG است. اگر محرک امروز فعال می‌شد، تاریخ محرک برگردانده شده و هیچ محرک دیگری ارزیابی نمی‌شود. اگر هیچ‌یک از محرک‌ها امروز فعال نمی‌شدند، تاریخ صفر 1990-01-01 برگردانده می‌شود. .RS تابع \fBtrig\fR همچنین دارای یک قالب بدون آرگومان است؛ این حالت تاریخ محرکِ \fIتازه‌ترین\fR تابع \fBtrig\fR که یک تاریخ محرک غیرصفر برگردانده را بازمی‌گرداند. .PP از \fBtrig\fR می‌توان برای ساخت نسخه‌های پیشرفته‌تر از \fBIFTRIG\fR استفاده کرد. برای نمونه، اگر در ماه‌های ژوئن و ژوئیه هر دوشنبه جلساتی دارید و می‌خواهید ۳ روز پیش از موعد هشدار داده شود، می‌توانید از دستور زیر استفاده کنید: .PP .nf REM [trig("Mon Jun +3", "Mon July +3")] +3 MSG Meeting %b .fi .PP نکته: ما باید دلتای 3+ را در خارج از تابع \fBtrig\fR نیز تکرار کنیم تا هشدار پیش از موعد به درستی کار کند. این به این دلیل است که \fBtrig\fR یک ثابت تاریخی (تاریخ محرک) را برمی‌گرداند و دستور REM از جزئیات آرگومان‌های \fBtrig\fR اطلاعی ندارد. .PP توجه داشته باشید که از آنجا که \fBRemind\fR دارای عملگرهای منطقی ارزیابی اتصال کوتاه (short-circuit) است، عبارتی مانند: .PP .nf SET a trig("Mon +7") || trig("Fri +7") .fi مقدار ()trig را روی تاریخ دوشنبه آینده تنظیم می‌کند. زیرا ("trig("Mon +7 همیشه درست (true) برمی‌گرداند، عملگر OR منطقی به ارزیابی ("trig("Fri +7 نمی‌پردازد که در نتیجه \fBtrig()\fR توسط آن مقداردهی نمی‌شود. .PP \fBنکته مهم\fR: از آنجا که \fBtrig()\fR همیشه یک تاریخ مطلق را برمی‌گرداند، با یک بند \fBSATISFY\fR به درستی کار \fBنخواهد کرد\fR. این یادآور را در نظر بگیرید: .PP .nf REM [trig("Mar", "Apr")] SATISFY [$Td == 15] MSG 15 Mar or April .fi .PP اگر \fBRemind\fR را در ۵ مارس ۲۰۲۲ اجرا کنیم، ممکن است انتظار داشته باشیم که تاریخ محرک برابر با ۱۵ مارس ۲۰۲۲ محاسبه شود... اما این اتفاق رخ نمی‌دهد. در عوض، ابتدا تابع \fBtrig\fR ارزیابی می‌شود و مقدار 2022-03-05 را برمی‌گرداند. بنابراین تا آنجا که به \fBRemind\fR مربوط می‌شود، عبارت REM به شکل زیر درمی‌آید: .PP .nf REM 2022-03-05 SATISFY [$Td == 15] MSG 15 Mar or April .fi .PP و عبارت SATISFY هرگز درست نخواهد بود. بنابراین: \fBهرگز trig() و SATISFY را با هم ترکیب نکنید\fR. .RE .TP .B trigdate() تاریخ محرک محاسبه‌شده آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را برمی‌گرداند. اگر در \fIبدنه\fR یک دستور \fBREM\fR استفاده شود، تاریخ محرک آن دستور را برمی‌گرداند. اگر تازه‌ترین دستور \fBREM\fR منجر به یک تاریخ محرک قابل محاسبه نشود، عدد صحیح 0 را برمی‌گرداند. .TP .B trigdatetime() مشابه با ()trigdate است، اما اگر تازه‌ترین دستور تحریک‌پذیر \fBREM\fR دارای یک بند \fBAT\fR بوده باشد، یک \fBDATETIME\fR برمی‌گرداند. اگر بند \fBAT\fR وجود نداشته باشد، یک \fBDATE\fR برمی‌گرداند. اگر هیچ محرکی قابل محاسبه نباشد، عدد صحیح 0 را برمی‌گرداند. برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید. .TP .B trigeventstart() یک شیء \fBDATETIME\fR نشان‌دهنده شروع تازه‌ترین دستور تحریک‌پذیر \fBREM\fR که دارای بند \fBAT\fR بوده است برمی‌گرداند. برای رویدادهای فاقد \fBDURATION\fR یا رویدادهایی که چندین روز به درازا نمی‌کشند، همان مقدار \fBtrigdatetime()\fR را برمی‌گرداند. اگر دستور \fBREM\fR دارای بند \fBAT\fR نبوده باشد، عدد صحیح -1 را برمی‌گرداند (و از این نظر با \fBtrigdatetime()\fR تفاوت دارد.) برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید. .TP .B trigeventstarttz() مشابه با \fBtrigeventstart()\fR است، اما در صورت وجود بند TZ، مقدار DATETIME را در منطقه زمانی مشخص‌شده توسط آن بند برمی‌گرداند. اگر بند TZ وجود نداشته باشد، همان مقدار \fBtrigeventstart()\fR را برمی‌گرداند. .TP .B trigeventduration() یک شیء \fBTIME\fR نشان‌دهنده مدت‌زمان تازه‌ترین دستور تحریک‌پذیر \fBREM\fR که دارای هر دو بند \fBAT\fR و \fBDURATION\fR بوده است برمی‌گرداند. اگر رویداد چندین روز به طول نینجامد، همان مقدار \fBtrigduration()\fR را برمی‌گرداند. اگر دستور \fBREM\fR فاقد بند \fBAT\fR یا \fBDURATION\fR باشد، مقدار -1 را برمی‌گرداند. برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید. .TP .B trigback() مقدار «عقب‌گرد» (back) آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را برمی‌گرداند. اگر عقب‌گرد به شکل N- باشد یک عدد صحیح مثبت N، یا اگر به شکل N-- باشد یک عدد صحیح منفی برمی‌گرداند. اگر هیچ عقب‌گردی وجود نداشته باشد، مقدار 0 را برمی‌گرداند. .TP .B trigbase() تاریخ «پایه» (base) آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را برمی‌گرداند. اگر مشخصات محرک شامل \fIهر سه\fR مورد روز، ماه و سال باشد، تاریخ پایه همان تاریخ تشکیل‌شده از این مؤلفه‌ها است. اگر مشخصات محرک فاقد یکی از این مؤلفه‌ها باشد، مقدار 0 برگردانده می‌شود. .RS .PP در اینجا مثالی از نحوه استفاده از \fBtrigbase()\fR آمده است: .PP .nf REM 2025-05-05 *7 UNTIL 2025-05-26 \ MSG Meeting: week #[(trigdate() - trigbase())/trigrep()+1] .fi .PP در تاریخ 2025-05-05، متن "Meeting: week #1" چاپ می‌شود. در تاریخ 2025-05-12، متن "Meeting: week #2" چاپ می‌شود و به همین ترتیب ادامه می‌یابد. .RE .TP .B trigdelta() مقدار «دلتا» (delta) آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را برمی‌گرداند. اگر دلتا به شکل N+ باشد یک عدد صحیح مثبت N، یا اگر به شکل N++ باشد یک عدد صحیح منفی برمی‌گرداند. اگر هیچ دلتایی وجود نداشته باشد، مقدار 0 را برمی‌گرداند. .TP .B trigtimedelta() مشابه با \fBtrigdelta()\fR است، اما دلتای استفاده‌شده در بند \fBAT\fR از یک یادآور زمان‌بندی‌شده را برمی‌گرداند. .TP .B trigrep() مقدار «تکرار» (repeat) آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را برمی‌گرداند. اگر تکرار به شکل N* باشد، یک عدد صحیح مثبت N برمی‌گرداند. اگر هیچ تکراری وجود نداشته باشد، مقدار 0 را برمی‌گرداند. .TP .B trigtimerep() مشابه با \fBtrigrep()\fR است، اما تکرار استفاده‌شده در بند \fBAT\fR از یک یادآور زمان‌بندی‌شده را برمی‌گرداند. .TP .B trigtz() اگر یک بند \fBTZ\fR در آخرین دستور \fBREM\fR یا \fBIFTRIG\fR استفاده شده باشد، نام منطقه زمانی را برمی‌گرداند. در غیر این صورت رشته خالی را برمی‌گرداند. .TP .B trigduration() پارامتر \fBDURATION\fR یک یادآور زمان‌بندی‌شده را (به عنوان نوع TIME) برمی‌گرداند. اگر پارامتر \fBDURATION\fR وجود نداشته باشد، عدد صحیح -1 را برمی‌گرداند. برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید. .TP .B trigpriority() اولویت (\fBPRIORITY\fR) آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را برمی‌گرداند. .TP .B triguntil() پارامتر \fBUNTIL\fR آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را (به عنوان نوع \fBDATE\fR) برمی‌گرداند. اگر پارامتر \fBUNTIL\fR وجود نداشته باشد، عدد صحیح -1 را برمی‌گرداند. اگر یک پارامتر \fBTHROUGH\fR وجود داشته باشد، آن پارامتر توسط \fBtriguntil()\fR برگردانده می‌شود، زیرا "THROUGH yyyy-mm-dd" صرفاً یک نگارش آسان‌تر برای "*1 UNTIL yyyy-mm-dd" است. .TP .B trigscanfrom() پارامتر \fBSCANFROM\fR آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را (به عنوان نوع \fBDATE\fR) برمی‌گرداند. اگر پارامتر \fBSCANFROM\fR وجود نداشته باشد، عدد صحیح -1 را برمی‌گرداند. توجه داشته باشید که \fBFROM\fR و \fBSCANFROM\fR بر یکدیگر اثر می‌گذارند؛ یک یادآور که دارای پارامتر "FROM yyyy-mm-dd" است، به گونه‌ای عمل می‌کند که گویی یک پارامتر \fBSCANFROM\fR دارد که مقدار آن بیشینه بین "yyyy-mm-dd" و امروز است. .TP .B trigfrom() پارامتر \fBFROM\fR آخرین دستور \fBREM\fR یا \fBIFTRIG\fR را (به عنوان نوع \fBDATE\fR) برمی‌گرداند. اگر پارامتر \fBFROM\fR وجود نداشته باشد، عدد صحیح -1 را برمی‌گرداند. .TP .B triginfo(s_header) یک \fBSTRING\fR برمی‌گرداند که آیتم INFO مرتبط با هدر \fIheader\fR است. هدر \fIنباید\fR شامل دونقطه (:) باشد. مقایسه نام هدرها بدون حساسیت به بزرگی و کوچکی حروف انجام می‌شود. .RS .PP برای نمونه، دستورات زیر مقدار "At home" را به متغیر a و رشته خالی را به متغیر b اختصاص می‌دهند: .PP .nf REM INFO "Location: At home" MSG test SET a triginfo("location") SET b triginfo("no_such_header") .fi .PP .RE .TP .B trigistodo() اگر آخرین دستور \fBREM\fR از نوع \fBTODO\fR بوده باشد 1، و در غیر این صورت 0 را برمی‌گرداند. .TP .B trigcompletethrough() یک شیء \fBDATE\fR برمی‌گرداند که تاریخ COMPLETE-THROUGH تازه‌ترین دستور \fBREM\fR است. اگر تاریخ COMPLETE-THROUGH وجود نداشته باشد، مقدار \fBINT\fR صفر را برمی‌گرداند. .TP .B trigmaxoverdue() یک عدد صحیح \fBINT\fR برمی‌گرداند که مقدار MAX-OVERDUE تازه‌ترین دستور \fBREM\fR است. اگر بند MAX-OVERDUE وجود نداشته باشد، مقدار -1 را برمی‌گرداند. .TP .B trigger(d_date [,t_time [,i_utcflag]]) \fRor\fB trigger(q_datetime [,i_utcflag]) رشته‌ای مناسب برای استفاده در یک دستور \fBREM\fR یا یک بند \fBSCANFROM\fR یا UNTIL برمی‌گرداند، که به شما امکان می‌دهد تاریخ‌های محرک را از قبل محاسبه کنید. توجه داشته باشید که در نسخه‌های پیشین \fBRemind\fR، استفاده از \fBtrigger\fR برای تبدیل تاریخ به قالبی که دستور \fBREM\fR بتواند پردازش کند الزامی بود. با این حال، در این نسخه از \fBRemind\fR می‌توانید از آن صرف‌نظر کنید. معمولاً \fIdate\fR و \fItime\fR تاریخ و زمان محلی هستند؛ با این حال اگر \fIutcflag\fR غیرصفر باشد، \fIdate\fR و \fItime\fR به عنوان زمان‌های UTC تفسیر شده و به زمان محلی تبدیل می‌شوند. مثال‌ها: .RS .PP trigger('1993/04/01') .PP مقدار "1 April 1993" را برمی‌گرداند، .PP trigger('1994/08/09', 12:33) .PP مقدار "9 August 1994 AT 12:33" را برمی‌گرداند، همان‌طور که عبارت زیر نیز: .PP trigger('1994/08/09@12:33'). .PP در نهایت: .PP trigger('1994/12/01', 03:00, 1) .PP مقدار "30 November 1994 AT 22:00" را برای EST که ۵ ساعت از UTC عقب‌تر است برمی‌گرداند. مقدار مربوط به منطقه زمانی شما ممکن است متفاوت باشد. .PP تابع \fBtrigger()\fR \fIهرگز\fR تاریخی قدیمی‌تر از "1 January 1990" را برنمی‌گرداند، حتی اگر فلگ UTC تعیین کند که باید چنین باشد. بنابراین از آن برای یادآورهای قبل از حدود ۲ ژانویه ۱۹۹۰ در منطقه زمانی محلی خود استفاده نکنید. انتظار نمی‌رود این محدودیت مشکل واقعی ایجاد کند. .RE .TP .B trigtags() فهرستی از برچسب‌های (TAGs) مرتبط با تازه‌ترین دستور محرک‌شده \fBREM\fR را که با کاما از هم جدا شده‌اند برمی‌گرداند. اگر هیچ برچسبی وجود نداشته باشد، رشته خالی را برمی‌گرداند. اگر چندین برچسب وجود داشته باشد، هر کدام با یک کاما (نه یک کاما و یک فاصله) از هم جدا می‌شوند. .TP .B trigtime() زمان آخرین دستور \fBREM\fR با بند \fBAT\fR را \fIدر منطقه زمانی پیش‌فرض سیستم\fR برمی‌گرداند. اگر آخرین دستور \fBREM\fR فاقد بند \fBAT\fR باشد، عدد صحیح 0 را برمی‌گرداند. اگر یک دستور \fBREM\fR دارای بند \fBAT\fR همراه با \fBDURATION\fR باشد، می‌توانید زمان پایان را به صورت \fBtrigtime() + trigduration()\fR محاسبه کنید. .TP .B trigtimetz() مشابه با \fBtrigtime()\fR است، اما در صورت وجود بند TZ، زمان را در منطقه زمانی مشخص‌شده توسط آن بند برمی‌گرداند. اگر بند TZ وجود نداشته باشد، همان مقدار \fBtrigtime()\fR را برمی‌گرداند. .TP .B trigvalid() اگر مقدار برگردانده‌شده توسط \fBtrigdate()\fR برای تازه‌ترین دستور \fBREM\fR معتبر باشد 1، و در غیر این صورت 0 را برمی‌گرداند. گاهی دستورات \fBREM\fR نمی‌توانند تاریخ محرکی را محاسبه کنند. برای نمونه، دستور \fBREM\fR زیر هرگز نمی‌تواند تحریک شود: .PP .nf REM Mon OMIT Mon SKIP MSG Impossible! .fi .PP .TP .B typeof(x_arg) بسته به نوع \fIarg\fR، مقدار "STRING"، "INT"، "DATE"، "TIME" یا "DATETIME" را برمی‌گرداند. .TP .B tzconvert(q_datetime, s_srczone [,s_dstzone]) مقدار \fBdatetime\fR را از منطقه زمانی نام‌گذاری‌شده با \fBsrczone\fR به منطقه زمانی نام‌گذاری‌شده با \fBdstzone\fR تبدیل می‌کند. اگر \fBsrczone\fR رشته خالی باشد، منطقه زمانی پیش‌فرض سیستم به عنوان منطقه مبدأ در نظر گرفته می‌شود. اگر \fBdstzone\fR حذف شود یا رشته خالی باشد، منطقه زمانی پیش‌فرض سیستم به عنوان منطقه مقصد استفاده می‌شود. مقدار بازگشتی یک DATETIME است. نام‌های مناطق زمانی وابسته به سیستم هستند؛ برای مقادیر مجاز به سیستم‌عامل خود مراجعه کنید. یک نمونه در ادامه آمده است: .RS .PP .nf tzconvert('2007-07-08@01:14', "Canada/Eastern", "Canada/Pacific") returns 2007-07-07@22:14 .fi .PP اگر سیستم شما شامل دایرکتوری /usr/share/zoneinfo باشد، در صورت استفاده از یک نام منطقه زمانی نامعتبر برای \fBsrczone\fR یا \fBdstzone\fR، برنامه \fBRemind\fR به شما هشدار خواهد داد. برای چشم‌پوشی از این هشدارها، یک کاراکتر "!" را به ابتدای نام منطقه زمانی اضافه کنید. .RE .PP .TP .B upper(s_string) یک \fBSTRING\fR برمی‌گرداند که تمام بایت‌های حروف کوچک در \fIstring\fR به حروف بزرگ تبدیل شده‌اند. \fBتوجه:\fR این تابع تنها برای رشته‌های ASCII به درستی کار می‌کند. اگر از نویسه‌های یونیکد خارج از مجموعه ASCII استفاده می‌کنید، به جای آن از \fBmbupper\fR استفاده کنید. .TP .B mbupper(s_string) یک \fBSTRING\fR برمی‌گرداند که تمام نویسه‌های حروف کوچک در \fIstring\fR به حروف بزرگ تبدیل شده‌اند. این تابع روی هر رشته یونیکد به درستی کار می‌کند. .TP .B utctolocal(q_datetime) با دریافت یک شیء \fBDATETIME\fR که بر مبنای UTC تفسیر شده است، یک شیء \fBDATETIME\fR برمی‌گرداند که همان زمان را در منطقه زمانی محلی بیان می‌کند. .TP .B value(s_varname [,x_default]) مقدار متغیر مشخص‌شده را برمی‌گرداند. برای نمونه، value("X"+"Y") در صورت تعریف بودن متغیر XY، مقدار آن را برمی‌گرداند. اگر متغیر XY تعریف نشده باشد، خطا رخ می‌دهد. .RS .PP با این حال، اگر آرگومان دومی ارائه دهید، در صورتی که \fIvarname\fR تعریف نشده باشد، همان آرگومان برگردانده می‌شود. عبارت value("XY", 0) در صورت عدم تعریف XY مقدار 0 و در صورت تعریف بودن مقدار XY را برمی‌گرداند. توجه داشته باشید که \fBvalue\fR آرگومان دوم را به صورت تنبل (lazy) ارزیابی می‌کند؛ یعنی در صورت تعریف بودن \fIvarname\fR، آرگومان دوم ارزیابی \fIنمی‌شود\fR. .RE .TP .B version() رشته‌ای مشخص‌کننده نسخه \fBRemind\fR برمی‌گرداند. برای نسخه 06.02.07، مقدار "06.02.07" را برمی‌گرداند. تضمین می‌شود که با انتشار نسخه‌های جدیدتر \fBRemind\fR، مقدار بازگردانده‌شده توسط \fBversion()\fR مطابق با قواعد ترتیب رشته‌ها، اکیداً افزایش خواهد یافت. .TP .B weekno([dq_date, [i_wkstart, [i_daystart]]]) شماره هفته سال را برمی‌گرداند. اگر هیچ آرگومانی ارائه نشود، شماره هفته ISO 8601 را برای \fBtoday()\fR برمی‌گرداند. اگر یک آرگومان \fIdate\fR ارائه شود، شماره هفته ISO 8601 را برای آن تاریخ برمی‌گرداند. اگر دو آرگومان ارائه شود، \fIwkstart\fR باید در محدوده 0 تا 6 باشد و نشان‌دهنده روز نخست هفته است (که 0 یکشنبه و 6 شنبه است). اگر \fIwkstart\fR ارائه نشود، مقدار پیش‌فرض آن 1 خواهد بود. اگر آرگومان سوم \fIdaystart\fR ارائه شود، مشخص می‌کند که هفته ۱ از چه زمانی آغاز می‌شود. اگر \fIdaystart\fR کمتر یا مساوی با 7 باشد، هفته ۱ در نخستین \fIwkstart\fR در یا پس از \fIdaystart\fR ژانویه آغاز می‌شود. در غیر این صورت، هفته ۱ در نخستین \fIwkstart\fR در یا پس از \fIdaystart\fR دسامبر آغاز می‌شود. اگر حذف شود، مقدار پیش‌فرض \fIdaystart\fR برابر با 29 خواهد بود (مطابق با تعریف ISO 8601). .TP .B wkday(dqi_arg) اگر \fIarg\fR یک \fBDATE\fR یا \fBDATETIME\fR باشد، رشته‌ای نشان‌دهنده روز هفتهِ تاریخ را برمی‌گرداند. اگر \fIarg\fR یک \fBINT\fR از 0 تا 6 باشد، روز هفته متناظر ("Sunday" تا "Saturday") را برمی‌گرداند. .TP .B wkdaynum(dq_date)\fR or \fBwkdaynum(s_str)\fR عددی از 0 تا 6 نشان‌دهنده روز هفتهِ \fIdate\fR مشخص‌شده برمی‌گرداند. (0 نشان‌دهنده یکشنبه و 6 نشان‌دهنده شنبه است.) اگر یک \fBSTRING\fR ارائه شود، در صورتی که \fIstr\fR یک نام معتبر برای روز هفته (یا اختصار حداقل ۳‌حرفی آن) باشد، شماره روز هفته متناظر برگردانده می‌شود. اگر \fIstr\fR نام معتبری برای روز هفته نباشد، خطا رخ می‌دهد. .TP .B year(dq_date) یک \fBINT\fR برمی‌گرداند که مؤلفه سالِ \fIdate\fR است. .SH "دستگاه‌های دارای نوع TIME_T ۳۲ بیتی (MACHINES WITH A 32-BIT TIME_T TYPE)" در ساختار داخلی، کتابخانه استاندارد C زمان‌ها را به‌صورت نوع داده \fBtime_t\fR نمایش می‌دهد. این نوع، یک نوع عدد صحیح علامت‌دار است که ثانیه‌های سپری‌شده از نیمه‌شب ۱ ژانویه ۱۹۷۰ بر حسب ساعت هماهنگ جهانی (UTC) را شمارش می‌کند. اگر اندازه نوع \fBtime_t\fR تنها ۳۲ بیت باشد، کتابخانه C نمی‌تواند زمان‌های پس از ۱۹ ژانویه ۲۰۳۸ در ساعت ۰۳:۱۴:۰۷ UTC را نشان دهد. .PP برای دور زدن این محدودیت، \fBRemind\fR سال‌های پس از ۲۰۳۷ را به یک سال کوچک‌تر «تا» (fold) می‌کند که با همان روز شروع می‌شود و تعداد روزهای یکسانی دارد. این امر به سالی منجر می‌شود که به احتمال بسیار قوی قوانین ساعت تابستانی (daylight saving) یکسانی با سال اصلی دارد، مگر اینکه قوانین در این فاصله تغییر کرده باشند (که در این صورت تغییر قانون حتی در یک ماشین ۳۲ بیتی قابل نمایش نبود، بنابراین موضوع منتفی است). .PP سپس \fBRemind\fR تبدیل‌های UTC به محلی یا محلی به UTC را با سال تاخورده انجام می‌دهد و پس از تبدیل، آن را تصحیح کرده و بازمی‌گرداند. این کار باید نتایج صحیحی برای توابع نجومی و تبدیل‌های بین زمان محلی و زمان UTC ارائه دهد، مشروط بر اینکه قوانین ساعت تابستانی بین سال تاخورده و سال اصلی تغییر نکرده باشد. .PP توجه داشته باشید که متغیر سیستمی $FoldYear دیگر چندان کاربردی ندارد؛ \fBRemind\fR در سیستم‌های ۳۲ بیتی در صورت لزوم \fIهمیشه\fR سال‌ها را تا می‌کند. می‌توانید $FoldYear را برابر ۱ قرار دهید تا \fBRemind\fR را وادار کنید سال‌ها را حتی در یک سیستم ۶۴ بیتی تا کند، اما این کار فقط برای آزمایش مفید است و برای استفاده در محیط عملیاتی نیست. .SH "رویدادهای چندروزه (MULTI-DAY EVENTS)" اگر یک زمان شروع با \fBAT\fR و یک مدت‌زمان با \fBDURATION\fR مشخص کنید، می‌توانید رویدادهایی ایجاد کنید که چندین روز به طول می‌انجامند. این دو دستور REM را در نظر بگیرید: .PP .nf REM 1991-02-13 AT 16:00 DURATION 72:00 MSG 72-hour event REM 1991-02-13 THROUGH 1991-02-16 AT 16:00 MSG Four events .fi .PP دستور اول یک رویداد \fIتکی\fR ایجاد می‌کند که در ۱۳ فوریه ۱۹۹۱ ساعت ۱۶:۰۰ شروع می‌شود و تا ۱۶ فوریه ۱۹۹۱ ساعت ۱۶:۰۰ ادامه می‌یابد. .PP دستور دوم \fIچهار رویداد جداگانه\fR ایجاد می‌کند که در ساعت ۱۶:۰۰ در روزهای ۱۳، ۱۴، ۱۵ و ۱۶ فوریه ۱۹۹۱ شروع می‌شوند و مدت‌زمان نامحدودی دارند. .PP \fBRemind\fR رویدادهای چندروزه را به شیوه‌ای خاص مدیریت می‌کند. قوانین به این شرح است: .PP در \fIنخستین\fR روز یک رویداد چندروزه، تابع \fBtrigdatetime()\fR تاریخ و زمان شروع رویداد را بازمی‌گرداند، و \fBtrigduration()\fR مقدار DURATION اصلی را برمی‌گرداند. .PP در هر روز \fIبعدی\fR از یک رویداد چندروزه، \fBtrigdatetime()\fR نیمه‌شب همان روز را بازمی‌گرداند، و \fBtrigduration()\fR مدت‌زمان \fIباقی‌مانده\fR را برمی‌گرداند. این مثال را در نظر بگیرید: .PP .nf #!/bin/sh remind - 12 feb 1991 '*6' <<'EOF' BANNER % REM 1991-02-13 AT 16:00 DURATION 72:00 SATISFY 1 set a trigdatetime() set b trigduration() set c trigeventstart() set d trigeventduration() MSG now=[today()] dt=[a] dur=[b] estart=[c] edur=[d]% EOF .fi .PP خروجی به این صورت است: .PP .nf now=1991-02-12 dt=1991-02-13@16:00 dur=72:00 estart=1991-02-13@16:00 edur=72:00 now=1991-02-13 dt=1991-02-13@16:00 dur=72:00 estart=1991-02-13@16:00 edur=72:00 now=1991-02-14 dt=1991-02-14@00:00 dur=64:00 estart=1991-02-13@16:00 edur=72:00 now=1991-02-15 dt=1991-02-15@00:00 dur=40:00 estart=1991-02-13@16:00 edur=72:00 now=1991-02-16 dt=1991-02-16@00:00 dur=16:00 estart=1991-02-13@16:00 edur=72:00 now=1991-02-17 dt=1991-02-13@16:00 dur=72:00 estart=-1 edur=-1 .fi .PP همان‌طور که مشاهده می‌کنید، توابع \fBtrigdatetime()\fR و \fBtrigduration()\fR زمان شروع و مدت‌زمان بخش \fIباقی‌مانده\fR از یک رویداد چندروزه را بازمی‌گردانند، در حالی که \fBtrigeventstart\fR و \fBtrigeventduration\fR همواره شروع و مدت‌زمان اولیه رویداد چندروزه را بازمی‌گردانند. همچنین توجه داشته باشید که مقدار بازگشتی برای یادآورهای منقضی‌شده قابل اعتماد نیست؛ این واقعیت که \fBtrigeventstart\fR و \fBtrigeventduration\fR در این حالت -1 بازمی‌گردانند یک اثر پیاده‌سازی (implementation artifact) است. .PP .B "رویدادهای دارای هم‌پوشانی با خود (SELF-OVERLAPPING EVENTS)" .PP یک رویداد چندروزه این امکان را دارد که «با خود هم‌پوشانی داشته باشد». هنگامی که این اتفاق رخ می‌دهد، \fBRemind\fR رویداد \fIبعدی\fR را ترجیح می‌دهد (برای یک تاریخ معین، تنها یک نسخه از یک رویداد فعال می‌شود). این مثال را در نظر بگیرید: .PP .nf #!/bin/sh remind - '*5' 10 Feb 1991 <<'EOF' BANNER % REM MON at 0:00 DURATION 192:0 MSG [today()] [trigeventstart()] [trigduration()]% EOF .fi .PP خروجی به این صورت است: .PP .nf 1991-02-10 1991-02-04@00:00 48:00 1991-02-11 1991-02-11@00:00 192:00 1991-02-12 1991-02-11@00:00 168:00 1991-02-13 1991-02-11@00:00 144:00 1991-02-14 1991-02-11@00:00 120:00 .fi .PP اگرچه رویداد متعلق به ۱۹۹۱-۰۲-۰۴ در تاریخ ۱۹۹۱-۰۲-۱۱ هنوز ۲۴ ساعت باقی‌مانده دارد، اما وقوع تازه در ۱۹۹۱-۰۲-۱۱ اولویت دارد و همان است که فعال می‌شود. .PP توصیه نمی‌شود رویدادهای چندروزه دارای هم‌پوشانی با خود ایجاد کنید. .PP .SH "چسباندن عبارت (EXPRESSION PASTING)" .PP یکی از ویژگی‌های بسیار قدرتمند \fBRemind\fR قابلیت ماکرو یا «چسباندن عبارت» (expression pasting) است. .PP تقریباً در هر موقعیتی که \fBRemind\fR انتظار یک عبارت را ندارد، می‌توانید یک عبارت را در آن «بچسبانید» (paste کنید). برای انجام این کار، عبارت را در براکت‌های مربع محصور کنید. برای مثال: .PP .nf REM [mydate] MSG foo .fi .PP این دستور عبارت «mydate» را ارزیابی می‌کند، که در آن فرض بر این است «mydate» متغیری از پیش محاسبه‌شده است، و سپس نتیجه را در خط فرمان می‌چسباند تا تجزیه‌کننده (parser) آن را پردازش کند. .PP اگر به هر دلیلی کاراکتر واقعی «[» را می‌خواهید، کافی است از «[[» استفاده کنید. برای مثال: .PP .nf REM MSG Here are [[square] brackets! .fi .PP توصیف رسمی این سازوکار به این صورت است: هنگامی که \fBRemind\fR با یک عبارت «چسبانده‌شده» مواجه می‌شود، عبارت را ارزیابی کرده و نتیجه را به یک \fBSTRING\fR تبدیل نوع (coerce) می‌کند. سپس این رشته را جایگزین عبارت چسبانده‌شده می‌کند و به تجزیه ادامه می‌دهد. با این حال توجه داشته باشید که عبارت‌ها فقط یک بار ارزیابی می‌شوند، نه به‌صورت بازگشتی. بنابراین نوشتن: .PP .nf ["[a+b]"] .fi .PP باعث می‌شود \fBRemind\fR توکن «[a+b]» را بخواند. این عبارت را به‌عنوان یک عبارت چسبانده‌شده تفسیر نمی‌کند. .PP می‌توانید تقریباً در هر جایی از چسباندن عبارت استفاده کنید. با این حال، چند استثنا وجود دارد: .TP o اگر \fBRemind\fR منتظر یک عبارت باشد، مانند دستور \fBSET\fR یا دستور \fBIF\fR، \fBنباید\fR از براکت‌های مربع استفاده کنید. برای مثال، از: .PP .nf SET a 4+5 .fi استفاده کنید و نه از: .nf SET a [4+5] .fi .TP o نمی‌توانید برای توکن اول در یک خط از چسباندن عبارت استفاده کنید. برای مثال، مورد زیر کار نخواهد کرد: .PP .nf ["SET"] a 1 .fi .RS .PP این محدودیت به این دلیل است که \fBRemind\fR باید بتواند توکن اول یک خط را بدون ابهام برای دستورات کنترل جریان (که بعداً بحث خواهد شد) تعیین کند. .PP در واقع، اگر \fBRemind\fR نتواند توکن اول یک خط را تعیین کند، فرض می‌کند که آن یک دستور \fBREM\fR است. اگر از چسباندن عبارت استفاده شود، \fBRemind\fR فرض می‌کند که یک دستور \fBREM\fR است. بدین ترتیب، سه دستور زیر معادل هستند: .PP .nf REM 12 Nov 1993 AT 13:05 MSG BOO! 12 Nov 1993 AT 13:05 MSG BOO! [12] ["Nov " + 1993] AT [12:05+60] MSG BOO! .fi .RE .TP o نمی‌توانید از چسباندن عبارت برای تعیین نوع (\fBMSG\fR، \fBCAL\fR و غیره) یک دستور \fBREM\fR استفاده کنید. می‌توانید عبارت‌ها را قبل و بعد از کلیدواژه‌های \fBMSG\fR و غیره بچسبانید، اما نمی‌توانید کاری مانند این انجام دهید: .RS .PP .nf REM ["12 Nov 1993 AT 13:05 " + "MSG" + " BOO!"] .fi .PP با این حال، به عنوان یک راه گریز (escape hatch)، توالی \fBSPECIAL\fR \fItype\fR همان معنای \fItype\fR را دارد که در آن \fItype\fR یکی از موارد MSG، MSF، RUN، CAL، PS و PSFILE است. این به شما امکان می‌دهد کاری شبیه به این انجام دهید: .PP .nf SET type "MSG" REM 12 Nov 2024 SPECIAL [type] Hello .fi .PP می‌توانید از این شیوه برای کنترل انواع یادآورهای خود بر اساس متغیرهایی که مقداردهی کرده‌اید، نحوه فراخوانی \fBRemind\fR و غیره استفاده کنید. .RE .PP .B "دام‌های رایج در چسباندن عبارت (COMMON PITFALLS WITH EXPRESSION PASTING)" .PP به یاد داشته باشید که هنگام چسباندن عبارت، فاصله‌های اضافی (فضای خالی) درج نمی‌شود. بنابراین، چیزی شبیه به: .PP .nf REM[expr]MSG[expr] .fi .PP احتمالاً با شکست مواجه خواهد شد. .PP اگر از یک عبارت برای محاسبه \fIdelta\fR یا \fIback\fR استفاده می‌کنید، اطمینان حاصل کنید که نتیجه یک عدد مثبت باشد. چیزی مانند: .PP .nf REM +[mydelta] Nov 12 1993 MSG foo .fi .PP در صورتی که \fImydelta\fR منفی باشد با شکست مواجه خواهد شد. .PP .SH "دستورات کنترل جریان (FLOW CONTROL COMMANDS)" .PP برنامه \fBRemind\fR دارای دستوراتی است که جریان اجرای یک اسکریپت یادآور را کنترل می‌کنند. به‌طور معمول، اسکریپت‌های یادآور به صورت متوالی پردازش می‌شوند. با این حال، دستور \fBIF\fR و دستورات مرتبط به شما امکان می‌دهند فایل‌ها را به‌صورت شرطی پردازش کنید و از بخش‌هایی که نمی‌خواهید تفسیر شوند صرف‌نظر نمایید. .PP .B "دستور IF (THE IF COMMAND)" .PP دستور \fBIF\fR ساختار زیر را دارد: .PP .nf IF expr t-command t-command... ELSE f-command f-command... ENDIF .fi .PP توجه داشته باشید که دستورات برای وضوح بیشتر با تورفتگی نشان داده شده‌اند. همچنین، بخش \fBELSE\fR می‌تواند حذف شود. دستورات \fBIF\fR می‌توانند تا عمق ۶۴، در \fIتمام\fR سطوح INCLUDE به‌صورت تودرتو قرار گیرند. .PP اگر \fIexpr\fR به یک \fBINT\fR غیرصفر، یک \fBDATE\fR که 1990-01-01 نباشد، یک \fBTIME\fR که 00:00 نباشد، یک \fBDATETIME\fR که 1990-01-01@00:00 نباشد، یا یک \fBSTRING\fR غیرخالی (non-null) ارزیابی شود، آن‌گاه بخش \fBIF\fR درست (true) تلقی شده و \fIt-commands\fR اجرا می‌شوند. اگر \fIexpr\fR به صفر یا تهی (null) ارزیابی شود، \fIf-commands\fR (در صورت وجود بخش \fBELSE\fR) اجرا می‌گردند. .PP مثال‌ها: .PP .nf IF defined("want_hols") INCLUDE /usr/share/remind/holidays ENDIF IF today() > '1992/2/10' set missed_ap "You missed it!" ELSE set missed_ap "Still have time..." ENDIF .fi .PP .B "دستور IFTRIG (THE IFTRIG COMMAND)" .PP دستور \fBIFTRIG\fR شبیه به یک دستور \fBIF\fR است، با این تفاوت که یک محرک (trigger) را (مانند دستور \fBREM\fR) محاسبه می‌کند و در صورتی که دستور \fBREM\fR متناظر با آن فعال شود، مقدار درست (true) را ارزیابی می‌کند. مثال‌ها: .PP .nf IFTRIG 1 Nov ; Executed on 1 Nov ELSE ; Executed except on 1 Nov ENDIF IFTRIG 1 \-1 OMIT Sat Sun +4 ; Executed on last working day of month, ; and the 4 working days preceding it ELSE ; Executed except on above days ENDIF .fi .PP توجه داشته باشید که دستور \fBIFTRIG\fR یک تاریخ محرک را محاسبه می‌کند که با تابع \fBtrigdate()\fR قابل بازیابی است. شما می‌توانید از تمامی اجزای عادی محرک، مانند \fBUNTIL\fR، \fIdelta\fR و غیره در دستور \fBIFTRIG\fR استفاده کنید. با این حال، نمی‌توانید از مشخص‌کننده نوع مانند \fBCAL\fR، \fBMSG\fR یا \fBSATISFY\fR استفاده کنید؛ اقدام به چنین کاری خطای تجزیه (parse error) به همراه خواهد داشت. .PP .SH "توابع تعریف‌شده توسط کاربر (USER-DEFINED FUNCTIONS)" .PP علاوه بر توابع داخلی، \fBRemind\fR به شما امکان می‌دهد توابع دلخواه خود را تعریف کنید. دستور \fBFSET\fR این کار را برای شما انجام می‌دهد: .PP \fBFSET\fR \fIfname\fR(\fIargs\fR) \fIexpr\fR .PP \fIFname\fR نام تابع است و از قواعد نام‌گذاری متغیرها پیروی می‌کند. \fIArgs\fR یک فهرست از آرگومان‌ها با جداکننده کاما است و \fIexpr\fR یک عبارت است. \fIexpr\fR در زمان تعریف تابع ارزیابی نمی‌شود؛ در عوض، هر بار که تابع فراخوانی گردد ارزیابی می‌شود. \fIArgs\fR می‌تواند خالی باشد، که در این حالت تابعی تعریف می‌کنید که هیچ پارامتری دریافت نمی‌کند. در اینجا چند مثال آورده شده است: .PP .nf FSET double(x) 2*x FSET yeardiff(date1, date2) year(date1) - year(date2) FSET since(x) ord($Ty \- x) .fi .PP آخرین تابع در یادآورهای سالگرد تولد کاربرد دارد. برای مثال: .PP .nf REM 1 Nov +12 MSG Dean's [since(1984)] birthday is %b. .fi .PP دین (Dean) در سال ۱۹۸۴ متولد شد. مثال بالا در تاریخ ۱ نوامبر ۱۹۹۲ چاپ خواهد کرد: .PP .nf Dean's 8th birthday is today. .fi .PP به‌طور مشابه، این تابع در یادآورهای سالگرد وقایع مفید است. برای مثال: .PP .nf REM 4 June MSG [since(1989)] anniversary of the Tienanmen Square massacre .fi .PP نکات: .TP o اگر در \fIexpr\fR به متغیری دسترسی پیدا کنید که در فهرست آرگومان‌ها نباشد، از مقدار سراسری (global) آن (در صورت وجود) استفاده می‌شود. .TP o نام توابع و پارامترها تا ۶۴ کاراکتر معنادار و متمایز هستند. .TP o تابع \fBvalue()\fR \fIهمیشه\fR به مقدار سراسری یک متغیر دسترسی پیدا می‌کند، حتی اگر هم‌نام با یکی از آرگومان‌ها باشد. برای مثال: .RS .PP .nf fset func(x) value("x") set x 1 set y func(5) .fi .PP توالی بالا مقدار y را برابر با ۱ قرار می‌دهد، که مقدار سراسری x است. .RE .TP o توابع تعریف‌شده توسط کاربر می‌توانند سایر توابع، از جمله سایر توابع تعریف‌شده توسط کاربر را فراخوانی کنند. فراخوانی‌های بازگشتی مجاز هستند، اما باید خاتمه پیدا کنند (به عنوان مثال، با استفاده از یک عملگر یا تابع اتصال کوتاه که بازگشت را قطع می‌کند) وگرنه پس از حداکثر تعداد مشخصی از فراخوانی‌های بازگشتی (به‌طور پیش‌فرض ۱۰۰۰)، خطایی رخ خواهد داد. .TP o اگر یک تابع تعریف‌شده توسط کاربر نامی مشابه یک تابع داخلی داشته باشد، نادیده گرفته شده و تابع داخلی استفاده می‌شود. برای جلوگیری از تداخل با نسخه‌های آینده \fBRemind\fR (که ممکن است توابع داخلی بیشتری تعریف کنند)، شاید مایل باشید نام تمام توابع تعریف‌شده توسط کاربر را با زیرخط (_) آغاز کنید. .TP o اگر یک تابع تعریف‌شده توسط کاربر در بستری تعریف شود که در آن \fBRUN\fR غیرفعال است، هر زمان که آن تابع فراخوانی گردد، در طول ارزیابی آن \fBRUN\fR غیرفعال خواهد بود، \fIحتی اگر\fR از بستری فراخوانی شود که \fBRUN\fR در آن فعال باشد. .PP برای حذف یک تابع تعریف‌شده توسط کاربر، از \fBFUNSET\fR استفاده کنید. این دستور فهرستی از توابع تعریف‌شده توسط کاربر را با فاصله دریافت و حذف می‌کند. برای مثال، پس از دستور: .PP .nf FUNSET myfunc1 otherfunc thirdfunc .fi .PP تضمین می‌شود که هیچ تابع تعریف‌شده توسط کاربری با نام‌های myfunc1، otherfunc یا thirdfunc وجود نخواهد داشت. اگر تلاش کنید یک تابع تعریف‌شده توسط کاربر ناموجود را \fBFUNSET\fR کنید، \fBRemind\fR خطایی صادر نمی‌کند؛ در این حالت تنها هیچ کاری انجام نمی‌دهد. .PP می‌توانید یک تابع تعریف‌شده توسط کاربر را با \fBFRENAME\fR تغییر نام دهید. این دستور دو نام دریافت می‌کند: نام قدیمی و نام جدید. این دستور را در نظر بگیرید: .PP .nf FRENAME func_a func_b .fi .PP اگر \fIfunc_a\fR وجود نداشته باشد، این دستور در صورت تعریف بودن \fIfunc_b\fR، تعریف آن را لغو (unset) می‌کند. با این حال، اگر \fIfunc_a\fR وجود داشته باشد، به \fIfunc_b\fR تغییر نام یافته و \fIfunc_a\fR دیگر تعریف‌شده نخواهد بود. اگر \fIfunc_b\fR پیش از دستور \fBFRENAME\fR تعریف شده بود، آن تعریف قدیمی از بین می‌رود. .PP اگر هر یک از آرگومان‌های دستور \fBFRENAME\fR نام یک تابع داخلی باشد، دستور با یک پیام خطا شکست می‌خورد و کاری انجام نمی‌دهد. .PP اگر یک تابع تعریف‌شده توسط کاربر را تعریف کرده و سپس بعداً مجدداً آن را بازتعریف کنید، \fBRemind\fR یک هشدار صادر خواهد کرد. اگر این هشدار را نمی‌خواهید، پیش از بازتعریف تابع از \fBFUNSET\fR برای حذف تعریف موجود استفاده کنید. از طرف دیگر، می‌توانید مانند مثال زیر از نشانه «-» پیش از نام تابع برای جلوگیری از هشدارهای «redefined function» استفاده کنید: .PP .nf FSET - f(x) 2*x # You must have space before and after the "-" # This will NOT work: # FSET -f(x) 2*x .fi .PP .SH "ذخیره و بازیابی توابع (SAVING AND RESTORING FUNCTIONS)" .PP گاهی اوقات مفید است که یک تابع را برای بلوک خاصی از یادآورها بازتعریف کرده، اما تعریف اصلی آن را در پایان آن بلوک بازیابی کنید. همانند متغیرها، توابع نیز می‌توانند در یک پشته (stack) داخلی قرار داده شوند (push) یا از آن بیرون کشیده شوند (pop). در اینجا یک مثال آورده شده است: .PP .nf PUSH-FUNCS msgprefix FSET msgprefix(x) "My new prefix: " INCLUDE block_of_reminders.rem POP-FUNCS .fi .PP فایل \fBblock_of_reminders.rem\fR با تابع \fBmsgprefix\fR تعریف‌شده در بالا اجرا خواهد شد. پس از POP-FUNCS، تابع \fBmsgprefix\fR به تعریف قبلی خود (در صورت وجود) بازگردانده می‌شود، یا اگر از قبل تعریف نشده بود، به سادگی لغو تعریف (unset) می‌گردد. .PP دستور PUSH-FUNCS فهرستی از نام‌های توابع را با فاصله دریافت می‌کند. تمام توابع تعریف‌شده توسط کاربر نام‌برده در یک پشته داخلی ذخیره خواهند شد. حتی می‌توانید نام‌هایی را در پشته قرار دهید که به عنوان هیچ تابعی تعریف نشده‌اند. .PP پس از اینکه نام یک تابع در پشته قرار گرفت، اگر آن را بازتعریف کنید \fBRemind\fR هشداری صادر نخواهد کرد، زیرا احتمالاً هدف از قرار دادن آن در پشته از همان ابتدا بازتعریف آن بوده است. .PP دستور POP-FUNCS تعاریف تمام توابع تعریف‌شده توسط کاربر در دستور PUSH-FUNCS متناظر را بازیابی می‌کند. اگر توابع تعریف‌نشده در پشته قرار گرفته بودند، POP-FUNCS دوباره آن توابع را تعریف‌نشده می‌کند. در اینجا یک مثال دیگر آورده شده است: .PP .nf FUNSET a FSET b(x) 2*x REM MSG [b(3)] # Outputs 6 PUSH-FUNCS a b FSET a(x) 22*x FSET b(x) 3*x REM MSG [a(3)] [b(3)] # Outputs 66 9 POP-FUNCS REM MSG [a(3)] # Undefined function "a" REM MSG [b(3)] # Outputs 6 .fi .PP .SH "زمان‌بندی دقیق (PRECISE SCHEDULING)" .PP کلیدواژه \fBWARN\fR امکان کنترل دقیق بر هشدار قبلی را به شیوه‌ای انعطاف‌پذیرتر از سازوکار \fIdelta\fR فراهم می‌کند. این کلیدواژه باید با نام یک تابع تعریف‌شده توسط کاربر، یعنی \fIwarn_function\fR، دنبال شود. .PP اگر یک \fIwarn_function\fR ارائه شود، باید یک آرگومان از نوع \fBINT\fR دریافت کند. \fBRemind\fR هرگونه مقدار delta را نادیده می‌گیرد و در عوض \fIwarn_function\fR را به‌طور پیاپی با آرگومان‌های ۱، ۲، ۳ و... فراخوانی می‌کند. .PP مقدار بازگشتی \fIn\fR از تابع \fIwarn_function\fR به شرح زیر تفسیر می‌شود: .TP o اگر \fIn\fR مثبت باشد، یادآور دقیقاً \fIn\fR روز قبل از تاریخ محرک خود فعال می‌شود. .TP o اگر \fIn\fR منفی باشد، یادآور \fIn\fR روز قبل از تاریخ محرک خود فعال می‌شود، \fIبدون احتساب\fR روزهای \fBOMIT\fR (صرف‌نظرشده). .PP به عنوان مثال، فرض کنید می‌خواهید ۵، ۳ و ۱ روز زودتر از روز استقلال آمریکا مطلع شوید. می‌توانید از این دستور استفاده کنید: .PP .nf FSET _wfun(x) choose(x, 5, 3, 1, 0) REM 4 July WARN _wfun MSG American Independence Day is %b. .fi .PP .B "نکات (NOTES)" .TP 1 اگر در حین ارزیابی \fIwarn_function\fR خطایی رخ دهد، آن‌گاه \fBRemind\fR فراخوانی آن را متوقف کرده و یادآور را صرفاً در تاریخ محرک آن صادر می‌کند. .TP 2 اگر قدر مطلق مقادیر بازگشتی \fIwarn_function\fR به‌صورت یکنواخت نزولی (monotonically decreasing) نباشد، \fBRemind\fR فراخوانی آن را متوقف کرده و یادآور را در تاریخ محرک آن صادر می‌کند. .TP 3 تابع \fIwarn_function\fR (از نظر اصول نگارش خوب) باید ۰ را به عنوان مقدار نهایی در دنباله مقادیر بازگشتی خود برگرداند. با این حال، یک یادآور \fIهمیشه\fR در تاریخ محرک خود فعال خواهد شد، صرف‌نظر از اینکه \fIwarn_function\fR چه مقداری برگرداند. .PP مشابه با \fBWARN\fR، کلیدواژه \fBSCHED\fR امکان کنترل دقیق بر زمان‌بندی یادآورهای زمان‌دار را فراهم می‌کند. این کلیدواژه باید با نام یک تابع تعریف‌شده توسط کاربر، \fIsched_function\fR دنبال شود. توجه داشته باشید که اگر از \fBSCHED\fR استفاده کنید، هرگونه مقدار \fItdelta\fR و \fItrep\fR \fIنادیده گرفته می‌شوند\fR. .PP اگر یک تابع زمان‌بندی ارائه شود، باید یک آرگومان از نوع \fBINT\fR دریافت کند. \fBRemind\fR به جای استفاده از زمان \fBAT\fR، \fIdelta\fR زمانی و \fIrepeat\fR زمانی، تابع زمان‌بندی را فراخوانی می‌کند تا مشخص کند چه زمانی یادآور باید فعال شود. اولین باری که یادآور در صف قرار می‌گیرد، تابع زمان‌بندی با آرگومان ۱ فراخوانی می‌شود. هر بار که یادآور فعال می‌شود، با فراخوانی مجدد تابع زمان‌بندی دوباره زمان‌بندی می‌گردد. در هر فراخوانی، آرگومان یک واحد افزایش می‌یابد. .PP مقدار بازگشتی تابع زمان‌بندی باید یک \fBINT\fR یا یک \fBTIME\fR باشد. اگر مقدار بازگشتی یک \fBTIME\fR باشد، یادآور دوباره در صف قرار می‌گیرد تا در آن زمان فعال شود. اگر یک عدد صحیح مثبت \fIn\fR باشد، یادآور دوباره در صف قرار می‌گیرد تا در زمان فعال‌سازی قبلی به‌علاوه \fIn\fR دقیقه فعال شود. در نهایت، اگر یک عدد صحیح منفی یا صفر باشد، آن‌گاه یادآور دوباره در صف قرار می‌گیرد تا \fIn\fR دقیقه پیش از زمان \fBAT\fR فعال شود. توجه داشته باشید که برای انجام هر کاری توسط بند \fBSCHED\fR، حتماً باید یک بند \fBAT\fR وجود داشته باشد. .PP در اینجا یک مثال آورده شده است: .PP .nf FSET _sfun(x) choose(x, \-60, 30, 15, 10, 3, 1, 1, 1, 1, 0) REM AT 13:00 SCHED _sfun MSG foo .fi .PP یادآور ابتدا در ۶۰-۱۳:۰۰ دقیقه، یا در ۱۲:۰۰ فعال خواهد شد. بعد از آن ۳۰ دقیقه بعد، در ۱۲:۳۰ فعال می‌شود. سپس در ۱۲:۴۵، ۱۲:۵۵، ۱۲:۵۸، ۱۲:۵۹، ۱۳:۰۰، ۱۳:۰۱ و ۱۳:۰۲ فعال خواهد شد. .PP .B "نکات (NOTES)" .TP 1 اگر در حین ارزیابی \fIsched_func\fR خطایی رخ دهد، آن‌گاه \fBRemind\fR به استفاده از زمان \fBAT\fR و مقادیر \fIdelta\fR و \fIrepeat\fR بازمی‌گردد و هرگز دوباره \fIsched_func\fR را فراخوانی نمی‌کند. .TP 2 اگر پردازش \fIsched_func\fR زمانی زودتر از زمان فعلی سیستم تولید کند، با افزایش آرگومان به‌طور مکرر فراخوانی می‌شود تا زمانی مقداری بزرگتر یا مساوی با زمان فعلی تولید کند. با این حال، اگر دنباله مقادیر محاسبه‌شده در طول تکرار اکیداً صعودی نباشد، \fBRemind\fR به رفتار پیش‌فرض بازمی‌گردد و هرگز مجدداً \fIsched_func\fR را فراخوانی نمی‌کند. .TP 3 با استفاده از \fIsched_func\fR کاملاً ممکن است یادآور حتی پس از زمان \fBAT\fR همچنان فعال شود. همچنین کاملاً ممکن است هنگام استفاده از تابع زمان‌بندی، یادآور در زمان \fBAT\fR فعال \fIنشود\fR. با این حال، اگر تابع زمان‌بندی شما (به دلایل ۱ و ۲) قبل از زمان \fBAT\fR یادآور خاتمه یابد، در زمان \fBAT\fR فعال \fIخواهد شد\fR، زیرا پردازش عادی کنترل را به دست می‌گیرد. .TP 4 توابع زمان‌بندی شما (از نظر اصول نگارش خوب) وقتی دیگر نیازی به زمان‌بندی نیست باید ۰ را برگردانند. مثال را ببینید. .TP 5 تمام توابع زمان‌بندی \fIپس از\fR خوانده شدن کل اسکریپت Remind ارزیابی می‌شوند. بنابراین هر تعریف تابعی که در پایان اسکریپت برقرار باشد، استفاده خواهد شد. .PP .SH "بند SATISFY (THE SATISFY CLAUSE)" .PP شکل دستور \fBREM\fR که از \fBSATISFY\fR استفاده می‌کند به صورت زیر است: .PP \fBREM\fR \fItrigger\fR \fBSATISFY\fR \fIexpr\fR .PP نحوه کارکرد آن به این صورت است: ابتدا \fBRemind\fR تاریخ محرک را به روش عادی محاسبه می‌کند. سپس، \fBtrigdate()\fR را روی تاریخ محرک محاسبه‌شده تنظیم می‌نماید. پس از آن، \fIexpr\fR را ارزیابی می‌کند. اگر نتیجه، رشته تهی یا صفر نباشد، پردازش پایان می‌یابد. در غیر این صورت، \fBRemind\fR تاریخ محرک بعدی را محاسبه کرده و مجدداً \fIexpr\fR را آزمایش می‌کند. این تکرار تا زمانی ادامه می‌یابد که \fIexpr\fR به مقداری غیرصفر یا غیرخالی ارزیابی شود، یا اینکه سقف تکرار تعیین‌شده با گزینه خط فرمان \fB\-x\fR فرا برسد. .PP اگر \fIexpr\fR ارضا نشود، مقدار \fBtrigvalid()\fR برابر ۰ قرار گرفته و پیام خطای «Can't compute trigger» صادر می‌شود. در غیر این صورت، \fBtrigvalid()\fR برابر ۱ قرار می‌گیرد. .PP این قابلیت تنها زمانی واقعاً مفید است که \fIexpr\fR شامل فراخوانی تابع \fBtrigdate()\fR یا توابع و متغیرهای سیستمی مرتبط باشد؛ در غیر این صورت، با تکرارهای \fBRemind\fR مقدار \fIexpr\fR تغییری نخواهد کرد. در واقع، اگر \fIexpr\fR یک مقدار ثابت نباشد و \fBtrigdate()\fR یا توابع و متغیرهای سیستمی مرتبط را فراخوانی نکند، \fBRemind\fR هشداری صادر خواهد کرد. .PP نمونه‌ای از کاربرد \fBSATISFY\fR: فرض کنید می‌خواهید از هر جمعه سیزدهم (Friday the 13th) مطلع شوید. اولین تلاش شما ممکن است به این صورت باشد: .PP .nf # WRONG! REM Fri 13 +2 MSG Friday the 13th is %b. .fi .PP اما این دستور کار نخواهد کرد. این یادآور در نخستین جمعه در تاریخ سیزدهم یا پس از سیزدهم هر ماه فعال می‌شود. راه صحیح انجام آن با استفاده از یک توالی پیچیده‌تر است: .PP .nf REM 13 SATISFY wkdaynum(trigdate()) == 5 IF trigvalid() REM [trigdate()] +2 MSG \\ Friday the 13th is %b. ENDIF .fi .PP می‌توانید دستور REM را کمی فشرده‌تر بنویسید: .PP .nf REM 13 SATISFY $Tw == 5 .fi .PP بیایید ببینیم این دستور چگونه کار می‌کند. بند \fBSATISFY\fR در میان تمام سیزدهم‌های ماه‌های متوالی تکرار می‌شود، تا زمانی که تاریخ محرکی پیدا شود که روز هفته آن جمعه باشد (== 5). اگر تاریخ معتبری یافت شد، از تاریخ محرک محاسبه‌شده برای تنظیم یادآور بعدی استفاده می‌کنیم. .PP همچنین می‌توانستیم بنویسیم: .PP .nf REM Fri SATISFY day(trigdate()) == 13 .fi .PP اما این امر منجر به تکرارهای بیشتری می‌شود، چرا که «جمعه‌ها» بیشتر از «سیزدهم‌های ماه» رخ می‌دهند. .PP در اینجا مثال دیگری آورده شده است: فرض کنید می‌خواهید در پانزدهم ژانویه، آوریل، ژوئیه و اکتبر موضوعی به شما یادآوری شود. می‌توانید چهار یادآور جداگانه بسازید، یا می‌توانید از این دستور استفاده کنید: .PP .nf REM 15 SATISFY [isany($Tm, 1, 4, 7, 10)] MSG 15th Reminder! .fi .PP این تکنیک استفاده از یک دستور \fBREM\fR برای محاسبه تاریخ محرک جهت استفاده در دستوری دیگر بسیار قدرتمند است. برای مثال، فرض کنید می‌خواهید روز کارگر (Labour Day) را که نخستین دوشنبه ماه سپتامبر است \fBOMIT\fR کنید. می‌توانید از دستورات زیر استفاده کنید: .PP .nf # Note: SATISFY 1 is an idiom for "do nothing" REM Mon 1 Sept SATISFY 1 OMIT [trigdate()] .fi .PP \fBهشدار (CAVEAT):\fR این کار \fIتنها\fR روز کارگر \fIبعدی\fR را حذف می‌کند، نه تمام روزهای کارگر در آینده را. این امر می‌تواند نتایج عجیبی ایجاد کند، زیرا زمینه \fBOMIT\fR می‌تواند بسته به تاریخ جاری تغییر کند. برای مثال، اگر پس از دستورات بالا از دستور زیر استفاده کنید: .PP .nf REM Mon AFTER msg hello .fi .PP نتیجه آن‌گونه که انتظار دارید نخواهد بود. تولید تقویم برای سپتامبر ۱۹۹۲ را در نظر بگیرید. روز کارگر در دوشنبه، ۷ سپتامبر ۱۹۹۲ بود. با این حال، هنگامی که \fBRemind\fR به محاسبه محرک برای سه‌شنبه، ۸ سپتامبر ۱۹۹۲ می‌رسد، دستور \fBOMIT\fR اکنون روز کارگر را برای سال ۱۹۹۳ نادیده می‌گیرد و دستور «Mon AFTER» فعال نخواهد شد. (اما توضیحات \fBSCANFROM\fR را در بخش «جزئیات درباره محاسبه محرک (DETAILS ABOUT TRIGGER COMPUTATION)» ببینید). .PP احتمالاً بهتر است از محاسبه تاریخ‌های محرک \fBOMIT\fR دوری کنید مگر اینکه این دام‌ها را به خاطر داشته باشید. .PP در نسخه‌های \fBRemind\fR از 03.00.07 به بعد، می‌توانید یک بند \fBMSG\fR، \fBRUN\fR و غیره را در بند \fBSATISFY\fR به صورت زیر بگنجانید: .PP .nf REM trigger_stuff SATISFY [expr] MSG body .fi .PP توجه داشته باشید که تنها برای این حالت، \fIexpr\fR پس از \fBSATISFY\fR \fIباید\fR در براکت‌های مربع قرار گیرد. این عبارت باید پس از تمام اجزای دیگر محرک، و بلافاصله قبل از کلیدواژه \fBMSG\fR، \fBRUN\fR و غیره بیاید. اگر \fIexpr\fR ارضا نشود، یادآور فعال نمی‌شود. .PP بدین ترتیب، مثال «جمعه سیزدهم» را می‌توان به‌طور فشرده‌تر به صورت زیر بیان کرد: .PP .nf REM 13 +2 SATISFY [$Tw == 5] MSG Friday the 13th is %b. .fi .PP و می‌توانید یادآوری را در روزهای دوشنبه، چهارشنبه و پنج‌شنبه که در روزهای فرد ماه واقع می‌شوند با دستور زیر فعال کنید: .PP .nf REM Mon Wed Thu SATISFY [$Td %2 ] MSG Here it is!!! .fi .PP توجه داشته باشید که اغلب می‌توان از \fBSATISFY\fR و \fBOMITFUNC\fR برای حل یک مسئله یکسان، هرچند به روش‌های متفاوت، استفاده کرد. گاهی اوقات استفاده از \fBSATISFY\fR تمیزتر است و گاهی \fBOMITFUNC\fR؛ آزمایش کنید و از هر کدام که واضح‌تر به نظر می‌رسد استفاده نمایید. .PP .SH "محرک‌های احتمالا غیرقابل محاسبه (POSSIBLY-UNCOMPUTABLE TRIGGERS)" .PP گاهی اوقات ممکن است بخواهید هشدارهای «Can't compute trigger» را برای یادآورهایی که تاریخ محرک آن‌ها قابل محاسبه نیست، متوقف کنید. برای مثال، یادآور زیر در روز دوشنبه‌ای که تعطیل رسمی نیست فعال می‌شود، مشروط بر اینکه سه‌شنبه بعدی یک روز تعطیل باشد: .PP .nf REM Mon SKIP SATISFY [isomitted($T+1)] MSG Work between holidays .fi .PP با این حال، اگر بعد از تاریخ امروز هیچ دوشنبه‌ای وجود نداشته باشد که این شرط را برآورده کند، \fBRemind\fR خطای «Can't compute trigger» را چاپ خواهد کرد. برای سرکوب این خطا، از کلیدواژه \fBMAYBE-UNCOMPUTABLE\fR استفاده کنید: .PP .nf REM MAYBE-UNCOMPUTABLE Mon SKIP SATISFY [isomitted($T+1)] MSG Work between holidays .fi .PP تقریباً هیچ‌گاه استفاده از \fBMAYBE-UNCOMPUTABLE\fR مناسب نیست، اما برای آن موقعیت‌های نادری که کاربرد دارد ارائه شده است. اگر از \fBMAYBE-UNCOMPUTABLE\fR در داخل تابع \fBevaltrig()\fR استفاده کنید، محرک‌های غیرقابل فعال‌سازی مقدار -1 برمی‌گردانند. برای مثال: .PP .nf SET a evaltrig("MAYBE-UNCOMPUTABLE Mon SKIP OMIT Mon") .fi .PP مقدار a را برابر -1 قرار می‌دهد. .SH "اشکال‌زدایی اسکریپت‌های یادآوری (DEBUGGING REMINDER SCRIPTS)" .PP اگرچه گزینه خط فرمان .B \-d برای اشکال‌زدایی مفید است، اما اغلب زیاده‌روی به شمار می‌رود. به عنوان مثال، اگر گزینه .B \-dx را برای یک فایل یادآوری با عبارت‌های پیچیده متعدد فعال کنید، حجم بسیار زیادی از خروجی دریافت خواهید کرد. دستور .B DEBUG به شما امکان می‌دهد نشانگرهای اشکال‌زدایی را تحت کنترل برنامه مدیریت کنید. قالب آن به این صورت است: .PP \fBDEBUG\fR [+\fIflagson\fR] [\-\fIflagsoff\fR] .PP مقدارهای \fIflagson\fR و \fIflagsoff\fR شامل رشته‌هایی از نویسه‌های «shextvlfqnu» هستند که با گزینه‌های اشکال‌زدایی مورد بحث در بخش گزینه‌های خط فرمان مطابقت دارند. اگر پیش از آن‌ها یک «+» بیاید، گروه متناظر از گزینه‌های اشکال‌زدایی روشن می‌شوند. در غیر این صورت، خاموش می‌شوند. به عنوان مثال، می‌توانید از این توالی برای اشکال‌زدایی یک عبارت پیچیده استفاده کنید: .PP .nf DEBUG +x set a very_complex_expression(many_args) DEBUG \-x .fi .PP .B "دستور DUMPVARS (THE DUMPVARS COMMAND)" .PP دستور .B DUMPVARS مقادیر متغیرهای موجود در حافظه را نمایش می‌دهد. قالب آن به این صورت است: .PP \fBDUMPVARS\fR [\fB\-c\fR] [\fIvar\fR...] .PP اگر فهرستی از نام‌های متغیرها را که با فاصله جدا شده‌اند ارائه دهید، متغیرهای متناظر نمایش داده می‌شوند. اگر فهرستی از متغیرها ارائه ندهید، تمام متغیرهای موجود در حافظه نمایش داده می‌شوند. برای تخلیه (dump) یک متغیر سیستمی، نام آن را در فهرست متغیرها قرار دهید. اگر فقط یک علامت دلار تنها را در فهرست متغیرها بگذارید، تمام متغیرهای سیستمی تخلیه خواهند شد. .PP اگر پرچم .B \-c را مشخص کنید، پس از مقدار هر متغیری که ثابت (constant) تشخیص داده شود، عبارت «» درج خواهد شد. .PP .B "دستور ERRMSG (THE ERRMSG COMMAND)" .PP دستور .B ERRMSG دارای قالب زیر است: .PP \fBERRMSG\fR \fIbody\fR .PP مقدار \fIbody\fR از فیلتر جایگزینی (با تاریخ راه‌انداز ضمنی \fBtoday()\fR) عبور داده شده و در جریان خروجی خطای استاندارد چاپ می‌شود. مثال: .PP .nf IF !defined("critical_var") ERRMSG You must supply a value for "critical_var" EXIT ENDIF .fi .PP .B "دستور EXIT (THE EXIT COMMAND)" .PP مثال بالا همچنین نحوه استفاده از دستور .B EXIT را نشان می‌دهد. این دستور موجب خروج بدون قید و شرط از پردازش اسکریپت می‌شود. تمامی یادآوری‌های زمان‌بندی‌شده موجود در صف دور انداخته می‌شوند. اگر در حالت تقویم (که در ادامه توضیح داده شده) باشید، پردازش تقویم متوقف می‌گردد. .PP اگر یک عبارت از نوع .B INT بعد از دستور .B EXIT ارائه دهید، آن مقدار به عنوان وضعیت خروج به برنامه فراخواننده بازگردانده می‌شود. در غیر این صورت، وضعیت خروج ۹۹ بازگردانده خواهد شد. .PP .B "دستور FLUSH (THE FLUSH COMMAND)" .PP این دستور به سادگی شامل کلمه .B FLUSH در یک خط به تنهایی است. این دستور جریان‌های خروجی استاندارد و خطای استاندارد مورد استفاده توسط .B Remind را تخلیه (flush) می‌کند. این قابلیت برای اکثر افراد کاربرد چندانی ندارد، اما اگر .B Remind را به عنوان یک زیرپردازش از برنامه‌ای دیگر اجرا کنید و بخواهید از لوله‌ها (pipes) برای ارتباط استفاده نمایید، می‌تواند مفید باشد. .PP .SH "خروجی JSON حالت آگندا (AGENDA MODE JSON OUTPUT)" .PP اگر آرگومان .B \-\-json را مشخص کنید، .B Remind به جای خروجی متنی عادی، خروجی JSON تولید می‌کند. خروجی JSON شامل یک آرایه JSON منفرد از صفر یا چند شیء است. سه نوع شیء ممکن در این آرایه وجود دارد: .TP .B banner شیء .B banner در صورت وجود، اولین شیء در آرایه خواهد بود. حداکثر یک شیء .B banner وجود خواهد داشت. این شیء حاوی یک کلید واحد به نام .B banner است که مقدار آن بنری است که .B Remind به‌طور معمول در حالت آگندا چاپ می‌کند. .TP .B noreminders شیء .B noreminders در صورت وجود، آخرین شیء در آرایه خواهد بود. حداکثر یک شیء .B noreminders وجود خواهد داشت. این شیء حاوی یک کلید واحد به نام .B noreminders است که مقدار آن عبارت «No reminders.» است (که ممکن است به زبان دیگری بومی‌سازی شده باشد). .TP .B event سایر اشیاء موجود در آرایه از نوع اشیاء .B event هستند. آن‌ها اشیاء JSON هستند که شامل تمامی کلیدهای توصیف‌شده در بخش «CALENDAR ENTRIES» از صفحه راهنمای .BR rem2ps (1) می‌باشند. با این حال، کلیدهای .BR calendar_body ، .B plain_body و .B raw_body وجود نخواهند داشت. .PP خروجی JSON می‌تواند توسط یک رابط کاربری برای نمایش یک فهرست جذاب از یادآوری‌ها در حالت آگندا استفاده شود. ویژگی «show today's reminders» در .B tkremind از این خروجی JSON استفاده می‌کند. .PP .SH "حالت تقویم (CALENDAR MODE)" .PP اگر گزینه خط فرمان .BR \-c ، .B \-s یا .B \-p را مشخص کنید، .B Remind در «حالت تقویم» اجرا می‌شود. در این حالت، .B Remind اسکریپت را به صورت مکرر تفسیر می‌کند و برای هر روز در تقویم، یک دور پیمایش کامل روی کل فایل انجام می‌دهد. یادآوری‌هایی که فعال (راه‌اندازی) می‌شوند در بافرهای داخلی ذخیره شده و سپس در مکان‌های مناسب در تقویم درج می‌گردند. .PP اگر گزینه .B \-a را نیز تعیین کنید، .B Remind یادآوری‌های زمان‌بندی‌شده را در تقویم لحاظ نخواهد کرد. .PP گزینه .B \-p به همراه برنامه .B Rem2PS برای تولید یک تقویم در قالب PostScript استفاده می‌شود. به عنوان مثال، دستور زیر کد PostScript را به خروجی استاندارد ارسال می‌کند: .PP .nf remind \-p .reminders | rem2ps .fi .PP می‌توانید با هدایت (pipe) این خروجی به دستور .BR lpr ، یک تقویم PostScript را چاپ کنید. .PP اگر یک اسکریپت یادآوری به نام «.reminders» داشته باشید و این دستور را اجرا کنید: .PP .nf remind \-c .reminders jan 1993 .fi .PP آنگاه .B Remind اسکریپت را ۳۱ بار اجرا می‌کند؛ یک بار برای هر روز در ماه ژانویه. هر بار که اسکریپت را اجرا می‌کند، مقدار .B today() را یکی افزایش می‌دهد. هر یادآوری که تاریخ راه‌انداز آن با .B today() مطابقت داشته باشد، وارد تقویم می‌شود. .PP یادآوری‌های نوع .B MSG و .BR CAL ، به‌طور پیش‌فرض کل بدنه آن‌ها در تقویم درج می‌شود. یادآوری‌های نوع .B RUN به‌طور معمول در تقویم درج نمی‌شوند. با این حال، اگر بخشی از بدنه را در توالی %"...%" محصور کنید، فقط همان بخش درج می‌شود. به عنوان مثال، مورد زیر را در نظر بگیرید: .PP .nf REM 6 Jan MSG %"Dianne's birthday%" is %b .fi .PP در حالت آگندا، .B Remind در روز ۶ ژانویه عبارت «Dianne's birthday is today» را چاپ می‌کند. با این حال، در حالت تقویم، تنها متن «Dianne's birthday» در خانه مربوط به ۶ ژانویه درج می‌شود. .PP اگر صریحاً از توالی %"...%" در یک یادآوری نوع .B RUN استفاده کنید، متن بین جداکننده‌ها در تقویم درج می‌شود. اگر از توالی %"%" در یک یادآوری نوع .B MSG یا .B CAL استفاده کنید، هیچ ورودی تقویمی برای آن یادآوری تولید نخواهد شد. .PP .B "حفظ متغیرها (PRESERVING VARIABLES)" .PP از آنجا که .B Remind برای هر روز در تقویم اسکریپت را تکرار می‌کند، عملیات کند ممکن است سرعت تولید تقویم را به شدت کاهش دهد. .PP به عنوان مثال، فرض کنید متغیرهای «me» و «hostname» را به این صورت مقداردهی کرده‌اید: .PP .nf SET me shell("whoami") SET hostname shell("hostname") .fi .PP به‌طور معمول، .B Remind تمام متغیرها را بین تکرارها در حالت تقویم و همچنین در صورت ارائه پارامتر '*N' در خط فرمان پاک می‌کند. با این حال، اگر محاسبه برخی متغیرها زمان‌بر است و بین تکرارها تغییر نمی‌کنند، می‌توانید مقادیر آن‌ها را با دستور .B PRESERVE «حفظ» کنید. همچنین از آنجا که تعاریف توابع بین تکرارها حفظ می‌شوند، نیازی به تعریف مجدد آن‌ها در هر تکرار نیست. بنابراین، می‌توانید از توالی زیر استفاده کنید: .PP .nf IF ! defined("initialized") set initialized 1 set me shell("whoami") set hostname shell("hostname") fset func(x) complex_expr preserve initialized me hostname ENDIF .fi .PP نحوه عملکرد به این صورت است: در اولین دور اجرای اسکریپت، متغیر «initialized» تعریف نشده است. بنابراین، دستورات بین .B IF و .B ENDIF اجرا می‌شوند. دستور .B PRESERVE تضمین می‌کند که مقادیر initialized، me و hostname برای تکرارهای بعدی حفظ شوند. در تکرار بعدی، دستورات نادیده گرفته می‌شوند، زیرا initialized همچنان تعریف‌شده باقی مانده است. بدین ترتیب، عملیات زمان‌بری که به مقدار .B today() وابسته نیستند، فقط یک بار انجام می‌شوند. .PP بیشتر متغیرهای سیستمی (آن‌هایی که نامشان با '$' شروع می‌شود) به‌طور خودکار بین تکرارهای تقویم حفظ می‌شوند. .PP توجه داشته باشید که برای افزایش کارایی، .B Remind هنگام تولید تقویم، اسکریپت یادآوری (و هر فایل .BR INCLUDE ‌شده) را در حافظه موقت (کش) نگه می‌دارد. .PP یادآوری‌های زمان‌بندی‌شده مرتب شده و به ترتیب زمانی در تقویم قرار می‌گیرند. پس از آن‌ها، یادآوری‌های بدون زمان قرار می‌گیرند. .B Remind به‌طور خودکار زمان یادآوری‌های زمان‌بندی‌شده را مطابق با گزینه خط فرمان .B \-b در تقویم قرار می‌دهد. یادآوری‌ها در حالت تقویم به گونه‌ای مرتب می‌شوند که گویی از گزینه .B \-g استفاده شده است؛ شما می‌توانید با استفاده صریح از گزینه .B \-g ترتیب مرتب‌سازی متفاوتی را نسبت به حالت پیش‌فرض تعیین کنید. .PP .B "اجرای مکرر (REPEATED EXECUTION)" .PP اگر یک پارامتر \fIrepeat\fR در خط فرمان مشخص کنید و از گزینه‌های .BR \-c ، .B \-p یا .B \-s استفاده نکنید، .B Remind به شیوه‌ای مشابه حالت تقویم عمل می‌کند. این برنامه اسکریپت یادآوری را مکرراً اجرا می‌کند و با هر تکرار مقدار .B today() را افزایش می‌دهد. همان قوانین مربوط به حفظ متغیرها و تعاریف توابع در اینجا نیز اعمال می‌شوند. توجه داشته باشید که استفاده از \fIrepeat\fR در خط فرمان همچنین گزینه .B \-q را فعال و هرگونه گزینه .B \-z را غیرفعال می‌کند. به عنوان مثال، اگر می‌خواهید ببینید .B Remind در هفته آینده چگونه رفتار خواهد کرد، می‌توانید تایپ کنید: .PP .nf remind .reminders '*7' .fi .PP اگر می‌خواهید تاریخ‌های ۱۰۰۰ روز آینده را چاپ کنید، از دستور زیر استفاده نمایید: .PP .nf (echo 'banner %'; echo 'msg [today()]%') | remind - '*1000' .fi .PP .SH "مقداردهی اولیه متغیرها در خط فرمان (INITIALIZING VARIABLES ON THE COMMAND LINE)" .PP گزینه .B \-i برای مقداردهی اولیه متغیرها در خط فرمان .B Remind استفاده می‌شود. قالب آن به صورت \fB\-i\fR\fIvar\fR\fB=\fR\fIexpr\fR است، که در آن \fIexpr\fR هر عبارت معتبری می‌باشد. توجه داشته باشید که ممکن است لازم باشد از نقل‌قول یا نویسه‌های گریز (escapes) استفاده کنید تا از تفسیر نویسه‌های خاص در \fIexpr\fR توسط پوسته جلوگیری شود. شما می‌توانید به هر تعداد که می‌خواهید از گزینه .B \-i در خط فرمان استفاده کنید و آن‌ها به ترتیب پردازش می‌شوند. بنابراین، اگر متغیری در یک گزینه .B \-i تعریف شود، در گزینه‌های بعدی .B \-i قابل ارجاع خواهد بود. .PP توجه داشته باشید که اگر تاریخی را در خط فرمان وارد کنید، تا زمانی که تمام گزینه‌ها پردازش نشوند، تجزیه نخواهد شد. بنابراین، اگر از .B today() در هر یک از عبارت‌های .B \-i استفاده کنید، همان مقدار .B realtoday() را بازمی‌گرداند و نه تاریخی که در خط فرمان وارد شده است. .PP هر متغیری که در خط فرمان تعریف شود، همانند دستور .B PRESERVE «حفظ» (\fBpreserved\fR) می‌شود. .PP نباید هیچ فاصله‌ای بین گزینه .B \-i و علامت مساوی وجود داشته باشد؛ در غیر این صورت، نام‌های متغیر عجیبی ایجاد می‌شوند که فقط با توابع .B value() یا .B defined() قابل دسترسی خواهند بود. .PP شما همچنین می‌توانید با استفاده از ساختار زیر، یک تابع را در خط فرمان تعریف کنید: .PP \fB\-i\fR\fIfunc\fR(\fIargs\fR)=\fIdefinition\fR .PP حتماً از نویسه‌های خاص در برابر تفسیر پوسته محافظت کنید. .SH "اطلاعات بیشتر درباره پست‌اسکریپت (MORE ABOUT POSTSCRIPT)" .PP یادآوری‌های نوع .B PS و .B PSFILE کد PostScript را مستقیماً به چاپگر ارسال می‌کنند. تفاوت آن‌ها در این است که یادآوری نوع .B PS بدنه خود را مستقیماً به خروجی PostScript منتقل می‌کند (پس از پردازش توسط فیلتر جایگزینی)، در حالی که بدنه نوع .B PSFILE باید صرفاً شامل یک نام فایل باشد. برنامه .B Rem2PS فایل نام‌برده در یادآوری نوع .B PSFILE را باز کرده و محتویات آن را در خروجی PostScript می‌گنجاند. .PP یادآوری‌های نوع PostScript برای یک روز مشخص، بر اساس ترتیب اولویت مرتب شده و در خروجی PostScript گنجانده می‌شوند. توجه داشته باشید که ترتیب دستورات PostScript تأثیر \fIبسیار مهمی\fR بر ظاهر تقویم‌ها دارد. به عنوان مثال، کد PostScript برای سایه‌زدن یک خانه تقویم، اگر کد رسم نماد ماه قبل از آن در تقویم قرار گرفته باشد، نماد ماه را محو خواهد کرد. به همین دلیل، نباید به یادآوری‌های نوع .B PS یا .B PSFILE اولویت اختصاص دهید؛ در عوض، باید اطمینان حاصل کنید که آن‌ها به ترتیب درست در اسکریپت یادآوری ظاهر شوند. کد PostScript باید اشیاء را از پس‌زمینه به سمت پیش‌زمینه رسم کند، تا اشیاء پیش‌زمینه به درستی روی اشیاء پس‌زمینه قرار گیرند. اگر این یادآوری‌ها را اولویت‌بندی کنید و اسکریپت را با ترتیب نزولی اولویت‌ها اجرا نمایید، خروجی PostScript به درستی کار نخواهد کرد. .PP تمامی کدهای PostScript برای یک تاریخ مشخص در یک جفت .BR save \- restore محصور می‌شوند. با این حال، اگر چندین یادآوری نوع PostScript برای یک روز فعال شوند، هر بخش از PostScript در یک جفت .BR save \- restore جداگانه قرار نمی‌گیرد؛ بلکه کل بدنه PostScript گنجانده‌شده در یک جفت محصور می‌شود. .PP یادآوری‌های نوع PostScript توسط چاپگر PostScript قبل از هر ورودی عادی تقویم اجرا می‌شوند. بنابراین، ورودی‌های عادی تقویم روی یادآوری‌های نوع PostScript قرار می‌گیرند و به شما امکان می‌دهند پس‌زمینه‌های سایه‌دار یا گرافیکی برای روزهای خاص ایجاد کنید. .PP پیش از اجرای کد PostScript شما، مبدأ مختصات سیستم PostScript در گوشه پایین سمت چپ «خانه» متناظر با .B today() در تقویم قرار می‌گیرد. این مکان دقیقاً در مرکز تقاطع خطوط سیاه پایینی و چپ تعیین‌کننده خانه قرار دارد؛ ممکن است هنگام محاسبه موقعیت‌ها لازم باشد ضخامت این خطوط را در نظر بگیرید. .PP چندین متغیر PostScript برای کد PostScript ارائه‌شده توسط شما در دسترس است. تمام متغیرهای فاصله و اندازه بر حسب واحدهای PostScript (یک هفتاد و دوم اینچ) هستند. این متغیرها عبارتند از: .TP LineWidth عرض خطوط شبکه سیاه که تقویم را تشکیل می‌دهند. .TP Border حاشیه بین مرکز خطوط شبکه و فضای مورد استفاده برای چاپ ورودی‌های تقویم. این حاشیه معمولاً فضای خالی است. .TP BoxWidth and BoxHeight عرض و ارتفاع خانه تقویم، از مرکز تا مرکز خطوط شبکه سیاه. .TP InBoxHeight ارتفاع از مرکز خط شبکه سیاه پایینی تا بالای ناحیه ورودی‌های تقویم عادی. فضای بین این نقطه تا بالای خانه تنها برای رسم شماره روز استفاده می‌شود. .TP /DayFont, /EntryFont, /SmallFont, /TitleFont and /HeadFont قلم‌های مورد استفاده برای رسم شماره‌های روز، ورودی‌های تقویم، تقویم‌های کوچک، عنوان تقویم (ماه، سال) و سرستون‌های روزهای هفته، به ترتیب. .TP DaySize, EntrySize, TitleSize and HeadSize اندازه قلم‌های فوق. (اندازه قلم تقویم کوچک در اینجا تعریف \fIنشده\fR است.) به عنوان مثال، اگر می‌خواهید تاریخ عبری را در کنار شماره روز عادی در تقویم چاپ کنید، از دستور زیر استفاده کنید: .PP .nf REM PS Border BoxHeight Border sub DaySize sub moveto \\ /DayFont findfont DaySize scalefont setfont \\ ([hebday(today())] [hebmon(today())]) show .fi .PP .RS توجه کنید که چگونه از DaySize و /DayFont استفاده شده است. .RE .PP توجه داشته باشید که اگر کد PostScript ارائه دهید، ممکن است فایل‌های PostScript نامعتبر تولید شوند. همیشه قبل از ارسال PostScript به چاپگر، آن را به طور کامل با یک نمایشگر PostScript آزمایش کنید. شما نباید از هیچ‌گونه کامنت ساختاردهی سند در کد PostScript خود استفاده کنید. .PP .SH "حالت دیمن (DAEMON MODE)" .PP اگر از گزینه خط فرمان .B \-z استفاده کنید، .B Remind در «حالت دیمن» اجرا می‌شود. در این حالت، هیچ یادآوری «عادی» صادر نمی‌شود. در عوض، تنها یادآوری‌های زمان‌بندی‌شده جمع‌آوری شده و در صف قرار می‌گیرند، و سپس هر زمان که به زمان راه‌انداز خود برسند، صادر می‌شوند. .PP علاوه بر این، .B Remind هر چند دقیقه یک‌بار بیدار می‌شود تا تاریخ تغییر اسکریپت یادآوری (نام فایل ارائه‌شده در خط فرمان) را بررسی کند. اگر .B Remind تشخیص دهد که اسکریپت تغییر کرده است، خود را مجدداً در حالت دیمن اجرا کرده و اسکریپت تغییریافته را تفسیر می‌کند. اگر .B Remind با پشتیبانی از .BR inotify (7) کامپایل شده باشد و اسکریپت یادآوری خط فرمان در واقع یک پوشه باشد، .B Remind در صورت تغییر هر یک از فایل‌های درون آن پوشه نیز خود را مجدداً اجرا می‌کند. .PP در حالت دیمن، .B Remind همچنین هنگامی که تشخیص دهد تاریخ سیستم تغییر کرده است، اسکریپت یادآوری را دوباره می‌خواند. .PP در حالت دیمن، .B Remind به گونه‌ای عمل می‌کند که گویی از گزینه .B \-f استفاده شده است؛ بنابراین برای اجرای حالت دیمن در پس‌زمینه، از دستور زیر استفاده کنید: .PP .nf remind \-z .reminders & .fi .PP اگر از .B sh یا .B bash استفاده می‌کنید، ممکن است مجبور شوید از دستور «nohup» استفاده کنید تا مطمئن شوید با خروج شما از سیستم (log out)، دیمن متوقف نمی‌شود. .PP .SH "حالت پاکسازی (PURGE MODE)" .PP اگر گزینه خط فرمان .B \-j را مشخص کنید، .B Remind در \fIحالت پاکسازی\fR (purge mode) اجرا می‌شود. در این حالت، برنامه تلاش می‌کند یادآوری‌های منقضی‌شده را از فایل‌های یادآوری شما پاکسازی کند. .PP در حالت پاکسازی، .B Remind فایل یادآوری شما را می‌خواند و با افزودن پسوند «.purged» به نام فایل اصلی، یک فایل جدید ایجاد می‌کند. توجه داشته باشید که .B Remind \fIهرگز\fR فایل اصلی شما را ویرایش نمی‌کند؛ بلکه همیشه یک فایل .purged جدید می‌سازد. .PP اگر .B Remind را به جای یک فایل روی یک پوشه اجرا کنید، برای هر فایل *.rem در آن پوشه یک فایل .purged ایجاد می‌شود. .PP به‌طور معمول، .B Remind برای فایل‌های ضمیمه‌شده (INCLUDE) فایل‌های .purged ایجاد نمی‌کند. با این حال، اگر یک آرگومان عددی بعد از .B \-j وارد کنید، .B Remind فایل‌های .purged را برای سطح مشخص‌شده از INCLUDE ایجاد خواهد کرد. به عنوان مثال، اگر .B Remind را با آرگومان .B \-j2 اجرا کنید، فایل‌های .purged برای فایل (یا پوشه) مشخص‌شده در خط فرمان، تمام فایل‌های ضمیمه‌شده توسط آن‌ها، و تمام فایل‌های ضمیمه‌شده توسط آن فایل‌ها ایجاد خواهند شد. اما فایل‌های .purged برای سطوح سوم یا بالاتر INCLUDE ایجاد نخواهند شد. .PP تشخیص اینکه کدام یادآوری‌ها منقضی شده‌اند بسیار دشوار و پیچیده است. .B Remind تمام تلاش خود را می‌کند، اما شما همیشه باید فایل .purged را با فایل اصلی مقایسه کنید و تغییرات را به صورت دستی ادغام (hand-merge) نمایید. .PP برنامه .B Remind فایل .purged را به صورت زیر یادداشت‌گذاری می‌کند: .PP یک یادآوری منقضی‌شده با پیشوند زیر مشخص می‌شود: #!P: Expired: .PP در شرایطی که .B Remind نتواند با اطمینان تشخیص دهد که چیزی منقضی شده است یا خیر، ممکن است نظرات زیر را قبل از خط مشکل‌دار مشاهده کنید: .PP .nf #!P: Cannot purge SATISFY-type reminders #!P: The next IF evaluated false... #!P: REM statements in IF block not checked for purging. #!P: The previous IF evaluated true. #!P: REM statements in ELSE block not checked for purging #!P: The next IFTRIG did not trigger. #!P: REM statements in IFTRIG block not checked for purging. #!P: Next line has expired, but contains expression... please verify #!P: Next line may have expired, but contains non-constant expression #!P: or a relative SCANFROM clause #!P! Could not parse next line: Some-Error-Message-Here #!P! Problem calculating trigger date .fi .PP برنامه .B Remind همیشه خطوط یادداشت‌گذاری فایل‌های .purged را با «#!P» آغاز می‌کند. اگر چنین خطوطی در فایل \fIاصلی\fR وجود داشته باشند، در فایل .purged کپی نمی‌شوند. .PP اگر از پرچم سکوت (Hush) .B \-h به همراه پرچم پاکسازی (Purge) .B \-j استفاده کنید، آنگاه .B Remind \fIهیچ‌یک\fR از نظرات تشخیصی فهرست‌شده در بالا را ایجاد نمی‌کند. در عوض، تنها تغییری که در فایل .purged ایجاد می‌کند، علامت‌گذاری یادآوری‌های منقضی‌شده با «#!P: Expired» است. .PP .SH "عبارت‌های غیرثابت (NON-CONSTANT EXPRESSIONS)" .PP در حالت پاکسازی، اگر مشخصه راه‌انداز یک دستور REM حاوی یک عبارت غیرثابت باشد، .B Remind آن را به عنوان منقضی‌شده علامت‌گذاری نمی‌کند. یک عبارت غیرثابت به عنوان عبارتی تعریف می‌شود که مقدار آن ممکن است از یک اجرا تا اجرای دیگر متفاوت باشد، معمولاً به این دلیل که به تاریخ فعلی بستگی دارد، اما همچنین اگر به چیزی از محیط وابسته باشد (مانند خروجی تابع .BR shell() ). .PP استفاده از هر یک از موارد زیر در یک عبارت باعث می‌شود که .B Remind آن را غیرثابت در نظر بگیرد: .RS .TP .B o یک متغیر سراسری که نتیجه یک عبارت غیرثابت به آن تخصیص داده شده است، یا در یک \fIزمینه غیرثابت\fR (که بعداً توضیح داده می‌شود) مقداری به آن اختصاص یافته باشد. .TP .B o یک متغیر سیستمی .TP .B o برخی توابع توکار که به تاریخ فعلی (برای مثال، .BR today() ) یا محیط (برای مثال، .BR shell() ) وابسته‌اند. .RE .PP علاوه بر این، به منظور منقضی کردن ایمن یادآوری‌ها در حالت پاکسازی، .B Remind موارد زیر را نیز غیرثابت در نظر می‌گیرد: .RS .TP .B o استفاده از یک OMITFUNC .TP .B o استفاده از یک SCANFROM نسبی .RE .PP هر زمان که مقداری به یک متغیر تخصیص داده می‌شود، .B Remind ثابت یا غیرثابت بودن عبارتی که مقدار آن اختصاص یافته را ردیابی می‌کند. علاوه بر این، متغیرهایی که در یک زمینه غیرثابت مقداردهی می‌شوند، همیشه غیرثابت فرض می‌گردند. یک زمینه غیرثابت کدی در محدوده یک دستور .B IF است که در آن عبارت .B IF غیرثابت باشد. .PP در اینجا چند مثال برای روشن شدن موضوع آورده شده است: .PP .nf SET d '2025-06-01' # d is constant REM [d] MSG Hello! # eligible for purging SET d today() - 3 # d is non-constant REM [d] MSG Hello! # not eligible for purging IF wkdaynum(today()) == 3 set d '2025-06-01' # d is non-constant ELSE set d '2026-01-01' # d is non-constant ENDIF SET d '2025-06-01' # d is constant IF today() > today() + 3 # This branch is never taken, but... SET d '2029-01-01' # d is still marked non-constant ENDIF # Although here d is still '2025-06-01', it is marked # non-constant because as far as Remind is concerned, # the IF body *might* have been executed depending on today() .fi .PP توجه داشته باشید که درون محدوده .B IF\fR...\fBENDIF\fR، هرگونه تخصیص مقدار غیرثابت است زیرا جریان اجرای کد به تاریخ امروز بستگی دارد، که می‌تواند در اجراهای بعدی .B Remind تغییر کند. اگر می‌خواهید یک متغیر تحت هر شرایطی به عنوان ثابت در نظر گرفته شود، درست قبل از استفاده از متغیر از عبارت زیر استفاده کنید: .PP .nf SET var const(var) .fi .PP متغیرهایی که در خط فرمان با پرچم .B \-i مقداردهی اولیه می‌شوند، \fIهمیشه\fR غیرثابت در نظر گرفته می‌شوند. .PP اگر یک یادآوری منقضی‌شده دارید که به دلایلی هرگز نمی‌خواهید پاکسازی شود، به سادگی از تابع توکار .B nonconst در جایی از راه‌انداز آن استفاده کنید. به عنوان مثال: .PP .nf REM 1992-01-01 MSG This will be purged after Jan 1 1992 REM [nonconst('1992-01-01')] MSG This will never be purged REM Wed UNTIL 1993-12-31 MSG This will be purged after 1993 REM Wed UNTIL [nonconst('1993-12-31')] MSG Never purged .fi .PP پرچم اشکال‌زدایی .B n هر زمان که .B Remind تشخیص دهد عبارتی غیرثابت است، پیامی را در خروجی خطای استاندارد چاپ می‌کند. این کار می‌تواند خروجی زیادی تولید کند، بنابراین اگر می‌خواهید بدانید چرا .B Remind یک عبارت خاص را غیرثابت می‌داند، بهتر است قبل از آن از .B DEBUG +n و بعد از آن از .B DEBUG \-n استفاده کنید تا حجم خروجی محدود شود. .PP .SH "مرتب‌سازی یادآوری‌ها (SORTING REMINDERS)" .PP گزینه .B \-g باعث می‌شود .B Remind یادآوری‌ها را قبل از صدور، بر اساس تاریخ راه‌انداز، زمان و اولویت مرتب کند. توجه داشته باشید که یادآوری‌ها همچنان به ترتیبی که در اسکریپت دیده می‌شوند محاسبه می‌گردند. با این حال، به جای اینکه فوراً صادر شوند، در یک بافر داخلی ذخیره می‌شوند. زمانی که .B Remind پردازش اسکریپت را به پایان رساند، یادآوری‌های ذخیره‌شده را به ترتیب مرتب‌شده صادر می‌کند. گزینه .B \-g می‌تواند با حداکثر چهار نویسه دنبال شود که همگی باید «a» یا «d» باشند. اولین نویسه ترتیب مرتب‌سازی بر اساس تاریخ راه‌انداز (صعودی یا نزولی)، دومین نویسه ترتیب مرتب‌سازی بر اساس زمان راه‌انداز و سومین نویسه ترتیب مرتب‌سازی بر اساس اولویت را تعیین می‌کند. اگر نویسه چهارم «d» باشد، یادآوری‌های بدون زمان قبل از یادآوری‌های زمان‌بندی‌شده مرتب می‌شوند. حالت پیش‌فرض این است که تمام فیلدها به ترتیب صعودی مرتب شوند و یادآوری‌های بدون زمان بعد از یادآوری‌های زمان‌بندی‌شده قرار گیرند. .PP در ترتیب صعودی، یادآوری‌هایی که نزدیک‌تر هستند ابتدا صادر می‌شوند. ترتیب نزولی برعکس است. یادآوری‌ها همیشه بر اساس تاریخ راه‌انداز مرتب می‌شوند و یادآوری‌هایی با تاریخ راه‌انداز یکسان، سپس بر اساس زمان راه‌انداز مرتب می‌گردند. اگر دو یادآوری دارای تاریخ و زمان یکسان باشند، از اولویت برای رفع تساوی استفاده می‌شود. یادآوری‌هایی با تاریخ، زمان و اولویت یکسان به ترتیبی که در فایل دیده شده‌اند صادر می‌شوند. .PP شما می‌توانید یک تابع تعریف‌شده توسط کاربر به نام SORTBANNER تعریف کنید که یک آرگومان از نوع .B DATE می‌پذیرد. در حالت مرتب‌سازی، توالی زیر رخ می‌دهد: .PP اگر .B Remind متوجه شود که یادآوری بعدی برای صدور دارای تاریخ راه‌انداز متفاوتی نسبت به یادآوری قبلی است (یا اگر اولین یادآوری صادرشده باشد)، تابع SORTBANNER با تاریخ راه‌انداز به عنوان آرگومان فراخوانی می‌شود. نتیجه به یک رشته تبدیل شده و همراه با تاریخ راه‌انداز مناسب از فیلتر جایگزینی عبور داده می‌شود. سپس نتیجه نمایش داده خواهد شد. .PP در اینجا یک مثال آورده شده است - قطعه‌کد زیر را در نظر بگیرید: .PP .nf # Switch off the normal banner BANNER % REM 11 March 1993 ++1 MSG Not so important REM 17 March 1993 ++7 MSG Way in the future REM 10 March 1993 MSG Important Reminder REM 11 March 1993 ++1 MSG Not so important - B FSET sortbanner(x) iif(x == today(), \\ "***** THINGS TO DO TODAY *****", \\ "----- Things to do %b -----") .fi .PP اجرای این قطعه‌کد با گزینه .B \-gaa در تاریخ ۱۰ مارس ۱۹۹۳ خروجی زیر را تولید می‌کند: .PP .nf ***** THINGS TO DO TODAY ***** Important Reminder ----- Things to do tomorrow ----- Not so important Not so important - B ----- Things to do in 7 days' time ----- Way in the future .fi .PP شما می‌توانید از تابع توکار .B args() برای تعیین اینکه آیا SORTBANNER تعریف شده است یا خیر استفاده کنید. (این می‌تواند برای مثال برای ارائه تعریف پیش‌فرض برای SORTBANNER در یک فایل سرتاسری سیستم که در انتهای فایل کاربر ضمیمه می‌شود، استفاده گردد.) در اینجا یک مثال آورده شده است: .PP .nf # Create a default sortbanner function if it hasn't already # been defined if args("sortbanner") != 1 fset sortbanner(x) "--- Things to do %b ---" endif .fi .PP .SH "توابع MSGPREFIX() و MSGSUFFIX() (MSGPREFIX() AND MSGSUFFIX())" .PP شما می‌توانید دو تابع در اسکریپت خود به نام‌های .B msgprefix() و .B msgsuffix() تعریف کنید. هر یک از آن‌ها باید یک آرگومان بپذیرند که عددی بین ۰ تا ۹۹۹۹ است. .PP در حالت آگندا، برای یادآوری‌های نوع .B MSG و .BR MSF ، هنگامی که .B Remind یک یادآوری را فعال می‌کند توالی زیر رخ می‌دهد: .TP o اگر .B msgprefix() تعریف شده باشد، با اولویت یادآوری به عنوان آرگومان ارزیابی می‌شود. نتیجه چاپ می‌گردد. این نتیجه از فیلتر جایگزینی عبور داده \fIنمی‌شود\fR. .TP o بدنه یادآوری چاپ می‌شود. .TP o اگر .B msgsuffix() تعریف شده باشد، با اولویت یادآوری به عنوان آرگومان ارزیابی می‌شود. نتیجه چاپ می‌گردد. این نتیجه از فیلتر جایگزینی عبور داده \fIنمی‌شود\fR. .PP در اینجا یک مثال آورده شده است: تعریف زیر باعث می‌شود که یادآوری‌های با اولویت ۰ با «URGENT: » و یادآوری‌های با اولویت ۶۰۰۰ با «(not important) » آغاز شوند. .PP .nf fset msgprefix(x) iif(x==0, "URGENT: ", \\ x==6000, "(not important) ", "") .fi .PP در حالت تقویم (با گزینه‌های .BR \-c ، .B \-s یا .BR \-p )، یک جفت تابع مشابه به نام‌های .B calprefix() و .B calsuffix() می‌توانند تعریف شوند. آن‌ها با تمام یادآوری‌هایی که ورودی در تقویم ایجاد می‌کنند کار می‌کنند (یعنی یادآوری‌های نوع .BR CAL ، احتمالاً یادآوری‌های نوع .B RUN و همچنین یادآوری‌های نوع .BR MSG ). .PP .B "نکات (NOTES)" .PP به‌طور معمول، بدنه یک یادآوری با یک نویسه بازگشت به ابتدای سطر (carriage return) دنبال می‌شود. بنابراین، نتایج .B msgsuffix() در خط بعدی ظاهر خواهد شد. اگر این رفتار را نمی‌خواهید، مطمئن شوید که خروجی .B msgsuffix با یک نویسه پس‌بر (backspace) شروع شود. این کار پسوند را \fIقبل\fR از بازگشت سطر قرار می‌دهد تا بعد از آن. (خود نویسه پس‌بر حذف می‌شود.) در اینجا یک مثال آورده شده است: .PP .nf FSET msgsuffix(x) char(8) + " - suffix on same line" .fi .PP اگر .B Remind در ارزیابی .BR msgprefix() ، .B msgsuffix() یا .B sortbanner() با مشکل مواجه شود، پیام‌های خطای زیادی را مشاهده خواهید کرد. برای نمونه‌ای از این وضعیت، مورد زیر را تعریف کنید: .PP .nf fset msgprefix(x) x/0 .fi .PP .SH "پشتیبانی زمان کامپایل از زبان‌های دیگر (COMPILE-TIME SUPPORT FOR OTHER LANGUAGES)" .PP پیش‌تر BRemind R از محلی‌سازی زمان کامپایل به زبان‌های دیگر پشتیبانی می‌کرد، اما دیگر چنین نیست. تمامی محلی‌سازی‌ها اکنون در زمان اجرا انجام می‌شوند. .PP .SH "پشتیبانی زمان اجرا از زبان‌های دیگر (RUN-TIME SUPPORT FOR OTHER LANGUAGES)" .PP BRemind R دارای پشتیبانی زمان اجرا از زبان‌های دیگر است و پشتیبانی زمان کامپایل به نفع پشتیبانی زمان اجرا حذف شده است. .PP تعدادی از متغیرهای سیستمی به شما امکان می‌دهند عبارت‌های مختلف را به زبان‌های دیگر ترجمه کنید. این متغیرهای سیستمی عبارتند از: .PP .TP .B $Monday, $Tuesday, $Wednesday, $Thursday, $Friday, $Saturday, $Sunday هر یک از این متغیرهای سیستمی را با یک رشته که نشان‌دهنده نام روز متناظر در زبان شماست مقداردهی کنید. رشته‌ها باید معتبر و با کدگذاری UTF-8 باشند. .TP .B $January, $February, $March, $April, $May, $June, $July, $August, $September, $October, $November, $December هر یک از این متغیرهای سیستمی را با یک رشته که نشان‌دهنده نام ماه متناظر در زبان شماست مقداردهی کنید. رشته‌ها باید معتبر و با کدگذاری UTF-8 باشند. .TP .B $Ago, $Am, $And, $At, $Hour, $Is, $Minute, $Now, $On, $Pm, $Today, $Tomorrow, $Was هر یک از این متغیرهای سیستمی را با ترجمه کلمه انگلیسی متناظر به زبان خود مقداردهی کنید. توجه داشته باشید که B$Am R و B$Pm R باید به ترتیب ترجمه "AM" و "PM" (نشانگرهای زمانی صبح و بعدازظهر) باشند. .TP .B $Hplu, $Mplu این متغیرها را با پسوندی که به کلمات "hour" (ساعت) و "minute" (دقیقه) برای جمع بستن اضافه می‌شود مقداردهی کنید. در انگلیسی، هر دو با "s" مقداردهی می‌شوند. .TP .B $Fromnow این متغیر را با ترجمه عبارت انگلیسی "from now" (از حالا) مقداردهی کنید. .PP توجه داشته باشید که اگر هر یک از متغیرهای سیستمی مرتبط با زبان را مقداردهی می‌کنید، باید در بخشی از اسکریپت شما قرار گیرند که همیشه ارزیابی می‌شود. اگر آن‌ها را به عنوان مثال درون یک دستور BIF R مقداردهی کنید، نتایج غیرقابل پیش‌بینی خواهد بود. .PP همچنین توجه داشته باشید که بک‌اند BRem2PS R از دامنه کامل کاراکترهای UTF-8 پشتیبانی نمی‌کند. بک‌اندهای BTkRemind R، Brem2html R و Brem2pdf R همگی از دامنه کامل UTF-8 پشتیبانی می‌کنند. .PP .SH "تغییر زمان اجرای فیلتر جایگزینی (RUN-TIME MODIFICATION OF THE SUBSTITUTION FILTER)" .PP متغیرهای سیستمی ذکر شده در بخش قبلی معمولاً برای ترجمه صحیح خروجی Remind به زبان‌های دیگر کافی نیستند. برخی زبان‌ها قواعد پیچیده‌ای برای زمان‌های قبل‌ازظهر در برابر بعدازظهر دارند و برخی دیگر قواعد پیچیده‌ای برای جمع بستن کلمات دارند. بنابراین BRemind R به شما اجازه می‌دهد تعدادی تابع تعریف کنید که رفتار فیلتر جایگزینی را در زمان اجرا تغییر می‌دهند. این توابع عبارتند از: .PP .TP .B subst_ampm(h) به این تابع یک عدد صحیح ارسال می‌شود که نشان‌دهنده ساعت از 0 تا 23 است. این تابع باید رشته‌ای برگرداند که "AM" یا "PM" یا حتی درجه‌بندی‌های دقیق‌تری را در برخی زبان‌ها مشخص کند. .TP .B subst_ordinal(d) به این تابع یک عدد صحیح ارسال می‌شود که نشان‌دهنده روزی از ماه از 1 تا 31 است. این تابع باید رشته‌ای برگرداند که به شماره روز پسوند می‌شود تا آن را به یک عدد ترتیبی تبدیل کند. برای نمونه در زبان انگلیسی، این تابع ممکن است بسته به Id R رشته‌های "st"، "nd"، "rd" یا "th" را برگرداند. .TP .B subst_ IN R B(alt, date, time) R این در واقع یک Iخانواده R از توابع است که در آن IN R یک حرف یا عدد است. این تابع دنباله جایگزینی "%N" را Iبه‌طور کامل بازنویسی می‌کند R. سه آرگومان آن عبارتند از: عدد صحیح Ialt R که اگر غیرصفر باشد، نشان می‌دهد که دنباله جایگزینی حالت جایگزین "%*N" مشاهده شده است؛ Idate R که تاریخ محرک یادآوری است و Itime R که زمان محرک است. .TP .B subst_ IN R Bx(alt, date, time) R این نیز مجدداً یک Iخانواده R از توابع است. این تابع مشابه خانواده Bsubst_ IN R است، با این تفاوت که فقط در صورتی فراخوانی می‌شود که Idate R دو روز یا بیشتر با Itoday() R فاصله داشته باشد. این ویژگی زمانی مفید است که نمی‌خواهید خروجی "today" یا "tomorrow" را برای بیشتر دنباله‌های جایگزینی بازنویسی کنید. .PP در اینجا نمونه‌ای از نحوه سفارشی‌سازی فیلتر جایگزینی آورده شده است. فرض کنید می‌خواهید دنباله "%b" را به گونه‌ای تغییر دهید که برای رویدادی که دو روز پس از امروز است، عبارت "the day after tomorrow" را جایگزین کند. می‌توانید به این صورت عمل کنید: .PP .nf FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", \ "in " + (d-today()) + " days' time") REM [today()+3] ++3 MSG Event 1 is %b% REM [today()+2] ++3 MSG Event 2 is %b% REM [today()+1] ++3 MSG Event 3 is %b% REM [today()] ++3 MSG Event 4 is %b% .fi .PP خروجی این اسکریپت به شرح زیر است: .PP .nf Event 1 is in 3 days' time Event 2 is the day after tomorrow Event 3 is tomorrow Event 4 is today .fi .PP توجه کنید که چگونه نگارش Event 2 از حالت عادی "in 2 days' time" تغییر کرد، و همچنین توجه کنید که رویدادهای "tomorrow" و "today" از جایگزینی عادی استفاده کردند—تابع Bsubst_bx R برای روزهای محرک امروز یا فردا فراخوانی نمی‌شود. .PP به عنوان یک حالت خاص، اگر یک تابع Bsubst_Nx R یا Bsubst_N R عدد صحیح صفر را برگرداند، سازوکار جایگزینی عادی استفاده می‌شود. بنابراین، مثال قبلی می‌توانست ساده‌تر به این شکل نوشته شود: .PP .nf FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", 0) .fi .PP می‌توانید دنباله‌های جایگزینی غیر عددی-حروفی را به شرح زیر بازنویسی کنید: .RS .PP بازنویسی %: با Bsubst_colon R .PP بازنویسی %! با Bsubst_bang R .PP بازنویسی %? با Bsubst_question R .PP بازنویسی %@ با Bsubst_at R .PP بازنویسی %# با Bsubst_hash R .RE .PP علاوه بر موارد داخلی، می‌توانید دنباله‌های جایگزینی اختصاصی خود را به شرح زیر تعریف کنید: اگر تابعی به نام Bsubst_ Iname B(alt, date, time) R تعریف کنید، دنباله B%{name} R این تابع را با مقدار Balt R برابر 0 و Bdate R و Btime R متناظر با تاریخ و زمان محرک فراخوانی می‌کند. دنباله B%{name} R با هر مقداری که تابع برگرداند جایگزین می‌شود. دنباله B%*{name} R مشابه است، اما تابع را با مقدار Balt R برابر 1 فراخوانی می‌کند. .PP اگر از دنباله B%{name} R استفاده کنید و تابع Bsubst_ Iname R تعریف نشده باشد یا خطایی برگرداند، B%{name} R با رشته خالی جایگزین می‌شود. .PP توجه داشته باشید که هنگامی که BRemind R هر تابع کال‌بکی را برای یک دنباله جایگزینی فراخوانی می‌کند، دستور BRUN R غیرفعال خواهد بود. .PP .SH "جدول ترجمه (THE TRANSLATION TABLE)" .PP برای کمک به محلی‌سازی فایل‌های یادآوری، BRemind R جدولی از ترجمه‌ها را نگهداری می‌کند. این یک جدول جستجوی ساده است که یک رشته (رشته اصلی) را به یک رشته جدید (رشته ترجمه‌شده) نقشه‌برداری می‌کند. هنگامی که BRemind R شروع به اجرا می‌کند، جدول ترجمه خالی است. .PP برای افزودن یک پیام به جدول ترجمه، از دستور BTRANSLATE R استفاده کنید (که می‌تواند به BTRANS R خلاصه شود). دستور BTRANSLATE R باید با دو رشته نقل‌قول‌شده که با فاصله از یکدیگر و از دستور جدا شده‌اند همراه باشد. برای نمونه، یک فایل زبان هلندی ممکن است شامل مواردی مانند این باشد: .PP .nf TRANSLATE "New Moon" "Nieuwe maan" TRANSLATE "First Quarter" "Eerste kwartier" TRANSLATE "Full Moon" "Volle maan" TRANSLATE "Last Quarter" "Laatste kwartier" .fi .PP برای استفاده عملی از جدول ترجمه، از تابع داخلی B_ R به صورت زیر بهره بگیرید: .PP .nf REM NOQUEUE [moondatetime(0)] MSG [_("New Moon")] (%2) REM NOQUEUE [moondatetime(1)] MSG [_("First Quarter")] (%2) REM NOQUEUE [moondatetime(2)] MSG [_("Full Moon")] (%2) REM NOQUEUE [moondatetime(3)] MSG [_("Last Quarter")] (%2) .fi .PP با استفاده هوشمندانه از BTRANSLATE R و B_ R، می‌توانید ترجمه فایل‌های یادآوری خود را آسان کنید. .PP دستور BTRANSLATE R چهار فرم دیگر نیز دارد: اگر به جای دو رشته، با Iیک R رشته نقل‌قول‌شده دنبال شود، BRemind R مدخل مربوط به آن رشته را از جدول ترجمه حذف می‌کند. اگر با کلمه کلیدی BDUMP R دنبال شود، BRemind R تمام مدخل‌های جدول ترجمه را در خروجی استاندارد می‌ریزد. و اگر با BCLEAR R دنبال شود، BRemind R تمام مدخل‌های جدول ترجمه را حذف می‌کند. .PP فرم چهارم، یعنی BTRANSLATE GENERATE R، تمام رشته‌هایی را که می‌توانند محلی‌سازی شوند (به صورت یک سری دستور TRANSLATE) در خروجی استاندارد می‌ریزد. رشته‌هایی که از قبل محلی‌سازی شده‌اند به همراه ترجمه‌شان خارج می‌شوند؛ رشته‌هایی که محلی‌سازی نشده‌اند به صورت زیر خارج می‌شوند: .PP .nf TRANSLATE "untranslated" "" .fi .PP اگر می‌خواهید یک زبان جدید اضافه کنید، می‌توانید با اجرای دستور زیر یک اسکلت اولیه فایل ترجمه دریافت کنید: .PP .nf echo "TRANSLATE GENERATE" | remind -h - > /tmp/skeleton.rem .fi .PP اگر یک فایل زبان موجود دارید که برخی ترجمه‌ها را کم دارد، می‌توانید با اجرای دستور زیر آن را به‌روزرسانی کنید: .PP .nf (echo INCLUDE mylang.rem; echo TRANSLATE GENERATE) | \ remind -h - > /tmp/mylang-update.rem .fi .PP و سپس Bmylang-update.rem R را ویرایش کنید تا ترجمه‌های از دست رفته را اضافه نمایید. .PP اگر اسکریپت‌های یادآوری دارید که از تابع داخلی B_() R یا دنباله جایگزینی B%(...) R استفاده می‌کنند، می‌توانید با اجرای دستور زیر فهرستی از دستورات مورد نیاز TRANSLATE ایجاد کنید: .PP .nf remind -q -n -dq myscript.rem 2>&1 | grep ^TRANSLATE | sort | uniq .fi .PP توجه داشته باشید که اگر متغیرهای سیستمی مختلف مربوط به ترجمه مانند B$Monday R، B$December R، B$Ago R و غیره را با BSET R مقداردهی کنید، BRemind R Iهمچنین R به طور خودکار مدخل متناظری در جدول ترجمه ایجاد می‌کند. این کار برای تمام متغیرهای سیستمی مربوط به ترجمه Iبه جز R B$Hplu R و B$Mplu R انجام می‌شود. .PP برعکس این موضوع نیز صادق است؛ ایجاد یک مدخل جدول ترجمه برای "December" به طور خودکار متغیر B$December R را تنظیم می‌کند. و اگر BTRANSLATE CLEAR R را اجرا کنید، تمام متغیرهای سیستمی مرتبط با ترجمه نیز به مقادیر پیش‌فرض خود تنظیم می‌شوند. .PP جدول ترجمه همیشه حاوی یک مدخل ویژه به نام BLANGID R است که مقدار پیش‌فرض آن Ben R است. از مترجمان تقاضا می‌شود که یک مدخل BLANGID R در فایل‌های زبان خود اضافه کنند؛ مقدار آن باید کد دو حرفی زبان در استاندارد ISO 639 باشد. .PP به عنوان مثال، اگر فایلی برای زبان هلندی می‌نویسید، این خط را اضافه کنید: .PP .nf TRANSLATE "LANGID" "nl" .fi .PP اسکریپت‌ها می‌توانند با استفاده از B_("LANGID") R زبان فعال ترجمه را جویا شوند. .PP تابع B_() R از فرآیند زیر برای دریافت ترجمه یک رشته استفاده می‌کند: .RS .TP 1 جستجو برای تطابق دقیق. در صورت یافتن، بازگردانده می‌شود. .TP 2 اگر رشته اصلی دارای حرف بزرگ بود، نسخه کاملاً حروف کوچک آن جستجو می‌شود. در صورت یافتن، حرف اول نتیجه بزرگ شده و بازگردانده می‌شود. .TP 3 اگر رشته اصلی با حرف کوچک آغاز شده بود، معادل آن با حرف اول بزرگ و بقیه حروف کوچک جستجو می‌شود. در صورت یافتن، حرف اول نتیجه کوچک شده و بازگردانده می‌شود. .TP 4 هیچ ترجمه‌ای یافت نشد. رشته اصلی بازگردانده می‌شود. .RE .SH "بسته‌های زبان (LANGUAGE PACKS)" .PP BRemind R همراه با تعدادی بسته زبان عرضه می‌شود که اسکریپت‌های یادآوری ساده مستقر در B[$SysInclude]/lang R هستند. بسته‌های زبانی که در حال حاضر عرضه می‌شوند عبارتند از: .PP da.rem (دانمارکی)، de.rem (آلمانی)، es.rem (اسپانیایی)، fr.rem (فرانسوی)، is.rem (ایسلندی)، it.rem (ایتالیایی)، nl.rem (هلندی)، no.rem (نروژی)، pl.rem (لهستانی)، pt.rem (پرتغالی) و ro.rem (رومانیایی). .PP برای استفاده از یک بسته زبان (در این مثال، de.rem)، کافی است این خط را در ابتدای فایل یادآوری‌های خود قرار دهید: .PP .nf SYSINCLUDE lang/de.rem .fi .PP اگر می‌خواهید BRemind R تلاش کند بسته زبان مناسب برای تنظیمات محلی شما را پیدا کند، استفاده کنید از: .PP .nf SYSINCLUDE lang/auto.rem .fi .PP به شما پیشنهاد می‌شود بسته‌های زبان را بررسی کنید تا ببینید چگونه می‌توانید BRemind R را به زبان‌های دیگر ترجمه کنید. .PP .SH "تقویم عبری (THE HEBREW CALENDAR)" .PP BRemind R از تقویم عبری که یک تقویم خورشیدی-قمری است پشتیبانی می‌کند. این ویژگی به شما امکان می‌دهد برای تعطیلات یهودی، سالمرگ‌ها (jahrzeits یا سالگرد وفات) و شادمانی‌ها (smachot یا مناسبت‌های شاد) یادآوری ایجاد کنید. .PP .B "سال عبری (THE HEBREW YEAR)" .PP سال عبری دارای ۱۲ ماه است که به طور متناوب ۳۰ و ۲۹ روز طول دارند. ماه‌ها عبارتند از: تیشری (Tishrey)، حشوان (Heshvan)، کسلو (Kislev)، طوت (Tevet)، شواط (Shvat)، آدار (Adar)، نیسان (Nisan)، ایار (Iyar)، سیوان (Sivan)، تموز (Tamuz)، آو (Av) و ایلول (Elul). اگر در یک محیط محلی UTF-8 هستید، می‌توانید Iهمچنین R از نگارش‌های عبری کدگذاری‌شده در UTF-8 برای نام ماه‌ها استفاده کنید، یعنی: .PP תשרי, חשוון, כסלו, טבת, שבט, אדר, ניסן, אייר, סיון, תמוז, אב, אלול. .PP در یک چرخه ۱۹ ساله، ۷ سال کبیسه وجود دارد که سال‌های ۳، ۶، ۸، ۱۱، ۱۴، ۱۷ و ۱۹ این چرخه هستند. در یک سال کبیسه، یک ماه اضافی ۳۰ روزه قبل از آدار اضافه می‌شود. دو ماه آدار را آدار الف و آدار ب می‌نامند، یا در زبان عبری 'אדר א و 'אדר ב. .PP BRemind R همچنین نگارش‌های جایگزین زیر را برای نام ماه‌های عبری مجاز می‌داند: .TP .B Tishrey می‌تواند به صورت Tishri یا Tishrei نیز نوشته شود .TP .B Heshvan می‌تواند به صورت Cheshvan یا Kheshvan نیز نوشته شود .TP .B Shvat می‌تواند به صورت Shevat نیز نوشته شود .TP .B Tamuz می‌تواند به صورت Tammuz نیز نوشته شود .TP .B Adar A می‌تواند به صورت Adar 1، Adar I، אדר א یا אדר 1 نوشته شود. .TP .B Adar B می‌تواند به صورت Adar 2، Adar II، אדר ב یا אدر 2 نوشته شود. .TP .B Iyar می‌تواند به صورت Iyyar نیز نوشته شود. .PP به دلایل خاص مذهبی، سال نمی‌تواند در روزهای یکشنبه، چهارشنبه یا جمعه آغاز شود. برای تنظیم این امر، یک روز از کسلو کم می‌شود یا به حشوان اضافه می‌شود. بنابراین، یک سال عادی می‌تواند بین ۳۵۳ تا ۳۵۵ روز، و یک سال کبیسه از ۳۸۳ تا ۳۸۵ روز داشته باشد. .PP هنگامی که کسلو یا حشوان کوتاه است، آن را Ichaser R (ناقص) می‌نامند. هنگامی که طولانی است، آن را Ishalem R (کامل) می‌نامند. .PP تاریخ یهودی هنگام غروب آفتاب تغییر می‌کند. با این حال، BRemind R تاریخ را در نیمه‌شب تغییر می‌دهد، نه در غروب آفتاب. بنابراین در بازه زمانی میان غروب آفتاب و نیمه‌شب، BRemind R یک روز عقب‌تر از تاریخ واقعی یهودی خواهد بود. این مسئله در عمل نباید مشکل چندانی ایجاد کند. .PP محاسبات مربوط به تقویم یهودی بر اساس برنامه "hdate" نوشته عاموس شاپیر (Amos Shapir) از دانشگاه عبری اورشلیم انجام شده است. او همچنین توضیحات قبلی درباره تقویم را ارائه داده است. .PP .B "توابع تاریخ عبری (HEBREW DATE FUNCTIONS)" .TP .B hebday(d_date) روز ماه عبری متناظر با پارامتر Idate R را برمی‌گرداند. برای مثال، ۱۲ آوریل ۱۹۹۳ متناظر با ۲۱ نیسان ۵۷۵۳ است. بنابراین، hebday('1993/04/12') عدد ۲۱ را برمی‌گرداند. .TP .B hebmon(d_date) نام ماه عبری متناظر با Idate R را برمی‌گرداند. برای مثال، hebmon('1993/04/12') مقدار "Nisan" را برمی‌گرداند. .TP .B ivritmon(d_date) نام ماه عبری متناظر با Idate R را با خط عبری با کدگذاری UTF-8 برمی‌گرداند. برای مثال، ivritmon('1993/04/12') مقدار "ניסן" را برمی‌گرداند. .TP .B hebyear(d_date) سال عبری متناظر با Idate R را برمی‌گرداند. برای مثال، hebyear('1993/04/12') عدد ۵۷۵۳ را برمی‌گرداند. .TP .B hebdate(i_day, s_hebmon [,id_yrstart [,i_jahr [,i_aflag]]]) تابع Bhebdate() R پیچیده‌ترین تابع از میان توابع پشتیبانی عبری است. این تابع می‌تواند بین ۲ تا ۵ آرگومان دریافت کند و یک BDATE R متناظر با تاریخ عبری را برمی‌گرداند. .PP .RS پارامتر Iday R می‌تواند از ۱ تا ۳۰ متغیر باشد و روز ماه عبری را مشخص می‌کند. پارامتر Ihebmon R رشته‌ای است که باید نام یکی از ماه‌های عبری مشخص‌شده در بالا باشد. توجه داشته باشید که نام ماه باید به طور کامل نوشته شود و از نویسه‌گردانی انگلیسی نشان‌داده‌شده در بالا، یا نگارش عبری Iکدگذاری‌شده در UTF-8 R استفاده کند. همچنین می‌توانید "Adar A" و "Adar B" را مشخص کنید. نام ماه‌ها به بزرگی و کوچکی حروف حساس نیستند. .PP پارامتر Iyrstart R می‌تواند یک BDATE R یا یک BINT R باشد. اگر یک BDATE R باشد، آنگاه Bhebdate() R برای اولین تاریخ عبری در آن تاریخ یا پس از آن جستجو می‌کند. برای مثال: .PP .nf hebdate(15, "Nisan", '1990/01/01') .fi .PP تاریخ 1990/03/30 را برمی‌گرداند، زیرا این اولین رخداد ۱۵ نیسان در ۱ ژانویه ۱۹۹۰ یا پس از آن است. .PP اگر Iyrstart R یک BINT R باشد، به عنوان سال عبری تفسیر می‌شود. بنابراین: .PP .nf hebdate(22, "Kislev", 5756) .fi .PP تاریخ 1995/12/15 را برمی‌گرداند، زیرا آن تاریخ متناظر با ۲۲ کسلو ۵۷۵۶ است. توجه داشته باشید که هیچ‌یک از توابع تاریخ عبری با تاریخ‌های خارج از محدوده عادی تاریخ‌های BRemind R کار نخواهند کرد. .PP اگر Iyrstart R ارائه نشود، مقدار پیش‌فرض آن Btoday() R خواهد بود. .PP پارامتر Ijahr R رفتار Bhebdate() R را به شرح زیر تغییر می‌دهد: .PP اگر Ijahr R برابر 0 باشد (پیش‌فرض)، Bhebdate() R به جستجو ادامه می‌دهد تا تاریخی را بیابد که دقیقاً پارامترهای دیگر را برآورده کند. برای مثال: .PP .nf hebdate(30, "Adar A", 1993/01/01) .fi .PP تاریخ 1995/03/02 را برمی‌گرداند که متناظر با ۳۰ آدار الف ۵۷۵۵ است، زیرا این رخداد بعدی ۳۰ آدار الف پس از ۱ ژانویه ۱۹۹۳ است. این رفتار برای پوریم صغیر (Purim Katan) که فقط در سال‌های کبیسه رخ می‌دهد مناسب است. .PP اگر Ijahr R برابر 1 باشد، تاریخ به شرح زیر تغییر می‌یابد: .TP o در سال‌هایی که حشوان Ichaser R (ناقص) است، ۳۰ حشوان به ۱ کسلو تبدیل می‌شود .TP o در سال‌هایی که کسلو Ichaser R (ناقص) است، ۳۰ کسلو به ۱ طوت تبدیل می‌شود .TP o در سال‌های غیرکبیسه، ۳۰ آدار الف به ۱ نیسان تبدیل می‌شود .TP o سایر تاریخ‌های آدار الف در سال‌های غیرکبیسه به روز متناظر در آدار منتقل می‌شوند .PP این رفتار برای مناسبت‌های شاد (smachot) و برای برخی سالمرگ‌ها مناسب است - به بخش "JAHRZEITS" مراجعه کنید. .PP اگر Ijahr R برابر 2 باشد، تاریخ به شرح زیر تغییر می‌یابد: .TP o اگر ماه Ichaser R باشد، ۳۰ کسلو و ۳۰ حشوان به ترتیب به ۲۹ کسلو و ۲۹ حشوان تبدیل می‌شوند .TP o در سال‌های غیرکبیسه، ۳۰ آدار الف به ۳۰ شواط تبدیل می‌شود .TP o سایر تاریخ‌های آدار الف در سال‌های غیرکبیسه به روز متناظر در آدار منتقل می‌شوند .PP اگر Ijahr R برابر 0، 1 یا 2 نباشد، به عنوان سال عبری تفسیر می‌شود و رفتار آن همان‌گونه که در بخش بعدی یعنی "JAHRZEITS" توضیح داده شده محاسبه می‌گردد. .PP پارامتر Iaflag R رفتار تابع را برای تاریخ‌های ماه آدار در طول سال‌های کبیسه تغییر می‌دهد. پارامتر Iaflag R Iتنها R در صورتی استفاده می‌شود که Iyrstart R از نوع BDATE R باشد. .PP پارامتر Iaflag R فقط زمانی روی محاسبات تاریخ تأثیر می‌گذارد که Ihebmon R به صورت "Adar" مشخص شده باشد. در سال‌های کبیسه، الگوریتم زیر دنبال می‌شود: .TP o اگر Iaflag R برابر 0 باشد، تاریخ در آدار ب فعال می‌شود. این حالت پیش‌فرض است. .TP o اگر Iaflag R برابر 1 باشد، تاریخ در آدار الف فعال می‌شود. این ممکن است برای سالمرگ‌ها در سنت اشکنازی مناسب باشد؛ با یک خاخام مشورت کنید. .TP o اگر Iaflag R برابر 2 باشد، تاریخ هم در آدار الف و هم در آدار ب یک سال کبیسه فعال می‌شود. برخی اشکنازی‌ها مراسم سالمرگ را در هر دو آدار الف و آدار ب برگزار می‌کنند. .RE .PP .B "سالمرگ‌ها (JAHRZEITS)" .PP سالمرگ (jahrzeit) یادبود سالانه مرگ یک شخص است. این مراسم معمولاً در سالگرد وفات برگزار می‌شود، اما در صورت تأخیر در خاکسپاری ممکن است به تعویق بیفتد - برای اطلاعات بیشتر با یک خاخام مشورت کنید. .PP علاوه بر این، چون طول برخی ماه‌ها تغییر می‌کند، مشخص نیست سالگرد وفات دقیقاً چه روزی است. قواعد زیر به کار گرفته می‌شوند: .TP o اگر فوت در ۳۰ حشوان رخ داده باشد و حشوان در سال پس از وفات Ichaser R باشد، در سال‌هایی که حشوان Ichaser R است، سالمرگ در ۲۹ حشوان برگزار می‌شود. در غیر این صورت، زمانی که حشوان Ichaser R است، سالمرگ در ۱ کسلو برگزار می‌شود. .TP o اگر فوت در ۳۰ کسلو رخ داده باشد و کسلو در سال پس از وفات Ichaser R باشد، در سال‌هایی که کسلو Ichaser R است، سالمرگ در ۲۹ کسلو برگزار می‌شود. در غیر این صورت، زمانی که کسلو Ichaser R است، سالمرگ در ۱ طوت برگزار می‌شود. .TP o اگر فوت در ۱ تا ۲۹ آدار الف رخ داده باشد، در سال‌های غیرکبیسه در ۱ تا ۲۹ آدار گرامی داشته می‌شود. .TP o اگر فوت در ۳۰ آدار الف رخ داده باشد، در یک سال غیرکبیسه در ۳۰ شواط گرامی داشته می‌شود. .PP مشخص کردن یک سال عبری برای پارامتر Ijahr R باعث می‌شود رفتار صحیح برای وفاتی در آن سال انتخاب گردد. همچنین بسته به سنت مذهبی خود، ممکن است لازم باشد Iaflag R را نیز تعیین کنید. .PP اطلاعات مربوط به سالمرگ توسط فرانک یلین (Frank Yellin) ارائه شده است که از کتاب "The Comprehensive Hebrew Calendar" نوشته آرتور اسپایر (Arthur Spier) و کتاب "Calendrical Calculations" نوشته ای. ام. رینگولد (E. M. Reingold) و ناخوم درشویتز (Nachum Dershowitz) نقل کرده است. .PP .SH "یادآوری‌های خارج از باند (OUT-OF-BAND REMINDERS)" .PP کلمه کلیدی BSPECIAL R برای انتقال اطلاعات «خارج از باند» (out-of-band) به بک‌اندهای BRemind R مانند Btkremind R یا BRem2PS R استفاده می‌شود. آن‌ها فقط هنگام ارسال داده از طریق پایپ از خط Bremind \-p R استفاده می‌شوند. (توجه داشته باشید که مورد ویژه COLOR یک استثنا است؛ هنگامی که گزینه B\-p R ارائه نشده باشد، مشابه MSG کار می‌کند.) .PP موارد ویژه BSPECIAL R شناخته‌شده برای هر بک‌اند خاص هستند؛ با این حال، چهار مورد BSPECIAL R وجود دارد که همه بک‌اندها باید تلاش کنند از آن‌ها پشتیبانی کنند. آن‌ها در حال حاضر توسط BRem2PS R، Btkremind R و Brem2html R پشتیبانی می‌شوند. .PP مورد ویژه BSHADE R جایگزین تابع Bpsshade() R می‌شود. از آن به این شکل استفاده کنید: .PP .nf REM Sat Sun SPECIAL SHADE 128 REM Mon SPECIAL SHADE 255 0 0 .fi .PP کلمه کلیدی BSHADE R با یک یا سه عدد از 0 تا 255 دنبال می‌شود. اگر یک عدد ارائه شود، به عنوان یک مقدار مقیاس خاکستری از سیاه (0) تا سفید (255) تفسیر می‌شود. اگر سه عدد ارائه شود، به عنوان مؤلفه‌های RGB از حداقل (0) تا حداکثر (255) تفسیر می‌شوند. مثال بالا تعطیلات آخر هفته را به رنگ خاکستری نسبتاً تیره درمی‌آورد و دوشنبه‌ها را به رنگ قرمز کاملاً اشباع تبدیل می‌کند. (این سایه‌بندی‌ها در تقویم‌های تولیدشده توسط BRem2PS R، Btkremind R و Brem2html R ظاهر می‌شوند.) .PP مورد ویژه BMOON R جایگزین تابع Bpsmoon() R می‌شود. از آن به صورت زیر استفاده کنید: .PP .nf REM [moondate(0)] SPECIAL MOON 0 REM [moondate(1)] SPECIAL MOON 1 REM [moondate(2)] SPECIAL MOON 2 REM [moondate(3)] SPECIAL MOON 3 .fi .PP این دستورات ماه‌های کوچکی را بر روی تقویم‌های مختلف رسم می‌کنند. نحو کامل مورد ویژه BMOON R به شرح زیر است: .PP .nf ... SPECIAL MOON phase moonsize fontsize msg .fi .PP پارامتر IPhase R عددی از 0 تا 3 است که در آن 0 نشان‌دهنده ماه نو، 1 تربیع اول، 2 ماه کامل و 3 تربیع آخر است. .PP پارامتر Imoonsize R قطر ماه برای رسم در واحدهای PostScript است. اگر حذف شود یا با مقدار \-1 ارائه گردد، بک‌اند اندازه مناسب را انتخاب می‌کند. .PP پارامتر Ifontsize R اندازه قلم در واحدهای PostScript برای متن Imsg R است. .PP پارامتر IMsg R متن اضافی است که در نزدیکی تصویر گلیف ماه قرار می‌گیرد. .PP توجه داشته باشید که تنها بک‌اند BRem2PS R از Imoonsize R و Ifontsize R پشتیبانی می‌کند؛ بک‌اندهای دیگر از اندازه‌های ثابت استفاده می‌کنند. .PP مورد ویژه BCOLOR R به شما امکان می‌دهد یادآوری‌های رنگی را در تقویم قرار دهید. از آن به این شکل استفاده کنید: .PP .nf REM ... SPECIAL COLOR 255 0 0 This is a bright red reminder REM ... SPECIAL COLOR 0 128 0 This is a dark green reminder .fi .PP می‌توانید کلمه COLOR را به شیوه آمریکایی ("COLOR") یا شیوه بریتانیایی ("COLOUR") بنویسید. این راهنما از شیوه آمریکایی استفاده خواهد کرد. .PP بلافاصله پس از COLOR باید سه عدد ده‌دهی از 0 تا 255 قرار گیرد که به ترتیب شدت رنگ‌های قرمز، سبز و آبی را مشخص می‌کنند. باقی‌مانده خط متنی است که باید در تقویم قرار گیرد. .PP مورد ویژه COLOR ویژگی مضاعفی دارد، زیرا در حالت آگندا، Bremind R با آن درست مثل یک یادآوری از نوع MSG رفتار می‌کند. همچنین، اگر BRemind R را با B\-@ R[ In R] اجرا کنید، یادآوری‌های SPECIAL COLOR را در ترمینال شما شبیه‌سازی می‌کند. .PP همچنین مستندات متغیر سیستمی B$DefaultColor R را در بخش "متغیرهای سیستمی (SYSTEM VARIABLES)" ببینید. .PP مورد ویژه BWEEK R به شما امکان می‌دهد حاشیه‌نویسی‌هایی مانند شماره هفته را در تقویم درج کنید. برای مثال، این دستور هر دوشنبه را با شماره هفته طبق استاندارد ISO 8601 شماره‌گذاری می‌کند. شماره هفته در این مثال به شکل "(W In R)" نشان داده می‌شود، اما می‌توانید هر متنی را که می‌خواهید پس از کلمه کلیدی WEEK قرار دهید. .PP .nf REM Monday SPECIAL WEEK (W[weekno()]) .fi .PP .SH "متفرقه (MISCELLANEOUS)" .PP .B "اختصارات دستورات و کلمات کلیدی (COMMAND AND KEYWORD ABBREVIATIONS)" .PP توکن‌های زیر را می‌توان به صورت مختصر نوشت: .TP o BCLEAR-OMIT-CONTEXT R --> BCLEAR R .TP o BPUSH-OMIT-CONTEXT R --> BPUSH R .TP o BPOP-OMIT-CONTEXT R --> BPOP R .TP o BDUMPVARS R --> BDUMP R .TP o BBANNER R --> BBAN R .TP o BINCLUDE R --> BINC R .TP o BMAYBE-UNCOMPUTABLE R --> BMAYBE R .TP o BSCANFROM R --> BSCAN R .PP .B "مثال‌های جالب و کاربردی (NIFTY EXAMPLES)" .PP این بخش نمونه‌ای از قابلیت‌هایی است که می‌توانید با BRemind R انجام دهید. .PP .nf REM 5 Feb 1991 AT 14:00 +45 *30 \ RUN mail \-s "Meeting at %2" $LOGNAME برنامه BRemind R را نوشته است. کد اهله ماه عمدتاً بدون تغییر از "moontool" اثر جان واکر (John Walker) کپی شده است. کد طلوع/غروب ماه از https://github.com/signetica/MoonRise اثر استیون آر. اشمیت (Stephen R. Schmitt) و کوروش رحمان (Cyrus Rahman) اقتباس شده است. توابع طلوع و غروب خورشید از ایده‌های برنامه‌های مایکل شوارتز (Michael Schwartz) و مارک تی. کافمن (Marc T. Kaufman) بهره می‌برند. پشتیبانی تقویم عبری از "hdate" اثر عاموس شاپیر (Amos Shapir) برگرفته شده است. زبان‌های پشتیبانی‌شده و مترجمان آن‌ها در زیر فهرست شده‌اند. زبان‌های علامت‌گذاری‌شده با "complete" از پیام‌های خطا به آن زبان نیز پشتیبانی می‌کنند؛ سایر زبان‌ها تنها از سازوکار فیلتر جایگزینی و نام‌های ماه/روز پشتیبانی می‌نمایند. .PP Bآلمانی R -- Wolfgang Thronicke .PP Bهلندی R -- Willem Kasdorp and Erik-Jan Vens .PP Bفنلاندی R -- Mikko Silvonen (complete) .PP Bفرانسوی R -- Laurent Duperval (complete) .PP Bنروژی R -- Trygve Randen .PP Bدانمارکی R -- Mogens Lynnerup .PP Bلهستانی R -- Jerzy Sobczyk (complete) .PP Bپرتغالی برزیلی R -- Marco Paganini (complete) .PP Bایتالیایی R -- Valerio Aimale .PP Bرومانیایی R -- Liviu Daia .PP Bاسپانیایی R -- Rafa Couto .PP Bایسلندی R -- Bj\[:o]rn Daví\[Sd]sson .SH "اشکالات (BUGS)" .PP اگر اشکالی در Remind پیدا کردید، لطفاً آن را به dianne@skoll.ca گزارش دهید. .PP هیچ دلیل موجهی وجود ندارد که چرا متغیرهای سیستمی فقط‌خواندنی به عنوان تابع پیاده‌سازی نشده‌اند، یا چرا توابعی مانند Bversion() R و غیره به عنوان متغیرهای سیستمی فقط‌خواندنی پیاده‌سازی نشده‌اند. .PP تاریخ‌های عبری در BRemind R به جای غروب آفتاب، در نیمه‌شب تغییر می‌کنند. .PP BRemind R دارای برخی محدودیت‌های داخلی است (برای مثال، تعداد BOMIT Rهای سراسری). .PP .SH "کتاب‌شناسی (BIBLIOGRAPHY)" .PP Nachum Dershowitz and Edward M. Reingold, "Calendrical Calculations", ISoftware\-Practice and Experience R, Vol. 20(9), Sept. 1990, pp 899-928. .PP L. E. Doggett, IAlmanac for computers for the year 1978 R, Nautical Almanac Office, USNO. .PP Richard Siegel and Michael and Sharon Strassfeld, IThe First Jewish Catalog R, Jewish Publication Society of America. .PP Jean Meeus, IAstronomical Algorithms, Second Edition R, Willmann-Bell, Inc. .SH "صفحه خانگی (HOME PAGE)" https://dianne.skoll.ca/projects/remind .SH "فهرست پستی (MAILING LIST)" https://dianne.skoll.ca/mailman/listinfo/remind-fans .SH "همچنین ببینید (SEE ALSO)" .PP Brem R(1), Brem2ps R(1), Brem2pdf R(1), Btkremind R(1), Brem2html R(1)