#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 хранит описания своих терминалов в скомпилированной двоичной форме, что не одно и то же.