也许是不可能完成的任务。曾几何时,我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
方法。这里没有问题。所以,最后,要克服四个障碍。还是一起生活?