नीचे की ओर तीर दबाते समय टर्मिनल लाइन का हिस्सा गायब हो जाता है


2

मैं अपने टर्मिनल में अधिक प्रासंगिक जानकारी प्रदर्शित करने के लिए एक कस्टम PS1 का उपयोग करता हूं, जैसे कि मैं एक git डायरेक्टरी में हूं और अगर यह साफ है या बदलाव करने की जरूरत है। हालांकि, कभी-कभी जब मैं कमांड के माध्यम से तीर चला रहा हूं, तो टर्मिनल लाइन का हिस्सा गायब हो जाता है:

@ ~/tests/testing [tests] > grunt
# up arrow, down arrow
@ ~/tests/testing [t

अनिवार्य रूप से, ests] > कट जाता है और मैं बस साथ छोड़ दिया जाता हूँ [t

क्या कोई विशेष कारण है कि इस पीएस 1 विन्यास के साथ लाइन का हिस्सा क्यों कट रहा है?

यहाँ कुछ अतिरिक्त जानकारी है:

मेरा शब्द env var है xterm-256color। ये रहा मेरा .bash_profile:

red='\033[0;31m'
yellow='\033[0;32m'
orange='\033[0;33m'
blue='\033[0;34m'
pink='\033[0;35m'
NC='\033[0m'

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      echo -en " [${orange}init${NC}]"
      return
    fi

    echo -n " ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      echo -en "${red}"
    else
      echo -en "${blue}"
    fi
    echo -en "$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

export PS1="@ \w\[\$(stuff)\]\[\$(tput sgr0)\] > "

क्या आप कृपया अपने टर्मिनल प्रकार और जोड़ेंगे TERM वातावरण विविधता? और है stuff वास्तव में वास्तव में आपके पीएस 1 में क्या है, या यह एक प्लेसहोल्डर है pwd या कुछ और! धन्यवाद!
cxw

मेरे साथ अपडेट किया गया .bash_profile
josh

यदि आप हटा देते हैं तो क्या होता है tput?
cxw

मैंने इसे हटा दिया लेकिन यह अभी भी छोटा है
josh

में stuffके stderr ls को नहीं भेजा जाता है /dev/null। यह न देखें कि यह कैसे प्रासंगिक है, लेकिन शायद इसे एक शॉट दें
cxw

जवाबों:


2

@ i_am_root का सुझाव \[ तथा \] की परिभाषा के अंदर red और एक अच्छा है। हालाँकि, प्रति इस , केवल प्रक्रियाओं को मारना \[ तथा \] में PS1, पाठ में शामिल नहीं है PS1 द्वारा $()। इसलिए, उपयोग करें \001 तथा \002 (या \x01 तथा \x02 ) के भीतर red और इसके बजाय की तरह \[ तथा \]

नोट: प्रति यह जवाब , केवल एस्केप कोड ही होना चाहिए \001 तथा \002। उपयोगकर्ता को दिखाई देने वाला पाठ बाहर होना चाहिए \001 तथा \002 ताकि बैश को पता चले कि यह स्क्रीन पर जगह लेता है और फिर से रीडिंग करते समय इसका हिसाब कर सकता है।


हम्म ... क्या स्वरूपण / रंग से पाठ को विभाजित करने की तुलना में इसे संभालने का एक और तरीका है? अभी, [tests] सामान्य रंग के रूप में दिखाई देता है [] और लाल tests, जिसका अर्थ है कि मुझे स्वरूपण से पहले और बाद में होने वाले पाठ को विभाजित करना होगा। यदि मैं सभी पाठों को एक साथ रखता हूं, तो पूरा पाठ लाल दिखाई देगा।
josh

का उपयोग करते हुए \001 तथा \002 रंग कोड के पहले और बाद में इसे ठीक कर दिया! यदि आप अपने उत्तर को प्रतिबिंबित करने के लिए संपादित करते हैं (क्योंकि मुझे आपके द्वारा लिंक किए गए उत्तर से जानकारी मिली है, और जब से मुझे संपादित नहीं करना है stuff विधि) मैं आपके उत्तर को स्वीकार करूंगा।
josh

संपादित - खुशी है कि यह काम किया! मुझे सही रास्ते पर लाने के लिए @i_am_root को भी धन्यवाद!
cxw

1

बैश रंग कोड, भागने वाले अक्षर, असाइनमेंट, और इस तरह से जल्दी भ्रमित हो जाते हैं।

इस कोड नमूने को आज़माएं जो प्रतिस्थापित करता है echo को जोड़कर आदेश देता है PS1 चर।

red='\[\033[0;31m\]'
yellow='\[\033[0;32m\]'
orange='\[\033[0;33m\]'
blue='\[\033[0;34m\]'
pink='\[\033[0;35m\]'
NC='\[\033[0m\]'

export PS1="@ \w"

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      PS1="${PS1} [${orange}init${NC}]"
      return
    fi

    PS1="$PS1 ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      PS1="${PS1}${red}"
    else
      PS1="${PS1}${blue}"
    fi
    PS1="${PS1}$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

stuff
PS1="${PS1}$(tput sgr0) > "

इस कारण मेरा आउटपुट बन जाता है: @ ~/tests/testing [\[\]tests\[\]] >
josh

मैंने निकालने की कोशिश की e से echo -en लेकिन यह ठीक से रंग कोड से नहीं बचता है, इसलिए मैं समाप्त करता हूं [\033[0;31mtests\033[0m]
josh

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