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


11

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

前にそれらを終わらせる

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

次のコマンドを使用して、最後のプロンプト文字を消去します。

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

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

ここに画像の説明を入力してください

しかし今私の問題は、たとえばを使用するときに、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

Glyph Lefkowitz zshトリック -いいね!

2
簡単な解決策はzsh… から始まります
Gilles「SO-邪悪なことをやめなさい」

私はそこにあなたの質問を逃しました...
David Hoelzer 14

@DavidHoelzerさてfor i in $(seq 1 10); do ls; done、彼の関数を使用すると、反復コマンドの出力は、いわば「飲み込まれ」ます。そのため、OPはそのプロンプトを有効にしながら動作をサニタイズしたいと考えました。私がこれをサポートする理由は、シェルでの意識、使いやすさ、フィードバック、移植性への関心です。私の以前のコメントに入れたリンクは、スーパーユーザーへの投稿につながります-彼らはこのスニペットを原因とする問題に行ったので、トラップ関数の形でネイティブzsh機能(興味深いと思います)をエミュレートするプロトタイプですここに。

回答:


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


あなたの解決策はforループで問題を解決します!ありがとうございました!さらに不便があります。何が起こるかは、あなたがしなければということでls、コマンドの上に、あなたが出力を持っている、あなたは別のかls、あなたは前の出力の最後の行が消去されることを確認できます...あなたはそれを解決する方法のアイデアを持っていますか?

1
おそらく1行だけのプロンプトを使用しています。最初のエコーprexecをprint "\033[1A\033[K\033[31;1m$ \033[0m"に変更します。これは2つではなく1つだけです\033[1A\033[K(1行上に移動し、行末まで削除します)。
Adaephon 2014

完璧!解決策と説明に時間を割いていただきありがとうございます。これはOPの問題を解決し、ソリューションをさらにデバッグします。誰でも使えるようになります!乾杯!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.