Meu tema do terminal costumava ser assim,
Mas achei que o prompt desperdiçou muito espaço. E, mais tarde, tive uma ideia de que poderia limpar o prompt toda vez que executava um comando. Eu estava usando o bash, uma das soluções é usar a preexec_invoke_exec
função.
Eu uso o seguinte comando para limpar os últimos caracteres do prompt:
echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"
Para que o terminal fique muito limpo, assim,
Mas agora o meu problema é que haverá problemas se eu quiser usar vários comandos em uma linha , digamos, quando eu usar for i in ...
.
Aqui está a versão completa da função no meu .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
zsh
...for i in $(seq 1 10); do ls; done
com a função dele, a saída dos comandos de iteração é "engolida" por assim dizer. Portanto, o OP queria higienizar o comportamento enquanto habilitava esse prompt. A razão pela qual eu apoio isso é o interesse pela conscientização sobre o shell, a usabilidade, o feedback e a portabilidade. O link que eu coloquei no meu comentário anterior leva à postagem sobre superusuário - eles se deram ao trabalho de atribuir esse trecho, por isso é um protótipo que simula a funcionalidade nativa do zsh (que eu acho interessante), na forma de uma função trap aqui.Respostas:
Primeiro
preexec_invoke_exec
deve ser modificado para impedir várias execuções depreexec
. Além disso, modifiquepreexec
para levar em conta o número real de linhas em$PS1
:Para
preexec
poder ser executado novamente,DONTCLEANPROMPT
deve estar desabilitado ou definido como''
. Isso é feito comPROMPT_COMMAND
, que é executado imediatamente antes da emissão do prompt principal. Portantopreexec
, será executado uma vez e apenas uma vez para cada linha de comando.fonte
for
loop! Obrigado! Há mais um inconveniente. O que acontece é que, se você executals
o comando els
obtém a saída, realiza outra , verá que a última linha da saída anterior é apagada ... você tem uma idéia de como resolver isso?prexec
para imprimir"\033[1A\033[K\033[31;1m$ \033[0m"
, que é apenas um\033[1A\033[K
(mova 1 linha para cima, exclua até o final da linha) em vez de dois.