| terminfo(5) | تنسيقات الملفات | terminfo(5) |
الاسم¶
terminfo - قاعدة بيانات قدرات الطرفية
موجز¶
/etc/terminfo/*/*
الوصف¶
Terminfo هي قاعدة بيانات تصف الطرفيات، تستخدمها البرامج الموجهة للشاشة مثل nvi(1)، و lynx(1)، و mutt(1)، وتطبيقات curses الأخرى، باستخدام استدعاءات عالية المستوى لمكتبات مثل ncurses(3NCURSES). تُستخدم أيضًا عبر استدعاءات منخفضة المستوى بواسطة تطبيقات غير تابعة لـ curses والتي قد تكون موجهة للشاشة (مثل clear(1)) أو غير موجهة للشاشة (مثل tabs(1)).
تصف Terminfo الطرفيات عبر إعطاء مجموعة من القدرات التي تمتلكها، ومن خلال تحديد كيفية تنفيذ عمليات الشاشة، وتحديد متطلبات الحشو وتسلسلات التهيئة.
يصف هذا المستند الإصدار 6.6 من ncurses (الرقعة 20251231).
صيغة مدخلات terminfo¶
تتكون المدخلات في terminfo من تسلسل من الحقول:
- ينتهي كل حقل بفاصلة “,” (يمكن الهروب من الفواصل المضمنة باستخدام مائلة عكسية أو كتابتها كـ “\054”).
- تُتجاهل المساحات البيضاء بين الحقول.
- يبدأ الحقل الأول في مدخلة terminfo في العمود الأول.
- يمكن استخدام الأسطر الجديدة والمساحات البيضاء البادئة (مسافات أو علامات جدولة) لتنسيق المدخلات من أجل القراءة. تُزال هذه من المدخلات المحللة.
- تعتمد خيارات infocmp المتمثلة في -f و -W على هذا لتنسيق تعبيرات if-then-else، أو لفرض حد أقصى لعرض السطر. يمكن قراءة وصف الطرفية المنسق الناتج بواسطة tic.
- •
- يعطي الحقل الأول لكل طرفية الأسماء المعروفة للطرفية، مفصولة بمحارف “|”.
- الاسم الأول المعطى هو الاختصار الأكثر شيوعًا للطرفية (اسمها الرئيس)، والاسم الأخير المعطى يجب أن يكون اسمًا طويلًا يحدد الطرفية تمامًا (انظر longname(3NCURSES))، وتُعامل جميع الأسماء الأخرى كمرادفات (أسماء مستعارة) لاسم الطرفية الرئيس.
- تنصح X/Open Curses بأن تكون جميع الأسماء باستثناء الأخير بأحرف صغيرة ولا تحتوي على فراغات؛ بينما قد يحتوي الاسم الأخير على أحرف كبيرة وفراغات من أجل القراءة.
- هذا التطبيق ليس صارمًا جدًا؛ فهو يسمح بحالة أحرف مختلطة في الاسم الرئيس والأسماء المستعارة. إذا كان الاسم الأخير لا يحتوي على فراغات مضمنة، فإنه يسمح بأن يكون اسمًا مستعارًا واسمًا مسهبًا في آن واحد (ولكن سيُحذر من هذا الغموض).
- •
- تُعامل الأسطر التي تبدأ بـ “#” في العمود الأول كتعليقات.
- بينما تُعد أسطر التعليقات صالحة في أي نقطة، فإن مخرجات captoinfo و infotocap (أسماء مستعارة لـ tic) ستنقل التعليقات بحيث تظهر فقط بين المدخلات.
يجب اختيار أسماء الطرفيات (باستثناء المدخلة المسهبة الأخيرة) باستخدام الاصطلاحات التالية. يجب أن يكون لقطعة الأجهزة المكونة للطرفية اسم جذر، مثل “hp2621”). يجب ألا يحتوي هذا الاسم على شرطات. أما الأنماط التي يمكن أن تكون عليها الأجهزة، أو تفضيلات المستخدم، فيجب الإشارة إليها بإلحاق شرطة ولاحقة نمط. وهكذا، فإن vt100 في نمط 132 عمودًا ستكون vt100-w. يجب استخدام اللواحق التالية حيثما أمكن:
| لاحقة (Suffix) | مثال | المعنى |
| -nn | aaa-60 | عدد الأسطر على الشاشة |
| -np | c100-4p | عدد صفحات الذاكرة |
| -am | vt100-am | بهوامش آلية (عادة ما يكون الوضع المبدئي) |
| -m | ansi-m | النمط الأحادي؛ يعطل الألوان |
| -mc | wy30-mc | ملف تعريف ارتباط سحري؛ مسافات عند التمييز |
| -na | c100-na | لا توجد مفاتيح أسهم (تُترك محلية) |
| -nam | vt100-nam | بدون هوامش آلية |
| -nl | hp2621-nl | لا يوجد سطر حالة |
| -ns | hp2626-ns | لا يوجد سطر حالة |
| -rv | c100-rv | فيديو عكسي |
| -s | vt100-s | تفعيل سطر الحالة |
| -vb | wy370-vb | استخدام الجرس المرئي بدلاً من الصافرة |
| -w | vt100-w | النمط العريض (> 80 عمودًا، عادة 132) |
لمزيد من المعلومات حول اصطلاحات تسمية الطرفيات، انظر صفحة الدليل term(7).
صيغة قدرات terminfo¶
تتكون مدخلة terminfo من عدة قدرات، أي ميزات تمتلكها الطرفية، أو طرق لممارسة ميزات الطرفية.
بعد الحقل الأول (الذي يعطي اسم (أسماء) مدخلة الطرفية)، يجب أن يكون هناك حقل قدرة واحد أو أكثر. هذه أسماء منطقية أو عددية أو نصية مع القيم المقابلة لها:
- تكون القدرات المنطقية صحيحة عند وجودها، وخاطئة عند غيابها. لا توجد قيمة صريحة للقدرات المنطقية.
- تحتوي القدرات العددية على “#” يتبع الاسم، ثم قيمة عددية عشرية غير موقعة.
- تحتوي القدرات النصية على “=” يتبع الاسم، ثم سلسلة من المحارف التي تشكل قيمة القدرة.
- يمكن تقسيم القدرات النصية إلى عدة أسطر، تمامًا كما يمكن تقسيم الحقول التي تتكون منها مدخلة الطرفية إلى عدة أسطر. بينما تُتجاهل الفراغات بين الحقول، فإن الفراغات المضمنة داخل قيمة نصية يتم الاحتفاظ بها، باستثناء الفراغات البادئة في السطر.
يمكن إلغاء أي قدرة، أي حجبها من مدخلة الطرفية، عن طريق اتباع اسمها بـ “@” بدلاً من قيمة القدرة.
طرفيات مماثلة¶
إذا كان هناك طرفيتان متماثلتان جدًا، يمكن تعريف إحداهما (المتغيرة) على أنها تمامًا مثل الأخرى (القاعدة) مع استثناءات معينة. في تعريف المتغيرة، يمكن إعطاء القدرة النصية use مع اسم الطرفية القاعدة:
- تتجاوز القدرات المعطاة قبل use تلك الموجودة في النوع القاعدة المسمى بواسطة use.
- إذا كانت هناك قدرات use متعددة، فتُدمج بترتيب عكسي. أي أن مرجع use الموجود في أقصى اليمين يعالج أولاً، ثم المرجع الذي إلى يساره، وهكذا.
- تتجاوز القدرات المعطاة صراحة في المدخلة تلك التي تم جلبها بواسطة مراجع use.
يمكن إلغاء قدرة بوضع xx@ إلى يسار مرجع use الذي يستوردها، حيث xx هو القدرة. على سبيل المثال، المدخلة
2621-nl, smkx@, rmkx@, use=2621,
تُعرّف 2621-nl التي لا تمتلك قدرات smkx أو rmkx، وبالتالي لا تُفعّل لصائق مفاتيح الوظائف عندما تكون في النمط المرئي. هذا مفيد لأنماط مختلفة للطرفية، أو لتفضيلات المستخدم المختلفة.
يمكن للمدخلة المضمنة عبر use أن تحتوي على قدرات ملغاة، والتي لها نفس التأثير كما لو كانت تلك الإلغاءات مدرجة في مدخلة الطرفية المستخدمة.
القدرات القياسية¶
تلي ذلك جداول القدرات التي تتعرف عليها ncurses في وصف نوع طرفية terminfo والمتاحة للكود المستخدم لـ terminfo.
- يحدد اسم القدرة الرمز الذي يصل من خلاله المبرمج الذي يستخدم واجهة برمجة تطبيقات terminfo إلى القدرة.
- كود TI (terminfo) هو الاسم المختصر الذي يستخدمه الشخص الذي ينشئ أو يحدث مدخلة نوع الطرفية.
- كلما أمكن، تكون هذه الأكواد هي نفسها أو مشابهة لتلك الموجودة في معيار ANSI X3.64-1979 (الذي حل محله الآن ECMA-48، والذي يستخدم أسماء مطابقة أو مشابهة جدًا). تهدف الدلالات أيضًا إلى مطابقة تلك الخاصة بالمواصفة.
- لا تمتلك أكواد terminfo حدًا صارمًا للطول، ولكن ncurses تحافظ على حد غير رسمي من 5 محارف لإبقائها قصيرة وللسماح لعلامات الجدولة في ملف المصدر Caps بالاصطفاف بشكل جيد. (تتجاوز بعض الأكواد القياسية هذا الحد بغض النظر عن ذلك).
- كود TC (termcap) هو الكود المستخدم بواسطة واجهة برمجة التطبيقات المقابلة لـ ncurses. (بعض القدرات جديدة، ولها أسماء لم تبتكرها BSD termcap).
- يحاول حقل الوصف نقل دلالات القدرة.
يوظف حقل الوصف بضع ترميزات.
- (P)
- يشير إلى إمكانية تحديد حشو.
- (P*)
- يشير إلى أن الحشو قد يختلف بالتناسب مع عدد أسطر المخرجات المتأثرة.
- #i
- يشير إلى المعامل رقم i لقدرة سلسلة نصية؛ يجب على المبرمج تمرير السلسلة إلى tparm(3NCURSES) مع المعاملات المدرجة.
- إذا لم تسرد
الوصف أي
معاملات،
فإن تمرير
السلسلة
إلى tparm(3NCURSES) قد
ينتج عنه
سلوك غير
متوقع، على
سبيل
المثال إذا
كانت
السلسلة
تحتوي على
علامات
مئوية.
| الكود | |||
| اسم القدرة المنطقية | TI | TC | الوصف |
| auto_left_margin | bw | bw | cub1 يلتف من العمود 0 إلى العمود الأخير |
| auto_right_margin | am | am | الطرفية لها هوامش آلية |
| no_esc_ctlc | xsb | xb | beehive (f1=escape, f2=ctrl C) |
| ceol_standout_glitch | xhp | xs | التمييز لا يُمحى بالكتابة الفوقية (hp) |
| eat_newline_glitch | xenl | xn | تُتجاهل السطر الجديد بعد 80 عمودًا (concept) |
| erase_overstrike | eo | eo | يمكن مسح الكتابة الفوقية بفراغ |
| generic_type | gn | gn | نوع سطر عام |
| hard_copy | hc | hc | طرفية نسخة مطبوعة |
| has_meta_key | km | km | تمتلك مفتاح meta (أي تضبط البت الثامن) |
| has_status_line | hs | hs | تمتلك سطر حالة إضافي |
| insert_null_glitch | in | in | نمط الإدراج يميز المحارف الفارغة (nulls) |
| memory_above | da | da | قد يتم الاحتفاظ بالعرض فوق الشاشة |
| memory_below | db | db | يمكن الاحتفاظ بالعرض تحت الشاشة |
| move_insert_mode | mir | mi | من الآمن التحرك أثناء وضع الإدراج |
| move_standout_mode | msgr | ms | من الآمن التحرك أثناء وضع الإبراز |
| over_strike | os | os | بإمكان الطرفية الكتابة فوق المحارف |
| status_line_esc_ok | eslok | es | يمكن استخدام مفتاح الهروب (escape) في سطر الحالة |
| dest_tabs_magic_smso | xt | xt | علامات الجدولة مدمرة، محرف so سحري (t1061) |
| tilde_glitch | hz | hz | لا يمكن طباعة ~ (Hazeltine) |
| transparent_underline | ul | ul | محرف التسطير يكتب فوق المحارف |
| xon_xoff | xon | xo | تستخدم الطرفية مصافحة xon/xoff |
| needs_xon_xoff | nxon | nx | لن تعمل الحشو (padding)، يتطلب xon/xoff |
| prtr_silent | mc5i | 5i | الطابعة لن تظهر صدى على الشاشة |
| hard_cursor | chts | HC | يصعب رؤية المؤشر |
| non_rev_rmcup | nrrmc | NR | smcup لا يعكس rmcup |
| no_pad_char | npc | NP | محرف الحشو غير موجود |
| non_dest_scroll_region | ndscr | ND | منطقة التمرير غير مدمرة |
| can_change | ccc | cc | بإمكان الطرفية إعادة تعريف الألوان الحالية |
| back_color_erase | bce | ut | مُسحت الشاشة بلون الخلفية |
| hue_lightness_saturation | hls | hl | تستخدم الطرفية تمثيل الألوان HLS فقط (Tektronix) |
| col_addr_glitch | xhpa | YA | حركة موجبة فقط لإمكانيات hpa/mhpa |
| cr_cancels_micro_mode | crxm | YB | استخدام cr يوقف الوضع الدقيق (micro mode) |
| has_print_wheel | daisy | YC | تحتاج الطابعة إلى عامل لتغيير طقم المحارف |
| row_addr_glitch | xvpa | YD | حركة موجبة فقط لإمكانيات vpa/mvpa |
| semi_auto_right_margin | sam | YE | الطباعة في العمود الأخير تسبب cr |
| cpi_changes_res | cpix | YF | تغيير خطوة المحارف يغير الدقة |
| lpi_changes_res | lpix | YG | تغيير خطوة السطر يغير الدقة |
| الكود | |||
| اسم الإمكانية الرقمية | TI | TC | الوصف |
| أعمدة | cols | co | عدد الأعمدة في السطر |
| init_tabs | it | it | علامات الجدولة مبدئياً كل # مسافات |
| lines | lines | li | عدد الأسطر على الشاشة أو الصفحة |
| lines_of_memory | lm | lm | أسطر الذاكرة إذا كانت > من السطر. 0 تعني أنها متفاوتة |
| magic_cookie_glitch | xmc | sg | عدد المحارف الفارغة المتروكة بواسطة smso أو rmso |
| padding_baud_rate | pb | pb | أدنى معدل باود حيث يلزم الحشو |
| virtual_terminal | vt | vt | رقم الطرفية الافتراضية (CB/يونكس) |
| width_status_line | wsl | ws | عدد الأعمدة في سطر الحالة |
| num_labels | nlab | Nl | عدد اللصائق على الشاشة |
| label_height | lh | lh | الأسطر في كل لصيقة |
| label_width | lw | lw | الأعمدة في كل لصيقة |
| max_attributes | ma | ma | أقصى سمات مدمجة يمكن للطرفية التعامل معها |
| maximum_windows | wnum | MW | أقصى عدد من النوافذ القابلة للتعريف |
| max_colors | colors | Co | أقصى عدد من الألوان على الشاشة |
| max_pairs | pairs | pa | أقصى عدد من أزواج الألوان على الشاشة |
| no_color_video | ncv | NC | سمات الفيديو التي لا يمكن استخدامها مع الألوان |
القدرات الرقمية التالية موجودة في بنية term الخاصة بـ SVr4.0، لكنها ليست موثقة بعد في صفحة الدليل. أُضيفت مع دعم الطابعة في SVr4.
| الكود | |||
| اسم الإمكانية الرقمية | TI | TC | الوصف |
| buffer_capacity | bufsz | Ya | عدد البايتات المخبأة قبل الطباعة |
| dot_vert_spacing | spinv | Yb | تباعد السنون عمودياً بالسن في البوصة الواحدة |
| dot_horz_spacing | spinh | Yc | تباعد النقاط أفقياً بالنقطة في البوصة الواحدة |
| max_micro_address | maddr | Yd | القيمة القصوى في micro_..._address |
| max_micro_jump | mjump | Ye | القيمة القصوى في parm_..._micro |
| micro_col_size | mcs | Yf | حجم خطوة المحرف عند التواجد في الوضع الدقيق |
| micro_line_size | mls | Yg | حجم خطوة السطر عند التواجد في الوضع الدقيق |
| number_of_pins | npins | Yh | عدد السنون في رأس الطباعة |
| output_res_char | orc | Yi | الدقة الأفقية بالوحدات في السطر الواحد |
| output_res_line | orl | Yj | الدقة العمودية بالوحدات في السطر الواحد |
| output_res_horz_inch | orhi | Yk | الدقة الأفقية بوحدات لكل بوصة |
| output_res_vert_inch | orvi | Yl | الدقة العمودية بوحدات لكل بوصة |
| print_rate | cps | Ym | معدل الطباعة بالمحارف في الثانية |
| wide_char_size | widcs | Yn | حجم خطوة المحرف عند التواجد في وضع العرض المزدوج |
| buttons | btns | BT | عدد الأزرار في الفأرة |
| bit_image_entwining | bitwin | Yo | عدد الممرات لكل صف من صورة البتات |
| bit_image_type | bitype | Yp | نوع جهاز صورة البتات |
| الكود | |||
| اسم قدرة السلسلة | TI | TC | الوصف |
| back_tab | cbt | bt | علامة جدولة خلفية (P) |
| bell | bel | bl | إشارة مسموعة (جرس) (P) |
| carriage_return | cr | cr | رجوع العربة (P*) (P*) |
| change_scroll_region | csr | cs | تغيير المنطقة إلى السطر #1 إلى السطر #2 (P) |
| clear_all_tabs | tbc | ct | مسح كل علامات الجدولة (P) |
| clear_screen | clear | cl | مسح الشاشة وإرجاع المؤشر إلى البيت (P*) |
| clr_eol | el | ce | مسح حتى نهاية السطر (P) |
| clr_eos | ed | cd | مسح حتى نهاية الشاشة (P*) |
| column_address | hpa | ch | الموضع الأفقي #1، مطلق (P) |
| command_character | cmdch | CC | محرف أمر قابل للضبط في الطرفية في النموذج الأولي !؟ |
| cursor_address | cup | cm | الانتقال إلى الصف #1 والأعمدة #2 |
| cursor_down | cud1 | do | النزول سطراً واحداً |
| cursor_home | home | ho | إرجاع المؤشر للبيت (في حال عدم وجود cup) |
| cursor_invisible | civis | vi | جعل المؤشر غير مرئي |
| cursor_left | cub1 | le | التحرك يساراً مسافة واحدة |
| cursor_mem_address | mrcup | CM | عنونة المؤشر بالنسبة للذاكرة، الانتقال إلى الصف #1 والأعمدة #2 |
| cursor_normal | cnorm | ve | جعل المؤشر يبدو طبيعياً (التراجع عن civis/cvvis) |
| cursor_right | cuf1 | nd | مسافة غير هادمة (التحرك يميناً مسافة واحدة) |
| cursor_to_ll | ll | ll | السطر الأخير، العمود الأول (في حال عدم وجود cup) |
| cursor_up | cuu1 | up | الصعود سطراً واحداً |
| cursor_visible | cvvis | vs | جعل المؤشر مرئياً جداً |
| delete_character | dch1 | dc | حذف محرف (P*) |
| delete_line | dl1 | dl | حذف سطر (P*) |
| dis_status_line | dsl | ds | تعطيل سطر الحالة |
| down_half_line | hd | hd | نصف سطر للأسفل |
| دخول_وضع_مجموعة_المحارف_البديلة | smacs | as | بدء مجموعة المحارف البديلة (P) |
| enter_blink_mode | blink | mb | تشغيل الوميض |
| enter_bold_mode | bold | md | تشغيل الوضع العريض (الساطع جداً) |
| enter_ca_mode | smcup | ti | سلسلة لبدء البرامج باستخدام cup |
| enter_delete_mode | smdc | dm | دخول وضع الحذف |
| دخول_وضع_الخفوت | dim | mh | تشغيل وضع نصف السطوع |
| enter_insert_mode | smir | im | دخول وضع الإدراج |
| enter_secure_mode | invis | mk | تشغيل الوضع الفارغ (المحارف غير مرئية) |
| enter_protected_mode | prot | mp | تشغيل الوضع المحمي |
| enter_reverse_mode | rev | mr | تشغيل وضع الفيديو المعكوس |
| enter_standout_mode | smso | so | بدء وضع التميز |
| enter_underline_mode | smul | us | بدء وضع التسطير |
| erase_chars | ech | ec | مسح #1 محارف (P) |
| exit_alt_charset_mode | rmacs | ae | إنهاء مجموعة المحارف البديلة (P) |
| exit_attribute_mode | sgr0 | me | إيقاف تشغيل جميع السمات |
| exit_ca_mode | rmcup | te | سلاسل لإنهاء البرامج باستخدام cup |
| exit_delete_mode | rmdc | ed | إنهاء وضع الحذف |
| exit_insert_mode | rmir | ei | الخروج من وضع الإدراج |
| exit_standout_mode | rmso | se | الخروج من وضع التميز |
| exit_underline_mode | rmul | ue | الخروج من وضع التسطير |
| flash_screen | وميض | vb | جرس مرئي (قد لا يحرك المؤشر) |
| form_feed | ff | ff | إخراج صفحة المحطة الورقية (P*) |
| from_status_line | fsl | fs | العودة من سطر الحالة |
| init_1string | is1 | i1 | سلسلة التهيئة |
| init_2string | is2 | is | سلسلة التهيئة |
| init_3string | is3 | i3 | سلسلة التهيئة |
| init_file | if | if | اسم ملف التهيئة |
| insert_character | ich1 | ic | إدراج محرف (P) |
| insert_line | il1 | al | إدراج سطر (P*) |
| insert_padding | ip | ip | إدراج حشو بعد المحرف المدرج |
| key_backspace | kbs | kb | مفتاح مسافة للخلف |
| key_catab | ktbc | ka | مفتاح مسح كافة الجدولة |
| key_clear | kclr | kC | مفتاح مسح الشاشة أو الحذف |
| key_ctab | kctab | kt | مفتاح مسح الجدولة |
| key_dc | kdch1 | kD | مفتاح حذف محرف |
| key_dl | kdl1 | kL | مفتاح حذف سطر |
| key_down | kcud1 | kd | مفتاح السهم السفلي |
| key_eic | krmir | kM | أُرسل بواسطة rmir أو smir في وضع الإدراج |
| key_eol | kel | kE | مفتاح المسح حتى نهاية السطر |
| key_eos | ked | kS | مفتاح المسح حتى نهاية الشاشة |
| key_f0 | kf0 | k0 | مفتاح الوظيفة F0 |
| key_f1 | kf1 | k1 | مفتاح الوظيفة F1 |
| مفتاح_f10 | kf10 | k; | مفتاح الوظيفة F10 |
| key_f2 | kf2 | k2 | مفتاح الوظيفة F2 |
| key_f3 | kf3 | k3 | مفتاح الوظيفة F3 |
| key_f4 | kf4 | k4 | مفتاح الوظيفة F4 |
| key_f5 | kf5 | k5 | مفتاح الوظيفة F5 |
| key_f6 | kf6 | k6 | مفتاح الوظيفة F6 |
| key_f7 | kf7 | k7 | مفتاح الوظيفة F7 |
| key_f8 | kf8 | k8 | مفتاح الوظيفة F8 |
| key_f9 | kf9 | k9 | مفتاح الوظيفة F9 |
| key_home | khome | kh | مفتاح البيت (home) |
| key_ic | kich1 | kI | مفتاح إدراج محرف |
| key_il | kil1 | kA | مفتاح إدراج سطر |
| key_left | kcub1 | kl | مفتاح السهم الأيسر |
| key_ll | kll | kH | مفتاح أسفل اليسار (البيت لأسفل) |
| key_npage | knp | kN | مفتاح الصفحة التالية |
| key_ppage | kpp | kP | مفتاح الصفحة السابقة |
| key_right | kcuf1 | kr | مفتاح السهم الأيمن |
| key_sf | kind | kF | مفتاح التمرير للأمام |
| key_sr | kri | kR | مفتاح التمرير للخلف |
| key_stab | khts | kT | مفتاح ضبط علامة الجدولة |
| key_up | kcuu1 | ku | مفتاح السهم العلوي |
| keypad_local | rmkx | ke | غادر وضع إرسال لوحة المفاتيح الرقمية |
| keypad_xmit | smkx | ks | ادخل وضع إرسال لوحة المفاتيح الرقمية |
| lab_f0 | lf0 | l0 | لصيقة على مفتاح الوظيفة f0 إن لم يكن f0 |
| lab_f1 | lf1 | l1 | لصيقة على مفتاح الوظيفة f1 إن لم يكن f1 |
| lab_f10 | lf10 | la | لصيقة على مفتاح الوظيفة f10 إن لم يكن f10 |
| lab_f2 | lf2 | l2 | لصيقة على مفتاح الوظيفة f2 إن لم يكن f2 |
| lab_f3 | lf3 | l3 | لصيقة على مفتاح الوظيفة f3 إن لم يكن f3 |
| lab_f4 | lf4 | l4 | لصيقة على مفتاح الوظيفة f4 إن لم يكن f4 |
| lab_f5 | lf5 | l5 | لصيقة على مفتاح الوظيفة f5 إن لم يكن f5 |
| lab_f6 | lf6 | l6 | لصيقة على مفتاح الوظيفة f6 إن لم يكن f6 |
| lab_f7 | lf7 | l7 | لصيقة على مفتاح الوظيفة f7 إن لم يكن f7 |
| lab_f8 | lf8 | l8 | لصيقة على مفتاح الوظيفة f8 إن لم يكن f8 |
| lab_f9 | lf9 | l9 | لصيقة على مفتاح الوظيفة f9 إن لم يكن f9 |
| meta_off | rmm | mo | أوقف وضع ميتا (meta) |
| meta_on | smm | mm | شغل وضع ميتا (meta) (تفعيل البت الثامن) |
| newline | nel | nw | سطر جديد (يتصرف مثل cr متبوعًا بـ lf) |
| pad_char | pad | pc | محرف الحشو (بدلًا من null) |
| parm_dch | dch | DC | احذف #1 محرفًا (P*) |
| parm_delete_line | dl | DL | احذف #1 سطرًا (P*) |
| parm_down_cursor | cud | DO | انزل #1 سطرًا (P*) |
| parm_ich | ich | IC | أدرج #1 محرفًا (P*) |
| parm_index | indn | SF | مرر للأمام #1 سطرًا (P) |
| parm_insert_line | il | AL | أدرج #1 سطرًا (P*) |
| parm_left_cursor | cub | LE | حرك #1 محرفًا لليسار (P) |
| parm_right_cursor | cuf | RI | حرك #1 محرفًا لليمين (P*) |
| parm_rindex | rin | SR | مرر للخلف #1 سطرًا (P) |
| parm_up_cursor | cuu | لأعلى | ارفع #1 سطرًا (P*) |
| pkey_key | pfkey | pk | برمج مفتاح الوظيفة رقم #1 لكتابة السلسلة رقم #2 |
| pkey_local | pfloc | pl | برمج مفتاح الوظيفة رقم #1 لتنفيذ السلسلة رقم #2 |
| pkey_xmit | pfx | px | برمج مفتاح الوظيفة رقم #1 لإرسال السلسلة رقم #2 |
| print_screen | mc0 | ps | اطبع محتويات الشاشة |
| prtr_off | mc4 | pf | أوقف الطابعة |
| prtr_on | mc5 | po | شغل الطابعة |
| repeat_char | rep | rp | كرر المحرف رقم #1 لعدد #2 مرة (P*) |
| reset_1string | rs1 | r1 | سلسلة إعادة الضبط |
| reset_2string | rs2 | r2 | سلسلة إعادة الضبط |
| reset_3string | rs3 | r3 | سلسلة إعادة الضبط |
| reset_file | rf | rf | اسم ملف إعادة الضبط |
| restore_cursor | rc | rc | استعد المؤشر إلى موضع آخر save_cursor |
| row_address | vpa | cv | الموضع العمودي رقم #1 مطلق (P) |
| save_cursor | sc | sc | احفظ موضع المؤشر الحالي (P) |
| scroll_forward | ind | sf | مرر النص للأعلى (P) |
| scroll_reverse | ri | sr | مرر النص للأسفل (P) |
| set_attributes | sgr | sa | عرف سمات الفيديو من #1 إلى #9 (PG9) |
| set_tab | hts | st | عين علامة جدولة في كل سطر، في الأعمدة الحالية |
| set_window | wind | wi | النافذة الحالية هي الأسطر #1-#2 والأعمدة #3-#4 |
| tab | ht | ta | انتقل لعلامة الجدولة العتادية التالية ذات الـ 8 مسافات |
| to_status_line | tsl | ts | انتقل إلى سطر الحالة، العمود رقم #1 |
| underline_char | uc | uc | ضع خطاً تحت المحرف وانتقل لما بعده |
| up_half_line | hu | hu | نصف سطر للأعلى |
| init_prog | iprog | iP | اسم مسار البرنامج لبدء التهيئة |
| key_a1 | ka1 | K1 | أعلى يسار لوحة المفاتيح الرقمية |
| key_a3 | ka3 | K3 | أعلى يمين لوحة المفاتيح الرقمية |
| key_b2 | kb2 | K2 | مركز لوحة المفاتيح الرقمية |
| key_c1 | kc1 | K4 | أسفل يسار لوحة المفاتيح الرقمية |
| key_c3 | kc3 | K5 | أسفل يمين لوحة المفاتيح الرقمية |
| prtr_non | mc5p | pO | شغّل الطابعة لمقدار #1 بايت |
| char_padding | rmp | rP | مثل ip لكن عند التواجد في نمط الإدراج |
| acs_chars | acsc | ac | أزواج محارف الرسوميات، مبنية على vt100 |
| plab_norm | pln | pn | برمج الوسم #1 لعرض السلسلة #2 |
| key_btab | kcbt | kB | مفتاح التبويب الخلفي |
| enter_xon_mode | smxon | SX | شغّل مصافحة xon/xoff |
| exit_xon_mode | rmxon | RX | أوقف مصافحة xon/xoff |
| enter_am_mode | smam | SA | شغّل الهوامش الآلية |
| exit_am_mode | rmam | RA | أوقف الهوامش الآلية |
| xon_character | xonc | XN | محرف XON |
| xoff_character | xoffc | XF | محرف XOFF |
| ena_acs | enacs | eA | مكّن مجموعة المحارف البديلة |
| label_on | smln | LO | شغّل اللصائق البرمجية |
| label_off | rmln | LF | أوقف اللصائق البرمجية |
| key_beg | kbeg | @1 | مفتاح البداية |
| key_cancel | kcan | @2 | مفتاح الإلغاء |
| key_close | kclo | @3 | مفتاح الإغلاق |
| key_command | kcmd | @4 | مفتاح الأمر |
| key_copy | kcpy | @5 | مفتاح النسخ |
| key_create | kcrt | @6 | مفتاح الإنشاء |
| key_end | kend | @7 | مفتاح النهاية |
| key_enter | kent | @8 | مفتاح الإدخال/الإرسال |
| key_exit | kext | @9 | مفتاح الخروج |
| key_find | kfnd | @0 | مفتاح البحث |
| key_help | khlp | %1 | مفتاح المساعدة |
| key_mark | kmrk | %2 | مفتاح العلامة |
| key_message | kmsg | %3 | مفتاح الرسالة |
| key_move | kmov | %4 | مفتاح النقل |
| key_next | knxt | %5 | مفتاح التالي |
| key_open | kopn | %6 | مفتاح الفتح |
| key_options | kopt | %7 | مفتاح الخيارات |
| key_previous | kprv | %8 | مفتاح السابق |
| key_print | kprt | %9 | مفتاح الطباعة |
| key_redo | krdo | %0 | مفتاح الإعادة |
| key_reference | kref | &1 | مفتاح المرجع |
| key_refresh | krfr | &2 | مفتاح التحديث |
| key_replace | krpl | &3 | مفتاح الاستبدال |
| key_restart | krst | &4 | مفتاح إعادة التشغيل |
| key_resume | kres | &5 | مفتاح الاستئناف |
| key_save | ksav | &6 | مفتاح الحفظ |
| key_suspend | kspd | &7 | مفتاح التعليق |
| key_undo | kund | &8 | مفتاح التراجع |
| key_sbeg | kBEG | &9 | مفتاح البداية المبدّل |
| key_scancel | kCAN | &0 | مفتاح الإلغاء المبدّل |
| key_scommand | kCMD | *1 | مفتاح الأوامر المبدّل |
| key_scopy | kCPY | *2 | مفتاح النسخ المبدّل |
| key_screate | kCRT | *3 | مفتاح الإنشاء المبدّل |
| key_sdc | kDC | *4 | مفتاح حذف المحارف المبدّل |
| key_sdl | kDL | *5 | مفتاح حذف السطور المبدّل |
| key_select | kslt | *6 | مفتاح الاختيار |
| key_send | kEND | *7 | مفتاح النهاية المبدّل |
| key_seol | kEOL | *8 | مفتاح المسح حتى نهاية السطر المبدّل |
| key_sexit | kEXT | *9 | مفتاح الخروج المبدّل |
| key_sfind | kFND | *0 | مفتاح البحث المبدّل |
| key_shelp | kHLP | #1 | مفتاح المساعدة المبدّل |
| key_shome | kHOM | #2 | مفتاح المنزل المبدّل |
| key_sic | kIC | #3 | مفتاح إدراج المحارف المبدّل |
| key_sleft | kLFT | #4 | مفتاح السهم الأيسر المبدّل |
| key_smessage | kMSG | %a | مفتاح الرسائل المبدّل |
| key_smove | kMOV | %b | مفتاح النقل المبدّل |
| key_snext | kNXT | %c | مفتاح التالي المبدّل |
| key_soptions | kOPT | %d | مفتاح الخيارات المبدّل |
| key_sprevious | kPRV | %e | مفتاح السابق المبدّل |
| key_sprint | kPRT | %f | مفتاح الطباعة المبدّل |
| key_sredo | kRDO | %g | مفتاح الإعادة المبدّل |
| key_sreplace | kRPL | %h | مفتاح الاستبدال المبدّل |
| key_sright | kRIT | %i | مفتاح السهم الأيمن المبدّل |
| key_srsume | kRES | %j | مفتاح الاستئناف المبدّل |
| key_ssave | kSAV | !1 | مفتاح الحفظ المبدّل |
| key_ssuspend | kSPD | !2 | مفتاح التعليق المبدّل |
| key_sundo | kUND | !3 | مفتاح التراجع المبدّل |
| req_for_input | rfi | RF | أرسل محرف الإدخال التالي (للمحطات الطرفية الوهمية ptys) |
| key_f11 | kf11 | F1 | مفتاح الوظيفة F11 |
| key_f12 | kf12 | F2 | مفتاح الوظيفة F12 |
| key_f13 | kf13 | F3 | مفتاح الوظيفة F13 |
| key_f14 | kf14 | F4 | مفتاح الوظيفة F14 |
| key_f15 | kf15 | F5 | مفتاح الوظيفة F15 |
| key_f16 | kf16 | F6 | مفتاح الوظيفة F16 |
| key_f17 | kf17 | F7 | مفتاح الوظيفة F17 |
| key_f18 | kf18 | F8 | مفتاح الوظيفة F18 |
| key_f19 | kf19 | F9 | مفتاح الوظيفة F19 |
| key_f20 | kf20 | FA | مفتاح الوظيفة F20 |
| key_f21 | kf21 | FB | مفتاح الوظيفة F21 |
| key_f22 | kf22 | FC | مفتاح الوظيفة F22 |
| key_f23 | kf23 | FD | مفتاح الوظيفة F23 |
| key_f24 | kf24 | FE | مفتاح الوظيفة F24 |
| key_f25 | kf25 | FF | مفتاح الوظيفة F25 |
| key_f26 | kf26 | FG | مفتاح الوظيفة F26 |
| key_f27 | kf27 | FH | مفتاح الوظيفة F27 |
| key_f28 | kf28 | FI | مفتاح الوظيفة F28 |
| key_f29 | kf29 | FJ | مفتاح الوظيفة F29 |
| key_f30 | kf30 | FK | مفتاح الوظيفة F30 |
| key_f31 | kf31 | FL | مفتاح الوظيفة F31 |
| key_f32 | kf32 | FM | مفتاح الوظيفة F32 |
| key_f33 | kf33 | FN | مفتاح الوظيفة F33 |
| key_f34 | kf34 | FO | مفتاح الوظيفة F34 |
| key_f35 | kf35 | FP | مفتاح الوظيفة F35 |
| key_f36 | kf36 | FQ | مفتاح الوظيفة F36 |
| key_f37 | kf37 | FR | مفتاح الوظيفة F37 |
| key_f38 | kf38 | FS | مفتاح الوظيفة F38 |
| key_f39 | kf39 | FT | مفتاح الوظيفة F39 |
| key_f40 | kf40 | FU | مفتاح الوظيفة F40 |
| key_f41 | kf41 | FV | مفتاح الوظيفة F41 |
| key_f42 | kf42 | FW | مفتاح الوظيفة F42 |
| key_f43 | kf43 | FX | مفتاح الوظيفة F43 |
| key_f44 | kf44 | FY | مفتاح الوظيفة F44 |
| key_f45 | kf45 | FZ | مفتاح الوظيفة F45 |
| key_f46 | kf46 | Fa | مفتاح الوظيفة F46 |
| key_f47 | kf47 | Fb | مفتاح الوظيفة F47 |
| key_f48 | kf48 | Fc | مفتاح الوظيفة F48 |
| key_f49 | kf49 | Fd | مفتاح الوظيفة F49 |
| key_f50 | kf50 | Fe | مفتاح الوظيفة F50 |
| key_f51 | kf51 | Ff | مفتاح الوظيفة F51 |
| key_f52 | kf52 | Fg | مفتاح الوظيفة F52 |
| key_f53 | kf53 | Fh | مفتاح الوظيفة F53 |
| key_f54 | kf54 | Fi | مفتاح الوظيفة F54 |
| key_f55 | kf55 | Fj | مفتاح الوظيفة F55 |
| key_f56 | kf56 | Fk | مفتاح الوظيفة F56 |
| key_f57 | kf57 | Fl | مفتاح الوظيفة F57 |
| key_f58 | kf58 | Fm | مفتاح الوظيفة F58 |
| key_f59 | kf59 | Fn | مفتاح الوظيفة F59 |
| key_f60 | kf60 | Fo | مفتاح الوظيفة F60 |
| key_f61 | kf61 | Fp | مفتاح الوظيفة F61 |
| key_f62 | kf62 | Fq | مفتاح الوظيفة F62 |
| key_f63 | kf63 | Fr | مفتاح الوظيفة F63 |
| clr_bol | el1 | cb | مسح حتى بداية السطر |
| clear_margins | mgc | MC | مسح الهوامش اللينة اليمنى واليسرى |
| set_left_margin | smgl | ML | ضبط الهامش اللين الأيسر عند العمود الحالي (ليس في termcap الخاص بـ BSD) |
| set_right_margin | smgr | MR | ضبط الهامش اللين الأيمن عند العمود الحالي |
| label_format | fln | Lf | تنسيق اللصيقة |
| set_clock | sclk | SC | ضبط الساعة، #1 ساعات #2 دقائق #3 ثوانٍ |
| display_clock | dclk | DK | عرض الساعة |
| remove_clock | rmclk | RC | إزالة الساعة |
| create_window | cwin | CW | تعريف نافذة #1 من #2،#3 إلى #4،#5 |
| goto_window | wingo | WG | الانتقال إلى النافذة #1 |
| hangup | hup | HU | إنهاء المكالمة الهاتفية |
| dial_phone | dial | DI | طلب الرقم #1 |
| quick_dial | qdial | QD | طلب الرقم #1 دون تحقق |
| tone | tone | TO | اختيار طلب الرقم بنغمة اللمس |
| pulse | pulse | PU | اختيار الطلب بالنبض |
| flash_hook | hook | fh | وميض خطاف المفتاح |
| fixed_pause | pause | PA | إيقاف مؤقت لمدة 2-3 ثوانٍ |
| wait_tone | wait | WA | انتظار نغمة الطلب |
| user0 | u0 | u0 | سلسلة المستخدم رقم 0 |
| user1 | u1 | u1 | سلسلة المستخدم رقم 1 |
| user2 | u2 | u2 | سلسلة المستخدم رقم 2 |
| user3 | u3 | u3 | سلسلة المستخدم رقم 3 |
| user4 | u4 | u4 | سلسلة المستخدم رقم 4 |
| user5 | u5 | u5 | سلسلة المستخدم رقم 5 |
| user6 | u6 | u6 | سلسلة المستخدم رقم 6 |
| user7 | u7 | u7 | سلسلة المستخدم رقم 7 |
| user8 | u8 | u8 | سلسلة المستخدم رقم 8 |
| user9 | u9 | u9 | سلسلة المستخدم رقم 9 |
| orig_pair | op | op | اضبط زوج الألوان المبدئي إلى قيمته الأصلية |
| orig_colors | oc | oc | اضبط كل أزواج الألوان إلى قيمها الأصلية |
| initialize_color | initc | Ic | هيّئ اللون رقم 1 إلى (#2,#3,#4) |
| initialize_pair | initp | Ip | هيّئ زوج الألوان رقم 1 إلى fg=(#2,#3,#4), bg=(#5,#6,#7) |
| set_color_pair | scp | sp | اضبط زوج الألوان الحالي إلى رقم 1 |
| set_foreground | setf | Sf | اضبط لون الواجهة رقم 1 |
| set_background | setb | Sb | اضبط لون الخلفية رقم 1 |
| change_char_pitch | cpi | ZA | غيّر عدد المحارف في البوصة الواحدة إلى رقم 1 |
| change_line_pitch | lpi | ZB | غيّر عدد الأسطر في البوصة الواحدة إلى رقم 1 |
| change_res_horz | chr | ZC | غيّر الميز الأفقي إلى رقم 1 |
| change_res_vert | cvr | ZD | غيّر الميز العمودي إلى رقم 1 |
| define_char | defc | ZE | عرّف محرفا رقم 1، بعرض رقم 2 نقطة، وبذيل رقم 3 |
| enter_doublewide_mode | swidm | ZF | ادخل وضع العرض المزدوج |
| enter_draft_quality | sdrfq | ZG | ادخل وضع جودة المسودة |
| enter_italics_mode | sitm | ZH | ادخل الوضع المائل |
| enter_leftward_mode | slm | ZI | ابدأ حركة العربة نحو اليسار |
| enter_micro_mode | smicm | ZJ | ابدأ وضع الحركة الدقيقة |
| enter_near_letter_quality | snlq | ZK | ادخل وضع الجودة القريبة من جودة الرسائل (NLQ) |
| enter_normal_quality | snrmq | ZL | ادخل وضع الجودة العادية |
| enter_shadow_mode | sshm | ZM | ادخل وضع الطباعة المظللة |
| enter_subscript_mode | ssubm | ZN | ادخل وضع الكتابة السفلية |
| enter_superscript_mode | ssupm | ZO | ادخل وضع الكتابة العلوية |
| enter_upward_mode | sum | ZP | ابدأ حركة العربة نحو الأعلى |
| exit_doublewide_mode | rwidm | ZQ | أنهِ وضع العرض المزدوج |
| exit_italics_mode | ritm | ZR | أنهِ الوضع المائل |
| exit_leftward_mode | rlm | ZS | أنهِ وضع الحركة لليسار |
| exit_micro_mode | rmicm | ZT | أنهِ وضع الحركة الدقيقة |
| exit_shadow_mode | rshm | ZU | أنهِ وضع الطباعة المظللة |
| exit_subscript_mode | rsubm | ZV | أنهِ وضع الكتابة السفلية |
| exit_superscript_mode | rsupm | ZW | أنهِ وضع الكتابة العلوية |
| exit_upward_mode | rum | ZX | أنهِ حركة المحارف المعكوسة |
| micro_column_address | mhpa | ZY | مثل column_address في الوضع الدقيق |
| micro_down | mcud1 | ZZ | مثل cursor_down في الوضع الدقيق |
| micro_left | mcub1 | Za | مثل cursor_left في الوضع الدقيق |
| micro_right | mcuf1 | Zb | مثل cursor_right في الوضع الدقيق |
| micro_row_address | mvpa | Zc | مثل row_address #1 في الوضع الدقيق |
| micro_up | mcuu1 | Zd | مثل cursor_up في الوضع الدقيق |
| order_of_pins | porder | Ze | طابق بتات البرمجيات مع دبابيس رأس الطباعة |
| parm_down_micro | mcud | Zf | مثل parm_down_cursor في الوضع الدقيق |
| parm_left_micro | mcub | Zg | مثل parm_left_cursor في الوضع الدقيق |
| parm_right_micro | mcuf | Zh | مثل parm_right_cursor في الوضع الدقيق |
| parm_up_micro | mcuu | Zi | مثل parm_up_cursor في الوضع الدقيق |
| select_char_set | scs | Zj | اختر طقم المحارف، #1 |
| set_bottom_margin | smgb | Zk | اضبط الهامش السفلي عند السطر الحالي |
| set_bottom_margin_parm | smgbp | Zl | اضبط الهامش السفلي عند السطر #1 أو (إذا لم يُعطَ smgtp) بعد #2 أسطر من الأسفل |
| set_left_margin_parm | smglp | Zm | اضبط الهامش الأيسر (الأيمن) عند العمود #1 |
| set_right_margin_parm | smgrp | Zn | اضبط الهامش الأيمن عند العمود #1 |
| set_top_margin | smgt | Zo | اضبط الهامش العلوي عند السطر الحالي |
| set_top_margin_parm | smgtp | Zp | اضبط الهامش العلوي (السفلي) عند الصف #1 |
| start_bit_image | sbim | Zq | ابدأ طباعة رسوميات صور البتات |
| start_char_set_def | scsd | Zr | ابدأ تعريف طقم المحارف #1، بـ #2 محارف في الطقم |
| stop_bit_image | rbim | Zs | أوقف طباعة رسوميات صور البتات |
| stop_char_set_def | rcsd | Zt | أنهِ تعريف طقم المحارف #1 |
| subscript_characters | subcs | Zu | قائمة المحارف التي يمكن جعلها منخفضة |
| superscript_characters | supcs | Zv | قائمة المحارف التي يمكن جعلها مرتفعة |
| these_cause_cr | docr | Zw | طباعة أي من هذه المحارف تسبب رجوع الحامل (CR) |
| zero_motion | zerom | Zx | لا حركة للمحرف اللاحق |
تتوفر قدرات السلاسل التالية في بنية term الخاصة بـ SVr4.0، ولكنها لم تكن موثقة في الأصل في صفحة الدليل.
| الكود | |||
| اسم قدرة السلسلة | TI | TC | الوصف |
| char_set_names | csnm | Zy | أنتج العنصر رقم #1 من قائمة أسماء أطقم المحارف |
| key_mouse | kmous | Km | وقع حدث للفأرة |
| mouse_info | minfo | Mi | معلومات حالة الفأرة |
| req_mouse_pos | reqmp | RQ | اطلب موضع الفأرة |
| get_mouse | getm | Gm | يجب أن تتلقى Curses أحداث الأزرار، المعامل #1 غير موثق. |
| set_a_foreground | setaf | AF | اضبط لون الواجهة إلى #1، باستخدام هروب ANSI |
| set_a_background | setab | AB | اضبط لون الخلفية إلى #1، باستخدام هروب ANSI |
| pkey_plab | pfxl | xl | برمج مفتاح الوظيفة #1 لطباعة السلسلة #2 وعرض السلسلة #3 |
| device_type | devt | dv | أشر إلى دعم اللغة وطقم الترميز |
| code_set_init | csin | ci | تسلسل التهيئة لأطقم ترميز متعددة |
| set0_des_seq | s0ds | s0 | انتقل إلى طقم الترميز 0 (EUC set 0، ASCII) |
| set1_des_seq | s1ds | s1 | انتقل إلى طقم الترميز 1 |
| set2_des_seq | s2ds | s2 | انتقل إلى طقم الترميز 2 |
| set3_des_seq | s3ds | s3 | انتقل إلى طقم الترميز 3 |
| set_lr_margin | smglr | ML | اضبط كل من الهامشين الأيسر والأيمن إلى #1، #2. (ML ليس في termcap الخاص بـ BSD). |
| set_tb_margin | smgtb | MT | يضبط كل من الهامشين العلوي والسفلي إلى #1، #2 |
| bit_image_repeat | birep | Xy | كرر خلية الصورة النقطية #1 عدد #2 من المرات |
| bit_image_newline | binel | Zz | انتقل إلى الصف التالي من الصورة النقطية |
| bit_image_carriage_return | bicr | Yv | انتقل إلى بداية الصف نفسه |
| color_names | colornm | Yw | أعطِ اسماً للون #1 |
| define_bit_image_region | defbi | Yx | عرف منطقة صورة نقطية مستطيلة |
| end_bit_image_region | endbi | Yy | أنهِ منطقة الصورة النقطية |
| set_color_band | setcolor | Yz | غير إلى لون الشريط #1 |
| set_page_length | slines | YZ | اضبط طول الصفحة إلى #1 أسطر |
| display_pc_char | dispc | S1 | اعرض محرف الحاسوب الشخصي #1 |
| enter_pc_charset_mode | smpch | S2 | ادخل إلى وضع عرض محارف الحاسوب الشخصي |
| exit_pc_charset_mode | rmpch | S3 | اخرج من وضع عرض محارف الحاسوب الشخصي |
| enter_scancode_mode | smsc | S4 | ادخل إلى وضع رمز المسح (scancode) للحاسوب الشخصي |
| exit_scancode_mode | rmsc | S5 | اخرج من وضع رمز المسح (scancode) للحاسوب الشخصي |
| pc_term_options | pctrm | S6 | خيارات طرفية الحاسوب الشخصي |
| scancode_escape | scesc | S7 | هروب (Escape) لمحاكاة رمز المسح |
| alt_scancode_esc | scesa | S8 | هروب (Escape) بديل لمحاكاة رمز المسح |
أضاف معيار XSI Curses إمكانيات النسخ المطبوع هذه. واستُخدمت في بعض إصدارات ما بعد 4.1 من System V curses، مثل Solaris 2.5 و IRIX 6.x. باستثناء YI، فإن أسماء termcap الخاصة بـ ncurses لها مخترعة. ووفقاً لمعيار XSI Curses، ليس لها أسماء termcap. إذا كانت مدخلات terminfo المجمّعة لديك تستخدم هذه الإمكانيات، فقد لا تكون متوافقة ثنائياً مع مدخلات System V terminfo بعد SVr4.1؛ فاحذر!
| الكود | |||
| اسم قدرة السلسلة | TI | TC | الوصف |
| enter_horizontal_hl_mode | ehhlm | Xh | ادخل إلى وضع الإبراز الأفقي |
| enter_left_hl_mode | elhlm | Xl | ادخل إلى وضع الإبراز الأيسر |
| enter_low_hl_mode | elohlm | Xo | ادخل إلى وضع الإبراز السفلي |
| enter_right_hl_mode | erhlm | Xr | ادخل إلى وضع الإبراز الأيمن |
| enter_top_hl_mode | ethlm | Xt | ادخل إلى وضع الإبراز العلوي |
| enter_vertical_hl_mode | evhlm | Xv | ادخل إلى وضع الإبراز العمودي |
| set_a_attributes | sgr1 | sA | عرف طقم ثانٍ من سمات الفيديو #1-#6 |
| set_pglen_inch | slength | YI | اضبط طول الصفحة إلى #1 من مئة من البوصة (بعض التطبيقات تستخدم sL لـ termcap). |
الإمكانيات المعرفة من قبل المستخدم¶
سرد القسم السابق الإمكانيات القياسية. بعضها غامض، ويدعم وظائف لا تنفذها محاكيات الطرفيات، أو ربما لم تُحقق أبداً في الأجهزة المصنعة. أحياناً، تمتلك المحاكيات ميزات خاصة يصعب أو يستحيل تمثيلها عبر الإمكانيات القياسية.
تعالج ncurses هذا القصور عبر السماح بقدرات يحددها المستخدم. يوفر برنامجا tic و infocmp الخيار -x لهذا الغرض. عندما يُستخدم -x، يعامل tic القدرات المجهولة على أنها محددة من المستخدم. أي أنه إذا واجه tic اسم قدرة لا يتعرف عليه، فإن البرنامج يستنتج نوع القدرة (منطقي، رقمي، أو سلسلة نصية) من صيغة قيمة القدرة وينشئ إدخال جدول ممتد لتلك القدرة. تجعل use_extended_names(3NCURSES) هذه المعلومات متاحة للتطبيقات بشكل مشروط. توفر وظائف مكتبة ncurses للمستدعِي بيانات القدرات، وتفسيرها متروك في الغالب للتطبيق.
- يعامل ncurses إمكانيات السلاسل النصية المعرفة من قبل المستخدم والتي تبدأ أسماؤها بـ “k” كمفاتيح وظائف.
- أنواع القدرات (منطقي، رقمي، أو سلسلة نصية) التي يحددها tic يمكن استنتاجها عبر استدعاءات ناجحة لـ tigetflag(3NCURSES)، و tigetnum(3NCURSES)، و tigetstr(3NCURSES).
- إذا كان اسم الإمكانية مكوناً من حرفين، فستكون الإمكانية متاحة أيضاً عبر واجهة termcap.
بينما يُقال إن termcap قابل للتوسيع لأنه لا يفرض أي إمكانيات، إلا أنه في الممارسة العملية اقتصر على تلك المحددة بواسطة تطبيقات terminfo. كقاعدة، لا تستخدم سوى الإمكانيات المعرفة من قبل المستخدم من النوع المنطقي والرقمي مع تطبيقات termcap لتجنب تجاوز حد 1023 بايت الذي تفترضه تطبيقات termcap وتطبيقاتها. وتحديداً، فإن دعم الأطقم الموسعة من مفاتيح الوظائف (بعد المفاتيح الستين المرقمة وحفنة المفاتيح الخاصة المسماة) يتحقق بشكل أفضل باستخدام الأسماء الأطول المتاحة عبر terminfo.
تستخدم مكتبة ncurses القليل من هذه الإمكانيات المعرفة من قبل المستخدم، كما هو موضح في user_caps(5). بالنسبة للإمكانيات الأخرى المعرفة من قبل المستخدم، بما في ذلك مفاتيح الوظائف، راجع شكل المصدر لقاعدة بيانات الطرفية، terminfo.src، تحت العنوان “NCURSES USER-DEFINABLE CAPABILITIES”.
مدخل عينة¶
المدخل التالي، الذي يصف طرفية قياسية ANSI X3.64- (أو ECMA-48-) (يُشار إليها فيما يلي بـ “قياسية ANSI” للاختصار)، يمثل ما يبدو عليه مدخل terminfo لطرفية حديثة عادةً.
ansi|ansi/pc-term compatible with color,
am, mc5i, mir, msgr,
colors#8, cols#80, it#8, lines#24, ncv#3, pairs#64,
acsc=+\020\,\021-\030.^Y0\333`\004a\261f\370g\361h\260
j\331k\277l\332m\300n\305o~p\304q\304r\304s_t\303
u\264v\301w\302x\263y\363z\362{\343|\330}\234~\376,
bel=^G, blink=\E[5m, bold=\E[1m, cbt=\E[Z, clear=\E[H\E[J,
cr=^M, cub=\E[%p1%dD, cub1=\E[D, cud=\E[%p1%dB, cud1=\E[B,
cuf=\E[%p1%dC, cuf1=\E[C, cup=\E[%i%p1%d;%p2%dH,
cuu=\E[%p1%dA, cuu1=\E[A, dch=\E[%p1%dP, dch1=\E[P,
dl=\E[%p1%dM, dl1=\E[M, ech=\E[%p1%dX, ed=\E[J, el=\E[K,
el1=\E[1K, home=\E[H, hpa=\E[%i%p1%dG, ht=\E[I, hts=\EH,
ich=\E[%p1%d@, il=\E[%p1%dL, il1=\E[L, ind=^J,
indn=\E[%p1%dS, invis=\E[8m, kbs=^H, kcbt=\E[Z, kcub1=\E[D,
kcud1=\E[B, kcuf1=\E[C, kcuu1=\E[A, khome=\E[H, kich1=\E[L,
mc4=\E[4i, mc5=\E[5i, nel=\r\E[S, op=\E[39;49m,
rep=%p1%c\E[%p2%{1}%-%db, rev=\E[7m, rin=\E[%p1%dT,
rmacs=\E[10m, rmpch=\E[10m, rmso=\E[m, rmul=\E[m,
s0ds=\E(B, s1ds=\E)B, s2ds=\E*B, s3ds=\E+B,
setab=\E[4%p1%dm, setaf=\E[3%p1%dm,
sgr=\E[0;10%?%p1%t;7%;
%?%p2%t;4%;
%?%p3%t;7%;
%?%p4%t;5%;
%?%p6%t;1%;
%?%p7%t;8%;
%?%p9%t;11%;m,
sgr0=\E[0;10m, smacs=\E[11m, smpch=\E[11m, smso=\E[7m,
smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
u8=\E[?%[;0123456789]c, u9=\E[c, vpa=\E[%i%p1%dd,
يمكن أن تمتد المدخلات على عدة أسطر بوضع مسافة بيضاء في بداية كل سطر باستثناء السطر الأول. يمكن تضمين التعليقات في الأسطر التي تبدأ بـ “#”. إمكانيات terminfo هي من ثلاثة أنواع:
- الإمكانيات المنطقية (Boolean) التي تشير إلى أن الطرفية تمتلك ميزة معينة،
- الإمكانيات الرقمية التي تعطي حجم الطرفية أو حجم تأخيرات معينة، و
- إمكانيات السلاسل النصية، التي تعطي تسلسلاً يمكن استخدامه لإجراء عمليات طرفية معينة.
أنواع الإمكانيات¶
كل الإمكانيات لها أسماء. على سبيل المثال، حقيقة أن طرفيات ANSI القياسية لها هوامش آلية (أي عودة آلية وتغذية سطر عند الوصول إلى نهاية السطر) يشار إليها بالإمكانية am. ومن ثم فإن وصف ansi يتضمن am. الإمكانيات الرقمية يتبعها المحرف “#” ثم قيمة موجبة. وهكذا فإن cols، التي تشير إلى عدد الأعمدة في الطرفية، تعطي القيمة “80” لـ ansi. يمكن تحديد قيم الإمكانيات الرقمية بالنظام العشري أو الثماني أو الست عشري، باستخدام اصطلاحات لغة البرمجة C (مثل 255، 0377 و 0xff أو 0xFF).
أخيراً، إمكانيات السلاسل النصية، مثل el (تسلسل المسح إلى نهاية السطر) تُعطى بواسطة رمز من حرفين، وعلامة “=”، ثم سلسلة نصية تنتهي عند الفاصلة “,” التالية.
يُوفر عدد من تسلسلات الهروب في إمكانيات السلاسل النصية لسهولة ترميز المحارف هناك:
- كل من \E و \e تقابل محرف ESCAPE،
- ^x تقابل control-x لأي x مناسب، و
- التسلسلات
\n، \l، \r، \t، \b، \f، و \s
- تنتج
سطر جديد، تغذية سطر، عودة، جدولة، مسافة للخلف، تغذية نموذج، و مسافة،
- على التوالي.
لا يذكر X/Open Curses ما قد يكون عليه “x المناسب”. في الممارسة العملية، يكون محرفاً رسومياً من ASCII قابلاً للطباعة. تُفسر الحالة الخاصة “^?” على أنها DEL (127). في جميع الحالات الأخرى، تُجرى عملية “and” منطقية لقيمة المحرف مع 0x1f، مما يحولها إلى رموز تحكم ASCII في النطاق من 0 إلى 31.
تشمل مهربات أخرى
- \^ لـ ^،
- \\ لـ \،
- \, للفاصلة،
- \: لـ :،
- و \0 لـ null.
- سوف ينتج \0 القيمة \200، والتي لا تنهي سلسلة نصية ولكنها تتصرف كمحرف null في معظم الطرفيات، بشرط تحديد CS7. انظر stty(1).
- السبب الرئيس لهذه الغرابة هو الحفاظ على التوافق الثنائي لملفات terminfo المجمعة مع التطبيقات الأخرى، مثل أنظمة SVr4 التي توثق هذا. تستخدم ملفات terminfo المجمعة سلاسل نصية منتهية بصفر (null-terminated)، دون أطوال. تعديل هذا سيتطلب تنسيقًا ثنائيًا جديدًا، وهو ما لن يعمل مع التطبيقات الأخرى.
أخيرًا، يمكن إعطاء المحارف كأرقام ثمانية ثلاثة بعد \.
قد يظهر تأخير بالمللي ثانية في أي مكان في قدرة السلسلة النصية، محصورًا بين أقواس $<..>، كما في el=\EK$<5>، وتُوفر محارف الحشو بواسطة tputs(3NCURSES) لتوفير هذا التأخير.
- يجب أن يكون التأخير رقمًا بدقة خانة عشرية واحدة على الأكثر؛ وقد تتبعه اللاحقتان “*” أو “/” أو كلتاهما.
- تشير “*” إلى أن الحشو المطلوب يتناسب مع عدد الأسطر المتأثرة بالعملية، والكمية المعطاة هي الحشو المطلوب لكل وحدة متأثرة. (في حالة إدراج محرف، يظل العامل هو عدد الأسطر المتأثرة).
- عادةً، تكون الحشوة استشارية إذا كان الجهاز يمتلك قدرة xon؛ وتُستخدم لحساب التكلفة ولكنها لا تؤدي إلى تأخيرات.
- •
- تشير اللاحقة “/” إلى أن الحشو إلزامي ويفرض تأخيرًا بعدد الميلي ثانية المعطى حتى على الأجهزة التي يتوفر فيها xon للإشارة إلى التحكم في التدفق.
يجب
أحيانًا
تعليق
القدرات
الفردية.
للقيام
بذلك، ضع
نقطة قبل
اسم القدرة.
على سبيل
المثال،
انظر ind
الثانية في
المثال
أعلاه.
جلب الأوصاف المجمعة¶
تُخزن أوصاف الطرفية في ncurses في قواعد بيانات الطرفية. هذه القواعد، التي يُعثر عليها عبر مساراتها، يمكن أن تُضبط إما كأشجار أدلة أو قواعد بيانات مجزأة (انظر term(5))،
تستخدم المكتبة قائمة مدمجة من المسارات، والتي يمكن تجاوزها بواسطة متغيرات البيئة. قبل بدء البحث، تفحص ncurses قائمة البحث، وتستبعد المكررات والمسارات التي لا توجد فيها قاعدة بيانات طرفية. تقرأ مكتبة ncurses الوصف الأول الذي يجتاز فحوصات الاتساق الخاصة بها.
- يُفحص متغير البيئة TERMINFO أولاً، للبحث عن قاعدة بيانات طرفية تحتوي على وصف الطرفية.
- بعد ذلك، تبحث ncurses في $HOME/.terminfo عن وصف مجمع.
- هذه ميزة اختيارية قد تُحذف بالكامل من المكتبة، أو تُقيد لمنع الاستخدام غير المقصود من قبل التطبيقات ذات الامتيازات.
- •
- بعد ذلك، إذا وُجد متغير البيئة TERMINFO_DIRS، تفسر ncurses محتويات هذا المتغير كقائمة مسارات مفصولة بنقطتين لقواعد بيانات الطرفية التي سيُبحث فيها.
- يُفسر مسار المسار الفارغ (أي إذا بدأ المتغير أو انتهى بنقطتين، أو احتوى على نقطتين متجاورتين) على أنه موقع النظام /etc/terminfo.
- •
- أخيرًا، تبحث ncurses في هذه المواقع المدمجة:
- قائمة من الأدلة (/etc/terminfo:/lib/terminfo:/usr/share/terminfo)، و
- دليل terminfo الخاص بالنظام، /etc/terminfo
يمكن أن يحتوي المتغير TERMINFO على وصف طرفية بدلاً من مسار قاعدة بيانات طرفية. إذا بدأ هذا المتغير بـ “hex:” أو “b64:” فإن ncurses تقرأ وصف الطرفية من بيانات مشفرة بنظام سداسي عشري أو base64، وإذا طابق ذلك الوصف الاسم المطلوب، فسيُستخدم. يمكن ضبط هذه البيانات المشفرة باستخدام الخيار “-Q” للأداتين tic أو infocmp.
ما سبق يتناول الضبط المعتاد لـ ncurses، والذي يستخدم أوصاف الطرفية المعدة بتنسيق terminfo. ورغم أن termcap أقل تعبيرًا، يمكن أيضًا اضبط ncurses لقراءة أوصاف termcap. في هذا الضبط، تفحص المكتبة المتغيرين TERMCAP و TERMPATH (للمحتوى ومسار البحث، على التوالي) بعد قاعدة بيانات الطرفية الخاصة بالنظام.
إعداد الأوصاف¶
نوجز الآن كيفية إعداد أوصاف الطرفيات. الطريقة الأكثر فعالية لإعداد وصف طرفية هي تقليد وصف طرفية مماثلة في terminfo وبناء الوصف تدريجيًا، باستخدام أوصاف جزئية مع vi أو أي برنامج آخر موجه للشاشة للتحقق من صحتها. كن على علم بأن الطرفية غير المألوفة للغاية قد تكشف عن أوجه قصور في قدرة ملف terminfo على وصفها أو أخطاء في كود معالجة الشاشة لبرنامج الاختبار.
للحصول على الحشو الصحيح لإدراج سطر (إذا لم يوثق مصنع الطرفية ذلك) فإن الاختبار القاسي هو تحرير ملف كبير بمعدل 9600 باود، وحذف 16 سطرًا أو نحو ذلك من منتصف الشاشة، ثم الضغط على مفتاح “u” عدة مرات بسرعة. إذا اختل أداء الطرفية، فعادة ما تكون هناك حاجة إلى مزيد من الحشو. يمكن استخدام اختبار مماثل لإدراج محرف.
القدرات الأساسية¶
يُعطى عدد الأعمدة في كل سطر للطرفية بواسطة القدرة الرقمية cols. إذا كانت الطرفية من نوع CRT، فإن عدد الأسطر على الشاشة يُعطى بواسطة القدرة lines. إذا كانت الطرفية تلتف إلى بداية السطر التالي عندما تصل إلى الهامش الأيمن، فيجب أن تمتلك القدرة am. إذا كانت الطرفية تستطيع مسح شاشتها وترك المؤشر في موضع البدء (home)، فإن هذا يُعطى بواسطة قدرة السلسلة clear. إذا كانت الطرفية تطبع فوق المحارف (بدلاً من مسح الموضع عند كتابة محرف فوق آخر)، فيجب أن تمتلك القدرة os. إذا كانت الطرفية طرفية طباعة بدون وحدة نسخ ناعمة، فأعطها كلاً من hc و os. (تنطبق os على طرفيات تخزين النطاق، مثل سلسلة TEKTRONIX 4010، بالإضافة إلى الطرفيات الورقية وطرفيات APL). إذا وجد كود لنقل المؤشر إلى الحافة اليسرى للسطر الحالي، فأعطه كـ cr. (عادةً ما يكون هذا محرف الرجوع، control/M). وإذا وجد كود لإصدار إشارة صوتية (جرس، صفارة، إلخ) فأعطه كـ bel.
إذا وُجد كود لتحريك المؤشر موضعًا واحدًا إلى اليسار (مثل المسافة للخلف)، فيجب إعطاء هذه القدرة كـ cub1. وبالمثل، يجب إعطاء أكواد التحرك إلى اليمين ولأعلى ولأسفل كـ cuf1 و cuu1 و cud1. لا ينبغي لحركات المؤشر المحلية هذه أن تغير النص الذي تمر فوقه؛ على سبيل المثال، لن تستخدم عادةً “cuf1= ” لأن المسافة ستمسح المحرف الذي تم المرور فوقه.
نقطة بالغة الأهمية هنا هي أن حركات المؤشر المحلية المشفرة في terminfo غير محددة عند الحافتين اليسرى والعلوية لطرفية CRT. لا ينبغي أبدًا للبرامج محاولة الرجوع للخلف حول الحافة اليسرى، ما لم تُعطَ bw، ولا تحاول أبدًا الصعود محليًا خارج الحافة العلوية. ومن أجل تمرير النص للأعلى، سينتقل البرنامج إلى الزاوية اليسرى السفلية من الشاشة ويرسل سلسلة ind (الفهرس).
لتمرير النص للأسفل، ينتقل البرنامج إلى الزاوية اليسرى العلوية من الشاشة ويرسل سلسلة ri (الفهرس العكسي). تكون السلاسل ind و ri غير محددة عندما لا تكون في زواياهما المخصصة من الشاشة.
النسخ ذات المعلمات لتسلسلات التمرير هي indn و rin واللتان لهما نفس دلالات ind و ri باستثناء أنهما تأخذان معلمة واحدة، وتمرران هذا العدد من الأسطر. كما أنهما غير محددتين إلا عند حافة الشاشة المناسبة.
تخبر القدرة am ما إذا كان المؤشر يلتصق بالحافة اليمنى للشاشة عند إخراج النص، ولكن هذا لا ينطبق بالضرورة على cuf1 من العمود الأخير. الحركة المحلية الوحيدة المحددة من الحافة اليسرى هي في حالة إعطاء bw، فعندها سينتقل cub1 من الحافة اليسرى إلى الحافة اليمنى للسطر السابق. وإذا لم تُعطَ bw، فإن النتيجة غير محددة. هذا مفيد لرسم إطار حول حافة الشاشة، على سبيل المثال. إذا كانت الطرفية تحتوي على هوامش تلقائية يمكن اختيارها بمفتاح، فإن ملف terminfo يفترض عادةً أنها مفعلة؛ أي am. وإذا كانت الطرفية تحتوي على أمر ينتقل إلى العمود الأول من السطر التالي، فيمكن إعطاء هذا الأمر كـ nel (سطر جديد). لا يهم إذا كان الأمر يمسح ما تبقى من السطر الحالي، لذا إذا كانت الطرفية لا تحتوي على cr و lf فقد يظل من الممكن صياغة nel عاملة من أحدهما أو كليهما.
تكفي هذه القدرات لوصف الطرفيات الورقية وطرفيات “glass-tty”. وهكذا تُوصف مبرقة الكاتب model 33 كالتالي:
33|tty33|tty|model 33 teletype,
bel=^G, cols#72, cr=^M, cud1=^J, hc, ind=^J, os,
بينما تُوصف Lear Siegler ADM-3 كالتالي:
adm3|3|lsi adm3,
am, bel=^G, clear=^Z, cols#80, cr=^M, cub1=^H, cud1=^J,
ind=^J, lines#24,
السلاسل النصية ذات المعلمات¶
تُوصف عنونة المؤشر والسلاسل الأخرى التي تتطلب معلمات في الطرفية بواسطة قدرة سلسلة ذات معلمات، مع محارف هروب تشبه printf مثل %x فيها. على سبيل المثال، لعنونة المؤشر، تُعطى القدرة cup، باستخدام معلمتين: السطر والعمود المراد العنونة إليهما. (تُرقم الأسطر والأعمدة بدءًا من الصفر وتشير إلى الشاشة المادية المرئية للمستخدم، وليس إلى أي ذاكرة غير مرئية). إذا كانت الطرفية تحتوي على عنونة مؤشر نسبية للذاكرة، فيمكن الإشارة إلى ذلك بواسطة mrcup.
تستخدم آلية المعلمات مكدسًا وأكواد % خاصة للتلاعب به. عادةً ما يقوم التسلسل بدفع إحدى المعلمات إلى المكدس ثم طباعتها بتنسيق ما. تعد الطباعة (مثل “%d”) حالة خاصة. العمليات الأخرى، بما في ذلك “%t”، تسحب معاملها من المكدس. ويُلاحظ أن العمليات الأكثر تعقيدًا غالبًا ما تكون ضرورية، مثلاً في سلسلة sgr.
ترميزات % لها المعاني التالية:
- %%
- يخرج “%”
- %[[:]أعلام][عرض[.دقة]][doxXs]
- كما في printf(3)، الأعلام هي [-+#] و مسافة. استخدم “:” للسماح للمحرف التالي بأن يكون علم “-”، وتجنب تفسير “%-” كعامل تشغيل.
- %c
- يطبع pop() مثل %c في printf
- %s
- يطبع pop() مثل %s في printf
- %p[1-9]
- يدفع المعلمة رقم i
- %P[a-z]
- يضبط المتغير الديناميكي [a-z] إلى pop()
- %g[a-z]
- يجلب المتغير الديناميكي [a-z] ويدفعه
- %P[A-Z]
- يضبط المتغير الساكن [a-z] إلى pop()
- %g[A-Z]
- يجلب المتغير الساكن [a-z] ويدفعه
- المصطلحان “static” (ساكن) و “dynamic” (ديناميكي) مضللان. تاريخيًا، هما ببساطة مجموعتان مختلفتان من المتغيرات، لا تُصفر قيمها بين استدعاءات tparm(3NCURSES). ومع ذلك، هذه الحقيقة غير موثقة في التنفيذات الأخرى. الاعتماد عليها سيؤثر سلبًا على قابلية النقل إلى تنفيذات أخرى:
- دعمت curses في الإصدار SVr2 المتغيرات الديناميكية. تُضبط هذه المتغيرات فقط بواسطة عامل %P. سيؤدي استخدام %g لمتغير معين دون ضبطه أولاً بـ %P إلى نتائج غير متوقعة، لأن المتغيرات الديناميكية هي مصفوفة محلية غير مهيأة على المكدس في دالة tparm.
- دعمت curses في الإصدار SVr3.2 المتغيرات الساكنة. وهي عبارة عن مصفوفة في هيكل TERMINAL (مُصرح عنها في term.h)، وتُصفر آليًا عندما تخصص دالة setupterm البيانات.
- لم تقدم curses في الإصدار SVr4 أي تحسينات إضافية لميزة المتغيرات الديناميكية/الساكنة.
- لا تفرق curses في Solaris XPG4 بين المتغيرات الديناميكية و الساكنة. فهما الشيء نفسه. ومثل curses في SVr4، لا تهيئ XPG4 هذه المتغيرات صراحة.
- قبل الإصدار 6.3، كانت ncurses تخزن كلاً من المتغيرات الديناميكية و الساكنة في تخزين دائم، مهيأة بالأصفار.
- بدءًا من الإصدار 6.3، تخزن ncurses المتغيرات الساكنة و الديناميكية بنفس طريقة SVr4.
- على عكس التطبيقات الأخرى، تقوم ncurses بتصفير المتغيرات الديناميكية قبل أول عامل %g أو %P.
- مثل SVr2، نطاق المتغيرات الديناميكية في ncurses هو ضمن الاستدعاء الحالي لـ tparm. استخدم المتغيرات الساكنة إذا كانت هناك حاجة لتخزين دائم.
- %'c'
- ثابت محرف c
- %{nn}
- ثابت صحيح nn
- %l
- يدفع strlen(pop)
- %+، %-، %*، %/، %m
- حسابية (%m هي mod): push(pop() op pop())
- %&، %|، %^
- عمليات البت (“and” و “or” و “or” الحصرية): push(pop() op pop())
- %=، %>، %<
- عمليات منطقية: push(pop() op pop())
- %A، %O
- عمليتا “and” و “or” المنطقيتان (للشروط)
- %!، %~
- عمليات أحادية (المتمم المنطقي ومتمم البت): push(op pop())
- %i
- إضافة 1 لأول معلمتين (لطرفيات ANSI)
- %? expr %t thenpart %e elsepart %;
- يكون هذا بنية if-then-else. جزء %e elsepart اختياري. عادة ما يقوم جزء %? expr بدفع قيمة إلى المكدس، ويقوم %t بسحبها من المكدس واختبار ما إذا كانت غير صفرية (صحيحة). إذا كانت صفرًا (خاطئة)، ينتقل التحكم إلى جزء %e (else).
- من الممكن تكوين else-if's بأسلوب Algol 68:
- حيث ci هي شروط، و bi هي أجسام.
- استخدم الخيار -f للأداتين tic أو infocmp لرؤية بنية if-then-else. يمكن لبعض السلاسل، مثل sgr، أن تكون معقدة للغاية عند كتابتها في سطر واحد. يقوم الخيار -f بتقسيم السلسلة إلى أسطر مع إزاحة الأجزاء.
العمليات الثنائية تكون بصيغة postfix مع المعاملات بالترتيب المعتاد. أي للحصول على x-5 سيُستخدم “%gx%{5}%-”. متغيرات %P و %g مستمرة عبر تقييمات سلاسل الهروب.
تأمل في HP2645، التي تحتاج للوصول إلى السطر 3 والعمود 12، إرسال \E&a12c03Y مع حشو لمدة 6 ميلي ثانية. ترتيب الأسطر والأعمدة هنا مقلوب، وتُطبع الأسطر والأعمدة كرقمنين. يُعبر عن وصف الطرفية المقابل كالتالي:
تحتاج Microterm ACT-IV إرسال السطر والعمود الحاليين مسبوقين بـ ^T، مع تشفير السطر والعمود ببساطة بالنظام الثنائي،
الطرفيات التي تستخدم “%c” تحتاج لأن تكون قادرة على إرجاع المؤشر للخلف (cub1)، وتحريكه لأعلى بمقدار سطر واحد على الشاشة (cuu1). هذا ضروري لأنه ليس من الآمن دائمًا إرسال \n و ^D و \r، فقد يغيرها النظام أو يتجاهلها. (روتينات المكتبة التي تتعامل مع terminfo تضبط أوضاع tty بحيث لا يتم توسيع علامات الجدولة أبدًا، لذا فإن إرسال \t آمن. وتبين أن هذا ضروري لـ Ann Arbor 4080).
مثال أخير هو LSI ADM-3A، التي تستخدم السطر والعمود بإزاحة مسافة، كالتالي
cup=\E=%p1%' '%+%c%p2%' '%+%c
بعد إرسال “\E=”، يُدفع المعلم الأول، وتُدفع قيمة ASCII للمسافة (32)، ثم يُجمعان (مما يدفع المجموع إلى المكدس بدلاً من القيمتين السابقتين) ويُخرج تلك القيمة كمحرف. ثم يُفعل الشيء نفسه للمعلم الثاني. من الممكن إجراء عمليات حسابية أكثر تعقيدًا باستخدام المكدس.
حركات المؤشر¶
إذا كانت الطرفية تحتوي على طريقة سريعة لإعادة المؤشر لموضع البدء (home) (إلى الزاوية اليسرى العلوية القصوى من الشاشة) فيمكن إعطاء ذلك كـ home؛ وبالمثل يمكن إعطاء طريقة سريعة للوصول إلى الزاوية اليسرى السفلية كـ ll؛ قد يتضمن هذا الصعود بـ cuu1 من موضع البدء، ولكن لا ينبغي للبرنامج أن يفعل ذلك بنفسه أبدًا (ما لم يفعل ll ذلك) لأنه لا يمكنه وضع أي افتراض حول تأثير الصعود من موضع البدء. لاحظ أن موضع البدء هو نفسه العنونة إلى (0،0): إلى الزاوية اليسرى العلوية للشاشة، وليس للذاكرة. (بالتالي، لا يمكن استخدام تسلسل \EH في طرفيات HP لـ home).
إذا كانت الطرفية تحتوي على عنونة مؤشر مطلقة للسطر أو العمود، فيمكن إعطاء هذه كقدرات ذات معلمة واحدة hpa (موضع أفقي مطلق) و vpa (موضع عمودي مطلق). أحيانًا تكون هذه أقصر من التسلسل العام ذي المعلمتين (كما في hp2645) ويمكن استخدامها بدلاً من cup. وإذا وُجدت حركات محلية ذات معلمات (مثل التحرك n مسافة لليمين) فيمكن إعطاء هذه كـ cud و cub و cuf و cuu مع معلمة واحدة تشير لعدد المسافات المراد التحرك بها. هذه مفيدة أساسًا إذا كانت الطرفية لا تمتلك cup، مثل TEKTRONIX 4025.
إذا كانت الطرفية بحاجة لأن تكون في وضع خاص عند تشغيل برنامج يستخدم هذه القدرات، فيمكن إعطاء أكواد الدخول والخروج من هذا الوضع كـ smcup و rmcup. يحدث هذا، على سبيل المثال، في طرفيات مثل Concept التي تحتوي على أكثر من صفحة ذاكرة. إذا كانت الطرفية تمتلك عنونة مؤشر نسبية للذاكرة فقط وليس نسبية للشاشة، فيجب تثبيت نافذة بحجم شاشة واحدة في الطرفية لتعمل عنونة المؤشر بشكل صحيح. يُستخدم هذا أيضًا لـ TEKTRONIX 4025، حيث يضبط smcup محرف الأمر ليكون هو المحرف المستخدم بواسطة terminfo. إذا كان تسلسل smcup لن يستعيد الشاشة بعد إخراج تسلسل rmcup (إلى الحالة التي كانت عليها قبل إخراج rmcup)، فحدد nrrmc.
الهوامش¶
تسرد SVr4 (و X/Open Curses) عدة قدرات سلاسل لضبط الهوامش. كان اثنان منها مخصصين للاستخدام مع الطرفيات، والستة الأخرى مخصصة للاستخدام مع الطابعات.
- تفترض قدرتا الطرفية أن الطرفية قد تمتلك القدرة على ضبط الهامش الأيسر و/أو الأيمن عند موضع عمود المؤشر الحالي.
- تفترض قدرات الطابعة أن الطابعة قد تمتلك نوعين من القدرات:
- القدرة على ضبط هامش علوي و/أو سفلي باستخدام موضع السطر الحالي، و
- قدرات ذات معلمات لضبط الهوامش العلوية والسفلية واليسرى واليمنى مع إعطاء عدد الأسطر أو الأعمدة.
عمليًا، التصنيف إلى “طرفية” و “طابعة” ليس مناسبًا:
- •
- تستخدم قاعدة بيانات الطرفية AT&T SVr4 السلسلة smgl أربع مرات، لأجهزة AT&T.
- ثلاثة من الأربعة هي طابعات. وهي تفتقر إلى القدرة على ضبط الهوامش اليسرى/اليمنى عن طريق تحديد العمود.
- •
- قد تدعم طرفيات أخرى (غير AT&T) الهوامش ولكن باستخدام افتراضات مختلفة عن AT&T.
- على سبيل المثال، تدعم DEC VT420 الهوامش اليسرى/اليمنى، ولكن فقط باستخدام معلمة العمود. وكعقدة إضافية، تستخدم VT420 إعدادين لتمكين الهوامش اليسرى/اليمنى بالكامل (وضع الهامش الأيسر/الأيمن، ووضع الأصل). الأول يُمكن الهوامش، مما يجعل النص المطبوع يلتف داخل الهوامش، بينما الثاني مطلوب لمنع عنونة المؤشر خارج تلك الهوامش.
- •
- يُضبط كلا الهامشين الأيسر والأيمن في DEC VT420 بتسلسل تحكم واحد. وإذا حُذف أحدهما، فسيُضبط الهامش المقابل على الحافة اليسرى أو اليمنى للشاشة (بدلاً من ترك الهامش دون تعديل).
هذه هي القدرات المتعلقة بالهوامش:
| الاسم | الوصف |
| smgl | ضبط الهامش الأيسر عند العمود الحالي |
| smgr | ضبط الهامش الأيمن عند العمود الحالي |
| smgb | اضبط الهامش السفلي عند السطر الحالي |
| smgt | اضبط الهامش العلوي عند السطر الحالي |
| smgbp | ضبط الهامش السفلي عند السطر N |
| smglp | ضبط الهامش الأيسر عند العمود N |
| smgrp | ضبط الهامش الأيمن عند العمود N |
| smgtp | ضبط الهامش العلوي عند السطر N |
| smglr | ضبط كلا الهامشين الأيسر والأيمن إلى L و R |
| smgtb | ضبط كلا الهامشين العلوي والسفلي إلى T و B |
عند كتابة تطبيق يستخدم قدرات السلاسل هذه، يجب أولاً فحص الأزواج لمعرفة ما إذا كانت كل قدرة في الزوج مضبوطة أو أن واحدة فقط هي المضبوطة:
- إذا ضُبط كل من smglp و smgrp، تُستخدم كل منهما مع وسيط واحد، N، والذي يعطي رقم العمود للهامش الأيسر والأيمن، على التوالي.
- إذا ضُبط كل من smgtp و smgbp، تُستخدم كل منهما لضبط الهامش العلوي والسفلي، على التوالي:
- تُستخدم smgtp مع وسيط واحد، N، وهو رقم السطر للهامش العلوي.
- تُستخدم smgbp مع وسيطين، N و M، يعطيان رقم السطر للهامش السفلي، الأول يُحسب من أعلى الصفحة والثاني يُحسب من أسفلها. وهذا يلائم الأسلوبين المتبعين في تحديد الهامش السفلي في طابعات المصنعين المختلفين.
- عند تصميم مدخل terminfo لطابعة بها هامش سفلي قابل للضبط، يجب استخدام الوسيط الأول أو الثاني فقط، حسب الطابعة. وعند تطوير تطبيق يستخدم smgbp لضبط الهامش السفلي، يجب إعطاء كلا الوسيطين.
وبالعكس، عندما تُضبط قدرة واحدة فقط في الزوج:
- إذا ضُبطت واحدة فقط من smglp أو smgrp، فعندها تُستخدم مع وسيطين، رقم العمود للهامشين الأيسر والأيمن، بهذا الترتيب.
- وبالمثل، إذا ضُبطت واحدة فقط من smgtp أو smgbp، فعندها تُستخدم مع وسيطين يعطيان الهامشين العلوي والسفلي، بهذا الترتيب، مع الحساب من أعلى الصفحة.
- عند تصميم مدخل terminfo لطابعة تتطلب ضبط كل من الهامشين الأيسر والأيمن أو العلوي والسفلي في وقت واحد، يجب تعريف قدرة واحدة فقط في الزوجين smglp و smgrp أو smgtp و smgbp، وترك الأخرى غير معرفة.
باستثناء أوصاف الطرفيات القديمة جدًا، مثل تلك التي طُورت لـ SVr4، يجب اعتبار المخطط الموصوف للتو مهجورًا. أُضيفت مجموعة محسنة من القدرات في أواخر إصدارات SVr4 (smglr و smgtb)، والتي تستخدم صراحة معلمتين لضبط الهوامش اليسرى/اليمنى أو العلوية/السفلية.
عند ضبط الهوامش، تكون قيم الأسطر والأعمدة مبنية على الصفر.
يجب تعريف قدرة السلسلة mgc. تعتمد تطبيقات مثل tabs(1) على هذا لإعادة ضبط جميع الهوامش.
مسح المناطق¶
إذا استطاعت الطرفية المسح من الموضع الحالي إلى نهاية السطر، مع ترك المؤشر مكانه، فيجب إعطاء هذا كـ el. وإذا استطاعت المسح من بداية السطر إلى الموضع الحالي شمولاً، مع ترك المؤشر مكانه، فيجب إعطاء هذا كـ el1. وإذا استطاعت الطرفية المسح من الموضع الحالي إلى نهاية العرض، فيجب إعطاء هذا كـ ed. يُعرف Ed فقط من العمود الأول للسطر. (وبالتالي، يمكن محاكاته بطلب حذف عدد كبير من الأسطر، إذا لم يتوفر ed حقيقي).
إدراج/حذف سطر والحركات العمودية¶
إذا استطاعت الطرفية فتح سطر فارغ جديد قبل السطر الذي يوجد فيه المؤشر، فيجب إعطاء هذا كـ il1؛ ويُفعل ذلك فقط من الموضع الأول للسطر. يجب أن يظهر المؤشر بعدها على السطر الفارغ الجديد. وإذا استطاعت الطرفية حذف السطر الذي يقف عليه المؤشر، فيجب إعطاء هذا كـ dl1؛ ويُفعل ذلك فقط من الموضع الأول في السطر المراد حذفه. نُسخ il1 و dl1 التي تأخذ معلمة واحدة وتدرج أو تحذف هذا العدد من الأسطر يمكن إعطاؤها كـ il و dl.
إذا كانت الطرفية تحتوي على منطقة تمرير قابلة للضبط (مثل vt100) فإن الأمر لضبط ذلك يمكن وصفه بقدرة csr، والتي تأخذ معلمتين: السطرين العلوي والسفلي لمنطقة التمرير. ويا للأسف، يكون موضع المؤشر غير محدد بعد استخدام هذا الأمر.
من الممكن الحصول على تأثير إدراج أو حذف سطر باستخدام csr على منطقة مختارة بشكل صحيح؛ قد تكون أوامر sc و rc (حفظ واستعادة المؤشر) مفيدة لضمان أن سلسلة الإدراج/الحذف المصنعة لا تحرك المؤشر. (لاحظ أن مكتبة ncurses(3NCURSES) تجري هذا التصنيع آليًا، لذا لا داعي لتركيب سلاسل إدراج/حذف لإدخال باستخدام csr).
طريقة أخرى لبناء الإدراج والحذف قد تكون استخدام مزيج من الفهرس مع ميزة قفل الذاكرة الموجودة في بعض الطرفيات (مثل سلسلة HP-700/90، التي تحتوي أيضًا على إدراج/حذف).
يمكن أيضًا إدراج أسطر في أعلى أو أسفل الشاشة باستخدام ri أو ind في العديد من الطرفيات التي لا تحتوي على إدراج/حذف سطر حقيقي، وغالبًا ما يكون ذلك أسرع حتى في الطرفيات التي تمتلك تلك الميزات.
يجب ضبط القيمة البوليانية non_dest_scroll_region إذا كانت كل نافذة تمرير هي فعليًا منفذ عرض على لوحة بحجم الشاشة. لاختبار هذه القدرة، أنشئ منطقة تمرير في منتصف الشاشة، واكتب شيئًا في السطر السفلي، وانقل المؤشر إلى أعلى المنطقة، وقم بـ ri متبوعة بـ dl1 أو ind. إذا عاودت البيانات التي خرجت من أسفل المنطقة بسبب ri الظهور، فإن التمرير غير تدميري. تتوقع System V و X/Open Curses أن ind و ri و indn و rin ستحاكي التمرير التدميري؛ وتحذرك وثائقها من تعريف csr ما لم يكن ذلك صحيحًا. تطبيق curses هذا أكثر ليبرالية وسيقوم بعمليات مسح صريحة بعد التمرير إذا عُرفت ndsrc.
إذا استطاعت الطرفية تعريف نافذة كجزء من الذاكرة، تؤثر عليها جميع الأوامر، فيجب إعطاء ذلك كسلسلة ذات معلمات wind. المعلمات الأربع هي أسطر البداية والنهاية في الذاكرة وأعمدة البداية والنهاية في الذاكرة، بهذا الترتيب.
إذا استطاعت الطرفية الاحتفاظ بذاكرة العرض بالأعلى، فيجب إعطاء القدرة da؛ وإذا أمكن الاحتفاظ بذاكرة العرض بالأسفل، فيجب إعطاء db. تشير هذه إلى أن حذف سطر أو التمرير قد يرفع أسطرًا غير فارغة من الأسفل، أو أن التمرير للخلف بـ ri قد ينزل أسطرًا غير فارغة.
إدراج/حذف محرف¶
هناك نوعان رئيسان من النهايات الطرفية الذكية فيما يتعلق بإدراج/حذف المحارف والتي يمكن وصفها باستخدام terminfo. عمليات إدراج/حذف المحارف الأكثر شيوعًا تؤثر فقط على المحارف في السطر الحالي وتزيح المحارف خارج نهاية السطر بشكل صارم. نهايات طرفية أخرى، مثل Concept 100 و Perkin Elmer Owl، تفرق بين الفراغات المكتوبة وغير المكتوبة على الشاشة، حيث تزيح عند الإدراج أو الحذف فقط إلى فراغ غير مكتوب على الشاشة والذي إما يُحذف، أو يُوسع إلى فراغين غير مكتوبين.
يمكنك تحديد نوع النهاية الطرفية لديك عن طريق مسح الشاشة ثم كتابة نص مفصول بحركات المؤشر. اكتب “abc def” باستخدام حركات المؤشر المحلية (وليس المسافات) بين “abc” و “def”). ثم ضع المؤشر قبل “abc” واجعل النهاية الطرفية في وضع الإدراج. إذا أدت كتابة المحارف إلى إزاحة بقية السطر بشكل صارم وسقوط المحارف من النهاية، فإن نهايتك الطرفية لا تفرق بين الفراغات والمواقع غير المكتوبة. أما إذا انزاحت “abc” نحو “def” ثم تحركتا معًا حول نهاية السطر الحالي وإلى السطر التالي أثناء الإدراج، فلديك النوع الثاني من النهايات الطرفية، ويجب عليك إعطاء الميزة in، والتي ترمز إلى “insert null”) (إدراج حرف فارغ).
على الرغم من أن هاتين صفتان منفصلتان منطقيًا (وضع إدراج لسطر واحد مقابل وضع إدراج لأسطر متعددة، والمعاملة الخاصة للمسافات غير المكتوبة) إلا أننا لم نرَ أي نهايات طرفية لا يمكن وصف وضع الإدراج فيها بصفة واحدة.
يمكن لـ Terminfo وصف كل من النهايات الطرفية التي تحتوي على وضع إدراج، والنهايات الطرفية التي ترسل تسلسل بسيطًا لفتح موضع فارغ في السطر الحالي. أعطِ smir كـ تسلسل للدخول في وضع الإدراج. وأعطِ rmir كـ تسلسل للخروج من وضع الإدراج. والآن أعطِ ich1 لأي تسلسل يجب إرساله مباشرة قبل إرسال المحرف المراد إدراجه. معظم النهايات الطرفية ذات وضع الإدراج الحقيقي لن تعطي ich1؛ بينما النهايات الطرفية التي ترسل تسلسل لفتح موضع شاشة يجب أن تعطيه هنا.
إذا كانت نهايتك الطرفية تدعم كليهما، فعادة ما يُفضل وضع الإدراج على ich1. من الناحية التقنية، لا ينبغي إعطاء كليهما إلا إذا كانت النهاية الطرفية تتطلب استخدامهما معًا بالفعل. وبناءً على ذلك، ترتبك بعض التطبيقات التي لا تستخدم curses إذا وُجد كلاهما؛ والعرض هو تضاعف المحارف في التحديث باستخدام الإدراج. هذا المتطلب نادر الآن؛ فمعظم تسلسلات ich لا تتطلب smir سابقًا، ومعظم أوضاع إدراج smir لا تتطلب ich1 قبل كل محرف. لذلك، يفترض curses الجديد أن هذا هو الحال ويستخدم إما rmir/smir أو ich/ich1 حسب الاقتضاء (ولكن ليس كليهما). إذا كان عليك كتابة مدخلة لاستخدامها تحت curses الجديد لنهاية طرفية قديمة بما يكفي لتحتاج إلى كليهما، فضمن تسلسلات rmir/smir في ich1.
إذا كانت هناك حاجة إلى حشو (padding) بعد الإدراج، فأعطِ هذا كعدد من المللي ثانية في ip (خيار سلسلة نصية). أي تسلسل آخر قد يلزم إرساله بعد إدراج محرف واحد يمكن إعطاؤه أيضًا في ip. إذا كانت نهايتك الطرفية تحتاج إلى وضعها في “وضع الإدراج” ورمز خاص يسبق كل محرف مُدرج، فيمكن إعطاء كل من smir/rmir و ich1، وسيُستخدم كلاهما. ميزة ich، مع معطى واحد n، ستكرر تأثيرات ich1 لـ n من المرات.
إذا كان الحشو ضروريًا بين المحارف المكتوبة أثناء عدم التواجد في وضع الإدراج، فأعطِ هذا كعدد مللي ثانية من الحشو في rmp.
من الضروري أحياناً التنقل أثناء التواجد في وضع الإدراج لحذف المحارف في نفس السطر (على سبيل المثال، إذا كانت هناك علامة جدولة بعد موضع الإدراج). إذا كانت طرفيتك تسمح بالحركة أثناء التواجد في وضع الإدراج، فيمكنك منح القدرة mir لتسريع الإدراج في هذه الحالة. سيؤثر حذف mir على السرعة فقط. يجب ألا تمتلك بعض الطرفيات (لا سيما طرفيات Datamedia) القدرة mir بسبب طريقة عمل وضع الإدراج فيها.
أخيرًا، يمكنك تحديد dch1 لحذف محرف واحد، و dch مع معطى واحد، n، لحذف n من المحارف، ووضع الحذف عن طريق إعطاء smdc و rmdc للدخول والخروج من وضع الحذف (أي وضع يجب وضع النهاية الطرفية فيه ليعمل dch1).
يمكن إعطاء أمر لمسح n من المحارف (ما يعادل إخراج n من الفراغات دون تحريك المؤشر) كـ ech مع معطى واحد.
الإبراز، والتسطير، والأجراس المرئية¶
إذا كانت نهايتك الطرفية تحتوي على نوع واحد أو أكثر من سمات العرض، فيمكن تمثيل هذه السمات بعدة طرق مختلفة. يجب عليك اختيار شكل عرض واحد كـ وضع البروز (standout mode)، ليمثل تنسيقًا جيدًا عالي التباين ومريحًا للعين لإبراز رسائل الخطأ وغيرها من منبهات الانتباه. (إذا كان لديك خيار، فإن الفيديو المعكوس مع نصف السطوع جيد، أو الفيديو المعكوس وحده). تُعطى تسلسلات الدخول والخروج من وضع البروز كـ smso و rmso على التوالي. إذا كان الرمز المستخدم للتغيير إلى وضع البروز أو الخروج منه يترك مسافة فارغة واحدة أو حتى اثنتين على الشاشة، كما تفعل TVI 912 و Teleray 1061، فيجب إعطاء xmc لتحديد عدد المساحات المتروكة.
يمكن إعطاء رموز لبدء التسطير وإنهاء التسطير كـ smul و rmul على التوالي. إذا كانت النهاية الطرفية تحتوي على رمز لتسطير المحرف الحالي وتحريك المؤشر مسافة واحدة إلى اليمين، مثل Microterm Mime، فيمكن إعطاء ذلك كـ uc.
تتضمن الميزات الأخرى للدخول في أوضاع إبراز متنوعة blink (وميض)، و bold (عريض أو ساطع للغاية)، و dim (خافت أو نصف ساطع)، و invis (نص فارغ أو غير مرئي)، و prot (محمي)، و rev (فيديو معكوس)، و sgr0 (إيقاف جميع أوضاع السمات)، و smacs (الدخول في وضع مجموعة المحارف البديلة)، و rmacs (الخروج من وضع مجموعة المحارف البديلة). تشغيل أي من هذه الأوضاع بشكل فردي قد يؤدي أو لا يؤدي إلى إيقاف الأوضاع الأخرى.
إذا كان هناك تسلسل لضبط تركيبات عشوائية من الأوضاع، فيجب إعطاء ذلك كـ sgr (ضبط السمات)، مع أخذ 9 معطيات. كل معطى يكون إما صفرًا (0) أو غير صفري، حسب ما إذا كانت السمة المقابلة مفعلة أو معطلة. المعطيات التسعة هي، بالترتيب: البروز، التسطير، العكس، الوميض، الخفوت، التعريض، الفراغ، الحماية، مجموعة المحارف البديلة. لا يلزم دعم جميع الأوضاع بواسطة sgr، بل فقط تلك التي توجد لها أوامر سمات منفصلة مقابلة.
على سبيل المثال، يدعم DEC vt220 معظم الأوضاع:
| معطى tparm | السمة | تسلسل الهروب |
| لا شيء | لا شيء | \E[0m |
| p1 | standout | \E[0;1;7m |
| p2 | التسطير | \E[0;4m |
| p3 | العكس | \E[0;7m |
| p4 | blink | \E[0;5m |
| p5 | dim | غير متاح |
| p6 | bold | \E[0;1m |
| p7 | invis | \E[0;8m |
| p8 | الحماية | غير مستخدم |
| p9 | مجموعة محارف بديلة | ^O (معطل) ^N (مفعل) |
نبدأ كل تسلسل هروب بإيقاف أي أوضاع موجودة، حيث لا توجد طريقة سريعة لتحديد ما إذا كانت نشطة. تم ضبط البروز ليكون مزيجًا من العكس والتعريض. تحتوي النهاية الطرفية vt220 على وضع حماية، على الرغم من أنه لا يُستخدم بشكل شائع في sgr لأنه يحمي المحارف الموجودة على الشاشة من عمليات المسح الخاصة بالمضيف. يختلف وضع altcharset أيضًا في أنه إما ^O أو ^N، اعتمادًا على ما إذا كان معطلاً أو مفعلاً. إذا تم تشغيل جميع الأوضاع، فإن التسلسل الناتج هو \E[0;1;4;5;7;8m^N.
بعض التسلسلات مشتركة بين أوضاع مختلفة. على سبيل المثال، يتم إخراج ;7 عندما يكون p1 أو p3 صحيحًا، أي إذا تم تشغيل وضعي البروز أو العكس.
كتابة التسلسلات المذكورة أعلاه، مع تبعياتها، تعطي
| تسلسل | متى يتم الإخراج | ترجمة terminfo |
| \E[0 | دائمًا | \E[0 |
| ;1 | إذا كان p1 أو p6 | %?%p1%p6%|%t;1%; |
| ;4 | إذا كان p2 | %?%p2%|%t;4%; |
| ;5 | إذا كان p4 | %?%p4%|%t;5%; |
| ;7 | إذا كان p1 أو p3 | %?%p1%p3%|%t;7%; |
| ;8 | إذا كان p7 | %?%p7%|%t;8%; |
| m | دائمًا | m |
| ^N أو ^O | إذا كان p9 فـ ^N، وإلا فـ ^O | %?%p9%t^N%e^O%; |
تجميع كل هذا معًا في تسلسل sgr يعطي:
sgr=\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p4%t;5%;
%?%p1%p3%|%t;7%;%?%p7%t;8%;m%?%p9%t\016%e\017%;,
تذكر أنه إذا حددت sgr، فيجب عليك أيضًا تحديد sgr0. أيضًا، تعتمد بعض التطبيقات على إعطاء sgr إذا أُعطي sgr0، ومع ذلك، لا تمتلك جميع مدخلات terminfo بالضرورة سلسلة sgr. العديد من مدخلات terminfo مشتقة من مدخلات termcap التي لا تحتوي على سلسلة sgr. العيب الوحيد لإضافة سلسلة sgr هو أن termcap يفترض أيضًا أن sgr0 لا يخرج من وضع مجموعة المحارف البديلة.
النهايات الطرفية التي تعاني من خلل “magic cookie” (xmc) تضع “cookies” خاصة عندما تتلقى تسلسلات ضبط الوضع، مما يؤثر على خوارزمية العرض بدلاً من وجود بتات إضافية لكل محرف. تخرج بعض النهايات الطرفية، مثل HP 2621، آليًا من وضع البروز عندما تنتقل إلى سطر جديد أو يتم توجيه المؤشر. البرامج التي تستخدم وضع البروز يجب أن تخرج من وضع البروز قبل تحريك المؤشر أو إرسال سطر جديد، ما لم تكن ميزة msgr، التي تؤكد أنه من الآمن التحرك في وضع البروز، موجودة.
إذا كانت لدى النهاية الطرفية طريقة لوميض الشاشة للإشارة إلى وجود خطأ بهدوء (بديل للجرس) فيمكن إعطاء ذلك كـ flash؛ ويجب ألا يحرك المؤشر.
إذا كان المؤشر يحتاج إلى جعله أكثر وضوحًا من المعتاد عندما لا يكون في السطر السفلي (لجعل، على سبيل المثال، التسطير غير الوامض عبارة عن كتلة أو تسطير وامض يسهل العثور عليه) فأعطِ هذا التسلسل كـ cvvis. إذا كانت هناك طريقة لجعل المؤشر غير مرئي تمامًا، فأعطِ ذلك كـ civis. يجب إعطاء الميزة cnorm التي تلغي تأثيرات كلا هذين الوضعين.
إذا كانت نهايتك الطرفية تولد محارف مسطرة بشكل صحيح (دون الحاجة إلى رموز خاصة) على الرغم من أنها لا تقوم بالطباعة الفوقية (overstrike)، فيجب عليك إعطاء الميزة ul. إذا كان محرف يطبع فوق آخر يترك كلا المحرفين على الشاشة، فحدد الميزة os. إذا كانت الطباعات الفوقية قابلة للمسح بفراغ، فيجب الإشارة إلى ذلك بإعطاء eo.
لوحة المفاتيح الرقمية ومفاتيح الوظائف¶
إذا كانت النهاية الطرفية تحتوي على لوحة مفاتيح رقمية ترسل رموزًا عند الضغط على المفاتيح، فيمكن إعطاء هذه المعلومات. لاحظ أنه ليس من الممكن التعامل مع النهايات الطرفية حيث تعمل لوحة المفاتيح في الوضع المحلي فقط (ينطبق هذا، على سبيل المثال، على مفاتيح HP 2621 غير المزاحة). إذا كان من الممكن ضبط لوحة المفاتيح للإرسال أو عدم الإرسال، فأعطِ هذه الرموز كـ smkx و rmkx. وإلا فيُفترض أن لوحة المفاتيح ترسل دائمًا.
الرموز المرسلة بواسطة مفاتيح السهم الأيسر، والسهم الأيمن، والسهم للأعلى، والسهم للأسفل، ومفاتيح البداية (home) يمكن إعطاؤها كـ kcub1 و kcuf1 و kcuu1 و kcud1 و و khome على التوالي. إذا كانت هناك مفاتيح وظائف مثل f0، f1، ...، f10، فإن الرموز التي ترسلها يمكن إعطاؤها كـ kf0، kf1، ...، kf10. إذا كانت لهذه المفاتيح لصائق غير المبدئية f0 عبر f10، فيمكن إعطاء الـ لصائق كـ lf0، lf1، ...، lf10.
الرموز التي ترسلها مفاتيح خاصة أخرى معينة يمكن إعطاؤها:
- kll (نهاية الصفحة)،
- kbs (مفتاح الرجوع)،
- ktbc (مسح جميع علامات الجدولة)،
- kctab (مسح علامة الجدولة في هذا العمود)،
- kclr (مفتاح مسح الشاشة أو الحذف)،
- kdch1 (حذف محرف)،
- kdl1 (حذف سطر)،
- krmir (الخروج من وضع الإدراج)،
- kel (مسح حتى نهاية السطر)،
- ked (مسح حتى نهاية الشاشة)،
- kich1 (إدراج محرف أو الدخول في وضع الإدراج)،
- kil1 (إدراج سطر)،
- knp (الصفحة التالية)،
- kpp (الصفحة السابقة)،
- kind (التمرير للأمام/للأسفل)،
- kri (التمرير للخلف/للأعلى)،
- khts (ضبط علامة جدولة في هذا العمود).
بالإضافة إلى ذلك، إذا كانت لوحة المفاتيح تحتوي على مصفوفة 3 في 3 من المفاتيح بما في ذلك مفاتيح الأسهم الأربعة، فيمكن إعطاء المفاتيح الخمسة الأخرى كـ ka1 و ka3 و kb2 و kc1 و kc3. هذه المفاتيح مفيدة عندما تكون هناك حاجة إلى تأثيرات لوحة اتجاهية 3 في 3.
السلاسل النصية لبرمجة مفاتيح الوظائف يمكن إعطاؤها كـ pfkey و pfloc و pfx. يجب تحديد سلسلة لبرمجة لصائق الشاشة كـ pln. تأخذ كل سلسلة من هذه السلاسل معطيين: رقم مفتاح الوظيفة المراد برمجته (من 0 إلى 10) والسلسلة المراد برمجته بها. أرقام مفاتيح الوظائف خارج هذا النطاق قد تبرمج مفاتيح غير محددة بطريقة تعتمد على النهاية الطرفية. الفرق بين الميزات هو أن pfkey يجعل الضغط على المفتاح المعطى مماثلاً لكتابة المستخدم للسلسلة المعطاة؛ بينما pfloc يجعل السلسلة تُنفذ بواسطة النهاية الطرفية محليًا؛ و pfx يجعل السلسلة تُرسل إلى الـ حاسوب.
تحدد الميزات nlab و lw و lh عدد الـ لصائق القابلة للبرمجة على الشاشة وعرضها وارتفاعها. إذا كانت هناك أوامر لتشغيل الـ لصائق وإيقافها، فأعطها في smln و rmln. يتم إخراج smln عادةً بعد تسلسل pln واحد أو أكثر للتأكد من أن التغيير قد أصبح مرئيًا.
علامات الجدولة والبدء¶
تُستخدم ميزات قليلة فقط لإدارة علامات توقف الجدولة.
- إذا كانت النهاية الطرفية تحتوي على علامات جدولة عتادية، فحدد تسلسل المحارف الذي ينتقل إلى علامة التوقف التالية كقيمة لميزة السلسلة tab (ht) (عادة Control+I).
- حدد تسلسل محارف يرجع (يتحرك يسارًا) إلى علامة توقف الجدولة السابقة كقيمة لميزة السلسلة back_tab (cbt).
- حسب العرف، إذا ضُبطت أوضاع النهاية الطرفية بحيث تُوسع علامات الجدولة بواسطة المضيف بدلاً من النهاية الطرفية، فلا ينبغي للتطبيقات استخدام ميزات tab (ht) أو back_tab (cbt) حتى لو كانت موجودة، لأن المستخدم قد لا يكون قد ضبط علامات توقف الجدولة بشكل صحيح.
- •
- إذا كانت النهاية الطرفية تحتوي على علامات توقف جدولة عتادية تُضبط عند كل n من خلايا المحارف عند تشغيل النهاية الطرفية، فحدد n كقيمة للميزة العددية init_tabs (it).
- يفسر الأمرا tset و “tput init” وجود ميزة init_tabs (it) على أنها تعني أن النهاية الطرفية مسؤولة عن توسيع علامات الجدولة بالإضافة إلى أنها تعليمات لضبط علامات توقف الجدولة على قيمتها. إذا كانت النهاية الطرفية تحتوي على علامات توقف جدولة يمكن حفظها في ذاكرة غير متطايرة، فيمكن لوصف نوع terminfo الخاص بها افتراض أنها مضبوطة بشكل صحيح.
تتضمن الميزات الأخرى
- is1 و is2 و is3، وهي سلاسل بدء للنهاية الطرفية،
- iprog، وهو مسار برنامج سيُشغل لبدء النهاية الطرفية،
- و if، وهو اسم ملف يحتوي على سلاسل بدء طويلة.
يُتوقع من هذه السلاسل ضبط النهاية الطرفية في أوضاع متوافقة مع بقية وصف terminfo. تُرسل عادةً إلى النهاية الطرفية، بواسطة خيار init لبرنامج tput، في كل مرة يسجل فيها المستخدم دخوله. وستُطبع بالترتيب التالي:
- شغل البرنامج
- iprog
- أخرج
-
is1 و
is2 - اضبط الهوامش باستخدام
- mgc أو
smglp و smgrp أو
smgl و smgr - اضبط علامات الجدولة باستخدام
- tbc و hts
- اطبع الملف
- if
- وفي النهاية أخرج
- is3.
يتم إجراء معظم عمليات البدء باستخدام is2. يمكن ضبط أوضاع النهاية الطرفية الخاصة دون تكرار السلاسل بوضع التسلسلات المشتركة في is2 والحالات الخاصة في is1 و is3.
مجموعة من التسلسلات التي تقوم بإعادة ضبط أقوى من حالة غير معروفة تمامًا يمكن إعطاؤها كـ rs1 و rs2 و rf و rs3، بشكل مماثل لـ is1 و is2 و if و is3 على التوالي. تُخرج هذه السلاسل بواسطة خيار reset لبرنامج tput، أو بواسطة برنامج reset (وهو اسم مستعار لـ tset)، والذي يُستخدم عندما تصل النهاية الطرفية إلى حالة عالقة. توضع الأوامر عادةً في rs1 و rs2 و rs3 و rf فقط إذا كانت تنتج تأثيرات مزعجة على الشاشة وليست ضرورية عند تسجيل الدخول. على سبيل المثال، الأمر لضبط vt100 في وضع 80 عمودًا سيكون عادةً جزءًا من is2، ولكنه يسبب خللاً مزعجًا في الشاشة ولا يلزم عادةً لأن النهاية الطرفية تكون بالفعل في وضع 80 عمودًا.
يكتب برنامج reset سلاسل تتضمن iprog، إلخ، بنفس الترتيب الذي يتبعه برنامج init، مستخدمًا rs1، إلخ، بدلاً من is1، إلخ. وإذا كانت أي من سلاسل ميزة إعادة الضبط rs1 أو rs2 أو rs3 أو rf مفقودة، فإن برنامج reset يعود إلى ميزة سلسلة البدء المقابلة.
إذا كانت هناك أوامر لضبط ومسح علامات توقف الجدولة، فيمكن إعطاؤها كـ tbc (مسح جميع علامات توقف الجدولة) و hts (ضبط علامة توقف جدولة في العمود الحالي لكل سطر). إذا كانت هناك حاجة إلى تسلسل أكثر تعقيدًا لضبط الجدولة مما يمكن وصفه بهذا، فيمكن وضع التسلسل في is2 أو if.
يستخدم أمر tput reset نفس سلاسل الميزات التي يستخدمها أمر reset، على الرغم من أن البرنامجين (tput و reset) يوفران خيارات سطر أوامر مختلفة.
من الناحية العملية، لا تُستخدم ميزات terminfo هذه غالبًا في بدء علامات الجدولة (على الرغم من أنها مطلوبة لبرنامج tabs):
- •
- تقريبًا جميع النهايات الطرفية العتادية (على الأقل تلك التي دعمت علامات الجدولة) تبدأ هذه العلامات عند كل ثمانية أعمدة:
- الاستثناء الوحيد كان سلسلة AT&T 2300، التي ضبطت علامات الجدولة عند كل خمسة أعمدة.
- على وجه الخصوص، قدم مطورو النهايات الطرفية العتادية التي تُستخدم عادةً كنماذج لمحاكيات النهايات الطرفية الحديثة وثائق تثبت أن ثمانية أعمدة كانت هي المعيار.
- بسبب هذا، تستخدم برامج بدء النهايات الطرفية tput و tset ميزات tbc (clear_all_tabs) و hts (set_tab) مباشرة فقط عندما تكون ميزة it (init_tabs) مضبوطة على قيمة غير ثمانية.
التأخيرات والحشو¶
العديد من النهايات الطرفية القديمة والبطيئة لا تدعم مصافحة XON/XOFF أو DTR، بما في ذلك نهايات النسخ الورقي وبعض شاشات CRT العتيقة جدًا (بما في ذلك، على سبيل المثال، DEC VT100s). قد تتطلب هذه محارف حشو بعد حركات معينة للمؤشر وتغييرات الشاشة.
إذا كانت النهاية الطرفية تستخدم مصافحة xon/xoff للتحكم في التدفق (أي أنها ترسل آليًا ^S إلى المضيف عندما تقترب عوازل الإدخال الخاصة بها من الامتلاء)، فاضبط xon. تعمل هذه الميزة على منع إصدار الحشو. يمكنك أيضًا ضبطها لأجهزة الكونسول المخططة في الذاكرة بشكل فعال والتي ليس لها حد للسرعة. يجب أن تظل معلومات الحشو مضمنة حتى تتمكن الروتينات من اتخاذ قرارات أفضل بشأن التكاليف النسبية، ولكن محارف الحشو الفعلية لن تُرسل.
إذا أُعطيت pb (معدل بود للحشو)، فسيُكبح الحشو عند معدلات بود أقل من قيمة pb. إذا لم تكن للمدخلة معدل بود للحشو، فإن ما إذا كان الحشو سيُصدر أم لا يُتحكم فيه بالكامل بواسطة xon.
إذا كانت النهاية الطرفية تتطلب محرفًا غير المحرف الخالي (صفر) كحشو، فيمكن إعطاء ذلك كـ pad. يتم استخدام المحرف الأول فقط من سلسلة pad.
أسطر الحالة¶
تحتوي بعض النهايات الطرفية على “سطر حالة” إضافي لا تستخدمه البرمجيات عادةً (وبالتالي لا يُحسب في ميزة lines الخاصة بالنهاية الطرفية).
أبسط حالة هي سطر الحالة الذي يمكن توجيه المؤشر إليه ولكنه ليس جزءًا من منطقة التمرير الرئيسة على الشاشة؛ يمتلك Heathkit H19 سطر حالة من هذا النوع، وكذلك VT100 المكون من 24 سطرًا مع منطقة تمرير من 23 سطرًا ضُبطت عند البدء. يُشار إلى هذه الحالة بميزة hs.
تحتاج بعض النهايات الطرفية ذات أسطر الحالة إلى تسلسلات خاصة للوصول إلى سطر الحالة. يمكن التعبير عن ذلك كسلسلة مع معطى واحد tsl والذي يأخذ المؤشر إلى عمود محدد يبدأ من الصفر على سطر الحالة. يجب أن تعود الميزة fsl إلى مواضع المؤشر في الشاشة الرئيسة قبل آخر tsl. قد تحتاج إلى تضمين قيم السلسلة لـ sc (حفظ المؤشر) و rc (استعادة المؤشر) في tsl و fsl لتحقيق ذلك.
يُفترض عادةً أن يكون عرض سطر الحالة هو نفس عرض النهاية الطرفية. إذا لم يكن الأمر كذلك، يمكنك تحديده باستخدام الميزة العددية wsl.
يمكن تحديد أمر لمسح سطر الحالة أو جعله فارغًا كـ dsl.
تحدد قدرة القيمة المنطقية eslok أن تسلسلات الهروب، وعلامات التبويب، وما إلى ذلك، تعمل بشكل اعتيادي في سطر الحالة.
لا يستخدم تنفيذ ncurses أيًا من هذه القدرات حتى الآن. لقد وُثقت هنا في حال أصبحت مهمة مستقبلاً.
رسوميات الخطوط¶
تمتلك العديد من الطرفيات مجموعات محارف بديلة مفيدة لرسم النماذج. توفر Terminfo و curses دعمًا مدمجًا لمعظم محارف الرسم التي يدعمها VT100، مع إضافة بعض المحارف من AT&T 4410v1. يمكن تحديد مجموعة المحارف البديلة هذه عبر قدرة acsc.
| acsc | ||||
| اسم ACS | القيمة | الرمز | بديل ASCII / اسم الرسم | |
| ACS_RARROW | 0x2b | + | > | سهم يشير لليمين |
| ACS_LARROW | 0x2c | , | < | سهم يشير لليسار |
| ACS_UARROW | 0x2d | - | ^ | سهم يشير للأعلى |
| ACS_DARROW | 0x2e | . | v | سهم يشير للأسفل |
| ACS_BLOCK | 0x30 | 0 | # | كتلة مربعة صلبة |
| ACS_DIAMOND | 0x60 | ` | + | ماسة |
| ACS_CKBOARD | 0x61 | a | : | لوحة شطرنج (تنقيط) |
| ACS_DEGREE | 0x66 | f | \ | رمز الدرجة |
| ACS_PLMINUS | 0x67 | g | # | زائد/ناقص |
| ACS_BOARD | 0x68 | h | # | لوحة مربعات |
| ACS_LANTERN | 0x69 | i | # | رمز الفانوس |
| ACS_LRCORNER | 0x6a | j | + | الزاوية السفلى اليمنى |
| ACS_URCORNER | 0x6b | k | + | الزاوية العليا اليمنى |
| ACS_ULCORNER | 0x6c | l | + | الزاوية العليا اليسرى |
| ACS_LLCORNER | 0x6d | m | + | الزاوية السفلى اليسرى |
| ACS_PLUS | 0x6e | n | + | علامة زائد كبيرة أو تقاطع |
| ACS_S1 | 0x6f | o | ~ | خط المسح 1 |
| ACS_S3 | 0x70 | p | - | خط المسح 3 |
| ACS_HLINE | 0x71 | q | - | خط أفقي |
| ACS_S7 | 0x72 | r | - | خط المسح 7 |
| ACS_S9 | 0x73 | s | _ | خط المسح 9 |
| ACS_LTEE | 0x74 | t | + | تي تشير لليمين |
| ACS_RTEE | 0x75 | u | + | تي تشير لليسار |
| ACS_BTEE | 0x76 | v | + | تي تشير للأعلى |
| ACS_TTEE | 0x77 | w | + | تي تشير للأسفل |
| ACS_VLINE | 0x78 | x | | | خط عمودي |
| ACS_LEQUAL | 0x79 | y | < | أقل من أو يساوي |
| ACS_GEQUAL | 0x7a | z | > | أكبر من أو يساوي |
| ACS_PI | 0x7b | { | * | باي (pi) اليونانية |
| ACS_NEQUAL | 0x7c | | | ! | لا يساوي |
| ACS_STERLING | 0x7d | } | f | علامة الجنيه الإسترليني |
| ACS_BULLET | 0x7e | ~ | o | نقطة تعداد |
تنطبق بضع ملاحظات على الجدول نفسه:
- تذكر X/Open Curses بشكل غير صحيح أن تعيين lantern هو حرف “I” كبير بالرغم من أن تنفيذيّات Unix تستخدم تعيين الحرف الصغير “i” .
- نفذت DEC VT100 الرسوميات باستخدام ميزة مجموعة المحارف البديلة، عبر تبديل modes مؤقتًا وإرسال محارف في النطاق من 0x60 (96) إلى 0x7e (126) (عمود acsc Value في الجدول).
- أضافت طرفية AT&T محارف رسومية خارج ذلك النطاق.
- بعض المحارف ضمن النطاق لا تطابق VT100؛ من المفترض أنها استُخدمت في طرفية AT&T: حيث يحل board of squares محل رمز newline الخاص بـ VT100، بينما يحل lantern symbol محل رمز vertical tab الخاص بـ VT100. رموز VT100 الأخرى لمحارف التحكم (horizontal tab، و carriage return و line-feed) لم تُستخدم (أو يُعاد استخدامها) في curses.
أفضل طريقة لتعريف مجموعة رسوميات لجهاز جديد هي إضافة عمود إلى نسخة من هذا الجدول لطرفيتك، مع ذكر المحرف الذي (عند إرساله بين تبديلات smacs/rmacs) سَيُصيّر كرسم مقابل. ثم اقرأ أزواج محارف VT100/طرفيتك من اليمين إلى اليسار على التوالي؛ لتصبح هذه هي سلسلة ACSC.
التعامل مع الألوان¶
تقوم دوال مكتبة curses init_pair و init_color بالتعامل مع أزواج الألوان و الألوان (قيم الألوان أو الفهارس، مثل “1=أحمر”) التي تمت مناقشتها في هذا القسم (انظر color(3NCURSES) للحصول على تفاصيل حول هذه الدوال والدوال المتعلقة بها).
تتبع معظم الطرفيات الملونة نهج “Tektronix-like” أو “HP-like” في إدارة الألوان.
- تُعرف الطرفيات من نوع Tektronix-like مجموعة من n من الألوان (حيث n هي 8 عادةً)، ويمكنها تغيير ألوان المقدمة والخلفية لخلية المحرف بشكل مستقل، ومزجها في n×n زوج لوني. الطرفيات القياسية ANSI هي من نوع Tektronix-like.
- في طرفيات HP-like، يجب على المستخدم ضبط كل زوج لوني على حدة؛ فالمقدمة والخلفية لا يمكن تغييرهما بشكل مستقل. يمكن ضبط ما يصل إلى m من أزواج الألوان من أصل 2×m لون مختلف.
بعض قدرات إدارة الألوان الأساسية مستقلة عن طريقة ترميز الألوان. تحدد القدرات الرقمية max_colors (colors) و max_pairs (pairs) الحد الأقصى لعدد الألوان وأزواج الألوان التي يمكن للجهاز عرضها في آن واحد. تقوم قدرة السلسلة النصية orig_pair (op) (“الزوج الأصلي”) بإعادة تعيين ألوان المقدمة والخلفية إلى قيمها المبدئية للطرفية. أما قدرة السلسلة orig_colors (oc) (“الألوان الأصلية”) فتعيد تعيين جميع الألوان أو أزواج الألوان إلى قيمها المبدئية للطرفية. تقوم بعض أنواع الطرفيات (بما في ذلك العديد من محاكيات طرفية الحاسوب الشخصي) بمسح مساحات الشاشة بلون الخلفية الحالي بدلاً من الخلفية المبدئية عند التشغيل؛ ويجب على هذه الطرفيات التصريح عن القدرة المنطقية back_color_erase (bce).
بينما تعمل مكتبة curses باستخدام أزواج الألوان (مما يعكس عدم قدرة بعض الأجهزة على ضبط ألوان المقدمة والخلفية بشكل مستقل)، توجد قدرات منفصلة لضبط هذه الميزات:
- لتغيير لون المقدمة أو الخلفية الحالي على طرفية من نوع Tektronix، استخدم setaf (ضبط مقدمة ANSI) و setab (ضبط خلفية ANSI) أو setf (ضبط المقدمة) و setb (ضبط الخلفية). تأخذ هذه الوسوم معاملًا واحدًا هو رقم اللون. تصف وثائق SVr4 فقط setaf/setab؛ بينما تذكر مسودة XPG4 أنه "إذا كانت الطرفية تدعم تسلسلات هروب ANSI لضبط الخلفية والمقدمة، فيجب ترميزها كـ setaf و setab، على التوالي.
- إذا كانت الطرفية تدعم تسلسلات هروب أخرى لضبط الخلفية والمقدمة، فيجب ترميزها كـ setf و setb، على التوالي. تستخدم دوال vidputs و refresh(3NCURSES) القدرتين setaf و setab إذا كانتا معرفتين.
تأخذ كل من قدرات setaf/setab و setf/setb وسيطًا رقميًا واحدًا. تُعرف قيم الوسائط 0-7 لـ setaf/setab بشكل قابل للنقل كما يلي (العمود الأوسط هو الرمز المعرف #define المتاح في ترويسة مكتبات curses أو ncurses). عتاد الطرفية حر في تعيين هذه القيم كما يشاء، لكن قيم RGB تشير إلى المواقع المعتادة في فضاء الألوان.
| اللون | #define | القيمة | RGB | ||
| أسود | COLOR_BLACK | 0 | 0, | 0, | 0 |
| أحمر | COLOR_RED | 1 | max, | 0, | 0 |
| أخضر | COLOR_GREEN | 2 | 0, | max, | 0 |
| أصفر | COLOR_YELLOW | 3 | max, | max, | 0 |
| أزرق | COLOR_BLUE | 4 | 0, | 0, | max |
| أرجواني | COLOR_MAGENTA | 5 | max, | 0, | max |
| سماوي | COLOR_CYAN | 6 | 0, | max, | max |
| أبيض | COLOR_WHITE | 7 | max, | max, | max |
تتوافق قيم وسائط setf/setb تاريخيًا مع تعيين مختلف، أي،
| اللون | #define | القيمة | RGB | ||
| أسود | COLOR_BLACK | 0 | 0, | 0, | 0 |
| أزرق | COLOR_BLUE | 1 | 0, | 0, | max |
| أخضر | COLOR_GREEN | 2 | 0, | max, | 0 |
| سماوي | COLOR_CYAN | 3 | 0, | max, | max |
| أحمر | COLOR_RED | 4 | max, | 0, | 0 |
| أرجواني | COLOR_MAGENTA | 5 | max, | 0, | max |
| أصفر | COLOR_YELLOW | 6 | max, | max, | 0 |
| أبيض | COLOR_WHITE | 7 | max, | max, | max |
من المهم عدم الخلط بين مجموعتي قدرات الألوان؛ وإلا فسيتم تبديل الأحمر والأزرق على الشاشة.
في طرفية من نوع HP، استخدم scp مع وسيط رقم الزوج اللوني لضبط أي زوج لوني هو الحالي.
تسمح بعض الطرفيات بتعديل قيم الألوان:
- في طرفية من نوع Tektronix، قد توجد القدرة ccc للإشارة إلى إمكانية تعديل الألوان. إذا كان الأمر كذلك، فإن القدرة initc ستأخذ رقم اللون (0 إلى colors - 1) وثلاثة وسائط إضافية تصف اللون. يتم تفسير هذه الوسائط الثلاثة مبدئيًا كقيم RGB (أحمر، أخضر، أزرق). إذا وجدت القدرة المنطقية hls، فيتم تفسيرها بدلاً من ذلك كفهارس HLS (صبغة، إضاءة، تشبع). تعتمد النطاقات على نوع الطرفية.
- في طرفية من نوع HP، قد توفر initp قدرة لتغيير قيمة زوج لوني. وتأخذ سبعة وسائط؛ رقم الزوج اللوني (0 إلى max_pairs - 1)، وثلاثيتين تصفان أولاً ألوان الخلفية ثم ألوان المقدمة. يجب أن تكون هذه الوسائط (أحمر، أخضر، أزرق) أو (صبغة، إضاءة، تشبع) اعتمادًا على hls.
في بعض الطرفيات الملونة، تتعارض الألوان مع ميزات الإبراز. يمكنك تسجيل هذه التعارضات باستخدام القدرة ncv. هذا قناع بتات (bit mask) للسمات التي يجب عدم استخدامها عند تفعيل الألوان. التوافق مع السمات التي تفهمها مكتبة curses هو كما يلي:
| السمة | بت | عشري | مضبوط بواسطة |
| A_STANDOUT | 0 | 1 | sgr |
| A_UNDERLINE | 1 | 2 | sgr |
| A_REVERSE | 2 | 4 | sgr |
| A_BLINK | 3 | 8 | sgr |
| A_DIM | 4 | 16 | sgr |
| A_BOLD | 5 | 32 | sgr |
| A_INVIS | 6 | 64 | sgr |
| A_PROTECT | 7 | 128 | sgr |
| A_ALTCHARSET | 8 | 256 | sgr |
| A_HORIZONTAL | 9 | 512 | sgr1 |
| A_LEFT | 10 | 1024 | sgr1 |
| A_LOW | 11 | 2048 | sgr1 |
| A_RIGHT | 12 | 4096 | sgr1 |
| A_TOP | 13 | 8192 | sgr1 |
| A_VERTICAL | 14 | 16384 | sgr1 |
| A_ITALIC | 15 | 32768 | sitm |
على سبيل المثال، في العديد من وحدات تحكم حواسيب IBM الشخصية، تتعارض سمة التسطير مع اللون الأزرق للمقدمة وتكون غير متاحة في وضع الألوان. يجب أن يكون لهذه الوحدات قدرة ncv بقيمة 2.
لا تفعل مكتبة curses في إصدار SVr4 شيئًا بـ ncv، بينما تتعرف عليها ncurses وتحسن المخرجات لصالح الألوان.
متفرقات¶
إذا كانت الطرفية تتطلب محرفًا آخر غير المحرف الصفري (null) كحشوة، فيمكن توفيره كـ pad. يتم استخدام المحرف الأول فقط من سلسلة الحشوة. إذا لم يكن للطرفية محرف حشوة، فحدد npc. لاحظ أن ncurses تنفذ المتغير PC المتوافق مع termcap؛ وبالرغم من أن التطبيق قد يضبط هذه القيمة لشيء آخر غير الصفر، إلا أن ncurses ستختبر npc أولاً وتستخدم napms إذا لم يكن للطرفية محرف حشوة.
إذا كانت الطرفية تستطيع التحرك للأعلى أو للأسفل بمقدار نصف سطر، فيمكن الإشارة إلى ذلك بـ hu (نصف سطر للأعلى) و hd (نصف سطر للأسفل). هذا مفيد بشكل رئيس للأسس والمنخفضات في الطرفيات الورقية. إذا كانت الطرفية الورقية تستطيع الانتقال إلى الصفحة التالية (تغذية النموذج)، فأعطِ ذلك كـ ff (عادةً control/L).
إذا كان هناك أمر لتكرار محرف معين لعدد معين من المرات (لتوفير وقت إرسال عدد كبير من المحارف المتطابقة)، فيمكن الإشارة إلى ذلك باستخدام السلسلة ذات المعاملات rep. المعامل الأول هو المحرف المطلوب تكراره والثاني هو عدد مرات تكراره. وبالتالي، فإن tparm(repeat_char, 'x', 10) يعادل “xxxxxxxxxx”.
إذا كانت للطرفية محرف أوامر قابل للضبط، مثل TEKTRONIX 4025، فيمكن الإشارة إلى ذلك بـ cmdch. يتم اختيار محرف أوامر نموذجي يستخدم في جميع القدرات. يُعطى هذا المحرف في القدرة cmdch للتعريف به. الاتفاق التالي مدعوم في بعض أنظمة يونكس: يتم البحث في البيئة عن متغير CC، وإذا وُجد، يتم استبدال جميع حالات ظهور المحرف النموذجي بالمحرف الموجود في متغير البيئة.
أوصاف الطرفيات التي لا تمثل نوعًا محددًا من الطرفيات المعروفة، مثل switch و dialup و patch و network، يجب أن تتضمن القدرة gn (عامة) حتى تتمكن البرامج من الاعتراض بأنها لا تعرف كيفية التحدث إلى الطرفية. (لا تنطبق هذه القدرة على أوصاف الطرفيات الافتراضية التي تُعرف تسلسلات الهروب الخاصة بها).
إذا كانت الطرفية تحتوي على “مفتاح ميتا” يعمل كمفتاح تبديل (shift)، بحيث يضبط البت الثامن لأي محرف يتم إرساله، فيمكن الإشارة إلى هذه الحقيقة بـ km. وإلا، فستفترض البرمجيات أن البت الثامن هو بت تماثل (parity) وسيتم مسحه عادةً. إذا وجدت سلاسل لتشغيل وإيقاف “وضع ميتا” هذا، فيمكن إعطاؤها كـ smm و rmm.
إذا كانت الطرفية تحتوي على عدد من أسطر الذاكرة أكثر مما يتسع له الشاشة في وقت واحد، فيمكن الإشارة إلى عدد أسطر الذاكرة بـ lm. وتشير القيمة lm#0 إلى أن عدد الأسطر غير ثابت، ولكن لا يزال هناك ذاكرة أكبر مما يتسع له الشاشة.
إذا كانت الطرفية واحدة من تلك المدعومة بواسطة بروتوكول طرفية يونكس الافتراضية، فيمكن إعطاء رقم الطرفية كـ vt.
سلاسل نسخ الوسائط التي تتحكم في طابعة مساعدة متصلة بالطرفية يمكن إعطاؤها كـ mc0: لطباعة محتويات الشاشة، و mc4: لإيقاف الطابعة، و mc5: لتشغيل الطابعة. عندما تكون الطابعة قيد التشغيل، سيتم إرسال جميع النصوص المرسلة إلى الطرفية إلى الطابعة. ومن غير المحدد ما إذا كان النص سيُعرض أيضًا على شاشة الطرفية عندما تكون الطابعة قيد التشغيل. هناك تنويع mc5p يأخذ معاملًا واحدًا، ويترك الطابعة تعمل لعدد من المحارف يساوي قيمة المعامل، ثم يغلق الطابعة. يجب ألا يتجاوز المعامل 255. يتم تمرير جميع النصوص، بما في ذلك mc4، بشفافية إلى الطابعة أثناء تفعيل mc5p.
العلل والعيوب التصميمية¶
طرفيات Hazeltine، التي لا تسمح بعرض محارف “~”، يجب أن تشير إلى hz.
الطرفيات التي تتجاهل تغذية السطر فورًا بعد التفاف am، مثل Concept و vt100، يجب أن تشير إلى xenl.
إذا كان el مطلوبًا للتخلص من وضع الإبراز (standout) (بدلاً من مجرد كتابة نص عادي فوقه)، فيجب إعطاء xhp.
طرفيات Teleray، حيث تحول علامات التبويب جميع المحارف التي يتم المرور فوقها إلى فراغات، يجب أن تشير إلى xt (علامات تبويب مدمرة). ملاحظة: المتغير الذي يشير إلى ذلك هو الآن “dest_tabs_magic_smso”)؛ في الإصدارات الأقدم، كان teleray_glitch. تُفهم هذه العلة أيضًا على أنها تعني عدم إمكانية وضع المؤشر فوق “magic cookie”)، وأنه لمسح وضع الإبراز، من الضروري بدلاً من ذلك استخدام حذف وإدراج السطر. يتجاهل تنفيذ ncurses هذه العلة.
طرفية Beehive Superbee، التي تعجز عن إرسال محارف الهروب أو control/C بشكل صحيح، لديها xsb، مما يشير إلى أن مفتاح f1 يُستخدم للهروب و f2 لـ control/C. (بعض أجهزة Superbee فقط تعاني من هذه المشكلة، اعتمادًا على ذاكرة القراءة فقط ROM). لاحظ أنه في إصدارات terminfo الأقدم، كانت هذه القدرة تسمى “beehive_glitch”)؛ وهي تسمى الآن “no_esc_ctl_c”).
يمكن تصحيح مشاكل الطرفيات المحددة الأخرى عن طريق إضافة المزيد من القدرات بالصيغة xx.
مزالق المدخلات الطويلة¶
من المستبعد أن تشكل مدخلات terminfo الطويلة مشكلة؛ فحتى الآن لم يقترب أي مدخل من الحد الأقصى لجدول السلاسل في terminfo والبالغ 4096 بايت. لسوء الحظ، ترجمات termcap محدودة بصرامة أكبر (إلى 1023 بايت)، لذا فإن ترجمات termcap لمدخلات terminfo الطويلة يمكن أن تسبب مشاكل.
توجه صفحات الدليل للإصدار 4.3BSD والإصدارات الأقدم من tgetent المستخدم لتخصيص ذاكرة وسيطة بسعة 1024 بايت لمدخل termcap. يتم إنهاء المدخل بمحرف صفري (null) بواسطة مكتبة termcap، مما يجعل الحد الأقصى الآمن لطول مدخل termcap هو 1k-1 (أي 1023) بايت. اعتمادًا على ما يفعله التطبيق ومكتبة termcap المستخدمة، ومكان نوع الطرفية التي يبحث عنها tgetent في ملف termcap، يمكن أن تحدث عدة أشياء سيئة:
- بعض مكتبات termcap تطبع رسالة تحذير،
- بعضها يخرج إذا وجد مدخلاً أطول من 1023 بايت،
- بعضها لا يخرج ولا يحذر، ولا يفعل شيئًا مفيدًا، و
- بعضها يكتفي ببتر المدخلات إلى 1023 بايت.
تخصص بعض البرامج التطبيقية أكثر من 1K الموصى بها لمدخل termcap؛ والبعض الآخر لا يفعل.
كل مدخل termcap له حجمان مهمان مرتبطان به: قبل توسيع “tc”)، وبعد توسيع “tc”) . و “tc”) هي القدرة التي تضيف مدخل termcap آخر إلى نهاية المدخل الحالي، لإضافة قدراته. إذا كان مدخل termcap لا يستخدم قدرة “tc”)، فإن الطولين بالطبع يكونان متماثلين.
طول “قبل توسيع tc”) هو الأكثر أهمية، لأنه يؤثر على أكثر من مجرد مستخدمي تلك الطرفية المعينة. هذا هو طول المدخل كما هو موجود في /etc/termcap، مطروحًا منه أزواج (الشرطة المائلة العكسية-السطر الجديد)، التي يحذفها tgetent أثناء قراءته. تحذف بعض مكتبات termcap السطر الجديد النهائي أيضًا (بينما لا تفعل ذلك مكتبة GNU termcap). الآن لنفترض:
- أن مدخل termcap قبل التوسيع أطول من 1023 بايت،
- وأن التطبيق خصص فقط ذاكرة وسيطة بسعة 1k،
- وأن مكتبة termcap (مثل تلك الموجودة في BSD/OS 1.1 و GNU) تقرأ المدخل بالكامل في الذاكرة الوسيطة، بغض النظر عن طوله، لترى ما إذا كان هو المدخل الذي تريده،
- وأن tgetent يبحث عن نوع طرفية هو إما هذا المدخل الطويل، أو يظهر في ملف termcap بعد المدخل الطويل، أو لا يظهر في الملف على الإطلاق (بحيث يضطر tgetent للبحث في ملف termcap بالكامل).
حينئذٍ سيقوم tgetent بالكتابة فوق الذاكرة، وربما فوق المكدس (stack) الخاص به، وعلى الأرجح سينهار البرنامج ويفرغ الذاكرة (core dump). البرامج مثل telnet معرضة لهذا الخطر بشكل خاص؛ حيث تمرر برامج telnet الحديثة قيمًا مثل نوع الطرفية آليًا. والنتائج غير مرغوب فيها بنفس القدر مع مكتبة termcap، مثل SunOS 4.1.3 و Ultrix 4.4، التي تطبع رسائل تحذير عندما تقرأ مدخل termcap طويلًا جدًا. إذا قامت مكتبة termcap ببتر المدخلات الطويلة، مثل OSF/1 3.0، فستكون في مأمن من الانهيار هنا ولكنها ستعيد بيانات غير صحيحة للطرفية.
طول “بعد توسيع tc”) سيكون له تأثير مماثل لما ورد أعلاه، ولكن فقط للأشخاص الذين يضبطون TERM فعليًا على نوع الطرفية ذاك، لأن tgetent يقوم فقط بتوسيع “tc”) بمجرد العثور على نوع الطرفية الذي كان يبحث عنه، وليس أثناء البحث.
خلاصة القول، يمكن لمدخل termcap الذي يزيد طوله عن 1023 بايت أن يسبب، في توليفات مختلفة من مكتبات termcap والتطبيقات، انهيار البرنامج، أو صدور تحذيرات، أو تشغيلًا غير صحيح. إذا كان طويلاً جدًا حتى قبل توسيع “tc”)، فسيكون له هذا التأثير حتى لمستخدمي أنواع طرفيات أخرى وللمستخدمين الذين لا يملك متغير TERM لديهم مدخل termcap.
عندما تكون في وضع -C (الترجمة إلى termcap)، يُصدر تنفيذ ncurses لأمر tic(1) رسائل تحذير عندما يكون طول ترجمة termcap قبل التوسيع طويلاً جدًا. كما يتحقق الخيار -c (التحقق) من الأطوال المحلولة (بعد توسيع tc).
الملفات¶
- /etc/terminfo
- دليل قاعدة بيانات أوصاف الطرفية المجمّعة
الامتدادات¶
البحث عن أوصاف الطرفيات في $HOME/.terminfo و TERMINFO_DIRS غير مدعوم في التنفيذات القديمة.
بعض تنفيذات curses في SVr4، وجميع ما قبل SVr4، لا تفسر العوامل %A و %O في سلاسل المعاملات.
لا تحدد SVr4/XPG4 ما إذا كان msgr يسمح بالحركة أثناء التواجد في وضع مجموعة المحارف البديلة (مثل هذه الأوضاع قد تقوم، من بين أمور أخرى، بتعيين CR و NL لمحارف لا تطلق حركات محلية). يتجاهل تنفيذ ncurses القدرة msgr في وضع ALTCHARSET. وهذا يثير احتمالية أن تنفيذ XPG4 الذي يتبع التفسير المعاكس قد يحتاج إلى إيقاف msgr في مدخلات terminfo المصنوعة لـ ncurses.
تتعامل مكتبة ncurses مع أوضاع إدراج المحرف وإدراج المحرف بطريقة غير قياسية قليلاً للحصول على كفاءة تحديث أفضل. انظر القسم الفرعي إدراج/حذف محرف أعلاه.
استبدالات المعاملات لـ set_clock و display_clock ليست موثقة في SVr4 أو X/Open Curses. لقد استُنتجت من وثائق طرفية AT&T 505.
كن حذرًا عند تعيين القدرة kmous. فمكتبة ncurses تريد تفسيرها على أنها KEY_MOUSE، لاستخدامها من قبل الطرفيات والمحاكيات مثل xterm التي يمكنها إرجاع معلومات تتبع الفأرة في دفق مدخلات لوحة المفاتيح.
لا تذكر X/Open Curses الخط المائل. يجب أن تفترض التطبيقات القابلة للنقل أن القدرات الرقمية هي قيم 16 بت ذات إشارة. وهذا يشمل قدرة no_color_video (ncv). قيمة القناع 32768 المستخدمة لـ الخط المائل مع ncv يمكن الخلط بينها وبين غياب ncv أو إلغائه. إذا كان الخط المائل يجب أن يعمل مع الألوان، فيجب تحديد قيمة ncv، حتى لو كانت صفرًا.
تدعم المنافذ التجارية المختلفة لـ terminfo و curses مجموعات فرعية مختلفة من X/Open Curses و (في بعض الحالات) امتدادات مختلفة. إليك ملخص، دقيق اعتبارًا من أكتوبر 1995، والذي تقلص بعده سوق يونكس التجاري وفقد تنوعه.
- تدعم SVr4 و Solaris و ncurses جميع قدرات SVr4.
- تدعم IRIX مجموعة SVr4 وتضيف قدرة سلسلة نصية ممتدة غير موثقة (set_pglen).
- تدعم SVr1 و Ultrix مجموعة فرعية مقيدة من قدرات terminfo. حيث تنتهي القيم المنطقية بـ xon_xoff؛ والرقمية بـ width_status_line؛ والسلاسل بـ prtr_non.
- تدعم HP/UX مجموعة SVr1 الفرعية، بالإضافة إلى أرقام SVr[234] المتمثلة في num_labels و label_height و label_width، بالإضافة إلى مفاتيح الوظائف من 11 إلى 63، بالإضافة إلى plab_norm و label_on و label_off، بالإضافة إلى عدد من امتدادات جدول السلاسل غير المتوافقة.
- تدعم AIX مجموعة SVr1 الفرعية، بالإضافة إلى مفاتيح الوظائف من 11 إلى 63، بالإضافة إلى عدد من امتدادات جدول السلاسل غير المتوافقة.
- يدعم OSF/1 كلاً من مجموعة SVr4 وامتدادات AIX.
القابلية للنقل¶
لا تعتمد على قابلية نقل مدخلات terminfo المجمّعة (الثنائية) بين أنظمة يونكس التجارية. فعلى الأقل هناك تنفيذان لـ terminfo (تنفيذا HP-UX و AIX) تباعدا عن تنفيذات أنظمة System V Unices الأخرى بعد SVr1، مع إضافة قدرات امتداد إلى جدول السلاسل تتعارض (في التنسيق الثنائي) مع امتدادات System V و X/Open Curses اللاحقة.
المؤلفون¶
Zeyd M. Ben-Halim، و Eric S. Raymond، و Thomas E. Dickey. بناءً على pcurses بواسطة Pavel Curtis.
انظر أيضًا¶
infocmp(1)، tabs(1)، tic(1)، ncurses(3NCURSES)، color(3NCURSES)، terminfo(3NCURSES)، curses_variables(3NCURSES)، printf(3)، terminfo_variables(3NCURSES)، term(5)، user_caps(5)
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 16 أغسطس 2025 | ncurses 6.6 |