Apaga antigas linhas de prompt no bash para economizar espaço de rolagem

11

Meu tema terminal costumava ser assim,

Maseuacheiqueopromptdesperdiçoutantoespaço.Edepoiseutiveumaidéiaqueeupoderialimparoprompttodavezqueeuexecutasseumcomando.Euestavausandoobash,umadassoluçõeséusarafunçãopreexec_invoke_exec.

Euusooseguintecomandoparalimparosúltimoscaracteresdeprompt:

echo-ne"3[1A3[K3[1A3[K3[31;1m$ 3[0m"

Para que o terminal fique bem limpo, assim

Masagora,meuproblemaéquehaveráproblemaseeuquiserusarmulti-comandosemumalinha,digamos,quandoeuusarforiin....

Aquiestáaversãocompletadafunçãonomeu.bashrc,

preexec(){echo-ne"3[1A3[K3[1A3[K3[31;1m$ 3[0m"; echo -n "$1"; echo -ne "  3[37;2m["; echo -n "$2"; echo -ne "]3[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
    
por Libin Wen 30.12.2013 / 04:20

1 resposta

3

Primeiro preexec_invoke_exec precisa ser modificado para evitar várias execuções de preexec . Além disso, modifique preexec para levar em conta o número real de linhas em $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'

Para que preexec seja executado novamente, DONTCLEANPROMPT precisa ser desfeito ou definido como '' . Isso é feito com PROMPT_COMMAND , que é executado logo antes do prompt principal ser emitido. Portanto, preexec será executado uma vez e somente uma vez para cada linha de comando.

    
por 05.02.2014 / 22:08