باستخدام جنو ريدلاين؛كيف يمكنني إضافة ncurses في نفس البرنامج؟

StackOverflow https://stackoverflow.com/questions/691652

  •  22-08-2019
  •  | 
  •  

سؤال

العنوان أكثر تحديدًا قليلاً من هدفي الفعلي:

لدي برنامج سطر أوامر يستخدم GNU Readline، بشكل أساسي لسجل الأوامر (أي.استرجاع الأوامر السابقة باستخدام السهم لأعلى) وبعض التفاصيل الأخرى.في الوقت الحالي، تظهر مخرجات البرنامج متخللة مع مدخلات المستخدم، وهو أمر لا بأس به في بعض الأحيان ولكن الإخراج غير متزامن (يأتي عبر اتصال شبكة استجابة لأوامر الإدخال)، وهذا يصبح مزعجًا في بعض الأحيان (على سبيل المثال.إذا تم إخراج الخطوط عندما يقوم المستخدم بكتابة إدخال جديد).

أود أن أضيف ميزة لهذا البرنامج:"نافذة" منفصلة للإخراج.فكرت في استخدام ncurses لهذا الغرض.ولكن يبدو من الأسئلة الشائعة حول ncurses أنه ليس من السهل استخدام المكتبتين معًا.

قد أفكر في استخدام خط التحرير أو tecla بدلاً من Readline، ولكن ليس من الواضح بالنسبة لي ما إذا كان أي منهما سيحل مشكلتي.سأفكر أيضًا في استخدام شيء آخر غير ncurses، بما في ذلك المكتبة التي توفر كلا النوعين من الوظائف (نوافذ الوضع النصي وسجل الأوامر)، لكنني لا أعرف ما هو الأفضل.

أوه، ودعم النص الملون قد يحصل على نقاط إضافية.أظن أنني قد أكون قادرًا على القيام بذلك باستخدام Readline، لذلك ربما يكون هذا مصدر قلق منفصل، ولكن إذا كان حل مشكلتي يجعل من السهل أيضًا إضافة القليل من الألوان إلى المخرجات، فهذا أفضل بكثير.

أنا أستخدم Ubuntu Hardy (Linux 2.6).

هل كانت مفيدة؟

المحلول

ولقد فعلت بعض البحث، ويبدو كما لو كنت من الحظ.

لبدائل سأركع هناك اللغات العامية و <لأ href = "HTTP: // داخلي. wikipedia.org/wiki/Newt_٪28programming_library٪29 "يختلط =" نوفولو noreferrer "> نيوت و توربو رؤية . عامية هي أكثر بكثير من مجرد شاشة التداول وبالتالي أكثر مجمع، ولكن ربما يمكن استخدامه لهذا الغرض الخاص؟ يستخدم نيوت الشاشة التعامل مع وهو أبسط من ذلك بكثير، ولكن بسيطة جدا وترابط واحد واسطة لهذا الغرض الخاص على ما أعتقد.

ورؤية توربو هي مكتبة الرسومات وضع النص من بورلاند، وتستخدم من قبل كل أدواتهم في 80s في وقت متأخر / أوائل 90s. صدر بورلاند المصدر الرمز عند السوق لهذا النوع من الشيء تتضاءل، وهناك الآن منفذ لينكس (ملاحظة جانبية، هذا المشروع يبدو أنه قد كتب تنفيذ رؤيتها توربو الخاصة). هذا المنفذ هو لم يمت (يوجد لدينا كانت بعض السير الذاتية بتحديث هذا العام والتي جمعت غرامة (الإصدارات القديمة لم لا))، ولكن لم تكن أي من الأمثلة TV لقد وجدت حتى الآن، وأنا لم يحصل سوى عدد قليل منهم لتجميع قبل التخلي عن بقية. هذا هو قليلا من عار، لأن TV وجود بيئة جميلة للاستخدام. التلفزيون هو راجع للشغل C ++ (وأفترض أنك تستخدم C؟).

لبديل للريدلاين، هناك libkinput ، الذي ربما يعمل جنبا إلى جنب مع سأركع (تقول انها يمكن استخدام terminfo سأركع. ولكن أنا لست متأكدا إذا كان هذا يعني أنه يمكن أن تتعايش جنبا إلى جنب مع استخدام سأركع)؟

وربما خيار واحد هو لتشغيل يقوم readline "خارجيا" لبرنامج سأركع الخاص بك باستخدام rlwrap ؟

نصائح أخرى

ولقد وضعت الآن معا برنامج مثال بسيط على جيثب: https://github.com / ulfalizer / يقوم readline و-سأركع .

وأنها تدعم سلس وفعال تغيير حجم المحطة و/ أحرف كبيرة متعددة البايت / الجمع. رمز ديه تعليقات مفيدة.

والصورة ادناه:

لقد جعلني هذا أضرب رأسي لبضع ساعات، وذلك فقط لإنقاذ الناس من البحث في Google عن بعض الألم:

إذا كنت تستخدم المدمج في ncurses SIGWINCH معالج مع KEY_RESIZE, ، انتبه إلى أن readline يعين LINES و COLUMNS متغيرات البيئة بشكل افتراضي.تتجاوز هذه أي حساب حجم ديناميكي (عادةً مع ioctl() TIOCGWINSZ) التي قد تفعلها ncurses بطريقة أخرى، مما يعني أنك ستستمر في الحصول على الحجم الأولي للمحطة حتى بعد تغيير حجم المحطة.

يمكن منع ذلك عن طريق الإعداد rl_change_environment ل 0 قبل تهيئة readline.

تحديث:

إليك بعض المعلومات الإضافية التي حصلت عليها من مصادر القراءة:

قراءة الخط SIGWINCH رمز التعامل (والذي يستخدم إذا rl_catch_sigwinch هو 1) يقوم بالتحديث LINES و COLUMNS, ، والذي يبدو أنه يجب أن يكون كافيًا لـ ncurses.ومع ذلك، عند استخدام واجهة readline البديلة (والتي تكون أكثر منطقية عند الجمع بين readline وncurses)، فإن معالجات الإشارة (بما في ذلك معالج SIGWINCH) سيتم تثبيته لمدة كل منها فقط rl_callback_read_char() استدعاء، وهذا يعني تغيير حجم أي محطة بين مكالمتين ل rl_callback_read_char() لن يتم رؤيتها بواسطة readline.

ولقد حققت ما كنت قد وصفت في برنامج لي:

http://dpc.ucore.info/lab:xmppconsole

وفيما يلي التعامل مع ملف الإعلام والتوعية:

http://github.com/dpc/xmppconsole/blob /master/src/io.c

وهكذا اتضح أن جدب يستخدم كل من يقوم readline وسأركع. إذا كنت ترغب في القيام بذلك، ننصحك بأن تحقق من تنفيذها: <لأ href = "http://sourceware.org/git/؟p=gdb.git؛a=blob؛f=gdb/tui/ توي-io.c "يختلط =" نوفولو "> http://sourceware.org/git/؟p=gdb.git؛a=blob؛f=gdb/tui/tui-io.c

ولست متأكدا من الإصدار الذي حاول. اعتبارا من (2012/09/14) اليوم انها بسيطة جدا، ونحن بحاجة فقط لربط وظيفة عادتنا إلى متابعة مؤشرات الدالة.

rl_getch_function
rl_redisplay_function
rl_completion_display_matches_hook

وفعلت شيئا معقولا هنا .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top