क्यों ZSH एक उजागर प्रतिशत प्रतीक के साथ एक पंक्ति समाप्त होता है?


46

मैंने कई अवसरों पर इस पर ध्यान दिया है। मैंने अक्सर सोचा था कि यह आउटपुट जल्दी रद्द कर दिया गया था (उदाहरण के लिए ctrl + c), या कुछ इसी तरह, और zsh एक नई पंक्ति वर्ण में भर रहा है। लेकिन अब जिज्ञासा मुझे सबसे अच्छी लगी है, क्योंकि यह ऐसा नहीं लगता है।

zsh

zsh

दे घुमा के

यहाँ छवि विवरण दर्ज करें

Sequenceकार्यक्रम कुछ मैं एक किताब से खींचा जबकि जावा प्रमाणपत्र पर पढ़ रहे हैं और सिर्फ अगर यह संकलन और चलाने होगा देखना चाहता था है। मैंने देखा कि यह पैकेज / कक्षा println()से विधि का उपयोग नहीं करता है System.out। इसके बजाय यह सादे पुराने का उपयोग करता है print()

क्या एक नई लाइन चरित्र की कमी का कारण है जो मुझे यह प्रतीक मिला है?

जवाबों:


57

हां, ऐसा होता है क्योंकि यह एक "आंशिक रेखा" है। और डिफॉल्ट zsh प्रॉम्प्ट से इसे कवर करने से बचने के लिए अगली लाइन पर जाता है

जब एक आंशिक रेखा संरक्षित होती है, तो डिफ़ॉल्ट रूप से आपको आंशिक रेखा के अंत में एक व्युत्क्रम + बोल्ड वर्ण दिखाई देगा: एक सामान्य उपयोगकर्ता के लिए "%" या रूट के लिए "#"। यदि सेट किया जाता है, तो शेल पैरामीटर PROMPT_EOL_MARK का उपयोग यह अनुकूलित करने के लिए किया जा सकता है कि आंशिक लाइनों का अंत कैसे दिखाया जाता है।


3
ऐसा करने के लिए परीक्षण करने के लिए: print -n "this is a test"तबprint "this is a test"
सर्जियोआराज़ो

5
अब मैं PROMPT_EOL_MARK=''अपने .zshrc में डाल दिया हूँ ताकि नई रूपरेखा के बीच के अंतर को छिपाया जा सके या कमांड आउटपुट पर नहीं।
geekQ

14

यह आपको zsh(और अब के fishरूप में) की एक विशिष्ट विशेषता है, ताकि आप स्पष्ट रूप से एक कमांड के आउटपुट में असंबद्ध लाइनों को देख सकें।

पारंपरिक गोले में, यदि कोई कमांड अंतिम न्यूलाइन वर्ण के बाद कुछ डेटा आउटपुट करता है, या, दूसरे शब्दों में, यदि यह टर्मिनल कर्सर को लाइन के शुरू में नहीं छोड़ता है, तो शेल द्वारा अगला प्रॉम्प्ट उस अंतिम अनारक्षित लाइन से जुड़ा होता है। जैसे की:

bash-4.4$ printf XXX
XXXbash-4.4$

यह संकेत देता है, और यह याद रखना आसान है कि XXXखासतौर पर अगर आपके पास उस तरह का कट्टर संकेत हो। यह कर्सर पोजिशनिंग को भी प्रभावित करता है जिसके कारण आप कर्सर को इधर-उधर ले जाते हैं।

zshइसके चारों ओर काम करता है, यह दिखाते हुए कि आउटपुट %में बोल्ड और रिवर्स वीडियो में एक चरित्र के साथ एक निर्विवाद रेखा है , और अगली पंक्ति की शुरुआत में अगला संकेत जारी करता है:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

ऐसा लगता है कि उस रिवर्स वीडियो %को हर कमांड के अंत में (प्रत्येक प्रॉम्प्ट से पहले) आउटपुट किया जाता है, लेकिन उसके बाद 79 स्पेस (एक 80 कैरेक्टर वाइड टर्मिनल मानकर), एक सीआर कैरेक्टर (जो कर्सर को पहले पर वापस जाने का कारण बनता है) कॉलम) और लाइन के अंत में मिटाने का क्रम (और फिर प्रॉम्प्ट)।

इस तरह, यदि कोई असंबद्ध पंक्ति थी, चूंकि कर्सर पहली स्थिति में नहीं है, तो वे 80 वर्ण कर्सर को अगली पंक्ति में ले %जाएंगे (और वह रहेगा)। यदि नहीं, तो वह %और वे 79 स्थान एक लाइन पर होंगे जो बाद में हटा दिए जाएंगे।

अब, यह तभी काम करता है जब टर्मिनल लाइनों को लपेटता है (उदाहरण के लिए, इसके बाद ठीक से काम नहीं करेगा tput rmam)। यदि आपके पास एक धीमा टर्मिनल है (जैसे 9600 बॉड सीरियल लाइन पर), तो आप वास्तव में उन लोगों %को दिखाई दे सकते हैं और फिर प्रत्येक कमांड के बाद हटाए जा सकते हैं , जिससे zshआप उस सुविधा को अक्षम कर सकते हैं:

unsetopt prompt_cr prompt_sp

इस तरह, zshपारंपरिक गोले की तरह अधिक व्यवहार करता है।

आप उस चिह्न को परिवर्तनशील के साथ भी बदल सकते हैं $PROMPT_EOL_MARK

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.