Termcap tgetstr получает клавиши со стрелками

#c #unix #tty #termcap

#c #unix #tty #termcap

Вопрос:

Я пытаюсь получить строку, представляющую клавишу со стрелкой вверх, из базы данных termcap. Используя следующее:

 char *buffer = malloc(2048);
tgetent(buffer, getenv("TERM")); //TERM = xterm-256color
char *key_up = tgetstr("ku", amp;buffer); // gives me EOA
  

ku Строка ввода, отправляемая при нажатии клавиши со стрелкой вверх.

Проблема в том, что клавиша со стрелкой вверх фактически передается как E[A при вводе в программу. Это также передается таким образом в cat . Я пробовал с разными эмуляторами терминала и оболочками, и все они передавали это одинаково.

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

Я что-то здесь упускаю? Как я могу программно получить правильное ku значение?

Комментарии:

1. Кажется, что ваш термин установлен неправильно?

2. Я использую KDE Konsole, и для моего term установлено значение xterm-256color , и мой терминал выдает E[A

3. … и ku возвращает E0A

Ответ №1:

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

Часто задаваемые вопросы ncurses Мои клавиши управления курсором не работают, описаны более подробно.

Если вы пытаетесь использовать описание терминала для какого-либо приложения командной строки вне экрана, вы могли бы заставить ваш анализатор команд обрабатывать оба E[ (CSI) и EO (SS3) как одно и то же и игнорировать разницу между двумя режимами. Это было сделано в некоторой конфигурации для zsh , как указано на странице руководства по xterm.

Кстати, если ваш «termcap» на самом деле является интерфейсом к системе terminfo (такой как ncurses), нет необходимости выделять буфер, поскольку это игнорируется. в руководстве ncurses говорится:

  • Эмуляция игнорирует указатель буфера bp . Библиотека termcap будет хранить копию описания терминала в области, на которую ссылается этот указатель. Однако ncurses хранит описания своих терминалов в скомпилированной двоичной форме, что не одно и то же.