Ответ Йохана Мирена был близок, но не совсем проблема: большинство эмуляторов терминала, которые вы будете использовать, имеют нормальный режим и режим приложений для специальных клавиш. Описания терминала написаны для одного режима, который соответствует тому, что использует полноэкранное приложение. Другие приложения (такие как интерактивная оболочка ) обычно не инициализируют экран для использования режима приложения . Bash является примером этого.
В обычном режиме xterm и аналогичные терминалы отправляют escape[
(CSI), а в режиме приложения отправляют их клавиатуры escapeO
(SS3). В Terminfo синтаксисе, что побег является \E
. Так infocmp
показывает вам, что описание использует режим приложения. home
Способность передается в терминал, говоря ему , как переместить курсор на главную позицию (слева вверху), и не то же самое , как khome
(пересылаются от терминала с помощью клавиатуры).
Полноэкранные приложения (например, использующие ncurses) могут отправлять строки возможностей терминала для инициализации клавиатуры. Некоторые описания терминалов переводят терминал в режим приложения, некоторые - нет.
Использование kend
versus 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) эмулируют старые аппаратные терминалы, используя разные названия клавиш на клавиатуре редактирования. В приведенном ниже списке часто задаваемых вопросов по xterm есть возможность присвоить этой клавише «Главная» команду «Вставить» ...
Дальнейшее чтение:
home
иkhome
заключается в том, чтоkhome
строка - это последовательность, которую производит нажатие клавиши Home, тогда какhome
строка - это последовательность, которую следует отправить в терминал для перемещения курсора в исходное положение. Насколько мне известно, terminfo не определяетend
возможности, простоkend
.