Salida del terminal de empuje

Salida del terminal de empuje

¿Existe una forma estándar de invertir el orden de salida de una salida terminal, es decir:

~/Developer $ command0 
-bash: comman0: command not found 
~/Developer $ command2 
-bash: command2: command not found 
~/Developer $ command3 
-bash: command3: command not found 
~/Developer $ 

se mostraría como:

~/Developer $ 
-bash: command3: command not found 
~/Developer $ command3 
-bash: command2: command not found 
~/Developer $ command2 
-bash: comman0: command not found 
~/Developer $ comman0

Siento que tener siempre su mensaje en la parte inferior es contrario a la intuición. Una forma más efectiva de presentar el resultado sería invertir el orden de salida. ¿Cómo podría implementar esto? Específicamente, ¿dónde se definió la parte de salida del programa terminal OSX?

Respuesta1

En bash, esto mostrará el mensaje/comando actual en la parte superior y su salida debajo, pero sin desplazamiento ni comandos anteriores:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1'

Esta función colocará los comandos anteriores a continuación, pero debe canalizar todos y cada uno de los comandos individualmente. Desafortunadamente, exec > >(f)no puedo ayudar con esto ya que redirige todo bash, no comandos individuales. Aquí está la función:

f () { tee ~/.STDIN | wc -l | xargs expr 1 + | xargs tput il && cat ~/.STDIN; }

Luego ejecute todos los comandos como:

command args |f

Guarda el resultado, crea una cantidad de líneas en blanco igual a la longitud+1 y luego vuelve a colocar el resultado. Puede etiquetar una línea al final que mostrará un mensaje falso o una regla horizontal si lo desea. P.ej

printf '%*s' $COLUMNS | tr ' ' _;

Como una alternativa basura pero automática a toda esta función, podemos agregar un comando al final de nuestro $PROMPT_COMMAND anterior que borra 11 líneas algo arbitrarias:

PROMPT_COMMAND='tput cup 0 0; tput el; tput el1; tput il 11'

También puedes usarlo tput -Spara evitar múltiples llamadas binarias.


obtuve el $PROMPT_COMMANDdehttps://github.com/swirepe/alwaysontop.

Respuesta2

Desafortunadamente, esto será bastante difícil. El protocolo entre las aplicaciones y el terminal OS-X es una variante delVT100/ANSIprotocolo de control del terminal, específicamente elXTérminoprotocolo.

Eso incluye un montón de suposiciones sobre la posición de la pantalla, etc., que sería un desafío reasignar a un mundo donde la visualización estaba invertida.

Peor aún, todo lo que obtiene su emulador de terminal es una cadena de comandos del tipo "poner este carácter en esta posición". No se hace ninguna distinción entre el símbolo del sistema y la salida de un comando ejecutado por él, por lo que no se puede hacer una cosa para ambas partes, al menos no sin la cooperación del shell subyacente.

El shell y los programas suponen que la pantalla avanza hacia arriba, con nuevos datos en la parte inferior, y continúa hacia abajo para siempre.

Podría, al menos en teoría, modificar su emulador de terminal para que muestre líneas en orden inverso: la línea "inferior" primero, y así sucesivamente hasta la línea "superior" en la parte inferior de la pantalla.

Sin embargo, eso invertiría el orden de las líneas en la salida del comando, por lo que el resto del contenido también aparecería al revés. Si desea que los comandos (por ejemplo: ls, cat) se ejecuten "hacia abajo" pero le piden que se mueva "hacia arriba", la vida es más difícil.

No conozco ningún software que implemente esto. (... pero consulte el comentario de JdeBD sobre esto para obtener un enlace a uno). :)

Respuesta3

Aunque esto no revertirá exactamente la salida, mantendrá el mensaje en la parte superior:

https://github.com/swirepe/alwaysontop

Para usarlo ejecuta:

git clone https://github.com/swirepe/alwaysontop.git
cd alwaysontop/
source alwaysontop.sh

Si decides que te gusta, simplemente consíguelo en tu .bash_profile con algo como:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile

información relacionada