मैं अपने कलर बैश प्रॉम्प्ट रैपिंग को कैसे ठीक करूं?


9

मैंने एक बैश प्रॉम्प्ट (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 स्ट्रिंग की लंबाई निर्धारित करने के लिए बैश कैसे पैदा कर सकता हूं, लेकिन प्रॉम्प्ट की वास्तविक प्रदर्शित लंबाई के अनुसार?

जवाबों:


21

bash\[ \]"प्रदर्शित लंबाई" निर्धारित करने के लिए उपयोग करता है: उन दो बचों के बीच पाठ को अनुचित माना जाता है और कुल लंबाई में नहीं गिना जाता है; बाकी सब कुछ है

आपके चर के साथ एक समस्या प्रतीत होती है: bright='\[[01m\]'वास्तव में एक ESC वर्ण शामिल नहीं है, इसलिए [01mसामान्य पाठ के रूप में मुद्रित हो जाता है , लेकिन लंबाई में नहीं गिना जाता है। यह होना चाहिए '\[\e[01m\]'। अन्य सभी चर के लिए भी।


सम्बंधित:

  • बैश में, आप रख सकते हैं \$(hg_status)करने के लिए $PS1एक अलग की आवश्यकता के बिना, सीधे PROMPT_COMMAND

1
यह आंशिक सुधार प्रदान करता है; लाइन की लंबाई अब ठीक से पाई गई है, लेकिन यह प्रॉम्प्ट पर पहली लाइन रैप राइटिंग के साथ समस्या को ठीक नहीं करता है।
क्रिस आर

1
क्रिस आर: मैं अपने शीघ्र और बस सब जगह की कोशिश की '\[[के साथ '\[\e[Ubuntu 12.04 पर पार्टी में काम किया। भागने के रंगों (और कुछ अन्य अप्रासंगिक-से-शीघ्र आकार के भागों) \[...\]ने भी मेरी मदद की, लेकिन मेरे पास आपके मुकाबले बहुत अधिक जटिल PS1 है (उसी पंक्ति पर दाएं संरेखित पाठ के रूप में और तुरंत दाईं ओर पाठ। कोने)। इसने शुरुआती रैपिंग और ओवरलैपिंग रैपिंग समस्याओं दोनों को ठीक किया।
TWStStrrob
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.