शेल में नियंत्रण वर्ण (^ C, ^ D, ^ [, ...) कैसे प्रदर्शित करें


13

जब आप शेल में नियंत्रण वर्ण टाइप करते हैं, तो वे "कैरेट नोटेशन" कहलाता है। उदाहरण के लिए एस्केप ^[कैरट नोटेशन में लिखा गया है।

मुझे अपने बैश शेल को शांत करने के लिए अनुकूलित करना पसंद है। मैंने उदाहरण के लिए अपने को बदल दिया है PS1और PS2रंगीन हो गया है। मैं अब चाहता हूं कि पात्रों को एक विशिष्ट उपस्थिति मिले और साथ ही उन्हें नियमित पात्रों से अधिक विशिष्ट बनाने के लिए।

$ # Here I type CTRL-C to abort the command.
$ blahblah^C
          ^^ I want these two characters to be displayed differently

क्या मेरे शेल हाइलाइट कंट्रोल कैरेक्टर्स को अलग तरीके से बनाने का एक तरीका है?

क्या यह संभव है कि उन्हें बोल्ड फॉन्ट में प्रदर्शित किया जाए या हो सकता है कि उन्हें नियमित पाठ से अलग-अलग रंगों में प्रदर्शित किया जाए?

मैं यहां बैश शेल का उपयोग कर रहा हूं लेकिन मैंने इस प्रश्न को टैग नहीं किया है bashक्योंकि शायद एक समाधान है जो कई अलग-अलग गोले पर लागू होता है।

ध्यान दें कि मुझे नहीं पता है कि नियंत्रण वर्णों का हाइलाइटिंग किस स्तर पर होता है। मुझे पहले लगा कि यह शेल में ही है। अब मैंने सुना है कि यह रीडलाइन है जो कंट्रोल करती है कि कैसे बैश जैसे गोले में कंट्रोल कैरेक्टर होते हैं । इसलिए अब इस सवाल का टैग लगा दिया गया है readlineऔर मैं अभी भी जवाब तलाश रहा हूं।


आपको क्यों लगता है कि शेल उन्हें उजागर कर रहा है? क्योंकि bashयह readlineउस सामान को संभाल रहा है, और अधिकांश लोगों के लिए यह ट्टी ड्राइवर है।
mikeserv

मुझे नहीं पता था। इसीलिए मैंने नोट लिखा। यह सिर्फ मेरा अनुमान था क्योंकि अन्य अनुप्रयोग जैसे viऔर lessअक्सर नियमित पाठ से अलग नियंत्रण वर्णों को उजागर करते हैं। मैं इस जानकारी के साथ प्रश्न को संपादित करूंगा। धन्यवाद!
wefwefa3

यह समझ आता है। शेल के लिए उस तरह का सामान अधिक कठिन होता है क्योंकि इसकी दूसरी प्राथमिकता होती है। संपादकों के साथ उनकी पूरी नौकरी एक स्क्रीन <> फ़ाइल इंटरफ़ेस प्रदान करना है, लेकिन शेल एक व्याख्या की गई भाषा के लिए एक कमांड दुभाषिया है और एक पंक्ति संपादक दूसरी (या बिल्कुल नहीं)
माइकर्स

ReadLine अन्य कार्यक्रमों के द्वारा प्रयोग किया जाता है, लेकिन यह भी यह है बैश का हिस्सा: यह एक पुस्तकालय में जुड़ा हुआ है। और आज के गोले, विशेष रूप से बैश, बहुत कुछ करते हैं जो आप सोच सकते हैं।
एलेक्सिस

बस zshजो बॉक्स से बाहर का उपयोग करें ।
स्टीफन चेजलस

जवाबों:


20

जब आप दबाते हैं Ctrl+X, तो आपका टर्मिनल एमुलेटर छद्म-टर्मिनल जोड़ी के मास्टर पक्ष को बाइट 0x18 लिखता है।

आगे क्या होता है यह इस बात पर निर्भर करता है कि tty लाइन अनुशासन (कर्नेल में मास्टर मॉड्यूल (एमुलेटर के नियंत्रण में) और दास पक्ष (जो टर्मिनल में चलने वाले एप्लिकेशन के साथ बातचीत करता है) के बीच बैठता है) कैसे कॉन्फ़िगर किया गया है।

कि कॉन्फ़िगर करने के लिए एक कमांड tty लाइन अनुशासन है sttyआदेश।

जब एक गूंगा एप्लिकेशन को चलाने के catबारे में पता नहीं होता है और यह परवाह नहीं करता है कि इसकी स्टड टर्मिनल है या नहीं, टर्मिनल एक डिफ़ॉल्ट विहित मोड में है जहां ट्टी लाइन अनुशासन एक क्रूड लाइन संपादक को लागू करता है ।

कुछ इंटरेक्टिव एप्लिकेशन जिन्हें उस क्रूड लाइन एडिटर से अधिक की आवश्यकता होती है, आमतौर पर उन सेटिंग्स को स्टार्ट-अप पर बदलते हैं और उन्हें छोड़ने पर पुनर्स्थापित करते हैं। आधुनिक गोले, उनके संकेत पर ऐसे अनुप्रयोगों के उदाहरण हैं। वे अपने स्वयं के अधिक उन्नत लाइन संपादक को लागू करते हैं।

आमतौर पर, जब आप एक कमांड लाइन में प्रवेश करते हैं, तो शेल उस मोड में tty लाइन अनुशासन डालता है, और जब आप वर्तमान कमांड को चलाने के लिए एंटर दबाते हैं, तो शेल सामान्य tty मोड को पुनर्स्थापित करता है (जैसा कि प्रॉम्प्ट जारी करने से पहले प्रभाव में था)।

यदि आप stty -aकमांड चलाते हैं , तो आपको डंब एप्लिकेशन के लिए वर्तमान सेटिंग दिखाई देगी । आप द्वारा देखे जाने वाले icanon, echoऔर echoctlसेटिंग्स सक्षम जा रहा है।

इसका मतलब यह है कि:

  • icanon: वह क्रूड लाइन संपादक सक्षम है।
  • echo: आपके द्वारा लिखे गए वर्ण (जो कि टर्मिनल एमुलेटर मास्टर साइड को लिखते हैं) वापस गूँजते हैं (टर्मिनल एमुलेटर द्वारा पढ़ने के लिए उपलब्ध किए जाते हैं )।
  • echoctl: किया जा रहा करने के बजाय गूँजती असीस, नियंत्रण वर्ण रहे गूँजती के रूप में ^X

तो, चलिए आपको टाइप करते हैं A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return

आपका टर्मिनल एमुलेटर भेजेगा AB\bC\x18\b\r:। लाइन अनुशासन वापस गूंज जाएगा: AB\b \bC^X\b \b\b \b\r\nऔर एक आवेदन जो दास पक्ष से इनपुट पढ़ता है ( /dev/pts/x) पढ़ेगा AC\n

सभी एप्लिकेशन देखता है AC\n, और केवल जब आपका प्रेस Enterतो यह ^Xवहाँ के लिए उत्पादन पर कोई नियंत्रण नहीं हो सकता है ।

आप देखेंगे कि इको के लिए , पहले ^H( ^?कुछ टर्मिनलों के साथ, eraseसेटिंग देखें ) \b \bटर्मिनल पर वापस भेजे जाने के परिणामस्वरूप । यही कारण है कि कर्सर वापस, इस कदम कर्सर वापस फिर से ले जाने के स्थान के साथ अधिलेखित, जबकि दूसरा अनुक्रम है ^Hके परिणामस्वरूप \b \b\b \bउन दो को मिटाने के लिए ^और Xअक्षर।

^X(0x18) खुद में अनुवाद किया जा रहा था ^और Xउत्पादन के लिए। जैसे B, हमने इसे एप्लिकेशन पर लागू नहीं किया, क्योंकि हमने इसे बैकस्पेस के साथ हटा दिया था।

\r(उर्फ ^M) को प्रतिध्वनि के लिए \r\n( ^M^J) और \n( ^J) के लिए अनुवाद किया गया था ।

तो, उन गूंगे अनुप्रयोगों के लिए हमारे विकल्प क्या हैं :

  • अक्षम echo( stty -echo)। यह प्रभावी रूप से नियंत्रण के तरीके को बदल देता है, जिससे गूंज उठता है ... कुछ भी नहीं गूंज रहा है। वास्तव में समाधान नहीं।
  • अक्षम करें echoctl। इससे वर्णों को नियंत्रित करने का तरीका बदल जाता है ( ... के अलावा ^H, ^Mऔर लाइन संपादक द्वारा उपयोग किए गए अन्य सभी) गूँजते हैं। वे तब के रूप में गूँज रहे हैं । उदाहरण के लिए, ESC वर्ण को \e( ^[/ 0x1b) बाइट के रूप में भेजा जाता है ( जिसे टर्मिनल द्वारा भागने के क्रम की शुरुआत के रूप में पहचाना जाता है), ^Gआप एक \a(एक बीईएल, अपना टर्मिनल बीप बनाते हुए ) भेजते हैं ... विकल्प नहीं ।
  • क्रूड लाइन संपादक को अक्षम करें ( stty -icanon)। वास्तव में एक विकल्प नहीं है क्योंकि क्रूड एप्लिकेशन बहुत कम उपयोग योग्य बनेंगे।
  • टैटी लाइन अनुशासन के व्यवहार को बदलने के लिए कर्नेल कोड को संपादित करें ताकि नियंत्रण वर्ण की प्रतिध्वनि\e[7m^X\e[m सिर्फ बदले में भेजे ^X(यहां \e[7mआमतौर पर अधिकांश टर्मिनलों में रिवर्स वीडियो सक्षम करता है)।

एक विकल्प रैपर का उपयोग करने के लिए हो सकता है जैसे rlwrapकि डंबल एप्लिकेशन को डंबल लाइन एडिटर जोड़ने के लिए एक गंदा हैक है। प्रभाव में आने वाला रैपर read()टर्मिनल डिवाइस से रीडलाइन लाइन एडिटर को कॉल करने के लिए सरल एस को बदलने की कोशिश करता है (जो टेट लाइन अनुशासन के मोड को बदलते हैं)।

आगे भी, आप इस तरह के समाधानों की कोशिश कर सकते हैं जो ^Xजीएनयू स्क्रीन की :execसुविधा पर भरोसा करते हुए, zsh के लाइन एडिटर (जो रिवर्स वीडियो में हाइलाइटिंग के लिए होता है ) के माध्यम से टर्मिनल से सभी इनपुट को हाईजैक करता है ।

अब उन अनुप्रयोगों के लिए जो अपने स्वयं के लाइन संपादक को लागू करते हैं, यह उन पर निर्भर करता है कि प्रतिध्वनि कैसे की जाती है। bashइसके लिए रीडलाइन का उपयोग करता है, जिसमें यह नियंत्रित करने के लिए कोई समर्थन नहीं है कि नियंत्रण वर्ण कैसे प्रतिध्वनित होते हैं।

के लिए zsh, देखें:

info --index-search='highlighting, special characters' zsh

zshडिफ़ॉल्ट रूप से गैर-मुद्रण योग्य वर्णों को उजागर करता है। आप उदाहरण के लिए हाइलाइटिंग को कस्टमाइज़ कर सकते हैं:

zle_highlight=(special:fg=white,bg=red)

उन विशेष पात्रों के लिए लाल हाइलाइटिंग पर सफेद के लिए।

उन पात्रों का पाठ प्रतिनिधित्व हालांकि अनुकूलन योग्य नहीं है।

एक UTF-8 लोकेल में, 0x18 के रूप में प्रदान किया जाएगा ^X, \u378, \U7fffffff(दो असाइन नहीं किए गए यूनिकोड कोड अंक) के रूप में <0378>, <7FFFFFFF>, \u200bके रूप में (एक नहीं वास्तव में प्रिंट करने योग्य यूनिकोड चरित्र) <200B>

\x80एक iso8859-1 लोकेल में प्रस्तुत किया जाएगा ^�... आदि।


3

मेरे पास मेरे .bashrc फ़ाइल में यह कोड है:

function get_exit_status()
{
        local code=$?
        if [ $code -ne 0 ]
        then
                printf $'\001\033[31m\002'"($code)"$'\001\033[0m\002'" "
        fi
}

और फिर मैं अपने PS1 में इस फ़ंक्शन को कॉल करता हूं

PS1='\u@\h \w $(get_exit_status)'

इसके साथ, अगर आप ^ C दबाते हैं, तो आप इसे अपने प्रॉम्प्ट में देखेंगे

I@mycomputer ~ ^C
I@mycomputer ~ (130)

सभी निकास स्थिति कोड जो "0" नहीं हैं, उन्हें संकेत दिया जाएगा।


$? PS1 में स्थिति से बाहर निकलने का विस्तार करता है जैसे PS1 = '$! \ u @ \ h \ w'
teknopaul
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.