
Вопрос задан здесь:
- 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
Если я собираюсь на самом деле реализовать это изменение, какую библиотеку/программу мне нужно исследовать? Какая часть «терминального стека» отвечает за поведение добавления новых строк в терминальный буфер?
Раньше я думал, что это будет в исходном коде терминалов, а затем в оболочке, а теперь похоже, что это, возможно, VTE?
Есть какие-нибудь указания?
решение1
Терминальные эмуляторы не реализованы идентично. То, что вам нужно изменить, зависит очень конкретно от того, какой терминальный эмулятор вы собираетесь модифицировать.
В общих чертах это можно реализовать в двух местах: в части эмуляции, которая интерпретирует и реализует последовательности печати и управления как модификации некоторой формы представления состояния отображения терминала в памяти, или в части реализации, которая выводит это состояние отображения на какое-либо устройство вывода.
Первое было бы очень сложной задачей. Прикладное программное обеспечение, как те, которые предоставляют полноэкранные текстовые пользовательские интерфейсы, так и те, которые просто делают что-то вроде предоставления редактируемой одной строки, делают предположения онаправление прогресса. Они предполагают всевозможные вещи, такие как направления ␊
, ␈
, ␌
, ␋
, RI
, IND
, CUD
, CUU
, и так далее. (Теоретически, в устройстве, соответствующем ECMA-48:1991, направления продвижения линии и неявного движения можно переключать. Я не знаю ни одного эмулятора терминала Unix или Linux, который бы фактически это реализовал. Мир в основном действовал, исходя из предпосылки, что это не так.) В конце концов, я подозреваю, что кто-то прошел бы весь путь через различные последствия и побочные эффекты, чтобы обнаружить, что он реализовал последний метод трудным путем.
Потому что последнее — сравнительно простая задача. Ради интереса я просто реализовал это в своем эмуляторе терминала. Это был переключатель командной строки для булевого флага в двух реализаторах и некоторые условные выражения для выполнения преобразований координат в нескольких местах. По общему признанию, видимое реализованное окно всегда является целым числом, кратным размеру ячейки символа в этих реализаторах, что позволило избежать некоторых дополнительных сложностей.
Тем не менее: пользуясь им и борясь с привычкой читать сверху донизу на протяжении многих лет, а затем столкнувшись с чем-то простоисходныйпроблемы с приложениями, которые ожидают мелочей (например, каретка является символом беднякавверхстрелка и тильда, как подчеркивание бедняка), я затем поместил предостерегающее примечание на странице руководства. Я подумываю оставить механизм для следующего релиза, просто чтобы люди могли с этого момента на самом деле попробовать терминал неправильно и прийти к выводу, что они делаютнетхотят этого, несмотря на то, что они утверждали, в конце концов. ☺
дальнейшее чтение
- Джонатан де Бойн Поллард.
console-termio-realizer
. страницы руководства по набору инструментов nosh. Программное обеспечение. - Джонатан де Бойн Поллард.
console-fb-realizer
. страницы руководства по набору инструментов nosh. Программное обеспечение. - https://unix.stackexchange.com/a/289871/5132
решение2
Чтоточныйповедения, которого вы хотели бы достичь?
Во-первых, я предполагаю, что вы хотите иметьвсестроки в обратном порядкевсе время.
Обратите внимание, что, по моему мнению, в большинстве случаев это приведет к крайне необычному и нелогичному (если не сказать, к поломке) поведению, от которого вы, возможно, довольно скоро откажетесь.
cat
'текстовый файл покажет его строки снизу вверх, а не в том направлении, в котором вы обычно читаете текст. В вашем любимом текстовом редакторе и просмотрщике строки также будут перевернуты. В приложениях их верхняя панель будет внизу, а нижняя панель будет наверху. В alsamixer регуляторы громкости будут свисать сверху. Символы рисования рамок (например, в alsamixer, midnight commander и т. д.) будут разваливаться по углам. Клавиши «Вверх» и «Вниз» будут перемещать курсор в противоположном направлении во многих приложениях.
Этого можно добиться, изменив исходный код вашего любимого эмулятора терминала (или VTE, если вы используете эмулятор на основе VTE, такой как GNOME Terminal).
По сути, эмулятор терминала отслеживает логическое содержимое (какая символьная ячейка содержит какую букву с какими графическими атрибутами) и преобразует их в видимые пользователю пиксели (красиво отрисованные глифы). Это должно быть сделано наоборот. Я бы поискал места, где происходит преобразование между символьными и пиксельными координатами, то есть все места, где происходит умножение или деление на высоту ячейки. Эти формулы должны быть скорректированы. Например, если вы видите y_pixel = top_padding + row * cell_height
, возможно, он станет y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height
, или что-то вроде этого.
В VTE сверхплавная прокрутка (попиксельная прокрутка с помощью сенсорной панели), а также то, как дополнительный нижний отступ (в случае невыровненного по сетке, например, развернутого окна) заполняется содержимым при плавной прокрутке, вызовут у вас дополнительную головную боль.
После того, как вы сделаете базовый рендеринг, вам также придется убедиться, что события мыши, которые отправляются в приложения, правильно перевернуты, а также события мыши, которые отслеживают выбор. Полоса прокрутки также должна быть перевернута.
В качестве второго шага вы можете захотеть либо добавить пункт меню, либо ввести новую пользовательскую escape-последовательность (вероятно, новый частный номер DEC), которая позволит вам переключаться между стандартным и этим перевернутым поведением. Обратите внимание, что изменение режима немедленно перевернет все (весь экранный контент и историю) вверх ногами или обратно. Удобно иметь возможность восстановить исходное поведение, особенно если это можно сделать автоматически в скрипте-оболочке перед, скажем, вашим предпочитаемым редактором. В случае VTE и эмулятора на основе VTE для графического меню потребуется новый API между двумя компонентами, так что это еще одна причина использовать escape-последовательность.
Если вы хотите что-то более тонкое, например, чтобы вывод каждой команды отображался в "нормальном" порядке, а последовательность команд "перевернута", то это становится гораздо более сложной историей, которую нельзя сделать в эмуляторе самостоятельно, для этого потребуется помощь (через недавно разработанные управляющие последовательности), чтобы знать, какие логические части переворачивать. Моя личная рекомендация - забыть об этом, я не нахожу это разумно выполнимым.