私の端末のテーマは以前はこんな感じでしたが、
しかし、私はプロンプトが非常に多くのスペースを浪費したと思いました。その後、コマンドを実行するたびにプロンプトをクリーンアップできるというアイデアが浮かびました。私は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
最初に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回だけ実行されます。