Как можно реализовать bash-like завершение табуляции? - PullRequest
6 голосов
/ 07 октября 2009

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

Возможно, я использую C, но я был бы очень удивлен, если бы решение зависело от языка.

Спасибо за любые идеи! : D

Ответы [ 4 ]

5 голосов
/ 07 октября 2009

Как говорит iny, bash использует readline для ввода. Источник доступен здесь , и есть файл с именем complete.c.

Чтобы ответить на ваш вопрос, я не думаю, что они на самом деле напечатаны для стандартного ввода. Readline содержит некоторый буфер для содержимого строки, которую пользователь редактирует, и в нее выводится завершение. Когда пользователь нажимает ввод, содержимое буфера отправляется любой программе, которая хочет прочитать строку, и в случае bash передается в стандартный ввод. (Readline не делает этого - другие программы, которые используют readline, могут просто сохранить значение в строку для дальнейшего использования.)

4 голосов
/ 07 октября 2009

Несколько человек указали, что bash использует readline, что правда, но я думаю, что вы действительно спрашиваете, как он может видеть то, что вы набрали, прежде чем нажать Enter.

Ответ заключается в том, что ttys (то есть: терминалы) можно переключить в «сырой режим», где обработка ввода терминала отключена, и тогда вы увидите каждый символ по мере его поступления. Это также отключает автоматическое отображение набранные символы.

См. Это руководство по Чтение отдельного символа из файла или терминала для получения дополнительной информации.

1 голос
/ 08 октября 2009

Вот фрагмент кода C, который реализует завершение табуляции через readline:

http://github.com/rupa/el

1 голос
/ 07 октября 2009

Он использует библиотеку readline для обработки ввода, а readline предоставляет историю и завершение.

Чтобы реализовать завершение, необходим доступ к обработке ввода с клавиатуры. Завершение должно быть в состоянии изменить используемый буфер. После этого речь идет о просмотре текущего ввода и проверке найденных завершений. Фактическая логика завершения может работать разными способами.

...