Salida de terminal de empuje

16

¿Existe una forma estándar de invertir el orden de salida de una salida de 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á 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 siempre tener su mensaje en la parte inferior es contrario a la intuición, una forma más efectiva de presentar la salida 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 del terminal OSX?

rudolph9
fuente
Esto me confundiría, pero aplaudo sus esfuerzos. Uno de los principales temas de Linux / Unix / Open Source es que One Size not Fit All.
Bruce Ediger
Creo que esto no es posible a menos que cambie el código fuente del shell (por ejemplo bash).
Renan
55
Necesitarías hackear más que solo el caparazón. Las terminales se han desplazado de esta manera desde que eran electromecánicas. Por lo menos, diría que necesitarías hackear un emulador de terminal, tal vez también un shell.
Alexios
Esto es realmente contrario a la intuición. ¿Has notado la flecha de la tecla ENTER? Apunta a la línea de abajo, no arriba.
dresende
¿Hay alguna manera de tomar los elementos de salida desde un terminal? Mi pensamiento es crear algún tipo de envoltorio que tome cada uno de estos elementos de salida, trate a cada uno de ellos de forma similar a cómo se publican los tweets con los más nuevos siempre aparecen en la parte superior y pegando el indicador de entrada en la parte superior de la interfaz de usuario de Wrapper.
rudolph9

Respuestas:

6

En bash, esto mostrará el indicador / comando actual en la parte superior y su salida a continuación, pero sin desplazamiento ni comandos anteriores:

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

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

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

Luego ejecuta cada comando como:

command args |f

Guarda la salida, crea un número de líneas en blanco igual a la longitud + 1, luego vuelve a colocar la salida. Puede etiquetar una línea al final que muestre un aviso falso o una regla horizontal si lo desea. P.ej

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

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

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

También puede usar tput -Spara evitar múltiples llamadas binarias.


Obtuve el $PROMPT_COMMANDde https://github.com/swirepe/alwaysontop .

Tommy Jollyboat
fuente
6

Desafortunadamente, esto será bastante difícil. El protocolo entre las aplicaciones y el terminal OS-X es una variante del protocolo de control de terminal VT100 / ANSI , específicamente el protocolo XTerm .

Eso incluye un montón de suposiciones sobre la posición de la pantalla, etc., que sería difícil reasignar a un mundo donde la pantalla se invirtió.

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

El shell y los programas suponen que la pantalla avanza hacia arriba: nuevos datos en la parte inferior y continúan 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 revertiría el orden de las líneas en la salida del comando, por lo que el resto del contenido también saldría hacia atrás. Si desea que los comandos (por ejemplo: ls, cat) se ejecuten "hacia abajo", pero los impulsos para moverse "hacia arriba" la vida es más difícil.

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

Daniel Pittman
fuente
Hago. (-:
JdeBP
6

Aunque esto no revertirá exactamente la salida, mantendrá su 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 decide que le gusta, simplemente ingréselo en su .bash_profile con algo como:

echo "source ~/alwaysontop/alwaysontop.sh" >> ~/.bash_profile
ryanpcmcquen
fuente
1
Esto es un poco defectuoso (por ejemplo, con autocompletado de pestañas e historial), pero es una muy buena demostración de cómo se sentiría esta IU si se implementara correctamente. Creo que es valioso para eso: ¡ayudar a las personas a saber si lo quieren o no!
scipilot