
La pregunta se hace aquí:
- https://serverfault.com/questions/152310/reverse-bash-console-text-flow
- https://superuser.com/questions/719317/can-i-reverse-the-stream-direction-of-my-terminal
- https://askubuntu.com/questions/431873/terminal-with-output-scrolling-down
Si realmente tengo la intención de implementar este cambio, ¿qué biblioteca/programa debo investigar? ¿Qué parte de la 'pila de terminales' es responsable del comportamiento de agregar nuevas líneas al búfer del terminal?
Solía pensar que estaría dentro del código fuente de Terminals, y luego en el shell, y ahora parece que posiblemente sea VTE.
¿Algún consejo?
Respuesta1
Los emuladores de terminal no se implementan de manera idéntica. Lo que necesita cambiar depende muy específicamente del emulador de terminal que desee modificar.
En términos generales, esto se puede implementar en dos lugares: en la parte de emulación que interpreta y representa secuencias de impresión y control como modificaciones a alguna forma de representación en memoria del estado de visualización del terminal, o en la parte de realización que representa ese estado de visualización. en algún tipo de dispositivo de salida.
Lo primero sería una tarea sumamente compleja. Los software de aplicaciones, tanto aquellos que proporcionan interfaces de usuario textuales de pantalla completa como aquellos que simplemente hacen cosas como proporcionar una sola línea editable, hacen suposiciones sobre eldirección del progreso. Asumen todo tipo de cosas, como las direcciones de ␊
, ␈
, ␌
, ␋
, RI
, IND
, CUD
, CUU
etc. (En teoría, en un dispositivo compatible con ECMA-48:1991, las direcciones de progresión de línea y movimiento implícito son intercambiables. No conozco ningún emulador de terminal Unix o Linux que realmente implemente esto. El mundo ha operado principalmente bajo la premisa de que es 't.) Al final, sospecho que uno analizaría todas las consecuencias y efectos en cadena para descubrir que había implementado este último método de la manera más difícil.
Porque esto último es una tarea relativamente sencilla. Por diversión, lo acabo de implementar en mi emulador de terminal. Fue un cambio de línea de comando para una bandera booleana en dos de los realizadores y algunas expresiones condicionales para realizar transformaciones de coordenadas en varios lugares. Es cierto que la ventana realizada visible es siempre un múltiplo entero del tamaño de la celda del carácter en esos realizadores, lo que evitó algunas complejidades adicionales.
Dicho esto: después de haberlo usado y haber luchado contra el hábito de años de leer de arriba a abajo, y luego haber experimentado simplemente lainicialproblemas con aplicaciones que esperan pequeñas cosas (como que un símbolo de intercalación sea un símbolo de pobre).arribala flecha y la tilde son el subrayado de un hombre pobre), luego puse una nota de advertencia en la página del manual. Estoy considerando dejar el mecanismo para la próxima versión solo para que la gente de ahora en adelante pueda probar una terminal en el sentido incorrecto y llegar a la conclusión de que sí.noQuiero esto, a pesar de lo que afirmaron, después de todo. ☺
Otras lecturas
- Jonathan de Boyne Pollard.
console-termio-realizer
. Páginas del manual del conjunto de herramientas Nosh. Softwares. - Jonathan de Boyne Pollard.
console-fb-realizer
. Páginas del manual del conjunto de herramientas Nosh. Softwares. - https://unix.stackexchange.com/a/289871/5132
Respuesta2
Cuál es elexacto¿Comportamiento que te gustaría lograr?
Primero supongo que deseas tenertodolas líneas en orden inversotodo el tiempo.
Tenga en cuenta que, en mi opinión, en la mayoría de los casos esto daría como resultado un comportamiento terriblemente inusual y contrario a la intuición (si no directamente roto), posiblemente algo que dejaría de usar muy pronto.
cat
Al editar un archivo de texto se mostrarían sus líneas de abajo hacia arriba, no en la dirección en la que normalmente se lee el texto. En su editor y visor de texto favorito, las líneas también se invertirían. En las aplicaciones, su barra superior estaría en la parte inferior y su barra inferior estaría en la parte superior. En alsamixer los controles de volumen colgarían desde la parte superior. Los caracteres del dibujo de cajas (por ejemplo, en alsamixer, Midnight Commander, etc.) se desmoronarían en las esquinas. Las teclas Arriba y Abajo moverían el cursor en direcciones opuestas en muchas aplicaciones.
Esto se puede lograr modificando la fuente de su emulador de terminal favorito (o VTE en caso de que use un emulador basado en VTE como GNOME Terminal).
Básicamente, el emulador de terminal rastrea el contenido lógico (qué celda de carácter contiene qué letra con qué atributos gráficos) y los convierte en píxeles visibles para el usuario (glifos bien representados). Esto tendría que ponerse patas arriba. Buscaría los lugares donde ocurre la conversión entre las coordenadas basadas en caracteres y en píxeles, que son todos los lugares donde ocurre una multiplicación o división por la altura de la celda. Estas fórmulas deberían ajustarse. Por ejemplo, si ve un y_pixel = top_padding + row * cell_height
, quizás se convierta en un y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height
o algo así.
En VTE, el desplazamiento súper suave (desplazamiento por píxel con el panel táctil), además de la forma en que el relleno inferior adicional (en caso de que no esté alineado con la cuadrícula, por ejemplo, ventana maximizada) se llena con contenidos durante el desplazamiento suave, le causará un dolor de cabeza adicional.
Una vez que haya realizado la representación básica, también deberá asegurarse de que los eventos del mouse que se envían a las aplicaciones estén invertidos correctamente, al igual que los eventos del mouse que rastrean la selección. La barra de desplazamiento también debería estar invertida.
Como segundo paso, es posible que desee agregar una entrada de menú o introducir una nueva secuencia de escape personalizada (probablemente un nuevo número privado de DEC) que le permita alternar entre el comportamiento estándar y este al revés. Tenga en cuenta que cambiar el modo inmediatamente invertiría todo (todo el contenido en pantalla y el historial) al revés o al revés. Es útil poder restaurar el comportamiento original, especialmente si se puede hacer automáticamente en un script contenedor frente a, digamos, su editor preferido. En el caso de VTE y un emulador basado en VTE, una entrada de menú gráfico requeriría una nueva API entre los dos componentes, por lo que es una razón más para optar por una secuencia de escape.
Si desea tener algo más detallado que esto, por ejemplo, que la salida de cada comando aparezca en orden "normal" mientras que la secuencia de comandos está "al revés", entonces se convierte en una historia mucho más compleja que no se puede hacer en el emulador en propio, necesitaría ayuda (a través de secuencias de escape recientemente diseñadas) para saber qué partes lógicas invertir. Mi recomendación personal es olvidarlo, no lo encuentro razonablemente factible.