एक शेल प्रॉम्प्ट पर प्रॉम्प्ट के नीचे सामान प्रदर्शित करें?


21

आइए मेरा संकेत इस तरह दिखता है (_ मेरे कर्सर का प्रतिनिधित्व करता है)

~ % _

वहाँ किसी भी तरह से मैं इसे इस तरह लग सकता है

~ % _
[some status]

सवाल मूल रूप से zsh के बारे में था, लेकिन अब अन्य उत्तर हैं।


कैसे के बारे में स्क्रीन + buobu ?: launchpad.net/byobu , और शायद kmandla.wordpress.com/2010/01/03/… स्क्रीनशॉट के लिए
Janus

जवाबों:


17

निम्नलिखित सेटिंग्स काम करने लगती हैं। दूसरी पंक्ति पर पाठ गायब हो जाता है यदि कमांड लाइन पहली पंक्ति को ओवरफ्लो करती है। preexecसमारोह कमांड चलाने से पहले दूसरी पंक्ति मिटा देता है; यदि आप इसे रखना चाहते हैं, तो बदल दें preexec () { echo; }

terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }

%बच निकलने का दस्तावेज zsh मैनुअल ( man zshmisc) में दिया गया है।

Terminfo एक टर्मिनल एक्सेस एपीआई है। Zsh के पास एक terminfoमॉड्यूल है जो टर्मिनल विवरण डेटाबेस तक पहुंच देता है: $terminfo[$cap]टर्मिनल की क्षमता का अभ्यास करने के लिए भेजने के लिए वर्णों का अनुक्रम है $cap, अर्थात, इसकी $capकमांड चलाने के लिए । man 5 terminfoअधिक जानकारी के लिए देखें (लिनक्स पर, अनुभाग संख्या अन्य यूनियनों पर भिन्न हो सकती है)।

क्रियाओं का क्रम है: कर्सर को एक रेखा से नीचे ले जाएँ ( cud1), फिर बैक अप ( cuu1); कर्सर स्थिति को बचाएं ( sc); कर्सर को एक रेखा से नीचे ले जाएं; प्रिंट [some status]; कर्सर की स्थिति को पुनर्स्थापित करें। स्क्रीन के नीचे लाइन पर प्रॉम्प्ट होने की स्थिति में शुरुआत में डाउन-एंड-बिट केवल आवश्यक है। Preexec लाइन दूसरी पंक्ति ( el) को मिटा देती है ताकि यह कमांड से आउटपुट के साथ मिश्रित न हो।

यदि दूसरी पंक्ति का टेक्स्ट टर्मिनल से अधिक चौड़ा है, तो डिस्प्ले को आड़ा-तिरछा किया जा सकता है। का प्रयोग करें Ctrl+ Lमरम्मत करने के लिए एक चुटकी में।


5

यहाँ bashगिल्स के zsh घोल के बराबर है। बैश में एक देशी टर्मोफ़ मॉड्यूल नहीं है, लेकिन tputकमांड (बंडल के साथ terminfo) एक ही काम करता है।

PS1_line1='\w \$ '
PS1_line2='[some status]'

if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
    PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
    PS2="\[$(tput el)\]> "
    trap 'tput el' DEBUG
else
    PS1="$PS1_line2 :: $PS1_line1"
fi

यदि टर्मिनल क्षमताओं में से किसी एक का समर्थन नहीं करता है, तो यह एक-पंक्ति प्रॉम्प्ट पर वापस आ जाएगा।

trapलाइन का अनुकरण zsh के लिए एक hacky तरीका है preexecसमारोह। अधिक जानकारी के लिए /superuser/175799/ देखें ।

EDIT : गाइल्स की टिप्पणियों के आधार पर बेहतर स्क्रिप्ट।


@ गिल्स: इनपुट के लिए धन्यवाद! मुझे लगता है कि मैं इसे अब बेहतर काम कर रहा हूं। सूक्ति-टर्मिनल और एक्सटर्म में बैश 4.1.5, और OSX टर्मिनल में 3.2.48 बैश।
जेंडर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.