1

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

我的目标:编写一个尽可能类似于在 DOS 机器上查看的ANSI 艺术查看器,最好没有运行 dosbox 的开销。这将在 Raspberry Pi 上运行。

我已经让我的控制台用适当的字符、颜色等正确地对 ANSI 进行分类。“查看器”的问题是我希望能够使用箭头键在文档中上下滚动,就像,比如说,“less”命令可以。

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

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

4

1 回答 1

0

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

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

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

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

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

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

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

于 2013-08-22T00:13:27.630 回答