簡體   English   中英

從命令行讀取輸入時允許進行行編輯

[英]Allow line editing when reading input from the command line

我已經知道如何從用戶鍵盤獲取輸入。 我可以使用readLine()方法或

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

但是,當用戶按下箭頭鍵按鈕時,這兩種方法也將獲得。 我想過濾輸入以刪除這些數據。 我希望用戶可以寫一些東西,也許可以使用向左箭頭鍵返回,更改某些內容並插入數據而不會出現問題。 謝謝!

您正在尋找的是macOS上libedit提供的“行編輯功能”。

為了通過Swift命令行工具使用它,您需要

  • #include <readline/readline.h>在橋接頭文件中,
  • 在目標的“構建階段”的“將二進制文件與庫鏈接”部分中添加“ libedit.tbd”。

這是一個最小的Swift程序示例:

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

重要提示:您必須在終端中運行它,它在Xcode調試器控制台中無法正常工作。

可以在輸入Return之前編輯每條輸入行,這與在Terminal中可以執行的操作類似。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM