我正在使用Swift 2为命令行编写一个BASIC解释器,但是我无法找到实现简单命令CLS(清除终端上的所有文本)的方法。我应该在循环中简单地打印空格,还是存在我不知道的清除终端屏幕的函数?
我正在使用Swift 2为命令行编写一个BASIC解释器,但是我无法找到实现简单命令CLS(清除终端上的所有文本)的方法。我应该在循环中简单地打印空格,还是存在我不知道的清除终端屏幕的函数?
您可以使用以下ANSI序列:
print("\u{001B}[2J")
...其中\u{001B}
表示ESCAPE
,而[2J
则代表清屏。
system
不可用。我会尝试更新我的答案,使用posix_spawn
API或NSTask
。 - JAL[2J
而不是清除屏幕? - Ben Ongsystem
命令通过Darwin模块导入Swift(以及其他C API)。在Linux上,Glibc取代了Darwin,用于桥接低级C API到Swift。import Glibc
// ...
system("clear")
system
调用不明确,请明确调用Glibc的system
(或在Mac平台上调用Darwin):import Glibc
// ...
Glibc.system("clear")
“system”在Swift中不可用:请改用posix_spawn APIs或NSTask
的错误提示。 - Chrisclear
命令进行同步调用。由于它使用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) ?? "")
使用内置的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č的答案。这在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()
}
system("clear")
或类似的方法(例如使用popen
),怎么样?另外,你可以通过AppleScript(或通过命令行中的osascript
)模拟按下Ctrl-L的操作。 - Arc676osascript
? - Arc676