Получение капитала от getchar при нажатии Home или End
Я использую это в моем C-коде:
system("stty -echo -icanon");
Это часть домашнего задания, но эта конкретная часть-то, над чем я работаю вне требований задания.
Мы реализуем оболочку, и нам дали кучу кода для начала. Код не использует ncurses (которые я бы использовал, если бы мог), и изменение этого потребует переписывания большого количества предоставленного кода.
Когда я нажимаю клавишу HOME или END , я получаю заглавную O (это o, как в Open), а затем ключHOME иEND . Я использую getchar()
, чтобы получить символ.
stdout
на неблокирующий, но это не должно иметь значения).
Я действительно запутался, и я хотел бы реализовать ключи END и HOME, потому что я часто их использую.
Извините, если это не очень много. информации. Я недостаточно знаю о system
, чтобы действительно понять, какие последствия-echo и-icanon имеют для stty. Я посмотрел на главную страницу, но все еще не могу понять.
EDIT
Из ответа Алекса Брауна я подтвердил, что получаю беглые символы. У меня есть что-то вроде следующего (в плохом псевдокоде):
while (TRUE)
ch = getchar()
switch (ch)
case HOME:
case END:
don't print anything...
break
default:
printf(ch);
break
Таким образом, он выводит O из escape-последовательности, но не [(у меня есть 0x48
для HOME и 0x46
для конец). Все еще не понимал, как получить настоящий код-ключ...
2 ответа:
Для консольного приложения такие ключи, какHome иEnd , обычно передаются в виде escape-последовательности. Точная последовательность зависит от используемой терминальной программы и ее конфигурации. Информация традиционно хранится в termcap / terminfo, и ncurses ищет ее оттуда в зависимости от типа вашего терминала.
Терминал Gnome отправляет:
- ESC O H (
0x1b 0x4f 0x48
) для дома и- ESC O F (
0x1b 0x4f 0x46
) для конца .KDE Konsole и xterm отправляют:
- ESC [ H (
0x1b 0x5b 0x48
) для дома и- ESC [ F (
0x1b 0x5b 0x46
) для конца .Если Вы читаете символ ESC , за которым следует [ или O , вам нужно будет прочитать дополнительный символ, чтобы определить, какая клавиша была нажата.
Многие метасимволы (такие как клавиши со стрелками, функциональные клавиши, а также home, end и т. д.) принимаются терминалом (и, следовательно, вашим приложением) в качестве экранированных символов - escape-кода, за которым следует одно или несколько байтовых значений. Поскольку каждый байт принимается отдельным вызовом get char, это, вероятно, то, что вы испытываете. Я не знаю, почему вы видите символ побега как "о".