允许在从命令行读取输入时编辑行



我已经知道如何从用户键盘获取输入。 我可以使用readLine()方法或

let input = FileHandle.standardInput
let inputData = input.availableData
var text = String(data: inputData, encoding: .utf8)

但是当用户按下箭头键按钮时,这两种方法也会得到。 我想过滤输入以删除这些数据。我希望用户可以写一些东西,也许用左箭头键返回,更改一些东西并毫无问题地插入数据。 谢谢!

您正在寻找的是macOS上的libedit提供的"行编辑功能"。

为了从 Swift 命令行工具使用它,您需要

  • #include <readline/readline.h>桥头文件中,
  • 将"libedit.tbd"添加到"将二进制文件与库链接"部分 目标的"构建阶段"。

下面是一个最小的 Swift 程序示例:

while let cString = readline("prompt>") {
let line = String(cString: cString)
free(cString)
print(line)
}

重要提示:您必须在终端中运行它,它将无法在 Xcode 调试器控制台中正常工作。

每个输入行都可以在输入Return之前进行编辑, 类似于您可以在终端中执行的操作。并与

while let cString = readline("prompt>") {
add_history(cString) // <-- ADDED
let line = String(cString: cString)
free(cString)
print(line)
}

您甚至可以使用向上/向下箭头键导航到之前输入的 线。

有关更多信息,请致电终端中的man 3 readline

下面是一个可能的帮助程序函数:

func readlineHelper(prompt: String? = nil, addToHistory: Bool = false) -> String? {
guard let cString = readline(prompt) else { return nil }
defer { free(cString) }
if addToHistory { add_history(cString) }
return(String(cString: cString))
}

使用示例:

while let line = readlineHelper(addToHistory: true) {
print(line)
}

相关内容

最新更新