Johan Myréen ответил близко, но это не совсем проблема :большинство эмуляторов терминала, которые вы будете использовать, имеют обычный и прикладной режимы для специальных клавиш. Описания терминалов написаны для одного режима, который соответствует тому, что использует полноэкранное -приложение. Другие приложения (, такие как интерактивная оболочка ), обычно не инициализируют экран для использования режима приложения . Баш тому пример.
В обычном режиме терминалы xterm и подобные отправляютescape[
(CSI ), а в режиме приложения их клавиатуры отправляютescapeO
(СС3 ). В синтаксисе terminfo этот экран равен \E
. Итак, infocmp
показывает вам, что в описании используется режим приложения. Возможностьhome
отправляется на терминал, сообщая ему, как переместить курсор в исходное положение (вверху слева ), и это не то же самое, чтоkhome
(отправил с терминала с помощью клавиатуры ).
Полноэкранные -приложения (, такие как использующие ncurses ), могут отправлять терминалу -строки возможностей для инициализации клавиатуры. Некоторые описания терминала переводят терминал в режим приложения, некоторые нет.
Использованиеkend
вместоend
является соглашением об именах :в terminfo по соглашению любое имя, начинающееся с k относится к специальной клавише (клавиатура -клавиша ), чтобы было ясно, что это строки, которые должны быть прочитаны приложением. Например,kcub1
(курсор -назад клавиша)отличается отcub1
(перемещение курсора назад на один столбец ).
ncurses распознает клавишу как KEY_END
, потому что приложение, которое вы используете, вызовет функциюkeypad
для инициализации терминала, используяsmkx
(мнемонику, означающую «запустить режим передачи с клавиатуры -» ). Это может/не может фактически включить режим приложения. В описании терминала консоли Linux нет, в xterm есть.
В принципе, вы могли бы использоватьtput
для переключения режима (и получить результаты, отличные отshowkey
):
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[[H 27 0033 0x1b
91 0133 0x5b
72 0110 0x48
^C 3 0003 0x03
^D 4 0004 0x04
$ tput smkx
$ showkey -a
Press any keys - Ctrl-D will terminate this program
^[OH 27 0033 0x1b
79 0117 0x4f
72 0110 0x48
Как усложнение, curses распознает только одно имя для строки. Некоторые терминалы (, такие как xterm ), эмулируют старые аппаратные терминалы, используя другие названия клавиш на клавиатуре редактирования. В FAQ по xterm, указанном ниже, есть возможность назвать эту клавишу "Home" "Insert"...
Дополнительная литература:
getch
страница руководства)