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

时间:2013-08-21 22:30:35

标签: python raspberry-pi curses extended-ascii

我在这里基于我所知道的技术做出一些假设,但欢迎其他技术建议。

我的目标:编写一个ANSI Art查看器,尽可能接近在DOS计算机上查看,最好不要运行dosbox。这将在Raspberry Pi上运行。

我已经让我的控制台正确地使用正确的字符,颜色等来捕获ANSI。“查看器”的捕获是我希望能够使用箭头键在文档中上下滚动,就像说“少”命令一样。

根据我的研究成果,诅咒是一个完美的候选人。问题是curses不支持ANSI转义码序列。有一个用C ++编写的ANSI编辑器使用curses,但是它构建了自己对解析转义码序列的支持。现在这是我的最后一招。

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

1 个答案:

答案 0 :(得分:0)

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

起初,后者可能看起来更具吸引力。大多数限制要么与您无关,要么易于处理:

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

最后一个听起来像是容易的部分,但事实并非如此。例如,我抓了一个随机文件GR-BANT;它只有33行,但它有154个新行。这将是相当普遍的。在许多情况下,它只是“覆盖线”,以esc开头 - [ - A,你必须将其视为前一行的一部分,这不难做到,但会有很多需要的情况不止于此。

所以,无论如何,你至少必须做一些 ANSI解析。

一旦你开始这样做,我认为你会发现一个更容易的时间用你的“最后手段”做一个完整的解析并手动绘制到一个curses pad。 (当然,这样做的副作用是可以处理动画文件,在非ANSI终端上工作,更轻松地在所有终端上处理“键盘”键,......)

但如果你想采取第二种方式,here是一个快速入侵,应该让你开始。