繁体   English   中英

如何创建支持ANSI转义码序列的可滚动控制台应用程序

[英]How to create scrollable console application that support ANSI escape code sequences

我在此基于我所了解的技术做出一些假设,但也欢迎其他技术建议。

我的目标:编写一个ANSI Art查看器,使其尽可能类似于在DOS机器上进行查看,最好不要运行dosbox。 这将在Raspberry Pi上运行。

我已经有了控制台,可以使用适当的字符,颜色等适当地显示ANSI。“查看器”的好处是我希望能够使用箭头键在文档中上下滚动,就像,例如,“较少”命令可以。

根据我的研究,诅咒是一个完美的选择。 问题是curses不支持ANSI转义码序列。 有一个使用C ++编写的ANSI编辑器,它使用curses,但是它为解析转义码序列建立了自己的支持。 现在这是我的不得已的方法。

所以我的问题是:是否有更好的方法来创建可滚动的控制台模式应用程序,以在Linux上的python中查看ANSI Art(代码页437 + ANSI转义代码序列)?

实际上只有两种可能性:将ANSI序列解析为curses可以接受的内容,或者按原样使用ANSI序列。

起初,后者似乎更具吸引力。 大多数限制与您无关,或者很容易处理:

  • 它仅适用于静态ANSI艺术作品,不适用于动画文件。 这非常合理,因为“向上滚动”动画文件没有多大意义。 (当然,您可以动态地将其渲染到画布上,然后在其中上下滚动一个窗口,但是一旦您开始考虑渲染和窗口化的含义是什么……就在解析ANSI艺术。)但是听起来像您只需要静态ANSI艺术。
  • 仅当您的终端与ANSI兼容(足够接近)时,它才起作用。但是,它是(或可以这样做),或者cat命令不起作用。 (您可能仍然对颜色设置有疑问,但是我想您也知道如何解决该问题。)
  • 它仅在您的终端是cp437时才有效,这可能是一个更大的问题……但是解决这个问题并不容易。 只需decode('cp437')然后在您的代码中进行适当编码即可; 转义序列将原样通过。
  • 您可能需要原始键盘输入。 但这就像tty.setraw(sys.stdin.fileno())一样简单,只需将stdin读取为无缓冲文件即可。 (好吧,您可能想tcgetattr原始tcgetattr以便以后可以恢复它,但这并不难。)
  • 您必须自己解析键盘输入转义序列。 通常,这需要做很多工作……但是,只需处理与ANSI艺术兼容的终端的上下箭头就很容易。
  • 您将必须知道如何将ANS文件映射到实际行。

最后一个听起来很简单,但事实并非如此。 例如,我抓取了一个随机文件GR-BANT 它只有33行,但其中有154条换行符。 这将非常普遍。 在许多情况下,以esc-[-A开头的只是“重叠线”,您必须将其视为上一行的一部分,这并不难做到,但是在很多情况下,都需要不仅如此。

因此,无论如何,您都必须至少进行一些 ANSI解析。

一旦开始,我想您将通过完全解析并手动绘制到诅咒板上的“最后一招”找到更轻松的时间。 (当然,这样做的副作用是可以处理动画文件,在非ANSI终端上工作,更轻松地在所有终端上处理“小键盘”键……)

但是,如果您想采用第二种方法, 这里有一个快速的技巧可以帮助您入门。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM