我遇到了一个问题。在我的例子中,这是一个打印一系列数字的 Lua 程序。Lua 使用制表符作为分隔符,在我的 80 列终端中输出如下:
1 2 3 4 5 6 7 8 9 10 1
1 12
请注意数字 11 是如何被截断的,第一个 1 位于第 79 列,第二个 1 位于下一行的第 0 列。我原本希望完整的数字 11 出现在下一行。
它不是 Lua 特有的,并且可以通过以下一行代码轻松重现:
printf '1\t2\t3\t4\t5\t6\t7\t8\t9\t10\t11\t12'
我已阅读过这个问题和已接受的答案:为什么 80 列控制台上有 11 个制表位?这让我明白为什么确实发生了这种情况。问题是,有没有办法覆盖该行为,让最后一个选项卡跳转到下一行的第 0 列,而不是当前行的最后一列?
答案1
不,您无法自动完成这项工作,也就是说,如果不过滤程序的输出,将右边距的制表符解释为换行。这是因为 VT100 样式的换行达到右边距,并且将不是除非你写了一个可打印字符。制表符不可打印。
大多数终端都设置为使用软制表符(已扩展为空格)。您可以检查您的stty
设置以查看是否如此。输出很模糊,但tab0
表示它尝试使用制表符,而tab3
表示它没有。
查看设置:
stty -a
要禁用硬标签:
stty -tabs
Lua可能覆盖该设置,但如果没有,则有可能因为它space是一个可打印字符。
进一步阅读:
- 包装的描述很奇怪,还能再说吗?(xterm 常见问题)
- 包装示例(测试)