2009-03-17 13 views
9

मैं एक प्रोग्राम लिख रहा हूं जो एक खोल के समान है। एक बार शुरू होने के बाद, एक प्रॉम्प्ट है और आप कुछ ऐप-विशिष्ट कमांड में प्रवेश करते हैं।स्क्रीन को साफ़ किए बिना एनसीआरएस प्रारंभिकरण

अभी तक यह ठीक काम करता है। हालांकि, मैं बैश में कमांड इतिहास के लिए समर्थन जोड़ना चाहता हूं, इसलिए उपयोगकर्ता ऊपर या नीचे तीर को दबा सकता है और पहले दर्ज किए गए आदेश देख सकता है।

मैंने एनसीआरएस लाइब्रेरी को शामिल किया है, और मैंने यह सुनिश्चित करने के लिए गेटच() के साथ एक सरल हैलो वर्ल्ड टेस्ट किया है ताकि ऊपर और नीचे तीर सही तरीके से रिपोर्ट किए जा सकें।

जो चीज मुझे परेशान कर रही है वह यह है कि ऐसा लगता है कि मैं initscr() को कॉल करता हूं जो मुझे getch() का उपयोग करने के लिए स्क्रीन साफ़ कर देगा।

ठीक है तो सवाल यह है:

किसी initscr बुला() पहले बिना ncurses getch() समारोह का उपयोग करने के लिए एक तरह से पता है? यदि नहीं, तो क्या मैं इसे स्क्रीन साफ़ नहीं कर सकता? असल में, मुझे लगता है कि getch() getchar() के समान कार्य करता है, अगर यह समझ में आता है।

अग्रिम धन्यवाद!

संपादित करें: मुझे लगता है कि इसका सबसे अच्छा उदाहरण यह है कि पाइथन इंटरैक्टिव मोड में कैसे चलता है।

उत्तर

8

शापित स्क्रीन को पूरी तरह से नियंत्रित करना चाहते हैं, और विशेष रूप से धीमी सीरियल लाइनों पर स्क्रीन पर लिखने को अनुकूलित करना चाहते हैं। ऐसा करने के लिए, यह जानने की जरूरत है कि स्क्रीन पर क्या है, और अधिकांश टर्मिनलों के साथ ऐसा करने का एकमात्र उचित तरीका एक खाली स्क्रीन से शुरू करना है और आप टर्मिनल को जो लिखते हैं उसका ट्रैक रखें।

इस प्रकार, मुझे संदेह है कि (एन) शाप आपके खोल के लिए गलत उपकरण है। आपको शायद अमूर्त परत पर एक कदम नीचे जाने की आवश्यकता है और इसके बजाय टर्मिनो और गैर-अवरुद्ध पाठ टर्मिनल (मानक इनपुट) से पढ़ता है।

(यह क्षमा करें बहुत उपयोगी नहीं है।।)

5

तुम बस rlwrap whithin से अपने कार्यक्रम फोन और दर्द के बिना कार्यक्षमता हो सकता था ...

3

यहाँ इस बारे में एक और discussion है। प्रदत्त समाधान हैं:

  1. "फ़िल्टर"() 'फ़ंक्शन आपको शोर का उपयोग एकल-पंक्ति के रूप में करने देता है। "
  2. "आप टर्मिनल डेटा, और tparm, स्वरूपण और आउटपुट के लिए tputs प्राप्त करने के लिए setupterm का उपयोग कर सी में समकक्ष कुछ लिख सकते हैं।"

बेशक एनसीआरएस स्रोत कोड प्राप्त करने और इसे संशोधित करने का तीसरा विकल्प है, इसलिए यह अब स्क्रीन को साफ़ नहीं करता है।

+0

वह लिंक 404 नहीं मिला है। :-( –

+0

संपादित।अफसोस की बात है, वेबैक मशीन में केवल एक संस्करण है जिसमें पहले से ही 404 है। हालांकि मृत लिंक की रिपोर्ट करने के लिए धन्यवाद। – schnaader

+0

चर्चा की विषय पंक्ति के लिए बस गुगलिंग ने एक और स्थिर यूआरएल पर संग्रहीत चर्चा को पाया, लिंक को दोबारा शुरू करने के लिए संपादित किया गया। –

0

क्या आपने स्क्रीन को साफ़ करने के लिए एक अनुक्रम की कमी वाले कस्टम टर्मिनो या टर्मकैप एंट्री बनाने का सरल विकल्प माना है और फिर अपने प्रोग्राम को चलाने से पहले अपनी टर्मिनल सेटिंग को सही तरीके से स्विच कर दिया है? आप ncurses में newterm() और set_term() का भी उपयोग कर सकते हैं। यह टर्मकैप के साथ आसान होता था, क्योंकि आप एक और टर्मिनल शामिल कर सकते हैं और इसकी कुछ क्षमताओं को ओवरराइड कर सकते हैं।

+0

यह वास्तव में बदसूरत हैक है और नतीजतन ऐसा एप्लिकेशन नहीं होगा जो अंतिम उपयोगकर्ताओं के सिस्टम पर प्रयोग योग्य हो। –

+0

यह बकवास है। आप प्रक्रिया के पर्यावरण में TERMINFO सेट कर सकते हैं, और एक छोटे से इंस्टॉल समय पर प्रविष्टियों की संख्या के साथ एक वैकल्पिक पथ के तहत एक अनुकूलित TERMINFO डेटाबेस स्थापित करें। फिर आप टीईआरएम वैरिएबल को उचित प्रविष्टि पर सेट करते हैं। TERMINFO द्वारा इंगित एक गैर-मानक स्थान में संग्रहीत वैकल्पिक टर्मिनो एंट्री संकलित करने के लिए टर्मिनो यूटिलिटीज का उपयोग करके रन-टाइम पर स्वचालित रूप से करना सैद्धांतिक रूप से संभव है। यदि आप रनटाइम पर करते हैं, तो आप वर्तमान टर्मिनल पर संक्रमित प्रविष्टि का आधार भी बना सकते हैं। यह सुंदर नहीं है, लेकिन यह दावा करने के लगभग उतना ही बुरा नहीं है जितना आप दावा करते हैं। –

8

पूर्ण-उड़ा हुआ एनसीआरएस का उपयोग करने के बजाय readline() जैसे इंटरफ़ेस का उपयोग करना आसान हो सकता है।

+0

ncurses और रीडलाइन के पास अलग-अलग लाइसेंस हैं। पहले जांचना सुनिश्चित करें! – sdgfsdh

संबंधित मुद्दे