从命令行读取输入时允许行编辑
Allow line editing when reading input from the command line
我已经知道如何从用户键盘获取输入。
我可以使用 readLine()
方法或
let input = FileHandle.standardInput
let inputData = input.availableData
var text = String(data: inputData, encoding: .utf8)
但是当用户按下箭头键按钮时,这两种方法也会得到。
我想过滤输入以删除这些数据。我希望用户可以写一些东西,也许用左箭头键返回,更改一些东西并毫无问题地插入数据。
谢谢!
你要找的是libedit在macOS上提供的“行编辑功能”。
为了从 Swift 命令行工具中使用它,您需要
#include <readline/readline.h>
在桥接头文件中,
- 将“libedit.tbd”添加到“Link Binary With Libraries”部分
目标的“构建阶段”。
这是一个最小的例子 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)
}
您甚至可以使用 up/down 箭头键导航到之前输入的内容
行。
有关更多信息,请在终端中调用 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)
}
我已经知道如何从用户键盘获取输入。
我可以使用 readLine()
方法或
let input = FileHandle.standardInput
let inputData = input.availableData
var text = String(data: inputData, encoding: .utf8)
但是当用户按下箭头键按钮时,这两种方法也会得到。 我想过滤输入以删除这些数据。我希望用户可以写一些东西,也许用左箭头键返回,更改一些东西并毫无问题地插入数据。 谢谢!
你要找的是libedit在macOS上提供的“行编辑功能”。
为了从 Swift 命令行工具中使用它,您需要
#include <readline/readline.h>
在桥接头文件中,- 将“libedit.tbd”添加到“Link Binary With Libraries”部分 目标的“构建阶段”。
这是一个最小的例子 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)
}
您甚至可以使用 up/down 箭头键导航到之前输入的内容 行。
有关更多信息,请在终端中调用 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)
}