كيفية الحصول على / تعيين موقف مؤشر وحدة التحكم في روبي (ويندوز)

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

سؤال

أحاول كتابة قذيفة في روبي، ولتنفيذ علامة التبويب إكمال أنا أستخدم وظيفة Winapi getch لقراءة شخصية في وقت واحد من المستخدم، والتحقق من علامات التبويب.

المشكلة مع هذا هو Backspace. مفتاح:

  1. يتحرك المؤشر مرة أخرى من المطالبة (على سبيل المثال، مع موجه hello>, ، يمكن للمستخدم دعم المؤشر على h. وبعد أود أن أتوقف عند الفضاء النهائي.
  2. عند تجاوز نص المستخدم إلى الصف التالي من وحدة التحكم، لن يتحرك Backspace مرة أخرى إلى السطر السابق.

(أعرف أن كل من هذه السلوكيات هي بالتصميم.)

حلا متخلي لهذه المشاكل تنطوي على التحكم في حركة المؤشر؛ أحتاج إلى معرفة أين يكون المؤشر، وكن قادرا على نقله.

على نظام Linux، أود استخدام تسلسل الهروب من ANSI، ولكن هذه غير مدعومة من وحدة Windows Console.

لقد نظرت إلى Winapi وحاولت العثور على وظائف من شأنها السماح لي بذلك، ولكن كل ما أنا قد تجد كنت GetConsoleCursorInfo وظيفة، والتي ترجع فقط حجم وضوح المؤشر.

ستكون أمثلة موضع تقدير، لأنني ميئوس منها باستخدام فئة WIN32API لأي شيء آخر غير الوظائف البدائية.

شكرا.

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

المحلول

ربما تكون أفضل حالا باستخدام Readline. يتم تضمينها في Ruby Click Installer. الإعداد الأساسي هو:

require 'readline'

while line = Readline.readline('hello> ', true)
  #do something with line
  break if line == 'quit'
end

بالفعل سيكون لديك قدرات Readline القياسية مثل Backspacing، ALT + BACKSPACE لحذف Word والتجليد وإكمال علامة التبويب. هناك وثائق جيدة حول كيفية تخصيصها لاحتياجاتك هنا.


يحرر:

إذا لم يكن لديك مثبتة READELLINE، فيمكنك الحصول عليها وغيرها من المكتبات الخارجية هنا. وبعد سوف تريد Readline-4.3-2-MSWIN32 صفقة. نسخ ملف Readline.dll (الموجود في bin دليل) الخاص بك ruby\bin الدليل. يجب أن تفعل ذلك.

على الرغم من أنه لا يتم توثيقه على الصفحة الرئيسية ل Ruby، إلا أنه يبدو كما لو أنه يمكنك أيضا استخدام Readline 5، متاح هنا. وبعد على وجه التحديد، تحتاج إلى ثنائيات توزيع. نسخة readline5.dll (في bin دليل) الخاص بك ruby\bin الدليل، وإعادة تسميته إلى readline.dll.

أيضا، كملاحظة جانبية، لا تشعر بالقلق إذا require 'readline' إرجاع FALSE عند استخدام IRB، لأنه يبدو أن تحميله مسبقا.

نصائح أخرى

حسنا، من الممكن بالتأكيد النسخ الاحتياطي، ومع رمز محمول بشكل معقول، كما يمكن ل BASH (1) العودة إلى السطر السابق حتى في مربع DOS. أتصور أنه يستخدم termcap أو ncurses, ، لديها في قاعدة بيانات TERMCAP مجموعة من رموز التحكم التي تعمل في مربع DOS.

في Ruby، لا أعتقد أن هناك أي ارتباطات النصفي، لذلك يمكنك استخدام NCULSES، بدلا من HardWiring في برنامجك مجموعة من رموز التحكم التي تعتمد على الجهاز. (كنت تريد ncurses على termcap على أي حال.)

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

في الواقع، أنا نوع من مثل بيستوإجابة. استخدام ncurses إذا readline لا يعمل خارج أو إذا كنت بحاجة إلى معالجة المؤشر لسبب آخر.

للحصول على تطبيق Readline سهل الاستخدام، جرب هذا Ruby-القائم على الروبي

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