Получение капитала от getchar при нажатии Home или End


Я использую это в моем C-коде:

system("stty -echo -icanon");
Это часть домашнего задания, но эта конкретная часть-то, над чем я работаю вне требований задания.

Мы реализуем оболочку, и нам дали кучу кода для начала. Код не использует ncurses (которые я бы использовал, если бы мог), и изменение этого потребует переписывания большого количества предоставленного кода.

Когда я нажимаю клавишу HOME или END , я получаю заглавную O (это o, как в Open), а затем ключHOME иEND . Я использую getchar(), чтобы получить символ.

Кажется, что это только два ключа, которые делают это, но я не уверен. Я не на 100%, если предоставленный вызов системной функции-единственное, что отличается (мы также установили 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 3

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, это, вероятно, то, что вы испытываете. Я не знаю, почему вы видите символ побега как "о".