Как правильно печатать специальные последовательности клавиш с помощью terminfo терминально-независимым способом?
Я пытаюсь подражать пользователю, нажимая такие специальные клавиши, как <Left Arrow>
, <Backspace>
, <Delete>
и так далее. Я слышал, что curses/terminfo может помочь сделать это не зависящим от терминала способом, но когда я пытаюсь (с помощью следующего кода) напечатать первую строку "text", а затем испустить key_left
последовательность, я не получаю (с '|'
как курсор) "tex|t"
, скорее "textD|"
, Зачем? Как это сделать правильно?
#include <term.h>
#include <stdio.h>
static void putf(const char *name) {
putp(name);
fflush(stdout);
}
int main(int argc, char **argv) {
setupterm((char*)0, 1, (int*)0);
printf("text");
fflush(stdout);
putf(key_left);
// hang up until user input
fgetc(stdin);
return 0;
}
Пожалуйста, обратите внимание, хотя я в порядке с использованием curses, ncurses недопустим в моем случае использования. Кроме того, обратите внимание, что я не хочу использовать что-то вроде initscr()
, заменяя текущий экран терминала пустым, это нежелательное поведение.
1 ответ
Escape-последовательности, отвечающие за перемещение курсора, и Escape-последовательности, связанные с клавишами со стрелками, обычно различны и не должны использоваться вместо друг друга. в terminfo
базы данных, первые с префиксом cursor
и последний с key
,
Таким образом, чтобы переместить курсор влево, нужно использовать putp (cursor_left)
не putp (key_left)
,