स्क्रॉल स्पेस बचाने के लिए बैश में पुरानी प्रॉम्प्ट लाइन्स साफ़ करें


11

मेरा टर्मिनल थीम इस तरह का हुआ करता था,

उन्हें पहले टर्मिनल

लेकिन मुझे लगा कि प्रॉम्प्ट ने इतनी जगह बर्बाद कर दी है। और बाद में मुझे इस बात का अंदाजा हो गया कि मैं कमांड चलाने पर हर बार प्रॉम्प्ट को साफ कर सकता हूं। मैं बैश का उपयोग कर रहा था, समाधान का उपयोग preexec_invoke_execफ़ंक्शन का उपयोग करना है।

मैं अंतिम कमांड चार्ट को साफ करने के लिए निम्नलिखित कमांड का उपयोग करता हूं:

echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"

ताकि टर्मिनल बहुत साफ हो, जैसे,

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

लेकिन अब मेरी समस्या है, अगर मैं एक पंक्ति में मल्टी कमांड का उपयोग करना चाहता हूं, तो समस्या होगी , कहो, जब मैं उपयोग करूं for i in ...

यहाँ मेरे .bashrc में फ़ंक्शन का पूर्ण संस्करण है,

preexec () { echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"; echo -n "$1"; echo -ne "  \033[37;2m["; echo -n "$2"; echo -ne "]\033[0m\n"; }
preexec_invoke_exec () {
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
    local this_pwd=`pwd`; 
    preexec "$this_command" "$this_pwd"
}
trap 'preexec_invoke_exec' DEBUG


2
आसान समाधान के साथ शुरू होता है zsh...
गिल्स एसओ- बुराई को रोकना '

मुझे आपका प्रश्न याद आ गया ...
डेविड हूज़र

@DavidHoelzer ठीक है अगर आप for i in $(seq 1 10); do ls; doneउनके कार्य के साथ करते हैं, तो iterating कमांड का आउटपुट बोलने के लिए "निगल" जाता है। इसलिए ओपी उस संकेत को सक्षम करते हुए व्यवहार को पवित्र करना चाहता था। इसका कारण यह है कि मैं खोल, जागरूकता, प्रतिक्रिया और पोर्टेबिलिटी में जागरूकता के लिए रुचि रखता हूं। मैंने अपनी पूर्व टिप्पणी में जो लिंक डाला था, वह सुपरसर्वर के पद की ओर ले जाता है - वे इस स्निपेट को जिम्मेदार ठहराने की परेशानी में पड़ गए, इसलिए यह एक प्रोटोटाइप है, जो नेट फंक्शनल फंक्शनल (जो मुझे दिलचस्प लगता है), ट्रैप फंक्शन के रूप में करता है। यहाँ।

जवाबों:


3

के preexec_invoke_execकई निष्पादन को रोकने के लिए पहले संशोधित किया जाना चाहिए preexec। इसके अलावा, preexecलाइनों की वास्तविक संख्या को ध्यान में रखते हुए संशोधित करें $PS1:

preexec () { 
    # delete old prompt; one "\e[1A\e[K" per line of $PS1
    for (( i=0, l=$(echo -e $PS1 | wc -l) ; i < l ; i++ ))
    do             
        echo -ne "\e[1A\e[K"
    done
    # replacement for prompt
    echo -ne "\e[31;1m$ \e[0m"
    echo -n "$1"
    echo -ne "  \e[37;2m["
    echo -n "$2"
    echo -e "]\e[0m"
}

preexec_invoke_exec () {
    [ -n "$DONTCLEANPROMPT" ] && return
    DONTCLEANPROMPT=x
    [ -n "$COMP_LINE" ] && return  # do nothing if completing
    [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # don't cause a preexec for $PROMPT_COMMAND
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`;
    local this_pwd=`pwd`
    preexec "$this_command" "$this_pwd"
}

trap 'preexec_invoke_exec' DEBUG

PROMPT_COMMAND='unset DONTCLEANPROMPT'

preexecफिर से चलाने के लिए , DONTCLEANPROMPTया तो परेशान होना पड़ता है या सेट करना पड़ता है ''। इसके साथ किया जाता है PROMPT_COMMAND, जो प्राथमिक संकेत जारी होने से ठीक पहले चलाया जाता है। इसलिए preexecहर कमांड लाइन के लिए एक बार और केवल एक बार चलाया जाएगा।


आपका समाधान forलूप के साथ समस्या को हल करता है ! धन्यवाद! एक और असुविधा है। क्या होता है कि यदि आप lsकमांड पर करते हैं और आपके पास आउटपुट है, तो आप एक और करते हैं ls, आप देखेंगे कि पूर्व आउटपुट की अंतिम पंक्ति मिट जाती है ... क्या आपको पता है कि इसे कैसे हल किया जाए?

1
आप शायद केवल एक ही लाइन के साथ प्रॉम्प्ट का उपयोग कर रहे हैं। prexecप्रिंट करने के लिए पहली प्रतिध्वनि बदलें "\033[1A\033[K\033[31;1m$ \033[0m", वह केवल एक है \033[1A\033[K(1 पंक्ति ऊपर ले जाएँ, पंक्ति के अंत तक हटाएं) दो के बजाय।
Adaephon

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