gpt4 book ai didi

objective-c - 在 Swift 中使用命令行工具更新当前行

转载 作者:搜寻专家 更新时间:2023-10-31 08:12:26 27 4
gpt4 key购买 nike

我在 Swift 中构建了一个 OS X 命令行工具(在 Objective-C 中存在同样的问题)用于下载某些文件。我正在尝试使用下载进度更新命令行。不幸的是,我无法阻止 print 语句跳转到下一行。

根据我的研究,回车 \r 应该跳转到同一行的开头(而 \n 会插入一个新队)。

所有测试都是在 OS X 终端应用程序中执行的,而不是 Xcode 控制台。

let logString = String(format: "%2i%% %.2fM \r", percentage, megaBytes)
print(logString)

仍然,显示器插入了一个新行。如何预防?

最佳答案

注意:这在 Xcode 的调试器窗口中不起作用,因为它不是真正的终端仿真器并且不完全支持转义序列。因此,要进行测试,您必须对其进行编译,然后在终端窗口中手动运行它。

\r 在大多数终端中应该可以移动到当前行的开头,但你也应该看看 VT100 Terminal Control Escape Sequences .它们通过在 Swift 中发送一个转义字符 \u{1B},然后发送一个命令来工作。 (警告:他们做了一些非常难看的字符串定义)

您可能需要的一个是 \u{1B}[K,它清除从当前光标位置到末尾的行。如果您不这样做,并且您的进度输出的长度完全不同,您将得到先前打印语句遗留下来的工件。

其他一些有用的是:

  • 移动到任何 (x, y) 位置:\u{1B}[\(y);\(x)H 注意:xy 是用字符串插值插入的 Int
  • 保存光标状态和位置:\u{1B}7
  • 恢复光标状态和位置:\u{1B}8
  • 清除屏幕:\u{1B}[2J

您还可以做一些有趣的事情,例如设置文本前景色和背景色。

如果由于某种原因您无法使 \r 工作,您可以通过在打印 logString 之前保存光标状态/位置来解决它,并且然后在之后恢复它:

let logString = String(format: "\u{1B}7%2i%% %.2fM \u{1B}8", percentage, megaBytes)
print(logString)

或者在打印之前移动到预定义的 (x, y) 位置:

let x = 0
let y = 1 // Rows typically start at 1 not 0, but it depends on the terminal and shell
let logString = String(format: "\u{1B}[\(y);\(x)H%2i%% %.2fM ", percentage, megaBytes)
print(logString)

关于objective-c - 在 Swift 中使用命令行工具更新当前行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25483292/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com