【问题标题】:Allow line editing when reading input from the command line从命令行读取输入时允许行编辑
【发布时间】:2018-10-13 15:43:13
【问题描述】:

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

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

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

【问题讨论】:

  • 我假设您询问的是 macOS 命令行工具,而不是 iOS 应用程序?
  • 是的,macOS 命令行工具

标签: swift macos user-input filehandle


【解决方案1】:

你要找的是libedit在macOS上提供的“行编辑功能”。

要从 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)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多