Termcap tgetstr получает клавиши со стрелками - PullRequest
0 голосов
/ 10 марта 2019

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

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

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

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

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

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

1 Ответ

1 голос
/ 12 марта 2019

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

FAQ по ncurses Мои клавиши курсора не работают более подробно.

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

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

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