Bash
清除 bash 中的舊提示行以節省滾動空間
我的終端主題曾經是這樣的,
但我認為提示浪費了太多空間。後來我有了一個想法,每次執行命令時我都可以清理提示。我正在使用 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
,每個命令行將執行一次且僅執行一次。