一个纯 Swift 实现的 Linenoise 库。 一个最小的、零配置的 readline 替代品。
这个库使用纯 Swift 实现,拥有 Swifty API,易于使用 Swift Package Manager 嵌入到项目中,并且不需要额外的依赖项。
Linenoise-Swift 易于使用,并且可以作为 Swift.readLine
的替代品。 这是一个简单的例子
let ln = LineNoise()
do {
let input = try ln.getLine(prompt: "> ")
} catch {
print(error)
}
在大多数情况下,只需创建一个新的 LineNoise
对象即可,默认情况下 STDIN 用于输入,STDOUT 用于输出。 但是,如果需要,可以为输入和输出提供不同的文件
// 'in' and 'out' are standard POSIX file handles
let ln = LineNoise(inputFile: in, outputFile: out)
添加到历史记录很容易
let ln = LineNoise()
do {
let input = try ln.getLine(prompt: "> ")
ln.addHistory(input)
} catch {
print(error)
}
您可以选择设置要保留在历史记录中的最大项目数。 将其设置为 0
(默认值)将保留无限数量的项目在历史记录中。
ln.setHistoryMaxLength(100)
ln.saveHistory(toFile: "/tmp/history.txt")
这将把文件中的所有项目添加到当前历史记录中
ln.loadHistory(fromFile: "/tmp/history.txt")
默认情况下,如果用户在不按 Enter 键的情况下在历史记录中向前或向后移动,则用户对历史记录行所做的任何编辑都将被丢弃。 如果您希望保留所有编辑,请使用以下方法
ln.preserveHistoryEdits = true
Linenoise 支持使用 tab
进行补全。 您可以提供一个回调来返回可能的补全数组
let ln = LineNoise()
ln.setCompletionCallback { currentBuffer in
let completions = [
"Hello, world!",
"Hello, Linenoise!",
"Swift is Awesome!"
]
return completions.filter { $0.hasPrefix(currentBuffer) }
}
补全回调会提供在按下 tab
之前输入的内容。 只需返回一个字符串数组作为可能的补全。 可以通过多次按 tab
键来循环浏览这些补全。
Linenoise 支持在您键入时提供提示。 这些提示将出现在当前输入的右侧,可以通过按 Return
键来选择。
提示回调将当前行的内容作为输入,并返回一个元组,其中包含一个可选的提示字符串和一个可选的提示文本颜色,例如
let ln = LineNoise()
ln.setHintsCallback { currentBuffer in
let hints = [
"Carpe Diem",
"Lorem Ipsum",
"Swift is Awesome!"
]
let filtered = hints.filter { $0.hasPrefix(currentBuffer) }
if let hint = filtered.first {
// Make sure you return only the missing part of the hint
let hintText = String(hint.dropFirst(currentBuffer.count))
// (R, G, B)
let color = (127, 0, 127)
return (hintText, color)
} else {
return (nil, nil)
}
}
Linenoise-Swift 很大程度上基于 原始 linenoise 库,作者是 Salvatore Sanfilippo (antirez)