Linenoise-Swift

一个纯 Swift 实现的 Linenoise 库。 一个最小的、零配置的 readline 替代品。

支持

纯 Swift

这个库使用纯 Swift 实现,拥有 Swifty API,易于使用 Swift Package Manager 嵌入到项目中,并且不需要额外的依赖项。

目录

API

快速开始

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

补全

Completion example

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 键来循环浏览这些补全。

提示

Hints example

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)