web-dev-qa-db-ja.com

スクロールスペースを節約するために、bashの古いプロンプト行をクリアします

私の端末のテーマは以前はこんな感じでしたが、

terminal them before

しかし、私はプロンプトが非常に多くのスペースを浪費したと思いました。その後、コマンドを実行するたびにプロンプ​​トをクリーンアップできるというアイデアが浮かびました。私はbashを使用していましたが、解決策の1つは、preexec_invoke_exec関数を使用することです。

次のコマンドを使用して、最後のプロンプト文字をクリーンアップします。

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

このようにターミナルがとてもきれいになるように

enter image description here

しかし、今私の問題は、1行に複数のコマンドを使用したい場合、たとえば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
11
Libin Wen

最初に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は、コマンドラインごとに1回だけ実行されます。

3
Adaephon