2011-08-14 6 views
7

मैं रूबी में एक शाप की तरह कार्यक्रम लिख रहा हूँ, और मैं stty उपयोग कर रहा हूँ और एएनएसआई प्राप्त करने के लिए जो मैं चाहता वर्ण से बचें। मेरी समस्या तब होती है जब मैं उपयोगकर्ता इनपुट प्राप्त करना चाहता हूं। कई कंसोल आधारित कार्यक्रमों की तरह, मैं टर्मिनल के नीचे से उपयोगकर्ता इनपुट प्राप्त करना चाहता हूं।कैसे न्यू लाइन गूंज जब उपयोगकर्ता इनपुट पढ़ने से बचने के लिए?

इस प्रकार, मैं स्क्रीन के तल पर कर्सर रखें और Readline.readline फोन (या जो भी विधि उपयोगकर्ता इनपुट प्राप्त करने के लिए)। हमेशा की तरह, जब तक मैं वापसी नहीं करता तब तक यह सबकुछ पढ़ता है, और एक नई लाइन मुद्रित होती है। चूंकि कर्सर टर्मिनल की आखिरी पंक्ति पर है, इसलिए यह एक पंक्ति को स्क्रॉल करता है, जो स्क्रीन को गड़बड़ कर देता है।

मैं इससे कैसे बच सकता हूं? मैंने न्यूलाइन की प्रतिध्वनि रोकने के लिए स्टाटी का उपयोग करने की कोशिश की, लेकिन मैं सफल नहीं हुआ। शायद स्क्रॉलिंग से टर्मिनल को रोकने के लिए कोई स्टटी का उपयोग कर सकता है? बेशक, मैं एक समय में एक चरित्र को पढ़ने (और "वापसी" पकड़ने) द्वारा इनपुट को पकड़ने के लिए अपने ही विधि लिख सकता है, लेकिन मैं सभी अतिरिक्त कि ReadLine प्रदान करता है का उपयोग करना चाहते।

उत्तर

1

रूबी रीडलाइन जीएनयू रीडलाइन लाइब्रेरी के लिए एक साधारण आवरण है, जो सीधे टर्मिनल मोड का प्रबंधन करता है - यही कारण है कि टर्मिनल सेटिंग्स को संशोधित करने के लिए आपको स्टटी का उपयोग करके बहुत भाग्य नहीं मिल रहा है। Readline.readline विधि विशेष रूप से कच्चे मोड में टर्मिनल डालता है और सभी पात्रों वापस (रूबी 1.9 है, जो STDOUT करने के लिए चूक के लिए या Readline.output) STDOUT करने के लिए की प्रतिध्वनि है।

दुर्भाग्यवश, रूबी रीडलाइन रैपर पूरी तरह से जीएनयू रीडलाइन लाइब्रेरी को लपेटता नहीं है; जीएनयू ReadLine redisplay के लिए कार्यों के एक नंबर प्रदान करता है, लेकिन रूबी ReadLine आवरण इन कार्यों का खुलासा नहीं करता।

यदि आप विशेष रूप से रीडलाइन और रूबी का उपयोग करना चाहते हैं और उस नई लाइन को अनदेखा करने की आवश्यकता है, तो आपके पास विकल्पों का एक टन नहीं है। एक विकल्प, जो कि मूर्खतापूर्ण है, एक पाइप खोलने के लिए मध्यस्थ के रूप में अपने धागे को सुनना और सभी रीडलाइन आउटपुट को आगे भेजना है। निम्नलिखित इसे पूरा करते हैं, लेकिन चेतावनी दी जाती है, यह वही नहीं है जो आप वास्तव में चाहते हैं (और ओएसएक्स पर इसे libedit की बजाय रीडलाइन के खिलाफ 1.9.2 जुड़ा हुआ है, क्योंकि libedit अवरुद्ध है) ....

require 'readline' 

`mkfifo /tmp/readline-pipe` 

Readline.output = File.open("/tmp/readline-pipe", "w+") 

Thread.new { 
    input = open("/tmp/readline-pipe", "r+") 
    while true 
    character = input.getc 
    if character != "\n" 
     $stdout.write(character) 
     $stdout.flush 
    end 
    end 
} 

begin 
    while line = Readline.readline("", true) 
    $stdout.write(" NEWLINE ENTERED BUT NOT DISPLAYED ") 
    $stdout.flush 
    end 
rescue EOFError 
    puts "Exiting..." 
end 
संबंधित मुद्दे