Разрешить редактирование строки при чтении ввода из командной строки - PullRequest
0 голосов
/ 13 октября 2018

Я уже знаю, как получить ввод с клавиатуры пользователя.Я могу использовать метод readLine() или

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

Но эти два метода получаются также, когда пользователь нажимает кнопку со стрелкой.Я хотел бы отфильтровать входные данные, чтобы удалить эти данные.Я хочу, чтобы пользователь мог что-то написать, возможно, вернуться назад с помощью клавиши со стрелкой влево, что-то изменить и вставить данные без проблем.Спасибо!

1 Ответ

0 голосов
/ 13 октября 2018

Что вам нужно, так это «функция редактирования строки», предоставляемая 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...