همانطور که در قسمت قبل چند تا از سیگنالهایی را که زمان فشرده شدن کلید به ترمینال فرستاده میشوند را غیرفعال (disable) کردیم، در این قسمت هم به همان کار خواهیم پرداخت.
Ctrl+V
در بعضی از سیستمها فشار دادن کلید Ctrl+V باعث میشود تا ترمینال صبر کند تا یک کاراکتر دیگر فشار دهید و سپس آن کاراکتر را میفرستد (شما بگیرد اساسا کار خاصی نمیکند (البته میدهد!) ولی شما همان کار خاصی نمیکند در نظر بگیرید).
برای غیرفعال کردن این ویژگی باید IEXTEN
را در c_lflag
قرار دهیم. مانند زیر:
struct termios raw = orig_terminal; raw.c_iflag &= ~(IXON) // for Ctrl+Q and Ctrl+S raw.c_lflag &= ~(ECHO /* disable character echoing */ | ISIG /* disable Ctrl+C & Ctrl+Z */ | ICANON /* disable CANONICAL mode */ | IEXTEN /* disable Ctrl+V */)
ثابت IEXTEN
هم مانند دیگر کانستهای مربوطه از <termios.h>
میآید و اگرچه با I شروع میشود اما یک local flag هست و در c_lflag جا میگیرد.
کلید M^ آخرین کلیدی نیست که قرار هست غیرفعالش کنیم! آخرین کلیدی که قرار بر غیرفعال کردنش بود Ctrl+V بود که در بالا گفتم.
اما اگر آخرین کلیدی که قرار بود خاموشش کنیم Ctrl+V بود، پس چه بلایی را برای M^ رقم بزنیم؟
اگر عنوان این بخش را درست خوانده باشید، من از واژه تغییر بهجای واژه غیرفعال استفاده کردم. پس ما قرار هست تغیری در سیگنالی که این کلید ارسال میکند انجام دهیم.
الان اگر یکی به یکی امتحان کند Ctrl+$$ میبینید که ۲۵ حرف از ۲۶ حرف الفبای انگلیسی کار میکند اما Ctrl+M را ۱۰ میخواند در حالی که M حرف 13ام الفبای انگلیسی هست.
کلیدهای Ctrl+J و enter هم باعث به وجود آمدن سیگنال 10 میشوند
این ویژگی باعث میشود که 'r\'
به 'n\'
تبدیل شود. الان هم میخواهیم این قابلیت را غیرفعال کنیم.
نکته: carriage return نامی برای'r\'
هست.
raw.c_iflag &= ~(IXON | ICRNL); raw.c_lflag &= ~(ECHO | ISIG | ICANON | IEXTEN )
ثابت ICRNL
از <termios.h>
میآید.
مثل ثابتهایی که در c_iflag هستند با I شروع میشود که خلاصهی Input هست. همچنین CR به معنای carriage return هست و NL برای NewLine میباشد.
الان هم M^ و هم enter برابر با ۱۰ هستند و معنی'r\'
میدهند.
قبول دارم خیلی دیر بود و آموزش کوتاهی بود. ولی (نا)خوشبختانه این را نوشتم.
بدورد تا قسمت بعدی. راستی [تا یادم نرفته] لطفا به من بگویید که بهتر میشود تمام قسمتهای این آموزش را در یک پست لینک دهم؟ یا ویرگول مسدودم میکند؟