我正在格式化要打印到控制台的字符串,并尝试格式化终端大小。但是,Lua似乎不允许任何类型的格式超过99个字符。 (source)
在终端宽度大于100列的情况下,如何填充字符串以使用整行?或打印出正确排列的东西?我知道我可以用循环来做数学和填充空间,但这感觉效率低下。还有什么我想念的吗?也许一些终端控制字符?
更新:我在源中链接了错误的位置。 This似乎是我被挂断的功能。它只允许2位数字来指定字段大小,如第1087行所述。
我正在尝试做的一个例子:
操作的每X次迭代,我打印一行格式如下:
"\rDone: %d, Left %d, Current: %s"
这样每次都会清除该行以保持状态更新,而不会通过行向控制台发送垃圾邮件。
问题是这样的,当字符串/long-path/to/file-name
被打印为%s
参数并且下一次迭代打印/path/to/file
时,前一行的一部分是因为它没有被短线覆盖而离开了。使用格式将线条填充到控制台的整个宽度可以防止这些“遗留”字符。
答案 0 :(得分:2)
您可以尝试打印一些ANSI Escape Codes。请参阅“光标位置”代码。
由于您无法将控制代码直接写入字符串,因此您必须使用string.char生成包含控制代码的字符串。
另一种选择是预先生成每个所需长度的填充字符串,并在以后引用它们:
padding = {}
padding[1] = " "
for i = 2,MAX_PAD do
padding[i] = padding[i-1].." "
end
-- now padding[i] is a string of i spaces.
在传递给string.format
之前,将填充字符串与格式字符串的其余部分连接起来。
答案 1 :(得分:1)
使用格式将线条填充到控制台的整个宽度可防止这些“遗留”字符。
那就是这样:
local str = string.format("\rDone: %d, Left %d, Current: %s", ...)
if(#str > line_length) then
str = str .. string.rep(" ", line_length - #str)
end
答案 2 :(得分:1)
我的大部分问题都是通过ESC[2K
控制字符解决的。控制代码不是试图用空格覆盖前一行,而是删除整行。以下是VT100控制代码的一个很好的参考:http://www.termsys.demon.co.uk/vtansi.htm