| REMIND(1) | VERSION 06.02.07 | REMIND(1) |
نام (NAME)
remind - یک سرویس پیشرفته یادآوری
کتابچه راهنمای رمایند (THE BOOK OF REMIND)
این صفحه راهنما یک مرجع خوب برای Remind است. با این حال، اگر مبتدی هستید و میخواهید Remind را یاد بگیرید، پیشنهاد میکنم «کتابچه راهنمای رمایند» (The Book of Remind) را از صفحه اصلی Remind در نشانی اینترنتی زیر بارگیری کنید:
https://dianne.skoll.ca/projects/remindخلاصه دستور (SYNOPSIS)
remind [options] filename [date] [*rep] [time]
توضیحات (DESCRIPTION)
دستور Remind فایل filename ارائهشده را میخواند و دستورات موجود در آن را اجرا میکند. این دستورات برای صدور یادآوریها و هشدارها به کار میروند. هر یادآوری یا هشدار میتواند شامل پیامی باشد که به خروجی استاندارد فرستاده میشود، یا برنامهای باشد که باید اجرا شود.
اگر filename به صورت یک خط تیره منفرد '-' مشخص شود، آنگاه Remind ورودی خود را از ورودی استاندارد دریافت میکند. در این حالت، اگر Remind با کتابخانه GNU Readline کامپایل شده باشد، از Readline برای ارائه یک رابط تعاملی ویرایش خط استفاده خواهد کرد.
اگر filename به جای یک فایل معمولی یک دایرکتوری باشد، آنگاه Remind تمام فایلهای موجود در آن دایرکتوری را که با الگوی "*.rem" مطابقت دارند (اما نه هیچ زیردایرکتوری را!) میخواند. فایلها به ترتیب مرتبشده خوانده میشوند؛ ترتیب مرتبسازی ممکن است به محلیسازی (locale) شما بستگی داشته باشد، اما باید با ترتیب مرتبسازی شل هنگام بسط دادن "*.rem" مطابقت داشته باشد.
دستور Remind فایلهای خود را از ابتدا تا انتها میخواند، یا تا زمانی که به خطی برسد که محتوای آن تنها "__EOF__" باشد (بدون علامت نقلقول). هر چیزی پس از نشانگر __EOF__ کاملاً نادیده گرفته میشود.
حالتهای عملکرد (MODES OF OPERATION)
دستور Remind دارای چهار حالت اصلی عملکرد است:
- Agenda Mode
- حالت دستور کار (Agenda mode)، حالت پیشفرض است. در این حالت، Remind یادآوریهای امروز را در خروجی استاندارد چاپ کرده و خارج میشود. همچنین ممکن است یک فرایند پسزمینه را برای نمایش یادآوریهای صفبندیشده برای ساعات بعدی روز منشعب (fork) کند.
- Calendar Mode
- در این حالت، Remind یک تقویم تولید میکند؛ یا با رسم آن در ترمینال یا با ارسال دادهها در قالبی خوانا برای رایانه به یک برنامه پشتیبان که تقویم را واقعاً رسم میکند.
- Daemon Mode
- این یک حالت عملکرد ویژه است که در آن Remind توسط یک برنامه فرانتاند فراخوانی شده و به عنوان یک دیمن اجرا میشود، درخواستها را از فرانتاند میپذیرد و پیامها را به فرانتاند بازمیگرداند. TkRemind از Remind در حالت دیمن استفاده میکند.
- Purge Mode
- در این حالت، Remind هیچ خروجی تولید نمیکند، اما نسخههای جدیدی از فایلهای ورودی خود میسازد که تمام یادآوریهای منقضیشده در آنها کامنت شدهاند.
گزینهها (OPTIONS)
دستور Remind گزینههای بسیار زیادی دارد. اگر به تازگی با این برنامه آشنا شدهاید، فعلاً آنها را نادیده بگیرید و به بخش "فایلهای یادآوری (REMINDER FILES)" بروید.
- -n
- گزینه -n باعث میشود Remind رخداد بعدی هر یادآوری را در قالبی ساده از تقویم چاپ کند. میتوانید با هدایت خروجی از طریق لوله به sort(1) آن را بر اساس تاریخ مرتب کنید. توجه داشته باشید که گزینه -n باعث میشود هر گزینه -g نادیده گرفته شود و همچنین به طور ضمنی گزینه -o را فعال میکند.
- -j[n]
- اجرای Remind در حالت "پاکسازی" (purge) برای خلاص شدن از یادآوریهای منقضیشده. برای جزئیات به بخش PURGE MODE مراجعه کنید.
- -r
- گزینه -r دستورالعملهای RUN و تابع shell() را غیرفعال میکند.
- -c[flags]n
- گزینه -c باعث میشود Remind تقویمی تولید کند که به خروجی استاندارد فرستاده میشود. اگر عددی مانند n ارائه دهید، تقویمی برای n ماه، با شروع از ماه جاری تولید خواهد شد. به طور پیشفرض، تقویم فقط برای ماه جاری تولید میشود. این گزینه به طور ضمنی گزینه -o را فعال میکند.
میتوانید قبل از n (در صورت وجود) مجموعهای از فلگها را قرار دهید. فلگها به شرح زیر هستند:
- '+'
- باعث میشود تقویمی برای n هفته تولید شود.
- 'a'
- باعث میشود Remind یادآوریها را در تقویم، هم در روز وقوع واقعی آنها و هم در هر روز قبل از آن که با delta یادآوری مشخص شده باشد، نمایش دهد. این کار همچنین باعث میشود Remind متنی را که خارج از توالیهای %"...%" قرار دارد و در غیر این صورت حذف میشد، بگنجاند (اگرچه خود نشانگرهای %" حذف میشوند).
- 'l'
- باعث میشود Remind از نویسههای خطکشی VT100 برای رسم تقویم استفاده کند. این نویسهها به صورت ثابت کدگذاری شدهاند و فقط روی ترمینالهایی کار میکنند که مجموعه نویسههای خطکشی VT100 را شبیهسازی نمایند.
- 'u'
- مشابه 'l' است، اما باعث میشود Remind از نویسههای خطکشی UNICODE برای رسم تقویم استفاده کند. این نویسهها به صورت ثابت کدگذاری شدهاند و فقط روی ترمینالهایی که روی کدگذاری نویسه UTF-8 تنظیم شده باشند کار میکنند. این فلگ همچنین استفاده از نشانگر «چپبهراست» یونیکد را فعال میکند که میتواند مشکلات قالببندی زبانهای راستبهچپ را در نمایش تقویم برطرف سازد.
- 'z'
- دارای اثر تنظیم متغیر سیستمی $TerminalHyperlinks روی 1 است. مستندات این متغیر را در بخش "SYSTEM VARIABLES" ببینید.
- 'c'
- باعث میشود Remind از توالیهای گریز VT100 برای تقریبی کردن یادآوریهای SPECIAL COLOR استفاده کند. توجه داشته باشید که این فلگ برای سازگاری با گذشته حفظ شده است؛ به جای آن باید از گزینه خط فرمان -@[n][,m][,b] استفاده کنید.
در یک لوکال UTF-8، برنامه Remind هنگام ایجاد تقویم با گزینه -c از «نشانگرهای چپبهراست» استفاده خواهد کرد. برخی ترمینالها این مورد را به درستی مدیریت نمیکنند و نمایش تقویم را به هم میریزند؛ برای راه حل، مستندات $SuppressLRM را در بخش "SYSTEM VARIABLES" ببینید.
- -@[n][,m][,b]
- به Remind میگوید یادآوریهای SPECIAL COLOR و SHADE را با استفاده از توالیهای گریز VT100 تقریب بزند. این تقریب (به ناچار) بسیار نادقیق است، زیرا VT100 فقط هشت توالی رنگ مختلف دارد که هر کدام یکی از دو میزان روشنایی را دارند. مؤلفه رنگ بزرگتر از ۶۴ به عنوان "روشن" در نظر گرفته میشود، و اگر هر یک از سه مؤلفه رنگ بزرگتر از ۱۲۸ باشد، رنگ "درخشان" (bright) تلقی میشود.
اگر پارامترهای عددی اختیاری را ارائه دهید، معانی زیر را خواهند داشت: n=0 به Remind میگوید از ۱۶ رنگ استاندارد VT100 استفاده کند. n=1 به آن میگوید از یک پالت توسعهیافته ۲۵۶ رنگی که توسط بسیاری از شبیهسازهای ترمینال مانند xterm پشتیبانی میشود استفاده کند. و n=2 به آن میگوید از توالیهای گریزی استفاده کند که از رنگهای واقعی ۲۴ بیتی (true color) پشتیبانی میکنند، که باز هم توسط بسیاری از شبیهسازهای ترمینال مانند xterm پشتیبانی میشود.
اگر پارامتر اختیاری m پس از یک کاما ارائه شود، آنگاه m=0 به Remind میگوید که پسزمینه ترمینال تیره است، و Remind رنگهای تیره را روشنتر میکند تا قابل مشاهده باشند. اگر m=1 باشد، آنگاه Remind فرض میکند پسزمینه ترمینال روشن است و رنگهای روشن را تیره میکند تا قابل دیدن شوند. اگر m به صورت 2 مشخص شود، آنگاه Remind هیچ تنظیمی انجام نمیدهد، و در صورتی که رنگ بیش از حد به رنگ پسزمینه ترمینال نزدیک باشد، دیدن برخی یادآوریها ممکن است سخت یا غیرممکن شود. اگر به جای عدد، حرف t را وارد کنید، آنگاه Remind تلاش میکند رنگ پسزمینه ترمینال را حدس بزند، حتی اگر خروجی استاندارد یک ترمینال نباشد.
هنگام راهاندازی، اگر خروجی استاندارد یک ترمینال باشد، Remind با ارسال یک توالی گریز ویژه جهت تعیین رنگ پسزمینه، تلاش میکند تشخیص دهد که آیا پسزمینه ترمینال تیره است یا روشن. پارامتر m میتواند این بررسی را لغو کند (یا اگر m به صورت t داده شود، آن را اجبار کند).
اگر پارامتر اختیاری b پس از یک کاما ارائه شود، آنگاه b=0 به Remind میگوید که یادآوریهای SPECIAL SHADE را نادیده بگیرد (پیشفرض) و b=1 به Remind میگوید که یادآوریهای SPECIAL SHADE را با انتشار کدهای گریز VT100 برای رنگآمیزی پسزمینه خانه تقویم رعایت کند. توجه داشته باشید که SHADE به خوبی کار نمیکند مگر اینکه از پالت گسترده ۲۵۶ رنگی (n=1) یا رنگهای واقعی ۲۴ بیتی (n=2) استفاده کنید. توجه داشته باشید که برای خانههای تقویمی که سایهدار هستند، سازوکار محدودسازی روشنایی که پیشتر برای m=0 یا m=1 شرح داده شد اعمال نمیشود؛ فرض بر این است که اگر هم رنگ پیشزمینه یک یادآوری و هم رنگ پسزمینه یک خانه را تنظیم کردهاید، میدانید چه کاری انجام میدهید.
- -wcol[,pad[,spc[,spc2]]]]
- گزینه -w عرض خروجی، فاصلهگذاری حاشیه (padding) و فاصلهگذاری بینابینی (spacing) خروجی تقویم قالببندیشده را مشخص میکند. مقدار Col تعداد ستونها را در دستگاه خروجی مشخص میکند. اگر col مشخص نشود، یا به صورت 0 مشخص شود، پیشفرض آن مقدار بزرگتر میان ۷۱ یا عرض واقعی ترمینال شما خواهد بود، یا اگر خروجی استاندارد یک ترمینال نباشد، برابر با ۸۰ است. اگر col به صورت حرف t مشخص شود، آنگاه Remind تلاش میکند عرض دستگاه ترمینال /dev/tty را به دست آورد. این مورد برای مثال زمانی مفید است که خروجی تقویم را از طریق لوله به less میفرستید؛ حتی اگر خروجی استاندارد یک پایپ باشد، میخواهید اندازه تقویم به درستی برای پنجره ترمینال شما تنظیم شود:
remind -c -wt .reminders | less
توجه داشته باشید که مقدار col همچنین برای تنظیم متغیر سیستمی $FormWidth استفاده میشود که با col - 8 مقداردهی اولیه میگردد. برای جزئیات به "SYSTEM VARIABLES" مراجعه کنید.
مقدار Pad مشخص میکند که از چند خط برای «پر کردن» (padding) خانههای خالی تقویم استفاده شود. مقدار پیشفرض آن ۵ است. اگر در روزهای خاصی یادآوریهای زیادی دارید که باعث میشود تقویم شما برای جا شدن در یک صفحه بیش از حد بزرگ شود، میتوانید با کاهش pad خانههای خالی را کوچکتر کنید. مقدار Spc مشخص میکند که چند خط خالی بین شماره روز و اولین مدخل یادآوری باقی بماند که پیشفرض آن ۱ است. مقدار spc2 ممکن است 0 یا 1 باشد و مشخص میکند که آیا خطوط خالی بین یادآوریهای مربوط به یک روز چاپ شوند یا خیر. مقدار پیشفرض 1 است که باعث چاپ خطوط خالی میشود.
هر یک از مقادیر col، pad یا spc را میتوان نادیده گرفت، به شرطی که تعداد درستی از کاماها را وارد کنید. در این گزینه از هیچ فاصلهای (space) استفاده نکنید.
- -s[a]n
- گزینه -s
بسیار شبیه
به گزینه -c
است، با این
تفاوت که
تقویم
خروجی
قالببندی
نمیشود.
این تقویم
در یک "قالب
ساده"
فهرست
میشود که
میتواند
به عنوان
ورودی برای
برنامههای
پیشرفتهتر
رسم تقویم
به کار رود.
اگر n با "+"
شروع شود،
به عنوان
تعداد
هفتهها
تفسیر
میشود. این
گزینه
همچنین به
طور ضمنی
گزینه -o را
فعال
میکند.
اگر بلافاصله پس از s حرف a را قرار دهید، آنگاه Remind یادآوریها را در تقویم، هم در روز وقوع واقعی آنها و هم در روزهای قبل از آن که توسط delta یادآوری مشخص شده است نمایش میدهد.
- -p[a][p][p][q][+]n
- گزینه -p بسیار شبیه به گزینه -s است، با این تفاوت که خروجی حاوی اطلاعات اضافی برای استفاده توسط یک برنامه پشتیبان مانند برنامه Rem2PS (که تقویم PostScript تولید میکند) و سایر برنامههای پشتیبان گوناگون است. اگر n با "+" شروع شود، به جای تعداد ماهها، تعداد هفتهها را مشخص میکند و از برنامههای پشتیبان انتظار میرود تقویمهای هفتگی تولید کنند. توجه داشته باشید که همه برنامههای پشتیبان از تقویمهای هفتگی پشتیبانی نمیکنند؛ در حال حاضر فقط rem2pdf و rem2html این کار را انجام میدهند. مشخص کردن تقویم هفتگی به طور ضمنی قالب تبادل خالص JSON را فعال میکند، مشابه -ppp.
قالب خروجی -p در صفحه راهنمای rem2ps(1) شرح داده شده است. اگر بلافاصله پس از p حرف a را قرار دهید، آنگاه Remind یادآوریها را در تقویم، هم در روز وقوع واقعی آنها و هم در روزهای قبل از آن که توسط delta یادآوری مشخص شده است نمایش میدهد. اگر بعد از p یک p دیگر بیاورید، آنگاه Remind به جای قالب "تقویم ساده"، از قالب جامعتری مبتنی بر JSON استفاده میکند. این قالب نیز در صفحه راهنمای rem2ps(1) مستند شده است. در نهایت، اگر از سه p استفاده کنید، مانند -ppp، آنگاه Remind از یک قالب خالص JSON استفاده میکند که آن هم در rem2ps(1) مستند شده است. اگر حرف q را در این گزینه بگنجانید، فیلتر جایگزینی معمول حالت تقویم غیرفعال شده و توالیهای %"...%" در خروجی حفظ میشوند.
توجه داشته باشید که برای ارسال رشتههای INFO به یک برنامه پشتیبان، باید از -pp یا -ppp استفاده کنید. قالب سادهتر -p قادر به انتقال رشتههای INFO به برنامه پشتیبان نیست.
گزینههای -p، -pp و -ppp به طور ضمنی گزینه -o را فعال میکنند.
توجه داشته باشید که گزینههای -pp یا -ppp همچنین گزینه -l را فعال میکنند.
- -l
- اگر از گزینه -l به همراه گزینه -p استفاده کنید، آنگاه Remind اطلاعات اضافی برای برنامههای پشتیبان مانند rem2ps خروجی میدهد. این اطلاعات اضافی به برنامههای پشتیبان اجازه میدهد تا یک یادآوری را با فایل منبع و شماره خط تولیدکننده آن تطبیق دهند.
- -m
- گزینه -m باعث میشود گزینههای -c یا -p تقویمی تولید کنند که ستون اول آن به جای یکشنبه، دوشنبه باشد. (این مطابق با استاندارد بینالمللی است.)
- -v
- گزینه -v خروجی Remind را کمی با جزئیات بیشتر (verbose) میکند. در حال حاضر، این باعث میشود Remind در صورت بروز خطا خط نادرست را تکرار کند، و اگر اسکریپتی متغیر سیستمی $RunOff را بررسی کند، یک پیام امنیتی چاپ کند.
- -o
- گزینه -o باعث میشود Remind تمام دستورالعملهای ONCE را نادیده بگیرد. توجه داشته باشید که در صورت استفاده از هر یک از گزینههای -c، -n، -p، یا -s، در صورت استفاده از ضریب تکرار *n، یا در صورتی که تاریخی غیر از تاریخ امروز در خط فرمان مشخص شده باشد، ONCE نیز نادیده گرفته میشود.
- -t
- گزینه -t باعث میشود Remind تمام یادآوریهای منقضینشده را بدون در نظر گرفتن delta مشخصشده برای هر یادآوری، فعال (trigger) کند.
- -tn
- اگر بعد از گزینه -t عددی به صورت n ارائه دهید، آنگاه Remind فرض میکند هر دستور REM فارغ از هر دلتای موجود، دارای دلتایی به صورت ++n است.
- -tz
- اگر بعد از گزینه -t حرف z را وارد کنید، آنگاه Remind دلتای تمام دستورات REM را فارغ از مقدار ارائهشده در خود عبارت REM برابر صفر قرار میدهد. در عمل، این کار تمام دلتاهای به شکل +n و ++n را غیرفعال میکند.
- -tt[n]
- گزینه -tt باعث میشود Remind یک دلتای پیشفرض n دقیقهای را برای تمام یادآوریهای زماندار در نظر بگیرد. اگر -tt بدون n داده شود، یک دلتای پیشفرض ۵ دقیقهای استفاده میشود.
- -h
- گزینه -h (سکوت یا "hush...") پیامهای هشدار و اطلاعاتی خاصی را سرکوب میکند. به ویژه، اگر هیچ یادآوری فعال نشود، این حالت هیچ خروجی تولید نمیکند.
- -a
- گزینه -a باعث میشود Remind یادآوریهای زمانداری را که در روز جاری فعال میشوند، بلافاصله فعال نکند. همچنین باعث میشود Remind یادآوریهای زماندار را در تقویم قرار ندهد. اگر دو یا چند گزینه -a ارائه دهید، آنگاه Remind یادآوریهای زمانداری را که در آینده هستند فعال خواهد کرد، اما یادآوریهای زمانداری را که زمان آنها سپری شده است فعال نمیکند. (صرفنظر از اینکه چند گزینه -a ارائه دهید، در صورت استفاده از حداقل یک گزینه -a، Remind یادآوریهای زماندار را در تقویم نخواهد گنجاند.)
- -q
- گزینه -q باعث میشود Remind یادآوریهای زماندار را برای اجرای بعدی در صف قرار ندهد.
- -f
- گزینه -f باعث میشود Remind هنگام پردازش یادآوریهای صفبندیشده به جای ایجاد یک فرایند پسزمینه برای مدیریت آنها، در پیشزمینه باقی بماند.
- -e
- گزینه -e پیامهای خطا را (که معمولاً به جریان خطای استاندارد ارسال میشوند) به جریان خروجی استاندارد هدایت میکند.
- -dchars
- گزینه -d حالتهای اشکالزدایی خاصی را فعال میکند. نویسههای chars مشخص میکنند کدام حالتها فعال شوند:
- e
- تکرار (Echo) تمام خطوط ورودی
- x
- ردیابی ارزیابی تمام عبارتها
- t
- نمایش تمام محاسبات تاریخ راهاندازی (trigger date)
- v
- تخلیه جدول متغیرها پس از اجرای اسکریپت یادآوری
- l
- تکرار خطوط هنگام نمایش پیامهای خطا
- f
- ردیابی خواندن فایلهای یادآوری
- p
- صدور هشدار در صورتی که یک POP-OMIT-CONTEXT، POP-VARS یا POP-FUNCS با یک PUSH متناظر در فایلی متفاوت مطابقت داشته باشد.
- s
- ردیابی تجزیه عبارت و نمایش درخت داخلی گرههای عبارت. این مورد بعید است مفید باشد مگر اینکه روی موتور ارزیابی عبارات Remind کار کنید.
- h
- تخلیه آمار جدول درهمسازی (hash table) هنگام خروج.
- u
- هنگام خروج Remind، فهرستی از متغیرهایی که SET شدهاند اما بعداً استفاده نشدهاند چاپ میشود.
توجه داشته باشید که فلگ اشکالزدایی u ممکن است هشدارهای کاذب تولید کند. برای مثال، این توالی از دستورات:
DEBUG +u
SET a 1
IFTRIG Wed
MSG a = [a]
ENDIF
هشداری مبنی بر بلااستفاده بودن a صادر خواهد کرد، مگر اینکه در روز چهارشنبه اجرا شود.
- -g[a|d[a|d[a|d[a|d]]]]
- به طور
معمول،
یادآوریها
به ترتیبی
که در
اسکریپت
یادآوری با
آنها
برخورد
میشود،
صادر
میگردند.
گزینه -g
باعث
میشود Remind
یادآوریها
را قبل از
صدور، بر
اساس تاریخ
و زمان مرتب
کند.
نویسههای
اختیاری a و
d ترتیب
مرتبسازی
(صعودی یا
نزولی) را
برای
فیلدهای
تاریخ،
زمان و
اولویت
مشخص
میکنند.
برای
اطلاعات
بیشتر به
بخش "SORTING REMINDERS"
مراجعه
کنید.
توجه داشته باشید که اگر از گزینه -n استفاده کنید، گزینه -g نادیده گرفته میشود.
- -b[n]
- تنظیم قالب زمان برای خروجیهای تقویم و تقویم ساده. مقدار N میتواند از 0 تا 2 باشد، با مقدار پیشفرض 0. مقدار 0 باعث میشود زمانها در قالب ۱۲ ساعته (قبل از ظهر/بعد از ظهر) درج شوند. مقدار 1 باعث درج زمانها در قالب ۲۴ ساعته میشود، و مقدار 2 از درج خودکار زمانها در خروجی تقویم جلوگیری میکند.
- -x[n]
- محدودیت تکرار را برای بند SATISFY یک دستور REM تنظیم میکند. پیشفرض 1000 است.
- -kcmd
- به جای چاپ ساده یادآوریهای نوع MSG، این گزینه باعث میشود آنها به cmd مشخصشده ارسال شوند. باید از '%s' در جایی که میخواهید بدنه ظاهر شود استفاده کنید، و ممکن است لازم باشد این گزینه را در علامت نقلقول قرار دهید. توجه داشته باشید که تمام نویسههای شل در بدنه یادآوری با یک بکاسلش اسکیپ میشوند، و کل بدنه یادآوری به عنوان یک آرگومان واحد ارسال میشود. توجه داشته باشید که این گزینه بر گزینه -r و دستور RUN OFF ارجحیت دارد.
remind '-kxmessage %s &' ...
تا تمام یادآوریهای نوع MSG شما با استفاده از xmessage پردازش شوند.
یک کلمه هشدار: تولید دهها فرایند xmessage با روش فوق بسیار آسان است. بنابراین بسیار مراقب باشید. از آنجا که تمام نویسههای شل و فاصلهها اسکیپ شدهاند، برنامهای که با گزینه -k اجرا میکنید باید آمادگی مدیریت کل پیام را به عنوان یک آرگومان واحد داشته باشد.
اگر پس از گزینه -k یک دونقطه قرار دهید، آنگاه دستور فقط برای یادآوریهای زماندار صفبندیشده اعمال میشود. یادآوریهای عادی طبق معمول مدیریت میشوند. در مثال بالا، اگر میخواهید یادآوریهای عادی طبق معمول نمایش داده شوند، اما یادآوریهای صفبندیشده به notify-send فرستاده شوند، میتوانید از دستور زیر استفاده کنید:
remind '-k:notify-send %s &' ...
میتوانید از هر دو حالت -kcmd1 و -k:cmd2 برای استفاده از دستورات مختلف جهت یادآوریهای صفبندیشده در مقابل غیر صفبندیشده استفاده کنید.
- -z[n] Runs Remind in "daemon mode". If n
- is supplied, it specifies how often (in minutes) Remind should wake up to check if the reminder script has been changed. N defaults to 1, and can range from 1 to 60. Note that the use of the -z option also enables the -f option.
اگر گزینه -zj را ارائه دهید، Remind در یک حالت ویژه به نام server mode (حالت کارگزار) اجرا میشود. این مورد در صفحه راهنمای tkremind مستند شده است؛ tkremind(1) را ببینید. گزینه قدیمیتر حالت کارگزار یعنی -z0 هنوز کار میکند، اما منسوخ شده است؛ این گزینه به جای استفاده از JSON برای ارتباط با کلاینت، از یک روش موردی (ad-hoc) برای برقراری ارتباط با کلاینت استفاده میکند.
- -uname
- اجرای Remind با uid و gid کاربری که توسط name مشخص شده است. این گزینه uid و gid را همانطور که توضیح داده شد تغییر میدهد و متغیرهای محیطی HOME، SHELL و USER را به ترتیب روی دایرکتوری خانگی، شل و نام کاربری کاربر مشخصشده تنظیم میکند. متغیر LOGNAME نیز روی نام کاربری مشخصشده تنظیم میشود. این گزینه برای استفاده در اسکریپتهای شل در نظر گرفته شده است که یادآوریها را به تمام کاربران ایمیل میکنند. توجه داشته باشید که از نسخه 3.00.17 برنامه Remind، استفاده از -u به طور ضمنی به معنای -r است -- یعنی دستورالعمل RUN و توابع shell() غیرفعال میشوند. با این حال، اگر نام name را با علامت + پیشوند کنید، RUN و shell() غیرفعال نمیشوند. به عبارت دیگر، -uwhatever کاربر را به whatever تغییر داده و RUN را غیرفعال میکند، در حالی که -u+whatever کاربر را به whatever تغییر میدهد اما RUN را فعال باقی میگذارد.
- -+username
- باعث میشود Remind به فایلهای متعلق به کاربر username اعتماد کند. به طور معمول، اگر Remind فایلی را بخواند که شما مالک آن نیستید، RUN و تابع shell() را غیرفعال میکند. این گزینه باعث میشود به فایلهای متعلق به username نیز اعتماد کند. میتوانید چندین گزینه -+ را برای اعتماد به چندین کاربر، تا حداکثر ۲۰ کاربر قابل اعتماد، ارائه دهید.
- -y
- باعث میشود Remind برای هر یادآوری که فاقد بند TAG است یک برچسب (tag) تولید کند.
- -ivar=expr
- مقدار var مشخصشده را روی expr تنظیم میکند و var را حفظ میکند. مقدار Expr میتواند هر عبارت معتبر Remind باشد. برای جزئیات بیشتر به بخش "INITIALIZING VARIABLES ON THE COMMAND LINE" مراجعه کنید. اگر بخش =expr را حذف کنید، آنگاه var با 0 مقداردهی اولیه میشود. به عبارت دیگر، -ivar دقیقاً مشابه -ivar=0 است.
- -ifunc(args)=definition
- به شما امکان میدهد یک تابع را در خط فرمان تعریف کنید.
اگر یک date در خط فرمان وارد کنید، باید شامل [day] month [year] باشد، که در آن day روز ماه است، month حداقل سه حرف اول نام انگلیسی ماه است، و year یک سال (هر ۴ رقم) از ۱۹۹۰ تا حدود ۲۰۷۵ است. میتوانید day را حذف کنید که در این صورت پیشفرض آن ۱ خواهد بود. اگر سال را حذف کنید، به سال جاری پیشفرض میشود. شما نمیتوانید month را حذف کنید.
اگر یک date در خط فرمان وارد کنید، آنگاه Remind به جای تاریخ واقعی سیستم، از آن به عنوان مفهوم "امروز" خود استفاده میکند. این به شما امکان میدهد تقویمهایی برای ماههای آینده ایجاد کنید، یا بررسی کنید که یادآوریهای شما چگونه در آینده فعال خواهند شد. به طور مشابه، میتوانید یک time برای تنظیم مفهوم "اکنون" در Remind روی یک زمان خاص ارائه دهید. ارائه یک time در خط فرمان همچنین به طور ضمنی گزینه -q را فعال کرده و گزینه -z را غیرفعال میکند. مقدار time ممکن است در قالب ۲۴ ساعته (مانند 13:20) یا قالب رایج "AM/PM" (مانند 1:20pm) مشخص شود.
اگر ترجیح میدهید تاریخ را کوتاهتر مشخص کنید، میتوانید آن را به صورت YYYY-MM-DD یا YYYY/MM/DD ارائه دهید. حتی میتوانید تاریخ و زمان را به عنوان یک آرگومان در خط فرمان مشخص کنید: YYYY-MM-DD@HH:MM.
همچنین میتوانید تاریخ را با افزودن نماد اتساین "@" به عنوان پیشوند، به صورت یک راهانداز (trigger) مشخص کنید. ممکن است لازم باشد آرگومان را در نقلقول قرار دهید. در این حالت، Remind هر چیزی را پس از "@" به عنوان یک راهانداز ارزیابی میکند و تاریخ راهانداز حاصل به عنوان تاریخ مؤثر استفاده میشود. برای مثال، اگر میخواهید ببینید چه یادآوریهایی در جمعه سیزدهم بعدی فعال میشوند، میتوانید از این دستور استفاده کنید:
remind .reminders '@13 SATISFY [$Tw == 5]'
همچنین میتوانید تاریخ را مستقیماً مشخص کرده و از یک آرگومان راهانداز "@" استفاده کنید؛ در این حالت، Remind از تاریخ مشخصشده به عنوان نقطه شروع برای محاسبه راهانداز استفاده میکند. به عنوان مثال:
remind .reminders 2026-07-01 '@13 SATISFY [$Tw == 5]'
مفهوم "امروز" در Remind را روی 2026-11-13 تنظیم خواهد کرد، زیرا این اولین جمعه سیزدهم در تاریخ 2026-07-01 یا پس از آن است.
علاوه بر این، میتوانید یک پارامتر repeat ارائه دهید که به فرم *rep است. این کار باعث میشود Remind به تعداد rep بار اجرا شود و تاریخ در هر تکرار افزایش یابد. ممکن است مجبور شوید این پارامتر را در نقلقول قرار دهید تا از بسط شل جلوگیری شود. برای اطلاعات بیشتر، زیربخش "Repeated Execution" در بخش "CALENDAR MODE" را ببینید.
گزینههای طولانی (LONG OPTIONS)
دستور Remind از گزینههای طولانی زیر پشتیبانی میکند که به حروف بزرگ و کوچک حساس هستند:
- --version
- گزینه --version باعث میشود Remind شماره نسخه خود را در خروجی استاندارد چاپ کرده و سپس خارج شود.
- --hide-completed-todos
- در حالت تقویم، Remind معمولاً تمام TODOها را نشان میدهد. اگر این گزینه را وارد کنید، TODOهایی را که به عنوان تکمیلشده علامتگذاری شدهاند نشان نخواهد داد.
- --only-todos
- فقط یادآوریهای نوع TODO را صادر میکند.
- --only-events
- یادآوریهای نوع TODO را صادر نمیکند.
- --json
- در حالت دستور کار (Agenda Mode)، خروجی JSON را به جای خروجی معمول حالت متنی تولید میکند. همچنین --json مرتبسازی (گزینه -g) و صفبندی (گزینه -q) را غیرفعال میکند. برای جزئیات بیشتر به بخش "AGENDA MODE JSON OUTPUT" مراجعه کنید. گزینه --json در حالت تقویم نادیده گرفته میشود. توجه داشته باشید که در حالت JSON، خروجی حاصل از هر یادآوری نوع RUN که معمولاً در خروجی استاندارد ظاهر میشد، به جای آن به خطای استاندارد هدایت میشود؛ این امر برای این است که یادآوریهای نوع RUN خروجی را به هم نریزند و باعث تولید JSON نامعتبر در خروجی استاندارد نشوند.
- --print-errs
- گزینه --print-errs باعث میشود Remind تمام پیامهای خطای ممکن را در خروجی استاندارد چاپ کرده و سپس خارج شود. پیامها در قالبی مناسب برای آرگومان اول دستور TRANSLATE چاپ میشوند. اگر پیامهای خطا را با TRANSLATE ترجمه کنید، Remind هنگام نمایش پیامهای خطا و هشدار از نسخههای ترجمهشده استفاده خواهد کرد. همچنین به TRANSLATE GENERATE در بخش "THE TRANSLATION TABLE" مراجعه کنید.
توجه داشته باشید که اگر یک پیام ترجمهنشده حاوی توالیهای قالببندی سبک printf مانند "%s" یا "%d" باشد، پیام ترجمهشده باید حاوی همان توالیها با همان ترتیب باشد، در غیر این صورت Remind آن را نادیده گرفته و از پیام اصلی ترجمهنشده استفاده خواهد کرد.
- --print-config-cmd
- این گزینه باعث میشود Remind دستور دقیق ./configure را که هنگام ساخت Remind استفاده شده بود، چاپ کند. با اجرای دستور زیر میتوانید از این گزینه برای ساخت نسخه جدیدی از Remind با استفاده از همان پیکربندی قبلی استفاده کنید:
eval `remind --print-config-cmd`
از دایرکتوری سطح بالای سورسکد Remind. (با این حال، ایمنتر است که دستور remind --print-config-cmd را اجرا کرده و پس از بررسی درست بودن ظاهر آن، دستور را تایپ و اجرا کنید.)
- --print-tokens
- گزینه --print-tokens باعث میشود Remind توکنهای استفادهشده توسط تجزیهکننده، نام توابع داخلی و نام متغیرهای سیستم را در خروجی استاندارد چاپ کرده و سپس خارج شود. این خروجی طوری طراحی شده است که ساخت فایل برجستهسازی نحوی (syntax-highlighting) برای ویرایشگرهای متن مختلف آسان باشد. این خروجی را میتوان با دست یا با یک اسکریپت با آسانی نسبی به یک فایل برجستهسازی نحوی تبدیل کرد.
- --max-execution-time=n
- کل زمان اجرا (اندازهگیریشده بر اساس ساعت دیواری) را به n ثانیه محدود میکند. این مورد زمانی مفید است که Remind روی فایلهای بالقوه غیرقابل اعتماد اجرا شود که ممکن است تلاش کنند منابع زیادی مصرف نمایند. توجه داشته باشید که محدودیت n تقریبی است و ممکن است Remind یک یا دو ثانیه بیشتر قبل از کشته شدن اجرا شود. اگر n به صورت صفر مشخص شود، هیچ محدودیتی اعمال نمیشود، درست مانند زمانی که از این گزینه اصلاً استفاده نشده باشد.
اگر محدودیتی اعمال شود، فقط روی اجرای پیشزمینه Remind اعمال میشود. اگر Remind پردازش اسکریپت را تمام کند و سپس شروع به مدیریت یادآوریهای صفبندیشده نماید، محدودیت زمانی به بدون محدودیت بازنشانی میشود.
- --max-expr-complexity=n
- پیچیدگی کل ارزیابی عبارت را برای یک خط مشخص در اسکریپت به n گره محدود میکند. به طور کلی، هر فراخوانی تابع، عملگر، مقدار ثابت، ارجاع به متغیر و غیره متناظر با یک گره عبارت است. به طور پیشفرض، این محدودیت روی 10000000 (ده میلیون) تنظیم شده است. اگر مایل نیستید هیچ محدودیتی اعمال شود، میتوانید آن را صریحاً روی صفر تنظیم کنید. با این حال، محدودیت پیشفرض ده میلیون هرگز نباید توسط هیچ اسکریپت معقول Remind فعال شود و ما تغییر این محدودیت را توصیه نمیکنیم.
- --test
- گزینه طولانی --test فقط برای استفاده توسط آزمونهای پذیرش که با "make test" اجرا میشوند در نظر گرفته شده است. از این گزینه در محیط عملیاتی استفاده نکنید.
- --flush
- گزینه طولانی --flush جریانهای خروجی استاندارد و خطای استاندارد Remind را بدون بافر میکند. این گزینه بیشتر برای آزمایش استفاده میشود و احتمالاً نباید در محیط عملیاتی استفاده شود.
فایلهای یادآوری (REMINDER FILES)
برنامه Remind برای کنترل عملکرد خود از اسکریپتها استفاده میکند. میتوانید از هر ویرایشگر متنی که قادر به ایجاد فایلهای متنی ساده است برای ساخت یک اسکریپت Remind استفاده کنید. دستورات درون یک اسکریپت میتوانند از دستورات بسیار ساده و تقریباً بلافاصله قابل فهم:
REM Mar 31 MSG International Transgender Day of Visibility
تا موارد بسیار پیچیده و مبهم را در بر گیرند:
REM [date(thisyear, 1, 1) + 180] ++5 OMIT \ sat sun BEFORE MSG [ord(thisyear-1980)] payment due %b!
یک فایل یادآوری شامل دستورات است، با یک دستور در هر خط. چندین خط را میتوان با استفاده از نویسه بکاسلش، مانند مثال بالا، ادامه داد. در این حالت، تمام خطوط متصلشده توسط Remind به عنوان یک خط واحد در نظر گرفته میشوند. توجه داشته باشید که در صورت بروز خطا، Remind شماره خط آخرین خط از یک خط ادامهیافته را گزارش میدهد.
برنامه Remind خطوط خالی و خطوطی را که با نویسههای '#' یا ';' شروع میشوند نادیده میگیرد. اگر میخواهید یک اسکریپت Remind را از پیشپردازنده C عبور دهید (که نویسه '#' را به عنوان شروع یک دستورالعمل پیشپردازش تفسیر میکند)، میتوانید از نقطه ویرگول به عنوان نویسه کامنت استفاده کنید.
توجه داشته باشید که Remind ادامه خطوط را قبل از هر چیز دیگری پردازش میکند. برای مثال:
# 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)
برنامه Remind به حروف بزرگ و کوچک حساس نیست؛ به طور کلی میتوانید از هر ترکیبی از حروف بزرگ یا کوچک برای دستورات، پارامترها، گزینههای فراخوانی و غیره استفاده کنید.
دستور REM (THE REM COMMAND)
قدرتمندترین دستور در یک اسکریپت Remind، دستور REM است. این دستور مسئول صدور یادآورها است. نحو آن به صورت زیر است:
بخشهای دستور REM میتوانند با هر ترتیبی مشخص شوند، به جز اینکه body باید بلافاصله پس از کلیدواژه MSG، RUN، CAL، PS، PSFILE یا SATISFY قرار گیرد. بخشی از دستور REM که پیش از بندهای MSG، MSF، RUN، CAL یا SATISFY میآید، فعالساز (trigger) نامیده میشود.
در نسخههای پیشین Remind، توکن REM اختیاری بود، مشروط بر اینکه باقیمانده دستور با دستور دیگری از Remind اشتباه گرفته نشود. با این حال، این کاربرد منسوخ شده است و اکنون موجب صدور یک هشدار میشود. تمام خطوط یادآور شما باید طوری نوشته شوند که با دستور REM آغاز گردند.
MSG، MSF، RUN، CAL، SPECIAL، PS و PSFILE
این کلیدواژهها نوع (type) یادآور را مشخص میکنند. (SATISFY پیچیدهتر است و بعداً توضیح داده خواهد شد.) یک یادآور از نوع MSG بهطور معمول پیامی را پس از عبور دادن body از یک فیلتر جایگزینی ویژه (که در بخش «THE SUBSTITUTION FILTER» شرح داده شده است) در خروجی استاندارد چاپ میکند. با این حال، اگر از گزینه خط فرمان -k استفاده کرده باشید، یادآورهای نوع MSG به برنامه مناسب ارسال میشوند. توجه داشته باشید که گزینههای -c، -s، -p و -n گزینه -k را غیرفعال میکنند.
نسخههای پیشین Remind اجازه میدادند نوع یادآور را حذف کنید، که در این صورت پیشفرض آن MSG در نظر گرفته میشد. با این حال، این کاربرد منسوخ شده است و موجب صدور یک هشدار میشود. چیزی شبیه به:
REM 6 January Dianne's Birthday
هشدار «Missing REM type; assuming MSG» را صادر خواهد کرد.
کلیدواژه MSF تقریباً همانند کلیدواژه MSG است، با این تفاوت که یادآور به گونهای قالببندی میشود که در قالبی شبیه به پاراگراف جای گیرد. سه متغیر سیستمی قالببندی یادآورهای نوع MSF را کنترل میکنند - آنها $FirstIndent، $SubsIndent و $FormWidth هستند. این متغیرها در بخش «SYSTEM VARIABLES» بررسی شدهاند. کلیدواژه MSF باعث تغییر فاصلهگذاری یادآور شما میشود - فاصلههای اضافی حذف میشوند و پس از نقطهها و سایر نویسهها، طبق آنچه متغیرهای سیستمی $EndSent و $EndSentIg مشخص کردهاند، دو فاصله قرار میگیرد. توجه داشته باشید که اگر بدنه یادآور شامل نویسههای خط جدید باشد (که با دنباله %_ در آنجا قرار داده شدهاند)، با خطوط جدید به عنوان آغاز پاراگرافهای تازه رفتار میشود و تورفتگی $FirstIndent برای خط بعدی به کار میرود. میتوانید از دو خط جدید متوالی استفاده کنید تا پاراگرافهای فاصلهدار از یک بدنه یادآور منفرد منتشر شوند.
یک یادآور از نوع RUN نیز body را از فیلتر جایگزینی عبور میدهد، اما سپس نتیجه را به عنوان یک دستور سیستم اجرا میکند. یک یادآور از نوع CAL تنها برای قرار دادن مدخلها در تقویمی استفاده میشود که هنگام اجرای Remind با گزینههای -c، -s یا -p تولید میشود. هنگامی که Remind دستوری را اجرا میکند، ورودی استاندارد آن دستور را به گونهای تنظیم میکند که از /dev/null خوانده شود.
یادآورهای نوع PS یا PSFILE برای ارسال مستقیم کد PostScript به چاپگر هنگام تولید تقویمهای PostScript استفاده میشوند. این قابلیت میتواند برای سایهزدن برخی مدخلهای تقویم (تابع ()psshade را ببینید)، گنجاندن گرافیک در تقویم، یا تقریباً هر هدف دیگری که به فکرتان برسد به کار رود. نباید از این انواع یادآور استفاده کنید مگر اینکه یک برنامهنویس خبره PostScript باشید. یادآورهای PS و PSFILE نادیده گرفته میشوند مگر اینکه Remind با گزینه -p اجرا شود. برای جزئیات بیشتر به بخش «More about PostScript» مراجعه کنید.
یادآور از نوع SPECIAL برای انتقال اطلاعات «خارج از باند» (out-of-band) از Remind به بکاند تولیدکننده تقویم به کار میرود. این کلیدواژه باید با کلمهای دنبال شود که نوع داده ویژه در حال ارسال را مشخص میکند. نوع یک یادآور ویژه به بکاند بستگی دارد. برای بکاند Rem2PS، عبارت SPECIAL PostScript معادل یک یادآور نوع PS است، و SPECIAL PSFile معادل یک یادآور نوع PSFILE است. بدنه یک یادآور SPECIAL بدیهی است که وابسته به بکاند است. یک بکاند باید هر SPECIAL را که نمیشناسد نادیده بگیرد.
مشخصات تاریخ (DATE SPECIFICATIONS)
یک date_spec شامل صفر تا چهار بخش است. این بخشها عبارتند از: day (روز ماه)، month (نام ماه)، year (سال) و weekday. Month و weekday نامهای انگلیسی ماهها و روزهای هفته هستند. دستکم باید سه نویسه اول آنها استفاده شود. در ادامه مثالهایی از بخشهای گوناگون یک date_spec آورده شده است:
- day:
- 1, 22, 31, 14, 3
- month:
- JANUARY, feb, March, ApR, may, Aug
- year:
- 1990, 1993, 2030. سال میتواند در بازه 1990 تا 2075 باشد.
- weekday:
- Monday, tue, Wed, THU, Friday, saturday, sundAy
توجه داشته باشید که میتواند چندین مولفه weekday جداشده با فاصله در یک date_spec وجود داشته باشد.
تفسیر مشخصات تاریخ (INTERPRETATION OF DATE SPECIFICATIONS)
مثالهای زیر نشان میدهند که مشخصات تاریخ چگونه تفسیر میشوند.
1. مشخصات تاریخ تهی (Null) - یادآور هر روز فعال میشود. تاریخ فعالسازی برای یک اجرای خاص، صرفاً تاریخ جاری سیستم است. به عنوان مثال:
REM MSG This is triggered every time Remind runs
2. فقط day حضور دارد. یادآور در روز مشخصشده از هر ماه فعال میشود. تاریخ فعالسازی برای یک اجرای خاص، نزدیکترین روز از این نوع به تاریخ جاری سیستم است. به عنوان مثال:
REM 1 MSG First of every month. REM 31 MSG 31st of every month that has 31 days.
3. فقط month حضور دارد. یادآور در هر روز از ماه مشخصشده فعال میشود. مثال:
REM Feb MSG Every day in February
4. day و month حضور دارند. مثالها:
REM 6 Jan MSG Every 6th of January REM Feb 29 MSG Every 29th of February
5. فقط year حضور دارد. مثال:
REM 1991 MSG Every day in 1991
6. year و day حضور دارند. مثالها:
REM 1 1990 MSG 1st of every month in 1990 REM 1992 23 MSG 23rd of every month in 1992
7. year و month حضور دارند. مثالها:
REM Feb 1991 MSG Every day in Feb 1991 REM 1992 September MSG Every day in Sept 1992
8. year, month و day حضور دارند. مثالها:
REM 8 Jan 1991 MSG 8th January 1991. REM 1992 March 9 MSG 9th March 1992.
9. فقط weekday. مثالها:
REM Sat MSG Every Saturday REM Mon Tue Wed Thu Fri MSG Every working day REM Monday Wednesday MSG Every Monday and Wednesday
10. weekday و day حضور دارند. مثالها:
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
11. weekday و month حضور دارند. مثالها:
REM Mon March MSG Every Monday in March REM Mon Tue Wed Thu Fri Feb MSG Every working day in February
12. weekday, month و day حضور دارند. مثالها:
REM Mon 1 March MSG First Monday in March REM Sat Sun 15 July MSG First Sat or Sun on or after 15 July
13. weekday و year حضور دارند. مثال:
REM Sat Sun 1991 MSG Every Saturday and Sunday in 1991
14. weekday, day و year حضور دارند. مثالها:
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
15. weekday, month و year حضور دارند. مثال:
REM Mon Wed 1991 Feb MSG Every Mon and Wed in Feb 1991.
16. weekday, day, month و year حضور دارند. مثال:
REM Mon Tue Wed Thu Fri 28 Oct 1990 \ MSG 1st working day on or after 28 October 1990.
توجه داشته باشید هنگامی که هر دوی weekday و day مشخص شده باشند، Remind نخستین تاریخی را برمیگزیند که در همان day مشخصشده یا پس از آن باشد و همچنین شرط weekday را برآورده کند. این کار را با انتخاب نخستین تاریخی انجام میدهد که در همان day مشخصشده یا پس از آن قرار دارد و در فهرست weekday ها آمده است. بنابراین، یادآوری مانند:
REM Mon Tue 28 Oct 1990 MSG Hi
تنها در روز دوشنبه ۲۹ اکتبر ۱۹۹۰ صادر خواهد شد. این یادآور در روز سهشنبه ۳۰ اکتبر ۱۹۹۰ صادر نخواهد شد، زیرا ۲۹ام نخستین تاریخی است که قیود weekday را برآورده میسازد.
مشخصات کوتاه تاریخ (SHORT-HAND DATE SPECIFICATIONS)
علاوه بر نوشتن جداگانه روز، ماه و سال، میتوانید از قالب YYYY-MM-DD یا YYYY/MM/DD استفاده کنید. به عنوان مثال، دستورهای زیر معادل یکدیگرند:
REM 5 June 2010 MSG Cool! REM 2010-06-05 MSG Cool!
همچنین میتوانید تاریخ و زمان را به صورت YYYY-MM-DD@HH:MM مشخص کنید. این دستورها معادل یکدیگرند:
REM 19 Dec 2010 AT 16:45 MSG Hi REM 2010-12-19@16:45 MSG Hi
یک نکته ظریف درباره مشخصات کوتاه تاریخ وجود دارد: دستورهای زیر معادل یکدیگر نیستند:
REM 19 Dec 2010 AT 16:45 +60 MSG Hi REM 2010-12-19@16:45 +60 MSG Hi
در دستور دوم، مقدار «+60» یک delta است که بر تاریخ اعمال میشود، نه یک tdelta که بر زمان اعمال گردد. توصیه میکنیم برای یادآورهای زماندار، صراحتاً از کلیدواژه AT استفاده کنید.
الگوریتم REMIND (THE REMIND ALGORITHM)
برنامه Remind از الگوریتم زیر برای محاسبه تاریخ فعالسازی استفاده میکند: از تاریخ جاری شروع کرده و تکتک روزها را یکییکی بررسی میکند تا به تاریخی برسد که مشخصات تاریخ را برآورده سازد، یا برایش محرز شود که چنین تاریخی وجود ندارد. (در واقعیت، Remind صرفاً رفتاری شبیه به این الگوریتم دارد؛ این کار در عمل بسیار کند خواهد بود. در درون سیستم، Remind از روشهای بسیار سریعتری برای محاسبه تاریخ فعالسازی بهره میبرد.) برای اطلاعات بیشتر، بخش «DETAILS ABOUT TRIGGER COMPUTATION» را ببینید.
پیمایش رو به عقب (BACKWARD SCANNING)
گاهی لازم است تاریخی به عنوان مدت زمانی مشخص پیش از تاریخی دیگر تعیین شود. به عنوان مثال، آخرین دوشنبه یک ماه مفروض، به عنوان نخستین دوشنبه ماه بعد، منهای ۷ روز محاسبه میشود. مشخصه back در یادآور برای همین وضعیت به کار میرود:
REM Mon 1 -7 MSG Last Monday of every month.
یک back با یک یا دو خط تیره به همراه یک عدد صحیح مشخص میشود. این کار باعث میشود Remind از آنچه معمولاً تاریخ فعالسازی بود به سمت «عقب» حرکت کند. تفاوت میان --7 و -7 هنگام شرح کلیدواژه OMIT توضیح داده خواهد شد.
هشدار پیشهنگام (ADVANCE WARNING)
برای برخی یادآورها، مناسب است که هشداری پیشهنگام از رویداد دریافت شود. برای نمونه، شاید بخواهید چند روز پیش از تولد فردی به شما یادآوری شود. بخش delta در دستور REM به این هدف دست مییابد. این بخش با یک یا دو علامت «+» و به دنبال آن یک عدد n مشخص میشود. مجدداً، تفاوت میان قالبهای «+» و «++» ذیل کلیدواژه OMIT توضیح داده خواهد شد. Remind یادآور را هم در تاریخ فعالسازی محاسبهشده و هم در تکتک n روز پیش از رویداد فعال خواهد کرد. در ادامه چند مثال آورده شده است:
REM 6 Jan +5 MSG Remind me of birthday 5 days in advance.
مثال بالا در هر ۶ام ژانویه، و همچنین از ۱ام تا ۵ام ژانویه فعال خواهد شد.
یادآورهای دورهای (PERIODIC REMINDERS)
پیشتر سازوکارهای توکار را برای انواع خاصی از یادآورهای دورهای دیدهایم. برای مثال، رویدادی که هر چهارشنبه رخ میدهد را میتوان چنین مشخص کرد:
REM Wed MSG Event!
با این حال، رویدادهایی که به صورت روزانه، هفتگی، ماهانه یا سالانه تکرار نمیشوند، نیازمند رویکرد دیگری هستند. مولفه repeat در دستور REM این نیاز را برطرف میکند. برای استفاده از آن، باید یک تاریخ را بهطور کامل مشخص کنید (سال، ماه و روز، و در صورت تمایل روز هفته)؛ این تاریخ، تاریخ آغاز دوره تکرار است. مولفه repeat یک علامت ستاره است که با عددی دنبال میشود که دوره تکرار را بر حسب روز مشخص میسازد.
به عنوان مثال، فرض کنید هر دو چهارشنبه یکبار حقوق میگیرید و آخرین روز دریافت حقوق شما چهارشنبه ۲۸ اکتبر ۱۹۹۲ بوده است. میتوانید بنویسید:
REM 28 Oct 1992 *14 MSG Payday
این دستور یادآور را از ۲۸ اکتبر ۱۹۹۲، هر ۱۴ روز یکبار صادر میکند. میتوانید از delta و back همراه با repeat استفاده کنید. با این حال توجه داشته باشید که back تنها برای محاسبه تاریخ شروع به کار میرود؛ پس از آن، یادآور با دوره مشخصشده تکرار میشود. به طور مشابه، اگر یک روز هفته را مشخص کنید، فقط برای محاسبه تاریخ شروع به کار میرود و بر دوره تکرار تاثیری نمیگذارد.
SCANFROM و FROM
کلیدواژههای SCANFROM و FROM تنها برای برنامهنویسان پیشرفته Remind هستند و در بخش «DETAILS ABOUT TRIGGER COMPUTATION» در نزدیکی پایان این راهنما توضیح داده خواهند شد. توجه داشته باشید که SCANFROM تنها در نسخههای 03.00.04 به بعد Remind در دسترس است. کلیدواژه FROM تنها از نسخه 03.01.00 و پس از آن در دسترس قرار دارد.
اولویت (PRIORITY)
کلیدواژه PRIORITY باید با عددی از 0 تا 9999 دنبال شود. این کلیدواژه در حالت تقویم و هنگام مرتبسازی یادآورها استفاده میشود. اگر دو یادآور تاریخ و زمان فعالسازی یکسانی داشته باشند، بر اساس اولویت مرتب میشوند. اگر کلیدواژه PRIORITY ارائه نشود، اولویت پیشفرض 5000 استفاده میشود. (این مقدار پیشفرض را میتوان با تنظیم متغیر سیستمی $DefaultPrio تغییر داد. برای اطلاعات بیشتر به بخش «SYSTEM VARIABLES» مراجعه کنید.)
تاریخهای انقضا (EXPIRY DATES)
برخی یادآورها باید به صورت دورهای برای مدت مشخصی صادر شوند، اما سپس منقضی گردند. برای مثال، فرض کنید هر جمعه کلاسی دارید و آخرین جلسه کلاس شما در ۱۱ دسامبر ۱۹۹۲ است. میتوانید بنویسید:
REM Fri UNTIL 11 Dec 1992 MSG Class today.
مثالی دیگر: فرض کنید از ۳۰ نوامبر ۱۹۹۲ تا ۴ دسامبر ۱۹۹۲ وظیفه هیئت منصفه دارید. یادآور زیر پیام را در هر روز از وظیفه هیئت منصفه شما، و همچنین ۲ روز پیش از موعد صادر خواهد کرد:
REM 1992-11-30 *1 +2 UNTIL 1992-12-04 MSG Jury duty
توجه داشته باشید که repeat به صورت *1 الزامی است؛ بدون آن، یادآور تنها در ۳۰ نوامبر (و دو روز پیش از آن) صادر میشد.
به عنوان یک مورد خاص، میتوانید از کلیدواژه THROUGH به جای *1 و UNTIL استفاده کنید. دو دستور REM زیر معادل یکدیگرند:
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
اگر از طریق استفاده از THROUGH یا UNTIL یک تاریخ انقضا داشته باشید، آنگاه Remind هرگز یادآور را پس از تاریخ انقضا فعال نخواهد کرد. برای مثال، اگر این مورد را داشته باشید:
OMIT 2021-01-08 REM 2021-01-01 THROUGH 2021-01-08 AFTER MSG Test
یادآور در 2021-01-08 فعال نخواهد شد، و در 2021-01-09 نیز فعال نمیگردد؛ هرچند کلیدواژه AFTER معمولاً یادآور روز ۸ام را به روز ۹ام منتقل میکرد، اما تاریخ انقضای 2021-01-08 بر آن ارجحیت دارد.
کلیدواژه ONCE (THE ONCE KEYWORD)
گاهی لازم است اطمینان حاصل شود که یادآورها فقط یک بار در یک روز معین اجرا میشوند. به عنوان مثال، دو یادآور زیر را مقایسه کنید:
REM Fri RUN do_backup REM Fri ONCE RUN do_backup
اولی هر بار که Remind را در یک روز جمعه فراخوانی کنید اجرا خواهد شد، در حالی که دومی تنها نخستین باری که Remind را در یک جمعه مشخص فراخوانی کنید اجرا میشود.
برای مثال، اگر Remind را از اسکریپت login. خود اجرا کنید و چندین بار در روز وارد سیستم شوید، برنامه do_backup در یادآور نخست هر بار که وارد میشوید اجرا خواهد شد. اما اگر از کلیدواژه ONCE در یادآور استفاده کنید، Remind تاریخ آخرین دسترسی اسکریپت یادآور را بررسی میکند. اگر با تاریخ جاری یکسان باشد، Remind فرض میکند که از قبل اجرا شده است، و یادآورهای حاوی کلیدواژه ONCE را صادر نخواهد کرد.
توجه داشته باشید که اگر اسکریپت یادآور خود را مشاهده یا ویرایش کنید، تاریخ آخرین دسترسی بهروزرسانی خواهد شد و کلیدواژه ONCE به درستی عمل نخواهد کرد. میتوانید این مشکل را با تنظیم یک فایل برچسب زمانی (timestamp file) برای Remind جهت ردگیری تاریخ آخرین اجرا برطرف کنید؛ مستندات $OnceFile را در بخش SYSTEM VARIABLES ببینید. اگر از ورودی استاندارد به عنوان فایل ورودی Remind استفاده میکنید، آنگاه باید از $OnceFile استفاده کنید تا کلیدواژه ONCE به درستی کار کند.
اگر Remind را با گزینه -o راهاندازی کنید، کلیدواژه ONCE و هرگونه $OnceFile نادیده گرفته خواهند شد.
نادیدهگرفتن محلی روزهای هفته (LOCALLY OMITTING WEEKDAYS)
بخش OMIT از دستور REM برای «نادیده گرفتن» روزهایی خاص هنگام شمارش delta یا back استفاده میشود. این بخش با استفاده از کلیدواژه OMIT و به دنبال آن فهرستی از روزهای هفته مشخص میشود. عملکرد آن به بهترین شکل با چند مثال نشان داده میشود:
REM 1 +1 OMIT Sat Sun MSG Important Event
این یادآور معمولاً در اول هر ماه و همچنین روز پیش از آن فعال میشود. با این حال، اگر اول ماه مصادف با یکشنبه یا دوشنبه باشد، یادآور از جمعه قبلی فعال خواهد شد. این امر به این دلیل است که delta با مقدار +1 هنگام شمارش معکوس از تاریخ فعالسازی برای تعیین میزان هشدار پیشهنگام، شنبه یا یکشنبه را به حساب نمیآورد.
این را با کاربرد «++1» در دستور بالا مقایسه کنید. در این حالت، یادآور در روز اول هر ماه و همچنین روز پیش از آن فعال میشود؛ روزهای نادیدهگرفتهشده شمارش میشوند.
REM 1 -1 OMIT Sat Sun MSG Last working day of month
مجدداً در مثال بالا، مقدار back با -1 معمولاً باعث میشود تاریخ فعالسازی آخرین روز ماه باشد. با این حال، به دلیل بند OMIT، اگر اول ماه مصادف با یکشنبه یا دوشنبه باشد، تاریخ فعالسازی به عقب و از روی آخر هفته عبور کرده و به جمعه منتقل میشود. (اگر تعطیلاتی را به صورت سراسری نادیده گرفته باشید، یادآور به قبل از آنها نیز منتقل میشود. برای جزئیات بیشتر به بخش «The OMIT command» مراجعه کنید.)
در مقایسه، اگر از «--1» استفاده کرده بودیم، یادآور بدون توجه به OMIT در آخرین روز ماه فعال میشد.
اگر روزهای هفته را به صورت محلی نادیده بگیرید اما روزهای هفتهای نیز داشته باشید که به صورت سراسری نادیده گرفته شدهاند، فهرست روزهای هفته نادیدهگرفتهشده اجتماع این دو خواهد بود. این مثال را در نظر بگیرید:
OMIT Sat Sun REM 15 OMIT Fri Sat MSG Whatever
در دستور REM، فهرست موثر روزهای هفته نادیدهگرفتهشده، جمعه، شنبه و یکشنبه خواهد بود.
نادیدهگیریهای محلی محاسباتی (COMPUTED LOCAL OMITS)
عبارت OMITFUNC از دستور REM به شما امکان میدهد تابعی را ارائه دهید که تعیین میکند آیا یک تاریخ نادیده گرفته میشود یا خیر. توجه داشته باشید که به OMITFUNC تنها باید نام یک تابع تعریفشده توسط کاربر داده شود؛ این عبارت نمیتواند یک عبارت دلخواه یا نام یک تابع توکار را بپذیرد.
به تابع یک پارامتر منفرد از نوع DATE داده میشود، و اگر تاریخ «نادیدهگرفتهشده» تلقی شود باید یک عدد صحیح غیر صفر، و در غیر این صورت 0 برگرداند. در اینجا یک مثال آمده است:
FSET _third(x) (day(x) % 3) || \
(wkdaynum(x) == 0) || \
(wkdaynum(x) == 6)
REM OMITFUNC _third AFTER MSG Working day divisible by 3
در مثال بالا، یادآور در هر دوشنبه تا جمعهای که شماره روز ماه آن بر سه بخشپذیر باشد فعال میشود. نحوه کار آن چنین است:
- o
- بخش OMITFUNC _third باعث میشود تمام روزهایی که _third(x) برای آنها مقداری غیر صفر برمیگرداند «نادیدهگرفتهشده» تلقی شوند. این امر باعث میشود تمام روزهایی که شماره روز ماه آنها مضربی از سه نیست نادیده گرفته شوند. توجه داشته باشید که third_ اگر روز هفته یکشنبه یا شنبه باشد نیز غیر صفر برمیگرداند.
- o
- کلیدواژه AFTER باعث میشود یادآور به پس از یک بلوک از روزهای نادیدهگرفتهشده منتقل شود.
ترکیب کلیدواژههای OMITFUNC و AFTER باعث میشود یادآور در تمام روزهایی که شماره روز ماه آنها بر سه بخشپذیر است، اما نه در روزهای شنبه یا یکشنبه، صادر گردد.
توجه داشته باشید که اگر از OMITFUNC استفاده کنید، یک OMIT محلی نادیده گرفته میشود و همچنین تمامی OMITهای سراسری. اگر میخواهید روزهای خاصی از هفته را نادیده بگیرید، تابع نادیدهگیری شما باید آنها را به طور خاص آزمایش کند. اگر میخواهید زمینه OMIT سراسری را در نظر بگیرید، تابع نادیدهگیری شما باید آن را به صورت صریح (با استفاده از تابع ()isomitted) آزمایش کند.
توجه داشته باشید که یک OMITFUNC نادرست ممکن است باعث شود تمام روزها نادیدهگرفتهشده به شمار آیند. به همین دلیل، هنگامی که Remind روزهای نادیدهگرفتهشده را جستجو میکند، جستجو را پس از حد تکرار SATISFY (گزینه خط فرمان -x) متوقف میسازد.
افزودن تاریخهای فعالسازی به زمینه OMIT (ADDING TRIGGER DATES TO THE OMIT CONTEXT)
اگر کلیدواژه ADDOMIT در یک دستور REM ظاهر شود، آنگاه تاریخ فعالسازی (در صورتی که قابل محاسبه باشد) به صورت خودکار به فهرست OMITهای سراسری افزوده میشود.
دستور:
REM ... whatever ... ADDOMIT MSG Foo
از نظر رفتار با دنباله زیر یکسان است:
REM ... whatever ... SATISFY 1
IF trigvalid()
OMIT [trigdate()] MSG Foo
ENDIF
یادآورهای زماندار (TIMED REMINDERS)
یادآورهای زماندار یادآورهایی هستند که یک کلیدواژه AT دارند که با یک time و به صورت اختیاری tdelta و trepeat دنبال میشود. مقدار time ممکن است در قالب ۲۴ ساعته مشخص شود، که در آن 0:00 نشاندهنده نیمهشب، 12:00 نشاندهنده ظهر، و 23:59 نشاندهنده یک دقیقه به نیمهشب است. در غیر این صورت، میتوان آن را در قالب رایج «AM/PM» مشخص کرد؛ در این حالت، ساعت باید در بازه ۱ تا ۱۲ باشد. مقدار 12:00am نشاندهنده نیمهشب، 12:00pm نشاندهنده ظهر، و 11:59pm نشاندهنده یک دقیقه به نیمهشب است. بخشهای «am» و «pm» حساس به حروف کوچک و بزرگ نیستند و حرف «m» اختیاری است.
میتوانید از دونقطه یا نقطه برای جداسازی ساعت از دقیقه استفاده کنید؛ یعنی 13:39 و 13.39 معادل یکدیگرند.
نرمافزار Remind با یادآورهای زماندار به طور ویژهای رفتار میکند. اگر تاریخ فعالسازی یک یادآور زماندار با تاریخ جاری سیستم یکسان باشد، یادآور برای فعالسازی در آینده در صف قرار میگیرد. هنگامی که Remind پردازش فایل یادآور را به پایان رساند، خود را به پسزمینه میبرد، و با رسیدن زمان سیستم به زمان مشخصشده، یادآورهای زماندار را فعال میکند. توجه داشته باشید که اگر از اصلاحکننده NOQUEUE در دستور REM استفاده کنید، این صفبندی و فعالسازی در پسزمینه انجام نمیشود NOQUEUE زمانی مفید است که میخواهید زمانی به یک یادآور اختصاص یابد (مثلاً در تقویم) اما علاقهای به ظاهر شدن یادآور به صورت بالاپران (popup) در زمان مشخصشده ندارید.
اگر از یک tdelta بسیار بزرگ استفاده کنید، Remind یادآورهای با تاریخ آینده را که tdelta و trep اختیاری آنها باعث صدور آنها در امروز میشود، در صف قرار میدهد.
با این حال، اگر از کلیدواژه SCHED استفاده کنید، هرگونه tdelta نادیده گرفته میشود و نمیتوانید یادآور را مجبور کنید که زودتر از تاریخ فعالسازی واقعی در صف قرار گیرد.
برای مثال، یادآور زیر که در هر روز کاری فعال میشود، پیامی صادر میکند که به شما میگوید در ساعت 5:00pm محل را ترک کنید:
REM Mon Tue Wed Thu Fri AT 17:00 MSG Time to leave!
یادآور زیر در پنجشنبهها و جمعهها فعال خواهد شد، اما فقط در روزهای جمعه در صف قرار میگیرد:
REM Fri ++1 AT 1:00PM MSG Lunch at 1pm Friday.
مقادیر tdelta و trepeat قالبی مشابه با repeat و delta دارند، اما بر حسب دقیقه مشخص میشوند. به عنوان مثال، این یادآور در ساعت 12:00pm و همچنین ۴۵ دقیقه پیش از آن فعال خواهد شد:
REM AT 12:00 +45 MSG Example
یادآور زیر از ساعت 10:45 شروع شده و هر نیم ساعت تا 11:45، و مجدداً در ظهر صادر خواهد شد:
REM AT 12:00 +75 *30 MSG Example2
مقدار «+75» بدین معناست که صدور یادآور از ۷۵ دقیقه قبل از ظهر، به عبارت دیگر در ساعت 10:45 آغاز میشود. مقدار 30* مشخص میکند که یادآور پس از آن هر ۳۰ دقیقه یکبار صادر شود. توجه داشته باشید که یادآور همواره در زمان مشخصشده صادر میشود، حتی اگر tdelta مضربی از trepeat نباشد. بنابراین مثال بالا در ساعتهای 10:45am، 11:15am، 11:45am و 12:00pm صادر میشود. توجه کنید که در مشخصات زمان، تفاوتی میان قالبهای «+» و «++» برای tdelta وجود ندارد.
بهطور معمول، Remind هنگام پردازش اسکریپت یادآور، یادآورهای زماندار را صادر میکند و همچنین آنها را برای بعد در صف قرار میدهد. اگر نمیخواهید Remind هنگام پردازش اسکریپت یادآورها را صادر کند، بلکه فقط میخواهید آنها را برای بعد در صف قرار دهد، از گزینه خط فرمان -a استفاده کنید. اگر نمیخواهید یادآورها برای بعد در صف قرار گیرند، از گزینه خط فرمان -q استفاده کنید.
بهطور معمول، Remind یک فرآیند پسزمینه را برای مدیریت یادآورهای در صف فورک میکند. اگر میخواهید Remind در پیشزمینه باقی بماند، از گزینه خط فرمان -f استفاده کنید. این گزینه برای مثال در اسکریپتهای xinitrc. مفید است، جایی که میتوانید از دستور زیر استفاده کنید:
remind -fa myreminders &
این کار تضمین میکند هنگامی که از X-Windows خارج میشوید، فرآیند Remind کشته میشود.
هشدار درباره یادآورهای زماندار (WARNING ABOUT TIMED REMINDERS)
توجه: اگر از توابع یا متغیرهای تعریفشده توسط کاربر (که بعداً شرح داده میشوند) در بدنه یادآورهای زماندار استفاده کنید، هنگامی که یادآورهای زماندار فعال میشوند، متغیرها و توابع تعاریفی را خواهند داشت که در انتهای اسکریپت یادآور برقرار بودهاند. این تعاریف لزوماً ممکن است تعاریفی نباشند که در زمان صفبندی یادآور برقرار بودند. علاوه بر این، زمینه OMIT همان چیزی است که در انتهای اسکریپت یادآور برقرار بوده است، که ممکن است لزوماً با زمانی که دستور REM برای نخستین بار پردازش شد یکسان نباشد.
کلیدواژههای SCHED و WARN (THE SCHED AND WARN KEYWORDS)
کلیدواژه SCHED امکان کنترل دقیقتر فعالسازی یادآورهای زماندار را فراهم میکند، و کلیدواژه WARN کنترل دقیق بر فعالسازی پیشهنگام تمامی انواع یادآورها را میسر میسازد. با این حال، بحث در این باره باید به بعد از توضیح عبارات و توابع تعریفشده توسط کاربر موکول شود. زیربخش «PRECISE SCHEDULING» را در ادامه ببینید.
TAG، INFO و DURATION
کلیدواژه TAG به شما اجازه میدهد یادآورهای خاصی را «برچسبگذاری» کنید. این قابلیت توسط برخی بکاندها یا سیستمهای ساختهشده پیرامون Remind، مانند TkRemind، استفاده میشود. این بکاندها قوانین خاصی درباره برچسبها دارند؛ برای جزئیات به مستندات آنها مراجعه کنید.
کلیدواژه TAG با برچسبی شامل حداکثر ۴۸ نویسه دنبال میشود. در یک عبارت REM مفروض میتوانید هر تعداد بند TAG که مایلید داشته باشید. یک برچسب میتواند شامل هر نویسهای به جز فاصله خالی و کاما باشد.
اگر گزینه -y را به Remind بدهید، برای هر یادآوری که فاقد TAG باشد، یک برچسب ساخته میشود. برچسب ساختهشده شامل نویسههای «__syn__» و به دنبال آن نمایش هگزادسیمال مجموع MD5 خط دستور REM است. این امر به شما امکان میدهد یک شناسه کموبیش یکتا به هر دستور متمایز REM اختصاص دهید.
کلیدواژه INFO مشابه با TAG است اما با هدف انتقال فراداده درباره یک رویداد، مانند مکان آن، در نظر گرفته شده است. بکاندها قوانین خود را درباره اینکه کدام info_stringها را شناسایی میکنند خواهند داشت، و باید info_stringهایی را که نمیشناسند نادیده بگیرند. توجه داشته باشید که INFO باید با یک رشته در گیومه دنبال شود؛ میتوانید با ارائه "\n" خطوط جدید را در رشته بگنجانید.
یک رشته INFO باید به صورت "Header: Value" باشد. سرآیند (Header) میتواند شامل هر نویسه قابل چاپی باشد، اما نمیتواند حاوی فاصله خالی باشد. مقدار (Value) میتواند شامل هر نویسهای باشد که میخواهید. قبل از دونقطه نباید فاصله بیاید، اما بعد از آن مجاز است؛ چنین فاصلهای بخشی از مقدار در نظر گرفته نمیشود. اگر بیش از یک رشته INFO برای یک یادآور مشخص وجود داشته باشد، سرآیند تکراری مجاز نیست. هنگام تعیین اینکه آیا یک سرآیند تکراریِ یک سرآیند موجود است یا خیر، بزرگی و کوچکی حروف نادیده گرفته میشود.
به عنوان مثال، یک بکاند فرضی ممکن است به شما امکان دهد مکان و توضیحات یک یادآور را به این صورت تعیین کنید:
REM 26 Feb 2025 INFO "Location: Boardroom #2" \
INFO "Description: Go over latest pull requests" \
MSG Engineering meeting
در حالی که بکاندها میتوانند انتخاب کنند از کدام رشتههای INFO پشتیبانی کنند، تمام بکاندها باید تلاش کنند از سه مورد استاندارد پشتیبانی به عمل آورند: Location:، Description: و Url:. برنامه TkRemind از هر سه این موارد پشتیبانی میکند؛ به این صورت که یادآورهای دارای رشته INFO با Url: را به ابرپیوند تبدیل میکند، و پنجرههای اطلاعاتی را برای رشتههای INFO با Location: و Description: بالا میآورد. مقادیر Location: و Url: بینیاز از توضیحاند؛ Description: برای توضیحی طولانیتر و عمیقتر از یادآور نسبت به خلاصهای که معمولاً نمایش داده میشود، در نظر گرفته شده است.
کلیدواژه DURATION تنها برای یادآورهای زماندار معنادار است؛ این کلیدواژه مدت زمان یک رویداد را مشخص میکند. برای مثال، اگر جلسهای ۹۰ دقیقهای دارید که از ساعت 1:00pm آغاز میشود، میتوانید از هر یک از موارد زیر استفاده کنید:
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
برای یادآورهای با مدت زمان طولانی، استفاده از عبارات برای سادهسازی نوشتن DURATION راحت است. برای مثال، اگر از ۲۰ فوریه ۲۰۲۳ تا ۲۳ فوریه ۲۰۲۳ دور هستید (مجموعاً ۴ روز)، میتوانید بنویسید:
REM 20 Feb AT 00:00 DURATION [4*24]:00 MSG away REM 20 Feb AT 00:00 DURATION [4*24*60] MSG away
توجه داشته باشید که duration یا به صورت hours:minutes یا صرفاً به صورت minutes که به شکل یک integer (عدد صحیح) بیان شده است، مشخص میشود.
اگر مدت زمانی برابر با 00:00 یا 0 را مشخص کنید، Remind دقیقاً طوری رفتار میکند که گویی اصلاً هیچ DURATION حضور نداشته است. اگرچه مدت زمانهایی که به صورت hours:minutes مشخص میشوند از نظر ظاهری شبیه به زمان از روز به نظر میرسند، اما چنین نیستند؛ مولفه hours به بازه 00-23 محدود نمیشود.
قند نحوی برای دستور REM (SYNTACTIC SUGAR FOR REM)
دستور REM قند نحوی دارد تا به شما امکان دهد یادآورهای رایج را بیان کنید. جفتهای یادآور زیر با یکدیگر معادل هستند:
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
توجه داشته باشید که Last در صورت نیاز، ماه و سال را به طور موثری تنظیم میکند تا یادآور در تاریخ صحیح فعال شود.
کلیدواژه IN کاملاً نادیده گرفته میشود، بنابراین میتوانید (به عنوان مثال) بنویسید:
REM Second Monday in May MSG foo REM Last Monday in December 2025 MSG Bar
شکل دیگری از back نوشتن یادآورها را آسانتر میکند. گروههای یادآور زیر معادل یکدیگرند:
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
همانطور که میبینیم، "Lastday" معادل ~~1 و "Lastworkday" معادل ~1 است.
توجه داشته باشید که کلیدواژههای First/Second/Third/Fourth/Last و شکلهای ~ و ~~ از back بر یک مقدار برای روز ماه دلالت دارند؛ از این رو، نمیتوان آنها را با یک روز ترکیب کرد. علاوه بر این، First/Second/Third/Fourth/Last باید دستکم یک نام روز هفته داشته باشند. موارد زیر غیرمجاز هستند:
REM First Monday 3 June MSG Huh? REM April 3 ~~1 MSG What? REM Second June MSG Where's the weekday???
فیلتر جایگزینی (THE SUBSTITUTION FILTER)
پیش از پردازش، بدنه یک دستور REM از یک فیلتر جایگزینی عبور داده میشود. این فیلتر توالیهای "%x" (که در آن "x" هر حرف الفبا و برخی نویسههای خاص دیگر است) را بررسی کرده و جایگزینیها را مطابق زیر انجام میدهد. (تمامی تاریخها به تاریخ فعالسازی یادآور اشاره دارند.)
- %a
- با عبارت "on weekday, day month, year" (در روز هفته، روز ماه، سال) جایگزین میشود.
REM 18 Oct 1990 +4 MSG Meeting with Bob %a.
در ۱۶ اکتبر ۱۹۹۰، عبارت "Meeting with Bob on Thursday, 18 October, 1990." چاپ میشود.
در ۱۷ اکتبر ۱۹۹۰، عبارت "Meeting with Bob tomorrow." چاپ میشود.
در ۱۸ اکتبر ۱۹۹۰، عبارت "Meeting with Bob today." چاپ میشود.
- %b
- با "in diff day's time" (در مدت diff روز آینده) جایگزین میشود که در آن diff تعداد واقعی روزهای بین تاریخ جاری و تاریخ فعالسازی است. (دستورات و روزهای OMIT هیچ تاثیری ندارند.)
REM 18 Oct 1990 +4 MSG Meeting with Bob %b.
در ۱۶ اکتبر ۱۹۹۰، عبارت "Meeting with Bob in 2 days' time." چاپ میشود.
در ۱۷ اکتبر ۱۹۹۰، عبارت "Meeting with Bob tomorrow." چاپ میشود.
در ۱۸ اکتبر ۱۹۹۰، عبارت "Meeting with Bob today." چاپ میشود.
- %c
- با "on weekday" (در روز هفته) جایگزین میشود.
در ۱۶ اکتبر ۱۹۹۰، عبارت "Meeting with Bob on Thursday." چاپ میشود.
در ۱۷ اکتبر ۱۹۹۰، عبارت "Meeting with Bob tomorrow." چاپ میشود.
در ۱۸ اکتبر ۱۹۹۰، عبارت "Meeting with Bob today." چاپ میشود.
- %d
- با "day"، یعنی روز ماه جایگزین میشود.
- %e
- با "on dd-mm-yyyy" جایگزین میشود.
- %f
- با "on mm-dd-yyyy" جایگزین میشود.
- %g
- با "on weekday, day month" جایگزین میشود.
- %h
- با "on dd-mm" جایگزین میشود.
- %i
- با "on mm-dd" جایگزین میشود.
- %j
- با "on weekday, month day-th, year" جایگزین میشود. این قالب بر حسب مورد، پسوندهای ترتیبی "st"، "nd"، "rd" یا "th" را به روز ماه اضافه میکند.
- %k
- با "on weekday, month day-th" جایگزین میشود.
- %l
- با "on yyyy-mm-dd" جایگزین میشود.
- %m
- با "month"، یعنی نام ماه جایگزین میشود.
- %n
- با شماره ماه (۱ تا ۱۲) جایگزین میشود.
- %o
- با " (today)" جایگزین میشود اگر و تنها اگر تاریخ جاری سیستم دقیقاً همان تاریخی باشد که توسط Remind به عنوان تاریخ جاری استفاده میشود. به یاد داشته باشید که میتوانید از طریق خط فرمان تاریخی را برای استفاده Remind مشخص کنید. این جایگزینی معمولاً در یک دستور REM کاربرد چندانی ندارد، اما در دستور BANNER بسیار مفید است. (بخش "دستور BANNER" را ببینید.)
- %p
- اگر مقدار diff (اختلاف روزها) بین تاریخ جاری و تاریخ فعالسازی برابر با ۱ نباشد، با "s" جایگزین میشود (برای جمع بستن واژه day در انگلیسی). میتوانید از این توالی برای ساخت یادآورهایی مانند نمونه زیر استفاده کنید:
- %q
- اگر مقدار diff بین تاریخ فعالسازی و تاریخ جاری برابر با ۱ باشد، با "'s" جایگزین میشود. در غیر این صورت با "s'" جایگزین میگردد. از این مورد میتوان به صورت زیر استفاده کرد:
- %r
- با روز ماه (۰۱ تا ۳۱) جایگزین میشود که در صورت نیاز با صفر در ابتدا پر شده تا دو رقمی شود.
- %s
- بسته به روز ماه، با یکی از پسوندهای ترتیبی انگلیسی "st"، "nd"، "rd" یا "th" جایگزین میشود.
- %t
- با شماره ماه (۰۱ تا ۱۲) که با صفر اولیه به صورت دو رقمی پر شده است جایگزین میشود.
- %u
- با "on weekday, day-th month, year" جایگزین میشود. این توالی شبیه به %a است، با این تفاوت که پسوندهای ترتیبی "st"، "nd"، "rd" یا "th" بر حسب مورد به day (روز) اضافه میشود.
- %v
- با "on weekday, day-th month" جایگزین میشود.
- %w
- با "weekday"، یعنی نام روز هفته جایگزین میشود.
- %x
- با مقدار diff (اختلاف) بین تاریخ جاری و تاریخ فعالسازی جایگزین میشود. این diff به عنوان تعداد روزهای واقعی بین این دو تاریخ تعریف میشود؛ موارد OMIT شمارش نمیشوند. (تفریق دقیق تقویمی انجام میشود.)
- %y
- با "year"، یعنی سال تاریخ فعالسازی جایگزین میشود.
- %z
- با "yy"، یعنی دو رقم آخر سال جایگزین میشود.
- %(any_text)
- با جستجوی عبارت any_text در جدول ترجمه جایگزین میشود. این معادل [_("any_text")] است، اما تایپ کردن آن راحتتر است.
- %<any_text>
- با مقدار INFO مرتبط با هدر any_text یا در صورت عدم وجود چنین مقداری، با یک رشته خالی جایگزین میشود. این توالی معادل [triginfo("any_text")] است، اما تایپ کردن آن آسانتر میباشد.
- %_
- (درصد-زیرخط) با یک نویسه خط جدید (Newline) جایگزین میشود. میتوانید از این توالی برای ایجاد یادآوریهای چندخطی استفاده کنید. توجه داشته باشید که بکاندهای مختلف تقویم در نحوه مدیریت یادآورهای چندخطی تفاوت دارند:
- o
- اجرای remind -c خطوط جدید را در خروجی تقویم ترمینال حفظ میکند.
- o
- برنامه rem2pdf در صورتی که remind با گزینه -pp یا -ppp فراخوانی شود، خطوط جدید را حفظ میکند.
- o
- برنامه rem2html در صورتی که remind با گزینه -pp فراخوانی شود، خطوط جدید را حفظ میکند.
- o
- برنامه tkremind خطوط جدید را حفظ میکند.
- o
- برنامه rem2ps خطوط جدید را به فاصله (Space) تبدیل میکند. اما rem2ps منسوخ شده است؛ به جای آن از rem2pdf استفاده کنید.
- o
- قالبهای "تقویم ساده" (یعنی گزینههای -s، -n و -p در remind) خطوط جدید را به فاصله تبدیل میکنند.
تمام بکاندهای تقویم فاصلههای متوالی چندگانه را به یک فاصله تکی و خطوط جدید متوالی چندگانه را به یک خط جدید تکی تبدیل (فشرده) میکنند.
- %1
- بسته به وضعیت یادآور زماندار، با یکی از عبارتهای "now" (اکنون)، "m minutes from now" (m دقیقه بعد)، "m minutes ago" (m دقیقه پیش)، "h hours from now" (h ساعت بعد)، "h hours ago" (h ساعت پیش)، "h hours and m minutes from now" (h ساعت و m دقیقه بعد) یا "h hours and m minutes ago" (h ساعت و m دقیقه پیش) جایگزین میشود. اگر یادآور بیش از یک روز در آینده باشد، پیشوند "d days," به ابتدای عبارت افزوده میشود. توجه داشته باشید که مگر در صورت مشخص کردن گزینه -a، یادآورهای زماندار مانند یادآورهای معمولی فعال میشوند و بنابراین ممکن است یادآوری زمانداری که زمان آن در ساعات اولیه همان روز گذشته است نیز راهاندازی شود. این امر دلیل نیاز به عبارتهای "...ago" (پیش) را توجیه میکند.
- %2
- بسته به زمان AT یادآور، با عبارت "at hh:mmam" یا "..pm" جایگزین میشود.
- %3
- با عبارت "at hh:mm" در قالب ۲۴ ساعته جایگزین میشود.
- %4
- با "mm" جایگزین میشود که در آن mm تعداد دقایق بین زمان "جاری" و تاریخ و زمان فعالسازی مشخصشده توسط AT است. اگر زمان AT قبل از زمان جاری باشد، حاصل عددی منفی خواهد بود.
- %5
- با "ma" جایگزین میشود که در آن ma قدر مطلق عدد تولید شده توسط %4 است.
- %6
- بسته به رابطه بین زمان AT و زمان جاری، با "ago" (پیش) یا "from now" (دیگر / بعد) جایگزین میشود.
- %7
- با تعداد ساعتهای بین زمان AT و زمان جاری جایگزین میشود. این مقدار همیشه نامنفی و عددی بین ۰ تا ۲۳ است. (یعنی برای رویدادهایی با فاصله بیش از یک روز، روزها در %7 محاسبه نمیشوند.)
- %8
- با تعداد دقایق بین زمان AT و زمان جاری، پس از کسر ساعتها (%7)، جایگزین میشود. این عدد مقداری از ۰ تا ۵۹ است.
- %9
- اگر مقدار تولید شده توسط %8 برابر با ۱ نباشد، با "s" جایگزین میشود (برای جمع بسته شدن minutes در انگلیسی).
- %0
- اگر مقدار تولید شده توسط %7 برابر با ۱ نباشد، با "s" جایگزین میشود (برای جمع بسته شدن hours در انگلیسی).
- %!
- اگر تاریخ و زمان جاری پیش از تاریخ فعالسازی و زمان AT باشد، با "is" و اگر پس از آن باشد، با "was" جایگزین میشود. توالی %! را میتوان در یادآورهای بدون زمان نیز استفاده کرد که در این صورت فقط تاریخها با هم مقایسه میشوند.
- %?
- اگر تاریخ و زمان جاری قبل از تاریخ فعالسازی و زمان AT باشد، با "are" و اگر بعد از آن باشد، با "were" جایگزین میشود. توالی %? در یادآورهای غیرزماندار نیز قابل استفاده است که در آن حالت فقط تاریخها مقایسه میشوند.
- %@
- مشابه %2 است اما زمان جاری را نمایش میدهد.
- %#
- مشابه %3 است اما زمان جاری را نمایش میدهد.
- %:
- برای یک یادآور TODO که تاریخ فعالسازی آن در تاریخ COMPLETE-THROUGH یا پس از آن باشد، با " (done)" جایگزین میشود. در هر وضعیت دیگری با یک رشته خالی جایگزین میشود. توجه داشته باشید از آنجا که Remind یادآورهای TODO تکمیلشده را در حالت Agenda نمایش نمیدهد، این توالی اسکیپ در عمل تنها در حالت Calendar (تقویم) مفید است.
- %"
- (درصد-نقلقول دوگانه) حذف میشود. این توالی توسط فیلتر جایگزینی استفاده نمیشود، بلکه برای تعیین متنی به کار میرود که هنگام انتخاب گزینههای -c، -s یا -p باید توسط Remind در ورودی تقویم گنجانده شود. بخش "حالت تقویم (CALENDAR MODE)" را ببینید.
نکات:
- o
- Remind بهطور معمول پس از هر یادآور یک خط خالی چاپ میکند؛ اگر آخرین نویسه بدنه "%" باشد، خط خالی چاپ نخواهد شد. میتوانید با تنظیم $AddBlankLines روی ۰، چاپ خطوط خالی اضافی را بهطور سراسری غیرفعال کنید.
- o
- جایگزینیهای a، b، c، e، f، g، h، i، j، k، l، u و v همگی در صورتی که تاریخ جاری با تاریخ فعالسازی برابر باشد با "today" (امروز) و اگر تاریخ فعالسازی یک روز بعد از تاریخ جاری باشد با "tomorrow" (فردا) جایگزین میشوند. بنابراین، این موارد با جایگزینیهای ساختهشده از توالیهای سادهتر مانند %w، %y و غیره یکسان نیستند.
- o
- پیش از جایگزینیهای a، c، e، f، g، h، i، j، k، l، u، v، 2 و 3 میتوان از یک ستاره استفاده کرد (مانند %*c) که باعث میشود واژه "at" یا "on" که بهطور معمول در خروجی درج میشد، حذف گردد.
- o
- جایگزینیهای ! و ? میتوانند با ستاره همراه شوند (%*! یا %*?)؛ در این صورت مقایسه بین تاریخ فعالسازی و تابع ()realtoday به جای ()today انجام میگیرد.
- o
- هر یک از جایگزینیهای مربوط به زمان (۰ تا ۹) اگر در یادآوری فاقد کلمه کلیدی AT استفاده شوند، نتایج تعریفنشدهای تولید میکنند. همچنین، اگر یک یادآور دارای delta باشد و در چندین روز فعال شود، جایگزینیهای زمانی تاریخ را نادیده میگیرند. بنابراین، برای نمونه جایگزینی %1 ممکن است گزارش دهد که جلسه ۱۵ دقیقه دیگر است، در حالی که در واقع ۲ روز بعد است، زیرا یک delta یادآور را فعال کرده است. توصیه میشود جایگزینیهای زمانی را تنها در یادآورهای زماندار بدون delta که برای صفبندی جهت فعالسازی زمانبندیشده طراحی شدهاند استفاده کنید.
- o
- میتوان از حروف بزرگ لاتین در توالی جایگزینی استفاده کرد که در این صورت، حرف اول رشته جایگزینشده به صورت بزرگ نوشته میشود (در صورتی که بهطور معمول یک حرف کوچک باشد).
- o
- سایر نویسههای پس از علامت "%" مستقیماً رونوشت میشوند. بهویژه، برای چاپ علامت "%"، از "%%" در بدنه استفاده کنید. برای شروع بدنه یک یادآور با فاصله، از "% " استفاده کنید؛ زیرا Remind معمولاً پس از نشانههای MSG، CAL یا RUN به دنبال اولین نویسه غیرفاصله میگردد.
رویدادها و وظایف (EVENTS AND TODOS)
دستور REM بهطور معمول برای ایجاد یک EVENT (رویداد) استفاده میشود. رویداد چیزی است که در زمان مشخصی رخ میدهد، احتمالاً تکرارشونده است و صرفنظر از اقداماتی که انجام میدهید اتفاق میافتد. رویدادها شامل مواردی مانند زادروزها، تعطیلات، جلسات و غیره هستند... تقریباً هر چیزی که طبق یک برنامه زمانبندی خاص رخ میدهد. پس از گذشت تاریخ رویداد، Remind دیگر آن رویداد را به شما یادآوری نخواهد کرد.
یک TODO (وظیفه یا کار برای انجام) متفاوت است؛ این یک تسک یا وظیفه است که باید آن را تا یک تاریخ یا تاریخ و زمان معین تکمیل کنید. اگر یک TODO را صریحاً به عنوان انجامشده علامتگذاری نکنید، Remind حتی پس از سررسید (Due Date) نیز یادآوری آن را به شما ادامه خواهد داد.
برای علامتگذاری یک دستور REM به عنوان TODO، کافی است کلمه کلیدی TODO را درج کنید. برای مثال:
REM TODO 15 August 2025 ++5 MSG Buy cat food %b.
در حالت Agenda (دستور کار)، Remind از تاریخ ۱۰ اوت ۲۰۲۵ هشدار دادن را آغاز میکند که باید ظرف ۵ روز آینده، ۴ روز آینده و غیره غذای گربه بخرید...
با این حال، در ۱۶ اوت ۲۰۲۵، Remind عبارت "Buy cat food yesterday." (دیروز باید غذای گربه میخریدید) را نمایش میدهد و تا ابد یا تا زمانی که TODO را به عنوان انجامشده علامتگذاری کنید، این نیاز به خرید غذای گربه را به شما یادآوری خواهد کرد.
علامتگذاری وظایف به عنوان انجامشده (MARKING TODOS AS DONE)
دو روش برای علامتگذاری یک TODO به عنوان انجامشده وجود دارد. اگر TODO تکرارشونده نباشد، سادهترین راه حذف نشانگر TODO از دستور REM (یا در واقع، حذف کامل آن دستور) است. روش اول یادآور را در تقویم نگه میدارد در حالی که روش دوم آن را کاملاً حذف میکند.
اگر یک TODO تکرارشونده باشد، از بند COMPLETE-THROUGH برای مشخص کردن اینکه کدام تکرارها تکمیل شدهاند استفاده کنید. برای مثال:
REM TODO 30 April ++15 COMPLETE-THROUGH 2025-04-30 MSG File taxes
مالیات بر درآمد کانادا باید هر سال تا ۳۰ آوریل ارسال شود. دستور بالا پرداخت مالیات در سال ۲۰۲۶ را به شما یادآوری میکند. اگر تاریخ COMPLETE-THROUGH را بهروزرسانی نکنید، پس از ۳۰ آوریل ۲۰۲۶، برنامه Remind تا ابد به شما یادآوری میکند که موعد مالیات شما ۳۰ آوریل ۲۰۲۶ بوده است. برای نشان دادن اینکه آن را پرداخت کردهاید، کافی است تاریخ COMPLETE-THROUGH را به 2026-04-30 بهروزرسانی کنید؛ سپس Remind یادآوری مالیات سال ۲۰۲۷ را (از ۱۵ روز قبل از تاریخ سررسید) آغاز خواهد کرد.
تعیین COMPLETE-THROUGH بدون مشخص کردن TODO یک خطا محسوب میشود. کلمه کلیدی COMPLETED-THROUGH میتواند به عنوان مترادفی برای COMPLETE-THROUGH به کار رود.
محدود کردن یادآوریهای مربوط به وظایف معوق (LIMITING REMINDERS ABOUT OVERDUE TODOS)
اگرچه Remind با کمال میل میتواند تا صدها سال یادآوری وظایف (TODO) معوق را ادامه دهد، اما برای برخی کارها این یادآوری بیمعنی خواهد بود. اگر میخواهید Remind پس از گذشت تعداد روز معینی از سررسید یک وظیفه، یادآوری مکرر آن را متوقف کند، از بند MAX-OVERDUE n استفاده کنید. در این حالت، Remind یادآوری وظیفهای را که بیش از n روز به تعویق افتاده متوقف میسازد. در اینجا یک مثال آورده شده است:
REM TODO 2025-08-13 ++5 MAX-OVERDUE 5 MSG Task: %b.
برنامه Remind یادآوری وظیفه را به دلیل مقدار پسروی ۵++ در تاریخ 2025-08-08 آغاز میکند. یادآوری وظیفه پس از موعد سررسید نیز ادامه مییابد. با این حال، به دلیل بند MAX-OVERDUE، آخرین باری که آن را یادآوری میکند در تاریخ 2025-08-18 خواهد بود. از تاریخ 2025-08-19 به بعد، Remind دیگر این وظیفه را یادآوری نخواهد کرد، زیرا احتمالاً دیگر فایدهای ندارد---چرا که دوره MAX-OVERDUE به پایان رسیده است.
جزئیات بیشتر درباره وظایف (MORE DETAILS ABOUT TODOS)
وظایف (TODOs) فقط در حالت Agenda (دستور کار) به صورت ویژه مدیریت میشوند. در حالت Calendar (تقویم)، آنها دقیقاً مانند یک رویداد معمولی در تقویم ظاهر میشوند.
وظایف از نظر داخلی به این صورت پیادهسازی میشوند که تاریخ COMPLETE-THROUGH به علاوه یک روز به عنوان نقطه شروع الگوریتم پیمایش تاریخ در Remind استفاده میشود. اگر یک TODO تکرارشونده بدون بند COMPLETE-THROUGH داشته باشید، Remind پیمایش را از آغاز زمان شروع میکند؛ که همه میدانیم ۱ ژانویه ۱۹۹۰ است! این دستور را در نظر بگیرید:
REM TODO Wed +7 MSG Take out the trash %a (%b)
اجرای این دستور در حالت Agenda در تاریخ 2025-08-13 خروجی زیر را تولید میکند:
Take out the trash on Wednesday, 3 January, 1990 (13006 days ago)
برنامه Remind در یادآوری وظایف به شما بسیار مصمم و پیگیر است! اگر زبالهها را بیرون بگذارید و آن را انجامشده علامت بزنید:
REM TODO Wed +7 COMPLETE-THROUGH 2025-08-13 MSG Take out the trash %a (%b)
سپس این خروجی را دریافت میکنید:
Take out the trash on Wednesday, 20 August, 2025 (in 7 days' time)
میتوانید همانند رویدادها، از FROM و UNTIL برای محدود کردن بازه تکرار وظایف نیز استفاده کنید. برای مثال، اگر در ماه اوت از خانه کسی مراقبت میکنید و باید هر چهارشنبه به گیاهان آب بدهید:
REM TODO Wed +7 FROM 2025-08-06 UNTIL 2025-08-27 MSG Plants %b.
اجرای این دستور در ۱۳ اوت عبارت "Plants 7 days ago." را تولید میکند، زیرا به Remind نگفتهاید که اولین آبیاری را انجام دادهاید. اگر وظایف خود را تمام کنید و تاریخ COMPLETE-THROUGH برابر با 2025-08-27 را اضافه نمایید، Remind در آینده هرگز آن کار را یادآوری نخواهد کرد.
در حالت پاکسازی (Purge Mode)، برنامه Remind وظایف TODO را پاکسازی نمیکند مگر اینکه به عنوان تکمیلشده علامتگذاری شده باشند. در مورد یک TODO تکرارشونده، Remind آن را تا زمانی که آخرین تکرار به عنوان تکمیلشده علامت نخورد پاک نخواهد کرد.
دستور OMIT (THE OMIT COMMAND)
دستور OMIT افزون بر اینکه یک کلمه کلیدی در دستور REM است، خود یک دستور مستقل نیز به شمار میرود. ساختار نحوی آن به این صورت است:
یا:
OMIT [day] month [year]
یا:
OMIT [day1] month1 [year1] THROUGH [day2] month2 [year2]
دستور OMIT برای حذف و نادیده گرفتن "سراسری" روزهای مشخصی (معمولاً روزهای تعطیل) به کار میرود. این روزهای حذفشده سراسری توسط فرمهای "-" و "+" از back و delta نادیده گرفته میشوند، اما توسط فرمهای "--" و "++" نادیده گرفته نمیشوند. چند مثال:
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
مثال اول تمامی شنبهها و یکشنبهها را حذف (OMIT) میکند. این برای یادآورهایی که نباید در روزهای پایانی هفته فعال شوند مفید است.
مثال دوم یک تعطیلی را مشخص میکند که در هر سال در یک تاریخ ثابت رخ میدهد - روز سال نو.
مثال سوم تعطیلیای را مشخص میکند که هر سال تغییر میکند - روز کارگر. برای اینگونه تعطیلات، باید برای هر سال یک دستور OMIT جداگانه ایجاد کنید. (بعداً در بخش توضیحات مربوط به عبارتها و برخی از ویژگیهای پیشرفتهتر Remind خواهید دید که چگونه میتوان این فرایند را در مواردی خودکارسازی کرد.)
همانند دستور REM، میتوانید از مشخصکنندههای کوتاه برای تاریخها استفاده کنید؛ دستورات زیر معادل یکدیگر هستند:
OMIT 7 Sep 1992 OMIT 1992-09-07
جهت سهولت کار، میتوانید از یک delta و کلمه کلیدی MSG یا RUN در دستور OMIT استفاده نمایید. توالیهای زیر با یکدیگر معادل هستند:
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!
کلمه کلیدی THROUGH به شما امکان میدهد تا بهراحتی یک بازه از روزها را OMIT کنید. برای مثال، توالیهای زیر معادل هستند:
OMIT 3 Jan 2011 OMIT 4 Jan 2011 OMIT 5 Jan 2011 و OMIT 3 Jan 2011 THROUGH 5 Jan 2011
توجه داشته باشید که Remind یک محدودیت کامپایلشده داخلی برای تعداد OMITهای کامل دارد. اگر بازهای از N روز با تاریخ کاملاً مشخص (یعنی شامل سال) را OMIT کنید، آنگاه N اسلات OMIT کامل مصرف میشود. تلاش برای حذف یک بازه بسیار بزرگ ممکن است به خطای "Too many full OMITs" منجر شود.
میتوانید کاری کنید که یک دستور OMIT حاوی THROUGH، در صورتی که هر دو تاریخ کاملاً مشخص شده باشند، به عنوان یک دستور REM نیز عمل کند:
OMIT 6 Sep 2010 THROUGH 10 Sep 2010 MSG Vacation
اگر از بند THROUGH استفاده میکنید، سال یا باید هم قبل و هم بعد از THROUGH ذکر شود، یا در هر دو طرف حذف گردد. موارد زیر مجاز هستند:
OMIT 25 Dec THROUGH 6 Jan OMIT 25 Dec 2024 THROUGH 6 Jan 2025
اما موارد زیر مجاز نیستند:
OMIT 25 Dec THROUGH 6 Jan 2025 OMIT 25 Dec 2024 THROUGH 6 Jan
میتوانید با دستور زیر OMITهای سراسری خود را اشکالزدایی کنید:
OMIT DUMP
دستور OMIT DUMP روزهای حذفشده سراسری فعلی را در خروجی استاندارد چاپ میکند.
کلمات کلیدی BEFORE، AFTER و SKIP (THE BEFORE, AFTER AND SKIP KEYWORDS)
بهطور معمول، روزهایی که حذف (OMIT) شدهاند، چه از طریق یک دستور سراسری OMIT و چه از طریق کلمات کلیدی محلی OMIT یا OMITFUNC در یک دستور REM، تنها روی شمارش -back یا +delta تأثیر میگذارند. برای مثال، فرض کنید هر چهارشنبه یک جلسه دارید. همچنین فرض کنید ۱۱ نوامبر را به عنوان تعطیلی مشخص کردهاید:
OMIT 11 Nov +4 MSG Remembrance Day REM Wed +1 MSG Code meeting %b.
توالی بالا یک یادآور برای جلسه در ۱۱ نوامبر ۱۹۹۲ (که یک چهارشنبه است) صادر میکند. این احتمالاً نادرست است. سه گزینه وجود دارد:
- BEFORE
- این کلمه کلیدی یادآور را به پیش از هر روز حذفشده منتقل میکند. بنابراین، در مثال بالا، استفاده از BEFORE باعث میشود یادآور جلسه در روز سهشنبه، ۱۰ نوامبر ۱۹۹۲ فعال شود.
- AFTER
- این کلمه کلیدی یادآور را به پس از هر روز حذفشده منتقل میکند. در مثال بالا، یادآور جلسه در روز پنجشنبه، ۱۲ نوامبر ۱۹۹۲ فعال خواهد شد.
- SKIP
- این کلمه کلیدی باعث میشود یادآور در روزهای حذفشده کاملاً نادیده گرفته شود. بنابراین، در مثال بالا، یادآور در ۱۱ نوامبر ۱۹۹۲ فعال نخواهد شد. با این حال، طبق معمول در چهارشنبه بعد، ۱۸ نوامبر ۱۹۹۲ فعال میشود.
کلمات کلیدی BEFORE و AFTER به ترتیب تاریخ فعالسازی یادآور را به قبل یا بعد از بلوکی از روزهای حذفشده منتقل میکنند. فرض کنید معمولاً در اولین روز هر ماه یک پشتیبانگیری اجرا میکنید. اما اگر اولین روز ماه مصادف با آخر هفته یا تعطیلی باشد، پشتیبانگیری را در اولین روز کاری پس از آخر هفته یا تعطیلی اجرا میکنید. میتوانید بنویسید:
REM 1 OMIT Sat Sun AFTER RUN do_backup
بیایید نحوه محاسبه تاریخ فعالسازی را بررسی کنیم. عدد 1 اولین روز ماه را مشخص میکند. کلمه کلیدی محلی OMIT باعث میشود کلمه کلیدی AFTER یادآور را به جلوتر و پس از روزهای آخر هفته منتقل کند. در نهایت، کلمه کلیدی AFTER یادآور را همچنان به جلو منتقل میکند تا از هرگونه تعطیلی مشخصشده با دستورات سراسری OMIT نیز عبور کند.
پشتیبانی از منطقه زمانی (TIMEZONE SUPPORT)
دستور REM از کلمه کلیدی اختیاری TZ پشتیبانی میکند که باید پس از آن نام حساس به حروف کوچک و بزرگ منطقه زمانی قرار گیرد که دستور قرار است در آن تفسیر شود. توجه داشته باشید در صورت استفاده از کلمه کلیدی TZ، حتماً باید از یک بند AT نیز استفاده کنید. در اینجا چند مثال آورده شده است:
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.
درون یک بند SATISFY و یک تابع OMITFUNC، تمام توابع راهاندازی و تاریخ فعالسازی در منطقه زمانی مشخصشده در دستور REM تفسیر میشوند. با این حال، در خارج از دستور REM، توابع راهاندازی با منطقه زمانی محلی تطبیق داده میشوند. اگر منطقه زمانی محلی UTC باشد و در تاریخ 2025-09-04 بر حسب UTC فایل زیر را به Remind بدهیم:
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]
آنگاه خروجی به صورت زیر خواهد بود:
a = 2025-09-10, b = 18:00 c = 2026-05-14, d = 06:59
علت این است که تاریخ فعالسازی اولی (چهارشنبه، 2025-09-10 در ساعت ۱۴:۰۰ به وقت شرقی) برابر با 2025-09-10 در ساعت ۱۸:۰۰ به وقت UTC است. در مورد دوم، چهارشنبه ۱۳ مه ۲۰۲۶ تاریخ راهاندازی برآوردهشده (SATISFied) است که به دلیل تنظیم منطقه زمانی، به پنجشنبه ۱۴ مه ۲۰۲۶ در ساعت ۰۶:۵۹ به وقت UTC منتقل میشود.
اگر بعد از کلمه کلیدی TZ از نام منطقه زمانی نامعتبر استفاده کنید، نتایج تعریفنشده خواهند بود. همانطور که پیشتر ذکر شد، نامهای مناطق زمانی به حروف بزرگ و کوچک حساس هستند؛ نام America/Toronto معتبر است، اما america/toronto معتبر نیست.
اگر روی سیستمی هستید که دادههای منطقه زمانی را در مسیر /usr/share/zoneinfo ذخیره میکند، Remind تلاش میکند نام منطقه زمانی را اعتبارسنجی کند و اگر نامعتبر به نظر برسد به شما هشدار میدهد. اگر میخواهید در هر حال منطقهای زمانی را مشخص کنید که فاقد فایلی در مسیر /usr/share/zoneinfo است و میخواهید هشدار را نادیده بگیرید، یک علامت "!" را در ابتدای نام منطقه زمانی قرار دهید. برای مثال:
REM Thursday AT 14:45 TZ !EST+5EDT,M3.2.0/2,M11.1.0/2 MSG Old TZ format
در یادآوری دارای کلمه کلیدی TZ، تاریخهای OMIT در منطقه زمانی مشخصشده ارزیابی میشوند. در اینجا یک مثال آورده شده است: فرض کنید منطقه زمانی محلی America/Toronto است و شما این اسکریپت را دارید:
# 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
در تاریخ 2025-09-05 در منطقه زمانی America/Toronto، یادآور فعال خواهد شد. هرچند تاریخ 2025-09-05 حذف (OMIT) شده است، اما کلمه کلیدی SKIP تاریخ را در منطقه زمانی Europe/Amsterdam ارزیابی میکند و تاریخ 2025-09-06 (تاریخ فعالسازی) حذف نشده است.
برعکس، در تاریخ 2025-09-12 در منطقه زمانی America/Toronto، یادآور فعال نخواهد شد. اگرچه 2025-09-12 حذف نشده است، اما تاریخ 2025-09-13 حذف شده است و این همان تاریخ فعالسازی در منطقه زمانی Europe/Amsterdam است.
Remind به شما امکان میدهد پروندههای دیگر را در اسکریپت یادآور خود بگنجانید (include کنید)، شبیه به دستور پیشپردازنده #include در زبان C. برای مثال، میتوانید یادآورهای مختلف را در پروندههای جداگانه به شکل زیر سازماندهی کنید:
INCLUDE holidays.rem INCLUDE birthdays.rem INCLUDE "quote files with spaces.rem"
پروندههای INCLUDE میتوانند تا عمق ۸ لایه تو در تو (nested) شوند. همانطور که در بالا نشان داده شد، اگر نام یک پرونده حاوی فاصله باشد (که توصیه نمیشود!) میتوانید نام پرونده را درون دابلکوتیشن (نقلقول دوگانه) قرار دهید.
اگر در دستور INCLUDE نام پرونده را "-" تعیین کنید، Remind خواندن را از ورودی استاندارد (standard input) آغاز خواهد کرد.
اگر یک پوشه را بهعنوان آرگومان به INCLUDE بدهید، آنگاه Remind تمام پروندههای (و نه زیرپوشههای!) موجود در آن پوشه را که با الگوی شل "*.rem" مطابقت دارند پردازش خواهد کرد. پروندهها به ترتیب مرتبشده پردازش میشوند؛ ترتیب مرتبسازی مطابق با ترتیبی است که شل هنگام بسط دادن "*.rem" استفاده میکند.
توجه داشته باشید که پرونده مشخصشده در دستور INCLUDE نسبت به پوشه کاری جاری فرایند Remind تفسیر میشود. اگر میخواهید پروندهای را نسبت به پوشه حاوی پرونده در حال پردازش جاری بگنجانید، بهجای آن از DO استفاده کنید. برای مثال، اگر پرونده جاری /home/user/.reminders/foo.rem باشد و پوشه کاری Remind برابر با /home/user باشد، آنگاه:
# 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
شاید بتوان گفت که دستور INCLUDE باید از همان ابتدا مانند DO عمل میکرد، اما تغییر رفتار آن سازگاری رو به عقب (backward-compatibility) را میشکست؛ به همین دلیل دستور DO معرفی شد.
توجه داشته باشید اگر پرونده یادآور در حال پردازش فعلی، بهعنوان یک پیوند نمادین (symbolic link) به پروندهای ارجاع داده شده باشد که در همان پوشه خود پیوند نمادین نیست، DO با شکست مواجه میشود. Remind مسیر واقعی پیوندهای نمادین را تفکیک (resolve) نمیکند، بنابراین باید از استفاده از پیوندهای نمادین برای پروندهها خودداری کنید.
دستور SYSINCLUDE مشابه DO است، اما مسیرهای نسبی را در پوشه سیستمی حاوی اسکریپتهای استاندارد یادآور جستجو میکند. در این نسخه نصبشده از Remind، پوشه سیستمی برابر با "/usr/share/remind" است.
دستور RETURN (THE RETURN COMMAND)
دستور RETURN باعث میشود Remind باقیمانده محتوای پروندهای را که در حال حاضر پردازش میشود نادیده بگیرد. این دستور میتواند راهی سریع برای "خروج" از یک پرونده گنجاندهشده (included) باشد (هرچند در سطح بالا یا top-level نیز کار میکند).
در اینجا مثالی از نحوه استفاده از RETURN آورده شده است:
IF already_done
RETURN
ENDIF
set already_done 1
preserve already_done
# Do expensive processing here
دستور RUN (THE RUN COMMAND)
اگر پروندههای دیگر را در اسکریپت یادآور خود بگنجانید، ممکن است همیشه بهطور کامل به محتوای پروندههای دیگر اعتماد نداشته باشید. برای مثال، ممکن است آنها حاوی یادآورهایی از نوع RUN باشند که بتوانند برای دسترسی به پروندههای شما یا انجام اقدامات ناخواسته استفاده شوند. دستور RUN میتواند این موضوع را محدود کند: اگر دستور RUN OFF را در اسکریپت یادآور سطح بالای (top-level) خود قرار دهید، هر یادآور یا عبارتی که در حالت عادی یک دستور سیستمی را اجرا میکند غیرفعال میشود. RUN ON اجرای دستورات سیستمی را دوباره فعال خواهد کرد. توجه داشته باشید که دستور RUN ON فقط میتواند در اسکریپت یادآور سطح بالا استفاده شود؛ این دستور در هیچ پروندهای که توسط دستور INCLUDE فراخوانی شده است کار نخواهد کرد. این برای محافظت از شما در برابر فردی است که دستور RUN ON را در یک پرونده گنجاندهشده قرار میدهد. با این حال، دستور RUN OFF میتواند در سطح بالا یا در یک پرونده گنجاندهشده استفاده شود.
اگر Remind را با گزینه خط فرمان -r اجرا کنید، یادآورهای نوع RUN و تابع shell() بدون توجه به هرگونه دستور RUN در اسکریپت یادآور، غیرفعال خواهند شد. با این حال، هر دستوری که با گزینه -k ارائه شده باشد همچنان اجرا خواهد شد.
علاوه بر این، Remind شامل چند ویژگی امنیتی دیگر است. این برنامه پروندهای را که توسط گروه یا دیگران قابل نوشتن باشد (group-writable یا world-writable) نخواهد خواند. این برنامه با مجوز set-uid اجرا نخواهد شد. اگر پروندهای را بخواند که متعلق به شما نیست، RUN و تابع ()shell را غیرفعال خواهد کرد. و اگر با دسترسی کاربر ارشد (root) اجرا شود، فقط پروندههای متعلق به root را خواهد خواند.
توجه داشته باشید که اگر Remind از ورودی استاندارد بخواند، هیچ تلاشی برای بررسی مالکیت ورودی استاندارد نمیکند، حتی اگر از یک پرونده هدایت شده باشد، و بنابراین در این شرایط RUN و ()shell را غیرفعال نمیکند.
دستور EXPR (THE EXPR COMMAND)
Remind به شما امکان میدهد ارزیابی عبارتها را بهطور کامل غیرفعال کنید. این میتواند در صورتی مفید باشد که Remind را روی پروندهای تا حدی غیرقابلاعتماد اجرا میکنید که انتظار نمیرود حاوی عبارتها باشد. برای غیرفعال کردن ارزیابی عبارتها، استفاده کنید از:
EXPR OFF
اگر Remind در هنگام فعال بودن EXPR OFF با عبارتی مواجه شود، یک خطا برمیگرداند.
برای فعالسازی مجدد ارزیابی عبارتها، استفاده کنید از:
EXPR ON
همانند RUN ON، دستور EXPR ON فقط میتواند در اسکریپت سطح بالا استفاده شود، نه در پروندههای گنجاندهشده.
دستور INCLUDECMD (THE INCLUDECMD COMMAND)
Remind به شما اجازه میدهد یک دستور شل را اجرا کنید و خروجی آن دستور را طوری ارزیابی کنید که گویی یک پرونده گنجاندهشده (included) است. برای مثال، میتوانید اسکریپتهایی داشته باشید که یادآورها را از یک پایگاهداده استخراج کرده و آنها را در stdout به عنوان دستورات REM چاپ کنند. در اینجا یک مثال آورده شده است:
INCLUDECMD extract_reminders_for dfs
فرض میکنیم دستور "extract_reminders_for" یادآورها را از یک پایگاهداده مرکزی برای کاربر نامبرده استخراج میکند. یکی دیگر از موارد کاربرد INCLUDECMD این است که اگر یادآورهای خود را در پروندهای با قالبی غیر از Remind ذخیره کرده باشید، میتوانید دستوری بنویسید که آنها را به قالب Remind تبدیل کند و سپس Remind میتواند با یک دستور مناسب INCLUDECMD آن پرونده را "بگنجاند".
توجه داشته باشید اگر RUN غیرفعال باشد، آنگاه INCLUDECMD با پیام خطای "RUN disabled" با شکست مواجه خواهد شد.
Remind ترتیبی میدهد که هنگام اجرای دستور مشخصشده توسط INCLUDECMD، ورودی استاندارد آن به /dev/null متصل شود.
دستور INCLUDECMD باقیمانده خط را به popen(3) ارسال میکند، به این معنی که دستور توسط شل اجرا میشود. به همین ترتیب، بسته به کاری که میخواهید انجام دهید، نویسههای ویژه (meta-characters) شل ممکن است نیاز به اسکیپ کردن یا نقلقول (کوتیشن) آرگومانها داشته باشند. خود Remind هیچگونه تغییری روی خط فرمان اعمال نمیکند (به جز سازوکار عادی الصاق عبارت [expr]).
اگر دستوری که به INCLUDECMD ارسال میشود با علامت تعجب "!" آغاز شود، آنگاه Remind ویژگی RUN را برای خروجی آن دستور غیرفعال میکند. اگر دستوری را اجرا میکنید که به خروجی آن کاملاً اعتماد ندارید، باید پیشوند "!" را به آن اضافه کنید تا هر دستور RUN که صادر میکند با شکست مواجه شود.
یک دستور INCLUDECMD در عمق تو در توی INCLUDE به شمار میآید. در هر اجرای مشخص از Remind، یک دستور معین INCLUDECMD فقط یک بار اجرا میشود و نتایج حافظهپنهان (کَش) میشوند. برای مثال، اگر تقویمی تولید کنید، هر دستور منحصربهفرد INCLUDECMD فقط یک بار اجرا میشود، نه یک بار برای هر روز از تقویم تولیدشده. "منحصربهفرد بودن" با بررسی دستوری که قرار است به شل ارسال شود تعیین میشود؛ بنابراین اگر (برای مثال) INCLUDECMD شما از الصاق عبارتی استفاده کند که بسته به مقدار today() نتایج متفاوتی ایجاد نماید، آنگاه هر نسخه منحصربهفرد از دستور یک بار اجرا خواهد شد.
اگر یک پرونده یادآور حاوی بیش از یک دستور یکسان INCLUDECMD باشد، تنها اولین دستور در عمل اجرا خواهد شد. تمام موارد یکسان بعدی از خروجی حافظهپنهانشده مربوط به اولین اجرا استفاده خواهند کرد.
دستور BANNER (THE BANNER COMMAND)
هنگامی که Remind برای نخستین بار یادآوری را صادر میکند، پیامی مانند این چاپ میکند:
Reminders for Friday, 30th October, 1992 (today):
(اگر از هر یک از گزینههای تولید تقویم استفاده شود، یا اگر گزینه -k به کار رود، بنر چاپ نمیشود.)
دستور BANNER به شما اجازه میدهد قالب را تغییر دهید. این دستور باید پیش از هر دستور REM بیاید. قالب به صورت زیر است:
مقدار format مشابه با body (بدنه) در دستور REM است. این مقدار از فیلتر جایگزینی عبور داده میشود و محرک ضمنی (implicit trigger) آن تاریخ جاری سیستم است. بنابراین، بنر پیشفرض معادل دستور زیر است:
BANNER Reminders for %w, %d%s %m, %y%o:
شما میتوانید بنر را با دستور BANNER % بهطور کامل غیرفعال کنید. یا میتوانید یک بنر سفارشی ایجاد نمایید:
BANNER Hi - here are your reminders for %y-%t-%r:
کنترل بافت OMIT (CONTROLLING THE OMIT CONTEXT)
گاهی اوقات لازم است OMITهای عمومی (global) را که برای چند یادآور فعال هستند، موقتاً تغییر دهید. سه دستور به شما امکان میدهند این کار را انجام دهید:
- PUSH-OMIT-CONTEXT
- این دستور OMITهای عمومی جاری را روی یک پشته (stack) داخلی ذخیره میکند.
- CLEAR-OMIT-CONTEXT
- این دستور تمام OMITهای عمومی را پاک میکند و کار را از یک "لوح سفید" آغاز مینماید.
- POP-OMIT-CONTEXT
- این دستور OMITهای عمومی ذخیرهشده توسط جدیدترین PUSH-OMIT-CONTEXT را بازیابی میکند.
برای مثال، فرض کنید بلوکی از یادآورها دارید که به یک بافت OMIT خالی نیاز دارند، و همچنین OMITهای عمومی ناخواستهای ایجاد میکنند که میتوانند با یادآورهای بعدی تداخل داشته باشند. میتوانید از قطعهکد زیر استفاده کنید:
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
عبارتها (EXPRESSIONS)
در برخی بافتها که بعداً توضیح داده خواهد شد، Remind عبارتها را برای ارزیابی میپذیرد. عبارتهای Remind شبیه عبارتهای زبان C هستند، اما روی انواع متفاوتی از اشیاء عمل میکنند.
انواع داده (DATA TYPES)
عبارتهای Remind روی پنج نوع شیء عمل میکنند:
- INT
- نوع داده INT شامل اعداد صحیحی است که در یک کلمه ماشین (machine word) قابل نمایش هستند. نوع داده INT با نوع "int" در زبان C مطابقت دارد.
- STRING
- نوع داده STRING شامل رشتههایی از نویسهها (کاراکترها) است. این نوع تا حدودی با آرایه نویسهای در C قابل مقایسه است، اما بیشتر به نوع رشته در زبان BASIC شباهت دارد.
Remind بهطور معمول انتظار دارد در محیط UTF-8 اجرا شود. در این محیط، میان بایتها و نویسهها تفاوت وجود دارد؛ زیرا در UTF-8 یک نویسه ممکن است با دنبالهای از بیش از یک بایت نمایش داده شود. برای مثال در محیط UTF-8، رشته "🙂" شامل یک نویسه اما چهار بایت است؛ و رشته "één" شامل سه نویسه اما پنج بایت است.
Remind مجموعهای از توابع دارد که روی بایتها عمل میکنند، از جمله index، strlen و substr و چند تابع دیگر. استفاده از این توابع برای رشتههای چندبایتی ایمن نیست؛ در عوض باید از mbindex، mbstrlen و mbsubstr و نسخههای دارای پیشوند mb در سایر توابع استفاده کنید. اگر کاملاً مطمئن هستید که یک رشته فقط شامل نویسههای تکبایتی است، نسخههای بایتمحور میتوانند استفاده شوند و سریعتر از نسخههای چندبایتی هستند.
- TIME
- نوع داده TIME برای دو هدف متفاوت به کار میرود: برای نمایش زمانی از روز با دقت یک دقیقه، یا برای نمایش یک مدتزمان (duration) با دقت یک دقیقه. بافتی که در آن TIME استفاده میشود مشخص میکند که آیا به عنوان زمانی از روز یا یک مدتزمان تفسیر شود.
در بافتهایی که TIME زمانی از روز را نشان میدهد، میتواند از 00:00 تا 23:59 باشد و در داخل به عنوان یک عدد صحیح از 0 تا 1439 به نشانه تعداد دقیقههای سپریشده از نیمهشب ذخیره میشود.
در بافتهایی که TIME یک مدتزمان را نشان میدهد، هیچ حد بالایی برای مؤلفه ساعت وجود ندارد (فراتر از محدودیتی که تحمیل میکند که یک مدتزمان بر حسب دقیقه باید در نوع داده عدد صحیح علامتدار معماری پردازنده شما بگنجد). در داخل، یک مدتزمان به عنوان یک عدد صحیح بر حسب دقیقه ذخیره میشود.
- DATE
- نوع داده DATE شامل تاریخها (پس از ۱ ژانویه ۱۹۹۰) است. در داخل برنامه، اشیاء DATE به صورت تعداد روزهای سپریشده از ۱ ژانویه ۱۹۹۰ ذخیره میشوند.
- DATETIME
- نوع داده DATETIME شامل تاریخ و زمان در کنار یکدیگر است. در داخل برنامه، اشیاء DATETIME به صورت تعداد دقیقههای گذشته از نیمهشب ۱ ژانویه ۱۹۹۰ ذخیره میشوند. میتوانید یک شیء DATETIME را ترکیبی از بخشهای DATE و TIME در نظر بگیرید.
ثابتها (CONSTANTS)
مثالهای زیر مقادیر ثابت را در عبارتهای Remind نشان میدهند:
- ثابتهای INT (INT constants)
- 12, 36, -10, 0, 1209, 0x1F, 0xfe00 (دو مورد آخر استفاده از مقادیر ثابت در مبنای شانزده را نشان میدهند)
- ثابتهای STRING (STRING constants)
- "Hello there", "This is a test", "\nHello\tThere", "", "π is Cool! 🙂"
برای گنجاندن علامت نقلقول در رشته، از "\"" استفاده کنید. هر نویسه دیگری که قبل از آن بکاسلش قرار گیرد، همانطور که هست وارد رشته میشود اما خود بکاسلش حذف میگردد. برای گنجاندن بکاسلش در یک رشته، از "\\" استفاده کنید.
- ثابتهای TIME (TIME constants)
- 12:33, 0:01, 14:15, 16:42, 12.16, 13.00, 1.11, 4:30PM, 12:20am
اگر TIME در جایی استفاده شود که Remind انتظار یک زمان از روز را دارد (برای مثال در یک عبارت AT)، میتواند در قالب ۲۴ ساعته (از 00:00 تا 23:59) یا در قالب ۱۲ ساعته (از 12:00am تا 11:59pm) نوشته شود. اگر TIME در جایی استفاده شود که Remind انتظار یک مدتزمان را دارد، نباید پسوند am یا pm داشته باشد و مؤلفه ساعت تا زمانی که تعداد کل دقیقهها در یک متغیر عدد صحیح علامتدار بگنجد میتواند به هر اندازه بزرگ باشد.
برای راحتی کار، میتوان ثابت TIME را در کوتیشن تکی قرار داد تا با ثابتهای DATE و DATETIME هماهنگ شود، اما این کوتیشنها اختیاری هستند؛ یعنی 12:56 و '12:56' همان ثابت TIME یکسان را نشان میدهند.
- ثابتهای DATE (DATE constants)
- ثابتهای DATE به صورت 'yyyy/mm/dd' یا 'yyyy-mm-dd' بیان میشوند و کوتیشنهای تکی باید درج شوند. این کار ثابتهای تاریخ را از عملگرهای تقسیم یا تفریق اعداد صحیح متمایز میکند. مثالها:
توجه داشته باشید که مقادیر DATE بدون علامتهای نقلقول چاپ میشوند. گرچه هر دو نویسه '-' یا '/' بهعنوان جداکننده تاریخ در ورودی پذیرفته میشوند، هنگام چاپ تاریخها فقط یکی از آنها استفاده خواهد شد. انتخاب استفاده از '-' یا '/' در زمان کامپایل صورت میگیرد. همچنین توجه داشته باشید که نسخههای Remind پیش از 03.00.01 از ثابتهای تاریخ پشتیبانی نمیکردند. در آن نسخهها، باید با استفاده از تابع date() تاریخها را ایجاد کنید. علاوه بر این، نسخههای پیش از 03.00.02 از جداکننده تاریخ '-' پشتیبانی نمیکردند.
- ثابتهای DATETIME (DATETIME constants)
- ثابتهای DATETIME مشابه با ثابتهای DATE بیان میشوند با این تفاوت که یک بخش "@HH:MM" به آنها اضافه میگردد و به صورت اختیاری پسوند "am" یا "pm" به دنبال آن میآید. برای مثال:
مقادیر DATETIME بدون علامتهای نقلقول چاپ میشوند. نکات مربوط به نویسههای جداکننده تاریخ و زمان برای ثابتهای DATE و TIME، برای ثابتهای DATETIME نیز صدق میکنند.
مقادیر صفر و درست/نادرست (ZERO VALUES AND TRUE/FALSE)
تمام انواع دارای یک مقدار صفر (zero value) مرتبط هستند که توسط دستور IF، تابع IIF و عملگرهای منطقی به عنوان نادرست (false) در نظر گرفته میشود. مقادیر صفر عبارتند از:
INT - 0
DATE - '1990-01-01'
TIME - 00:00
DATETIME - '1990-01-01@00:00'
STRING - "" (رشته خالی)
هر مقداری غیر از مقدار صفر به عنوان درست (true) در نظر گرفته میشود.
عملگرها (OPERATORS)
Remind عملگرهای زیر را دارد. عملگرهای موجود در یک خط دارای اولویت یکسان هستند، در حالی که عملگرهای خطوط پایینتر اولویت کمتری نسبت به خطوط بالاتر دارند. این عملگرها تقریباً با عملگرهای زبان C مطابقت دارند.
! - (نفی منطقی یگانی و نفی محاسباتی) * / % (ضرب، تقسیم، باقیمانده) + - (جمع/الحاق، تفریق) < <= > >= (مقایسهها) == != (آزمونهای برابری و نابرابری) && (AND منطقی) || (OR منطقی)
شرح عملگرها (DESCRIPTION OF OPERATORS)
- !
- نفی منطقی. میتواند روی هر نوع دادهای اعمال شود. اگر عملوند غیر صفر باشد، مقدار 0 و در غیر این صورت مقدار 1 را برمیگرداند.
- -
- منهای یگانی (قرینه). میتواند روی یک INT اعمال شود و منفی عملوند را برمیگرداند.
- *
- ضرب. حاصلضرب دو مقدار INT را برمیگرداند. متناوباً، اگر یک آرگومان STRING و دیگری INT باشد، یک STRING شامل به تعداد INT بار تکرارِ STRING اصلی برمیگرداند. در این حالت آرگومان INT نمیتواند منفی باشد.
- /
- تقسیم صحیح. خارجقسمت دو مقدار INT را با صرفنظر از باقیمانده برمیگرداند.
- %
- باقیمانده (Modulus). باقیمانده تقسیم یک مقدار INT بر دیگری را برمیگرداند.
- +
- کاربردهای متعددی دارد که عبارتند از:
INT + TIME یا TIME + INT - یک TIME حاصل از افزودن INT دقیقه به TIME اصلی را برمیگرداند. نتیجه همواره در بازه 00:00 تا 23:59 خواهد بود.
TIME + TIME پارامتر دوم TIME را به عنوان مدتزمان در نظر میگیرد، آن را به یک عدد صحیح از دقیقههای پس از نیمهشب تبدیل میکند و سپس مانند TIME + INT عمل جمع را انجام میدهد.
INT + DATE یا DATE + INT - یک DATE حاصل از افزودن INT روز به DATE اصلی را برمیگرداند.
INT + DATETIME یا DATETIME + INT - یک DATETIME حاصل از افزودن INT دقیقه به DATETIME اصلی را برمیگرداند.
DATETIME + TIME یا TIME + DATETIME پارامتر TIME را به عنوان مدتزمان در نظر میگیرد، آن را به یک عدد صحیح از دقیقههای پس از نیمهشب تبدیل میکند و سپس مانند DATETIME + INT عمل جمع را انجام میدهد.
STRING + STRING - یک STRING که حاصل الحاق دو STRING اصلی است برمیگرداند.
STRING + anything یا anything + STRING - آرگومان غیر-STRING را به یک STRING تبدیل کرده و سپس الحاق را انجام میدهد. تابع coerce() را ببینید.
- -
- کاربردهای متعددی دارد که عبارتند از:
DATE - DATE - اختلاف روزها بین دو DATE را (به صورت یک INT) برمیگرداند.
TIME - TIME - اختلاف بر حسب دقیقه بین دو TIME را (به صورت یک INT) برمیگرداند.
DATETIME - DATETIME - اختلاف بر حسب دقیقه بین دو DATETIME را (به صورت یک INT) برمیگرداند.
DATE - INT - یک DATE برمیگرداند که به اندازه INT روز قبلتر از DATE اصلی است.
TIME - INT - یک TIME برمیگرداند که به اندازه INT دقیقه قبلتر از TIME اصلی است.
DATETIME - INT - یک DATETIME برمیگرداند که به اندازه INT دقیقه قبلتر از DATETIME اصلی است.
DATETIME - TIME - مقدار TIME را به یک INT تبدیل (اجبار/coerce) کرده و سپس تفریق را مانند بالا انجام میدهد.
- <, <=, >, and >=
- اینها عملگرهای مقایسه هستند. آنها میتوانند عملوندهایی از هر نوعی بپذیرند، اما هر دو عملوند باید از یک نوع باشند. عملگرهای مقایسه در صورت برقرار بودن مقایسه مقدار 1 و در صورت نادرست بودن مقدار 0 را برمیگردانند. توجه داشته باشید که مقایسه رشتهها بر اساس ترتیب واژگانی (lexical) نویسهها روی سیستم شما انجام میشود و برای این عملگرها حروف بزرگ و کوچک متفاوت در نظر گرفته میشوند.
- ==, !=
- عملگر == برای آزمون برابری است که در صورت برابر بودن عملوندها مقدار 1 و در صورت نابرابر بودن مقدار 0 را برمیگرداند. عملگر != برای آزمون نابرابری است.
- &&
- این عملگر AND منطقی است. اگر هر دو عملوند غیر صفر باشند، عملوند دوم را برمیگرداند. در غیر این صورت، هر کدام از عملوندها که صفر باشد را برمیگرداند. عملوندها میتوانند از هر نوعی باشند و "صفر" متناسب با نوع هر عملوند تفسیر میشود.
- ||
- این عملگر OR منطقی است. اولین عملوندی را که غیر صفر باشد برمیگرداند؛ اگر هر دو عملوند صفر باشند، عملوند دوم را برمیگرداند. عملوندها میتوانند از هر نوعی باشند و "صفر" متناسب با نوع هر عملوند تفسیر میشود.
نکات (NOTES)
اگر نتیجه عملیات جمع، تفریق یا ضرب در نوع "int" زبان C نگنجد، Remind خطای "Number too high" صادر میکند. بر خلاف زبان C، عملیات اعداد صحیح در هنگام سرریز (overflow) صرفاً پاسخ اشتباه تولید نمیکنند.
عملگرهای دارای اولویت یکسان همیشه از چپ به راست ارزیابی میشوند، مگر در مواردی که پرانتزها خلاف آن را دیکته کنند. این نکته مهم است، زیرا عملگر ارتقایافته "+" لزوماً شرکتپذیر (associative) نیست. برای مثال:
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"
عملگرهای منطقی اصطلاحاً اتصالکوتاه (short-circuit) هستند، همانطور که در C هستند. این بدان معناست که اگر عملوند اول || درست (true) باشد، آنگاه عملوند دوم ارزیابی نمیشود. به همین ترتیب، اگر عملوند اول && نادرست (false) باشد، آنگاه عملوند دوم ارزیابی نمیشود.
متغیرها (VARIABLES)
Remind به شما اجازه میدهد مقادیر را به متغیرها اختصاص دهید. دستور SET به صورت زیر استفاده میشود:
SET var expr
مقدار var نام یک متغیر است. این نام باید با یک حرف یا زیرخط (_) آغاز شود و فقط شامل حروف، ارقام و زیرخط باشد. فقط ۶۴ نویسه اول نام متغیر دارای اهمیت هستند. نام متغیرها به بزرگی و کوچکی حروف حساس نیستند؛ بنابراین "Afoo" و "afOo" یک متغیر یکسان هستند. مثالها:
SET a 10 + (9*8)
SET b "This is a test"
SET mydir getenv("HOME")
SET time 12:15
SET date today()
توجه داشته باشید که خود متغیرها نوع خاصی ندارند؛ آنها نوع هر چیزی را که در آنها ذخیره میکنید به خود میگیرند.
متغیرهایی که با SET یا در خط فرمان با -ivar=expr تنظیم شوند، دارای دامنه سراسری (global scope) هستند.
برای حذف یک متغیر، از دستور UNSET استفاده کنید:
UNSET var [var...]
برای مثال، برای حذف تمام متغیرهای اعلانشده در بالا، استفاده کنید از:
UNSET a b mydir time date
متغیرهای سیستمی (SYSTEM VARIABLES)
علاوه بر متغیرهای معمولی کاربر، Remind چندین «متغیر سیستمی» دارد که برای بررسی وضعیت یا کنترل حالت عملیاتی Remind به کار میروند. متغیرهای سیستمی از نسخه 03.00.07 در Remind در دسترس هستند.
همه متغیرهای سیستمی با علامت دلار «$» آغاز میشوند. میتوان از آنها همانند متغیرهای معمولی در دستورات SET و عبارتها استفاده کرد. تمام متغیرهای سیستمی همواره مقادیری از نوعی مشخص را نگه میدارند. علاوه بر این، برخی از متغیرهای سیستمی غیرقابلتغییر هستند و شما نمیتوانید متغیر سیستمی جدیدی بسازید. متغیرهای سیستمی را میتوان در خط فرمان با گزینه -i مقداردهی اولیه کرد، اما ممکن است لازم باشد آنها را در علامت نقلقول قرار دهید تا از تفسیر علامت دلار توسط پوسته جلوگیری شود. نام متغیرهای سیستمی به بزرگ و کوچک بودن حروف حساس نیست.
متغیرهای سیستمی زیر تعریف شدهاند. مواردی که با برچسب «فقطخواندنی» مشخص شدهاند، با دستور SET قابل تغییر نیستند. تمام متغیرهای سیستمی مقادیری از نوع INT (عدد صحیح) نگه میدارند، مگر اینکه خلاف آن مشخص شده باشد.
- $AddBlankLines
- اگر روی 1 (پیشفرض) تنظیم شود، آنگاه Remind بهطور عادی پس از بنر و هر یادآور، یک خط خالی چاپ میکند. (این رفتار را میتوان با پایان دادن یادآور یا بنر با یک علامت درصد تکی متوقف کرد.) اگر $AddBlankLines روی 0 تنظیم شود، Remind خط خالی را چاپ نمیکند. در این حالت، پایان دادن یادآور با % هیچ اثری ندارد. اگر واقعاً میخواهید پس از یک یادآور خط خالی چاپ شود، آن را با %_ به پایان برسانید تا یک خط تازه درج شود.
- $CalcUTC
- اگر 1 (پیشفرض) باشد، آنگاه Remind از توابع کتابخانه C برای محاسبه تعداد دقایق بین زمان محلی و زمان هماهنگ جهانی (UTC) استفاده میکند. این امر بر محاسبات نجومی (به عنوان مثال sunrise()) اثر میگذارد. اگر 0 باشد، باید تعداد دقایق بین زمان محلی و زمان هماهنگ جهانی را در متغیر سیستمی $MinsFromUTC مشخص کنید.
- $CalMode (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -c در خط فرمان داده شده است.
- $CalType (فقطخواندنی، نوع STRING)
- اگر گزینههای خط فرمان -c، -s یا -p استفاده شده باشند، مقدار این متغیر برابر با "monthly" خواهد بود. اگر از -c+، -s+ یا -p+ استفاده شده باشد، مقدار آن "weekly" است. در غیر این صورت، مقدار آن "none" خواهد بود.
- $Daemon (فقطخواندنی)
- اگر حالت دیمن با گزینه -z فراخوانی شده باشد، شامل تعداد دقایق بین هر بار بیدار شدن است. اگر در حالت دیمن اجرا نشود، شامل مقدار 0 خواهد بود. در حالت سرور (چه با -z0 یا -zj)، شامل مقدار -1 است.
- $DateSep (نوع STRING)
- این متغیر فقط میتواند روی "/" یا "-" تنظیم شود. این متغیر نویسهای را که برای جداسازی بخشهای تاریخ هنگام چاپ یک مقدار DATE یا DATETIME توسط Remind به کار میرود در خود نگه میدارد.
- $DedupeReminders
- اگر این متغیر روی 1 تنظیم شود، Remind یادآورهای تکراری را حذف خواهد کرد. یک یادآور مفروض زمانی تکراری یک یادآور پیشین در نظر گرفته میشود که تاریخ فعالسازی، زمان فعالسازی و بدنه آن دقیقاً یکسان باشد. بهطور پیشفرض، این متغیر روی 0 تنظیم است و Remind یادآورهای تکراری را حذف نمیکند.
به عنوان مثال، فایل یادآور زیر را در نظر بگیرید:
SET $DedupeReminders 1 REM Wednesday MSG Phooey REM 20 MSG Phooey
در روز چهارشنبه، ۲۰ نوامبر ۲۰۲۴، فقط یک پیام "Phooey" صادر خواهد شد. در دسامبر ۲۰۲۴، پیام "Phooey" در هر چهارشنبه و همچنین در روز جمعه، ۲۰ دسامبر ۲۰۲۴ صادر خواهد شد.
اگر $DedupeReminders را روی 0 تنظیم کنید، Remind حتی یادآورها را برای تشخیص تکراری بودن ردیابی نمیکند. مثال زیر را در نظر بگیرید:
SET $DedupeReminders 0 REM Wednesday MSG Hello SET $DedupeReminders 1 REM Wednesday MSG Hello
هر چهارشنبه، Remind تعداد دو یادآور "Hello" صادر خواهد کرد. زیرا زمانی که اولین "Hello" صادر شد، مقدار $DedupeReminders برابر 0 بود و بنابراین برای موارد تکراری بالقوه ردیابی نشد.
موارد تکراری پس از انجام تمام بسطها و جایگزینیهای متغیرها تشخیص داده میشوند. موارد زیر را در نظر بگیرید:
SET $DedupeReminders 1 set a "foo" REM MSG [a] set a "bar" REM MSG [a] set a "foo" REM MSG [a]
اولین دستور REM فعال میشود و "foo" را چاپ میکند. دومی فعال میشود و "bar" را چاپ میکند. سومی فعال نمیشود زیرا تکراری اولین "foo" است.
- $DefaultColor (نوع STRING)
- این متغیر را میتوان روی رشتهای به صورت سه عدد که با فاصله از هم جدا شدهاند تنظیم کرد. هر عدد باید یک عدد صحیح از 0 تا 255 باشد، یا هر سه عدد باید -1 باشند. مقدار پیشفرض $DefaultColor برابر "-1 -1 -1" است که رنگآمیزی پیشفرض یادآورهای نوع MSG را غیرفعال میکند. اگر $DefaultColor را روی هر مقدار دیگری تنظیم کنید، آنگاه تمام یادآورهای نوع MSG، MSF و CAL به طور مؤثر به یادآورهای SPECIAL COLOR تبدیل میشوند که مقدار رنگ آنها توسط $DefaultColor مشخص شده است.
برخلاف سایر متغیرهای سیستمی، مقدار $DefaultColor در بین تکرارهای تقویم حفظ نمیشود؛ بلکه در شروع هر تکرار، مجدداً به "-1 -1 -1" بازنشانی میشود.
- $DefaultPrio
- اولویت پیشفرضی که به یادآورهای فاقد عبارت PRIORITY اختصاص داده میشود. میتوانید این مقدار را در صورت نیاز تنظیم کنید تا اولویت بلوکهایی از یادآورها را بدون نیاز به تایپ اولویت برای تکتک یادآورها تغییر دهید. در زمان شروع، مقدار $DefaultPrio برابر 5000 است؛ این مقدار میتواند از 0 تا 9999 متغیر باشد.
- $DefaultDelta
- میتوانید این متغیر را روی عددی از 0 تا 10000 تنظیم کنید. اگر روی عددی غیرصفر تنظیم شود، آنگاه Remind هر دستور REM را که فاقد اختلاف زمان (دلتا) است، بهگونهای فعال میکند که گویی دلتایی برابر با ++$DefaultDelta داشته است. بهطور پیشفرض، مقدار $DefaultDelta برابر صفر است.
- $DefaultTDelta
- اختلاف زمان پیشفرضی که در صورت عدم تعیین +N در عبارت AT استفاده میشود. این مقدار معمولاً 0 است، اما میتوان آن را با گزینه -tt یا به صورت صریح در اسکریپت خود تنظیم کرد. اگر $DefaultDelta غیرصفر باشد، میتوانید از یک دلتای صریح +0 در عبارت AT برای لغو دلتای پیشفرض استفاده کنید.
- $DeltaOverride (فقطخواندنی)
- اگر غیرصفر باشد، متناظر با آرگومان n دادهشده به گزینه خط فرمان -tn است.
- $DontFork (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -c در خط فرمان مشخص شده است.
- $DontTrigAts (فقطخواندنی)
- تعداد دفعاتی که گزینه -a در خط فرمان ارائه شده است.
- $DontQueue (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -q در خط فرمان مشخص شده است.
- $EndSent (نوع STRING)
- شامل فهرستی از نویسههایی است که جمله را به پایان میرسانند. کلیدواژه MSF دو فاصله پس از این نویسهها درج میکند. در ابتدا، مقدار $EndSent روی ".!?" (نقطه، علامت تعجب و علامت سؤال) تنظیم شده است.
- $EndSentIg (نوع STRING)
- شامل فهرستی از نویسههایی است که وقتی MSF تصمیم میگیرد آیا دو فاصله پس از جمله قرار دهد یا خیر، باید نادیده گرفته شوند. در ابتدا، روی "'>)]}"+CHAR(34) (نقلقول تکی، بزرگتر از، پرانتز بسته، براکت بسته، آکلاد بسته و نقلقول دوگانه) تنظیم است.
MSF He said, "Huh! (Two spaces will follow this.)" Yup.
زیرا پرانتز و علامت نقلقول پایانی (به منظور فاصلهگذاری) هنگامی که بعد از یک نقطه میآیند، نادیده گرفته میشوند.
- $ExpressionTimeLimit
- اگر روی یک مقدار غیرصفر n تنظیم شود، هر عبارتی که ارزیابی آن بیش از n ثانیه طول بکشد، متوقف شده و خطایی برگردانده میشود. این کار برای جلوگیری از عبارتهای مخرب طراحیشده جهت ایجاد حمله منع سرویس (DoS) است. در یک فایل ضمیمهشده، مقدار $ExpressionTimeLimit فقط میتواند نسبت به مقدار فعلی خود کاهش یابد. در فایل سطح بالا، میتوان آن را روی هر مقداری تنظیم کرد، از جمله صفر برای غیرفعال کردن محدودیت زمانی.
- $FirstIndent
- تعداد فاصلههایی که خط اول یک یادآور نوع MSF باید به اندازه آن تورفتگی داشته باشد. مقدار پیشفرض 0 است.
- $FoldYear
- توابع استاندارد کتابخانه یونیکس ممکن است در مواجهه با تاریخهای پس از سال ۲۰۳۷ با مشکل مواجه شوند. اگر این متغیر روی 1 تنظیم شود، آنگاه محاسبات UTC سالهای پس از ۲۰۳۷ را پیش از استفاده از توابع کتابخانه یونیکس «به عقب بازمیگردانند». به عنوان مثال، برای فهمیدن اینکه آیا ساعت تابستانی در ژوئن ۲۰۷۷ برقرار است یا خیر، سال به ۲۰۲۷ برگردانده میشود، زیرا هر دو سال در یک روز جمعه آغاز میشوند و هر دو سال عادی (غیرکبیسه) هستند. بنابراین فرض میشود که قوانین ساعت تابستانی برای هر دو سال یکسان است و توابع کتابخانه یونیکس میتوانند سال ۲۰۲۷ را پردازش کنند. بهطور پیشفرض، مقدار این متغیر 0 است. اگر توابع مربوط به خورشید یا UTC برای سالهای پس از ۲۰۳۷ درست عمل نکردند، آن را روی 1 تنظیم کنید. همچنین بخش «دستگاههای دارای نوع TIME_T ۳۲ بیتی» را مشاهده کنید.
- $FormWidth
- حداکثر عرض هر خط متن برای قالببندی یادآورهای نوع MSF. مقدار پیشفرض برابر با عرض ترمینال بر حسب ستونها منهای ۸ است، اما بین حداقل ۲۰ و حداکثر ۵۰۰ محدود شده است. اگر خروجی استاندارد یک ترمینال نباشد، مقدار پیشفرض ۷۲ است. اگر یک یادآور نوع MSF حاوی کلمهای باشد که بیش از حد طولانی بوده و در این عرض نگنجد، بریده نخواهد شد؛ بلکه محدودیت عرض نادیده گرفته میشود.
- $HideCompletedTodos (فقطخواندنی)
- اگر غیرصفر باشد، گزینه --hide-completed-todos در خط فرمان مشخص شده است.
- $HushMode (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -h در خط فرمان مشخص شده است.
- $IgnoreOnce (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -o در خط فرمان ارائه شده است یا به دلیلی دیگر به صورت ضمنی فعال شده است. در این حالت، دستورالعملهای ONCE نادیده گرفته خواهند شد.
- $InfDelta (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -t بدون آرگومان n در خط فرمان مشخص شده است.
- $IntMax (فقطخواندنی)
- بزرگترین مقدار قابل نمایش از نوع INT. روی سیستمی با اعداد صحیح علامتدار ۳۲ بیتی با استفاده از نمایش مکمل دو، این مقدار ۲۱۴۷۴۸۳۶۴۷ خواهد بود.
- $IntMin (فقطخواندنی)
- کوچکترین مقدار قابل نمایش از نوع INT. روی سیستمی با اعداد صحیح علامتدار ۳۲ بیتی با استفاده از نمایش مکمل دو، این مقدار -۲۱۴۷۴۸۳۶۴۸ خواهد بود.
- $Latitude (نوع STRING)
- عرض جغرافیایی موقعیت مکانی شما، که به صورت یک رشته حاوی عدد ممیز شناور بیان میشود. از آنجا که Remind نوع ممیز شناور بومی ندارد، باید آن را به صورت رشته بیان کنیم. $Latitude میتواند از "-90.0" تا "90.0" متغیر باشد که اعداد مثبت نشاندهنده نقاط واقع در شمال خط استوا و اعداد منفی نشاندهنده جنوب هستند. توجه داشته باشید که صرفنظر از محلیسازی سیستم شما، $Latitude همواره در محلیسازی "C" تفسیر میشود و بنابراین ممیز اعشاری باید یک نقطه (".") باشد.
- $Longitude (نوع STRING)
- طول جغرافیایی موقعیت مکانی شما، که به صورت یک رشته حاوی عدد ممیز شناور بیان میشود. از آنجا که Remind نوع ممیز شناور بومی ندارد، باید آن را به صورت رشته بیان کنیم. $Longitude میتواند از "-180.0" تا "180.0" متغیر باشد که اعداد مثبت نشاندهنده نقاط شرق نصفالنهار گرینویچ و اعداد منفی نشاندهنده غرب آن هستند. توجه داشته باشید که صرفنظر از محلیسازی سیستم شما، $Longitude همواره در محلیسازی "C" تفسیر میشود و بنابراین ممیز اعشاری باید یک نقطه (".") باشد.
به عنوان مثال، مختصات مجسمه آزادی در شهر نیویورک تقریباً به این صورت تنظیم میشود:
SET $Latitude "40.68933" SET $Longitude "-74.04454"
- $LatDeg، $LatMin، $LatSec (منسوخشده)
- اینها عرض جغرافیایی موقعیت مکانی شما را مشخص میکنند. $LatDeg میتواند از -90 تا 90 و موارد دیگر از -59 تا 59 متغیر باشند. عرضهای جغرافیایی شمالی مثبت و عرضهای جنوبی منفی هستند. برای عرضهای جنوبی، هر سه مؤلفه باید منفی باشند. این سه متغیر منسوخ شدهاند؛ باید به جای آنها از $Latitude استفاده کنید.
- $Location (نوع STRING)
- رشتهای است که نام موقعیت مکانی شما را مشخص میکند. این معمولاً نام شهر شما است. میتوان آن را روی هر مقداری که مایلید تنظیم کرد، اما سبک نگارش مناسب ایجاب میکند که با متغیرهای سیستمی عرض و طول جغرافیایی سازگار نگه داشته شود.
- $LongDeg، $LongMin، $LongSec (منسوخشده)
- اینها طول جغرافیایی موقعیت مکانی شما را مشخص میکنند. $LongDeg میتواند از -180 تا 180 متغیر باشد. طولهای جغرافیایی غربی مثبت و طولهای شرقی منفی هستند. توجه داشته باشید که هر سه مؤلفه باید دارای علامت یکسانی باشند: همگی برای طولهای غربی مثبت و همگی برای طولهای شرقی منفی. توجه کنید که به دلایل تاریخی، علامت طول جغرافیایی با عرف متداول متفاوت است! اگر طول جغرافیایی موقعیت خود را از یک موتور جستجو پیدا کنید، به احتمال زیاد باید علامت آن را معکوس کنید تا با Remind درست کار کند. این سه متغیر منسوخ شدهاند؛ باید به جای آنها از $Longitude استفاده کنید. همچنین توجه داشته باشید که $Longitude از قرارداد استاندارد علامت منفی برای طولهای غربی و مثبت برای طولهای شرقی استفاده میکند.
اطلاعات عرض و طول جغرافیایی برای توابع sunrise() و sunset() مورد نیاز است. مقادیر پیشفرض را میتوان در زمان کامپایل در Remind گنجاند، یا میتوانید مقادیر صحیح را با SET در ابتدای اسکریپتهای یادآور خود تنظیم کنید.
توجه داشته باشید که تنظیم هر یک از $LongDeg، $LongMin و $LongSec مقدار $Longitude را متناظراً بهروزرسانی میکند، و تنظیم $Longitude نیز $LongDeg، $LongMin و $LongSec را بهروز مینماید. قوانین مشابهی برای $Latitude، $LatDeg، $LatMin و $LatSec اعمال میشود.
- $JSONMode (فقطخواندنی)
- اگر غیرصفر باشد، گزینه خط فرمان --json مشخص شده است.
- $MaxLateMinutes
- این متغیر نحوه واکنش Remind به به خواب رفتن (suspend) و سپس بیدار شدن رایانه را کنترل میکند. بهطور معمول، اگر یک یادآور زماندار در صف قرار گیرد و سپس رایانه معلق (suspend) شود و پس از آن رایانه بعد از زمان فعالسازی یادآور زماندار بیدار شود، Remind علیرغم اینکه زمان فعالسازی قبلاً سپری شده است، تایمر را فعال میکند.
اگر $MaxLateMinutes را روی یک عدد صحیح غیرصفر بین 1 تا 1440 تنظیم کنید، آنگاه Remind یادآور زمانداری را که زمان فعالسازی آن بیش از $MaxLateMinutes دقیقه در گذشته باشد، فعال نخواهد کرد.
توجه داشته باشید که Remind از مقدار $MaxLateMinutes که در زمان اتمام خواندن فایل یادآور و رفتن به پسزمینه حاکم است استفاده میکند. عموماً باید $MaxLateMinutes را یک بار نزدیک ابتدای فایل تنظیم کنید و پس از آن تغییر ندهید.
- $MaxSatIter
- حداکثر تعداد تکرارها برای عبارت SATISFY (که در ادامه توضیح داده شده است). باید حداقل 10 باشد. مقدار پیشفرض 10,000 است.
- $MaxStringLen
- محدودیتی روی طولانیترین رشتهای که Remind به شما اجازه ایجاد آن را میدهد. مقدار پیشفرض 65535 است. اگر $MaxStringLen را روی 0 یا -1 تنظیم کنید، آنگاه Remind به شما اجازه میدهد رشتههایی با طول دلخواه ایجاد کنید، دستکم تا زمانی که حافظه تمام شود. ما تنظیم $MaxStringLen روی 0 یا -1 را توصیه نمیکنیم، زیرا در این حالت نوشتن کدی که باعث منع سرویس (DoS) Remind شود بسیار آسان خواهد بود.
- $MinsFromUTC
- تعداد دقایق بین زمان هماهنگ جهانی (UTC) و زمان محلی. اگر $CalcUTC غیرصفر باشد، این مقدار هنگام شروع Remind محاسبه میشود. در غیر این صورت، باید آن را به صورت صریح تنظیم کنید. اگر $CalcUTC صفر باشد، از $MinsFromUTC در محاسبات نجومی استفاده میشود. شما باید خودتان آن را برای ساعت تابستانی تنظیم کنید. همچنین، اگر میخواهید $MinsFromUTC را با استفاده از گزینه خط فرمان -i مقداردهی اولیه کنید، باید $CalcUTC را نیز با گزینه -i روی 0 تنظیم کنید.
- $NextMode (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -n در خط فرمان مشخص شده است.
- $MaxFullOmits (فقطخواندنی)
- حداکثر تعداد OMITهای کامل مجاز (یک مقدار ثابت در زمان کامپایل).
- $MaxPartialOmits (فقطخواندنی)
- حداکثر تعداد OMITهای جزئی مجاز (یک مقدار ثابت در زمان کامپایل).
- $NumFullOmits (فقطخواندنی)
- تعداد OMITهای کامل در بافت OMIT فعلی.
- $NumPartialOmits (فقطخواندنی)
- تعداد OMITهای جزئی در بافت OMIT فعلی.
- $NumQueued (فقطخواندنی)
- تعداد یادآورهایی که تاکنون برای فعالسازی زمانبندیشده در پسزمینه در صف قرار گرفتهاند.
- $NumTrig (فقطخواندنی)
- شامل تعداد یادآورهای فعالشده برای تاریخ جاری است. یکی از کاربردهای این متغیر به شرح زیر است: فرض کنید میخواهید هر زمان که یک تعطیلی فعال شد، خانه تقویم PostScript را سایهدار (رنگی) کنید. میتوانید مقدار $NumTrig را پیش از اجرای یک بلوک از یادآورهای تعطیلات در یک متغیر معمولی ذخیره کنید. اگر مقدار $NumTrig پس از بلوک تعطیلات بیشتر از مقدار ذخیرهشده باشد، آنگاه حداقل یک روز تعطیل فعال شده است و میتوانید دستور سایهزدن خانه تقویم را اجرا کنید. (بخش «حالت تقویم» را مشاهده کنید.)
- $OnceFile (نوع STRING)
- اگر این متغیر را روی یک رشته غیرخالی تنظیم کنید، Remind به جای استفاده از تاریخ دسترسی فایل برای تعیین اجرا یا عدم اجرای یادآور نوع ONCE، یک برچسب زمانی را در فایل $OnceFile نگهداری خواهد کرد. این روش قابلاعتمادتر از استفاده از تاریخ دسترسی به فایل یادآور است.
اگر $OnceFile وجود نداشته باشد، در اولین باری که یک کلیدواژه ONCE پردازش میشود ایجاد خواهد شد. این فایل باید توسط کاربر فعلی قابلنوشتن باشد. اگر سعی کنید $OnceFile را پس از اینکه یک یادآور ONCE قبلاً پردازش شده است تنظیم کنید، Remind یک هشدار صادر کرده و تلاش برای تنظیم $OnceFile را نادیده میگیرد.
- $ParseUntriggered
- پرچمی که مشخص میکند آیا Remind باید دستورات REM را که فعال نشدهاند به طور کامل تجزیه کند یا خیر. مقدار 0 (پیشفرض) به معنای نادیده گرفتن تجزیه آنها و 1 به معنای تجزیه کامل آنهاست.
REM 2020-01-01 MSG ["bad_expression" / 2]
آنگاه اگر $ParseUntriggered روی 1 تنظیم شده باشد، Remind خط را به طور کامل تجزیه کرده و حتی اگر یادآور فعال نشده باشد، خطای «Type mismatch» (عدم تطابق نوع) صادر میکند. با این حال، اگر $ParseUntriggered روی 0 (پیشفرض) تنظیم باشد، Remind هیچ خطایی صادر نخواهد کرد مگر در تاریخ 2020-01-01 که یادآور فعال میشود.
نگهداشتن $ParseUntriggered روی 0 ممکن است عملکرد را کمی بهبود بخشد، هرچند به قیمت شناسایی نشدن خطاها تا زمان فعال شدن یادآور تمام میشود. ما توصیه میکنیم آن را روی 0 بگذارید.
- $PrefixLineNo (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -l در خط فرمان مشخص شده است.
- $PSCal (فقطخواندنی)
- اگر غیرصفر باشد، گزینه -p در خط فرمان مشخص شده است.
- $Repeat (فقطخواندنی)
- اگر این متغیر دارای مقدار غیرصفر n باشد، آرگومان خط فرمان به صورت *n برای مشخص کردن اجرای مکرر Remind ارائه شده است.
- $RunOff (فقطخواندنی)
- اگر غیرصفر باشد، دستورالعملهای RUN غیرفعال هستند.
- $Shaded (فقطخواندنی)
- تعداد دفعاتی را برمیگرداند که یک یادآور ویژه SHADE فعال شده است. این متغیر فقط در حالت تقویم تنظیم میشود، نه در حالت یادداشت روزانه (agenda). میتوانید از این متغیر برای جلوگیری از سایهزدن مجدد روزی در تقویم که قبلاً سایهدار شده است استفاده کنید.
به عنوان مثال، فرض کنید میخواهید تمام خانههای تقویم را زرد کنید اگر یادآوری در آن روز فعال شده باشد؛ اما اگر خانهای به صراحت سایهدار شده باشد، نمیخواهید آن سایهزنی بازنویسی شود. میتوانید از کدی شبیه به این استفاده کنید:
SET n $NumTrig
# تمام یادآورهای خود را اینجا قرار دهید...
# اگر چیزی فعال شده باشد و خانه هنوز
# سایهدار نشده باشد، آن را زرد کنید
IF $NumTrig > n && !$Shaded
REM SPECIAL SHADE 255 255 128
ENDIF
- $SimpleCal (فقطخواندنی)
- اگر هر یک از گزینههای خط فرمان -p یا -s داده شده باشند، روی مقداری غیرصفر تنظیم میشود.
- $SortByDate (فقطخواندنی)
- اگر از گزینه -g استفاده نشود مقدار آن 0 است، اگر مرتبسازی بر اساس تاریخ به صورت صعودی باشد 1، و اگر مرتبسازی بر اساس تاریخ به صورت نزولی باشد 2 است.
- $SortByPrio (فقطخواندنی)
- اگر از گزینه -g استفاده نشود مقدار آن 0 است، اگر مرتبسازی بر اساس اولویت به صورت صعودی باشد 1، و اگر مرتبسازی بر اساس اولویت به صورت نزولی باشد 2 است.
- $SortByTime (فقطخواندنی)
- اگر از گزینه -g استفاده نشود مقدار آن 0 است، اگر مرتبسازی بر اساس زمان به صورت صعودی باشد 1، و اگر مرتبسازی بر اساس زمان به صورت نزولی باشد 2 است.
- $SubsIndent
- تعداد فاصلههایی که تمام خطوط (به جز خط اول) یک یادآور نوع MSF باید دارای تورفتگی باشند. مقدار پیشفرض 0 است.
- $SuppressImplicitWarnings
- به طور معمول، اگر خطی با یک نشانه ناشناخته آغاز شود و به عنوان دستور REM در نظر گرفته شود، یا اگر یک دستور REM فاقد نوع باشد و به عنوان یادآور نوع MSG در نظر گرفته شود، Remind یک هشدار صادر میکند. تنظیم $SuppressImplicitWarnings روی 1 این هشدارها را متوقف میکند. مقدار پیشفرض 0 است و ما غیرفعال کردن هشدارها را توصیه نمیکنیم.
- $SuppressLRM
- به طور معمول، هنگامی که Remind با گزینه -c در یک محلیسازی UTF-8 اجرا میشود، پس از چاپ نام روزها یا یادآورها، یک توالی علامت چپبهراست (LRM) صادر میکند. برخی پایانهها این توالی را به نادرستی رندر میکنند، بنابراین میتوانید از:
SET $SuppressLRM 1
در بالای فایل یادآور خود برای جلوگیری از صدور توالیهای LRM استفاده کنید، یا میتوانید Remind را با گزینه '-i$SuppressLRM=1' فراخوانی کنید.
- $SysInclude (فقطخواندنی، نوع STRING)
- یک مسیر دایرکتوری شامل اسکریپتهای استاندارد یادآور است. در حال حاضر، Remind همراه با برخی فایلهای استاندارد تعطیلات و بستههای زبان عرضه میشود. مقدار $SysInclude در این نصب "/usr/share/remind" است.
- $T (فقطخواندنی، نوع DATE یا INT)
- معادل با trigdate(). (بخش توابع توکار را مشاهده کنید.)
- $Tb (فقطخواندنی، نوع DATE یا INT)
- معادل با trigbase().
- $Td (فقطخواندنی)
- معادل با day(trigdate()).
- $Tm (فقطخواندنی)
- معادل با monnum(trigdate()).
- $Tu (فقطخواندنی، نوع DATE یا INT)
- معادل با triguntil().
- $Tw (فقطخواندنی)
- معادل با wkdaynum(trigdate()).
- $Ty (فقطخواندنی)
- معادل با year(trigdate()).
- $Tt (فقطخواندنی، نوع TIME یا INT)
- معادل با trigtime().
- $TimeSep (نوع STRING)
- این متغیر فقط میتواند روی ":" یا "." تنظیم شود. نویسهای را نگه میدارد که برای جداسازی بخشهای زمان هنگام چاپ یک مقدار TIME یا DATETIME توسط Remind به کار میرود.
- $TimetIs64bit (فقطخواندنی)
- این متغیر اگر نوع داخلی time_t در C حداقل ۶۴ بیت طول داشته باشد مقدار 1 را برمیگرداند. اگر 0 برگرداند، کتابخانه داخلی C قادر به نمایش تاریخهای پس از حدود ۲۰۳۸ نخواهد بود و Remind از یک راهکار جایگزین برای جلوگیری از مشکلات استفاده خواهد کرد. همچنین بخش «دستگاههای دارای نوع TIME_T ۳۲ بیتی» را مشاهده کنید.
- $TodoFilter (فقطخواندنی)
- اگر 0 باشد، هم رویدادها و هم موارد انجام کار (TODO) خروجی داده میشوند. اگر 1 باشد، گزینه خط فرمان --only-todos مشخص شده است. اگر 2 باشد، گزینه خط فرمان --only-events مشخص شده است.
- $UntimedFirst (فقطخواندنی)
- اگر گزینه -g با نویسه چهارم مرتبسازی به صورت "d" استفاده شده باشد روی 1 تنظیم میشود؛ در غیر این صورت روی 0 تنظیم است.
- $U (فقطخواندنی، نوع DATE)
- دقیقاً معادل با today(). (بخش توابع توکار را مشاهده کنید.)
- $Ud (فقطخواندنی)
- معادل با day(today()).
- $Um (فقطخواندنی)
- معادل با monnum(today()).
- $Uw (فقطخواندنی)
- معادل با wkdaynum(today()).
- $Uy (فقطخواندنی)
- معادل با year(today()).
- $UseVTColors (فقطخواندنی)
- اگر از گزینههای -@ یا -cc استفاده شده باشد روی 1 تنظیم میشود؛ در غیر این صورت 0 است.
- $UseBGVTColors (فقطخواندنی)
- اگر از گزینه -@,,1 استفاده شده باشد روی 1 تنظیم میشود؛ در غیر این صورت 0 است.
- $Use256Colors (فقطخواندنی)
- اگر از گزینه -@1 استفاده شده باشد روی 1 تنظیم میشود؛ در غیر این صورت 0 است.
- $UseTrueColors (فقطخواندنی)
- اگر از گزینه -@2 استفاده شده باشد روی 1 تنظیم میشود؛ در غیر این صورت 0 است.
- $TerminalBackground (فقطخواندنی)
- اگر رنگ پسزمینه پایانه قابل تشخیص نباشد مقدار -1 را برمیگرداند؛ اگر تیره تشخیص داده شود (یا با گزینه -@,0 به عنوان تیره مشخص شده باشد) مقدار 0 و اگر روشن تشخیص داده شود (یا با گزینه -@,1 به عنوان روشن مشخص شده باشد) مقدار 1 را برمیگرداند. پسزمینه پایانه زمانی «تیره» در نظر گرفته میشود که میانگین مؤلفههای قرمز، سبز و آبی حداکثر ۸۵ از ۲۵۵ باشد، و حداکثر هر یک از مؤلفهها حداکثر ۱۲۸ از ۲۵۵ باشد.
- $TerminalHyperlinks (نوع INT)
- اگر پایانه شما از توالیهای گریز برای ایجاد پیوندهایی شبیه به HTML در اطراف متن پشتیبانی میکند (نشانی https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda را ببینید)، میتوانید این متغیر را روی 1 تنظیم کنید. آنگاه Remind هر یادآور دارای رشته اطلاعاتی "Url:" را به یک ابرپیوند در پایانه شما تبدیل خواهد کرد. بهطور پیشفرض، اگر خروجی استاندارد Remind یک پایانه باشد، مقدار $TerminalHyperlinks روی 1 تنظیم میشود، و اگر پایانه نباشد روی 0 تنظیم خواهد شد.
- $WarningLevel (نوع STRING)
- با انتشار نسخههای جدید Remind، ممکن است هشدارهای جدیدی اضافه شوند. اگر اسکریپتهای شما که قبلاً بدون مشکل اجرا میشدند، با ارتقای Remind ناگهان شروع به صدور هشدار کنند، به عنوان یک راهکار موقت میتوانید $WarningLevel را روی رشتهای به فرم AB.CD.EF تنظیم کنید که در آن AB، CD و EF جفتهایی از ارقام دهدهی هستند. این کار هرگونه هشداری را که پس از نسخه AB.CD.EF برنامه Remind معرفی شده است متوقف میکند. اگر $WarningLevel را تنظیم نکنید، مقدار پیشفرض آن نسخه جاری Remind خواهد بود، به این معنی که تمام هشدارها صادر خواهند شد.
به عنوان مثال، اگر میخواهید هشدارهایی که دریافت میکنید به آنچه Remind 05.00.00 تولید میکرد محدود شود، از این دستور استفاده کنید:
SET $WarningLevel "05.00.00"
ما توصیه نمیکنیم که $WarningLevel را به عنوان یک روال معمول تنظیم کنید؛ شما باید از آن تنها تا زمانی برای متوقف کردن هشدارها استفاده کنید که اسکریپتهای remind خود را اصلاح نمایید تا دیگر هشداری صادر نکنند.
نکته: اگر هر یک از حالتهای تقویم فعال باشند، مقادیر متغیرهای $Daemon ،$DontFork ،$DontTrigAts ،$DontQueue ،$HushMode ،$IgnoreOnce ،$InfDelta و $NextMode معنایی نخواهند داشت.
ذخیره و بازیابی متغیرها (SAVING AND RESTORING VARIABLES)
درست مانند بافت OMIT، شما میتوانید مقادیر متغیرهای سراسری و تمام متغیرهای سیستمی (قابلتغییر) را ذخیره و بازیابی کنید. به عنوان مثال:
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 لغو شده است
همانطور که در مثال مشاهده میکنید، PUSH-VARS فهرستی از نامهای متغیرهای سراسری و/یا نامهای متغیرهای سیستمی را دریافت میکند. شما میتوانید مقادیر هر متغیر سیستمی قابلتغییر و هر متغیر سراسری را ذخیره کنید. حتی میتوانید متغیرهای سراسری را که هنوز مقداردهی نشدهاند ذخیره (push) کنید.
دستور POP-VARS مقادیر تمام متغیرهای سیستمی و متغیرهای سراسری را که توسط آخرین دستور PUSH-VARS ذخیره شده بودند بازیابی میکند. اگر یک متغیر سراسری تعریفنشده را ذخیره کرده باشید، آن متغیر توسط دستور POP-VARS لغو مقدار (unset) میشود.
توابع داخلی (BUILT-IN FUNCTIONS)
دستور Remind شمار زیادی از توابع داخلی دارد. نحو فراخوانی یک تابع مانند زبان C است - نام تابع، و به دنبال آن فهرستی از آرگومانها که با کاما از یکدیگر جدا شده و درون پرانتز قرار گرفتهاند. نام توابع به حروف بزرگ و کوچک حساس نیست. اگر تابعی هیچ آرگومانی نپذیرد، باید در فراخوانی تابع با «()» همراه شود. در غیر این صورت، Remind آن را به عنوان نام متغیر تفسیر کرده و احتمالاً به درستی کار نخواهد کرد.
در توضیحات زیر، از اشکال کوتاه برای نشان دادن نوعهای مجاز آرگومانها استفاده میشود. نویسههای "i"، "s"، "d"، "t" و "q" به ترتیب نمایانگر آرگومانهای INT، STRING، DATE، TIME و DATETIME هستند. اگر یک آرگومان بتواند یکی از چندین نوع باشد، این نویسهها به یکدیگر متصل میشوند. برای نمونه، "di_arg" نمایانگر آرگومانی است که میتواند یک DATE یا یک INT باشد. "x_arg" نمایانگر آرگومانی از هر نوعی است. پس از نوع آرگومان، یک زیرخط (underscore) و شناسهای که نام آرگومان است قرار میگیرد.
توابع داخلی عبارتند از:
- _(s_message)
- مدخل جدول ترجمه برای message را برمیگرداند. اگر چنین مدخلی در جدول ترجمه وجود نداشته باشد، مقدار message را بدون تغییر بازمیگرداند. برای نمونه، این دنباله را در نظر بگیرید:
TRANSLATE "Goodbye" "Tot ziens"
SET a _("Goodbye")
پس از اجرای این دو خط، متغیر a برابر "Tot ziens" تنظیم خواهد شد. برای اطلاعات بیشتر بخش «جدول ترجمه (THE TRANSLATION TABLE)» را ببینید.
در بدنه یک یادآور، دنباله جایگزینی %(text) (تقریباً) معادل [_("text")] است. بنابراین یادآورهای زیر تقریباً معادلند:
REM MSG %(Goodbye)
REM MSG [_("Goodbye")]
تنها تفاوت در این است که اگر _("Goodbye") حاوی علامت % باشد، آنگاه آن نتیجه از فیلتر جایگزینی عبور داده خواهد شد، در حالی که در یادآور اول عبور داده نمیشود. علت آن است که دستور دوم REM ابتدا الصاق عبارت (expression pasting) و به دنبال آن یک گذر از فیلتر جایگزینی را انجام میدهد، در حالی که دستور اول ترجمه را به عنوان بخشی از فیلتر جایگزینی انجام میدهد (و گذر دوم از فیلتر جایگزینی را اعمال نمیکند).
- abs(i_num)
- قدر مطلق num را برمیگرداند.
- access(s_file, si_mode)
- مجوزهای دسترسی به فایل file را آزمایش میکند. Mode میتواند رشتهای شامل ترکیبی از نویسههای "rwx" برای آزمایش مجوزهای خواندن، نوشتن و اجرا باشد. متناوباً، mode میتواند عددی مطابق با فراخوانی سیستمی access(2) در یونیکس باشد. این تابع در صورتی که فایل با mode مشخصشده قابل دسترسی باشد مقدار 0 و در غیر این صورت مقدار -1 را بازمیگرداند.
- adawn([dq_date])
- زمان «سپیدهدم نجومی» (astronomical dawn) را در date مشخصشده برمیگرداند. اگر date حذف شود، مقدار پیشفرض today() خواهد بود. اگر یک شیء datetime داده شود، تنها مؤلفه تاریخ آن استفاده میشود.
- adusk([dq_date])
- زمان «گرگومیش نجومی» (astronomical twilight) را در date مشخصشده برمیگرداند. اگر date حذف شود، مقدار پیشفرض today() خواهد بود.
- ampm(tq_time [,s_am [,s_pm [,i_lz]]])
- یک STRING برمیگرداند که نتیجه تبدیل time (که یک شیء TIME یا DATETIME است) به قالب "AM/PM" میباشد. آرگومانهای اختیاری am و pm رشتههایی هستند که به ترتیب در حالتهای قبلازظهر و بعدازظهر اضافه میشوند؛ مقادیر پیشفرض آنها "AM" و "PM" است. آرگومان اختیاری lz مشخص میکند که آیا ساعت باید با صفر پیشگام (leading zero) به دو رقم تکمیل شود یا خیر. اگر lz صفر باشد، صفر پیشگام اضافه نمیشود؛ در غیر این صورت، ساعت با یک صفر پیشگام به دو رقم تکمیل میگردد. در صورت عدم تعیین، مقدار پیشفرض lz برابر صفر است.
این تابع هنگام قالببندی خروجی خود از متغیرهای سیستمی $DateSep، $TimeSep و $DateTimeSep پیروی میکند. در اینجا چند نمونه از خروجی آن آورده شده است:
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"
- ansicolor(i_red, i_green, i_blue [,i_bg [,i_clamp]])
- یک STRING شامل دنباله فرار ANSI برای تغییر رنگ متن ترمینال برمیگرداند. پارامترهای red، green و blue اعدادی صحیح از 0 تا 255 هستند که مقدار مؤلفه رنگ مربوطه را مشخص میکنند. به عنوان یک حالت ویژه، هر سه مقدار میتوانند -1 باشند؛ در این حالت دنباله ANSI با مقدار "ESC[0m" بازگردانده میشود که تمام ویژگیهای متنی را به حالت عادی بازنشانی میکند.
رشته بازگرداندهشده توسط ansicolor به حالت رنگی که Remind در آن اجرا میشود (همانطور که توسط گزینه ?B-@?R تعیین شده) بستگی دارد. اگر حالت رنگی فعال نباشد، ansicolor همواره رشته خالی بازمیگرداند. در غیر این صورت، دنباله فراری را بازمیگرداند که بهترین تقریب رنگ را با توجه به حالت رنگی ?B-@?R ارائه میدهد.
آرگومان اختیاری bg برابر 0 یا 1 است. اگر 0 باشد (پیشفرض)، رنگ پیشزمینه تنظیم میشود. اگر 1 باشد، رنگ پسزمینه تنظیم میگردد. توجه داشته باشید که تنظیم رنگ پسزمینه تنها در حالت 256 رنگی یا رنگ واقعی (true-color) کار میکند.
آرگومان اختیاری clamp برابر 0 یا 1 است. اگر 0 باشد (پیشفرض)، رنگها بر اساس رنگ پسزمینه ترمینال تعدیل نمیشوند. اگر 1 باشد، Remind تلاش میکند رنگهای تیره یا روشن را طوری تنظیم کند که کنتراست کافی برای دیده شدن در ترمینال داشته باشند.
سه آرگومان نخست میتوانند به عنوان یک جایگزین، به صورت رشتهای متشکل از سه عدد جداشده با فاصله نیز مشخص شوند، مانند این مثال: "128 128 0"
به عنوان یک حالت ویژه، ansicolor("") معادل ansicolor(-1,-1,-1) است و دنباله ANSI برای بازنشانی تمام ویژگیهای متنی به حالت عادی را برمیگرداند.
توجه داشته باشید که درج دنبالههای رنگی ANSI در حالت تقویم نتایج بههمریختهای تولید خواهد کرد. بنابراین، توصیه میکنیم توابعی مانند موارد زیر تعریف کنید که در حالت تقویم رشته خالی برمیگردانند:
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
اگر از تابع ansicolor استفاده میکنید، فراموش نکنید که رنگ را با ansicolor(-1,-1,-1) به حالت عادی بازنشانی کنید؛ در غیر این صورت یادآورهای بعدی همچنان رنگی باقی خواهند ماند.
- args(s_fname)
- تعداد آرگومانهای مورد انتظار تابع تعریفشده توسط کاربر fname را برمیگرداند، یا در صورتی که چنین تابع کاربری وجود نداشته باشد، مقدار -1 را بازمیگرداند. توجه داشته باشید که این تابع تنها توابع تعریفشده توسط کاربر را بررسی میکند، نه توابع داخلی را. کاربرد اصلی آن تعیین این است که آیا یک تابع کاربری خاص قبلاً تعریف شده است یا خیر. تابع args() تنها در نسخههای 03.00.04 به بالای Remind در دسترس است.
- asc(s_string)
- یک INT برمیگرداند که کد اسکی (ASCII) نخستین بایت در string است. به عنوان یک حالت ویژه، asc("") مقدار 0 را برمیگرداند. برای رشتههای UTF-8، این تابع بایت UTF-8 شروعکننده رشته را برمیگرداند که احتمالاً چندان مفید نخواهد بود.
- codepoint(s_string)
- یک INT برمیگرداند که کد پوینت (code point) نخستین نویسه در string است و با نویسههای چندبایتی به درستی رفتار میکند. به عنوان یک حالت ویژه، codepoint("") مقدار 0 را برمیگرداند.
- baseyr()
- «سال پایه» (base year) که در Remind کامپایل شده است را برمیگرداند (معمولاً 1990). تمامی تاریخها در داخل برنامه به صورت تعداد روزهای گذشته از ۱ ژانویه baseyr() ذخیره میشوند.
- catch(x_arg1, x_arg2)
- مقدار arg1 را ارزیابی میکند و در صورتی که خطایی رخ ندهد، مقدار حاصل را برمیگرداند. اگر در حین ارزیابی arg1 خطایی رخ دهد، arg2 را ارزیابی کرده و بازمیگرداند. توجه داشته باشید که catch() تنها خطاهای زمان اجرای ارزیابی را میگیرد و قادر به گرفتن خطاهای نحوی نیست.
چند مثال:
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
در آخرین مثال توجه کنید که catch از شما در برابر خطاهای موجود در ارزیابی arg2 محافظت نمیکند.
- catcherr()
- رشتهای نمایانگر پیام خطای آخرین تابع catch() ارزیابیشده که آرگومان اول آن منجر به خطا شده بود را برمیگرداند. توجه داشته باشید که پیام خطا همواره به زبان انگلیسی است حتی اگر Remind بومیسازی شده باشد؛ این ویژگی به شما امکان میدهد مقدار بازگشتی را به طور قابل اطمینان بیازمایید. چند مثال:
# 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()
- char(i_i1 [,i_i2...])
- این تابع میتواند هر تعداد آرگومان از نوع INT بپذیرد. یک STRING متشکل از بایتهای مشخصشده توسط آرگومانها را برمیگرداند. ایجاد دنبالههای نامعتبر UTF-8 به آسانی ممکن است؛ char این موضوع را بررسی نمیکند. توجه داشته باشید که هیچیک از آرگومانها نمیتواند 0 باشد، مگر اینکه فقط یک آرگومان وجود داشته باشد. به عنوان یک حالت ویژه، char(0) مقدار "" را برمیگرداند.
- mbchar(i_i1 [,i_i2...])
- این تابع میتواند هر تعداد آرگومان از نوع INT بپذیرد. یک STRING متشکل از نویسههای مشخصشده توسط آرگومانها را برمیگرداند. هر کد پوینتی میتواند ارائه شود و رشتهای صحیح از نویسههای چندبایتی بازگردانده خواهد شد. توجه داشته باشید که هیچیک از آرگومانها نمیتواند 0 باشد، مگر اینکه فقط یک آرگومان وجود داشته باشد. به عنوان یک حالت ویژه، mbchar(0) مقدار "" را برمیگرداند. علاوه بر این، هیچ آرگومانی نمیتواند عدد منفی باشد.
- choose(i_index, x_arg1 [,x_arg2...])
- دستور choose باید دستکم دو آرگومان بپذیرد که نخستین آرگومان یک INT است. اگر index برابر n باشد، آنگاه n-اُمین آرگومان بعدی بازگردانده میشود. اگر index کمتر از 1 باشد، arg1 برگردانده میشود. اگر index بزرگتر از تعداد آرگومانهای بعدی باشد، آخرین آرگومان بازگردانده خواهد شد. مثالها:
choose(0, "foo", 1:13, 1000) returns "foo" choose(1, "foo", 1:13, 1000) returns "foo" choose(2, "foo", 1:13, 1000) returns 1:13 choose(3, "foo", 1:13, 1000) returns 1000 choose(4, "foo", 1:13, 1000) returns 1000
توجه داشته باشید که تنها آرگومان نخست و نتیجه انتخابشده ارزیابی میشوند. هر آرگومانی که انتخاب نشود ارزیابی نخواهد شد.
- coerce(s_type, x_arg)
- این تابع در صورت امکان، arg را به نوع type مشخصشده تبدیل میکند. Type باید یکی از موارد "INT"، "STRING"، "DATE"، "TIME" یا "DATETIME" باشد (بدون حساسیت به بزرگی و کوچکی حروف). قوانین تبدیل به شرح زیر است:
اگر arg از پیش از نوع type مشخصشده باشد، بدون تغییر بازگردانده میشود.
اگر type برابر "STRING" باشد، آنگاه arg به رشتهای متشکل از نمایش چاپی آن تبدیل میشود.
اگر type برابر "DATE" باشد، آنگاه آرگومان arg از نوع INT با تفسیر آن به عنوان تعداد روزهای گذشته از ۱ ژانویه baseyr() تبدیل میشود. آرگومان arg از نوع STRING با تلاش برای خواندن آن به عنوان یک تاریخ چاپی تبدیل میگردد. یک DATETIME با حذف مؤلفه زمان به تاریخ تبدیل میشود. یک آرگومان arg از نوع TIME نمیتواند به تاریخ تبدیل شود.
اگر type برابر "TIME" باشد، آنگاه آرگومان arg از نوع INT با تفسیر آن به عنوان تعداد دقایق گذشته از نیمهشب تبدیل میشود. آرگومان arg از نوع STRING با تلاش برای خواندن آن به عنوان یک زمان چاپی تبدیل میشود. یک DATETIME با حذف مؤلفه تاریخ به زمان تبدیل میشود. یک آرگومان arg از نوع DATE نمیتواند به زمان تبدیل شود.
اگر type برابر "DATETIME" باشد، آنگاه آرگومان arg از نوع INT با تفسیر آن به عنوان تعداد دقایق گذشته از نیمهشب ۱ ژانویه baseyr() تبدیل میشود. یک STRING با تلاش برای خواندن آن به عنوان یک تاریخ و زمان چاپی تبدیل میشود. سایر انواع داده نمیتوانند به تاریخ و زمان تبدیل شوند.
اگر type برابر "INT" باشد، آنگاه آرگومانهای DATE، TIME و DATETIME با استفاده از عکس رویههای شرحدادهشده در بالا تبدیل میشوند. آرگومان arg از نوع STRING با تجزیه آن به عنوان یک عدد صحیح تبدیل میگردد.
- columns([s_arg])
- اگر بدون آرگومان فراخوانی شود، columns() به صورت زیر عمل میکند: اگر خروجی استاندارد یا خطای استاندارد یک TTY باشد، عرض ترمینال را بر حسب ستون بازمیگرداند. اگر هیچکدام از خروجی استاندارد یا خطای استاندارد TTY نباشند، برای دریافت اندازه ترمینال تلاش میکند "/dev/tty" را باز کند. اگر این کار با شکست مواجه شود، مقدار -1 را برمیگرداند.
اگر با یک آرگومان رشتهای فراخوانی شود، columns(str) تعداد ستونهایی را که str در صورت چاپ در ترمینال اشغال میکند بازمیگرداند. دنبالههای تغییر رنگ ANSI صفر ستون اشغال میکنند در حالی که برخی نویسههای یونیکد دو ستون را اشغال میکنند. columns(str) همه این موارد را لحاظ میکند. توجه داشته باشید که اگر Remind بدون پشتیبانی از یونیکد کامپایل شده باشد، columns(str) خطای عدم تطابق نوع بازمیگرداند.
نتیجه columns(str) ممکن است کمتر، مساوی یا بیشتر از نتیجه mbstrlen(str) باشد. این بدان علت است که برخی نویسههای یونیکد به اصطلاح نویسههای ترکیبی (combining characters) هستند که یک واحد به طول نویسهها میافزایند، اما خودشان هیچ ستونی را اشغال نمیکنند. و برخی دیگر از نویسههای یونیکد نویسههای با عرض دوگانه (double-width) هستند که یک واحد به طول نویسهها اضافه میکنند، اما دو ستون نمایش را اشغال مینمایند.
- const(x_arg)
- مقدار arg را ارزیابی کرده و بازمیگرداند، اما همچنین اطمینان حاصل میکند که نتیجه به عنوان "ثابت" (constant) علامتگذاری شود. با احتیاط استفاده کنید؛ استفاده نادرست ممکن است منجر به پاکسازی یادآورهای ناخواسته در حالت پاکسازی (Purge Mode) شود. همچنین بخش «عبارتهای غیرثابت (NON-CONSTANT EXPRESSIONS)» را ببینید.
- current()
- تاریخ و زمان جاری را به عنوان یک شیء DATETIME برمیگرداند. این مقدار ممکن است تاریخ و زمان واقعی باشد، یا تاریخ و زمانی باشد که در خط فرمان تعیین شده است.
- date(i_y, si_m, i_d)
- تابع date() یک شیء DATE شامل مؤلفههای سال، ماه و روز مشخصشده توسط y، m و d را برمیگرداند. ماه میتواند به صورت یک عدد صحیح از 1 تا 12 یا رشتهای شامل نام ماه مشخص شود.
- datepart(dq_datetime)
- یک شیء DATE برمیگرداند که نمایانگر بخش تاریخ datetime است.
- datetime(args)
- تابع datetime() میتواند از دو تا پنج آرگومان بپذیرد. همواره یک DATETIME تولیدشده از آرگومانهای خود را برمیگرداند.
اگر دو آرگومان بدهید، اولی باید یک DATE و دومی یک TIME باشد.
اگر سه آرگومان بدهید، اولی باید یک DATE و دومی و سومی باید INT باشند. آرگومانهای دوم و سوم به عنوان ساعت و دقیقه تفسیر شده و به یک TIME تبدیل میشوند.
اگر چهار آرگومان بدهید، به عنوان سال، ماه، روز و زمان تفسیر میشوند. سال و روز باید INT باشند. ماه میتواند یک INT از 0 تا 12 یا رشتهای شامل نام ماه باشد. زمان باید یک TIME باشد.
در نهایت، اگر پنج آرگومان بدهید، همگی باید INT باشند و به عنوان سال، ماه، روز، ساعت و دقیقه تفسیر میشوند. (در واقع، ماه میتواند رشتهای شامل نام ماه نیز باشد.)
- dawn([dq_date])
- زمان «سپیدهدم شهری» (civil dawn) را در date مشخصشده برمیگرداند. اگر date حذف شود، مقدار پیشفرض today() خواهد بود. اگر یک شیء datetime داده شود، تنها مؤلفه تاریخ آن استفاده میشود.
- day(dq_date)
- این تابع یک DATE یا DATETIME را به عنوان آرگومان میپذیرد و یک INT که مؤلفه روز از ماهِ date است را برمیگرداند.
- daysinmon(si_m, i_y) or daysinmon(dq_date)
- تعداد روزهای موجود در ماه m (1-12) از سال y را برمیگرداند. آرگومان نخست میتواند یک عدد صحیح از 1 تا 12 یا رشتهای شامل نام ماه باشد. اگر یک آرگومان منفرد DATE یا DATETIME داده شود، تعداد روزهای ماهی را که شامل آن آرگومان است برمیگرداند.
- defined(s_var)
- اگر متغیر با نام var تعریف شده باشد مقدار 1 و در غیر این صورت مقدار 0 را برمیگرداند.
defined("X")
و نه:
defined(X)
مثال دوم برای ارزیابی X تلاش خواهد کرد و در صورتی که تعریف نشده باشد یا از نوع STRING نباشد، خطایی بازمیگرداند.
- dosubst(s_str [,d_date [,t_time]]) or dosubst(s_str [,q_datetime])
- یک STRING برمیگرداند که حاصل عبور دادن str از فیلتر جایگزینی شرح داده شده در بخشهای پیشین است. پارامترهای date و time (یا datetime) تاریخ و زمان راهانداز مؤثری را تعیین میکنند که توسط فیلتر جایگزینی استفاده میشود. اگر date و time حذف شوند، مقادیر پیشفرض آنها today() و now() خواهد بود.
توجه داشته باشید که اگر str با "%" پایان نیابد، یک نویسه خط جدید به انتهای نتیجه اضافه خواهد شد. همچنین، فراخوانی dosubst() با یک date در گذشته (یعنی اگر date < today() باشد)، نتایج تعریفنشدهای تولید خواهد کرد.
تابع dosubst() تنها از نسخه 03.00.04 به بعد Remind در دسترس است.
- dusk([dq_date])
- زمان «گرگومیش شهری» (civil twilight) را در date مشخصشده برمیگرداند. اگر date حذف شود، مقدار پیشفرض today() خواهد بود.
- easterdate([dqi_arg])
- اگر arg یک INT باشد، تاریخ یکشنبه عید پاک را برای سال مشخصشده برمیگرداند. اگر arg یک DATE یا DATETIME باشد، تاریخ یکشنبه عید پاک بعدی در تاریخ یا پس از arg را برمیگرداند. (مؤلفه زمان شیء datetime نادیده گرفته میشود.) اگر arg حذف شود، مقدار پیشفرض today() خواهد بود.
توجه داشته باشید که easterdate عید پاک غربی را محاسبه میکند. برای تاریخ عید پاک ارتدکس، orthodoxeaster را ببینید.
- escape(s_string [,i_add_quotes])
- یک STRING برمیگرداند که همان رشته ورودی است، اما تمام نویسههای ویژه با بکاسلش اسکیپ شدهاند. برای نمونه، دستور زیر:
set a escape("foo" + char(10) + "bar")
مقدار a را برابر "foo\nbar" قرار میدهد که در آن "\n" دنباله دقیق "\" و به دنبال آن "n" است. این ویژگی زمانی مفید است که بخواهید در یک عبارت الصاقی رشتهای را محاسبه کنید که Remind سپس آن را دوباره به عنوان یک رشته درون علامت نقلقول تجزیه کند، مانند یک دستور TRANSLATE یا یک بند INFO.
اگر آرگومان اختیاری add_quotes داده شود و غیر صفر باشد، مقدار بازگشتی از escape شامل علامتهای نقلقول دوتایی در دو طرف آن خواهد بود.
- eval(s_arg)
- رشته arg را به عنوان یک عبارت تجزیه و ارزیابی کرده و نتیجه را برمیگرداند. توجه داشته باشید که هر نام متغیری در عبارت تجزیهشده به متغیرهای سراسری اشاره دارد، نه به متغیرهای محلی. برای نمونه، این مورد را در نظر بگیرید:
SET x 2
FSET f(x) x + eval("1 + x")
REM MSG F is [f(9)]
نتیجه "F is 12" خواهد بود زیرا ارجاع به x درون آرگومان eval() به متغیر سراسری x اشاره دارد و نه به آرگومان تابع.
توجه داشته باشید که برای امنیت، RUN در حین ارزیابی eval() غیرفعال است، که یعنی نمیتوانید از داخل یک eval() از تابع shell() استفاده کنید.
- evaltrig(s_trigger [,dq_start])
- عبارت trigger را مانند یک مشخصه راهانداز در REM یا IFTRIG ارزیابی کرده و تاریخ راهانداز را به صورت یک DATE (یا در صورت وجود بند AT به صورت یک DATETIME) برمیگرداند. اگر هیچ راهاندازی قابل محاسبه نباشد، یک INT منفی بازمیگرداند.
به طور معمول، evaltrig تاریخ راهانداز را در امروز یا پس از آن مییابد. اگر آرگومان start را بدهید، پویش از آن تاریخ شروع میشود.
برای نمونه، عبارت:
evaltrig("Mon 1", '2008-10-07')
مقدار '2008-11-03' را برمیگرداند، چرا که این تاریخ نخستین روز در تاریخ یا بعد از ۷ اکتبر ۲۰۰۸ است که شرط "Mon 1" را برآورده میکند.
اگر میخواهید بدانید از نخستین دوشنبه اکتبر ۲۰۰۸ تا نخستین دوشنبه نوامبر ۲۰۰۸ چند روز فاصله است، از دستور زیر استفاده کنید:
evaltrig("Mon 1", '2008-11-01') - evaltrig("Mon 1", '2008-10-01')
و پاسخ ۲۸ است. آرگومان راهانداز به evaltrig میتواند شامل تمامی بندهای معمول راهانداز (مانند OMIT، AT، SKIP و غیره) باشد اما نمیتواند حاوی بندهای نوع یادآور مانند SATISFY، MSG و غیره باشد.
- filedate(s_filename)
- تاریخ تغییر فایل filename را برمیگرداند. اگر filename وجود نداشته باشد، یا تاریخ تغییر آن قبل از سال baseyr() باشد، ۱ ژانویه baseyr() بازگردانده میشود.
- filedatetime(s_filename)
- تاریخ و زمان تغییر فایل filename را برمیگرداند. اگر filename وجود نداشته باشد، یا تاریخ تغییر آن قبل از سال baseyr() باشد، نیمهشب ۱ ژانویه baseyr() بازگردانده میشود.
- filedir()
- دایرکتوری حاوی فایل جاری در حال پردازش را برمیگرداند. این مسیر ممکن است نسبی یا مطلق باشد، اما تضمین میشود که برای استفاده در دستور INCLUDE به شرح زیر صحیح باشد:
INCLUDE [filedir()]/stuff
توجه داشته باشید که اگر فایل یادآورهای در حال پردازش کنونی به صورت یک پیوند نمادین مشخص شده باشد، filedir() دایرکتوری حاوی پیوند نمادین را بازمیگرداند و نه دایرکتوری حاوی هدف پیوند نمادین را. باید از بهکارگیری پیوندهای نمادین به فایلها خودداری کنید مگر آنکه هم پیوند نمادین و هم هدف آن اتفاقاً در یک دایرکتوری قرار داشته باشند.
- filename()
- نام فایل جاری در حال پردازش توسط Remind را (به عنوان یک STRING) برمیگرداند. درون فایلهای گنجاندهشده، نام فایل گنجاندهشده را بازمیگرداند.
- getenv(s_envvar)
- مشابه با فراخوانی سیستمی getenv(2). رشتهای نمایانگر مقدار متغیر محیطی مشخصشده را برمیگرداند. اگر متغیر محیطی تعریف نشده باشد مقدار "" را بازمیگرداند. توجه داشته باشید که نام متغیرهای محیطی معمولاً به بزرگی و کوچکی حروف حساس هستند؛ بنابراین getenv("HOME") با getenv("home") یکسان نیست.
- hebdate(i_day, s_hebmon [,idq_yrstart [,i_jahr [,i_aflag]]])
- پشتیبانی از تاریخهای عبری - بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید.
- hebday(dq_date)
- پشتیبانی از تاریخهای عبری - بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید.
- hebmon(dq_date)
- پشتیبانی از تاریخهای عبری - بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید.
- hebyear(dq_date)
- پشتیبانی از تاریخهای عبری - بخش «تقویم عبری (THE HEBREW CALENDAR)» را ببینید.
- hex(i_n)
- یک STRING برمیگرداند که نمایش هگزادسیمال n است. هیچ پیشوند "0x" وجود ندارد و تمام حروف در مقدار بازگشتی بزرگ هستند.
- hour(tq_time)
- مؤلفه ساعتِ time را برمیگرداند.
- htmlescape(s_str)
- یک نسخه اصلاحشده از str را برمیگرداند که در آن "<" با "<"، ">" با ">" و "&" با "&" جایگزین شده است.
- یک نسخه اصلاحشده از str را برمیگرداند که در آن برچسبهای HTML حذف شدهاند. الگوریتم حذف نسبتاً ساده است؛ این تابع هنگام مواجهه با "<" شروع به حذف نویسهها میکند و هنگام مواجهه با ">" حذف را متوقف میسازد.
- iif(x_test1, x_arg1, [x_test2, x_arg2,...], x_default)
- اگر test1 درست (true) باشد، arg1 را برمیگرداند. در غیر این صورت، اگر test2 درست باشد، arg2 را برمیگرداند و به همین ترتیب. اگر تمامی آرگومانهای test نادرست (false) باشند، default را برمیگرداند. توجه داشته باشید که تنها آرگومانهایی ارزیابی میشوند که برای تعیین نتیجه نهایی مورد نیازند. این تابع تعداد فردی از آرگومانها را میپذیرد - توجه داشته باشید که پیش از نسخه 03.00.05 برنامه Remind، تنها ۳ آرگومان میپذیرفت. نسخه ۳ آرگومانی iif() با نسخههای قبلی Remind سازگار است.
- index(s_search, s_target [,i_start)
- یک INT برمیگرداند که موقعیت target در رشته search است. توجه داشته باشید که index از موقعیتهای بایت استفاده میکند نه موقعیتهای نویسه، بنابراین نباید برای رشتههای غیر اسکی (non-ASCII) استفاده شود. برای رشتههای غیر اسکی از mbindex استفاده کنید.
اولین بایت یک رشته از 1 شمارهگذاری میشود. اگر target در search وجود نداشته باشد، مقدار 0 بازگردانده میشود.
پارامتر اختیاری start موقعیتی در search را مشخص میکند که جستجو برای target باید از آنجا آغاز شود.
- mbindex(s_search, s_target [,i_start])
- مشابه با index() است اما به جای موقعیت بایت، موقعیت نویسه را برمیگرداند. همچنین، start به عنوان نمایه نویسهای بر پایه 1 تفسیر میشود، نه نمایه بایتی.
- isany(arg1 [,arg2, ..., argN]);
- اگر نخستین آرگومان arg1 با هر یک از آرگومانهای بعدی arg2 تا argN برابر باشد، مقدار 1 و در غیر این صورت مقدار 0 را برمیگرداند. همچنین اگر تنها با یک آرگومان فراخوانی شود مقدار 0 بازمیگرداند.
به عنوان مثال، دو عبارت زیر معادل یکدیگرند:
(a == b) || (a == c) || (a == d) || (a == e) isany(a, b, c, d, e)
- isconst(x_any)
- آرگومان خود را ارزیابی کرده و سپس مقدار آن را دور میاندازد؛ در صورتی که عبارت ثابت باشد مقدار 1 و در صورت غیرثابت بودن مقدار 0 را برمیگرداند. توجه داشته باشید که isconst بافتار را در نظر نمیگیرد؛ اگر arg یک عبارت ثابت باشد اما در بافتاری غیرثابت ارزیابی شود، isconst همچنان 1 را برمیگرداند. برای جزئیات در مورد عبارتهای ثابت در برابر غیرثابت، بخش «عبارتهای غیرثابت (NON-CONSTANT EXPRESSIONS)» را ببینید.
- isdst([d_date [,t_time]]) or isdst(q_datetime)
- اگر در تاریخ و زمان مشخصشده ساعت تابستانی در حال اجرا باشد، یک عدد مثبت بازمیگرداند. مقدار پیشفرض date برابر today() و مقدار پیشفرض time برابر نیمهشب است.
توجه داشته باشید که قابلیت اطمینان این تابع تنها به اندازه توابع کتابخانه زمان اجرای C است. این تابع از نسخه 03.00.07 برنامه Remind در دسترس است.
- isleap(idq_arg)
- اگر arg یک سال کبیسه باشد مقدار 1 و در غیر این صورت مقدار 0 را برمیگرداند. Arg میتواند یک شیء INT، DATE یا DATETIME باشد. اگر یک DATE یا DATETIME داده شود، مؤلفه سال در این آزمون به کار میرود.
- isomitted(dq_date)
- اگر با توجه به بافتار سراسری OMIT، تاریخ date نادیدهگرفتهشده (omitted) باشد مقدار 1 و در غیر این صورت مقدار 0 را برمیگرداند. (اگر یک datetime داده شود، تنها بخش تاریخ استفاده میشود.) توجه داشته باشید که هیچیک از بندهای محلی OMIT یا OMITFUNC توسط این تابع در نظر گرفته نمیشوند.
- language()
- یک STRING شامل نام زبان کامپایلشده پشتیبانیشده توسط Remind را برمیگرداند. در گذشته Remind از پشتیبانی کامپایلشده برای سایر زبانها برخوردار بود، اما اکنون تمام بومیسازیها در زمان اجرا انجام میشود. از این رو، این تابع همواره "English" را برمیگرداند. با این حال، عبارت _("LANGID") کد زبان دوحرفی ISO 639 هر بسته زبان فعال را برمیگرداند، به شرطی که نگارنده بسته زبان، بومیسازی را به درستی نوشته باشد!
- localtoutc(q_datetime)
- با دریافت یک شیء DATETIME که در منطقه زمانی محلی تفسیر شده است، یک شیء DATETIME برمیگرداند که همان زمان را در ساعت هماهنگ جهانی (UTC) بیان میکند.
- lower(s_string)
- یک STRING برمیگرداند که در آن تمام بایتهای حروف بزرگ در string به حروف کوچک تبدیل شدهاند. نکته: این تابع تنها برای رشتههای اسکی (ASCII) به درستی کار میکند. اگر از نویسههای یونیکد خارج از مجموعه اسکی استفاده میکنید، به جای آن از mblower استفاده کنید.
- mblower(s_string)
- یک STRING برمیگرداند که در آن تمامی نویسههای حروف بزرگ در string به حروف کوچک تبدیل شدهاند. این تابع روی هر رشته یونیکدی به درستی عمل میکند.
- max(x_arg1 [,x_arg2...)
- میتواند هر تعداد آرگومان بپذیرد و بیشینه آنها را برمیگرداند. آرگومانها میتوانند از هر نوعی باشند، اما همگی باید همنوع باشند. آنها همانند عملگر < مقایسه میشوند.
- min(x_arg1 [,x_arg2...)
- میتواند هر تعداد آرگومان بپذیرد و کمینه آنها را برمیگرداند. آرگومانها میتوانند از هر نوعی باشند، اما همگی باید همنوع باشند. آنها همانند عملگر < مقایسه میشوند.
- minsfromutc([d_date [,t_time]]) or minsfromutc(q_datetime)
- تعداد دقایق از ساعت هماهنگ جهانی (سابقاً GMT) تا زمان محلی را در تاریخ و زمان مشخصشده برمیگرداند. مقدار پیشفرض date برابر today() و مقدار پیشفرض time برابر نیمهشب است. اگر زمان محلی قبل از UTC باشد، نتیجه منفی است. در غیر این صورت، نتیجه مثبت خواهد بود.
توجه داشته باشید که قابلیت اطمینان این تابع تنها به اندازه توابع کتابخانه زمان اجرای C است. این تابع از نسخه 03.00.07 برنامه Remind در دسترس است.
- minute(tq_time)
- مؤلفه دقیقهِ time را برمیگرداند.
- mon(dqis_arg)
- اگر arg از نوع DATE یا DATETIME باشد، رشتهای شامل نام مؤلفه ماه از آن تاریخ را برمیگرداند. اگر arg یک INT از 1 تا 12 باشد، رشتهای شامل نام ماه را برمیگرداند. اگر arg یک STRING باشد، نام ماه را برمیگرداند. این حالت آخر ممکن است عجیب به نظر برسد، اما برای نمونه:
mon("Mar")
مقدار "March"، یعنی نام کامل ماه را بازمیگرداند.
- monnum(dq_date) or monnum(s_str)
- یک INT از 1 تا 12 برمیگرداند که نمایانگر مؤلفه ماه از date است. اگر به جای DATE یا DATETIME یک STRING داده شود، در صورتی که str نام معتبری برای ماه باشد (یا مخفف حداقل ۳ حرفی از نام یک ماه باشد) شماره ماه متناظر بازگردانده میشود. اگر str نام معتبری برای ماه نباشد، خطایی رخ میدهد.
- moondate(i_phase [,d_date [,t_time]]) or moondate(i_phase, q_datetime)
- این تابع تاریخ نخستین وقوع فاز phase ماه را در تاریخ و زمان date و time یا پس از آن برمیگرداند. Phase میتواند از 0 تا 3 باشد، که 0 نشاندهنده ماه نو، 1 تربیع اول، 2 ماه کامل (بدر) و 3 تربیع سوم است. اگر date حذف شود، مقدار پیشفرض today() خواهد بود. اگر time حذف شود، مقدار پیشفرض نیمهشب است.
برای نمونه، دستور زیر تاریخ ماه کامل بعدی را برمیگرداند:
SET fullmoon moondate(2)
- moontime(i_phase [,d_date [,t_time]]) or moontime(i_phase, q_datetime)
- این تابع زمان نخستین وقوع فاز phase ماه را در تاریخ و زمان date و time یا پس از آن برمیگرداند. Phase میتواند از 0 تا 3 باشد، که 0 نشاندهنده ماه نو، 1 تربیع اول، 2 ماه کامل و 3 تربیع سوم است. اگر date حذف شود، مقدار پیشفرض today() خواهد بود. اگر time حذف شود، مقدار پیشفرض نیمهشب است. Moontime() برای استفاده همراه با moondate() در نظر گرفته شده است. توابع moondate() و moontime() با دقت چند دقیقه نسبت به زمانهای موجود در "Old Farmer's Almanac" برای اتاوا در انتاریو مطابقت دارند.
برای نمونه، دستور زیر تاریخ و زمان ماه کامل بعدی را برمیگرداند:
MSG Next full moon at [moontime(2)] on [moondate(2)]
- moondatetime(i_phase [,d_date [,t_time]]) or moondatetime(i_phase, q_datetime)
- این تابع مشابه moondate و moontime است، اما یک نتیجه از نوع DATETIME برمیگرداند.
- moonphase([d_date [,t_time]]) or moonphase(q_datetime)
- این تابع فاز ماه را در date و time برمیگرداند که مقادیر پیشفرض آنها به ترتیب today() و نیمهشب است. مقدار بازگرداندهشده عددی صحیح از 0 تا 359 است که فاز ماه را بر حسب درجه نشان میدهد. مقدار 0 ماه نو، 180 ماه کامل، 90 تربیع اول و غیره است.
- moonrise([d_date])
- این تابع یک نتیجه DATETIME ارائه میدهد که تاریخ و زمان نخستین طلوع ماه در نیمهشب date یا پس از آن را مشخص میکند. اگر date داده نشود، مقدار پیشفرض today() خواهد بود.
توجه داشته باشید که غیرمعمول نیست در یک روز هیچ طلوع ماهی رخ ندهد، بنابراین بخش تاریخ مقدار بازگشتی ممکن است با آرگومان date یکسان نباشد. پس اگر تقویمی از زمانهای طلوع ماه میخواهید، میتوانید از چیزی مانند این استفاده کنید:
SET mr moonrise()
IF datepart(mr) == today()
REM NOQUEUE [mr] MSG Moon rises at %3.
ELSE
REM MSG No moonrise today
ENDIF
- moonrisedir([d_date])
- این تابع یک نتیجه از نوع INT برمیگرداند که جهتی را مشخص میکند که ماه در نخستین طلوع خود در نیمهشب date یا پس از آن، از آنجا طلوع خواهد کرد. اگر date داده نشود، مقدار پیشفرض today() خواهد بود. مقدار بازگشتی در بازه 0 تا 359 است که در آن 0 شمال، 90 شرق، 180 جنوب و 270 غرب میباشد.
- moonset([d_date])
- این تابع مشابه moonrise() است اما مقدار DATETIME غروب ماه بعدی در نیمهشب date یا پس از آن را برمیگرداند.
- moonsetdir([d_date])
- این تابع مشابه moonrisedir() است اما جهت غروب ماه را برمیگرداند.
- multitrig(s_trig1 [,s_trig2, [... s_trigN]])
- تابع multitrig مشابه با evaltrig هر رشته را به عنوان یک محرک ارزیابی میکند، و نزدیکترین تاریخ محرکی را که در تاریخ today() یا پس از آن است، برمیگرداند. multitrig مشابه با trig است اما تفاوتهای زیر را دارد:
تابع trig نخستین تاریخ محرکی را که امروز فعال میشد برمیگرداند، در حالی که multitrig نزدیکترین تاریخ محرک پس از امروز را، صرفنظر از اینکه آیا امروز فعال میشد یا خیر، برمیگرداند.
اگر هیچ محرکی قابل محاسبه نباشد که پس از today() باشد، multitrig مقدار 1990-01-01 را برمیگرداند.
مثالهای زیر را با این فرض که امروز یکشنبه، ۲۴ مارس ۲۰۲۴ است در نظر بگیرید:
# 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")
بهطور کلی، multitrig با الگوریتم Remind بهتر از trig کار میکند و در بیشتر مواقع باید استفاده شود. به عنوان نمونه، این یادآور در پایان هر فصل سال صادر میشود:
REM [multitrig("Mar 31", "Jun 30", "Sep 30", "Dec 31")] +7 MSG %"End of [ord($Tm/3)] quarter%" is %b.
اگر آخرین روز کاری هر فصل را بخواهید، میتوانید از ساختار زیر استفاده کنید:
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
توجه داشته باشید که برخلاف evaltrig، تابع multitrig همیشه یک DATE برمیگرداند و هرگز DATETIME برنمیگرداند. گنجاندن یک بند AT در محرک ارائهشده به multitrig منجر به خطا خواهد شد.
- ndawn([dq_date])
- زمان «سپیدهدم دریانوردی» (nautical dawn) را در date مشخصشده برمیگرداند. اگر date حذف شود، مقدار پیشفرض today() است. اگر یک شیء datetime ارائه شود، تنها بخش تاریخ آن استفاده میشود.
- ndusk([dq_date])
- زمان «غروب دریانوردی» (nautical twilight) را در date مشخصشده برمیگرداند. اگر date حذف شود، مقدار پیشفرض today() است.
- nonomitted(dq_start, dq_end [, i_step] [,s_wkday...])
- این تابع تعداد روزهای حذفنشده (non-omitted) میان start و end را برمیگرداند. اگر start حذفنشده باشد، شمارش میشود. end هرگز شمارش نمیشود.
توجه داشته باشید که اگر end کمتر از start باشد، آرگومانها عملاً جابهجا میشوند، به طوری که شمارش همیشه از تاریخ قدیمیتر آغاز میشود.
اگر آرگومان سوم nonomitted یک INT باشد، باید بزرگتر از صفر باشد و به عنوان گام (step) شمارش nonomitted در نظر گرفته میشود. برای نمونه عبارت زیر:
nonomitted('2023-07-01', '2023-07-29', 7)
تعداد شنبههای حذفنشده از 2023-07-01 تا (اما بدون احتساب) 2023-07-29 را برمیگرداند. (هر دو تاریخ 2023-07-01 و 2023-07-29 شنبه هستند.)
اگر هیچ آرگومان step ارائه نشود، گام ۱ استفاده میشود.
علاوه بر استفاده از زمینه سراسری OMIT، میتوانید آرگومانهای بیشتری ارائه دهید که نام روزهای هفته برای حذف شدن هستند. با این حال، در یک دستور REM، هر بند محلی OMITFUNC توسط این تابع در نظر گرفته نمیشود.
برای نمونه، خط زیر متغیر a را برابر با ۱۱ قرار میدهد (با فرض نبود OMITهای سراسری):
set a nonomitted('2007-08-01', '2007-08-16', "Sat", "Sun")
زیرا پنجشنبه، ۱۶ اوت ۲۰۰۷، یازدهمین روز کاری (بدون احتساب شنبه و یکشنبه) پس از چهارشنبه، ۱ اوت ۲۰۰۷ است.
تابع nonomitted کاربردهای گوناگونی دارد. برای نمونه، بسیاری از مدارس بر پایه یک چرخه ششروزه فعالیت میکنند و شماره روز در روزهای تعطیل افزایش نمییابد. فرض کنید سال تحصیلی با «روز ۱» در ۴ سپتامبر ۲۰۰۷ آغاز شود. یادآور زیر شماره روزها را در یک تقویم برچسبگذاری میکند:
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
بدیهی است نتیجهای که از nonomitted دریافت میکنید به زمینه سراسری OMIT بستگی دارد. اگر از OMITهای متحرک استفاده کنید، ممکن است نتایج ناسازگاری به دست آورید.
در اینجا یک کاربرد پیچیدهتر برای nonomitted آورده شده است. جمعآوری زباله محله من از دو چرخه ۱۴روزه متناوب پیروی میکند: یک جمعه، زباله و بازیافت کاغذ («جعبه سیاه» یا "Black Box") جمعآوری میشوند. جمعه بعدی، زباله و بازیافت پلاستیک («جعبه آبی» یا "Blue Box") جمعآوری میشوند. اگر هر یک از روزهای دوشنبه تا جمعه تعطیل باشد، جمعآوری تا روز شنبه به تعویق میافتد. روشی برای پیادهسازی این قواعد بدین صورت است:
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
نحوه کارکرد آن بدین شرح است: تابع تعریفشده توسط کاربر _garbhol(x) مقدار ۱ را تنها زمانی برمیگرداند که (۱) x جمعه باشد و (۲) دستکم یک روز OMITشده از دوشنبه پیشین تا و با احتساب جمعه وجود داشته باشد.
دستور نخست REM چرخه ۱۴روزه جعبه سیاه را تنظیم میکند. کلمه کلیدی AFTER باعث میشود در صورتی که _garbhol مقدار ۱ را برگرداند، جمعآوری به شنبه منتقل شود. دستور دوم REM چرخه ۱۴روزه جعبه آبی را با تعدیل مشابهی توسط AFTER در هماهنگی با _garbhol تنظیم میکند.
- nonconst(x_arg)
- آرگومان arg را بدون تغییر برمیگرداند، اما عبارت را وادار میکند تا به عنوان غیرثابت (non-constant) تلقی شود. برای جزئیات، بخش "NON-CONSTANT EXPRESSIONS" را ببینید.
- now()
- زمان فعلی سیستم را به صورت نوع TIME برمیگرداند. این مقدار ممکن است زمان واقعی باشد، یا زمانی که در خط فرمان تعیین شده است. توجه داشته باشید که در حالت تقویم (Calendar Mode)، تابع now() همیشه مقدار 00:00 را برمیگرداند.
- ord(i_num)
- رشتهای را برمیگرداند که عدد ترتیبیِ num است. برای نمونه، ord(2) مقدار "2nd" و ord(213) مقدار "213th" را برمیگرداند.
به منظور کمک به بومیسازی، اگر تابعی به نام ordx تعریف کنید که یک پارامتر دریافت میکند، فراخوانی ord(n) تابع ordx(n) را فراخوانی کرده و هر مقداری که آن برگرداند را بازمیگرداند. در طول فراخوانی بازگشتی (callback) به ordx، اجرای RUN غیرفعال خواهد بود.
- orthodoxeaster([dqi_arg])
- اگر arg یک INT باشد، تاریخ یکشنبه عید پاک ارتدکس را برای سال مشخصشده برمیگرداند. اگر arg یک DATE یا DATETIME باشد، تاریخ یکشنبه عید پاک ارتدکس بعدی را در arg یا پس از آن برمیگرداند. (بخش زمان در datetime نادیده گرفته میشود.) اگر arg حذف شود، مقدار پیشفرض today() است.
توجه داشته باشید که orthodoxeaster عید پاک ارتدکس را محاسبه میکند. برای تاریخ عید پاک غربی، easterdate را ببینید.
- ostype()
- مقدار "UNIX" را برمیگرداند. Remind در گذشته روی OS/2 و MS-DOS نیز اجرا میشد، اما دیگر اجرا نمیشود.
- pad(x_arg, s_padstr, i_len [, i_right])
- آرگومان نخست arg را در صورت نیاز به رشته تبدیل میکند، و سپس اگر کوتاهتر از len بایت باشد، با استفاده از تعداد نسخههای لازم (شامل نسخههای جزئی) از padstr، آن را تا len بایت پر (pad) میکند. بهطور پیشفرض، رشته از چپ پر میشود، اما اگر right داده شود و غیرصفر باشد، رشته از راست پر خواهد شد.
چند نمونه در اینجا آمده است:
pad(3, "0", 2) --> "03"
pad(465, "0", 2) --> "465"
pad("foo", " ", 5) --> " foo"
pad("foo", " ", 5, 1) --> "foo "
pad("foo", "bar", 11) --> "barbarbafoo"
- mbpad(x_arg, s_padstr, i_len [, i_right])
- این تابع همتای چندبایتیِ pad است. طول به جای بایت، بر حسب نویسه مشخص میشود. در صورتی که هر یک از رشتهها شامل نویسههای غیر ASCII باشد، به جای pad از mbpad استفاده کنید.
- plural(i_num [,s_str1 [,s_str2]])
- میتواند یک تا سه آرگومان دریافت کند. اگر یک آرگومان داده شود، در صورتی که num برابر با ۱ نباشد "s" و اگر num برابر با ۱ باشد "" برمیگرداند.
اگر دو آرگومان داده شود، در صورتی که num برابر با ۱ نباشد مقدار str1 + "s" را برمیگرداند. در غیر این صورت، str1 را برمیگرداند.
اگر سه آرگومان داده شود، در صورتی که num برابر با ۱ باشد str1 و در غیر این صورت str2 را برمیگرداند.
- psmoon(i_phase [,i_size [,s_note [,i_notesize]]])
- [منسوخشده] یک STRING شامل کد PostScript برای رسم یک ماه در گوشه بالا-چپ کادر تقویم برمیگرداند. Phase فاز ماه را مشخص میکند، و مقادیر آن 0 (ماه نو)، 1 (تربیع اول)، 2 (ماه کامل یا بدر) یا 3 (تربیع سوم) است. اگر size مشخص شود، شعاع ماه را در واحدهای PostScript (یک هفتاد و دوم اینچ) کنترل میکند. اگر مشخص نشود یا منفی باشد، اندازه قلمِ شماره روز استفاده میشود.
REM [moondate(0)] PS [psmoon(0)] REM [moondate(1)] PS [psmoon(1)] REM [moondate(2)] PS [psmoon(2)] REM [moondate(3)] PS [psmoon(3)]
اگر note مشخص شود، از متن آن برای یادداشتگذاری نمایش ماه استفاده میشود. قلم، همان قلم مورد استفاده برای مدخلهای تقویم است. اگر notesize داده شود، اندازه قلم مورد استفاده برای یادداشتگذاری را در واحدهای PostScript (یک هفتاد و دوم اینچ) مشخص میکند. اگر notesize داده نشود، مقدار پیشفرض آن اندازه مورد استفاده برای مدخلهای تقویم است. (اگر روی نمایش یادداشت میگذارید، دقت کنید که روی شماره روز بازنویسی نشود -- Remind این مورد را بررسی نمیکند.) برای نمونه، اگر زمان هر ماه نو را در نمایش تقویم میخواهید، میتوانید از این دستور در اسکریپت یادآور خود استفاده کنید:
REM [moondate(0)] PS [psmoon(0, -1, moontime(0)+"")]
توجه داشته باشید که چگونه زمان با الحاق به رشته تهی، به یک رشته تبدیل شده است.
- psshade(i_gray) or psshade(i_red, i_green, i_blue)
- [منسوخشده] یک STRING شامل دستورات PostScript برای سایهزدن یک کادر تقویم برمیگرداند. Num میتواند از 0 (کاملاً سیاه) تا 100 (کاملاً سفید) باشد. اگر سه آرگومان داده شود، شدت رنگهای قرمز، سبز و آبی را از 0 تا 100 مشخص میکنند. نمونهای از نحوه استفاده در ادامه آمده است:
REM Sat Sun PS [psshade(95)]
دستور فوق کد PostScript را برای ایجاد سایهای ملایم در کادرهای روزهای شنبه و یکشنبه در یک تقویم PostScript تولید میکند.
توجه داشته باشید که psmoon و psshade منسوخ شدهاند؛ به جای آنها باید از یادآورهای SPECIAL SHADE و SPECIAL MOON همانطور که در "Out-of-Band Reminders" توصیف شده است استفاده کنید.
- realcurrent()
- تاریخ و زمان واقعی روز را طبق اطلاعات ارائهشده توسط سیستمعامل (به صورت یک DATETIME) برمیگرداند. این در تضاد با current() است که ممکن است زمانی تعیینشده در خط فرمان را بازگرداند.
- realnow()
- زمان واقعی روز را طبق اطلاعات ارائهشده توسط سیستمعامل برمیگرداند. این در تضاد با now() است که ممکن است زمانی تعیینشده در خط فرمان، یا در حالت تقویم 00:00 را برگرداند.
- realtoday()
- تاریخ را طبق اطلاعات ارائهشده توسط سیستمعامل برمیگرداند. این در تضاد با مفهوم «امروز» در Remind است که ممکن است در صورت اجرا در حالت تقویم، یا در صورت تعیین تاریخ در خط فرمان، تغییر کند.
- rows()
- اگر خروجی استاندارد یا خطای استاندارد یک TTY باشد، ارتفاع ترمینال را بر حسب سطر برمیگرداند. اگر هیچکدام یک TTY نباشند، تلاش میکند برای به دست آوردن اندازه ترمینال "/dev/tty" را باز کند. در صورت ناموفق بودن، مقدار -1 را برمیگرداند.
- sgn(i_num)
- اگر num منفی باشد مقدار -1، اگر مثبت باشد مقدار 1 و اگر صفر باشد مقدار 0 را برمیگرداند.
- shell(s_cmd [,i_maxlen])
- دستور cmd را به عنوان یک دستور سیستمی اجرا میکند، و ۵۱۱ نویسه نخست از خروجی حاصل از cmd را برمیگرداند. هر نویسه فضای خالی در خروجی به یک فاصله (space) تبدیل میشود. توجه داشته باشید که اگر RUN OFF اجرا شده باشد، یا از گزینه خط فرمان -r استفاده شده باشد، shell() منجر به خطا شده و cmd اجرا نخواهد شد.
هنگامی که shell دستور cmd را اجرا میکند، ترتیبی میدهد که توصیفگر فایلِ ورودی استاندارد cmd به /dev/null متصل شود.
اگر maxlen مشخص شود، shell() نخستین maxlen نویسه خروجی را (به جای ۵۱۱ نویسه نخست) برمیگرداند. اگر maxlen به عنوان یک عدد منفی مشخص شود، مقدار پیشفرض آن برابر با متغیر سیستمی $MaxStringLen خواهد بود.
- shellescape(s_str)
- رشته str را در حالی که تمام فرانویسههای شل مانند " "، "*" و غیره با یک بکاسلش اسکیپ شدهاند برمیگرداند. برای نمونه:
SET a shellescape("a b*? c&d$e")
مقدار a را به این صورت تنظیم میکند:
"a\ b\*\?\ c\&d\$e"
- slide(d_start, i_amt [, i_step] [,s_wkday...])
- این تابع معکوس nonomitted است. این تابع amt قطعه (که میتواند منفی باشد) از روزهای step را به start اضافه میکند، بدون احتساب روزهای حذفشده (omitted). اگر step ارائه نشود، مقدار پیشفرض آن ۱ در نظر گرفته میشود. توجه داشته باشید که تنها هر روزِ step-اُم بررسی میشود تا مشخص شود آیا حذف شده است یا خیر. آرگومانهای اختیاری wkday نام روزهای هفته اضافی برای حذف شدن هستند.
این مثال را در نظر بگیرید:
OMIT 14 May 2009
SET a slide('2009-05-13', 5, "Sat", "Sun")
در این حالت، a برابر با 2009-05-21 تنظیم میشود. زیرا ما ۵ روز به جلو لغزش میکنیم، بدون احتساب پنجشنبه، ۱۴ مه یا شنبه و یکشنبه، ۱۶ و ۱۷ مه. شما میتوانید به عقب نیز حرکت کنید، بنابراین:
OMIT 14 May 2009
SET a slide('2009-05-21', -5, "Sat", "Sun")
مقدار a را به 2009-05-13 بازمیگرداند.
اکنون این مثال را بررسی کنید:
OMIT 14 May 2009
SET a slide('2009-05-07', 2, 7)
این دستور a را برابر با '2009-05-28' قرار میدهد زیرا ما دو هفته به جلو میپریم، بدون احتساب هفتهای که روز فرود ما بر حسب اتفاق در آن حذف شده است. این را با مثال زیر مقایسه کنید:
OMIT 13 May 2009
SET a slide('2009-05-07', 2, 7)
که a را برابر با '2009-05-21' تنظیم میکند. با اینکه 2009-05-13 حذف شده است، ما هنگام گام برداشتن به جلو در قطعههای ۷روزه، روی آن «فرود نمیآییم»، بنابراین هرگز متوجه حذف شدن آن نمیشویم.
- soleq(i_which [, dqi_start])
- تابع soleq اعتدالین و انقلابین را محاسبه میکند. پارامتر which در محدوده 0 تا 3 است و مشخص میکند به کدام رویداد علاقهمند هستیم: 0 اعتدال مارس (بهاری)؛ 1 انقلاب ژوئن (تابستانی)؛ 2 اعتدال سپتامبر (پاییزی) و 3 انقلاب دسامبر (زمستانی) است.
پارامتر اختیاری start میتواند یک عدد صحیح برای مشخص کردن سال رویداد مورد نظر، یا یک شیء DATE یا DATETIME باشد؛ اگر حالت دوم باشد، soleq نخستین رویداد در بخش تاریخِ پارامتر start یا پس از آن را برمیگرداند (در صورتی که start یک DATETIME باشد، بخش زمان را نادیده میگیرد.) اگر start ارائه نشود، مقدار پیشفرض today() در نظر گرفته میشود.
مقدار بازگشتی soleq() یک شیء DATETIME است که تاریخ و زمان انقلاب یا اعتدال را در منطقه زمانی محلی مشخص میکند. این مقدار در بدترین حالت باید تا حدود ۳ دقیقه دقیق باشد.
برای مشاهده مثالهایی از نحوه استفاده از soleq()، فایل ضمیمهشده $SysInclude/seasons.rem را ببینید.
- stdout()
- رشتهای را برمیگرداند که نشان میدهد خروجی استاندارد Remind به کجا میرود. مقادیر بازگشتی یکی از موارد زیر است: "TTY" اگر خروجی استاندارد یک ترمینال باشد، "BLOCKDEV" اگر یک دستگاه بلوکی باشد (بسیار بعید)، "CHARDEV" اگر یک دستگاه کاراکتری باشد (مانند /dev/null)، "DIR" اگر یک دایرکتوری باشد (بسیار بعید)، "PIPE" اگر یک لوله یا FIFO باشد، "SYMLINK" اگر یک پیوند نمادین باشد (بسیار بعید)، "SOCKET" اگر یک سوکت باشد، یا "UNKNOWN" اگر قابل تعیین نباشد.
هدف stdout() عمدتاً تمایز قائل شدن میان خروجی TTY و غیر TTY است؛ ممکن است بخواهید در صورتی که خروجی به TTY نمیرود، رنگها را تغییر دهید یا غیرفعال کنید.
- strlen(s_str)
- طول str را بر حسب بایت برمیگرداند. اگر طول str برای نمایش به عنوان یک عدد صحیح بسیار بزرگ باشد، خطای "Number too high" صادر میکند. توجه داشته باشید که strlen تعداد بایتهای موجود در رشته را برمیگرداند، نه تعداد نویسهها را. این ارقام برای رشتههای ASCII یکسان هستند، اما ممکن است برای رشتههای UTF-8 متفاوت باشند.
- mbstrlen(str)
- مشابه با strlen است، اما طول رشته را به جای بایتها بر حسب نویسهها برمیگرداند و بنابراین برای استفاده روی رشتههای چندبایتی ایمن است.
- substr(s_str, i_start [,i_end])
- یک STRING شامل تمام بایتهای موجود در str از start تا و با احتساب end برمیگرداند. شمارهگذاری بایتها از ۱ آغاز میشود. اگر end ارائه نشود، مقدار پیشفرض آن طول str است. از آنجا که substr به جای اندیسهای نویسه از اندیسهای بایت استفاده میکند، نباید روی رشتههای چندبایتی استفاده شود.
- mbsubstr(s_str, i_start [,i_end])
- مشابه با substr است اما به جای اندیسهای بایت از اندیسهای نویسه استفاده میکند، و بنابراین برای استفاده روی رشتههای چندبایتی ایمن است.
- sunrise([dq_date])
- یک شیء TIME نشاندهنده زمان طلوع آفتاب در date مشخصشده (پیشفرض today()) برمیگرداند. در عرضهای جغرافیایی بالا ممکن است در یک روز خاص طلوع آفتابی رخ ندهد؛ در این حالت اگر خورشید هرگز غروب نکند sunrise() مقدار INT صفر، و اگر هرگز طلوع نکند مقدار 1440 را برمیگرداند.
- sunset([dq_date])
- یک شیء TIME نشاندهنده زمان غروب آفتاب در date مشخصشده (پیشفرض today()) برمیگرداند. در عرضهای جغرافیایی بالا ممکن است در یک روز خاص غروب آفتابی رخ ندهد؛ در این حالت اگر خورشید هرگز طلوع نکند sunset() مقدار INT صفر، و اگر هرگز غروب نکند مقدار 1440 را برمیگرداند.
توابع sunrise() و sunset() بر پایه الگوریتمی در "Almanac for Computers for the year 1978" اثر L. E. Doggett از دفتر تقویم نجومی دریانوردی، USNO هستند. این توابع نیازمند تعیین طول و عرض جغرافیایی از طریق تنظیم متغیرهای سیستمی مناسب هستند. (بخش "System Variables" را ببینید.) توابع خورشید باید برای عرضهای جغرافیایی کمتر از ۶۰ درجه تا حدود ۴ دقیقه دقیق باشند. این توابع از نسخه 03.00.07 برنامه Remind در دسترس هستند.
- time(i_hr, i_min)
- یک شیء TIME با مؤلفههای ساعت و دقیقه مشخصشده توسط hr و min ایجاد میکند.
- timepart(tq_datetime)
- یک شیء TIME نشاندهنده بخش زمانِ datetime برمیگرداند.
- timezone([dq_datetime])
- رشتهای نشاندهنده نام منطقه زمانی محلی برای DATETIME دادهشده برمیگرداند. اگر هیچ آرگومانی ارائه نشود، Remind از مقدار current() استفاده میکند. اگر به جای DATETIME یک DATE ارائه شود، Remind از بخش زمان 00:00 استفاده میکند.
- today()
- مفهوم «امروز» در Remind را برمیگرداند. این مقدار ممکن است تاریخ واقعی سیستم باشد، یا تاریخی که در خط فرمان تعیین شده است، یا (در حالت تقویم) تاریخ مدخل تقویمی که هماکنون در حال محاسبه است.
- trig(s_1 [,s_2, ...])
- به ازای هر آرگومان رشتهای s_n، تابع trig مقدار s_n را به گونهای ارزیابی میکند که گویی یک مشخصات محرک REM یا IFTRIG است. اگر محرک امروز فعال میشد، تاریخ محرک برگردانده شده و هیچ محرک دیگری ارزیابی نمیشود. اگر هیچیک از محرکها امروز فعال نمیشدند، تاریخ صفر 1990-01-01 برگردانده میشود.
از trig میتوان برای ساخت نسخههای پیشرفتهتر از IFTRIG استفاده کرد. برای نمونه، اگر در ماههای ژوئن و ژوئیه هر دوشنبه جلساتی دارید و میخواهید ۳ روز پیش از موعد هشدار داده شود، میتوانید از دستور زیر استفاده کنید:
REM [trig("Mon Jun +3", "Mon July +3")] +3 MSG Meeting %b
نکته: ما باید دلتای 3+ را در خارج از تابع trig نیز تکرار کنیم تا هشدار پیش از موعد به درستی کار کند. این به این دلیل است که trig یک ثابت تاریخی (تاریخ محرک) را برمیگرداند و دستور REM از جزئیات آرگومانهای trig اطلاعی ندارد.
توجه داشته باشید که از آنجا که Remind دارای عملگرهای منطقی ارزیابی اتصال کوتاه (short-circuit) است، عبارتی مانند:
SET a trig("Mon +7") || trig("Fri +7")
مقدار ()trig را روی تاریخ دوشنبه آینده تنظیم میکند. زیرا ("trig("Mon +7 همیشه درست (true) برمیگرداند، عملگر OR منطقی به ارزیابی ("trig("Fri +7 نمیپردازد که در نتیجه trig() توسط آن مقداردهی نمیشود.
نکته مهم: از آنجا که trig() همیشه یک تاریخ مطلق را برمیگرداند، با یک بند SATISFY به درستی کار نخواهد کرد. این یادآور را در نظر بگیرید:
REM [trig("Mar", "Apr")] SATISFY [$Td == 15] MSG 15 Mar or April
اگر Remind را در ۵ مارس ۲۰۲۲ اجرا کنیم، ممکن است انتظار داشته باشیم که تاریخ محرک برابر با ۱۵ مارس ۲۰۲۲ محاسبه شود... اما این اتفاق رخ نمیدهد. در عوض، ابتدا تابع trig ارزیابی میشود و مقدار 2022-03-05 را برمیگرداند. بنابراین تا آنجا که به Remind مربوط میشود، عبارت REM به شکل زیر درمیآید:
REM 2022-03-05 SATISFY [$Td == 15] MSG 15 Mar or April
و عبارت SATISFY هرگز درست نخواهد بود. بنابراین: هرگز trig() و SATISFY را با هم ترکیب نکنید.
- trigdate()
- تاریخ محرک محاسبهشده آخرین دستور REM یا IFTRIG را برمیگرداند. اگر در بدنه یک دستور REM استفاده شود، تاریخ محرک آن دستور را برمیگرداند. اگر تازهترین دستور REM منجر به یک تاریخ محرک قابل محاسبه نشود، عدد صحیح 0 را برمیگرداند.
- trigdatetime()
- مشابه با ()trigdate است، اما اگر تازهترین دستور تحریکپذیر REM دارای یک بند AT بوده باشد، یک DATETIME برمیگرداند. اگر بند AT وجود نداشته باشد، یک DATE برمیگرداند. اگر هیچ محرکی قابل محاسبه نباشد، عدد صحیح 0 را برمیگرداند. برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید.
- trigeventstart()
- یک شیء DATETIME نشاندهنده شروع تازهترین دستور تحریکپذیر REM که دارای بند AT بوده است برمیگرداند. برای رویدادهای فاقد DURATION یا رویدادهایی که چندین روز به درازا نمیکشند، همان مقدار trigdatetime() را برمیگرداند. اگر دستور REM دارای بند AT نبوده باشد، عدد صحیح -1 را برمیگرداند (و از این نظر با trigdatetime() تفاوت دارد.) برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید.
- trigeventstarttz()
- مشابه با trigeventstart() است، اما در صورت وجود بند TZ، مقدار DATETIME را در منطقه زمانی مشخصشده توسط آن بند برمیگرداند. اگر بند TZ وجود نداشته باشد، همان مقدار trigeventstart() را برمیگرداند.
- trigeventduration()
- یک شیء TIME نشاندهنده مدتزمان تازهترین دستور تحریکپذیر REM که دارای هر دو بند AT و DURATION بوده است برمیگرداند. اگر رویداد چندین روز به طول نینجامد، همان مقدار trigduration() را برمیگرداند. اگر دستور REM فاقد بند AT یا DURATION باشد، مقدار -1 را برمیگرداند. برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید.
- trigback()
- مقدار «عقبگرد» (back) آخرین دستور REM یا IFTRIG را برمیگرداند. اگر عقبگرد به شکل N- باشد یک عدد صحیح مثبت N، یا اگر به شکل N-- باشد یک عدد صحیح منفی برمیگرداند. اگر هیچ عقبگردی وجود نداشته باشد، مقدار 0 را برمیگرداند.
- trigbase()
- تاریخ «پایه» (base) آخرین دستور REM یا IFTRIG را برمیگرداند. اگر مشخصات محرک شامل هر سه مورد روز، ماه و سال باشد، تاریخ پایه همان تاریخ تشکیلشده از این مؤلفهها است. اگر مشخصات محرک فاقد یکی از این مؤلفهها باشد، مقدار 0 برگردانده میشود.
در اینجا مثالی از نحوه استفاده از trigbase() آمده است:
REM 2025-05-05 *7 UNTIL 2025-05-26 MSG Meeting: week #[(trigdate() - trigbase())/trigrep()+1]
در تاریخ 2025-05-05، متن "Meeting: week #1" چاپ میشود. در تاریخ 2025-05-12، متن "Meeting: week #2" چاپ میشود و به همین ترتیب ادامه مییابد.
- trigdelta()
- مقدار «دلتا» (delta) آخرین دستور REM یا IFTRIG را برمیگرداند. اگر دلتا به شکل N+ باشد یک عدد صحیح مثبت N، یا اگر به شکل N++ باشد یک عدد صحیح منفی برمیگرداند. اگر هیچ دلتایی وجود نداشته باشد، مقدار 0 را برمیگرداند.
- trigtimedelta()
- مشابه با trigdelta() است، اما دلتای استفادهشده در بند AT از یک یادآور زمانبندیشده را برمیگرداند.
- trigrep()
- مقدار «تکرار» (repeat) آخرین دستور REM یا IFTRIG را برمیگرداند. اگر تکرار به شکل N* باشد، یک عدد صحیح مثبت N برمیگرداند. اگر هیچ تکراری وجود نداشته باشد، مقدار 0 را برمیگرداند.
- trigtimerep()
- مشابه با trigrep() است، اما تکرار استفادهشده در بند AT از یک یادآور زمانبندیشده را برمیگرداند.
- trigtz()
- اگر یک بند TZ در آخرین دستور REM یا IFTRIG استفاده شده باشد، نام منطقه زمانی را برمیگرداند. در غیر این صورت رشته خالی را برمیگرداند.
- trigduration()
- پارامتر DURATION یک یادآور زمانبندیشده را (به عنوان نوع TIME) برمیگرداند. اگر پارامتر DURATION وجود نداشته باشد، عدد صحیح -1 را برمیگرداند. برای اطلاعات بیشتر به "MULTI-DAY EVENTS" مراجعه کنید.
- trigpriority()
- اولویت (PRIORITY) آخرین دستور REM یا IFTRIG را برمیگرداند.
- triguntil()
- پارامتر UNTIL آخرین دستور REM یا IFTRIG را (به عنوان نوع DATE) برمیگرداند. اگر پارامتر UNTIL وجود نداشته باشد، عدد صحیح -1 را برمیگرداند. اگر یک پارامتر THROUGH وجود داشته باشد، آن پارامتر توسط triguntil() برگردانده میشود، زیرا "THROUGH yyyy-mm-dd" صرفاً یک نگارش آسانتر برای "*1 UNTIL yyyy-mm-dd" است.
- trigscanfrom()
- پارامتر SCANFROM آخرین دستور REM یا IFTRIG را (به عنوان نوع DATE) برمیگرداند. اگر پارامتر SCANFROM وجود نداشته باشد، عدد صحیح -1 را برمیگرداند. توجه داشته باشید که FROM و SCANFROM بر یکدیگر اثر میگذارند؛ یک یادآور که دارای پارامتر "FROM yyyy-mm-dd" است، به گونهای عمل میکند که گویی یک پارامتر SCANFROM دارد که مقدار آن بیشینه بین "yyyy-mm-dd" و امروز است.
- trigfrom()
- پارامتر FROM آخرین دستور REM یا IFTRIG را (به عنوان نوع DATE) برمیگرداند. اگر پارامتر FROM وجود نداشته باشد، عدد صحیح -1 را برمیگرداند.
- triginfo(s_header)
- یک STRING برمیگرداند که آیتم INFO مرتبط با هدر header است. هدر نباید شامل دونقطه (:) باشد. مقایسه نام هدرها بدون حساسیت به بزرگی و کوچکی حروف انجام میشود.
برای نمونه، دستورات زیر مقدار "At home" را به متغیر a و رشته خالی را به متغیر b اختصاص میدهند:
REM INFO "Location: At home" MSG test
SET a triginfo("location")
SET b triginfo("no_such_header")
- trigistodo()
- اگر آخرین دستور REM از نوع TODO بوده باشد 1، و در غیر این صورت 0 را برمیگرداند.
- trigcompletethrough()
- یک شیء DATE برمیگرداند که تاریخ COMPLETE-THROUGH تازهترین دستور REM است. اگر تاریخ COMPLETE-THROUGH وجود نداشته باشد، مقدار INT صفر را برمیگرداند.
- trigmaxoverdue()
- یک عدد صحیح INT برمیگرداند که مقدار MAX-OVERDUE تازهترین دستور REM است. اگر بند MAX-OVERDUE وجود نداشته باشد، مقدار -1 را برمیگرداند.
- trigger(d_date [,t_time [,i_utcflag]]) or trigger(q_datetime [,i_utcflag])
- رشتهای مناسب برای استفاده در یک دستور REM یا یک بند SCANFROM یا UNTIL برمیگرداند، که به شما امکان میدهد تاریخهای محرک را از قبل محاسبه کنید. توجه داشته باشید که در نسخههای پیشین Remind، استفاده از trigger برای تبدیل تاریخ به قالبی که دستور REM بتواند پردازش کند الزامی بود. با این حال، در این نسخه از Remind میتوانید از آن صرفنظر کنید. معمولاً date و time تاریخ و زمان محلی هستند؛ با این حال اگر utcflag غیرصفر باشد، date و time به عنوان زمانهای UTC تفسیر شده و به زمان محلی تبدیل میشوند. مثالها:
trigger('1993/04/01')
مقدار "1 April 1993" را برمیگرداند،
trigger('1994/08/09', 12:33)
مقدار "9 August 1994 AT 12:33" را برمیگرداند، همانطور که عبارت زیر نیز:
trigger('1994/08/09@12:33').
در نهایت:
trigger('1994/12/01', 03:00, 1)
مقدار "30 November 1994 AT 22:00" را برای EST که ۵ ساعت از UTC عقبتر است برمیگرداند. مقدار مربوط به منطقه زمانی شما ممکن است متفاوت باشد.
تابع trigger() هرگز تاریخی قدیمیتر از "1 January 1990" را برنمیگرداند، حتی اگر فلگ UTC تعیین کند که باید چنین باشد. بنابراین از آن برای یادآورهای قبل از حدود ۲ ژانویه ۱۹۹۰ در منطقه زمانی محلی خود استفاده نکنید. انتظار نمیرود این محدودیت مشکل واقعی ایجاد کند.
- فهرستی از برچسبهای (TAGs) مرتبط با تازهترین دستور محرکشده REM را که با کاما از هم جدا شدهاند برمیگرداند. اگر هیچ برچسبی وجود نداشته باشد، رشته خالی را برمیگرداند. اگر چندین برچسب وجود داشته باشد، هر کدام با یک کاما (نه یک کاما و یک فاصله) از هم جدا میشوند.
- trigtime()
- زمان آخرین دستور REM با بند AT را در منطقه زمانی پیشفرض سیستم برمیگرداند. اگر آخرین دستور REM فاقد بند AT باشد، عدد صحیح 0 را برمیگرداند. اگر یک دستور REM دارای بند AT همراه با DURATION باشد، میتوانید زمان پایان را به صورت trigtime() + trigduration() محاسبه کنید.
- trigtimetz()
- مشابه با trigtime() است، اما در صورت وجود بند TZ، زمان را در منطقه زمانی مشخصشده توسط آن بند برمیگرداند. اگر بند TZ وجود نداشته باشد، همان مقدار trigtime() را برمیگرداند.
- trigvalid()
- اگر مقدار برگرداندهشده توسط trigdate() برای تازهترین دستور REM معتبر باشد 1، و در غیر این صورت 0 را برمیگرداند. گاهی دستورات REM نمیتوانند تاریخ محرکی را محاسبه کنند. برای نمونه، دستور REM زیر هرگز نمیتواند تحریک شود:
REM Mon OMIT Mon SKIP MSG Impossible!
- typeof(x_arg)
- بسته به نوع arg، مقدار "STRING"، "INT"، "DATE"، "TIME" یا "DATETIME" را برمیگرداند.
- tzconvert(q_datetime, s_srczone [,s_dstzone])
- مقدار datetime را از منطقه زمانی نامگذاریشده با srczone به منطقه زمانی نامگذاریشده با dstzone تبدیل میکند. اگر srczone رشته خالی باشد، منطقه زمانی پیشفرض سیستم به عنوان منطقه مبدأ در نظر گرفته میشود. اگر dstzone حذف شود یا رشته خالی باشد، منطقه زمانی پیشفرض سیستم به عنوان منطقه مقصد استفاده میشود. مقدار بازگشتی یک DATETIME است. نامهای مناطق زمانی وابسته به سیستم هستند؛ برای مقادیر مجاز به سیستمعامل خود مراجعه کنید. یک نمونه در ادامه آمده است:
tzconvert('2007-07-08@01:14', "Canada/Eastern", "Canada/Pacific")
returns
2007-07-07@22:14
اگر سیستم شما شامل دایرکتوری /usr/share/zoneinfo باشد، در صورت استفاده از یک نام منطقه زمانی نامعتبر برای srczone یا dstzone، برنامه Remind به شما هشدار خواهد داد. برای چشمپوشی از این هشدارها، یک کاراکتر "!" را به ابتدای نام منطقه زمانی اضافه کنید.
- upper(s_string)
- یک STRING برمیگرداند که تمام بایتهای حروف کوچک در string به حروف بزرگ تبدیل شدهاند. توجه: این تابع تنها برای رشتههای ASCII به درستی کار میکند. اگر از نویسههای یونیکد خارج از مجموعه ASCII استفاده میکنید، به جای آن از mbupper استفاده کنید.
- mbupper(s_string)
- یک STRING برمیگرداند که تمام نویسههای حروف کوچک در string به حروف بزرگ تبدیل شدهاند. این تابع روی هر رشته یونیکد به درستی کار میکند.
- utctolocal(q_datetime)
- با دریافت یک شیء DATETIME که بر مبنای UTC تفسیر شده است، یک شیء DATETIME برمیگرداند که همان زمان را در منطقه زمانی محلی بیان میکند.
- value(s_varname [,x_default])
- مقدار متغیر مشخصشده را برمیگرداند. برای نمونه، value("X"+"Y") در صورت تعریف بودن متغیر XY، مقدار آن را برمیگرداند. اگر متغیر XY تعریف نشده باشد، خطا رخ میدهد.
با این حال، اگر آرگومان دومی ارائه دهید، در صورتی که varname تعریف نشده باشد، همان آرگومان برگردانده میشود. عبارت value("XY", 0) در صورت عدم تعریف XY مقدار 0 و در صورت تعریف بودن مقدار XY را برمیگرداند. توجه داشته باشید که value آرگومان دوم را به صورت تنبل (lazy) ارزیابی میکند؛ یعنی در صورت تعریف بودن varname، آرگومان دوم ارزیابی نمیشود.
- version()
- رشتهای مشخصکننده نسخه Remind برمیگرداند. برای نسخه 06.02.07، مقدار "06.02.07" را برمیگرداند. تضمین میشود که با انتشار نسخههای جدیدتر Remind، مقدار بازگرداندهشده توسط version() مطابق با قواعد ترتیب رشتهها، اکیداً افزایش خواهد یافت.
- weekno([dq_date, [i_wkstart, [i_daystart]]])
- شماره هفته سال را برمیگرداند. اگر هیچ آرگومانی ارائه نشود، شماره هفته ISO 8601 را برای today() برمیگرداند. اگر یک آرگومان date ارائه شود، شماره هفته ISO 8601 را برای آن تاریخ برمیگرداند. اگر دو آرگومان ارائه شود، wkstart باید در محدوده 0 تا 6 باشد و نشاندهنده روز نخست هفته است (که 0 یکشنبه و 6 شنبه است). اگر wkstart ارائه نشود، مقدار پیشفرض آن 1 خواهد بود. اگر آرگومان سوم daystart ارائه شود، مشخص میکند که هفته ۱ از چه زمانی آغاز میشود. اگر daystart کمتر یا مساوی با 7 باشد، هفته ۱ در نخستین wkstart در یا پس از daystart ژانویه آغاز میشود. در غیر این صورت، هفته ۱ در نخستین wkstart در یا پس از daystart دسامبر آغاز میشود. اگر حذف شود، مقدار پیشفرض daystart برابر با 29 خواهد بود (مطابق با تعریف ISO 8601).
- wkday(dqi_arg)
- اگر arg یک DATE یا DATETIME باشد، رشتهای نشاندهنده روز هفتهِ تاریخ را برمیگرداند. اگر arg یک INT از 0 تا 6 باشد، روز هفته متناظر ("Sunday" تا "Saturday") را برمیگرداند.
- wkdaynum(dq_date) or wkdaynum(s_str)
- عددی از 0 تا 6 نشاندهنده روز هفتهِ date مشخصشده برمیگرداند. (0 نشاندهنده یکشنبه و 6 نشاندهنده شنبه است.) اگر یک STRING ارائه شود، در صورتی که str یک نام معتبر برای روز هفته (یا اختصار حداقل ۳حرفی آن) باشد، شماره روز هفته متناظر برگردانده میشود. اگر str نام معتبری برای روز هفته نباشد، خطا رخ میدهد.
- year(dq_date)
- یک INT برمیگرداند که مؤلفه سالِ date است.
دستگاههای دارای نوع TIME_T ۳۲ بیتی (MACHINES WITH A 32-BIT TIME_T TYPE)
در ساختار داخلی، کتابخانه استاندارد C زمانها را بهصورت نوع داده time_t نمایش میدهد. این نوع، یک نوع عدد صحیح علامتدار است که ثانیههای سپریشده از نیمهشب ۱ ژانویه ۱۹۷۰ بر حسب ساعت هماهنگ جهانی (UTC) را شمارش میکند. اگر اندازه نوع time_t تنها ۳۲ بیت باشد، کتابخانه C نمیتواند زمانهای پس از ۱۹ ژانویه ۲۰۳۸ در ساعت ۰۳:۱۴:۰۷ UTC را نشان دهد.
برای دور زدن این محدودیت، Remind سالهای پس از ۲۰۳۷ را به یک سال کوچکتر «تا» (fold) میکند که با همان روز شروع میشود و تعداد روزهای یکسانی دارد. این امر به سالی منجر میشود که به احتمال بسیار قوی قوانین ساعت تابستانی (daylight saving) یکسانی با سال اصلی دارد، مگر اینکه قوانین در این فاصله تغییر کرده باشند (که در این صورت تغییر قانون حتی در یک ماشین ۳۲ بیتی قابل نمایش نبود، بنابراین موضوع منتفی است).
سپس Remind تبدیلهای UTC به محلی یا محلی به UTC را با سال تاخورده انجام میدهد و پس از تبدیل، آن را تصحیح کرده و بازمیگرداند. این کار باید نتایج صحیحی برای توابع نجومی و تبدیلهای بین زمان محلی و زمان UTC ارائه دهد، مشروط بر اینکه قوانین ساعت تابستانی بین سال تاخورده و سال اصلی تغییر نکرده باشد.
توجه داشته باشید که متغیر سیستمی $FoldYear دیگر چندان کاربردی ندارد؛ Remind در سیستمهای ۳۲ بیتی در صورت لزوم همیشه سالها را تا میکند. میتوانید $FoldYear را برابر ۱ قرار دهید تا Remind را وادار کنید سالها را حتی در یک سیستم ۶۴ بیتی تا کند، اما این کار فقط برای آزمایش مفید است و برای استفاده در محیط عملیاتی نیست.
رویدادهای چندروزه (MULTI-DAY EVENTS)
اگر یک زمان شروع با AT و یک مدتزمان با DURATION مشخص کنید، میتوانید رویدادهایی ایجاد کنید که چندین روز به طول میانجامند. این دو دستور REM را در نظر بگیرید:
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
دستور اول یک رویداد تکی ایجاد میکند که در ۱۳ فوریه ۱۹۹۱ ساعت ۱۶:۰۰ شروع میشود و تا ۱۶ فوریه ۱۹۹۱ ساعت ۱۶:۰۰ ادامه مییابد.
دستور دوم چهار رویداد جداگانه ایجاد میکند که در ساعت ۱۶:۰۰ در روزهای ۱۳، ۱۴، ۱۵ و ۱۶ فوریه ۱۹۹۱ شروع میشوند و مدتزمان نامحدودی دارند.
Remind رویدادهای چندروزه را به شیوهای خاص مدیریت میکند. قوانین به این شرح است:
در نخستین روز یک رویداد چندروزه، تابع trigdatetime() تاریخ و زمان شروع رویداد را بازمیگرداند، و trigduration() مقدار DURATION اصلی را برمیگرداند.
در هر روز بعدی از یک رویداد چندروزه، trigdatetime() نیمهشب همان روز را بازمیگرداند، و trigduration() مدتزمان باقیمانده را برمیگرداند. این مثال را در نظر بگیرید:
#!/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
خروجی به این صورت است:
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
همانطور که مشاهده میکنید، توابع trigdatetime() و trigduration() زمان شروع و مدتزمان بخش باقیمانده از یک رویداد چندروزه را بازمیگردانند، در حالی که trigeventstart و trigeventduration همواره شروع و مدتزمان اولیه رویداد چندروزه را بازمیگردانند. همچنین توجه داشته باشید که مقدار بازگشتی برای یادآورهای منقضیشده قابل اعتماد نیست؛ این واقعیت که trigeventstart و trigeventduration در این حالت -1 بازمیگردانند یک اثر پیادهسازی (implementation artifact) است.
رویدادهای دارای همپوشانی با خود (SELF-OVERLAPPING EVENTS)
یک رویداد چندروزه این امکان را دارد که «با خود همپوشانی داشته باشد». هنگامی که این اتفاق رخ میدهد، Remind رویداد بعدی را ترجیح میدهد (برای یک تاریخ معین، تنها یک نسخه از یک رویداد فعال میشود). این مثال را در نظر بگیرید:
#!/bin/sh remind - '*5' 10 Feb 1991 <<'EOF' BANNER % REM MON at 0:00 DURATION 192:0 MSG [today()] [trigeventstart()] [trigduration()]% EOF
خروجی به این صورت است:
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
اگرچه رویداد متعلق به ۱۹۹۱-۰۲-۰۴ در تاریخ ۱۹۹۱-۰۲-۱۱ هنوز ۲۴ ساعت باقیمانده دارد، اما وقوع تازه در ۱۹۹۱-۰۲-۱۱ اولویت دارد و همان است که فعال میشود.
توصیه نمیشود رویدادهای چندروزه دارای همپوشانی با خود ایجاد کنید.
چسباندن عبارت (EXPRESSION PASTING)
یکی از ویژگیهای بسیار قدرتمند Remind قابلیت ماکرو یا «چسباندن عبارت» (expression pasting) است.
تقریباً در هر موقعیتی که Remind انتظار یک عبارت را ندارد، میتوانید یک عبارت را در آن «بچسبانید» (paste کنید). برای انجام این کار، عبارت را در براکتهای مربع محصور کنید. برای مثال:
REM [mydate] MSG foo
این دستور عبارت «mydate» را ارزیابی میکند، که در آن فرض بر این است «mydate» متغیری از پیش محاسبهشده است، و سپس نتیجه را در خط فرمان میچسباند تا تجزیهکننده (parser) آن را پردازش کند.
اگر به هر دلیلی کاراکتر واقعی «[» را میخواهید، کافی است از «[[» استفاده کنید. برای مثال:
REM MSG Here are [[square] brackets!
توصیف رسمی این سازوکار به این صورت است: هنگامی که Remind با یک عبارت «چسباندهشده» مواجه میشود، عبارت را ارزیابی کرده و نتیجه را به یک STRING تبدیل نوع (coerce) میکند. سپس این رشته را جایگزین عبارت چسباندهشده میکند و به تجزیه ادامه میدهد. با این حال توجه داشته باشید که عبارتها فقط یک بار ارزیابی میشوند، نه بهصورت بازگشتی. بنابراین نوشتن:
["[a+b]"]
باعث میشود Remind توکن «[a+b]» را بخواند. این عبارت را بهعنوان یک عبارت چسباندهشده تفسیر نمیکند.
میتوانید تقریباً در هر جایی از چسباندن عبارت استفاده کنید. با این حال، چند استثنا وجود دارد:
- o
- اگر Remind منتظر یک عبارت باشد، مانند دستور SET یا دستور IF، نباید از براکتهای مربع استفاده کنید. برای مثال، از:
SET a 4+5استفاده کنید و نه از:
SET a [4+5]
- o
- نمیتوانید برای توکن اول در یک خط از چسباندن عبارت استفاده کنید. برای مثال، مورد زیر کار نخواهد کرد:
["SET"] a 1
این محدودیت به این دلیل است که Remind باید بتواند توکن اول یک خط را بدون ابهام برای دستورات کنترل جریان (که بعداً بحث خواهد شد) تعیین کند.
در واقع، اگر Remind نتواند توکن اول یک خط را تعیین کند، فرض میکند که آن یک دستور REM است. اگر از چسباندن عبارت استفاده شود، Remind فرض میکند که یک دستور REM است. بدین ترتیب، سه دستور زیر معادل هستند:
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!
- o
- نمیتوانید از چسباندن عبارت برای تعیین نوع (MSG، CAL و غیره) یک دستور REM استفاده کنید. میتوانید عبارتها را قبل و بعد از کلیدواژههای MSG و غیره بچسبانید، اما نمیتوانید کاری مانند این انجام دهید:
REM ["12 Nov 1993 AT 13:05 " + "MSG" + " BOO!"]
با این حال، به عنوان یک راه گریز (escape hatch)، توالی SPECIAL type همان معنای type را دارد که در آن type یکی از موارد MSG، MSF، RUN، CAL، PS و PSFILE است. این به شما امکان میدهد کاری شبیه به این انجام دهید:
SET type "MSG" REM 12 Nov 2024 SPECIAL [type] Hello
میتوانید از این شیوه برای کنترل انواع یادآورهای خود بر اساس متغیرهایی که مقداردهی کردهاید، نحوه فراخوانی Remind و غیره استفاده کنید.
دامهای رایج در چسباندن عبارت (COMMON PITFALLS WITH EXPRESSION PASTING)
به یاد داشته باشید که هنگام چسباندن عبارت، فاصلههای اضافی (فضای خالی) درج نمیشود. بنابراین، چیزی شبیه به:
REM[expr]MSG[expr]
احتمالاً با شکست مواجه خواهد شد.
اگر از یک عبارت برای محاسبه delta یا back استفاده میکنید، اطمینان حاصل کنید که نتیجه یک عدد مثبت باشد. چیزی مانند:
REM +[mydelta] Nov 12 1993 MSG foo
در صورتی که mydelta منفی باشد با شکست مواجه خواهد شد.
دستورات کنترل جریان (FLOW CONTROL COMMANDS)
برنامه Remind دارای دستوراتی است که جریان اجرای یک اسکریپت یادآور را کنترل میکنند. بهطور معمول، اسکریپتهای یادآور به صورت متوالی پردازش میشوند. با این حال، دستور IF و دستورات مرتبط به شما امکان میدهند فایلها را بهصورت شرطی پردازش کنید و از بخشهایی که نمیخواهید تفسیر شوند صرفنظر نمایید.
دستور IF (THE IF COMMAND)
دستور IF ساختار زیر را دارد:
IF expr t-command t-command... ELSE f-command f-command... ENDIF
توجه داشته باشید که دستورات برای وضوح بیشتر با تورفتگی نشان داده شدهاند. همچنین، بخش ELSE میتواند حذف شود. دستورات IF میتوانند تا عمق ۶۴، در تمام سطوح INCLUDE بهصورت تودرتو قرار گیرند.
اگر expr به یک INT غیرصفر، یک DATE که 1990-01-01 نباشد، یک TIME که 00:00 نباشد، یک DATETIME که 1990-01-01@00:00 نباشد، یا یک STRING غیرخالی (non-null) ارزیابی شود، آنگاه بخش IF درست (true) تلقی شده و t-commands اجرا میشوند. اگر expr به صفر یا تهی (null) ارزیابی شود، f-commands (در صورت وجود بخش ELSE) اجرا میگردند.
مثالها:
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
دستور IFTRIG (THE IFTRIG COMMAND)
دستور IFTRIG شبیه به یک دستور IF است، با این تفاوت که یک محرک (trigger) را (مانند دستور REM) محاسبه میکند و در صورتی که دستور REM متناظر با آن فعال شود، مقدار درست (true) را ارزیابی میکند. مثالها:
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
توجه داشته باشید که دستور IFTRIG یک تاریخ محرک را محاسبه میکند که با تابع trigdate() قابل بازیابی است. شما میتوانید از تمامی اجزای عادی محرک، مانند UNTIL، delta و غیره در دستور IFTRIG استفاده کنید. با این حال، نمیتوانید از مشخصکننده نوع مانند CAL، MSG یا SATISFY استفاده کنید؛ اقدام به چنین کاری خطای تجزیه (parse error) به همراه خواهد داشت.
توابع تعریفشده توسط کاربر (USER-DEFINED FUNCTIONS)
علاوه بر توابع داخلی، Remind به شما امکان میدهد توابع دلخواه خود را تعریف کنید. دستور FSET این کار را برای شما انجام میدهد:
FSET fname(args) expr
Fname نام تابع است و از قواعد نامگذاری متغیرها پیروی میکند. Args یک فهرست از آرگومانها با جداکننده کاما است و expr یک عبارت است. expr در زمان تعریف تابع ارزیابی نمیشود؛ در عوض، هر بار که تابع فراخوانی گردد ارزیابی میشود. Args میتواند خالی باشد، که در این حالت تابعی تعریف میکنید که هیچ پارامتری دریافت نمیکند. در اینجا چند مثال آورده شده است:
FSET double(x) 2*x FSET yeardiff(date1, date2) year(date1) - year(date2) FSET since(x) ord($Ty - x)
آخرین تابع در یادآورهای سالگرد تولد کاربرد دارد. برای مثال:
REM 1 Nov +12 MSG Dean's [since(1984)] birthday is %b.
دین (Dean) در سال ۱۹۸۴ متولد شد. مثال بالا در تاریخ ۱ نوامبر ۱۹۹۲ چاپ خواهد کرد:
Dean's 8th birthday is today.
بهطور مشابه، این تابع در یادآورهای سالگرد وقایع مفید است. برای مثال:
REM 4 June MSG [since(1989)] anniversary of the Tienanmen Square massacre
نکات:
- o
- اگر در expr به متغیری دسترسی پیدا کنید که در فهرست آرگومانها نباشد، از مقدار سراسری (global) آن (در صورت وجود) استفاده میشود.
- o
- نام توابع و پارامترها تا ۶۴ کاراکتر معنادار و متمایز هستند.
- o
- تابع value() همیشه به مقدار سراسری یک متغیر دسترسی پیدا میکند، حتی اگر همنام با یکی از آرگومانها باشد. برای مثال:
fset func(x) value("x")
set x 1
set y func(5)
توالی بالا مقدار y را برابر با ۱ قرار میدهد، که مقدار سراسری x است.
- o
- توابع تعریفشده توسط کاربر میتوانند سایر توابع، از جمله سایر توابع تعریفشده توسط کاربر را فراخوانی کنند. فراخوانیهای بازگشتی مجاز هستند، اما باید خاتمه پیدا کنند (به عنوان مثال، با استفاده از یک عملگر یا تابع اتصال کوتاه که بازگشت را قطع میکند) وگرنه پس از حداکثر تعداد مشخصی از فراخوانیهای بازگشتی (بهطور پیشفرض ۱۰۰۰)، خطایی رخ خواهد داد.
- o
- اگر یک تابع تعریفشده توسط کاربر نامی مشابه یک تابع داخلی داشته باشد، نادیده گرفته شده و تابع داخلی استفاده میشود. برای جلوگیری از تداخل با نسخههای آینده Remind (که ممکن است توابع داخلی بیشتری تعریف کنند)، شاید مایل باشید نام تمام توابع تعریفشده توسط کاربر را با زیرخط (_) آغاز کنید.
- o
- اگر یک تابع تعریفشده توسط کاربر در بستری تعریف شود که در آن RUN غیرفعال است، هر زمان که آن تابع فراخوانی گردد، در طول ارزیابی آن RUN غیرفعال خواهد بود، حتی اگر از بستری فراخوانی شود که RUN در آن فعال باشد.
برای حذف یک تابع تعریفشده توسط کاربر، از FUNSET استفاده کنید. این دستور فهرستی از توابع تعریفشده توسط کاربر را با فاصله دریافت و حذف میکند. برای مثال، پس از دستور:
FUNSET myfunc1 otherfunc thirdfunc
تضمین میشود که هیچ تابع تعریفشده توسط کاربری با نامهای myfunc1، otherfunc یا thirdfunc وجود نخواهد داشت. اگر تلاش کنید یک تابع تعریفشده توسط کاربر ناموجود را FUNSET کنید، Remind خطایی صادر نمیکند؛ در این حالت تنها هیچ کاری انجام نمیدهد.
میتوانید یک تابع تعریفشده توسط کاربر را با FRENAME تغییر نام دهید. این دستور دو نام دریافت میکند: نام قدیمی و نام جدید. این دستور را در نظر بگیرید:
FRENAME func_a func_b
اگر func_a وجود نداشته باشد، این دستور در صورت تعریف بودن func_b، تعریف آن را لغو (unset) میکند. با این حال، اگر func_a وجود داشته باشد، به func_b تغییر نام یافته و func_a دیگر تعریفشده نخواهد بود. اگر func_b پیش از دستور FRENAME تعریف شده بود، آن تعریف قدیمی از بین میرود.
اگر هر یک از آرگومانهای دستور FRENAME نام یک تابع داخلی باشد، دستور با یک پیام خطا شکست میخورد و کاری انجام نمیدهد.
اگر یک تابع تعریفشده توسط کاربر را تعریف کرده و سپس بعداً مجدداً آن را بازتعریف کنید، Remind یک هشدار صادر خواهد کرد. اگر این هشدار را نمیخواهید، پیش از بازتعریف تابع از FUNSET برای حذف تعریف موجود استفاده کنید. از طرف دیگر، میتوانید مانند مثال زیر از نشانه «-» پیش از نام تابع برای جلوگیری از هشدارهای «redefined function» استفاده کنید:
FSET - f(x) 2*x # You must have space before and after the "-" # This will NOT work: # FSET -f(x) 2*x
ذخیره و بازیابی توابع (SAVING AND RESTORING FUNCTIONS)
گاهی اوقات مفید است که یک تابع را برای بلوک خاصی از یادآورها بازتعریف کرده، اما تعریف اصلی آن را در پایان آن بلوک بازیابی کنید. همانند متغیرها، توابع نیز میتوانند در یک پشته (stack) داخلی قرار داده شوند (push) یا از آن بیرون کشیده شوند (pop). در اینجا یک مثال آورده شده است:
PUSH-FUNCS msgprefix FSET msgprefix(x) "My new prefix: " INCLUDE block_of_reminders.rem POP-FUNCS
فایل block_of_reminders.rem با تابع msgprefix تعریفشده در بالا اجرا خواهد شد. پس از POP-FUNCS، تابع msgprefix به تعریف قبلی خود (در صورت وجود) بازگردانده میشود، یا اگر از قبل تعریف نشده بود، به سادگی لغو تعریف (unset) میگردد.
دستور PUSH-FUNCS فهرستی از نامهای توابع را با فاصله دریافت میکند. تمام توابع تعریفشده توسط کاربر نامبرده در یک پشته داخلی ذخیره خواهند شد. حتی میتوانید نامهایی را در پشته قرار دهید که به عنوان هیچ تابعی تعریف نشدهاند.
پس از اینکه نام یک تابع در پشته قرار گرفت، اگر آن را بازتعریف کنید Remind هشداری صادر نخواهد کرد، زیرا احتمالاً هدف از قرار دادن آن در پشته از همان ابتدا بازتعریف آن بوده است.
دستور POP-FUNCS تعاریف تمام توابع تعریفشده توسط کاربر در دستور PUSH-FUNCS متناظر را بازیابی میکند. اگر توابع تعریفنشده در پشته قرار گرفته بودند، POP-FUNCS دوباره آن توابع را تعریفنشده میکند. در اینجا یک مثال دیگر آورده شده است:
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
زمانبندی دقیق (PRECISE SCHEDULING)
کلیدواژه WARN امکان کنترل دقیق بر هشدار قبلی را به شیوهای انعطافپذیرتر از سازوکار delta فراهم میکند. این کلیدواژه باید با نام یک تابع تعریفشده توسط کاربر، یعنی warn_function، دنبال شود.
اگر یک warn_function ارائه شود، باید یک آرگومان از نوع INT دریافت کند. Remind هرگونه مقدار delta را نادیده میگیرد و در عوض warn_function را بهطور پیاپی با آرگومانهای ۱، ۲، ۳ و... فراخوانی میکند.
مقدار بازگشتی n از تابع warn_function به شرح زیر تفسیر میشود:
- o
- اگر n مثبت باشد، یادآور دقیقاً n روز قبل از تاریخ محرک خود فعال میشود.
- o
- اگر n منفی باشد، یادآور n روز قبل از تاریخ محرک خود فعال میشود، بدون احتساب روزهای OMIT (صرفنظرشده).
به عنوان مثال، فرض کنید میخواهید ۵، ۳ و ۱ روز زودتر از روز استقلال آمریکا مطلع شوید. میتوانید از این دستور استفاده کنید:
FSET _wfun(x) choose(x, 5, 3, 1, 0) REM 4 July WARN _wfun MSG American Independence Day is %b.
نکات (NOTES)
- 1
- اگر در حین ارزیابی warn_function خطایی رخ دهد، آنگاه Remind فراخوانی آن را متوقف کرده و یادآور را صرفاً در تاریخ محرک آن صادر میکند.
- 2
- اگر قدر مطلق مقادیر بازگشتی warn_function بهصورت یکنواخت نزولی (monotonically decreasing) نباشد، Remind فراخوانی آن را متوقف کرده و یادآور را در تاریخ محرک آن صادر میکند.
- 3
- تابع warn_function (از نظر اصول نگارش خوب) باید ۰ را به عنوان مقدار نهایی در دنباله مقادیر بازگشتی خود برگرداند. با این حال، یک یادآور همیشه در تاریخ محرک خود فعال خواهد شد، صرفنظر از اینکه warn_function چه مقداری برگرداند.
مشابه با WARN، کلیدواژه SCHED امکان کنترل دقیق بر زمانبندی یادآورهای زماندار را فراهم میکند. این کلیدواژه باید با نام یک تابع تعریفشده توسط کاربر، sched_function دنبال شود. توجه داشته باشید که اگر از SCHED استفاده کنید، هرگونه مقدار tdelta و trep نادیده گرفته میشوند.
اگر یک تابع زمانبندی ارائه شود، باید یک آرگومان از نوع INT دریافت کند. Remind به جای استفاده از زمان AT، delta زمانی و repeat زمانی، تابع زمانبندی را فراخوانی میکند تا مشخص کند چه زمانی یادآور باید فعال شود. اولین باری که یادآور در صف قرار میگیرد، تابع زمانبندی با آرگومان ۱ فراخوانی میشود. هر بار که یادآور فعال میشود، با فراخوانی مجدد تابع زمانبندی دوباره زمانبندی میگردد. در هر فراخوانی، آرگومان یک واحد افزایش مییابد.
مقدار بازگشتی تابع زمانبندی باید یک INT یا یک TIME باشد. اگر مقدار بازگشتی یک TIME باشد، یادآور دوباره در صف قرار میگیرد تا در آن زمان فعال شود. اگر یک عدد صحیح مثبت n باشد، یادآور دوباره در صف قرار میگیرد تا در زمان فعالسازی قبلی بهعلاوه n دقیقه فعال شود. در نهایت، اگر یک عدد صحیح منفی یا صفر باشد، آنگاه یادآور دوباره در صف قرار میگیرد تا n دقیقه پیش از زمان AT فعال شود. توجه داشته باشید که برای انجام هر کاری توسط بند SCHED، حتماً باید یک بند AT وجود داشته باشد.
در اینجا یک مثال آورده شده است:
FSET _sfun(x) choose(x, -60, 30, 15, 10, 3, 1, 1, 1, 1, 0) REM AT 13:00 SCHED _sfun MSG foo
یادآور ابتدا در ۶۰-۱۳:۰۰ دقیقه، یا در ۱۲:۰۰ فعال خواهد شد. بعد از آن ۳۰ دقیقه بعد، در ۱۲:۳۰ فعال میشود. سپس در ۱۲:۴۵، ۱۲:۵۵، ۱۲:۵۸، ۱۲:۵۹، ۱۳:۰۰، ۱۳:۰۱ و ۱۳:۰۲ فعال خواهد شد.
نکات (NOTES)
- 1
- اگر در حین ارزیابی sched_func خطایی رخ دهد، آنگاه Remind به استفاده از زمان AT و مقادیر delta و repeat بازمیگردد و هرگز دوباره sched_func را فراخوانی نمیکند.
- 2
- اگر پردازش sched_func زمانی زودتر از زمان فعلی سیستم تولید کند، با افزایش آرگومان بهطور مکرر فراخوانی میشود تا زمانی مقداری بزرگتر یا مساوی با زمان فعلی تولید کند. با این حال، اگر دنباله مقادیر محاسبهشده در طول تکرار اکیداً صعودی نباشد، Remind به رفتار پیشفرض بازمیگردد و هرگز مجدداً sched_func را فراخوانی نمیکند.
- 3
- با استفاده از sched_func کاملاً ممکن است یادآور حتی پس از زمان AT همچنان فعال شود. همچنین کاملاً ممکن است هنگام استفاده از تابع زمانبندی، یادآور در زمان AT فعال نشود. با این حال، اگر تابع زمانبندی شما (به دلایل ۱ و ۲) قبل از زمان AT یادآور خاتمه یابد، در زمان AT فعال خواهد شد، زیرا پردازش عادی کنترل را به دست میگیرد.
- 4
- توابع زمانبندی شما (از نظر اصول نگارش خوب) وقتی دیگر نیازی به زمانبندی نیست باید ۰ را برگردانند. مثال را ببینید.
- 5
- تمام توابع زمانبندی پس از خوانده شدن کل اسکریپت Remind ارزیابی میشوند. بنابراین هر تعریف تابعی که در پایان اسکریپت برقرار باشد، استفاده خواهد شد.
بند SATISFY (THE SATISFY CLAUSE)
شکل دستور REM که از SATISFY استفاده میکند به صورت زیر است:
REM trigger SATISFY expr
نحوه کارکرد آن به این صورت است: ابتدا Remind تاریخ محرک را به روش عادی محاسبه میکند. سپس، trigdate() را روی تاریخ محرک محاسبهشده تنظیم مینماید. پس از آن، expr را ارزیابی میکند. اگر نتیجه، رشته تهی یا صفر نباشد، پردازش پایان مییابد. در غیر این صورت، Remind تاریخ محرک بعدی را محاسبه کرده و مجدداً expr را آزمایش میکند. این تکرار تا زمانی ادامه مییابد که expr به مقداری غیرصفر یا غیرخالی ارزیابی شود، یا اینکه سقف تکرار تعیینشده با گزینه خط فرمان -x فرا برسد.
اگر expr ارضا نشود، مقدار trigvalid() برابر ۰ قرار گرفته و پیام خطای «Can't compute trigger» صادر میشود. در غیر این صورت، trigvalid() برابر ۱ قرار میگیرد.
این قابلیت تنها زمانی واقعاً مفید است که expr شامل فراخوانی تابع trigdate() یا توابع و متغیرهای سیستمی مرتبط باشد؛ در غیر این صورت، با تکرارهای Remind مقدار expr تغییری نخواهد کرد. در واقع، اگر expr یک مقدار ثابت نباشد و trigdate() یا توابع و متغیرهای سیستمی مرتبط را فراخوانی نکند، Remind هشداری صادر خواهد کرد.
نمونهای از کاربرد SATISFY: فرض کنید میخواهید از هر جمعه سیزدهم (Friday the 13th) مطلع شوید. اولین تلاش شما ممکن است به این صورت باشد:
# WRONG! REM Fri 13 +2 MSG Friday the 13th is %b.
اما این دستور کار نخواهد کرد. این یادآور در نخستین جمعه در تاریخ سیزدهم یا پس از سیزدهم هر ماه فعال میشود. راه صحیح انجام آن با استفاده از یک توالی پیچیدهتر است:
REM 13 SATISFY wkdaynum(trigdate()) == 5 IF trigvalid() REM [trigdate()] +2 MSG \ Friday the 13th is %b. ENDIF
میتوانید دستور REM را کمی فشردهتر بنویسید:
REM 13 SATISFY $Tw == 5
بیایید ببینیم این دستور چگونه کار میکند. بند SATISFY در میان تمام سیزدهمهای ماههای متوالی تکرار میشود، تا زمانی که تاریخ محرکی پیدا شود که روز هفته آن جمعه باشد (== 5). اگر تاریخ معتبری یافت شد، از تاریخ محرک محاسبهشده برای تنظیم یادآور بعدی استفاده میکنیم.
همچنین میتوانستیم بنویسیم:
REM Fri SATISFY day(trigdate()) == 13
اما این امر منجر به تکرارهای بیشتری میشود، چرا که «جمعهها» بیشتر از «سیزدهمهای ماه» رخ میدهند.
در اینجا مثال دیگری آورده شده است: فرض کنید میخواهید در پانزدهم ژانویه، آوریل، ژوئیه و اکتبر موضوعی به شما یادآوری شود. میتوانید چهار یادآور جداگانه بسازید، یا میتوانید از این دستور استفاده کنید:
REM 15 SATISFY [isany($Tm, 1, 4, 7, 10)] MSG 15th Reminder!
این تکنیک استفاده از یک دستور REM برای محاسبه تاریخ محرک جهت استفاده در دستوری دیگر بسیار قدرتمند است. برای مثال، فرض کنید میخواهید روز کارگر (Labour Day) را که نخستین دوشنبه ماه سپتامبر است OMIT کنید. میتوانید از دستورات زیر استفاده کنید:
# Note: SATISFY 1 is an idiom for "do nothing" REM Mon 1 Sept SATISFY 1 OMIT [trigdate()]
هشدار (CAVEAT): این کار تنها روز کارگر بعدی را حذف میکند، نه تمام روزهای کارگر در آینده را. این امر میتواند نتایج عجیبی ایجاد کند، زیرا زمینه OMIT میتواند بسته به تاریخ جاری تغییر کند. برای مثال، اگر پس از دستورات بالا از دستور زیر استفاده کنید:
REM Mon AFTER msg hello
نتیجه آنگونه که انتظار دارید نخواهد بود. تولید تقویم برای سپتامبر ۱۹۹۲ را در نظر بگیرید. روز کارگر در دوشنبه، ۷ سپتامبر ۱۹۹۲ بود. با این حال، هنگامی که Remind به محاسبه محرک برای سهشنبه، ۸ سپتامبر ۱۹۹۲ میرسد، دستور OMIT اکنون روز کارگر را برای سال ۱۹۹۳ نادیده میگیرد و دستور «Mon AFTER» فعال نخواهد شد. (اما توضیحات SCANFROM را در بخش «جزئیات درباره محاسبه محرک (DETAILS ABOUT TRIGGER COMPUTATION)» ببینید).
احتمالاً بهتر است از محاسبه تاریخهای محرک OMIT دوری کنید مگر اینکه این دامها را به خاطر داشته باشید.
در نسخههای Remind از 03.00.07 به بعد، میتوانید یک بند MSG، RUN و غیره را در بند SATISFY به صورت زیر بگنجانید:
REM trigger_stuff SATISFY [expr] MSG body
توجه داشته باشید که تنها برای این حالت، expr پس از SATISFY باید در براکتهای مربع قرار گیرد. این عبارت باید پس از تمام اجزای دیگر محرک، و بلافاصله قبل از کلیدواژه MSG، RUN و غیره بیاید. اگر expr ارضا نشود، یادآور فعال نمیشود.
بدین ترتیب، مثال «جمعه سیزدهم» را میتوان بهطور فشردهتر به صورت زیر بیان کرد:
REM 13 +2 SATISFY [$Tw == 5] MSG Friday the 13th is %b.
و میتوانید یادآوری را در روزهای دوشنبه، چهارشنبه و پنجشنبه که در روزهای فرد ماه واقع میشوند با دستور زیر فعال کنید:
REM Mon Wed Thu SATISFY [$Td %2 ] MSG Here it is!!!
توجه داشته باشید که اغلب میتوان از SATISFY و OMITFUNC برای حل یک مسئله یکسان، هرچند به روشهای متفاوت، استفاده کرد. گاهی اوقات استفاده از SATISFY تمیزتر است و گاهی OMITFUNC؛ آزمایش کنید و از هر کدام که واضحتر به نظر میرسد استفاده نمایید.
محرکهای احتمالا غیرقابل محاسبه (POSSIBLY-UNCOMPUTABLE TRIGGERS)
گاهی اوقات ممکن است بخواهید هشدارهای «Can't compute trigger» را برای یادآورهایی که تاریخ محرک آنها قابل محاسبه نیست، متوقف کنید. برای مثال، یادآور زیر در روز دوشنبهای که تعطیل رسمی نیست فعال میشود، مشروط بر اینکه سهشنبه بعدی یک روز تعطیل باشد:
REM Mon SKIP SATISFY [isomitted($T+1)] MSG Work between holidays
با این حال، اگر بعد از تاریخ امروز هیچ دوشنبهای وجود نداشته باشد که این شرط را برآورده کند، Remind خطای «Can't compute trigger» را چاپ خواهد کرد. برای سرکوب این خطا، از کلیدواژه MAYBE-UNCOMPUTABLE استفاده کنید:
REM MAYBE-UNCOMPUTABLE Mon SKIP SATISFY [isomitted($T+1)] MSG Work between holidays
تقریباً هیچگاه استفاده از MAYBE-UNCOMPUTABLE مناسب نیست، اما برای آن موقعیتهای نادری که کاربرد دارد ارائه شده است. اگر از MAYBE-UNCOMPUTABLE در داخل تابع evaltrig() استفاده کنید، محرکهای غیرقابل فعالسازی مقدار -1 برمیگردانند. برای مثال:
SET a evaltrig("MAYBE-UNCOMPUTABLE Mon SKIP OMIT Mon")
مقدار a را برابر -1 قرار میدهد.
اشکالزدایی اسکریپتهای یادآوری (DEBUGGING REMINDER SCRIPTS)
اگرچه گزینه خط فرمان -d برای اشکالزدایی مفید است، اما اغلب زیادهروی به شمار میرود. به عنوان مثال، اگر گزینه -dx را برای یک فایل یادآوری با عبارتهای پیچیده متعدد فعال کنید، حجم بسیار زیادی از خروجی دریافت خواهید کرد. دستور DEBUG به شما امکان میدهد نشانگرهای اشکالزدایی را تحت کنترل برنامه مدیریت کنید. قالب آن به این صورت است:
DEBUG [+flagson] [-flagsoff]
مقدارهای flagson و flagsoff شامل رشتههایی از نویسههای «shextvlfqnu» هستند که با گزینههای اشکالزدایی مورد بحث در بخش گزینههای خط فرمان مطابقت دارند. اگر پیش از آنها یک «+» بیاید، گروه متناظر از گزینههای اشکالزدایی روشن میشوند. در غیر این صورت، خاموش میشوند. به عنوان مثال، میتوانید از این توالی برای اشکالزدایی یک عبارت پیچیده استفاده کنید:
DEBUG +x set a very_complex_expression(many_args) DEBUG -x
دستور DUMPVARS (THE DUMPVARS COMMAND)
دستور DUMPVARS مقادیر متغیرهای موجود در حافظه را نمایش میدهد. قالب آن به این صورت است:
DUMPVARS [-c] [var...]
اگر فهرستی از نامهای متغیرها را که با فاصله جدا شدهاند ارائه دهید، متغیرهای متناظر نمایش داده میشوند. اگر فهرستی از متغیرها ارائه ندهید، تمام متغیرهای موجود در حافظه نمایش داده میشوند. برای تخلیه (dump) یک متغیر سیستمی، نام آن را در فهرست متغیرها قرار دهید. اگر فقط یک علامت دلار تنها را در فهرست متغیرها بگذارید، تمام متغیرهای سیستمی تخلیه خواهند شد.
اگر پرچم -c را مشخص کنید، پس از مقدار هر متغیری که ثابت (constant) تشخیص داده شود، عبارت «<const>» درج خواهد شد.
دستور ERRMSG (THE ERRMSG COMMAND)
دستور ERRMSG دارای قالب زیر است:
ERRMSG body
مقدار body از فیلتر جایگزینی (با تاریخ راهانداز ضمنی today()) عبور داده شده و در جریان خروجی خطای استاندارد چاپ میشود. مثال:
IF !defined("critical_var")
ERRMSG You must supply a value for "critical_var"
EXIT
ENDIF
دستور EXIT (THE EXIT COMMAND)
مثال بالا همچنین نحوه استفاده از دستور EXIT را نشان میدهد. این دستور موجب خروج بدون قید و شرط از پردازش اسکریپت میشود. تمامی یادآوریهای زمانبندیشده موجود در صف دور انداخته میشوند. اگر در حالت تقویم (که در ادامه توضیح داده شده) باشید، پردازش تقویم متوقف میگردد.
اگر یک عبارت از نوع INT بعد از دستور EXIT ارائه دهید، آن مقدار به عنوان وضعیت خروج به برنامه فراخواننده بازگردانده میشود. در غیر این صورت، وضعیت خروج ۹۹ بازگردانده خواهد شد.
دستور FLUSH (THE FLUSH COMMAND)
این دستور به سادگی شامل کلمه FLUSH در یک خط به تنهایی است. این دستور جریانهای خروجی استاندارد و خطای استاندارد مورد استفاده توسط Remind را تخلیه (flush) میکند. این قابلیت برای اکثر افراد کاربرد چندانی ندارد، اما اگر Remind را به عنوان یک زیرپردازش از برنامهای دیگر اجرا کنید و بخواهید از لولهها (pipes) برای ارتباط استفاده نمایید، میتواند مفید باشد.
خروجی JSON حالت آگندا (AGENDA MODE JSON OUTPUT)
اگر آرگومان --json را مشخص کنید، Remind به جای خروجی متنی عادی، خروجی JSON تولید میکند. خروجی JSON شامل یک آرایه JSON منفرد از صفر یا چند شیء است. سه نوع شیء ممکن در این آرایه وجود دارد:
- شیء banner در صورت وجود، اولین شیء در آرایه خواهد بود. حداکثر یک شیء banner وجود خواهد داشت. این شیء حاوی یک کلید واحد به نام banner است که مقدار آن بنری است که Remind بهطور معمول در حالت آگندا چاپ میکند.
- noreminders
- شیء noreminders در صورت وجود، آخرین شیء در آرایه خواهد بود. حداکثر یک شیء noreminders وجود خواهد داشت. این شیء حاوی یک کلید واحد به نام noreminders است که مقدار آن عبارت «No reminders.» است (که ممکن است به زبان دیگری بومیسازی شده باشد).
- event
- سایر اشیاء موجود در آرایه از نوع اشیاء event هستند. آنها اشیاء JSON هستند که شامل تمامی کلیدهای توصیفشده در بخش «CALENDAR ENTRIES» از صفحه راهنمای rem2ps(1) میباشند. با این حال، کلیدهای calendar_body، plain_body و raw_body وجود نخواهند داشت.
خروجی JSON میتواند توسط یک رابط کاربری برای نمایش یک فهرست جذاب از یادآوریها در حالت آگندا استفاده شود. ویژگی «show today's reminders» در tkremind از این خروجی JSON استفاده میکند.
حالت تقویم (CALENDAR MODE)
اگر گزینه خط فرمان -c، -s یا -p را مشخص کنید، Remind در «حالت تقویم» اجرا میشود. در این حالت، Remind اسکریپت را به صورت مکرر تفسیر میکند و برای هر روز در تقویم، یک دور پیمایش کامل روی کل فایل انجام میدهد. یادآوریهایی که فعال (راهاندازی) میشوند در بافرهای داخلی ذخیره شده و سپس در مکانهای مناسب در تقویم درج میگردند.
اگر گزینه -a را نیز تعیین کنید، Remind یادآوریهای زمانبندیشده را در تقویم لحاظ نخواهد کرد.
گزینه -p به همراه برنامه Rem2PS برای تولید یک تقویم در قالب PostScript استفاده میشود. به عنوان مثال، دستور زیر کد PostScript را به خروجی استاندارد ارسال میکند:
remind -p .reminders | rem2ps
میتوانید با هدایت (pipe) این خروجی به دستور lpr، یک تقویم PostScript را چاپ کنید.
اگر یک اسکریپت یادآوری به نام «.reminders» داشته باشید و این دستور را اجرا کنید:
remind -c .reminders jan 1993
آنگاه Remind اسکریپت را ۳۱ بار اجرا میکند؛ یک بار برای هر روز در ماه ژانویه. هر بار که اسکریپت را اجرا میکند، مقدار today() را یکی افزایش میدهد. هر یادآوری که تاریخ راهانداز آن با today() مطابقت داشته باشد، وارد تقویم میشود.
یادآوریهای نوع MSG و CAL، بهطور پیشفرض کل بدنه آنها در تقویم درج میشود. یادآوریهای نوع RUN بهطور معمول در تقویم درج نمیشوند. با این حال، اگر بخشی از بدنه را در توالی %"...%" محصور کنید، فقط همان بخش درج میشود. به عنوان مثال، مورد زیر را در نظر بگیرید:
REM 6 Jan MSG %"Dianne's birthday%" is %b
در حالت آگندا، Remind در روز ۶ ژانویه عبارت «Dianne's birthday is today» را چاپ میکند. با این حال، در حالت تقویم، تنها متن «Dianne's birthday» در خانه مربوط به ۶ ژانویه درج میشود.
اگر صریحاً از توالی %"...%" در یک یادآوری نوع RUN استفاده کنید، متن بین جداکنندهها در تقویم درج میشود. اگر از توالی %"%" در یک یادآوری نوع MSG یا CAL استفاده کنید، هیچ ورودی تقویمی برای آن یادآوری تولید نخواهد شد.
حفظ متغیرها (PRESERVING VARIABLES)
از آنجا که Remind برای هر روز در تقویم اسکریپت را تکرار میکند، عملیات کند ممکن است سرعت تولید تقویم را به شدت کاهش دهد.
به عنوان مثال، فرض کنید متغیرهای «me» و «hostname» را به این صورت مقداردهی کردهاید:
SET me shell("whoami")
SET hostname shell("hostname")
بهطور معمول، Remind تمام متغیرها را بین تکرارها در حالت تقویم و همچنین در صورت ارائه پارامتر '*N' در خط فرمان پاک میکند. با این حال، اگر محاسبه برخی متغیرها زمانبر است و بین تکرارها تغییر نمیکنند، میتوانید مقادیر آنها را با دستور PRESERVE «حفظ» کنید. همچنین از آنجا که تعاریف توابع بین تکرارها حفظ میشوند، نیازی به تعریف مجدد آنها در هر تکرار نیست. بنابراین، میتوانید از توالی زیر استفاده کنید:
IF ! defined("initialized")
set initialized 1
set me shell("whoami")
set hostname shell("hostname")
fset func(x) complex_expr
preserve initialized me hostname
ENDIF
نحوه عملکرد به این صورت است: در اولین دور اجرای اسکریپت، متغیر «initialized» تعریف نشده است. بنابراین، دستورات بین IF و ENDIF اجرا میشوند. دستور PRESERVE تضمین میکند که مقادیر initialized، me و hostname برای تکرارهای بعدی حفظ شوند. در تکرار بعدی، دستورات نادیده گرفته میشوند، زیرا initialized همچنان تعریفشده باقی مانده است. بدین ترتیب، عملیات زمانبری که به مقدار today() وابسته نیستند، فقط یک بار انجام میشوند.
بیشتر متغیرهای سیستمی (آنهایی که نامشان با '$' شروع میشود) بهطور خودکار بین تکرارهای تقویم حفظ میشوند.
توجه داشته باشید که برای افزایش کارایی، Remind هنگام تولید تقویم، اسکریپت یادآوری (و هر فایل INCLUDEشده) را در حافظه موقت (کش) نگه میدارد.
یادآوریهای زمانبندیشده مرتب شده و به ترتیب زمانی در تقویم قرار میگیرند. پس از آنها، یادآوریهای بدون زمان قرار میگیرند. Remind بهطور خودکار زمان یادآوریهای زمانبندیشده را مطابق با گزینه خط فرمان -b در تقویم قرار میدهد. یادآوریها در حالت تقویم به گونهای مرتب میشوند که گویی از گزینه -g استفاده شده است؛ شما میتوانید با استفاده صریح از گزینه -g ترتیب مرتبسازی متفاوتی را نسبت به حالت پیشفرض تعیین کنید.
اجرای مکرر (REPEATED EXECUTION)
اگر یک پارامتر repeat در خط فرمان مشخص کنید و از گزینههای -c، -p یا -s استفاده نکنید، Remind به شیوهای مشابه حالت تقویم عمل میکند. این برنامه اسکریپت یادآوری را مکرراً اجرا میکند و با هر تکرار مقدار today() را افزایش میدهد. همان قوانین مربوط به حفظ متغیرها و تعاریف توابع در اینجا نیز اعمال میشوند. توجه داشته باشید که استفاده از repeat در خط فرمان همچنین گزینه -q را فعال و هرگونه گزینه -z را غیرفعال میکند. به عنوان مثال، اگر میخواهید ببینید Remind در هفته آینده چگونه رفتار خواهد کرد، میتوانید تایپ کنید:
remind .reminders '*7'
اگر میخواهید تاریخهای ۱۰۰۰ روز آینده را چاپ کنید، از دستور زیر استفاده نمایید:
(echo 'banner %'; echo 'msg [today()]%') | remind - '*1000'
مقداردهی اولیه متغیرها در خط فرمان (INITIALIZING VARIABLES ON THE COMMAND LINE)
گزینه -i برای مقداردهی اولیه متغیرها در خط فرمان Remind استفاده میشود. قالب آن به صورت -ivar=expr است، که در آن expr هر عبارت معتبری میباشد. توجه داشته باشید که ممکن است لازم باشد از نقلقول یا نویسههای گریز (escapes) استفاده کنید تا از تفسیر نویسههای خاص در expr توسط پوسته جلوگیری شود. شما میتوانید به هر تعداد که میخواهید از گزینه -i در خط فرمان استفاده کنید و آنها به ترتیب پردازش میشوند. بنابراین، اگر متغیری در یک گزینه -i تعریف شود، در گزینههای بعدی -i قابل ارجاع خواهد بود.
توجه داشته باشید که اگر تاریخی را در خط فرمان وارد کنید، تا زمانی که تمام گزینهها پردازش نشوند، تجزیه نخواهد شد. بنابراین، اگر از today() در هر یک از عبارتهای -i استفاده کنید، همان مقدار realtoday() را بازمیگرداند و نه تاریخی که در خط فرمان وارد شده است.
هر متغیری که در خط فرمان تعریف شود، همانند دستور PRESERVE «حفظ» (preserved) میشود.
نباید هیچ فاصلهای بین گزینه -i و علامت مساوی وجود داشته باشد؛ در غیر این صورت، نامهای متغیر عجیبی ایجاد میشوند که فقط با توابع value() یا defined() قابل دسترسی خواهند بود.
شما همچنین میتوانید با استفاده از ساختار زیر، یک تابع را در خط فرمان تعریف کنید:
-ifunc(args)=definition
حتماً از نویسههای خاص در برابر تفسیر پوسته محافظت کنید.
اطلاعات بیشتر درباره پستاسکریپت (MORE ABOUT POSTSCRIPT)
یادآوریهای نوع PS و PSFILE کد PostScript را مستقیماً به چاپگر ارسال میکنند. تفاوت آنها در این است که یادآوری نوع PS بدنه خود را مستقیماً به خروجی PostScript منتقل میکند (پس از پردازش توسط فیلتر جایگزینی)، در حالی که بدنه نوع PSFILE باید صرفاً شامل یک نام فایل باشد. برنامه Rem2PS فایل نامبرده در یادآوری نوع PSFILE را باز کرده و محتویات آن را در خروجی PostScript میگنجاند.
یادآوریهای نوع PostScript برای یک روز مشخص، بر اساس ترتیب اولویت مرتب شده و در خروجی PostScript گنجانده میشوند. توجه داشته باشید که ترتیب دستورات PostScript تأثیر بسیار مهمی بر ظاهر تقویمها دارد. به عنوان مثال، کد PostScript برای سایهزدن یک خانه تقویم، اگر کد رسم نماد ماه قبل از آن در تقویم قرار گرفته باشد، نماد ماه را محو خواهد کرد. به همین دلیل، نباید به یادآوریهای نوع PS یا PSFILE اولویت اختصاص دهید؛ در عوض، باید اطمینان حاصل کنید که آنها به ترتیب درست در اسکریپت یادآوری ظاهر شوند. کد PostScript باید اشیاء را از پسزمینه به سمت پیشزمینه رسم کند، تا اشیاء پیشزمینه به درستی روی اشیاء پسزمینه قرار گیرند. اگر این یادآوریها را اولویتبندی کنید و اسکریپت را با ترتیب نزولی اولویتها اجرا نمایید، خروجی PostScript به درستی کار نخواهد کرد.
تمامی کدهای PostScript برای یک تاریخ مشخص در یک جفت save-restore محصور میشوند. با این حال، اگر چندین یادآوری نوع PostScript برای یک روز فعال شوند، هر بخش از PostScript در یک جفت save-restore جداگانه قرار نمیگیرد؛ بلکه کل بدنه PostScript گنجاندهشده در یک جفت محصور میشود.
یادآوریهای نوع PostScript توسط چاپگر PostScript قبل از هر ورودی عادی تقویم اجرا میشوند. بنابراین، ورودیهای عادی تقویم روی یادآوریهای نوع PostScript قرار میگیرند و به شما امکان میدهند پسزمینههای سایهدار یا گرافیکی برای روزهای خاص ایجاد کنید.
پیش از اجرای کد PostScript شما، مبدأ مختصات سیستم PostScript در گوشه پایین سمت چپ «خانه» متناظر با today() در تقویم قرار میگیرد. این مکان دقیقاً در مرکز تقاطع خطوط سیاه پایینی و چپ تعیینکننده خانه قرار دارد؛ ممکن است هنگام محاسبه موقعیتها لازم باشد ضخامت این خطوط را در نظر بگیرید.
چندین متغیر PostScript برای کد PostScript ارائهشده توسط شما در دسترس است. تمام متغیرهای فاصله و اندازه بر حسب واحدهای PostScript (یک هفتاد و دوم اینچ) هستند. این متغیرها عبارتند از:
- LineWidth
- عرض خطوط شبکه سیاه که تقویم را تشکیل میدهند.
- Border
- حاشیه بین مرکز خطوط شبکه و فضای مورد استفاده برای چاپ ورودیهای تقویم. این حاشیه معمولاً فضای خالی است.
- BoxWidth and BoxHeight
- عرض و ارتفاع خانه تقویم، از مرکز تا مرکز خطوط شبکه سیاه.
- InBoxHeight
- ارتفاع از مرکز خط شبکه سیاه پایینی تا بالای ناحیه ورودیهای تقویم عادی. فضای بین این نقطه تا بالای خانه تنها برای رسم شماره روز استفاده میشود.
- /DayFont, /EntryFont, /SmallFont, /TitleFont and /HeadFont
- قلمهای مورد استفاده برای رسم شمارههای روز، ورودیهای تقویم، تقویمهای کوچک، عنوان تقویم (ماه، سال) و سرستونهای روزهای هفته، به ترتیب.
- DaySize, EntrySize, TitleSize and HeadSize
- اندازه قلمهای فوق. (اندازه قلم تقویم کوچک در اینجا تعریف نشده است.) به عنوان مثال، اگر میخواهید تاریخ عبری را در کنار شماره روز عادی در تقویم چاپ کنید، از دستور زیر استفاده کنید:
REM PS Border BoxHeight Border sub DaySize sub moveto \ /DayFont findfont DaySize scalefont setfont \ ([hebday(today())] [hebmon(today())]) show
توجه داشته باشید که اگر کد PostScript ارائه دهید، ممکن است فایلهای PostScript نامعتبر تولید شوند. همیشه قبل از ارسال PostScript به چاپگر، آن را به طور کامل با یک نمایشگر PostScript آزمایش کنید. شما نباید از هیچگونه کامنت ساختاردهی سند در کد PostScript خود استفاده کنید.
حالت دیمن (DAEMON MODE)
اگر از گزینه خط فرمان -z استفاده کنید، Remind در «حالت دیمن» اجرا میشود. در این حالت، هیچ یادآوری «عادی» صادر نمیشود. در عوض، تنها یادآوریهای زمانبندیشده جمعآوری شده و در صف قرار میگیرند، و سپس هر زمان که به زمان راهانداز خود برسند، صادر میشوند.
علاوه بر این، Remind هر چند دقیقه یکبار بیدار میشود تا تاریخ تغییر اسکریپت یادآوری (نام فایل ارائهشده در خط فرمان) را بررسی کند. اگر Remind تشخیص دهد که اسکریپت تغییر کرده است، خود را مجدداً در حالت دیمن اجرا کرده و اسکریپت تغییریافته را تفسیر میکند. اگر Remind با پشتیبانی از inotify(7) کامپایل شده باشد و اسکریپت یادآوری خط فرمان در واقع یک پوشه باشد، Remind در صورت تغییر هر یک از فایلهای درون آن پوشه نیز خود را مجدداً اجرا میکند.
در حالت دیمن، Remind همچنین هنگامی که تشخیص دهد تاریخ سیستم تغییر کرده است، اسکریپت یادآوری را دوباره میخواند.
در حالت دیمن، Remind به گونهای عمل میکند که گویی از گزینه -f استفاده شده است؛ بنابراین برای اجرای حالت دیمن در پسزمینه، از دستور زیر استفاده کنید:
remind -z .reminders &
اگر از sh یا bash استفاده میکنید، ممکن است مجبور شوید از دستور «nohup» استفاده کنید تا مطمئن شوید با خروج شما از سیستم (log out)، دیمن متوقف نمیشود.
حالت پاکسازی (PURGE MODE)
اگر گزینه خط فرمان -j را مشخص کنید، Remind در حالت پاکسازی (purge mode) اجرا میشود. در این حالت، برنامه تلاش میکند یادآوریهای منقضیشده را از فایلهای یادآوری شما پاکسازی کند.
در حالت پاکسازی، Remind فایل یادآوری شما را میخواند و با افزودن پسوند «.purged» به نام فایل اصلی، یک فایل جدید ایجاد میکند. توجه داشته باشید که Remind هرگز فایل اصلی شما را ویرایش نمیکند؛ بلکه همیشه یک فایل .purged جدید میسازد.
اگر Remind را به جای یک فایل روی یک پوشه اجرا کنید، برای هر فایل *.rem در آن پوشه یک فایل .purged ایجاد میشود.
بهطور معمول، Remind برای فایلهای ضمیمهشده (INCLUDE) فایلهای .purged ایجاد نمیکند. با این حال، اگر یک آرگومان عددی بعد از -j وارد کنید، Remind فایلهای .purged را برای سطح مشخصشده از INCLUDE ایجاد خواهد کرد. به عنوان مثال، اگر Remind را با آرگومان -j2 اجرا کنید، فایلهای .purged برای فایل (یا پوشه) مشخصشده در خط فرمان، تمام فایلهای ضمیمهشده توسط آنها، و تمام فایلهای ضمیمهشده توسط آن فایلها ایجاد خواهند شد. اما فایلهای .purged برای سطوح سوم یا بالاتر INCLUDE ایجاد نخواهند شد.
تشخیص اینکه کدام یادآوریها منقضی شدهاند بسیار دشوار و پیچیده است. Remind تمام تلاش خود را میکند، اما شما همیشه باید فایل .purged را با فایل اصلی مقایسه کنید و تغییرات را به صورت دستی ادغام (hand-merge) نمایید.
برنامه Remind فایل .purged را به صورت زیر یادداشتگذاری میکند:
یک یادآوری منقضیشده با پیشوند زیر مشخص میشود: #!P: Expired:
در شرایطی که Remind نتواند با اطمینان تشخیص دهد که چیزی منقضی شده است یا خیر، ممکن است نظرات زیر را قبل از خط مشکلدار مشاهده کنید:
#!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
برنامه Remind همیشه خطوط یادداشتگذاری فایلهای .purged را با «#!P» آغاز میکند. اگر چنین خطوطی در فایل اصلی وجود داشته باشند، در فایل .purged کپی نمیشوند.
اگر از پرچم سکوت (Hush) -h به همراه پرچم پاکسازی (Purge) -j استفاده کنید، آنگاه Remind هیچیک از نظرات تشخیصی فهرستشده در بالا را ایجاد نمیکند. در عوض، تنها تغییری که در فایل .purged ایجاد میکند، علامتگذاری یادآوریهای منقضیشده با «#!P: Expired» است.
عبارتهای غیرثابت (NON-CONSTANT EXPRESSIONS)
در حالت پاکسازی، اگر مشخصه راهانداز یک دستور REM حاوی یک عبارت غیرثابت باشد، Remind آن را به عنوان منقضیشده علامتگذاری نمیکند. یک عبارت غیرثابت به عنوان عبارتی تعریف میشود که مقدار آن ممکن است از یک اجرا تا اجرای دیگر متفاوت باشد، معمولاً به این دلیل که به تاریخ فعلی بستگی دارد، اما همچنین اگر به چیزی از محیط وابسته باشد (مانند خروجی تابع shell()).
استفاده از هر یک از موارد زیر در یک عبارت باعث میشود که Remind آن را غیرثابت در نظر بگیرد:
علاوه بر این، به منظور منقضی کردن ایمن یادآوریها در حالت پاکسازی، Remind موارد زیر را نیز غیرثابت در نظر میگیرد:
هر زمان که مقداری به یک متغیر تخصیص داده میشود، Remind ثابت یا غیرثابت بودن عبارتی که مقدار آن اختصاص یافته را ردیابی میکند. علاوه بر این، متغیرهایی که در یک زمینه غیرثابت مقداردهی میشوند، همیشه غیرثابت فرض میگردند. یک زمینه غیرثابت کدی در محدوده یک دستور IF است که در آن عبارت IF غیرثابت باشد.
در اینجا چند مثال برای روشن شدن موضوع آورده شده است:
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()
توجه داشته باشید که درون محدوده IF...ENDIF، هرگونه تخصیص مقدار غیرثابت است زیرا جریان اجرای کد به تاریخ امروز بستگی دارد، که میتواند در اجراهای بعدی Remind تغییر کند. اگر میخواهید یک متغیر تحت هر شرایطی به عنوان ثابت در نظر گرفته شود، درست قبل از استفاده از متغیر از عبارت زیر استفاده کنید:
SET var const(var)
متغیرهایی که در خط فرمان با پرچم -i مقداردهی اولیه میشوند، همیشه غیرثابت در نظر گرفته میشوند.
اگر یک یادآوری منقضیشده دارید که به دلایلی هرگز نمیخواهید پاکسازی شود، به سادگی از تابع توکار nonconst در جایی از راهانداز آن استفاده کنید. به عنوان مثال:
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
پرچم اشکالزدایی n هر زمان که Remind تشخیص دهد عبارتی غیرثابت است، پیامی را در خروجی خطای استاندارد چاپ میکند. این کار میتواند خروجی زیادی تولید کند، بنابراین اگر میخواهید بدانید چرا Remind یک عبارت خاص را غیرثابت میداند، بهتر است قبل از آن از DEBUG +n و بعد از آن از DEBUG -n استفاده کنید تا حجم خروجی محدود شود.
مرتبسازی یادآوریها (SORTING REMINDERS)
گزینه -g باعث میشود Remind یادآوریها را قبل از صدور، بر اساس تاریخ راهانداز، زمان و اولویت مرتب کند. توجه داشته باشید که یادآوریها همچنان به ترتیبی که در اسکریپت دیده میشوند محاسبه میگردند. با این حال، به جای اینکه فوراً صادر شوند، در یک بافر داخلی ذخیره میشوند. زمانی که Remind پردازش اسکریپت را به پایان رساند، یادآوریهای ذخیرهشده را به ترتیب مرتبشده صادر میکند. گزینه -g میتواند با حداکثر چهار نویسه دنبال شود که همگی باید «a» یا «d» باشند. اولین نویسه ترتیب مرتبسازی بر اساس تاریخ راهانداز (صعودی یا نزولی)، دومین نویسه ترتیب مرتبسازی بر اساس زمان راهانداز و سومین نویسه ترتیب مرتبسازی بر اساس اولویت را تعیین میکند. اگر نویسه چهارم «d» باشد، یادآوریهای بدون زمان قبل از یادآوریهای زمانبندیشده مرتب میشوند. حالت پیشفرض این است که تمام فیلدها به ترتیب صعودی مرتب شوند و یادآوریهای بدون زمان بعد از یادآوریهای زمانبندیشده قرار گیرند.
در ترتیب صعودی، یادآوریهایی که نزدیکتر هستند ابتدا صادر میشوند. ترتیب نزولی برعکس است. یادآوریها همیشه بر اساس تاریخ راهانداز مرتب میشوند و یادآوریهایی با تاریخ راهانداز یکسان، سپس بر اساس زمان راهانداز مرتب میگردند. اگر دو یادآوری دارای تاریخ و زمان یکسان باشند، از اولویت برای رفع تساوی استفاده میشود. یادآوریهایی با تاریخ، زمان و اولویت یکسان به ترتیبی که در فایل دیده شدهاند صادر میشوند.
شما میتوانید یک تابع تعریفشده توسط کاربر به نام SORTBANNER تعریف کنید که یک آرگومان از نوع DATE میپذیرد. در حالت مرتبسازی، توالی زیر رخ میدهد:
اگر Remind متوجه شود که یادآوری بعدی برای صدور دارای تاریخ راهانداز متفاوتی نسبت به یادآوری قبلی است (یا اگر اولین یادآوری صادرشده باشد)، تابع SORTBANNER با تاریخ راهانداز به عنوان آرگومان فراخوانی میشود. نتیجه به یک رشته تبدیل شده و همراه با تاریخ راهانداز مناسب از فیلتر جایگزینی عبور داده میشود. سپس نتیجه نمایش داده خواهد شد.
در اینجا یک مثال آورده شده است - قطعهکد زیر را در نظر بگیرید:
# 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 -----")
اجرای این قطعهکد با گزینه -gaa در تاریخ ۱۰ مارس ۱۹۹۳ خروجی زیر را تولید میکند:
***** 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
شما میتوانید از تابع توکار args() برای تعیین اینکه آیا SORTBANNER تعریف شده است یا خیر استفاده کنید. (این میتواند برای مثال برای ارائه تعریف پیشفرض برای SORTBANNER در یک فایل سرتاسری سیستم که در انتهای فایل کاربر ضمیمه میشود، استفاده گردد.) در اینجا یک مثال آورده شده است:
# Create a default sortbanner function if it hasn't already
# been defined
if args("sortbanner") != 1
fset sortbanner(x) "--- Things to do %b ---"
endif
توابع MSGPREFIX() و MSGSUFFIX() (MSGPREFIX() AND MSGSUFFIX())
شما میتوانید دو تابع در اسکریپت خود به نامهای msgprefix() و msgsuffix() تعریف کنید. هر یک از آنها باید یک آرگومان بپذیرند که عددی بین ۰ تا ۹۹۹۹ است.
در حالت آگندا، برای یادآوریهای نوع MSG و MSF، هنگامی که Remind یک یادآوری را فعال میکند توالی زیر رخ میدهد:
- o
- اگر msgprefix() تعریف شده باشد، با اولویت یادآوری به عنوان آرگومان ارزیابی میشود. نتیجه چاپ میگردد. این نتیجه از فیلتر جایگزینی عبور داده نمیشود.
- o
- بدنه یادآوری چاپ میشود.
- o
- اگر msgsuffix() تعریف شده باشد، با اولویت یادآوری به عنوان آرگومان ارزیابی میشود. نتیجه چاپ میگردد. این نتیجه از فیلتر جایگزینی عبور داده نمیشود.
در اینجا یک مثال آورده شده است: تعریف زیر باعث میشود که یادآوریهای با اولویت ۰ با «URGENT: » و یادآوریهای با اولویت ۶۰۰۰ با «(not important) » آغاز شوند.
fset msgprefix(x) iif(x==0, "URGENT: ", \
x==6000, "(not important) ", "")
در حالت تقویم (با گزینههای -c، -s یا -p)، یک جفت تابع مشابه به نامهای calprefix() و calsuffix() میتوانند تعریف شوند. آنها با تمام یادآوریهایی که ورودی در تقویم ایجاد میکنند کار میکنند (یعنی یادآوریهای نوع CAL، احتمالاً یادآوریهای نوع RUN و همچنین یادآوریهای نوع MSG).
نکات (NOTES)
بهطور معمول، بدنه یک یادآوری با یک نویسه بازگشت به ابتدای سطر (carriage return) دنبال میشود. بنابراین، نتایج msgsuffix() در خط بعدی ظاهر خواهد شد. اگر این رفتار را نمیخواهید، مطمئن شوید که خروجی msgsuffix با یک نویسه پسبر (backspace) شروع شود. این کار پسوند را قبل از بازگشت سطر قرار میدهد تا بعد از آن. (خود نویسه پسبر حذف میشود.) در اینجا یک مثال آورده شده است:
FSET msgsuffix(x) char(8) + " - suffix on same line"
اگر Remind در ارزیابی msgprefix()، msgsuffix() یا sortbanner() با مشکل مواجه شود، پیامهای خطای زیادی را مشاهده خواهید کرد. برای نمونهای از این وضعیت، مورد زیر را تعریف کنید:
fset msgprefix(x) x/0
پشتیبانی زمان کامپایل از زبانهای دیگر (COMPILE-TIME SUPPORT FOR OTHER LANGUAGES)
پیشتر ?BRemind?R از محلیسازی زمان کامپایل به زبانهای دیگر پشتیبانی میکرد، اما دیگر چنین نیست. تمامی محلیسازیها اکنون در زمان اجرا انجام میشوند.
پشتیبانی زمان اجرا از زبانهای دیگر (RUN-TIME SUPPORT FOR OTHER LANGUAGES)
?BRemind?R دارای پشتیبانی زمان اجرا از زبانهای دیگر است و پشتیبانی زمان کامپایل به نفع پشتیبانی زمان اجرا حذف شده است.
تعدادی از متغیرهای سیستمی به شما امکان میدهند عبارتهای مختلف را به زبانهای دیگر ترجمه کنید. این متغیرهای سیستمی عبارتند از:
- $Monday, $Tuesday, $Wednesday, $Thursday, $Friday, $Saturday, $Sunday
- هر یک از این متغیرهای سیستمی را با یک رشته که نشاندهنده نام روز متناظر در زبان شماست مقداردهی کنید. رشتهها باید معتبر و با کدگذاری UTF-8 باشند.
- $January, $February, $March, $April, $May, $June, $July, $August, $September, $October, $November, $December
- هر یک از این متغیرهای سیستمی را با یک رشته که نشاندهنده نام ماه متناظر در زبان شماست مقداردهی کنید. رشتهها باید معتبر و با کدگذاری UTF-8 باشند.
- $Ago, $Am, $And, $At, $Hour, $Is, $Minute, $Now, $On, $Pm, $Today, $Tomorrow, $Was
- هر یک از این متغیرهای سیستمی را با ترجمه کلمه انگلیسی متناظر به زبان خود مقداردهی کنید. توجه داشته باشید که ?B$Am?R و ?B$Pm?R باید به ترتیب ترجمه "AM" و "PM" (نشانگرهای زمانی صبح و بعدازظهر) باشند.
- $Hplu, $Mplu
- این متغیرها را با پسوندی که به کلمات "hour" (ساعت) و "minute" (دقیقه) برای جمع بستن اضافه میشود مقداردهی کنید. در انگلیسی، هر دو با "s" مقداردهی میشوند.
- $Fromnow
- این متغیر را با ترجمه عبارت انگلیسی "from now" (از حالا) مقداردهی کنید.
توجه داشته باشید که اگر هر یک از متغیرهای سیستمی مرتبط با زبان را مقداردهی میکنید، باید در بخشی از اسکریپت شما قرار گیرند که همیشه ارزیابی میشود. اگر آنها را به عنوان مثال درون یک دستور ?BIF?R مقداردهی کنید، نتایج غیرقابل پیشبینی خواهد بود.
همچنین توجه داشته باشید که بکاند ?BRem2PS?R از دامنه کامل کاراکترهای UTF-8 پشتیبانی نمیکند. بکاندهای ?BTkRemind?R، ?Brem2html?R و ?Brem2pdf?R همگی از دامنه کامل UTF-8 پشتیبانی میکنند.
تغییر زمان اجرای فیلتر جایگزینی (RUN-TIME MODIFICATION OF THE SUBSTITUTION FILTER)
متغیرهای سیستمی ذکر شده در بخش قبلی معمولاً برای ترجمه صحیح خروجی Remind به زبانهای دیگر کافی نیستند. برخی زبانها قواعد پیچیدهای برای زمانهای قبلازظهر در برابر بعدازظهر دارند و برخی دیگر قواعد پیچیدهای برای جمع بستن کلمات دارند. بنابراین ?BRemind?R به شما اجازه میدهد تعدادی تابع تعریف کنید که رفتار فیلتر جایگزینی را در زمان اجرا تغییر میدهند. این توابع عبارتند از:
- subst_ampm(h)
- به این تابع یک عدد صحیح ارسال میشود که نشاندهنده ساعت از 0 تا 23 است. این تابع باید رشتهای برگرداند که "AM" یا "PM" یا حتی درجهبندیهای دقیقتری را در برخی زبانها مشخص کند.
- subst_ordinal(d)
- به این تابع یک عدد صحیح ارسال میشود که نشاندهنده روزی از ماه از 1 تا 31 است. این تابع باید رشتهای برگرداند که به شماره روز پسوند میشود تا آن را به یک عدد ترتیبی تبدیل کند. برای نمونه در زبان انگلیسی، این تابع ممکن است بسته به ?Id?R رشتههای "st"، "nd"، "rd" یا "th" را برگرداند.
- subst_?IN?R?B(alt, date, time)?R
- این در واقع یک ?Iخانواده?R از توابع است که در آن ?IN?R یک حرف یا عدد است. این تابع دنباله جایگزینی "%N" را ?Iبهطور کامل بازنویسی میکند?R. سه آرگومان آن عبارتند از: عدد صحیح ?Ialt?R که اگر غیرصفر باشد، نشان میدهد که دنباله جایگزینی حالت جایگزین "%*N" مشاهده شده است؛ ?Idate?R که تاریخ محرک یادآوری است و ?Itime?R که زمان محرک است.
- subst_?IN?R?Bx(alt, date, time)?R
- این نیز مجدداً یک ?Iخانواده?R از توابع است. این تابع مشابه خانواده ?Bsubst_?IN?R است، با این تفاوت که فقط در صورتی فراخوانی میشود که ?Idate?R دو روز یا بیشتر با ?Itoday()?R فاصله داشته باشد. این ویژگی زمانی مفید است که نمیخواهید خروجی "today" یا "tomorrow" را برای بیشتر دنبالههای جایگزینی بازنویسی کنید.
در اینجا نمونهای از نحوه سفارشیسازی فیلتر جایگزینی آورده شده است. فرض کنید میخواهید دنباله "%b" را به گونهای تغییر دهید که برای رویدادی که دو روز پس از امروز است، عبارت "the day after tomorrow" را جایگزین کند. میتوانید به این صورت عمل کنید:
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%
خروجی این اسکریپت به شرح زیر است:
Event 1 is in 3 days' time Event 2 is the day after tomorrow Event 3 is tomorrow Event 4 is today
توجه کنید که چگونه نگارش Event 2 از حالت عادی "in 2 days' time" تغییر کرد، و همچنین توجه کنید که رویدادهای "tomorrow" و "today" از جایگزینی عادی استفاده کردند—تابع ?Bsubst_bx?R برای روزهای محرک امروز یا فردا فراخوانی نمیشود.
به عنوان یک حالت خاص، اگر یک تابع ?Bsubst_Nx?R یا ?Bsubst_N?R عدد صحیح صفر را برگرداند، سازوکار جایگزینی عادی استفاده میشود. بنابراین، مثال قبلی میتوانست سادهتر به این شکل نوشته شود:
FSET subst_bx(a,d,t) iif(d==today()+2, "the day after tomorrow", 0)
میتوانید دنبالههای جایگزینی غیر عددی-حروفی را به شرح زیر بازنویسی کنید:
بازنویسی %: با ?Bsubst_colon?R
بازنویسی %! با ?Bsubst_bang?R
بازنویسی %? با ?Bsubst_question?R
بازنویسی %@ با ?Bsubst_at?R
بازنویسی %# با ?Bsubst_hash?R
علاوه بر موارد داخلی، میتوانید دنبالههای جایگزینی اختصاصی خود را به شرح زیر تعریف کنید: اگر تابعی به نام ?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 فراخوانی میکند.
اگر از دنباله ?B%{name}?R استفاده کنید و تابع ?Bsubst_?Iname?R تعریف نشده باشد یا خطایی برگرداند، ?B%{name}?R با رشته خالی جایگزین میشود.
توجه داشته باشید که هنگامی که ?BRemind?R هر تابع کالبکی را برای یک دنباله جایگزینی فراخوانی میکند، دستور ?BRUN?R غیرفعال خواهد بود.
جدول ترجمه (THE TRANSLATION TABLE)
برای کمک به محلیسازی فایلهای یادآوری، ?BRemind?R جدولی از ترجمهها را نگهداری میکند. این یک جدول جستجوی ساده است که یک رشته (رشته اصلی) را به یک رشته جدید (رشته ترجمهشده) نقشهبرداری میکند. هنگامی که ?BRemind?R شروع به اجرا میکند، جدول ترجمه خالی است.
برای افزودن یک پیام به جدول ترجمه، از دستور ?BTRANSLATE?R استفاده کنید (که میتواند به ?BTRANS?R خلاصه شود). دستور ?BTRANSLATE?R باید با دو رشته نقلقولشده که با فاصله از یکدیگر و از دستور جدا شدهاند همراه باشد. برای نمونه، یک فایل زبان هلندی ممکن است شامل مواردی مانند این باشد:
TRANSLATE "New Moon" "Nieuwe maan" TRANSLATE "First Quarter" "Eerste kwartier" TRANSLATE "Full Moon" "Volle maan" TRANSLATE "Last Quarter" "Laatste kwartier"
برای استفاده عملی از جدول ترجمه، از تابع داخلی ?B_?R به صورت زیر بهره بگیرید:
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)
با استفاده هوشمندانه از ?BTRANSLATE?R و ?B_?R، میتوانید ترجمه فایلهای یادآوری خود را آسان کنید.
دستور ?BTRANSLATE?R چهار فرم دیگر نیز دارد: اگر به جای دو رشته، با ?Iیک?R رشته نقلقولشده دنبال شود، ?BRemind?R مدخل مربوط به آن رشته را از جدول ترجمه حذف میکند. اگر با کلمه کلیدی ?BDUMP?R دنبال شود، ?BRemind?R تمام مدخلهای جدول ترجمه را در خروجی استاندارد میریزد. و اگر با ?BCLEAR?R دنبال شود، ?BRemind?R تمام مدخلهای جدول ترجمه را حذف میکند.
فرم چهارم، یعنی ?BTRANSLATE GENERATE?R، تمام رشتههایی را که میتوانند محلیسازی شوند (به صورت یک سری دستور TRANSLATE) در خروجی استاندارد میریزد. رشتههایی که از قبل محلیسازی شدهاند به همراه ترجمهشان خارج میشوند؛ رشتههایی که محلیسازی نشدهاند به صورت زیر خارج میشوند:
TRANSLATE "untranslated" ""
اگر میخواهید یک زبان جدید اضافه کنید، میتوانید با اجرای دستور زیر یک اسکلت اولیه فایل ترجمه دریافت کنید:
echo "TRANSLATE GENERATE" | remind -h - > /tmp/skeleton.rem
اگر یک فایل زبان موجود دارید که برخی ترجمهها را کم دارد، میتوانید با اجرای دستور زیر آن را بهروزرسانی کنید:
(echo INCLUDE mylang.rem; echo TRANSLATE GENERATE) | remind -h - > /tmp/mylang-update.rem
و سپس ?Bmylang-update.rem?R را ویرایش کنید تا ترجمههای از دست رفته را اضافه نمایید.
اگر اسکریپتهای یادآوری دارید که از تابع داخلی ?B_()?R یا دنباله جایگزینی ?B%(...)?R استفاده میکنند، میتوانید با اجرای دستور زیر فهرستی از دستورات مورد نیاز TRANSLATE ایجاد کنید:
remind -q -n -dq myscript.rem 2>&1 | grep ^TRANSLATE | sort | uniq
توجه داشته باشید که اگر متغیرهای سیستمی مختلف مربوط به ترجمه مانند ?B$Monday?R، ?B$December?R، ?B$Ago?R و غیره را با ?BSET?R مقداردهی کنید، ?BRemind?R ?Iهمچنین?R به طور خودکار مدخل متناظری در جدول ترجمه ایجاد میکند. این کار برای تمام متغیرهای سیستمی مربوط به ترجمه ?Iبه جز?R ?B$Hplu?R و ?B$Mplu?R انجام میشود.
برعکس این موضوع نیز صادق است؛ ایجاد یک مدخل جدول ترجمه برای "December" به طور خودکار متغیر ?B$December?R را تنظیم میکند. و اگر ?BTRANSLATE CLEAR?R را اجرا کنید، تمام متغیرهای سیستمی مرتبط با ترجمه نیز به مقادیر پیشفرض خود تنظیم میشوند.
جدول ترجمه همیشه حاوی یک مدخل ویژه به نام ?BLANGID?R است که مقدار پیشفرض آن ?Ben?R است. از مترجمان تقاضا میشود که یک مدخل ?BLANGID?R در فایلهای زبان خود اضافه کنند؛ مقدار آن باید کد دو حرفی زبان در استاندارد ISO 639 باشد.
به عنوان مثال، اگر فایلی برای زبان هلندی مینویسید، این خط را اضافه کنید:
TRANSLATE "LANGID" "nl"
اسکریپتها میتوانند با استفاده از ?B_("LANGID")?R زبان فعال ترجمه را جویا شوند.
تابع ?B_()?R از فرآیند زیر برای دریافت ترجمه یک رشته استفاده میکند:
- 1
- جستجو برای تطابق دقیق. در صورت یافتن، بازگردانده میشود.
- 2
- اگر رشته اصلی دارای حرف بزرگ بود، نسخه کاملاً حروف کوچک آن جستجو میشود. در صورت یافتن، حرف اول نتیجه بزرگ شده و بازگردانده میشود.
- 3
- اگر رشته اصلی با حرف کوچک آغاز شده بود، معادل آن با حرف اول بزرگ و بقیه حروف کوچک جستجو میشود. در صورت یافتن، حرف اول نتیجه کوچک شده و بازگردانده میشود.
- 4
- هیچ ترجمهای یافت نشد. رشته اصلی بازگردانده میشود.
بستههای زبان (LANGUAGE PACKS)
?BRemind?R همراه با تعدادی بسته زبان عرضه میشود که اسکریپتهای یادآوری ساده مستقر در ?B[$SysInclude]/lang?R هستند. بستههای زبانی که در حال حاضر عرضه میشوند عبارتند از:
da.rem (دانمارکی)، de.rem (آلمانی)، es.rem (اسپانیایی)، fr.rem (فرانسوی)، is.rem (ایسلندی)، it.rem (ایتالیایی)، nl.rem (هلندی)، no.rem (نروژی)، pl.rem (لهستانی)، pt.rem (پرتغالی) و ro.rem (رومانیایی).
برای استفاده از یک بسته زبان (در این مثال، de.rem)، کافی است این خط را در ابتدای فایل یادآوریهای خود قرار دهید:
SYSINCLUDE lang/de.rem
اگر میخواهید ?BRemind?R تلاش کند بسته زبان مناسب برای تنظیمات محلی شما را پیدا کند، استفاده کنید از:
SYSINCLUDE lang/auto.rem
به شما پیشنهاد میشود بستههای زبان را بررسی کنید تا ببینید چگونه میتوانید ?BRemind?R را به زبانهای دیگر ترجمه کنید.
تقویم عبری (THE HEBREW CALENDAR)
?BRemind?R از تقویم عبری که یک تقویم خورشیدی-قمری است پشتیبانی میکند. این ویژگی به شما امکان میدهد برای تعطیلات یهودی، سالمرگها (jahrzeits یا سالگرد وفات) و شادمانیها (smachot یا مناسبتهای شاد) یادآوری ایجاد کنید.
سال عبری (THE HEBREW YEAR)
سال عبری دارای ۱۲ ماه است که به طور متناوب ۳۰ و ۲۹ روز طول دارند. ماهها عبارتند از: تیشری (Tishrey)، حشوان (Heshvan)، کسلو (Kislev)، طوت (Tevet)، شواط (Shvat)، آدار (Adar)، نیسان (Nisan)، ایار (Iyar)، سیوان (Sivan)، تموز (Tamuz)، آو (Av) و ایلول (Elul). اگر در یک محیط محلی UTF-8 هستید، میتوانید ?Iهمچنین?R از نگارشهای عبری کدگذاریشده در UTF-8 برای نام ماهها استفاده کنید، یعنی:
תשרי, חשוון, כסלו, טבת, שבט, אדר, ניסן, אייר, סיון, תמוז, אב, אלול.
در یک چرخه ۱۹ ساله، ۷ سال کبیسه وجود دارد که سالهای ۳، ۶، ۸، ۱۱، ۱۴، ۱۷ و ۱۹ این چرخه هستند. در یک سال کبیسه، یک ماه اضافی ۳۰ روزه قبل از آدار اضافه میشود. دو ماه آدار را آدار الف و آدار ب مینامند، یا در زبان عبری 'אדר א و 'אדר ב.
?BRemind?R همچنین نگارشهای جایگزین زیر را برای نام ماههای عبری مجاز میداند:
- Tishrey
- میتواند به صورت Tishri یا Tishrei نیز نوشته شود
- Heshvan
- میتواند به صورت Cheshvan یا Kheshvan نیز نوشته شود
- Shvat
- میتواند به صورت Shevat نیز نوشته شود
- Tamuz
- میتواند به صورت Tammuz نیز نوشته شود
- Adar A
- میتواند به صورت Adar 1، Adar I، אדר א یا אדר 1 نوشته شود.
- Adar B
- میتواند به صورت Adar 2، Adar II، אדר ב یا אدر 2 نوشته شود.
- Iyar
- میتواند به صورت Iyyar نیز نوشته شود.
به دلایل خاص مذهبی، سال نمیتواند در روزهای یکشنبه، چهارشنبه یا جمعه آغاز شود. برای تنظیم این امر، یک روز از کسلو کم میشود یا به حشوان اضافه میشود. بنابراین، یک سال عادی میتواند بین ۳۵۳ تا ۳۵۵ روز، و یک سال کبیسه از ۳۸۳ تا ۳۸۵ روز داشته باشد.
هنگامی که کسلو یا حشوان کوتاه است، آن را ?Ichaser?R (ناقص) مینامند. هنگامی که طولانی است، آن را ?Ishalem?R (کامل) مینامند.
تاریخ یهودی هنگام غروب آفتاب تغییر میکند. با این حال، ?BRemind?R تاریخ را در نیمهشب تغییر میدهد، نه در غروب آفتاب. بنابراین در بازه زمانی میان غروب آفتاب و نیمهشب، ?BRemind?R یک روز عقبتر از تاریخ واقعی یهودی خواهد بود. این مسئله در عمل نباید مشکل چندانی ایجاد کند.
محاسبات مربوط به تقویم یهودی بر اساس برنامه "hdate" نوشته عاموس شاپیر (Amos Shapir) از دانشگاه عبری اورشلیم انجام شده است. او همچنین توضیحات قبلی درباره تقویم را ارائه داده است.
توابع تاریخ عبری (HEBREW DATE FUNCTIONS)
- hebday(d_date)
- روز ماه عبری متناظر با پارامتر ?Idate?R را برمیگرداند. برای مثال، ۱۲ آوریل ۱۹۹۳ متناظر با ۲۱ نیسان ۵۷۵۳ است. بنابراین، hebday('1993/04/12') عدد ۲۱ را برمیگرداند.
- hebmon(d_date)
- نام ماه عبری متناظر با ?Idate?R را برمیگرداند. برای مثال، hebmon('1993/04/12') مقدار "Nisan" را برمیگرداند.
- ivritmon(d_date)
- نام ماه عبری متناظر با ?Idate?R را با خط عبری با کدگذاری UTF-8 برمیگرداند. برای مثال، ivritmon('1993/04/12') مقدار "ניסן" را برمیگرداند.
- hebyear(d_date)
- سال عبری متناظر با ?Idate?R را برمیگرداند. برای مثال، hebyear('1993/04/12') عدد ۵۷۵۳ را برمیگرداند.
- hebdate(i_day, s_hebmon [,id_yrstart [,i_jahr [,i_aflag]]])
- تابع ?Bhebdate()?R پیچیدهترین تابع از میان توابع پشتیبانی عبری است. این تابع میتواند بین ۲ تا ۵ آرگومان دریافت کند و یک ?BDATE?R متناظر با تاریخ عبری را برمیگرداند.
پارامتر ?Iyrstart?R میتواند یک ?BDATE?R یا یک ?BINT?R باشد. اگر یک ?BDATE?R باشد، آنگاه ?Bhebdate()?R برای اولین تاریخ عبری در آن تاریخ یا پس از آن جستجو میکند. برای مثال:
hebdate(15, "Nisan", '1990/01/01')
تاریخ 1990/03/30 را برمیگرداند، زیرا این اولین رخداد ۱۵ نیسان در ۱ ژانویه ۱۹۹۰ یا پس از آن است.
اگر ?Iyrstart?R یک ?BINT?R باشد، به عنوان سال عبری تفسیر میشود. بنابراین:
hebdate(22, "Kislev", 5756)
تاریخ 1995/12/15 را برمیگرداند، زیرا آن تاریخ متناظر با ۲۲ کسلو ۵۷۵۶ است. توجه داشته باشید که هیچیک از توابع تاریخ عبری با تاریخهای خارج از محدوده عادی تاریخهای ?BRemind?R کار نخواهند کرد.
اگر ?Iyrstart?R ارائه نشود، مقدار پیشفرض آن ?Btoday()?R خواهد بود.
پارامتر ?Ijahr?R رفتار ?Bhebdate()?R را به شرح زیر تغییر میدهد:
اگر ?Ijahr?R برابر 0 باشد (پیشفرض)، ?Bhebdate()?R به جستجو ادامه میدهد تا تاریخی را بیابد که دقیقاً پارامترهای دیگر را برآورده کند. برای مثال:
hebdate(30, "Adar A", 1993/01/01)
تاریخ 1995/03/02 را برمیگرداند که متناظر با ۳۰ آدار الف ۵۷۵۵ است، زیرا این رخداد بعدی ۳۰ آدار الف پس از ۱ ژانویه ۱۹۹۳ است. این رفتار برای پوریم صغیر (Purim Katan) که فقط در سالهای کبیسه رخ میدهد مناسب است.
اگر ?Ijahr?R برابر 1 باشد، تاریخ به شرح زیر تغییر مییابد:
- o
- در سالهایی که حشوان ?Ichaser?R (ناقص) است، ۳۰ حشوان به ۱ کسلو تبدیل میشود
- o
- در سالهایی که کسلو ?Ichaser?R (ناقص) است، ۳۰ کسلو به ۱ طوت تبدیل میشود
- o
- در سالهای غیرکبیسه، ۳۰ آدار الف به ۱ نیسان تبدیل میشود
- o
- سایر تاریخهای آدار الف در سالهای غیرکبیسه به روز متناظر در آدار منتقل میشوند
این رفتار برای مناسبتهای شاد (smachot) و برای برخی سالمرگها مناسب است - به بخش "JAHRZEITS" مراجعه کنید.
اگر ?Ijahr?R برابر 2 باشد، تاریخ به شرح زیر تغییر مییابد:
- o
- اگر ماه ?Ichaser?R باشد، ۳۰ کسلو و ۳۰ حشوان به ترتیب به ۲۹ کسلو و ۲۹ حشوان تبدیل میشوند
- o
- در سالهای غیرکبیسه، ۳۰ آدار الف به ۳۰ شواط تبدیل میشود
- o
- سایر تاریخهای آدار الف در سالهای غیرکبیسه به روز متناظر در آدار منتقل میشوند
اگر ?Ijahr?R برابر 0، 1 یا 2 نباشد، به عنوان سال عبری تفسیر میشود و رفتار آن همانگونه که در بخش بعدی یعنی "JAHRZEITS" توضیح داده شده محاسبه میگردد.
پارامتر ?Iaflag?R رفتار تابع را برای تاریخهای ماه آدار در طول سالهای کبیسه تغییر میدهد. پارامتر ?Iaflag?R ?Iتنها?R در صورتی استفاده میشود که ?Iyrstart?R از نوع ?BDATE?R باشد.
پارامتر ?Iaflag?R فقط زمانی روی محاسبات تاریخ تأثیر میگذارد که ?Ihebmon?R به صورت "Adar" مشخص شده باشد. در سالهای کبیسه، الگوریتم زیر دنبال میشود:
- o
- اگر ?Iaflag?R برابر 0 باشد، تاریخ در آدار ب فعال میشود. این حالت پیشفرض است.
- o
- اگر ?Iaflag?R برابر 1 باشد، تاریخ در آدار الف فعال میشود. این ممکن است برای سالمرگها در سنت اشکنازی مناسب باشد؛ با یک خاخام مشورت کنید.
- o
- اگر ?Iaflag?R برابر 2 باشد، تاریخ هم در آدار الف و هم در آدار ب یک سال کبیسه فعال میشود. برخی اشکنازیها مراسم سالمرگ را در هر دو آدار الف و آدار ب برگزار میکنند.
سالمرگها (JAHRZEITS)
سالمرگ (jahrzeit) یادبود سالانه مرگ یک شخص است. این مراسم معمولاً در سالگرد وفات برگزار میشود، اما در صورت تأخیر در خاکسپاری ممکن است به تعویق بیفتد - برای اطلاعات بیشتر با یک خاخام مشورت کنید.
علاوه بر این، چون طول برخی ماهها تغییر میکند، مشخص نیست سالگرد وفات دقیقاً چه روزی است. قواعد زیر به کار گرفته میشوند:
- o
- اگر فوت در ۳۰ حشوان رخ داده باشد و حشوان در سال پس از وفات ?Ichaser?R باشد، در سالهایی که حشوان ?Ichaser?R است، سالمرگ در ۲۹ حشوان برگزار میشود. در غیر این صورت، زمانی که حشوان ?Ichaser?R است، سالمرگ در ۱ کسلو برگزار میشود.
- o
- اگر فوت در ۳۰ کسلو رخ داده باشد و کسلو در سال پس از وفات ?Ichaser?R باشد، در سالهایی که کسلو ?Ichaser?R است، سالمرگ در ۲۹ کسلو برگزار میشود. در غیر این صورت، زمانی که کسلو ?Ichaser?R است، سالمرگ در ۱ طوت برگزار میشود.
- o
- اگر فوت در ۱ تا ۲۹ آدار الف رخ داده باشد، در سالهای غیرکبیسه در ۱ تا ۲۹ آدار گرامی داشته میشود.
- o
- اگر فوت در ۳۰ آدار الف رخ داده باشد، در یک سال غیرکبیسه در ۳۰ شواط گرامی داشته میشود.
مشخص کردن یک سال عبری برای پارامتر ?Ijahr?R باعث میشود رفتار صحیح برای وفاتی در آن سال انتخاب گردد. همچنین بسته به سنت مذهبی خود، ممکن است لازم باشد ?Iaflag?R را نیز تعیین کنید.
اطلاعات مربوط به سالمرگ توسط فرانک یلین (Frank Yellin) ارائه شده است که از کتاب "The Comprehensive Hebrew Calendar" نوشته آرتور اسپایر (Arthur Spier) و کتاب "Calendrical Calculations" نوشته ای. ام. رینگولد (E. M. Reingold) و ناخوم درشویتز (Nachum Dershowitz) نقل کرده است.
یادآوریهای خارج از باند (OUT-OF-BAND REMINDERS)
کلمه کلیدی ?BSPECIAL?R برای انتقال اطلاعات «خارج از باند» (out-of-band) به بکاندهای ?BRemind?R مانند ?Btkremind?R یا ?BRem2PS?R استفاده میشود. آنها فقط هنگام ارسال داده از طریق پایپ از خط ?Bremind -p?R استفاده میشوند. (توجه داشته باشید که مورد ویژه COLOR یک استثنا است؛ هنگامی که گزینه ?B-p?R ارائه نشده باشد، مشابه MSG کار میکند.)
موارد ویژه ?BSPECIAL?R شناختهشده برای هر بکاند خاص هستند؛ با این حال، چهار مورد ?BSPECIAL?R وجود دارد که همه بکاندها باید تلاش کنند از آنها پشتیبانی کنند. آنها در حال حاضر توسط ?BRem2PS?R، ?Btkremind?R و ?Brem2html?R پشتیبانی میشوند.
مورد ویژه ?BSHADE?R جایگزین تابع ?Bpsshade()?R میشود. از آن به این شکل استفاده کنید:
REM Sat Sun SPECIAL SHADE 128 REM Mon SPECIAL SHADE 255 0 0
کلمه کلیدی ?BSHADE?R با یک یا سه عدد از 0 تا 255 دنبال میشود. اگر یک عدد ارائه شود، به عنوان یک مقدار مقیاس خاکستری از سیاه (0) تا سفید (255) تفسیر میشود. اگر سه عدد ارائه شود، به عنوان مؤلفههای RGB از حداقل (0) تا حداکثر (255) تفسیر میشوند. مثال بالا تعطیلات آخر هفته را به رنگ خاکستری نسبتاً تیره درمیآورد و دوشنبهها را به رنگ قرمز کاملاً اشباع تبدیل میکند. (این سایهبندیها در تقویمهای تولیدشده توسط ?BRem2PS?R، ?Btkremind?R و ?Brem2html?R ظاهر میشوند.)
مورد ویژه ?BMOON?R جایگزین تابع ?Bpsmoon()?R میشود. از آن به صورت زیر استفاده کنید:
REM [moondate(0)] SPECIAL MOON 0 REM [moondate(1)] SPECIAL MOON 1 REM [moondate(2)] SPECIAL MOON 2 REM [moondate(3)] SPECIAL MOON 3
این دستورات ماههای کوچکی را بر روی تقویمهای مختلف رسم میکنند. نحو کامل مورد ویژه ?BMOON?R به شرح زیر است:
... SPECIAL MOON phase moonsize fontsize msg
پارامتر ?IPhase?R عددی از 0 تا 3 است که در آن 0 نشاندهنده ماه نو، 1 تربیع اول، 2 ماه کامل و 3 تربیع آخر است.
پارامتر ?Imoonsize?R قطر ماه برای رسم در واحدهای PostScript است. اگر حذف شود یا با مقدار -1 ارائه گردد، بکاند اندازه مناسب را انتخاب میکند.
پارامتر ?Ifontsize?R اندازه قلم در واحدهای PostScript برای متن ?Imsg?R است.
پارامتر ?IMsg?R متن اضافی است که در نزدیکی تصویر گلیف ماه قرار میگیرد.
توجه داشته باشید که تنها بکاند ?BRem2PS?R از ?Imoonsize?R و ?Ifontsize?R پشتیبانی میکند؛ بکاندهای دیگر از اندازههای ثابت استفاده میکنند.
مورد ویژه ?BCOLOR?R به شما امکان میدهد یادآوریهای رنگی را در تقویم قرار دهید. از آن به این شکل استفاده کنید:
REM ... SPECIAL COLOR 255 0 0 This is a bright red reminder REM ... SPECIAL COLOR 0 128 0 This is a dark green reminder
میتوانید کلمه COLOR را به شیوه آمریکایی ("COLOR") یا شیوه بریتانیایی ("COLOUR") بنویسید. این راهنما از شیوه آمریکایی استفاده خواهد کرد.
بلافاصله پس از COLOR باید سه عدد دهدهی از 0 تا 255 قرار گیرد که به ترتیب شدت رنگهای قرمز، سبز و آبی را مشخص میکنند. باقیمانده خط متنی است که باید در تقویم قرار گیرد.
مورد ویژه COLOR ویژگی مضاعفی دارد، زیرا در حالت آگندا، ?Bremind?R با آن درست مثل یک یادآوری از نوع MSG رفتار میکند. همچنین، اگر ?BRemind?R را با ?B-@?R[?In?R] اجرا کنید، یادآوریهای SPECIAL COLOR را در ترمینال شما شبیهسازی میکند.
همچنین مستندات متغیر سیستمی ?B$DefaultColor?R را در بخش "متغیرهای سیستمی (SYSTEM VARIABLES)" ببینید.
مورد ویژه ?BWEEK?R به شما امکان میدهد حاشیهنویسیهایی مانند شماره هفته را در تقویم درج کنید. برای مثال، این دستور هر دوشنبه را با شماره هفته طبق استاندارد ISO 8601 شمارهگذاری میکند. شماره هفته در این مثال به شکل "(W?In?R)" نشان داده میشود، اما میتوانید هر متنی را که میخواهید پس از کلمه کلیدی WEEK قرار دهید.
REM Monday SPECIAL WEEK (W[weekno()])
متفرقه (MISCELLANEOUS)
اختصارات دستورات و کلمات کلیدی (COMMAND AND KEYWORD ABBREVIATIONS)
توکنهای زیر را میتوان به صورت مختصر نوشت:
- o
- ?BCLEAR-OMIT-CONTEXT?R --> ?BCLEAR?R
- o
- ?BPUSH-OMIT-CONTEXT?R --> ?BPUSH?R
- o
- ?BPOP-OMIT-CONTEXT?R --> ?BPOP?R
- o
- ?BDUMPVARS?R --> ?BDUMP?R
- o
- ?BBANNER?R --> ?BBAN?R
- o
- ?BINCLUDE?R --> ?BINC?R
- o
- ?BMAYBE-UNCOMPUTABLE?R --> ?BMAYBE?R
- o
- ?BSCANFROM?R --> ?BSCAN?R
مثالهای جالب و کاربردی (NIFTY EXAMPLES)
این بخش نمونهای از قابلیتهایی است که میتوانید با ?BRemind?R انجام دهید.
REM 5 Feb 1991 AT 14:00 +45 *30 RUN mail -s "Meeting at %2" $LOGNAME </dev/null &
در ۵ فوریه ۱۹۹۱، این یادآوری برای جلسهای در ساعت ۲:۰۰ بعدازظهر، در ساعات ۱:۱۵، ۱:۴۵ و ۲:۰۰ برای شما یادآوری ایمیل خواهد کرد. موضوع پیام ایمیل "Meeting at 2:00pm" خواهد بود و بدنه پیام خالی خواهد بود.
REM AT 17:00 RUN echo "5:00pm - GO HOME!" | xless -g +0+0 &
این یادآوری هر روز در ساعت ۵:۰۰ بعدازظهر یک پنجره xless باز میکند. پنجره xless شامل خط "5:00pm - GO HOME!" خواهد بود.
REM AT 23:59 RUN (sleep 120; remind -a [filename()]) &
این یادآوری در یک دقیقه مانده به نیمهشب اجرا میشود. این دستور باعث میشود یک فرآیند جدید ?BRemind?R در یک دقیقه پس از نیمهشب آغاز شود. این به شما امکان میدهد یک سرویس یادآوری پیوسته داشته باشید تا بتوانید در طول شب کار کنید و همچنان یادآوریهای زمانبندیشده اوایل صبح را دریافت کنید. توجه داشته باشید که این ترفند در صورتی که ?BRemind?R را در حالت دیمن اجرا کنید، دیگر ضروری نیست.
remind -c12 /dev/null Jan 1993
این فراخوانی ?BRemind?R باعث میشود که تقویمی برای سال ۱۹۹۳ چاپ شود که تمام خانههای آن خالی هستند.
REM CAL [trigdate()-date(year(trigdate()), 1, 1)+1]
این مثال در هر کادر تقویم مقداری قرار میدهد که شماره روز سال (از ۱ تا ۳۶۵ یا ۳۶۶) را نشان میدهد.
REM Tue 2 Nov SATISFY (year(trigdate())%4) == 0 IF trigvalid() REM [trigdate()] ++5 MSG U.S. Presidential Election!! ENDIF
این مثال ۵ روز پیش از هر انتخابات ریاست جمهوری ایالات متحده به شما هشدار میدهد. نخستین دستور ?BREM?R نخستین سهشنبه پس از اولین دوشنبه نوامبر را محاسبه میکند. (این معادل نخستین سهشنبه در ۲ نوامبر یا پس از آن است.) بند ?BSATISFY?R تضمین میکند که تاریخ محرک تنها در سالهای انتخابات که مضربی از ۴ هستند صادر شود. دستور دوم ?BREM?R در واقع یادآوری را صادر میکند.
جزئیات مربوط به محاسبه محرک (DETAILS ABOUT TRIGGER COMPUTATION)
در اینجا توصیفی ?Iمفهومی?R از نحوه محاسبه محرکها ارائه شده است. توجه داشته باشید که ?BRemind?R در واقع از فرآیند بسیار کارآمدتری استفاده میکند، اما نتایج دقیقاً همانند زمانی است که این فرآیند مفهومی دنبال شده باشد.
?BRemind?R از تاریخ فعلی (یعنی مقدار ?Btoday()?R) شروع میکند و رو به جلو پیمایش مینماید و هر روز را یکی پس از دیگری بررسی میکند تا تاریخی را بیابد که محرک را برآورده سازد، یا اثبات کند که چنین تاریخی (در امروز یا بعد از ?Btoday()?R) وجود ندارد.
اگر ?BRemind?R در حال اجرای یادآوری از نوع ?BSATISFY?R باشد، عبارت را با تنظیم ?Btrigdate()?R روی تاریخ یافتهشده در بالا ارزیابی میکند. اگر مقدار عبارت صفر یا رشته خالی شود، ?BRemind?R روند بررسی توصیفشده در بالا را ادامه میدهد و از روز پس از محرک یافتهشده در بالا شروع میکند.
بند ?BSCANFROM?R (که نحوی مشابه با ?BUNTIL?R دارد) میتواند استراتژی جستجوی مورد استفاده را تغییر دهد. در این حالت، ?BRemind?R فرآیند پیمایش را از ?Iscan_date?R آغاز میکند که تاریخی است که در بند ?BSCANFROM?R مشخص شده است. برای مثال:
REM Mon 1 SCANFROM 17 Jan 1992 MSG Foo
مثال بالا همیشه دارای تاریخ محرک دوشنبه، ۳ فوریه ۱۹۹۲ خواهد بود. زیرا ?BRemind?R بررسی را از ۱۷ ژانویه ۱۹۹۲ آغاز میکند و به محض برخورد با تاریخی که "Mon 1" را برآورده کند، متوقف میشود.
کاربرد اصلی ?BSCANFROM?R در مواردی است که میخواهید موقعیت تعطیلات متحرک را محاسبه کنید. مثال روز کارگر (Labour Day) را که بسیار قبلتر نشان داده شد در نظر بگیرید. روز کارگر نخستین دوشنبه ماه سپتامبر است و میتواند در بازهای ۷ روزه جابهجا شود. دنباله زیر را در نظر بگیرید:
REM Mon 1 Sept SCANFROM [today()-7] ADDOMIT MSG Labour Day REM Mon AFTER MSG Hello
بند ?BSCANFROM?R اطمینان حاصل میکند که ?BRemind?R پیمایش را از ۷ روز قبل از تاریخ جاری شروع کند. این تضمین میکند که روز کارگر برای سال جاری تا ۷ روز پس از وقوع همچنان فعال شود. این به شما امکان میدهد با خیال راحت از کلمه کلیدی AFTER همانطور که نشان داده شد استفاده کنید.
به عنوان یک حالت خاص، میتوانید به سادگی از یک عدد منفی پس از SCANFROM استفاده کنید؛ عدد منفی -N به عنوان N روز پیش از امروز تفسیر میشود. بنابراین، مثال قبلی میتوانست به این صورت نیز نوشته شود:
REM Mon 1 Sept SCANFROM -7 ADDOMIT MSG Labour Day REM Mon AFTER MSG Hello
به یک SCANFROM که یک تاریخ کامل را مشخص میکند ?ISCANFROM مطلق?R و به یک SCANFROM که عدد منفی مشخص میکند ?ISCANFROM نسبی?R گفته میشود.
به طور کلی، از ?BSCANFROM?R همانطور که نشان داده شد برای موارد ?BOMIT?Rهای متحرک ایمن استفاده کنید. مقداری که باید به عقب پیمایش کنید (۷ روز در مثال بالا) به تعداد روزهای متوالی احتمالی که ممکن است ?BOMIT?R شده باشند و به بازه تعطیلات متحرک بستگی دارد. به طور کلی، مقدار ۷ ایمن است.
بند ?BFROM?R تقریباً مانند نقطه مقابل ?BUNTIL?R عمل میکند. این بند از تحریک یادآوری قبل از تاریخ ?BFROM?R جلوگیری میکند. برای مثال، یادآوری زیر:
REM Mon Thu FROM 23 Jul 2007 UNTIL 2 Aug 2007 MSG Test
در دوشنبهها و پنجشنبههای بین ۲۳ ژوئیه ۲۰۰۷ تا ۲ اوت ۲۰۰۷ (شامل خود این تاریخها) فعال خواهد شد.
کلمه کلیدی ?BFROM?R در واقع فقط یک قند نحوی است؛ شما میتوانستید یادآوری بالا را به این شکل پیادهسازی کنید:
REM Mon Thu SCANFROM [max(today(), '2007-07-23')] UNTIL 2 Aug 2007 MSG Test
اما خواندن آن بسیار دشوارتر است. به صورت داخلی، ?BRemind?R با ?BFROM?R دقیقاً همانطور که با استفاده از ?BSCANFROM?R نشان داده شد رفتار میکند. به همین دلیل، شما نمیتوانید همزمان از ?BFROM?R و ?BSCANFROM?R استفاده کنید.
توجه داشته باشید که اگر از یک دستور ?BREM?R برای محاسبه تاریخ محرک استفاده کنید، محاسبات تاریخ (مانند جمع یا تفریق) را انجام دهید و سپس از تاریخ تغییریافته در یک دستور بعدی ?BREM?R استفاده نمایید، نتایج ?Iممکن است آن چیزی نباشد که قصد داشتید.?R زیرا شما سازوکار بررسی عادی را دور زدهاید. باید سعی کنید دستورات ?BREM?R بنویسید که تاریخهای محرکی را محاسبه کنند که بتوانند بدون تغییر در دستورات بعدی ?BREM?R استفاده شوند. فایل "defs.rem" که همراه توزیع ?BRemind?R ارائه میشود شامل نمونههایی است.
جزئیات مربوط به TRIGVALID() (DETAILS ABOUT TRIGVALID())
تابع ?Btrigvalid()?R اگر ?BRemind?R بتواند یک تاریخ محرک برای دستور قبلی ?BREM?R یا ?BIFTRIG?R بیابد، عدد 1 را برمیگرداند. به طور دقیقتر، اگر ?BRemind?R تاریخی ?Iنه قبل از تاریخ شروع پیمایش?R بیابد که محرک را ارضا کند، عدد 1 برمیگرداند. علاوه بر این، یک مورد خاص وجود دارد که در آن ?Btrigvalid()?R عدد 1 برمیگرداند و ?Btrigdate()?R نتیجهای معنادار بازمیگرداند:
اگر دستور ?BREM?R یا ?BIFTRIG?R شامل بند ?BUNTIL?R یا ?BSATISFY?R نبوده و شامل تمامی مؤلفههای ?Iday?R، ?Imonth?R و ?Iyear?R باشد، آنگاه ?BRemind?R به درستی تاریخ محرک را محاسبه خواهد کرد، حتی اگر قبل از شروع پیمایش قرار گیرد. توجه داشته باشید که این رفتار در نسخههای قبل از 03.00.01 در ?BRemind?R صادق نبوده است.
فایلها (FILES)
محل سنتی نگهداری فایل یا پوشه یادآوریهای شما به شرح زیر است:
$HOME/.reminders
که در آن ?B$HOME?R پوشه خانگی شماست.
?BRemind?R به همراه فایلهای از پیش نصبشدهای برای تعطیلات و بستههای زبان ارائه میشود. این فایلها در پوشه زیر قرار دارند:
/usr/share/remind
مسیر بالا را در فایلهای یادآوری خود به صورت هاردکد قرار ندهید. در عوض، از مقدار متغیر سیستمی $SysInclude استفاده کنید.
نویسنده (AUTHOR)
داین اسکول (Dianne Skoll) <dianne@skoll.ca> برنامه ?BRemind?R را نوشته است. کد اهله ماه عمدتاً بدون تغییر از "moontool" اثر جان واکر (John Walker) کپی شده است. کد طلوع/غروب ماه از https://github.com/signetica/MoonRise اثر استیون آر. اشمیت (Stephen R. Schmitt) و کوروش رحمان (Cyrus Rahman) اقتباس شده است. توابع طلوع و غروب خورشید از ایدههای برنامههای مایکل شوارتز (Michael Schwartz) و مارک تی. کافمن (Marc T. Kaufman) بهره میبرند. پشتیبانی تقویم عبری از "hdate" اثر عاموس شاپیر (Amos Shapir) برگرفته شده است. زبانهای پشتیبانیشده و مترجمان آنها در زیر فهرست شدهاند. زبانهای علامتگذاریشده با "complete" از پیامهای خطا به آن زبان نیز پشتیبانی میکنند؛ سایر زبانها تنها از سازوکار فیلتر جایگزینی و نامهای ماه/روز پشتیبانی مینمایند.
?Bآلمانی?R -- Wolfgang Thronicke
?Bهلندی?R -- Willem Kasdorp and Erik-Jan Vens
?Bفنلاندی?R -- Mikko Silvonen (complete)
?Bفرانسوی?R -- Laurent Duperval (complete)
?Bنروژی?R -- Trygve Randen
?Bدانمارکی?R -- Mogens Lynnerup
?Bلهستانی?R -- Jerzy Sobczyk (complete)
?Bپرتغالی برزیلی?R -- Marco Paganini (complete)
?Bایتالیایی?R -- Valerio Aimale
?Bرومانیایی?R -- Liviu Daia
?Bاسپانیایی?R -- Rafa Couto
?Bایسلندی?R -- Björn Davíðsson
اشکالات (BUGS)
اگر اشکالی در Remind پیدا کردید، لطفاً آن را به dianne@skoll.ca گزارش دهید.
هیچ دلیل موجهی وجود ندارد که چرا متغیرهای سیستمی فقطخواندنی به عنوان تابع پیادهسازی نشدهاند، یا چرا توابعی مانند ?Bversion()?R و غیره به عنوان متغیرهای سیستمی فقطخواندنی پیادهسازی نشدهاند.
تاریخهای عبری در ?BRemind?R به جای غروب آفتاب، در نیمهشب تغییر میکنند.
?BRemind?R دارای برخی محدودیتهای داخلی است (برای مثال، تعداد ?BOMIT?Rهای سراسری).
کتابشناسی (BIBLIOGRAPHY)
Nachum Dershowitz and Edward M. Reingold, "Calendrical Calculations", ?ISoftware-Practice and Experience?R, Vol. 20(9), Sept. 1990, pp 899-928.
L. E. Doggett, ?IAlmanac for computers for the year 1978?R, Nautical Almanac Office, USNO.
Richard Siegel and Michael and Sharon Strassfeld, ?IThe First Jewish Catalog?R, Jewish Publication Society of America.
Jean Meeus, ?IAstronomical Algorithms, Second Edition?R, Willmann-Bell, Inc.
صفحه خانگی (HOME PAGE)
فهرست پستی (MAILING LIST)
همچنین ببینید (SEE ALSO)
?Brem?R(1), ?Brem2ps?R(1), ?Brem2pdf?R(1), ?Btkremind?R(1), ?Brem2html?R(1)
| 2026-06-05 | Remind |