【问题标题】:How to create scrollable console application that support ANSI escape code sequences如何创建支持 ANSI 转义码序列的可滚动控制台应用程序
【发布时间】:2013-08-21 22:30:35
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 在包含光标移动序列的文档中“向上滚动”是什么意思?如果您只想处理不移动光标的 ANSI 艺术子集,那会容易得多……但是首先您不需要curses(假设您的终端恰好处理 ANSI 颜色等. 序列,也就是说,但你显然已经处理过这个问题,给定cat 示例)。

标签: python raspberry-pi curses extended-ascii


【解决方案1】:

实际上只有两种可能性:将 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 终端上工作、更轻松地在所有终端上处理“键盘”键……)

但如果您想采用第二种方式,here 是一个快速入门的技巧。

【讨论】:

  • 回答您上面的问题:我想拍摄一张静态 ANSI 图像并移动您查看时可见的 25 行“窗口”。因此,如果 ANSI 有 200 行长,当我按下向下箭头时,我会向下移动 200 行,一次只能看到 25 行。如果我按向上箭头,我将开始看到上面经过的行,在顶部添加一条线,从下面删除一条。我会检查您提出的解决方案。
  • @lordscarlet:对,这就是我认为你想要的。问题是即使是“静态”的 ANSI-art 文件通常也不是真正的静态文件。看看我链接到的例子——用 154 行文本绘制一个静态的 33 行图像。因此,您必须先渲染它,然后才能滚动它。对于该特定图像,您只需要处理“up 1”代码,这很容易解决(我的示例代码以一种 hacky 但成功的方式完成)和“left”代码,您可以忽略它们。但是,如果您想处理不正确的文件,则需要解析和渲染。
  • 是的,我心烦意乱,无法继续工作,我正在移植我们用来解析 ANSI 的 perl 代码的 ruby​​ 端口。我可能应该尝试让 ruby​​ 代码在 pi 上工作,但我想这既不在这里也不在那里。 FWIW,我运行您链接到的网站作为示例。
猜你喜欢
  • 2016-08-14
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2021-01-15
相关资源
最近更新 更多