স্ক্রোল স্পেস সংরক্ষণ করতে বাশগুলিতে পুরানো প্রম্পট লাইন সাফ করুন


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

গ্লিফ লেফকোভিটস zsh কৌশল - দুর্দান্ত!

2
সহজ সমাধানটি শুরু হয় zsh...
গিলস'স'- দুষ্ট হওয়া বন্ধ করুন

আমি আপনার প্রশ্নটি এখানে মিস করেছি ...
ডেভিড হোলজার

@ ডেভিডহোলজার ওয়েল আপনি যদি for i in $(seq 1 10); do ls; doneতার ফাংশনটি করেন তবে পুনরাবৃত্ত আদেশের আউটপুট "গিলে ফেলেছে " তাই কথা বলতে। সুতরাং ওপি প্রম্পটটি সক্ষম করার সময় আচরণটি স্যানিটাইজ করতে চেয়েছিল। আমি এটিকে সমর্থন করার কারণটি শেল, ব্যবহারযোগ্যতা, প্রতিক্রিয়া এবং বহনযোগ্যতার বিষয়ে সচেতনতার আগ্রহ for আমি আমার পূর্ববর্তী মন্তব্যে যে লিঙ্কটি রেখেছিলাম তা সুপারুসারটিতে পোস্টের দিকে পরিচালিত করে - তারা এই স্নিপেটটি চিহ্নিত করার সমস্যায় পড়েছিল, তাই এটি একটি প্রোটোটাইপ যা একটি জাল ফাংশনের আকারে নেটিভ zsh কার্যকারিতা (যা আমি আকর্ষণীয় বলে মনে করি) অনুকরণ করে em এখানে.

উত্তর:


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 লাইন সরান, মুছে ফেলুন)।
অ্যাডাইফন

ফ্ললেস! আপনার সমাধান এবং ব্যাখ্যা করার জন্য সময় দেওয়ার জন্য আপনাকে অনেক ধন্যবাদ। এটি ওপির সমস্যা সমাধান করে এবং আরও বেশি সমাধান সমাধান করে। এটি সবার জন্য ব্যবহারযোগ্য করে তোলে! চিয়ার্স!
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.