如何格式化Lua中长度超过99个字符的字符串

时间:2018-04-26 14:44:55

标签: lua console

我正在格式化要打印到控制台的字符串,并尝试格式化终端大小。但是,Lua似乎不允许任何类型的格式超过99个字符。 (source

在终端宽度大于100列的情况下,如何填充字符串以使用整行?或打印出正确排列的东西?我知道我可以用循环来做数学和填充空间,但这感觉效率低下。还有什么我想念的吗?也许一些终端控制字符?

更新:我在源中链接了错误的位置。 This似乎是我被挂断的功能。它只允许2位数字来指定字段大小,如第1087行所述。

我正在尝试做的一个例子:

操作的每X次迭代,我打印一行格式如下:

"\rDone: %d, Left %d, Current: %s"

这样每次都会清除该行以保持状态更新,而不会通过行向控制台发送垃圾邮件。

问题是这样的,当字符串/long-path/to/file-name被打印为%s参数并且下一次迭代打印/path/to/file时,前一行的一部分是因为它没有被短线覆盖而离开了。使用格式将线条填充到控制台的整个宽度可以防止这些“遗留”字符。

3 个答案:

答案 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