제 터미널 테마는 이렇습니다.
그러나 나는 그 프롬프트가 너무 많은 공간을 낭비한다고 생각했다. 그리고 나중에 명령을 실행할 때마다 프롬프트를 정리할 수 있다는 아이디어를 얻었습니다. 나는 bash를 사용하고 있었고 해결책 중 하나는 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
답변
의 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
모든 명령 줄에 대해 한 번만 실행됩니다.