Почему клавиша END не имеет записи terminfo?

В дополнение к тому, что предлагали другие, я обнаружил, что источник не сбрасывает ранее назначенные переменные среды. Итак, если вы хотите отключить переменные среды, вам нужно сделать это вручную.

8
01.08.2017, 11:07
2 ответа

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"...

Дополнительная литература:

12
27.01.2020, 20:10

Проблема с клавишей «Домой» заключается в том, что физические терминалы, а затем эмуляторы терминалов, которые их эмулируют, имеют два режима :нормальный и режим приложения, а управляющие последовательности различаются в зависимости от режима, в котором находится терминал. хорошо с этим справиться. В обычном режиме (, также известном как «Режим курсора» ), управляющая последовательность клавиши «Конец» — ESC [ F, в режиме приложения ESC O F. Поиск в Google по этой проблеме показывает весь беспорядок.

Редактировать Из источника terminfo:

"Терминалы серии VT100 имеют курсор ("стрелки" )клавиши, которые могут управлять в двух различных режимах :Режим курсора и Режим приложения. Режим курсора является состоянием сброса и считается нормальным состоянием. Применение Режим — это состояние «установлено». В режиме курсора клавиши курсора передают Последовательности «Esc [ {код}», соответствующие стандартам ANSI. В приложении Mode, клавиши курсора передают последовательности «Esc O». Режим приложения был предоставлен в первую очередь как помощь в переносе приложений VT52. это предполагал, что клавиши курсора обычно находятся в режиме курсора, и ожидал, что такие приложения, как vi, всегда будут передавать строку. Следовательно, определения для клавиш курсора сделаны в соответствии с тем, что терминал передается после передачи строки. Если строка является нулевой строкой или не определена, то предполагается, что клавиши курсора находятся в «Режим курсора», и определения клавиш курсора должны соответствовать этому предположению, иначе приложение может не работать.Также ожидается, что приложения всегда передайте строку терминалу перед выходом."

6
27.01.2020, 20:10

Теги

Похожие вопросы