Mi tema terminal solía ser así,
Pero pensé que el aviso desperdiciaba mucho espacio. Y luego tuve la idea de que podía limpiar el mensaje cada vez que ejecutaba un comando. Estaba usando bash, una de las soluciones es usar la preexec_invoke_exec
función.
Uso el siguiente comando para limpiar los últimos caracteres de solicitud:
echo -ne "\033[1A\033[K\033[1A\033[K\033[31;1m$ \033[0m"
Para que la terminal esté muy limpia, así,
Pero ahora mi problema es que habrá un problema si quiero usar comandos múltiples en una línea , digamos, cuando lo use for i in ...
.
Aquí está la versión completa de la función en mi .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
con su función, la salida de los comandos iterativos se "traga", por así decirlo. Por lo tanto, OP quería desinfectar el comportamiento mientras habilitaba ese aviso. La razón por la que apoyo esto es el interés por la conciencia en el shell, la usabilidad, la retroalimentación y la portabilidad. El enlace que había puesto en mi comentario anterior conduce a la publicación en superusuario: se tomaron la molestia de atribuir este fragmento, por lo que es un prototipo que emula la funcionalidad nativa de zsh (que creo que es interesante), en forma de una función de captura aquí.Respuestas:
Primero
preexec_invoke_exec
tiene que modificarse para evitar múltiples ejecuciones depreexec
. Además, modifiquepreexec
para tener en cuenta el número real de líneas en$PS1
:Para
preexec
poder ejecutarse nuevamente,DONTCLEANPROMPT
debe estar desarmado o configurado en''
. Esto se hace conPROMPT_COMMAND
, que se ejecuta justo antes de que se emita la solicitud principal. Porpreexec
lo tanto , se ejecutará una vez y solo una vez para cada línea de comando.fuente
for
bucle! ¡Gracias! Hay otro inconveniente. Lo que sucede es que si lo hacels
en el comando y tiene la salida, luego hace otrals
, verá que la última línea de la salida anterior se borra ... ¿Tiene una idea de cómo resolver eso?prexec
para imprimir"\033[1A\033[K\033[31;1m$ \033[0m"
, que es solo uno\033[1A\033[K
(mover 1 línea hacia arriba, eliminar hasta el final de la línea) en lugar de dos.