【问题标题】:How to clear the Terminal screen in Swift?如何在 Swift 中清除终端屏幕?
【发布时间】:2016-01-31 14:36:48
【问题描述】:

我正在为 Swift 2 中的命令行编写 BASIC 解释器,但我找不到实现简单命令 CLS(从终端清除所有文本)的方法。我应该简单地在循环中打印空格,还是有一个我不知道的功能会清除终端屏幕吗?

【问题讨论】:

  • system("clear") 或类似的(例如popen)怎么样?或者,使用 AppleScript(或通过命令行osascript)模拟按 Ctrl-L
  • @Arc676 是的,这正是我想要的,谢谢。出于好奇,您是从哪里得知这个命令的?
  • 哪个命令? osascript?
  • 比硬编码更好 - Ncurses with Swift on Linux.

标签: swift macos command-line terminal


【解决方案1】:

您可以使用以下 ANSI 序列:

print("\u{001B}[2J")

...其中\u{001B}ESCAPE[2J 是清屏。

【讨论】:

  • 唯一对我有用的答案。 MacBook Pro(视网膜显示屏,15 英寸,2014 年中)OS X El Capitan。
  • 之所以有效,是因为 system 在 Swift 3 中不可用。我会看看我能做些什么来更新我的答案以使用 posix_spawn API 或 NSTask
  • 知道为什么当我使用它时它会打印[2J 而不是清除吗?
  • @BenOng 我发现这在标准终端窗口中确实有效,但如果您使用的是 Xcode 内置的控制台,则会打印“[2J”。 Xcode 终端也无法正确打印颜色,所以我猜这只是从 IDE 运行控制台应用程序时的一般 ANSI 解释问题。尝试归档您的构建并独立运行。
  • 它只打印 [2J
【解决方案2】:

此答案仅适用于 Swift 2.1 或更早版本

详述Arc676's answer

system 命令通过 Mac 平台上的 Darwin 模块(使用其他 C API)导入 Swift。在 Linux 上,Glibc 取代了 Darwin,将低级 C API 桥接到 Swift。

import Glibc

// ...

system("clear")

或者,如果 system 调用不明确,则显式调用 Glibc 的 system(或 Mac 平台上的 Darwin):

import Glibc

// ...

Glibc.system("clear")

【讨论】:

  • 使用 Swift 3 我得到了"system" is unavailable in Swift: Use posix_spawn APIs or NSTask instead
【解决方案3】:

此代码同步调用内置的clear 命令。这不会对readLine() 造成问题,因为它使用Swift 的print() 函数打印clear 返回的转义序列

var cls = Process()
var out = Pipe()
cls.launchPath = "/usr/bin/clear"
cls.standardOutput = out
cls.launch()
cls.waitUntilExit()
        print (String(data: out.fileHandleForReading.readDataToEndOfFile(), encoding: String.Encoding.utf8) ?? "")

【讨论】:

  • 为了清楚起见,这在终端中有效。但是如果你尝试清除 Xcode 中的控制台屏幕,它会给出TERM environment variable not set.
【解决方案4】:

将内置的clear 命令与system 一起使用

system("clear")

popen(询问谷歌)

或者,通过命令行使用 AppleScript 模拟 Ctrl+L 的按下:

osascript -e 'tell app "terminal" to tell app "system events" to keystroke "l" using {control down}'

编辑:system 在较新版本的 Swift 中不再可用。见Rudolf Adamkovič's answer

【讨论】:

    【解决方案5】:

    这在 Swift 3.1 中适用于我

    var clearScreen = Process()
    clearScreen.launchPath = "/usr/bin/clear"
    clearScreen.arguments = []
    clearScreen.launch()
    clearScreen.waitUntilExit()
    

    你可以用这样的回调创建一个函数

    func clearScreen(completion:@escaping (Bool) -> () ) {
            let clearScreen = Process()
            clearScreen.launchPath = "/usr/bin/clear"
            clearScreen.arguments = []
            clearScreen.terminationHandler = { task in completion(true) }
            clearScreen.launch()
            clearScreen.waitUntilExit()
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-23
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-01-29
      • 2011-06-04
      • 2011-10-01
      • 1970-01-01
      • 2023-01-05
      相关资源
      最近更新 更多