मैंने एक बैश प्रॉम्प्ट (PROMPT_FUNCTION का उपयोग करके) को इस तरह परिभाषित किया है:
function get_hg_prompt_prefix() {
local APPLIED_COLOR=$1; shift
local UNAPPLIED_COLOR=$1; shift
local ALERT_COLOUR=$1; shift
local TEXTCOLOR=$1; shift
local mercurial_prompt_line="{{patches|join(:)|pre_applied(${APPLIED_COLOR})|post_applied(${TEXTCOLOR})|pre_unapplied(${UNAPPLIED_COLOR})|post_unapplied(${TEXTCOLOR})}\n\r}"
local mercurial_status_prompt="{ ${ALERT_COLOUR}{status}${TEXTCOLOR}}"
echo "$(hg prompt "${mercurial_prompt_line}" 2>/dev/null)$(hg prompt "${mercurial_status_prompt}" 2>/dev/null)"
}
function set_prompt() {
bright='\[[01m\]'
colors_reset='\[[00m\]'
HOSTCOLOR=${colors_reset}='\[[34m\]'
USERCOLOR=${colors_reset}='\[[01m\]'
TEXTCOLOR=${colors_reset}='\[[32m\]'
APPLIED_COLOR=${colors_reset}='\[[32m\]'
UNAPPLIED_COLOR=${colors_reset}='\[[37m\]'
ALERT_COLOUR=${colors_reset}='\[[31m\]'
hg_status="$(get_hg_prompt_prefix $APPLIED_COLOR $UNAPPLIED_COLOR $ALERT_COLOUR $TEXTCOLOR)"
ps1_prefix="${hg_status}$colors_reset($bright$(basename $VIRTUAL_ENV)$colors_reset) "
PROMPTEND='$'
PS1="${ps1_prefix}${USERCOLOR}\u${colors_reset}${TEXTCOLOR}@${colors_reset}${HOSTCOLOR}\h${colors_reset}${TEXTCOLOR} (\W) ${PROMPTEND}${colors_reset} "
}
PROMPT_COMMAND=set_prompt
सामान्य तौर पर, यह मुझे एक मल्टी-लाइन प्रॉम्प्ट देता है जो कुछ hg स्टेटस जानकारी के साथ-साथ मेरे वर्तमान वर्चुअनव को प्रदर्शित करता है, जैसे (बिना रंग के) इस तरह:
buggy-wins.patch
! (saas) user@computer (~) $
समस्या यह है, यह प्रॉम्प्ट की लंबाई (मुझे लगता है!) की गणना के साथ खराब हो रहा है और अजीब टर्मिनल रैपिंग मुद्दों और कर्सर प्लेसमेंट का कारण बन रहा है। उदाहरण के लिए, char०-चार टर्मिनल में, यहाँ मैं देख रहा हूँ (** - चारों ओर वर्ण कर्सर स्थान है):
~) $ **a**nis) crose@chris-rose (~
शीघ्र प्रदर्शित करने के लिए पर्याप्त टर्मिनलों में, लाइन रैपिंग पहले की तुलना में बहुत अधिक होती है; यहां सबसे अधिक पाठ मैं 108-चौड़ी-चौड़ी टर्मिनल विंडो में प्रॉम्प्ट की पहली पंक्ति पर फिट कर सकता हूं (फिर से, ** मेरे कर्सर स्थान को चिह्नित करता है):
**(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff
जब रेखा अधिक हो जाती है, तो यह प्रॉम्प्ट को अधिलेखित कर देता है। हालांकि, इनपुट की दूसरी लाइन टर्मिनल के किनारे पर दाईं ओर चलती है, और फिर सही तरीके से लपेटती है।
तो, स्पष्ट रूप से कुछ शीघ्र की चौड़ाई के साथ खिलवाड़ कर रहा है। मैं एएनएसआई से बचने के कोड के अनुसार नहीं पीएस 1 स्ट्रिंग की लंबाई निर्धारित करने के लिए बैश कैसे पैदा कर सकता हूं, लेकिन प्रॉम्प्ट की वास्तविक प्रदर्शित लंबाई के अनुसार?