在Swift中如何清空终端屏幕?

7

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


1
关于system("clear")或类似的方法(例如使用popen),怎么样?另外,你可以通过AppleScript(或通过命令行中的osascript)模拟按下Ctrl-L的操作。 - Arc676
1
http://linux.die.net/man/3/curs_clear 怎么样? - jtbandes
@Arc676 是的,这正是我在寻找的,谢谢。出于好奇,您是从哪里学到这个命令的? - Brandon Bradley
哪个命令? osascript - Arc676
比硬编码更好 - 在Linux上使用Swift的Ncurses - Thomas Dickey
6个回答

14

您可以使用以下ANSI序列:

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

...其中\u{001B}表示ESCAPE,而[2J则代表清屏。


只有这个答案对我有用。MacBook Pro(Retina,15英寸,2014年中期)OS X El Capitan。 - Mark
这是因为在Swift 3中system不可用。我会尝试更新我的答案,使用posix_spawn API或NSTask - JAL
8
为什么我使用这个时会打印出[2J而不是清除屏幕? - Ben Ong
3
我发现这个在标准终端窗口能够正常工作,但如果你正在使用内置于 Xcode 的控制台,则会打印“[2J]”。Xcode 终端也无法正确打印颜色,所以我猜想当从 IDE 运行你的控制台应用程序时,这只是一个通用的 ANSI 解释问题。 尝试归档你的构建并单独运行它。 - bitwit
1
它只打印 [2J - Zaporozhchenko Oleksandr
有任何想法如何回到第一行吗?这会清除屏幕,但新的打印出现在终端的中间,而顶部是空的。 - Swiftly

2
该回答仅适用于Swift 2.1或更早版本
进一步解释Arc676的答案
在Mac平台上,system命令通过Darwin模块导入Swift(以及其他C API)。在Linux上,Glibc取代了Darwin,用于桥接低级C API到Swift。
import Glibc

// ...

system("clear")

或者,如果system调用不明确,请明确调用Glibc的system(或在Mac平台上调用Darwin):
import Glibc

// ...

Glibc.system("clear")

3
在Swift 3中,我遇到了“system”在Swift中不可用:请改用posix_spawn APIs或NSTask的错误提示。 - Chris

1
这段代码对内置的clear命令进行同步调用。由于它使用Swift的print()函数打印clear返回的转义序列,因此不会影响readLine()的正常运行。请注意保留HTML标签。
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环境变量”的错误。 - Anton Malmygin

0

使用内置的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č的答案

0

这在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()
}

-1
如果你在REPL里面,只需输入以下命令:
``` :shell clear ```

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接