Как изменить конфигурацию termios, чтобы getc () немедленно возвращался, когда пользователь нажимает клавишу <tab>? - PullRequest
1 голос
/ 12 ноября 2010

Я хочу реализовать функцию автозаполнения для моего приложения CLI.Поведение getc () по умолчанию возвращается только при вводе следующего списка символов: NEW_LINE или EOF.Я хочу добавить TAB в этот список, чтобы я мог запустить алгоритм автозаполнения.

Есть ли способ сделать это, например, с помощью termios?Библиотека editline (http://www.thrysoee.dk/editline/) может это сделать, но я не могу понять, как это происходит?

Ответы [ 3 ]

1 голос
/ 24 декабря 2010

Самый простой подход, который вообще не требует tcsetattr() или tcgetattr(), заключается в использовании cbreak() для перевода терминала в режим "cbreak", который не буферизует и не обрабатывает управляющие символы, а затемиспользовать nocbreak(), когда вы закончите, чтобы сбросить его.

Страница man для cbreak документирует различные связанные функции, включая raw() и noecho(), которые можно использовать для управления терминалом без необходимостичтобы полностью понять termios.

Если вы хотите более точный контроль, вам нужно будет использовать termios напрямую.Некоторое время назад я написал сообщение в блоге , которое поможет вам начать.

0 голосов
/ 12 ноября 2010

Обработка терминального ввода-вывода занимает около 40 страниц во втором издании «Расширенное программирование в среде UNIX» ... Быстро, вы можете установить eol и eol2 (termios.c_cc [EOL] и termios.c_cc [EOL2] ) символов, чтобы иметь дополнительные символы, ведущие себя как \ n.

Вы даже можете попробовать это с stty

$ cat -
abc\tdef
abc\tdef
^d
$stty eol ^i
abc\tabc\tdef
def
^d

Пример того, как сделать это в программе (на практике не забывайте обрабатывать ошибки и восстанавливать исходное состояние в конце, при приостановке, при сигнале и т. Д., Поэтому для этого используется упакованная библиотека это лучше, есть много деталей, чтобы получить право на надежное приложение).

struct termios term;
tcgetattr(STDIN_FILENO, &term);
term.c_cc[EOL] = '\t';
tcsetattr(STDION_FILENO, TCSAFLUSH, &term);
0 голосов
/ 12 ноября 2010

вы должны использовать gnu readline вместо того, чтобы покончить с собой с помощью getc () ...;)

...