Как мне написать в поле ввода Stdin в Golang, не вводя его? - PullRequest
2 голосов
/ 27 мая 2020

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

В настоящее время я читаю ввод, как показано ниже:

for {
        // prompter
        promptColor.Printf(shellPrompt)

        // read string from STDIN until newline
        input, _ := reader.ReadString('\n')
        // convert CRLF to LF
        input = strings.Replace(input, "\n", "", -1)

        // read input tokens
        tokens := SplitString(input)

        // parse tokens and execute relevant command
        Parse(tokens)
    }

, используя bufio.Reader для чтения. Я посмотрел и не могу найти способ записи на этот ввод.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Большинство пакетов, которые хотят реализовать это поведение, будут использовать библиотеку GNU Readline. Даже оболочка Bash использует (модифицированную копию) этой библиотеки readline. Рассмотрим один из двух вариантов:

  • Используйте пакет go -readline - оболочку для библиотеки GNU Readline для языка программирования Go. https://github.com/fiorix/go-readline
  • Используйте чистую реализацию замены GO для библиотеки типа GNU-Readline. https://github.com/chzyer/readline

Первый путь предоставит вам защищенную от сражений библиотеку ReadLine, но потребует создания кода «C». Вы можете решить, основываясь на своем опыте / ограничениях, какой путь к go.

0 голосов
/ 27 мая 2020

В оболочке нет "поля для ввода"; полей вообще нет. Есть только входной поток, выходной поток и поток ошибок. Вы также не хотите писать на свой stdin, уж точно не для решения этой проблемы. Обычно оболочка делает это (независимо от языка):

  • Пользователь нажимает стрелку вверх, приложение переходит в режим истории
  • Оболочка стирает все, что находится в приглашении, и заменяет его на предыдущая команда в истории, отслеживающая текущий индекс истории
  • Если пользователь нажимает клавишу ввода в режиме истории, он берет текущий индекс истории и читает команду оттуда, а не со стандартного ввода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...