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

时间:2018-10-13 15:43:13

标签: swift macos user-input filehandle

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

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

但是,当用户按下箭头键按钮时,这两种方法也会得到解决。 我想过滤输入以删除这些数据。我希望用户可以写一些东西,也许可以使用向左箭头键返回,更改某些内容并插入数据而不会出现问题。 谢谢!

1 个答案:

答案 0 :(得分:2)

您正在寻找的是libedit在macOS上提供的“行编辑功能”。

要通过Swift命令行工具使用它,您需要

  • import threading import time class ledPulse(object): instance_count = 0 #count how many istance of the class are created def __init__(self, ledDriver): self.status = "OFF" self.ledPulseThread = threading.Thread(target=self.ledPulseThread) # create a thread for our streamV function self.ledColor = [30, 40, 50] self.ledDriver = ledDriver self.msgTopic = "" self.counter = 0 ledPulse.instance_count += 1 def ledPulseThread(self): print("starting thread") while self.status == "ON": print("nonstop | status = ", self.Status) self.ledDriver[0] = [0, 0, 0] self.ledDriver.write() time.sleep(0.2) print("{0} sec | color {2} | driver {3} | instance {4} | deca {1}".format(self.counter, self.msgTopic, self.ledColor, self.ledDriver.write(), ledPulse.instance_count )) self.ledDriver[0] = self.ledColor self.ledDriver.write() time.sleep(0.2) self.counter = self.counter + 1 print("stopping thread") self.counter = 0 #raise SystemExit 在桥接头文件中,
  • 将“ libedit.tbd”添加到“库中的链接二进制文件”部分 目标的“构建阶段”。

这是Swift程序的最小示例:

#include <readline/readline.h>

重要:您必须在终端中运行它,它在Xcode调试器控制台中无法正常工作。

在输入 Return 之前,可以编辑每个输入行, 类似于您在终端机中可以执行的操作。还有

while let cString = readline("prompt>") {
    let line = String(cString: cString)
    free(cString)
    print(line)
}

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

有关更多信息,请在终端上致电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))
}