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

标签 swift macos user-input filehandle

我已经知道如何从用户键盘获取输入。 我可以使用 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)
}

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

欲了解更多信息,请调用 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)
}

关于swift - 从命令行读取输入时允许行编辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52794640/

相关文章:

swift - 如何在 Mac 上的 Mac Catalyst 应用程序中使用钥匙串(keychain)?

swift - 无法使用类型为 'Range<String.Index>' 的参数列表调用类型为 '(Range<String.Index>)' 的初始值设定项

ios - Swift Xcode 错误 : Apple Mach-O Linker Error

c - 通过在一行中读取数组的大小和数组的元素来将整数存储为数组

java - 请帮我解决简单的Java程序

swift - 如何立即在 AppCode 中看到 Swift 错误?

macos - 如何控制另一个 View Controller 中的实例

macOS 上的 Swift : open Chrome with a URL as parameter

macos - 动态地将单元添加到使用自动布局布局的 NSMatrix 中会产生奇怪的效果;为什么?

javascript - 从用户输入中获取 JS 对象数据