这里提出问题:
- 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
如果我打算实际实施此更改,我需要研究哪个库/程序? “终端堆栈”的哪一部分负责将新行追加到终端缓冲区的行为?
我曾经认为它会在终端源代码中,然后是 shell,现在看起来可能是 VTE?
有什么指点吗?
答案1
终端仿真器的实现方式并不相同。您需要更改的内容具体取决于您打算修改的终端模拟器。
一般来说,这可以在两个地方实现:在仿真部分中,将打印和控制序列解释为对终端显示状态的某种形式的内存表示形式的修改;或者在实现部分中,呈现该显示状态到某种输出设备上。
前者将是一项非常复杂的任务。应用程序软件,无论是提供全屏文本用户界面的软件,还是仅提供可编辑单行之类的软件,都会对进展方向。他们假设各种各样的事情,比如␊
、、、、、、、、、等等的方向。 (理论上,在符合 ECMA-48:1991 的设备中,行行进和隐式移动的方向是可以切换的。据我所知,没有任何 Unix 或 Linux 终端仿真器能够真正实现这一点。世界上大多数操作的前提是它不是t。)最后,我怀疑人们会经历各种后果和连锁反应,发现人们以艰难的方式实施了后一种方法。␈
␌
␋
RI
IND
CUD
CUU
因为后者是一个相对相当容易的任务。为了好玩,我只是在我的终端模拟器中实现了它。它是两个实现器中布尔标志的命令行开关,以及一些在多个位置执行坐标转换的条件表达式。不可否认,可见的实现窗口始终是这些实现器中字符单元大小的整数倍,这避免了一些额外的复杂性。
也就是说:使用它并与多年来从上到下阅读的习惯作斗争,然后体验到最初的期望小事情的应用程序出现问题(例如插入符号是穷人的向上箭头和波形符是穷人的下划线),然后我在手册页中添加了警告注释。我正在考虑将该机制保留到下一个版本,以便人们从现在开始可以在终端上实际尝试错误的方式并得出他们确实这样做的结论不是不管他们怎么说,毕竟还是想要这个。 ☺
进一步阅读
- 乔纳森·德博因·波拉德。
console-termio-realizer
。 nosh 工具集手册页。软件。 - 乔纳森·德博因·波拉德。
console-fb-realizer
。 nosh 工具集手册页。软件。 - https://unix.stackexchange.com/a/289871/5132
答案2
是什么精确的您想要实现的行为?
首先我假设你希望有全部行的顺序相反每时每刻。
请注意,在我看来,在大多数情况下,这会导致非常不寻常和违反直觉(如果不是直接破坏)的行为,可能您很快就会放弃使用。
cat
编辑文本文件会显示从下到上的行,而不是您通常阅读文本的方向。在您最喜欢的文本编辑器和查看器中,这些行也会颠倒过来。在应用程序中,它们的顶部栏将位于底部,底部栏将位于顶部。在 alsamixer 中,音量控件将从顶部垂下。方框图字符(例如在 alsamixer、午夜指挥官等中)会在角落处散开。在许多应用程序中,向上和向下键将使光标沿相反方向移动。
这可以通过修改您最喜欢的终端仿真器的源代码(如果您使用基于 VTE 的仿真器(如 GNOME 终端),则修改 VTE)来实现。
基本上,终端仿真器跟踪逻辑内容(哪个字符单元包含具有哪些图形属性的字母),并将它们转换为用户可见的像素(精美渲染的字形)。这需要颠倒过来。我会寻找基于字符的坐标和基于像素的坐标之间发生转换的位置,这是发生与单元格高度相乘或除法的所有位置。这些公式需要调整。例如,如果您看到 a y_pixel = top_padding + row * cell_height
,它可能会变成y_pixel = top_padding + (number_of_rows - 1 - row) * cell_height
, 或类似的东西。
在VTE中,超级平滑的滚动(使用触摸板进行逐像素滚动),加上平滑滚动时额外的底部填充(在非网格对齐的情况下,例如最大化窗口)填充内容的方式会让你额外头痛。
完成基本渲染后,您还必须确保发送到应用程序的鼠标事件被正确翻转,跟踪选择的鼠标事件也是如此。滚动条也应该翻转。
第二步,您可能想要添加一个菜单项,或者引入一个新的自定义转义序列(可能是一个新的 DEC 私人号码),让您可以在标准行为和这种颠倒行为之间切换。请注意,更改模式会立即将所有内容(所有屏幕内容和历史记录)颠倒或颠倒。能够恢复原始行为非常方便,特别是如果它可以在您首选的编辑器前面的包装脚本中自动完成的话。对于 VTE 和基于 VTE 的模拟器,图形菜单条目将需要两个组件之间的新 API,因此这是采用转义序列的又一个原因。
如果您想要比这更细粒度的东西,例如每个命令的输出以“正常”顺序出现,而命令序列是“颠倒”,那么它就会变得更加复杂,无法在模拟器中完成它自己的,它需要获得帮助(通过新设计的转义序列)来知道要翻转哪些逻辑部分。我个人的建议是忘记它,我认为这不太可行。