Cancella le vecchie righe di prompt in bash per risparmiare spazio di scorrimento


11

Il mio tema terminale era così,

Terminali prima

Ma ho pensato che il prompt avesse sprecato così tanto spazio. E più tardi ho avuto l'idea che avrei potuto pulire il prompt ogni volta che ho eseguito un comando. Stavo usando bash, una delle soluzioni è usare la preexec_invoke_execfunzione.

Uso il seguente comando per pulire i caratteri dell'ultimo prompt:

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

In modo che il terminale sia molto pulito, in questo modo,

inserisci qui la descrizione dell'immagine

Ma ora il mio problema è che ci saranno problemi se voglio usare più comandi in una riga , diciamo, quando uso for i in ....

Ecco la versione completa della funzione nel mio .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

Il trucco di Glyph Lefkowitz zsh - bello!

2
La soluzione facile inizia con zsh...
Gilles 'SO- smetti di essere malvagio' il

Ho perso la tua domanda lì dentro ...
David Hoelzer,

@DavidHoelzer Bene, se lo fai for i in $(seq 1 10); do ls; donecon la sua funzione, l'output dei comandi iteranti viene "ingoiato" per così dire. Quindi OP ha voluto disinfettare il comportamento mentre abilitava quel prompt. Il motivo per cui sostengo questo è l'interesse per la consapevolezza nella shell, l'usabilità, il feedback e la portabilità. Il link che avevo inserito nel mio precedente commento porta al post su superutente: si sono presi la briga di attribuire questo snippet, quindi è un prototipo che emula la funzionalità zsh nativa (che ritengo interessante), sotto forma di una funzione trap Qui.

Risposte:


3

Innanzitutto preexec_invoke_execdeve essere modificato per impedire l'esecuzione multipla di preexec. Inoltre, modifica preexecper tenere conto del numero effettivo di righe in $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'

Per preexecpoter essere eseguito nuovamente, DONTCLEANPROMPTdeve essere non impostato o impostato su ''. Questo viene fatto con PROMPT_COMMAND, che viene eseguito poco prima dell'emissione del prompt principale. Pertanto preexecverrà eseguito una volta e una sola volta per ogni riga di comando.


La tua soluzione risolve il problema con il forloop! Grazie! C'è un ulteriore inconveniente. Cosa succede è che se esegui lsil comando e hai l'output, quindi ne fai un altro ls, vedrai che l'ultima riga dell'output precedente viene cancellata ... hai idea di come risolverlo?

1
Probabilmente stai usando un prompt con una sola riga. Cambia la prima eco in prexecstampa "\033[1A\033[K\033[31;1m$ \033[0m", ovvero una sola \033[1A\033[K(sposta 1 riga in alto, elimina fino alla fine della riga) anziché due.
Annuncio il

Flawless! Grazie mille per la tua soluzione e per il tempo dedicato alla spiegazione. Ciò risolve il problema di OP ed esegue il debug della soluzione ancora di più. Lo rende utilizzabile per tutti! Saluti!
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.