1

也许是不可能完成的任务。曾几何时,我SimpleDialog为 DOS 窗口中的文本着色编写了一个 Ruby 模块。它通过与 Windows API 对话来实现。现在我想让它也适用于 Mac OS,甚至适用于整个 unix 世界。好的,目前只有 Terminal 和 xterm 可以满足我的需求。ANSI 转义序列似乎是适合这项工作的武器。但是使用它们我不能总是按照我的意愿处理事情。这是我尝试实现的功能:

def clear_screen
  print "\e[H\e[2J\ec"
  color( ... old colors stored in an instance variable ... )
end

"\e[H\e[2J"部分与clear命令相同(这就是我找到此序列的方式[在一些实验后第二天编辑:"\e[2J"不会删除序列之前发送的任何文本"\e[H",即使它在屏幕上可见])。终端和 xterm 仅清除屏幕的可见部分[问题 1]。该"\ec"部分对终端不再有意义,但这次 xterm 确实成功清除了整个屏幕缓冲区。这样做时,它会响铃[问题 2],而终端保持沉默。由于"\ec"序列会重置颜色,因此必须再次恢复最后的设置。完全不是很优雅。这clear从命令行提交的命令通常会清除 xterm 的整个屏幕缓冲区。但是,它不能消除我试图通过仅从"\e[H\e[2J"Ruby 发送来清除屏幕而留下的部分。

def color( ... )
  ... too big to show here ...
end

color方法几乎可以正常工作,只有一个令人失望。在 Windows 中,我可以更改矩形的颜色,而无需修改已放置在其中的文本。我看不出如何通过 ANSI 转义序列[issue 3]来做到这一点。当然,作为一种解决方法,我可以记住所涉及的文本并在之后恢复它。而这个真的让我很困惑:对"\e[6n"(报告光标位置)的响应被打印到屏幕上,最后几个字符在命令提示符后重复。它可以被 Ruby [问题 4]拦截吗?

其他方法是小菜一碟:

def shrink_window # to its original size
  print "\e[9;0t"
end

def stretch_window # to the maximum size that fits on the screen
  print "\e[9;1t"
end

def title(title = nil)
  print "\e]2;#{title}\a"
end

def write(... text containing human-friendly color codes ...)
  ... trivial ...
end

MS-Windows 也允许我获取title当前窗口标题,但我看不到它的真正用途(当参数是空字符串时,xterm 根本不听,顺便说一句)。该write方法利用该color方法。这里没有问题。所以,最后,要克服四个障碍。还是一起生活?

4

1 回答 1

0

如果您需要有关所有这些 Mac OS 和 Unix 终端 UI 问题的帮助,请尝试通过Curses gem使用 curses/ncurses 库。

由于您已经为此提供了一个有效的 Windows 解决方案,因此您可以创建两个驱动对话框的类。我建议这样做是因为 Windows 上的 curses 库并不总是可靠或易于安装(有关该问题的实际示例,请参阅此问题及其答案)。保留你的 DOS 实现,然后做一个使用 curses/ncurses 的替代方案。然后,您的代码可以根据操作系统或是否存在有效的 curses/ncurses 库来选择要使用的实现。当然,这条路径也简化了以后添加更多用户界面的方法。

于 2016-03-22T01:36:41.933 回答